diff --git a/.gitignore b/.gitignore index 48aa29b69e30..1a73724c1172 100644 --- a/.gitignore +++ b/.gitignore @@ -51,7 +51,6 @@ tools/cli/build/ *.jar *.war *.mar -*.zip *.iso *.tar.gz *.tgz @@ -98,3 +97,5 @@ systemvm/.pydevproject test/.pydevprojec plugins/hypervisors/kvm/.pydevproject scripts/.pydevproject +*.qcow2 +*.raw diff --git a/.java-version b/.java-version index d3bdbdf1fdae..6259340971be 100644 --- a/.java-version +++ b/.java-version @@ -1 +1 @@ -1.7 +1.8 diff --git a/.travis.yml b/.travis.yml index 359d6666788b..d5fd173d71ed 100644 --- a/.travis.yml +++ b/.travis.yml @@ -19,7 +19,7 @@ dist: trusty group: edge language: java jdk: -- openjdk7 +- oraclejdk8 python: - "2.7" cache: @@ -32,8 +32,11 @@ env: global: - PATH=$HOME/.local/bin:$PATH matrix: - - TESTS="smoke/test_affinity_groups + # Keep the TESTS sorted by name and grouped by type + - TESTS="smoke/test_accounts + smoke/test_affinity_groups smoke/test_affinity_groups_projects + smoke/test_certauthority_root smoke/test_deploy_vgpu_enabled_vm smoke/test_deploy_vm_iso smoke/test_deploy_vm_root_resize @@ -42,8 +45,12 @@ env: smoke/test_disk_offerings smoke/test_dynamicroles smoke/test_global_settings - smoke/test_guest_vlan_range - smoke/test_hosts + smoke/test_guest_vlan_range" + + - TESTS="smoke/test_hostha_kvm + smoke/test_hostha_simulator + smoke/test_host_annotations + smoke/test_host_maintenance smoke/test_internal_lb smoke/test_iso smoke/test_list_ids_parameter @@ -51,18 +58,22 @@ env: smoke/test_login smoke/test_metrics_api smoke/test_multipleips_per_nic + smoke/test_nested_virtualization smoke/test_network smoke/test_network_acl smoke/test_nic smoke/test_nic_adapter_type - smoke/test_non_contigiousvlan" - - - TESTS="smoke/test_outofbandmanagement + smoke/test_non_contigiousvlan + smoke/test_outofbandmanagement + smoke/test_outofbandmanagement_nestedplugin smoke/test_over_provisioning smoke/test_password_server smoke/test_portable_publicip - smoke/test_primary_storage + smoke/test_portforwardingrules" + + - TESTS="smoke/test_primary_storage smoke/test_privategw_acl + smoke/test_projects smoke/test_public_ip_range smoke/test_pvlan smoke/test_regions @@ -80,6 +91,7 @@ env: smoke/test_ssvm smoke/test_staticroles smoke/test_templates + smoke/test_usage smoke/test_usage_events smoke/test_vm_life_cycle smoke/test_vm_snapshots @@ -97,8 +109,12 @@ env: component/test_acl_listsnapshot component/test_acl_listvm component/test_acl_listvolume - component/test_acl_sharednetwork - component/test_acl_sharednetwork_deployVM-impersonation" + component/test_acl_sharednetwork" + + - TESTS="component/test_allocation_states + component/test_acl_sharednetwork_deployVM-impersonation + component/test_affinity_groups_projects + component/test_cpu_domain_limits component/test_cpu_limits" - TESTS="component/test_cpu_max_limits @@ -117,41 +133,37 @@ env: component/test_non_contiguous_vlan component/test_persistent_networks" - - TESTS="component/test_projects + - TESTS="component/test_project_limits component/test_project_configs - component/test_project_limits component/test_project_usage - component/test_regions + component/test_project_resources component/test_regions_accounts component/test_routers - component/test_snapshots" + component/test_snapshots + component/test_stopped_vm" + + - TESTS="component/test_project_resources" - - TESTS="component/test_resource_limits" + - TESTS="component/test_project_limits + component/test_resource_limits" - - TESTS="component/test_stopped_vm - component/test_tags + - TESTS="component/test_tags component/test_templates component/test_update_vm - component/test_usage" + component/test_volumes" - - TESTS="component/test_volumes + - TESTS="component/test_vpc component/test_vpc_network component/test_vpc_offerings component/test_vpn_users" # FIXME: fix following tests and include them in Travis -# - TESTS="component/test_affinity_groups_projects" -# - TESTS="component/test_allocation_states" -# - TESTS="component/test_vpc" -# - TESTS="component/test_project_resources" -# - TESTS="component/test_cpu_domain_limits" -# - TESTS="component/test_acl_isolatednetwork" -# - TESTS="component/test_accounts" -# - TESTS="component/test_organization_states" +# - TESTS="component/test_vpc" Please add when PR: https://github.com/apache/cloudstack/pull/955 CLOUDSTACK-8969 is fixed +# - TESTS="component/test_organization_states" Please add when CLOUDSTACK-7735 is fixed -before_install: travis_wait 60 ./tools/travis/before_install.sh +before_install: travis_wait 30 ./tools/travis/before_install.sh install: ./tools/travis/install.sh -before_script: travis_wait 60 ./tools/travis/before_script.sh +before_script: travis_wait 30 ./tools/travis/before_script.sh script: - travis_wait 40 ./tools/travis/script.sh ${TESTS} after_success: ./tools/travis/after_success.sh diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index c4ad1974eb63..6ac3ad56dd4d 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -3,10 +3,26 @@ Contributing to Apache CloudStack (ACS) Summary ------- -This document covers how to contribute to the ACS project. These instructions assume you have a GitHub.com account, so if you don't have one you will have to create one. Your proposed code changes will be published to your own fork of the ACS project and you will submit a Pull Request for your changes to be added. +This document covers how to contribute to the ACS project. ACS uses github PRs to manage code contributions. +These instructions assume you have a GitHub.com account, so if you don't have one you will have to create one. Your proposed code changes will be published to your own fork of the ACS project and you will submit a Pull Request for your changes to be added. _Lets get started!!!_ +Bug fixes +--------- + +It's very important that we can easily track bug fix commits, so their hashes should remain the same in all branches. +Therefore, a pull request (PR) that fixes a bug, should be sent against a release branch. +This can be either the "current release" or the "previous release", depending on which ones are maintained. +Since the goal is a stable master, bug fixes should be "merged forward" to the next branch in order: "previous release" -> "current release" -> master (in other words: old to new) + +Developing new features +----------------------- + +Development should be done in a feature branch, branched off of master. +Send a PR(steps below) to get it into master (2x LGTM applies). +PR will only be merged when master is open, will be held otherwise until master is open again. +No back porting / cherry-picking features to existing branches! Fork the code ------------- @@ -30,6 +46,7 @@ $ git rebase upstream/master Making changes -------------- + It is important that you create a new branch to make changes on and that you do not change the `master` branch (other than to rebase in changes from `upstream/master`). In this example I will assume you will be making your changes to a branch called `feature_x`. This `feature_x` branch will be created on your local repository and will be pushed to your forked repository on GitHub. Once this branch is on your fork you will create a Pull Request for the changes to be added to the ACS project. It is best practice to create a new branch each time you want to contribute to the project and only track the changes for that pull request in this branch. @@ -72,6 +89,8 @@ Make a GitHub Pull Request to contribute your changes When you are happy with your changes and you are ready to contribute them, you will create a Pull Request on GitHub to do so. This is done by pushing your local changes to your forked repository (default remote name is `origin`) and then initiating a pull request on GitHub. +Please include JIRA id, detailed information about the bug/feature, what all tests are executed, how the reviewer can test this feature etc. Incase of UI PRs, a screenshot is preferred. + > **IMPORTANT:** Make sure you have rebased your `feature_x` branch to include the latest code from `upstream/master` _before_ you do this. ``` bash @@ -105,3 +124,7 @@ $ git checkout master $ git branch -D feature_x $ git push origin :feature_x ``` + +Release Principles +------------------ +Detailed information about ACS release principles is available at https://cwiki.apache.org/confluence/display/CLOUDSTACK/Release+principles+for+Apache+CloudStack+4.6+and+up diff --git a/INSTALL.md b/INSTALL.md index 8a83fb0f7204..626df91dc564 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -15,7 +15,7 @@ was tested against a CentOS 6.5 x86_64 setup. Install tools and dependencies used for development: $ yum install git ant ant-devel java-1.6.0-openjdk java-1.6.0-openjdk-devel - mysql mysql-server tomcat6 mkisofs gcc python MySQL-python openssh-clients wget + mysql mysql-server mkisofs gcc python MySQL-python openssh-clients wget # yum -y update # yum -y install java-1.7.0-openjdk @@ -124,7 +124,6 @@ To create debs install the following extra packages: # apt-get -y install python-mysqldb # apt-get -y install debhelper - # apt-get -y install tomcat6 Then: @@ -138,7 +137,6 @@ All the deb packages will be located one level down. To create rpms, install the following extra packages: # yum -y install rpm-build - # yum -y install tomcat6 # yum -y install ws-commons-util # yum -y instal gcc # yum -y install glibc-devel @@ -154,7 +152,7 @@ All the rpm packages will be created in `dist/rpmbuild/RPMS/x86_64` directory. ## Notes -If you will be using Xen as your hypervisor, please download [vhd-util](http://download.cloud.com.s3.amazonaws.com/tools/vhd-util) +If you will be using Xen as your hypervisor, please download [vhd-util](http://download.cloudstack.org/tools/vhd-util) If management server is installed on RHEL/CentOS, then copy vhd-util into: diff --git a/LICENSE b/LICENSE index 982b15844f4a..0dcb45c61893 100644 --- a/LICENSE +++ b/LICENSE @@ -208,7 +208,7 @@ Within the console-proxy/js directory jquery.js -Within the patches/systemvm/debian/config/etc directory +Within the systemvm/debian/etc directory placed in the public domain by Adiscon GmbH http://www.adiscon.com/ rsyslog.conf @@ -216,14 +216,14 @@ Within the patches/systemvm/debian/config/etc directory dnsmasq.conf vpcdnsmasq.conf -Within the patches/systemvm/debian/config/etc/apache2 directory +Within the systemvm/debian/etc/apache2 directory licensed under the Apache License, Version 2 http://www.apache.org/licenses/LICENSE-2.0.txt (as above) Copyright (c) 2012 The Apache Software Foundation from The Apache Software Foundation http://www.apache.org/ httpd.conf vhost.template -Within the patches/systemvm/debian/config/etc/ssh/ directory +Within the systemvm/debian/etc/ssh/ directory licensed under the BSD (2-clause) http://www.opensource.org/licenses/BSD-2-Clause (as follows) @@ -254,7 +254,7 @@ Within the patches/systemvm/debian/config/etc/ssh/ directory from OpenSSH Project http://www.openssh.org/ sshd_config -Within the patches/systemvm/debian/config/root/redundant_router directory +Within the systemvm/debian/root/redundant_router directory placed in the public domain by The netfilter.org project http://www.netfilter.org/ conntrackd.conf.templ @@ -271,65 +271,6 @@ Within the scripts/vm/hypervisor/xenserver directory from OpenStack, LLC http://www.openstack.org swift -Within the tools/appliance/definitions/{devcloud,systemvmtemplate,systemvmtemplate64} directory - licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) - - Copyright (c) 2010-2012 Patrick Debois - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - from Patrick Debois http://www.jedi.be/blog/ - base.sh from https://github.com/jedi4ever/veewee - cleanup.sh from https://github.com/jedi4ever/veewee - definition.rb from https://github.com/jedi4ever/veewee - preseed.cfg from https://github.com/jedi4ever/veewee - zerodisk.sh from https://github.com/jedi4ever/veewee - -Within the tools/devcloud/src/deps/boxes/basebox-build directory - licensed under the MIT License http://www.opensource.org/licenses/mit-license.php (as follows) - - Copyright (c) 2010-2012 Patrick Debois - - Permission is hereby granted, free of charge, to any person obtaining - a copy of this software and associated documentation files (the - "Software"), to deal in the Software without restriction, including - without limitation the rights to use, copy, modify, merge, publish, - distribute, sublicense, and/or sell copies of the Software, and to - permit persons to whom the Software is furnished to do so, subject to - the following conditions: - - The above copyright notice and this permission notice shall be - included in all copies or substantial portions of the Software. - - THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, - EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF - MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND - NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE - LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION - OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION - WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - - from Patrick Debois http://www.jedi.be/blog/ - definition.rb from https://github.com/jedi4ever/veewee - preseed.cfg from https://github.com/jedi4ever/veewee - Within the ui/lib directory placed in the public domain by Eric Meyer http://meyerweb.com/eric/ diff --git a/PULL_REQUEST_TEMPLATE.md b/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 000000000000..17adfe69a312 --- /dev/null +++ b/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,39 @@ +## Description + + + + + +## Types of changes + +- [ ] Breaking change (fix or feature that would cause existing functionality to change) +- [ ] New feature (non-breaking change which adds functionality) +- [ ] Bug fix (non-breaking change which fixes an issue) +- [ ] Enhancement (improves an existing feature and functionality) +- [ ] Cleanup (Code refactoring and cleanup, that may add test cases) + +## GitHub Issue/PRs + + + + + + +## Screenshots (if appropriate): + +## How Has This Been Tested? + + + + + +## Checklist: + + +- [ ] I have read the [CONTRIBUTING](https://github.com/apache/cloudstack/blob/master/CONTRIBUTING.md) document. +- [ ] My code follows the code style of this project. +- [ ] My change requires a change to the documentation. +- [ ] I have updated the documentation accordingly. +- [ ] I have added tests to cover my changes. +- [ ] All new and existing tests passed. + diff --git a/README.md b/README.md index 287f8f2bf687..17a7a8f7bd9e 100644 --- a/README.md +++ b/README.md @@ -42,7 +42,7 @@ For more information on Apache CloudStack, please visit the [website](http://clo Apache CloudStack project uses Git. The official Git repository is at: - https://git-wip-us.apache.org/repos/asf/cloudstack.git + https://gitbox.apache.org/repos/asf/cloudstack.git And a mirror is hosted on Github: @@ -92,8 +92,7 @@ developer [page](http://cloudstack.apache.org/developers.html) for contributing * [Blog](https://blogs.apache.org/cloudstack) * [Twitter](https://twitter.com/cloudstack) -* [Planet CloudStack](http://planet.apache.org/cloudstack) -* [Events and meetup](http://lanyrd.com/topics/apache-cloudstack) +* [Events and meetup](http://cloudstackcollab.org/) ## Reporting Security Vulnerabilities diff --git a/agent-simulator/tomcatconf/commands-simulator.properties.in b/agent-simulator/tomcatconf/commands-simulator.properties.in deleted file mode 100644 index 4350bb788b43..000000000000 --- a/agent-simulator/tomcatconf/commands-simulator.properties.in +++ /dev/null @@ -1,21 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - -configureSimulator=com.cloud.api.commands.ConfigureSimulatorCmd;1 -querySimulatorMock=com.cloud.api.commands.QuerySimulatorMockCmd;1 -cleanupSimulatorMock=com.cloud.api.commands.CleanupSimulatorMockCmd;1 diff --git a/agent/bindir/cloud-setup-agent.in b/agent/bindir/cloud-setup-agent.in index 8d2b91961aef..3c6203c2d340 100755 --- a/agent/bindir/cloud-setup-agent.in +++ b/agent/bindir/cloud-setup-agent.in @@ -26,6 +26,7 @@ from cloudutils.configFileOps import configFileOps from cloudutils.globalEnv import globalEnv from cloudutils.networkConfig import networkConfig from cloudutils.syscfg import sysConfigFactory +from cloudutils.serviceConfig import configureLibvirtConfig from optparse import OptionParser @@ -100,6 +101,7 @@ if __name__ == '__main__': parser.add_option("-c", "--cluster", dest="cluster", help="cluster id") parser.add_option("-t", "--hypervisor", default="kvm", dest="hypervisor", help="hypervisor type") parser.add_option("-g", "--guid", dest="guid", help="guid") + parser.add_option("-s", action="store_true", default=False, dest="secure", help="Secure and enable TLS for libvirtd") parser.add_option("--pubNic", dest="pubNic", help="Public traffic interface") parser.add_option("--prvNic", dest="prvNic", help="Private traffic interface") parser.add_option("--guestNic", dest="guestNic", help="Guest traffic interface") @@ -110,6 +112,12 @@ if __name__ == '__main__': glbEnv.bridgeType = bridgeType (options, args) = parser.parse_args() + + if not options.auto and options.secure: + configureLibvirtConfig(True) + print "Libvirtd with TLS configured" + sys.exit(0) + if options.auto is None: userInputs = getUserInputs() glbEnv.mgtSvr = userInputs[0] @@ -138,7 +146,9 @@ if __name__ == '__main__': glbEnv.nics.append(options.prvNic) glbEnv.nics.append(options.pubNic) glbEnv.nics.append(options.guestNic) - + + glbEnv.secure = options.secure + print "Starting to configure your system:" syscfg = sysConfigFactory.getSysConfigFactory(glbEnv) try: diff --git a/agent/bindir/libvirtqemuhook.in b/agent/bindir/libvirtqemuhook.in index 9fbe037d1c15..55ab3e673095 100755 --- a/agent/bindir/libvirtqemuhook.in +++ b/agent/bindir/libvirtqemuhook.in @@ -6,25 +6,36 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -import sys + +import logging import re +import sys from xml.dom.minidom import parse from cloudutils.configFileOps import configFileOps from cloudutils.networkConfig import networkConfig + +logging.basicConfig(filename='/var/log/libvirt/qemu-hook.log', + filemode='a', + format='%(asctime)s,%(msecs)d %(name)s %(levelname)s %(message)s', + datefmt='%H:%M:%S', + level=logging.INFO) +logger = logging.getLogger('qemu-hook') + def isOldStyleBridge(brName): if brName.find("cloudVirBr") == 0: return True else: return False + def isNewStyleBridge(brName): if brName.startswith('brvx-'): return False @@ -32,12 +43,14 @@ def isNewStyleBridge(brName): return False else: return True + def getGuestNetworkDevice(): - netlib = networkConfig() + netlib = networkConfig() cfo = configFileOps("/etc/cloudstack/agent/agent.properties") guestDev = cfo.getEntry("guest.network.device") enslavedDev = netlib.getEnslavedDev(guestDev, 1) return enslavedDev.split(".")[0] + def handleMigrateBegin(): try: domain = parse(sys.stdin) @@ -45,20 +58,26 @@ def handleMigrateBegin(): source = interface.getElementsByTagName("source")[0] bridge = source.getAttribute("bridge") if isOldStyleBridge(bridge): - vlanId = bridge.replace("cloudVirBr","") + vlanId = bridge.replace("cloudVirBr", "") elif isNewStyleBridge(bridge): - vlanId = re.sub(r"br(\w+)-","",bridge) + vlanId = re.sub(r"br(\w+)-", "", bridge) else: continue phyDev = getGuestNetworkDevice() - newBrName="br" + phyDev + "-" + vlanId + newBrName = "br" + phyDev + "-" + vlanId source.setAttribute("bridge", newBrName) print(domain.toxml()) except: pass + + if __name__ == '__main__': if len(sys.argv) != 5: sys.exit(0) - if sys.argv[2] == "migrate" and sys.argv[3] == "begin": - handleMigrateBegin() + # For docs refer https://libvirt.org/hooks.html#qemu + logger.debug("Executing qemu hook with args: %s" % sys.argv) + action, status = sys.argv[2:4] + + if action == "migrate" and status == "begin": + handleMigrateBegin() diff --git a/agent/conf/agent.properties b/agent/conf/agent.properties index 8b99ee364661..ad35b96bab6e 100644 --- a/agent/conf/agent.properties +++ b/agent/conf/agent.properties @@ -30,6 +30,17 @@ workers=5 #host= The IP address of management server host=localhost +# The time interval in seconds after which agent will check if connected host +# is the preferred host (the first host in the comma-separated list is preferred +# one) and will attempt to reconnect to the preferred host when it's connected +# to one of the secondary/backup hosts. The timer task is scheduled after agent +# connects to a management server. On connection, it receives admin configured +# cluster-level 'indirect.agent.lb.check.interval' setting that will be used by +# the agent as the preferred host check interval however the following setting +# if defined overrides the received value. The value 0 and lb algorithm 'shuffle' +# disables this background task. +#host.lb.check.interval=0 + #port = The port management server listening on, default is 8250 port=8250 @@ -56,6 +67,11 @@ zone=default # local storage path, by default, it's /var/lib/libvirt/images/ #local.storage.path=/var/lib/libvirt/images/ +# Qemu socket path, directory where Qemu sockets are placed. +# These sockets are for the Qemu Guest Agent and SSVM privisioning +# Make sure that AppArmor or SELinux allow libvirt to write there +#qemu.sockets.path=/var/lib/libvirt/qemu + # The UUID for the local storage pool, this is mandatory! # Generate with "uuidgen" local.storage.uuid= @@ -153,6 +169,41 @@ hypervisor.type=kvm # Some newer linux kernels are incapable of reliably migrating vms with kvmclock # This is a workaround for the bug, admin can set this to true per-host # -#router.aggregation.command.each.timeout=600 -#timeout value for aggregation commands send to virtual router +# vm.rng.enable=false +# This enabled the VirtIO Random Number Generator device for guests. +# +# vm.rng.model=random +# The model of VirtIO Random Number Generator (RNG) to present to the Guest. +# Currently only 'random' is supported. +# +# vm.rng.path=/dev/random +# Local Random Number Device Generator to use for VirtIO RNG for Guests. +# This is usually /dev/random, but per platform this might be different +# +# vm.rng.rate.bytes=2048 +# The amount of bytes the Guest may request/obtain from the RNG in the period +# specified below. +# +# vm.rng.rate.period=1000 +# The number of milliseconds in which the guest is allowed to obtain the bytes +# specified above. +# +# router.aggregation.command.each.timeout=600 +# timeout value for aggregation commands send to virtual router +# +# host.overcommit.mem.mb = 0 +# allows to increase amount of ram available on host virtually to utilize Zswap, KSM features +# and modern fast SSD/3D XPoint devices. Specified amount of MBs is added to the memory agent +# reports to the Management Server +# Default: 0 +# +# vm.watchdog.model=i6300esb +# The model of Watchdog timer to present to the Guest +# For all models refer to the libvirt documentation. +# Recommend value is: i6300esb # +# vm.watchdog.action=none +# Action to take when the Guest/Instance is no longer notifiying the Watchdog +# timer. +# For all actions refer to the libvirt documentation. +# Recommended values are: none, reset and poweroff. diff --git a/agent/pom.xml b/agent/pom.xml index 02eb9d8b1dc2..50b10c17827d 100644 --- a/agent/pom.xml +++ b/agent/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT diff --git a/agent/src/com/cloud/agent/Agent.java b/agent/src/com/cloud/agent/Agent.java index 7fab5f4d3013..67115e649a1b 100644 --- a/agent/src/com/cloud/agent/Agent.java +++ b/agent/src/com/cloud/agent/Agent.java @@ -16,12 +16,16 @@ // under the License. package com.cloud.agent; +import java.io.File; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import java.net.InetAddress; +import java.net.InetSocketAddress; +import java.net.Socket; import java.net.UnknownHostException; import java.nio.channels.ClosedChannelException; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -35,7 +39,18 @@ import javax.naming.ConfigurationException; +import org.apache.cloudstack.agent.directdownload.SetupDirectDownloadCertificate; +import org.apache.cloudstack.agent.lb.SetupMSListAnswer; +import org.apache.cloudstack.agent.lb.SetupMSListCommand; +import org.apache.cloudstack.ca.PostCertificateRenewalCommand; +import org.apache.cloudstack.ca.SetupCertificateAnswer; +import org.apache.cloudstack.ca.SetupCertificateCommand; +import org.apache.cloudstack.ca.SetupKeyStoreCommand; +import org.apache.cloudstack.ca.SetupKeystoreAnswer; import org.apache.cloudstack.managed.context.ManagedContextTimerTask; +import org.apache.cloudstack.utils.security.KeyStoreUtils; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.io.FileUtils; import org.apache.log4j.Logger; import org.slf4j.MDC; @@ -54,8 +69,10 @@ import com.cloud.agent.transport.Request; import com.cloud.agent.transport.Response; import com.cloud.exception.AgentControlChannelException; +import com.cloud.host.Host; import com.cloud.resource.ServerResource; import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.StringUtils; import com.cloud.utils.backoff.BackoffAlgorithm; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.exception.CloudRuntimeException; @@ -68,6 +85,7 @@ import com.cloud.utils.nio.Task; import com.cloud.utils.script.OutputInterpreter; import com.cloud.utils.script.Script; +import com.google.common.base.Strings; /** * @config @@ -111,6 +129,8 @@ public int value() { Long _id; Timer _timer = new Timer("Agent Timer"); + Timer certTimer; + Timer hostLBTimer; List _watchList = new ArrayList(); long _sequence = 0; @@ -123,17 +143,22 @@ public int value() { long _startupWait = _startupWaitDefault; boolean _reconnectAllowed = true; //For time sentitive task, e.g. PingTask - private final ThreadPoolExecutor _ugentTaskPool; + ThreadPoolExecutor _ugentTaskPool; ExecutorService _executor; + Thread _shutdownThread = new ShutdownThread(this); + + private String _keystoreSetupPath; + private String _keystoreCertImportPath; + // for simulator use only public Agent(final IAgentShell shell) { _shell = shell; _link = null; - _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this); + _connection = new NioClient("Agent", _shell.getNextHost(), _shell.getPort(), _shell.getWorkers(), this); - Runtime.getRuntime().addShutdownHook(new ShutdownThread(this)); + Runtime.getRuntime().addShutdownHook(_shutdownThread); _ugentTaskPool = new ThreadPoolExecutor(shell.getPingRetries(), 2 * shell.getPingRetries(), 10, TimeUnit.MINUTES, new SynchronousQueue(), new NamedThreadFactory( @@ -166,12 +191,13 @@ public Agent(final IAgentShell shell, final int localAgentId, final ServerResour throw new ConfigurationException("Unable to configure " + _resource.getName()); } - _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this); + final String host = _shell.getNextHost(); + _connection = new NioClient("Agent", host, _shell.getPort(), _shell.getWorkers(), this); // ((NioClient)_connection).setBindAddress(_shell.getPrivateIp()); s_logger.debug("Adding shutdown hook"); - Runtime.getRuntime().addShutdownHook(new ShutdownThread(this)); + Runtime.getRuntime().addShutdownHook(_shutdownThread); _ugentTaskPool = new ThreadPoolExecutor(shell.getPingRetries(), 2 * shell.getPingRetries(), 10, TimeUnit.MINUTES, new SynchronousQueue(), new NamedThreadFactory( @@ -182,7 +208,7 @@ public Agent(final IAgentShell shell, final int localAgentId, final ServerResour "agentRequest-Handler")); s_logger.info("Agent [id = " + (_id != null ? _id : "new") + " : type = " + getResourceName() + " : zone = " + _shell.getZone() + " : pod = " + _shell.getPod() + - " : workers = " + _shell.getWorkers() + " : host = " + _shell.getHost() + " : port = " + _shell.getPort()); + " : workers = " + _shell.getWorkers() + " : host = " + host + " : port = " + _shell.getPort()); } public String getVersion() { @@ -218,12 +244,41 @@ public String getResourceName() { return _resource.getClass().getSimpleName(); } + /** + * In case of a software based agent restart, this method + * can help to perform explicit garbage collection of any old + * agent instances and its inner objects. + */ + private void scavengeOldAgentObjects() { + _executor.submit(new Runnable() { + @Override + public void run() { + try { + Thread.sleep(2000L); + } catch (final InterruptedException ignored) { + } finally { + System.gc(); + } + } + }); + } + public void start() { if (!_resource.start()) { s_logger.error("Unable to start the resource: " + _resource.getName()); throw new CloudRuntimeException("Unable to start the resource: " + _resource.getName()); } + _keystoreSetupPath = Script.findScript("scripts/util/", KeyStoreUtils.KS_SETUP_SCRIPT); + if (_keystoreSetupPath == null) { + throw new CloudRuntimeException(String.format("Unable to find the '%s' script", KeyStoreUtils.KS_SETUP_SCRIPT)); + } + + _keystoreCertImportPath = Script.findScript("scripts/util/", KeyStoreUtils.KS_IMPORT_SCRIPT); + if (_keystoreCertImportPath == null) { + throw new CloudRuntimeException(String.format("Unable to find the '%s' script", KeyStoreUtils.KS_IMPORT_SCRIPT)); + } + try { _connection.start(); } catch (final NioConnectionException e) { @@ -231,8 +286,10 @@ public void start() { s_logger.info("Attempted to connect to the server, but received an unexpected exception, trying again..."); } while (!_connection.isStartup()) { + final String host = _shell.getNextHost(); _shell.getBackoffAlgorithm().waitBeforeRetry(); - _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this); + _connection = new NioClient("Agent", host, _shell.getPort(), _shell.getWorkers(), this); + s_logger.info("Connecting to host:" + host); try { _connection.start(); } catch (final NioConnectionException e) { @@ -240,6 +297,8 @@ public void start() { s_logger.info("Attempted to connect to the server, but received an unexpected exception, trying again..."); } } + _shell.updateConnectedHost(); + scavengeOldAgentObjects(); } public void stop(final String reason, final String detail) { @@ -264,6 +323,7 @@ public void stop(final String reason, final String detail) { } _connection.stop(); _connection = null; + _link = null; } if (_resource != null) { @@ -271,7 +331,34 @@ public void stop(final String reason, final String detail) { _resource = null; } - _ugentTaskPool.shutdownNow(); + if (_startup != null) { + _startup = null; + } + + if (_ugentTaskPool != null) { + _ugentTaskPool.shutdownNow(); + _ugentTaskPool = null; + } + + if (_executor != null) { + _executor.shutdown(); + _executor = null; + } + + if (_timer != null) { + _timer.cancel(); + _timer = null; + } + + if (hostLBTimer != null) { + hostLBTimer.cancel(); + hostLBTimer = null; + } + + if (certTimer != null) { + certTimer.cancel(); + certTimer = null; + } } public Long getId() { @@ -284,6 +371,26 @@ public void setId(final Long id) { _shell.setPersistentProperty(getResourceName(), "id", Long.toString(id)); } + private synchronized void scheduleServicesRestartTask() { + if (certTimer != null) { + certTimer.cancel(); + certTimer.purge(); + } + certTimer = new Timer("Certificate Renewal Timer"); + certTimer.schedule(new PostCertificateRenewalTask(this), 5000L); + } + + private synchronized void scheduleHostLBCheckerTask(final long checkInterval) { + if (hostLBTimer != null) { + hostLBTimer.cancel(); + } + if (checkInterval > 0L) { + s_logger.info("Scheduling preferred host timer task with host.lb.interval=" + checkInterval + "ms"); + hostLBTimer = new Timer("Host LB Timer"); + hostLBTimer.scheduleAtFixedRate(new PreferredHostCheckerTask(), checkInterval, checkInterval); + } + } + public void scheduleWatch(final Link link, final Request request, final long delay, final long period) { synchronized (_watchList) { if (s_logger.isDebugEnabled()) { @@ -306,8 +413,8 @@ protected void cancelTasks() { _watchList.clear(); } } - public synchronized void lockStartupTask(final Link link) - { + + public synchronized void lockStartupTask(final Link link) { _startup = new StartupTask(link); _timer.schedule(_startup, _startupWait); } @@ -315,9 +422,11 @@ public synchronized void lockStartupTask(final Link link) public void sendStartup(final Link link) { final StartupCommand[] startup = _resource.initialize(); if (startup != null) { + final String msHostList = _shell.getPersistentProperty(null, "host"); final Command[] commands = new Command[startup.length]; for (int i = 0; i < startup.length; i++) { setupStartupCommand(startup[i]); + startup[i].setMSHostList(msHostList); commands[i] = startup[i]; } final Request request = new Request(_id != null ? _id : -1, -1, commands, false, false); @@ -376,25 +485,17 @@ protected void reconnect(final Link link) { } } - link.close(); - link.terminated(); + if (link != null) { + link.close(); + link.terminated(); + } setLink(null); cancelTasks(); _resource.disconnected(); - int inProgress = 0; - do { - _shell.getBackoffAlgorithm().waitBeforeRetry(); - - s_logger.info("Lost connection to the server. Dealing with the remaining commands..."); - - inProgress = _inProgress.get(); - if (inProgress > 0) { - s_logger.info("Cannot connect because we still have " + inProgress + " commands in progress."); - } - } while (inProgress > 0); + s_logger.info("Lost connection to host: " + _shell.getConnectedHost() + ". Attempting reconnection while we still have " + _inProgress.get() + " commands in progress."); _connection.stop(); @@ -408,18 +509,26 @@ protected void reconnect(final Link link) { _shell.getBackoffAlgorithm().waitBeforeRetry(); } - _connection = new NioClient("Agent", _shell.getHost(), _shell.getPort(), _shell.getWorkers(), this); + final String host = _shell.getNextHost(); do { - s_logger.info("Reconnecting..."); + _connection = new NioClient("Agent", host, _shell.getPort(), _shell.getWorkers(), this); + s_logger.info("Reconnecting to host:" + host); try { _connection.start(); } catch (final NioConnectionException e) { s_logger.warn("NIO Connection Exception " + e); s_logger.info("Attempted to connect to the server, but received an unexpected exception, trying again..."); + _connection.stop(); + try { + _connection.cleanUp(); + } catch (final IOException ex) { + s_logger.warn("Fail to clean up old connection. " + ex); + } } _shell.getBackoffAlgorithm().waitBeforeRetry(); } while (!_connection.isStartup()); - s_logger.info("Connected to the server"); + _shell.updateConnectedHost(); + s_logger.info("Connected to the host: " + _shell.getConnectedHost()); } public void processStartupAnswer(final Answer answer, final Response response, final Link link) { @@ -515,7 +624,17 @@ protected void processRequest(final Request request, final Link link) { s_logger.warn("No handler found to process cmd: " + cmd.toString()); answer = new AgentControlAnswer(cmd); } - + } else if (cmd instanceof SetupKeyStoreCommand && ((SetupKeyStoreCommand) cmd).isHandleByAgent()) { + answer = setupAgentKeystore((SetupKeyStoreCommand) cmd); + } else if (cmd instanceof SetupCertificateCommand && ((SetupCertificateCommand) cmd).isHandleByAgent()) { + answer = setupAgentCertificate((SetupCertificateCommand) cmd); + if (Host.Type.Routing.equals(_resource.getType())) { + scheduleServicesRestartTask(); + } + } else if (cmd instanceof SetupDirectDownloadCertificate) { + answer = setupDirectDownloadCertificate((SetupDirectDownloadCertificate) cmd); + } else if (cmd instanceof SetupMSListCommand) { + answer = setupManagementServerList((SetupMSListCommand) cmd); } else { if (cmd instanceof ReadyCommand) { processReadyCommand(cmd); @@ -565,6 +684,135 @@ protected void processRequest(final Request request, final Link link) { } } + private Answer setupDirectDownloadCertificate(SetupDirectDownloadCertificate cmd) { + String certificate = cmd.getCertificate(); + String certificateName = cmd.getCertificateName(); + s_logger.info("Importing certificate " + certificateName + " into keystore"); + + final File agentFile = PropertiesUtil.findConfigFile("agent.properties"); + if (agentFile == null) { + return new Answer(cmd, false, "Failed to find agent.properties file"); + } + + final String keyStoreFile = agentFile.getParent() + "/" + KeyStoreUtils.KS_FILENAME; + + String cerFile = agentFile.getParent() + "/" + certificateName + ".cer"; + Script.runSimpleBashScript(String.format("echo '%s' > %s", certificate, cerFile)); + + String privatePasswordFormat = "sed -n '/keystore.passphrase/p' '%s' 2>/dev/null | sed 's/keystore.passphrase=//g' 2>/dev/null"; + String privatePasswordCmd = String.format(privatePasswordFormat, agentFile.getAbsolutePath()); + String privatePassword = Script.runSimpleBashScript(privatePasswordCmd); + + String importCommandFormat = "keytool -importcert -file %s -keystore %s -alias '%s' -storepass '%s' -noprompt"; + String importCmd = String.format(importCommandFormat, cerFile, keyStoreFile, certificateName, privatePassword); + Script.runSimpleBashScript(importCmd); + return new Answer(cmd, true, "Certificate " + certificateName + " imported"); + } + + public Answer setupAgentKeystore(final SetupKeyStoreCommand cmd) { + final String keyStorePassword = cmd.getKeystorePassword(); + final long validityDays = cmd.getValidityDays(); + + s_logger.debug("Setting up agent keystore file and generating CSR"); + + final File agentFile = PropertiesUtil.findConfigFile("agent.properties"); + if (agentFile == null) { + return new Answer(cmd, false, "Failed to find agent.properties file"); + } + final String keyStoreFile = agentFile.getParent() + "/" + KeyStoreUtils.KS_FILENAME; + final String csrFile = agentFile.getParent() + "/" + KeyStoreUtils.CSR_FILENAME; + + String storedPassword = _shell.getPersistentProperty(null, KeyStoreUtils.KS_PASSPHRASE_PROPERTY); + if (Strings.isNullOrEmpty(storedPassword)) { + storedPassword = keyStorePassword; + _shell.setPersistentProperty(null, KeyStoreUtils.KS_PASSPHRASE_PROPERTY, storedPassword); + } + + Script script = new Script(_keystoreSetupPath, 60000, s_logger); + script.add(agentFile.getAbsolutePath()); + script.add(keyStoreFile); + script.add(storedPassword); + script.add(String.valueOf(validityDays)); + script.add(csrFile); + String result = script.execute(); + if (result != null) { + throw new CloudRuntimeException("Unable to setup keystore file"); + } + + final String csrString; + try { + csrString = FileUtils.readFileToString(new File(csrFile), Charset.defaultCharset()); + } catch (IOException e) { + throw new CloudRuntimeException("Unable to read generated CSR file", e); + } + return new SetupKeystoreAnswer(csrString); + } + + private Answer setupAgentCertificate(final SetupCertificateCommand cmd) { + final String certificate = cmd.getCertificate(); + final String privateKey = cmd.getPrivateKey(); + final String caCertificates = cmd.getCaCertificates(); + + s_logger.debug("Importing received certificate to agent's keystore"); + + final File agentFile = PropertiesUtil.findConfigFile("agent.properties"); + if (agentFile == null) { + return new Answer(cmd, false, "Failed to find agent.properties file"); + } + final String keyStoreFile = agentFile.getParent() + "/" + KeyStoreUtils.KS_FILENAME; + final String certFile = agentFile.getParent() + "/" + KeyStoreUtils.CERT_FILENAME; + final String privateKeyFile = agentFile.getParent() + "/" + KeyStoreUtils.PKEY_FILENAME; + final String caCertFile = agentFile.getParent() + "/" + KeyStoreUtils.CACERT_FILENAME; + + try { + FileUtils.writeStringToFile(new File(certFile), certificate, Charset.defaultCharset()); + FileUtils.writeStringToFile(new File(caCertFile), caCertificates, Charset.defaultCharset()); + s_logger.debug("Saved received client certificate to: " + certFile); + } catch (IOException e) { + throw new CloudRuntimeException("Unable to save received agent client and ca certificates", e); + } + + Script script = new Script(_keystoreCertImportPath, 60000, s_logger); + script.add(agentFile.getAbsolutePath()); + script.add(keyStoreFile); + script.add(KeyStoreUtils.AGENT_MODE); + script.add(certFile); + script.add(""); + script.add(caCertFile); + script.add(""); + script.add(privateKeyFile); + script.add(privateKey); + String result = script.execute(); + if (result != null) { + throw new CloudRuntimeException("Unable to import certificate into keystore file"); + } + return new SetupCertificateAnswer(true); + } + + private void processManagementServerList(final List msList, final String lbAlgorithm, final Long lbCheckInterval) { + if (CollectionUtils.isNotEmpty(msList) && !Strings.isNullOrEmpty(lbAlgorithm)) { + try { + final String newMSHosts = String.format("%s%s%s", StringUtils.toCSVList(msList), IAgentShell.hostLbAlgorithmSeparator, lbAlgorithm); + _shell.setPersistentProperty(null, "host", newMSHosts); + _shell.setHosts(newMSHosts); + _shell.resetHostCounter(); + s_logger.info("Processed new management server list: " + newMSHosts); + } catch (final Exception e) { + throw new CloudRuntimeException("Could not persist received management servers list", e); + } + } + if ("shuffle".equals(lbAlgorithm)) { + scheduleHostLBCheckerTask(0); + } else { + scheduleHostLBCheckerTask(_shell.getLbCheckerInterval(lbCheckInterval)); + } + } + + private Answer setupManagementServerList(final SetupMSListCommand cmd) { + processManagementServerList(cmd.getMsList(), cmd.getLbAlgorithm(), cmd.getLbCheckInterval()); + return new SetupMSListAnswer(true); + } + public void processResponse(final Response response, final Link link) { final Answer answer = response.getAnswer(); if (s_logger.isDebugEnabled()) { @@ -585,15 +833,16 @@ public void processResponse(final Response response, final Link link) { } public void processReadyCommand(final Command cmd) { - final ReadyCommand ready = (ReadyCommand)cmd; - s_logger.info("Proccess agent ready command, agent id = " + ready.getHostId()); + s_logger.info("Processing agent ready command, agent id = " + ready.getHostId()); if (ready.getHostId() != null) { setId(ready.getHostId()); } - s_logger.info("Ready command is processed: agent id = " + getId()); + processManagementServerList(ready.getMsHostList(), ready.getLbAlgorithm(), ready.getLbCheckInterval()); + + s_logger.info("Ready command is processed for agent id = " + getId()); } public void processOtherTask(final Task task) { @@ -875,4 +1124,98 @@ public void doTask(final Task task) throws TaskExecutionException { } } } + + /** + * Task stops the current agent and launches a new agent + * when there are no outstanding jobs in the agent's task queue + */ + public class PostCertificateRenewalTask extends ManagedContextTimerTask { + + private Agent agent; + + public PostCertificateRenewalTask(final Agent agent) { + this.agent = agent; + } + + @Override + protected void runInContext() { + while (true) { + try { + if (_inProgress.get() == 0) { + s_logger.debug("Running post certificate renewal task to restart services."); + + // Let the resource perform any post certificate renewal cleanups + _resource.executeRequest(new PostCertificateRenewalCommand()); + + IAgentShell shell = agent._shell; + ServerResource resource = agent._resource.getClass().newInstance(); + + // Stop current agent + agent.cancelTasks(); + agent._reconnectAllowed = false; + Runtime.getRuntime().removeShutdownHook(agent._shutdownThread); + agent.stop(ShutdownCommand.Requested, "Restarting due to new X509 certificates"); + + // Nullify references for GC + agent._shell = null; + agent._watchList = null; + agent._shutdownThread = null; + agent._controlListeners = null; + agent = null; + + // Start a new agent instance + shell.launchNewAgent(resource); + return; + } + if (s_logger.isTraceEnabled()) { + s_logger.debug("Other tasks are in progress, will retry post certificate renewal command after few seconds"); + } + Thread.sleep(5000); + } catch (final Exception e) { + s_logger.warn("Failed to execute post certificate renewal command:", e); + break; + } + } + } + } + + public class PreferredHostCheckerTask extends ManagedContextTimerTask { + + @Override + protected void runInContext() { + try { + final String[] msList = _shell.getHosts(); + if (msList == null || msList.length < 1) { + return; + } + final String preferredHost = msList[0]; + final String connectedHost = _shell.getConnectedHost(); + if (s_logger.isTraceEnabled()) { + s_logger.trace("Running preferred host checker task, connected host=" + connectedHost + ", preferred host=" + preferredHost); + } + if (preferredHost != null && !preferredHost.equals(connectedHost) && _link != null) { + boolean isHostUp = true; + try (final Socket socket = new Socket()) { + socket.connect(new InetSocketAddress(preferredHost, _shell.getPort()), 5000); + } catch (final IOException e) { + isHostUp = false; + if (s_logger.isTraceEnabled()) { + s_logger.trace("Host: " + preferredHost + " is not reachable"); + } + } + if (isHostUp && _link != null && _inProgress.get() == 0) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Preferred host " + preferredHost + " is found to be reachable, trying to reconnect"); + } + _shell.resetHostCounter(); + reconnect(_link); + } + } + } catch (Throwable t) { + s_logger.error("Error caught while attempting to connect to preferred host", t); + } + } + + } + } diff --git a/agent/src/com/cloud/agent/AgentShell.java b/agent/src/com/cloud/agent/AgentShell.java index 5e0da68c6d66..01654ac9caa9 100644 --- a/agent/src/com/cloud/agent/AgentShell.java +++ b/agent/src/com/cloud/agent/AgentShell.java @@ -50,6 +50,7 @@ import com.cloud.utils.backoff.BackoffAlgorithm; import com.cloud.utils.backoff.impl.ConstantTimeBackoff; import com.cloud.utils.exception.CloudRuntimeException; +import com.google.common.base.Strings; public class AgentShell implements IAgentShell, Daemon { private static final Logger s_logger = Logger.getLogger(AgentShell.class.getName()); @@ -67,10 +68,14 @@ public class AgentShell implements IAgentShell, Daemon { private int _proxyPort; private int _workers; private String _guid; + private int _hostCounter = 0; private int _nextAgentId = 1; private volatile boolean _exit = false; private int _pingRetries; private final List _agents = new ArrayList(); + private String hostToConnect; + private String connectedHost; + private Long preferredHostCheckInterval; public AgentShell() { } @@ -106,8 +111,54 @@ public String getPod() { } @Override - public String getHost() { - return _host; + public String getNextHost() { + final String[] hosts = getHosts(); + if (_hostCounter >= hosts.length) { + _hostCounter = 0; + } + hostToConnect = hosts[_hostCounter % hosts.length]; + _hostCounter++; + return hostToConnect; + } + + @Override + public String getConnectedHost() { + return connectedHost; + } + + @Override + public long getLbCheckerInterval(final Long receivedLbInterval) { + if (preferredHostCheckInterval != null) { + return preferredHostCheckInterval * 1000L; + } + if (receivedLbInterval != null) { + return receivedLbInterval * 1000L; + } + return 0L; + } + + @Override + public void updateConnectedHost() { + connectedHost = hostToConnect; + } + + + @Override + public void resetHostCounter() { + _hostCounter = 0; + } + + @Override + public String[] getHosts() { + return _host.split(","); + } + + @Override + public void setHosts(final String host) { + if (!Strings.isNullOrEmpty(host)) { + _host = host.split(hostLbAlgorithmSeparator)[0]; + resetHostCounter(); + } } @Override @@ -240,7 +291,8 @@ protected boolean parseCommand(final String[] args) throws ConfigurationExceptio if (host == null) { host = "localhost"; } - _host = host; + + setHosts(host); if (zone != null) _zone = zone; @@ -280,6 +332,9 @@ protected boolean parseCommand(final String[] args) throws ConfigurationExceptio _properties.setProperty("guid", _guid); } + String val = getProperty(null, preferredHostIntervalKey); + preferredHostCheckInterval = (Strings.isNullOrEmpty(val) ? null : Long.valueOf(val)); + return true; } @@ -364,7 +419,7 @@ private void launchAgentFromClassInfo(String resourceClassNames) throws Configur final Constructor constructor = impl.getDeclaredConstructor(); constructor.setAccessible(true); ServerResource resource = (ServerResource)constructor.newInstance(); - launchAgent(getNextAgentId(), resource); + launchNewAgent(resource); } catch (final ClassNotFoundException e) { throw new ConfigurationException("Resource class not found: " + name + " due to: " + e.toString()); } catch (final SecurityException e) { @@ -392,9 +447,10 @@ private void launchAgentFromTypeInfo() throws ConfigurationException { s_logger.trace("Launching agent based on type=" + typeInfo); } - private void launchAgent(int localAgentId, ServerResource resource) throws ConfigurationException { + public void launchNewAgent(ServerResource resource) throws ConfigurationException { // we don't track agent after it is launched for now - Agent agent = new Agent(this, localAgentId, resource); + _agents.clear(); + Agent agent = new Agent(this, getNextAgentId(), resource); _agents.add(agent); agent.start(); } diff --git a/agent/src/com/cloud/agent/IAgentShell.java b/agent/src/com/cloud/agent/IAgentShell.java index dde67381a4af..5d389a07041b 100644 --- a/agent/src/com/cloud/agent/IAgentShell.java +++ b/agent/src/com/cloud/agent/IAgentShell.java @@ -19,36 +19,56 @@ import java.util.Map; import java.util.Properties; +import javax.naming.ConfigurationException; + +import com.cloud.resource.ServerResource; import com.cloud.utils.backoff.BackoffAlgorithm; public interface IAgentShell { - public Map getCmdLineProperties(); + String hostLbAlgorithmSeparator = "@"; + String preferredHostIntervalKey = "host.lb.check.interval"; + + Map getCmdLineProperties(); + + Properties getProperties(); + + String getPersistentProperty(String prefix, String name); + + void setPersistentProperty(String prefix, String name, String value); + + String getNextHost(); + + String getPrivateIp(); + + int getPort(); + + int getWorkers(); - public Properties getProperties(); + int getProxyPort(); - public String getPersistentProperty(String prefix, String name); + String getGuid(); - public void setPersistentProperty(String prefix, String name, String value); + String getZone(); - public String getHost(); + String getPod(); - public String getPrivateIp(); + BackoffAlgorithm getBackoffAlgorithm(); - public int getPort(); + int getPingRetries(); - public int getWorkers(); + String getVersion(); - public int getProxyPort(); + void setHosts(String hosts); - public String getGuid(); + void resetHostCounter(); - public String getZone(); + String[] getHosts(); - public String getPod(); + long getLbCheckerInterval(Long receivedLbInterval); - public BackoffAlgorithm getBackoffAlgorithm(); + void updateConnectedHost(); - public int getPingRetries(); + String getConnectedHost(); - public String getVersion(); + void launchNewAgent(ServerResource resource) throws ConfigurationException; } diff --git a/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java b/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java index df1b1ea7b271..a1db88c86c48 100644 --- a/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java +++ b/agent/src/com/cloud/agent/dao/impl/PropertiesStorage.java @@ -23,8 +23,6 @@ import java.util.Map; import java.util.Properties; -import javax.ejb.Local; - import org.apache.commons.io.IOUtils; import org.apache.log4j.Logger; @@ -37,7 +35,6 @@ * @config {@table || Param Name | Description | Values | Default || || path | * path to the properties _file | String | db/db.properties || * } **/ -@Local(value = {StorageComponent.class}) public class PropertiesStorage implements StorageComponent { private static final Logger s_logger = Logger.getLogger(PropertiesStorage.class); Properties _properties = new Properties(); @@ -51,6 +48,9 @@ public synchronized String get(String key) { @Override public synchronized void persist(String key, String value) { + if (!loadFromFile(_file)) { + s_logger.error("Failed to load changes and then write to them"); + } _properties.setProperty(key, value); FileOutputStream output = null; try { @@ -65,6 +65,20 @@ public synchronized void persist(String key, String value) { } } + private synchronized boolean loadFromFile(final File file) { + try { + PropertiesUtil.loadFromFile(_properties, file); + _file = file; + } catch (FileNotFoundException e) { + s_logger.error("How did we get here? ", e); + return false; + } catch (IOException e) { + s_logger.error("IOException: ", e); + return false; + } + return true; + } + @Override public synchronized boolean configure(String name, Map params) { _name = name; @@ -86,17 +100,7 @@ public synchronized boolean configure(String name, Map params) { return false; } } - try { - PropertiesUtil.loadFromFile(_properties, file); - _file = file; - } catch (FileNotFoundException e) { - s_logger.error("How did we get here? ", e); - return false; - } catch (IOException e) { - s_logger.error("IOException: ", e); - return false; - } - return true; + return loadFromFile(file); } @Override diff --git a/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java b/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java index 8509b438f5bc..c42a5af814d1 100644 --- a/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java +++ b/agent/src/com/cloud/agent/dhcp/FakeDhcpSnooper.java @@ -24,7 +24,6 @@ import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentLinkedQueue; -import javax.ejb.Local; import javax.naming.ConfigurationException; import org.apache.log4j.Logger; @@ -32,7 +31,6 @@ import com.cloud.utils.Pair; import com.cloud.utils.net.NetUtils; -@Local(value = {DhcpSnooper.class}) public class FakeDhcpSnooper implements DhcpSnooper { private static final Logger s_logger = Logger.getLogger(FakeDhcpSnooper.class); private Queue _ipAddresses = new ConcurrentLinkedQueue(); diff --git a/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloader.java new file mode 100644 index 000000000000..a88b4526e9d9 --- /dev/null +++ b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloader.java @@ -0,0 +1,71 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.agent.direct.download; + +public interface DirectTemplateDownloader { + + class DirectTemplateInformation { + private String installPath; + private Long size; + private String checksum; + + public DirectTemplateInformation(String installPath, Long size, String checksum) { + this.installPath = installPath; + this.size = size; + this.checksum = checksum; + } + + public String getInstallPath() { + return installPath; + } + + public Long getSize() { + return size; + } + + public String getChecksum() { + return checksum; + } + } + + /** + * Perform template download to pool specified on downloader creation + * @return true if successful, false if not + */ + boolean downloadTemplate(); + + /** + * Perform extraction (if necessary) and installation of previously downloaded template + * @return true if successful, false if not + */ + boolean extractAndInstallDownloadedTemplate(); + + /** + * Get template information after it is properly installed on pool + * @return template information + */ + DirectTemplateInformation getTemplateInformation(); + + /** + * Perform checksum validation of previously downloadeed template + * @return true if successful, false if not + */ + boolean validateChecksum(); +} diff --git a/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java new file mode 100644 index 000000000000..419ab7d1bbde --- /dev/null +++ b/agent/src/com/cloud/agent/direct/download/DirectTemplateDownloaderImpl.java @@ -0,0 +1,220 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.agent.direct.download; + +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; +import org.apache.cloudstack.utils.security.DigestHelper; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.security.NoSuchAlgorithmException; +import java.util.UUID; + +public abstract class DirectTemplateDownloaderImpl implements DirectTemplateDownloader { + + private String url; + private String destPoolPath; + private Long templateId; + private String downloadedFilePath; + private String installPath; + private String checksum; + private boolean redownload = false; + public static final Logger s_logger = Logger.getLogger(DirectTemplateDownloaderImpl.class.getName()); + + protected DirectTemplateDownloaderImpl(final String url, final String destPoolPath, final Long templateId, final String checksum) { + this.url = url; + this.destPoolPath = destPoolPath; + this.templateId = templateId; + this.checksum = checksum; + } + + private static String directDownloadDir = "template"; + + /** + * Return direct download temporary path to download template + */ + protected static String getDirectDownloadTempPath(Long templateId) { + String templateIdAsString = String.valueOf(templateId); + return directDownloadDir + File.separator + templateIdAsString.substring(0,1) + + File.separator + templateIdAsString; + } + + /** + * Create folder on path if it does not exist + */ + protected void createFolder(String path) { + File dir = new File(path); + if (!dir.exists()) { + dir.mkdirs(); + } + } + + public String getUrl() { + return url; + } + + public void setUrl(String url) { + this.url = url; + } + + public String getDestPoolPath() { + return destPoolPath; + } + + public Long getTemplateId() { + return templateId; + } + + public String getDownloadedFilePath() { + return downloadedFilePath; + } + + public void setDownloadedFilePath(String filePath) { + this.downloadedFilePath = filePath; + } + + public String getChecksum() { + return checksum; + } + + public void setChecksum(String checksum) { + this.checksum = checksum; + } + + public boolean isRedownload() { + return redownload; + } + + /** + * Return filename from url + */ + public String getFileNameFromUrl() { + String[] urlParts = url.split("/"); + return urlParts[urlParts.length - 1]; + } + + /** + * Checks if downloaded template is extractable + * @return true if it should be extracted, false if not + */ + private boolean isTemplateExtractable() { + String type = Script.runSimpleBashScript("file " + downloadedFilePath + " | awk -F' ' '{print $2}'"); + return type.equalsIgnoreCase("bzip2") || type.equalsIgnoreCase("gzip") || type.equalsIgnoreCase("zip"); + } + + @Override + public boolean extractAndInstallDownloadedTemplate() { + installPath = UUID.randomUUID().toString(); + if (isTemplateExtractable()) { + extractDownloadedTemplate(); + } else { + Script.runSimpleBashScript("mv " + downloadedFilePath + " " + getInstallFullPath()); + } + return true; + } + + /** + * Return install full path + */ + private String getInstallFullPath() { + return destPoolPath + File.separator + installPath; + } + + /** + * Return extract command to execute given downloaded file + */ + private String getExtractCommandForDownloadedFile() { + if (downloadedFilePath.endsWith(".zip")) { + return "unzip -p " + downloadedFilePath + " | cat > " + getInstallFullPath(); + } else if (downloadedFilePath.endsWith(".bz2")) { + return "bunzip2 -c " + downloadedFilePath + " > " + getInstallFullPath(); + } else if (downloadedFilePath.endsWith(".gz")) { + return "gunzip -c " + downloadedFilePath + " > " + getInstallFullPath(); + } else { + throw new CloudRuntimeException("Unable to extract template " + templateId + " on " + downloadedFilePath); + } + } + + /** + * Extract downloaded template into installPath, remove compressed file + */ + private void extractDownloadedTemplate() { + String extractCommand = getExtractCommandForDownloadedFile(); + Script.runSimpleBashScript(extractCommand); + Script.runSimpleBashScript("rm -f " + downloadedFilePath); + } + + @Override + public DirectTemplateInformation getTemplateInformation() { + String sizeResult = Script.runSimpleBashScript("ls -als " + getInstallFullPath() + " | awk '{print $1}'"); + long size = Long.parseLong(sizeResult); + return new DirectTemplateInformation(installPath, size, checksum); + } + + @Override + public boolean validateChecksum() { + if (StringUtils.isNotBlank(checksum)) { + int retry = 3; + boolean valid = false; + try { + while (!valid && retry > 0) { + retry--; + s_logger.info("Performing checksum validation for downloaded template " + templateId + " using " + checksum + ", retries left: " + retry); + valid = DigestHelper.check(checksum, new FileInputStream(downloadedFilePath)); + if (!valid && retry > 0) { + s_logger.info("Checksum validation failded, re-downloading template"); + redownload = true; + resetDownloadFile(); + downloadTemplate(); + } + } + s_logger.info("Checksum validation for template " + templateId + ": " + (valid ? "succeeded" : "failed")); + return valid; + } catch (IOException e) { + throw new CloudRuntimeException("could not check sum for file: " + downloadedFilePath, e); + } catch (NoSuchAlgorithmException e) { + throw new CloudRuntimeException("Unknown checksum algorithm: " + checksum, e); + } + } + s_logger.info("No checksum provided, skipping checksum validation"); + return true; + } + + /** + * Delete and create download file + */ + private void resetDownloadFile() { + File f = new File(getDownloadedFilePath()); + s_logger.info("Resetting download file: " + getDownloadedFilePath() + ", in order to re-download and persist template " + templateId + " on it"); + try { + if (f.exists()) { + f.delete(); + } + f.createNewFile(); + } catch (IOException e) { + s_logger.error("Error creating file to download on: " + getDownloadedFilePath() + " due to: " + e.getMessage()); + throw new CloudRuntimeException("Failed to create download file for direct download"); + } + } + +} diff --git a/agent/src/com/cloud/agent/direct/download/HttpDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/HttpDirectTemplateDownloader.java new file mode 100644 index 000000000000..147ccabf8fc8 --- /dev/null +++ b/agent/src/com/cloud/agent/direct/download/HttpDirectTemplateDownloader.java @@ -0,0 +1,104 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.agent.direct.download; + +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.commons.collections.MapUtils; +import org.apache.commons.httpclient.HttpClient; +import org.apache.commons.httpclient.MultiThreadedHttpConnectionManager; +import org.apache.commons.httpclient.HttpStatus; +import org.apache.commons.httpclient.methods.GetMethod; +import org.apache.commons.io.IOUtils; +import org.apache.log4j.Logger; + +import java.io.File; +import java.io.FileOutputStream; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.IOException; +import java.util.HashMap; +import java.util.Map; + +public class HttpDirectTemplateDownloader extends DirectTemplateDownloaderImpl { + + protected HttpClient client; + private static final MultiThreadedHttpConnectionManager s_httpClientManager = new MultiThreadedHttpConnectionManager(); + public static final Logger s_logger = Logger.getLogger(HttpDirectTemplateDownloader.class.getName()); + protected GetMethod request; + protected Map reqHeaders = new HashMap<>(); + + public HttpDirectTemplateDownloader(String url, Long templateId, String destPoolPath, String checksum, Map headers) { + super(url, destPoolPath, templateId, checksum); + s_httpClientManager.getParams().setConnectionTimeout(5000); + s_httpClientManager.getParams().setSoTimeout(5000); + client = new HttpClient(s_httpClientManager); + request = createRequest(url, headers); + String downloadDir = getDirectDownloadTempPath(templateId); + createTemporaryDirectoryAndFile(downloadDir); + } + + protected void createTemporaryDirectoryAndFile(String downloadDir) { + createFolder(getDestPoolPath() + File.separator + downloadDir); + File f = new File(getDestPoolPath() + File.separator + downloadDir + File.separator + getFileNameFromUrl()); + setDownloadedFilePath(f.getAbsolutePath()); + } + + protected GetMethod createRequest(String downloadUrl, Map headers) { + GetMethod request = new GetMethod(downloadUrl); + request.setFollowRedirects(true); + if (MapUtils.isNotEmpty(headers)) { + for (String key : headers.keySet()) { + request.setRequestHeader(key, headers.get(key)); + reqHeaders.put(key, headers.get(key)); + } + } + return request; + } + + @Override + public boolean downloadTemplate() { + try { + int status = client.executeMethod(request); + if (status != HttpStatus.SC_OK) { + s_logger.warn("Not able to download template, status code: " + status); + return false; + } + return performDownload(); + } catch (IOException e) { + throw new CloudRuntimeException("Error on HTTP request: " + e.getMessage()); + } finally { + request.releaseConnection(); + } + } + + protected boolean performDownload() { + s_logger.info("Downloading template " + getTemplateId() + " from " + getUrl() + " to: " + getDownloadedFilePath()); + try ( + InputStream in = request.getResponseBodyAsStream(); + OutputStream out = new FileOutputStream(getDownloadedFilePath()); + ) { + IOUtils.copy(in, out); + } catch (IOException e) { + s_logger.error("Error downloading template " + getTemplateId() + " due to: " + e.getMessage()); + return false; + } + return true; + } +} \ No newline at end of file diff --git a/agent/src/com/cloud/agent/direct/download/HttpsDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/HttpsDirectTemplateDownloader.java new file mode 100644 index 000000000000..38f59837cd83 --- /dev/null +++ b/agent/src/com/cloud/agent/direct/download/HttpsDirectTemplateDownloader.java @@ -0,0 +1,129 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.agent.direct.download; + +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; +import org.apache.commons.io.IOUtils; +import org.apache.http.HttpEntity; +import org.apache.http.client.methods.CloseableHttpResponse; +import org.apache.commons.collections.MapUtils; +import org.apache.http.client.config.RequestConfig; +import org.apache.http.client.methods.HttpGet; +import org.apache.http.client.methods.HttpUriRequest; +import org.apache.http.conn.ssl.SSLConnectionSocketFactory; +import org.apache.http.conn.ssl.TrustSelfSignedStrategy; +import org.apache.http.impl.client.CloseableHttpClient; +import org.apache.http.impl.client.HttpClients; +import org.apache.http.ssl.SSLContexts; + +import javax.net.ssl.SSLContext; +import java.io.File; +import java.io.FileInputStream; +import java.io.IOException; +import java.io.InputStream; +import java.io.OutputStream; +import java.io.FileOutputStream; +import java.security.KeyManagementException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.cert.CertificateException; +import java.util.Map; + +public class HttpsDirectTemplateDownloader extends HttpDirectTemplateDownloader { + + private CloseableHttpClient httpsClient; + private HttpUriRequest req; + + public HttpsDirectTemplateDownloader(String url, Long templateId, String destPoolPath, String checksum, Map headers) { + super(url, templateId, destPoolPath, checksum, headers); + SSLContext sslcontext = null; + try { + sslcontext = getSSLContext(); + } catch (KeyStoreException | NoSuchAlgorithmException | CertificateException | IOException | KeyManagementException e) { + throw new CloudRuntimeException("Failure getting SSL context for HTTPS downloader: " + e.getMessage()); + } + SSLConnectionSocketFactory factory = new SSLConnectionSocketFactory(sslcontext, SSLConnectionSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER); + RequestConfig config = RequestConfig.custom() + .setConnectTimeout(5000) + .setConnectionRequestTimeout(5000) + .setSocketTimeout(5000).build(); + httpsClient = HttpClients.custom().setSSLSocketFactory(factory).setDefaultRequestConfig(config).build(); + createUriRequest(url, headers); + } + + protected void createUriRequest(String downloadUrl, Map headers) { + req = new HttpGet(downloadUrl); + if (MapUtils.isNotEmpty(headers)) { + for (String headerKey: headers.keySet()) { + req.setHeader(headerKey, headers.get(headerKey)); + } + } + } + + private SSLContext getSSLContext() throws KeyStoreException, NoSuchAlgorithmException, CertificateException, IOException, KeyManagementException { + KeyStore trustStore = KeyStore.getInstance("jks"); + FileInputStream instream = new FileInputStream(new File("/etc/cloudstack/agent/cloud.jks")); + try { + String privatePasswordFormat = "sed -n '/keystore.passphrase/p' '%s' 2>/dev/null | sed 's/keystore.passphrase=//g' 2>/dev/null"; + String privatePasswordCmd = String.format(privatePasswordFormat, "/etc/cloudstack/agent/agent.properties"); + String privatePassword = Script.runSimpleBashScript(privatePasswordCmd); + trustStore.load(instream, privatePassword.toCharArray()); + } finally { + instream.close(); + } + return SSLContexts.custom() + .loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()) + .build(); + } + + @Override + public boolean downloadTemplate() { + CloseableHttpResponse response; + try { + response = httpsClient.execute(req); + } catch (IOException e) { + throw new CloudRuntimeException("Error on HTTPS request: " + e.getMessage()); + } + return consumeResponse(response); + } + + /** + * Consume response and persist it on getDownloadedFilePath() file + */ + protected boolean consumeResponse(CloseableHttpResponse response) { + s_logger.info("Downloading template " + getTemplateId() + " from " + getUrl() + " to: " + getDownloadedFilePath()); + if (response.getStatusLine().getStatusCode() != 200) { + throw new CloudRuntimeException("Error on HTTPS response"); + } + try { + HttpEntity entity = response.getEntity(); + InputStream in = entity.getContent(); + OutputStream out = new FileOutputStream(getDownloadedFilePath()); + IOUtils.copy(in, out); + } catch (Exception e) { + s_logger.error("Error parsing response for template " + getTemplateId() + " due to: " + e.getMessage()); + return false; + } + return true; + } + +} diff --git a/agent/src/com/cloud/agent/direct/download/MetalinkDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/MetalinkDirectTemplateDownloader.java new file mode 100644 index 000000000000..2fd8ba036111 --- /dev/null +++ b/agent/src/com/cloud/agent/direct/download/MetalinkDirectTemplateDownloader.java @@ -0,0 +1,98 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.agent.direct.download; + +import com.cloud.utils.UriUtils; +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.commons.collections.CollectionUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; + +import java.io.File; +import java.util.List; +import java.util.Map; +import java.util.Random; + +public class MetalinkDirectTemplateDownloader extends HttpDirectTemplateDownloader { + + private String metalinkUrl; + private List metalinkUrls; + private List metalinkChecksums; + private Random random = new Random(); + private static final Logger s_logger = Logger.getLogger(MetalinkDirectTemplateDownloader.class.getName()); + + public MetalinkDirectTemplateDownloader(String url, String destPoolPath, Long templateId, String checksum, Map headers) { + super(url, templateId, destPoolPath, checksum, headers); + metalinkUrl = url; + metalinkUrls = UriUtils.getMetalinkUrls(metalinkUrl); + metalinkChecksums = UriUtils.getMetalinkChecksums(metalinkUrl); + if (CollectionUtils.isEmpty(metalinkUrls)) { + throw new CloudRuntimeException("No urls found on metalink file: " + metalinkUrl + ". Not possible to download template " + templateId); + } + setUrl(metalinkUrls.get(0)); + s_logger.info("Metalink downloader created, metalink url: " + metalinkUrl + " parsed - " + + metalinkUrls.size() + " urls and " + + (CollectionUtils.isNotEmpty(metalinkChecksums) ? metalinkChecksums.size() : "0") + " checksums found"); + } + + @Override + public boolean downloadTemplate() { + if (StringUtils.isBlank(getUrl())) { + throw new CloudRuntimeException("Download url has not been set, aborting"); + } + String downloadDir = getDirectDownloadTempPath(getTemplateId()); + boolean downloaded = false; + int i = 0; + do { + if (!isRedownload()) { + setUrl(metalinkUrls.get(i)); + } + s_logger.info("Trying to download template from url: " + getUrl()); + try { + File f = new File(getDestPoolPath() + File.separator + downloadDir + File.separator + getFileNameFromUrl()); + if (f.exists()) { + f.delete(); + f.createNewFile(); + } + setDownloadedFilePath(f.getAbsolutePath()); + request = createRequest(getUrl(), reqHeaders); + downloaded = super.downloadTemplate(); + if (downloaded) { + s_logger.info("Successfully downloaded template from url: " + getUrl()); + } + + } catch (Exception e) { + s_logger.error("Error downloading template: " + getTemplateId() + " from " + getUrl() + ": " + e.getMessage()); + } + i++; + } + while (!downloaded && !isRedownload() && i < metalinkUrls.size()); + return downloaded; + } + + @Override + public boolean validateChecksum() { + if (StringUtils.isBlank(getChecksum()) && CollectionUtils.isNotEmpty(metalinkChecksums)) { + String chk = metalinkChecksums.get(random.nextInt(metalinkChecksums.size())); + setChecksum(chk); + s_logger.info("Checksum not provided but " + metalinkChecksums.size() + " found on metalink file, performing checksum using one of them: " + chk); + } + return super.validateChecksum(); + } +} diff --git a/agent/src/com/cloud/agent/direct/download/NfsDirectTemplateDownloader.java b/agent/src/com/cloud/agent/direct/download/NfsDirectTemplateDownloader.java new file mode 100644 index 000000000000..16901afedf1b --- /dev/null +++ b/agent/src/com/cloud/agent/direct/download/NfsDirectTemplateDownloader.java @@ -0,0 +1,70 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.agent.direct.download; + +import com.cloud.utils.UriUtils; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; + +import java.io.File; +import java.net.URI; +import java.net.URISyntaxException; +import java.util.UUID; + +public class NfsDirectTemplateDownloader extends DirectTemplateDownloaderImpl { + + private String srcHost; + private String srcPath; + + private static final String mountCommand = "mount -t nfs %s %s"; + + /** + * Parse url and set srcHost and srcPath + */ + private void parseUrl() { + URI uri = null; + String url = getUrl(); + try { + uri = new URI(UriUtils.encodeURIComponent(url)); + if (uri.getScheme() != null && uri.getScheme().equalsIgnoreCase("nfs")) { + srcHost = uri.getHost(); + srcPath = uri.getPath(); + } + } catch (URISyntaxException e) { + throw new CloudRuntimeException("Invalid NFS url " + url + " caused error: " + e.getMessage()); + } + } + + public NfsDirectTemplateDownloader(String url, String destPool, Long templateId, String checksum) { + super(url, destPool, templateId, checksum); + parseUrl(); + } + + @Override + public boolean downloadTemplate() { + String mountSrcUuid = UUID.randomUUID().toString(); + String mount = String.format(mountCommand, srcHost + ":" + srcPath, "/mnt/" + mountSrcUuid); + Script.runSimpleBashScript(mount); + String downloadDir = getDestPoolPath() + File.separator + getDirectDownloadTempPath(getTemplateId()); + setDownloadedFilePath(downloadDir + File.separator + getFileNameFromUrl()); + Script.runSimpleBashScript("cp /mnt/" + mountSrcUuid + srcPath + " " + getDownloadedFilePath()); + Script.runSimpleBashScript("umount /mnt/" + mountSrcUuid); + return true; + } +} diff --git a/agent/src/com/cloud/agent/resource/DummyResource.java b/agent/src/com/cloud/agent/resource/DummyResource.java index c0167f635983..fe519ca9497f 100644 --- a/agent/src/com/cloud/agent/resource/DummyResource.java +++ b/agent/src/com/cloud/agent/resource/DummyResource.java @@ -22,8 +22,6 @@ import java.util.Map; import java.util.UUID; -import javax.ejb.Local; - import com.cloud.agent.IAgentControl; import com.cloud.agent.api.Answer; import com.cloud.agent.api.CheckNetworkAnswer; @@ -43,7 +41,6 @@ import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.StringUtils; -@Local(value = {ServerResource.class}) public class DummyResource implements ServerResource { String _name; Host.Type _type; diff --git a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java index 08f098239865..b3b17e7d970b 100644 --- a/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java +++ b/agent/src/com/cloud/agent/resource/consoleproxy/ConsoleProxyResource.java @@ -32,11 +32,8 @@ import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; - -import com.google.gson.Gson; - import org.apache.cloudstack.managed.context.ManagedContextRunnable; +import org.apache.log4j.Logger; import com.cloud.agent.Agent.ExitStatus; import com.cloud.agent.api.AgentControlAnswer; @@ -62,8 +59,10 @@ import com.cloud.resource.ServerResource; import com.cloud.resource.ServerResourceBase; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.ReflectUtil; import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.Script; +import com.google.gson.Gson; /** * @@ -240,9 +239,11 @@ public boolean configure(String name, Map params) throws Configu _proxyVmId = NumbersUtil.parseLong(value, 0); if (_localgw != null) { - String mgmtHost = (String)params.get("host"); + String mgmtHosts = (String)params.get("host"); if (_eth1ip != null) { - addRouteToInternalIpOrCidr(_localgw, _eth1ip, _eth1mask, mgmtHost); + for (final String mgmtHost : mgmtHosts.split(",")) { + addRouteToInternalIpOrCidr(_localgw, _eth1ip, _eth1mask, mgmtHost); + } String internalDns1 = (String) params.get("internaldns1"); if (internalDns1 == null) { s_logger.warn("No DNS entry found during configuration of NfsSecondaryStorage"); @@ -275,12 +276,12 @@ private void addRouteToInternalIpOrCidr(String localgw, String eth1ip, String et s_logger.debug("addRouteToInternalIp: destIp is null"); return; } - if (!NetUtils.isValidIp(destIpOrCidr) && !NetUtils.isValidCIDR(destIpOrCidr)) { + if (!NetUtils.isValidIp4(destIpOrCidr) && !NetUtils.isValidIp4Cidr(destIpOrCidr)) { s_logger.warn(" destIp is not a valid ip address or cidr destIp=" + destIpOrCidr); return; } boolean inSameSubnet = false; - if (NetUtils.isValidIp(destIpOrCidr)) { + if (NetUtils.isValidIp4(destIpOrCidr)) { if (eth1ip != null && eth1mask != null) { inSameSubnet = NetUtils.sameSubnet(eth1ip, destIpOrCidr, eth1mask); } else { @@ -315,20 +316,19 @@ public String getName() { private void launchConsoleProxy(final byte[] ksBits, final String ksPassword, final String encryptorPassword) { final Object resource = this; + s_logger.info("Building class loader for com.cloud.consoleproxy.ConsoleProxy"); + final ClassLoader loader = ReflectUtil.getClassLoaderForName("console-proxy"); if (_consoleProxyMain == null) { + s_logger.info("Running com.cloud.consoleproxy.ConsoleProxy with encryptor password=" + encryptorPassword); _consoleProxyMain = new Thread(new ManagedContextRunnable() { @Override protected void runInContext() { try { - Class consoleProxyClazz = Class.forName("com.cloud.consoleproxy.ConsoleProxy"); + Class consoleProxyClazz = loader.loadClass("com.cloud.consoleproxy.ConsoleProxy"); try { - s_logger.info("Invoke setEncryptorPassword(), ecnryptorPassword: " + encryptorPassword); - Method methodSetup = consoleProxyClazz.getMethod("setEncryptorPassword", String.class); - methodSetup.invoke(null, encryptorPassword); - s_logger.info("Invoke startWithContext()"); - Method method = consoleProxyClazz.getMethod("startWithContext", Properties.class, Object.class, byte[].class, String.class); - method.invoke(null, _properties, resource, ksBits, ksPassword); + Method method = consoleProxyClazz.getMethod("startWithContext", Properties.class, Object.class, byte[].class, String.class, String.class); + method.invoke(null, _properties, resource, ksBits, ksPassword, encryptorPassword); } catch (SecurityException e) { s_logger.error("Unable to launch console proxy due to SecurityException", e); System.exit(ExitStatus.Error.value()); @@ -357,7 +357,7 @@ protected void runInContext() { s_logger.info("com.cloud.consoleproxy.ConsoleProxy is already running"); try { - Class consoleProxyClazz = Class.forName("com.cloud.consoleproxy.ConsoleProxy"); + Class consoleProxyClazz = loader.loadClass("com.cloud.consoleproxy.ConsoleProxy"); Method methodSetup = consoleProxyClazz.getMethod("setEncryptorPassword", String.class); methodSetup.invoke(null, encryptorPassword); } catch (SecurityException e) { diff --git a/agent/test/com/cloud/agent/AgentShellTest.java b/agent/test/com/cloud/agent/AgentShellTest.java index 5baa7bf800e9..868293c8977b 100644 --- a/agent/test/com/cloud/agent/AgentShellTest.java +++ b/agent/test/com/cloud/agent/AgentShellTest.java @@ -16,6 +16,8 @@ // under the License. package com.cloud.agent; +import java.util.Arrays; +import java.util.List; import java.util.UUID; import javax.naming.ConfigurationException; @@ -23,6 +25,8 @@ import org.junit.Assert; import org.junit.Test; +import com.cloud.utils.StringUtils; + public class AgentShellTest { @Test public void parseCommand() throws ConfigurationException { @@ -31,7 +35,7 @@ public void parseCommand() throws ConfigurationException { shell.parseCommand(new String[] {"port=55555", "threads=4", "host=localhost", "pod=pod1", "guid=" + anyUuid, "zone=zone1"}); Assert.assertEquals(55555, shell.getPort()); Assert.assertEquals(4, shell.getWorkers()); - Assert.assertEquals("localhost", shell.getHost()); + Assert.assertEquals("localhost", shell.getNextHost()); Assert.assertEquals(anyUuid.toString(), shell.getGuid()); Assert.assertEquals("pod1", shell.getPod()); Assert.assertEquals("zone1", shell.getZone()); @@ -44,4 +48,15 @@ public void loadProperties() throws ConfigurationException { Assert.assertNotNull(shell.getProperties()); Assert.assertFalse(shell.getProperties().entrySet().isEmpty()); } + + @Test + public void testGetHost() { + AgentShell shell = new AgentShell(); + List hosts = Arrays.asList("10.1.1.1", "20.2.2.2", "30.3.3.3", "2001:db8::1"); + shell.setHosts(StringUtils.listToCsvTags(hosts)); + for (String host : hosts) { + Assert.assertEquals(host, shell.getNextHost()); + } + Assert.assertEquals(shell.getNextHost(), hosts.get(0)); + } } diff --git a/agent/test/com/cloud/agent/direct/download/DirectTemplateDownloaderImplTest.java b/agent/test/com/cloud/agent/direct/download/DirectTemplateDownloaderImplTest.java new file mode 100644 index 000000000000..b244d02f4993 --- /dev/null +++ b/agent/test/com/cloud/agent/direct/download/DirectTemplateDownloaderImplTest.java @@ -0,0 +1,36 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.agent.direct.download; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class DirectTemplateDownloaderImplTest { + + private static final Long templateId = 202l; + + @Test + public void testGetDirectDownloadTempPath() { + String path = DirectTemplateDownloaderImpl.getDirectDownloadTempPath(templateId); + Assert.assertEquals("template/2/202", path); + } +} diff --git a/api/pom.xml b/api/pom.xml index d9be0a1877e5..b0a8c160f50c 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT @@ -51,6 +51,21 @@ cloud-framework-config ${project.version} + + org.apache.cloudstack + cloud-framework-ca + ${project.version} + + + org.apache.commons + commons-lang3 + ${cs.commons-lang3.version} + + + org.apache.cloudstack + cloud-framework-direct-download + ${project.version} + diff --git a/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml b/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml index 2cd126630728..5ea32464ee9b 100644 --- a/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml +++ b/api/resources/META-INF/cloudstack/api-config/spring-api-config-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml b/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml index 2fd34a8ee0a5..8523daf1d216 100644 --- a/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml +++ b/api/resources/META-INF/cloudstack/api-planner/spring-api-planner-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/src/com/cloud/agent/api/GetFileStatsCommand.java b/api/src/com/cloud/agent/api/BadCommand.java similarity index 71% rename from core/src/com/cloud/agent/api/GetFileStatsCommand.java rename to api/src/com/cloud/agent/api/BadCommand.java index b2da1c316475..55976f64185a 100644 --- a/core/src/com/cloud/agent/api/GetFileStatsCommand.java +++ b/api/src/com/cloud/agent/api/BadCommand.java @@ -1,4 +1,3 @@ -// // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information @@ -15,30 +14,17 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -// - package com.cloud.agent.api; -import com.cloud.agent.api.LogLevel.Log4jLevel; -import com.cloud.storage.Volume; - -@LogLevel(Log4jLevel.Trace) -public class GetFileStatsCommand extends Command { - protected GetFileStatsCommand() { - } - - String paths; - - public GetFileStatsCommand(Volume volume) { - paths = volume.getPath(); - } - - public String getPaths() { - return paths; - } +public class BadCommand extends Command { @Override public boolean executeInSequence() { + // TODO Auto-generated method stub return false; } + + public BadCommand(){ + super(); + } } diff --git a/api/src/com/cloud/agent/api/storage/OVFHelper.java b/api/src/com/cloud/agent/api/storage/OVFHelper.java new file mode 100644 index 000000000000..85d4030b215b --- /dev/null +++ b/api/src/com/cloud/agent/api/storage/OVFHelper.java @@ -0,0 +1,336 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.agent.api.storage; + +import java.io.File; +import java.io.IOException; +import java.io.PrintWriter; +import java.io.StringWriter; +import java.util.ArrayList; +import java.util.List; + +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import com.cloud.configuration.Resource.ResourceType; +import com.cloud.exception.InternalErrorException; +import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.NumberUtils; +import org.apache.log4j.Logger; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; + +import com.cloud.agent.api.to.DatadiskTO; +import com.cloud.utils.exception.CloudRuntimeException; + +public class OVFHelper { + private static final Logger s_logger = Logger.getLogger(OVFHelper.class); + + /** + * Get disk virtual size given its values on fields: 'ovf:capacity' and 'ovf:capacityAllocationUnits' + * @param capacity capacity + * @param allocationUnits capacity allocation units + * @return disk virtual size + */ + public static Long getDiskVirtualSize(Long capacity, String allocationUnits, String ovfFilePath) throws InternalErrorException { + if ((capacity != 0) && (allocationUnits != null)) { + long units = 1; + if (allocationUnits.equalsIgnoreCase("KB") || allocationUnits.equalsIgnoreCase("KiloBytes") || allocationUnits.equalsIgnoreCase("byte * 2^10")) { + units = ResourceType.bytesToKiB; + } else if (allocationUnits.equalsIgnoreCase("MB") || allocationUnits.equalsIgnoreCase("MegaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^20")) { + units = ResourceType.bytesToMiB; + } else if (allocationUnits.equalsIgnoreCase("GB") || allocationUnits.equalsIgnoreCase("GigaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^30")) { + units = ResourceType.bytesToGiB; + } + return capacity * units; + } else { + throw new InternalErrorException("Failed to read capacity and capacityAllocationUnits from the OVF file: " + ovfFilePath); + } + } + + public List getOVFVolumeInfo(final String ovfFilePath) { + if (StringUtils.isBlank(ovfFilePath)) { + return new ArrayList(); + } + ArrayList vf = new ArrayList(); + ArrayList vd = new ArrayList(); + + File ovfFile = new File(ovfFilePath); + try { + final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(ovfFilePath)); + NodeList disks = doc.getElementsByTagName("Disk"); + NodeList files = doc.getElementsByTagName("File"); + NodeList items = doc.getElementsByTagName("Item"); + boolean toggle = true; + for (int j = 0; j < files.getLength(); j++) { + Element file = (Element)files.item(j); + OVFFile of = new OVFFile(); + of._href = file.getAttribute("ovf:href"); + if (of._href.endsWith("vmdk") || of._href.endsWith("iso")) { + of._id = file.getAttribute("ovf:id"); + String size = file.getAttribute("ovf:size"); + if (StringUtils.isNotBlank(size)) { + of._size = Long.parseLong(size); + } else { + String dataDiskPath = ovfFile.getParent() + File.separator + of._href; + File this_file = new File(dataDiskPath); + of._size = this_file.length(); + } + of.isIso = of._href.endsWith("iso"); + if (toggle && !of.isIso) { + of._bootable = true; + toggle = !toggle; + } + vf.add(of); + } + } + for (int i = 0; i < disks.getLength(); i++) { + Element disk = (Element)disks.item(i); + OVFDisk od = new OVFDisk(); + String virtualSize = disk.getAttribute("ovf:capacity"); + od._capacity = NumberUtils.toLong(virtualSize, 0L); + String allocationUnits = disk.getAttribute("ovf:capacityAllocationUnits"); + od._diskId = disk.getAttribute("ovf:diskId"); + od._fileRef = disk.getAttribute("ovf:fileRef"); + od._populatedSize = NumberUtils.toLong(disk.getAttribute("ovf:populatedSize")); + + if ((od._capacity != 0) && (allocationUnits != null)) { + + long units = 1; + if (allocationUnits.equalsIgnoreCase("KB") || allocationUnits.equalsIgnoreCase("KiloBytes") || allocationUnits.equalsIgnoreCase("byte * 2^10")) { + units = ResourceType.bytesToKiB; + } else if (allocationUnits.equalsIgnoreCase("MB") || allocationUnits.equalsIgnoreCase("MegaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^20")) { + units = ResourceType.bytesToMiB; + } else if (allocationUnits.equalsIgnoreCase("GB") || allocationUnits.equalsIgnoreCase("GigaBytes") || allocationUnits.equalsIgnoreCase("byte * 2^30")) { + units = ResourceType.bytesToGiB; + } + od._capacity = od._capacity * units; + } + od._controller = getControllerType(items, od._diskId); + vd.add(od); + } + + } catch (SAXException | IOException | ParserConfigurationException e) { + s_logger.error("Unexpected exception caught while parsing ovf file:" + ovfFilePath, e); + throw new CloudRuntimeException(e); + } + + List disksTO = new ArrayList(); + for (OVFFile of : vf) { + if (StringUtils.isBlank(of._id)){ + s_logger.error("The ovf file info is incomplete file info"); + throw new CloudRuntimeException("The ovf file info has incomplete file info"); + } + OVFDisk cdisk = getDisk(of._id, vd); + if (cdisk == null && !of.isIso){ + s_logger.error("The ovf file info has incomplete disk info"); + throw new CloudRuntimeException("The ovf file info has incomplete disk info"); + } + Long capacity = cdisk == null ? of._size : cdisk._capacity; + String controller = cdisk == null ? "" : cdisk._controller._name; + String controllerSubType = cdisk == null ? "" : cdisk._controller._subType; + String dataDiskPath = ovfFile.getParent() + File.separator + of._href; + File f = new File(dataDiskPath); + if (!f.exists() || f.isDirectory()) { + s_logger.error("One of the attached disk or iso does not exists " + dataDiskPath); + throw new CloudRuntimeException("One of the attached disk or iso as stated on OVF does not exists " + dataDiskPath); + } + disksTO.add(new DatadiskTO(dataDiskPath, capacity, of._size, of._id, of.isIso, of._bootable, controller, controllerSubType)); + } + //check if first disk is an iso move it to the end + DatadiskTO fd = disksTO.get(0); + if (fd.isIso()) { + disksTO.remove(0); + disksTO.add(fd); + } + return disksTO; + } + + private OVFDiskController getControllerType(final NodeList itemList, final String diskId) { + for (int k = 0; k < itemList.getLength(); k++) { + Element item = (Element)itemList.item(k); + NodeList cn = item.getChildNodes(); + for (int l = 0; l < cn.getLength(); l++) { + if (cn.item(l) instanceof Element) { + Element el = (Element)cn.item(l); + if ("rasd:HostResource".equals(el.getNodeName()) + && (el.getTextContent().contains("ovf:/file/" + diskId) || el.getTextContent().contains("ovf:/disk/" + diskId))) { + Element oe = getParentNode(itemList, item); + Element voe = oe; + while (oe != null) { + voe = oe; + oe = getParentNode(itemList, voe); + } + return getController(voe); + } + } + } + } + return null; + } + + private Element getParentNode(final NodeList itemList, final Element childItem) { + NodeList cn = childItem.getChildNodes(); + String parent_id = null; + for (int l = 0; l < cn.getLength(); l++) { + if (cn.item(l) instanceof Element) { + Element el = (Element)cn.item(l); + if ("rasd:Parent".equals(el.getNodeName())) { + parent_id = el.getTextContent(); + } + } + } + if (parent_id != null) { + for (int k = 0; k < itemList.getLength(); k++) { + Element item = (Element)itemList.item(k); + NodeList child = item.getChildNodes(); + for (int l = 0; l < child.getLength(); l++) { + if (child.item(l) instanceof Element) { + Element el = (Element)child.item(l); + if ("rasd:InstanceID".equals(el.getNodeName()) && el.getTextContent().trim().equals(parent_id)) { + return item; + } + } + } + } + } + return null; + } + + private OVFDiskController getController(Element controllerItem) { + OVFDiskController dc = new OVFDiskController(); + NodeList child = controllerItem.getChildNodes(); + for (int l = 0; l < child.getLength(); l++) { + if (child.item(l) instanceof Element) { + Element el = (Element)child.item(l); + if ("rasd:ElementName".equals(el.getNodeName())) { + dc._name = el.getTextContent(); + } + if ("rasd:ResourceSubType".equals(el.getNodeName())) { + dc._subType = el.getTextContent(); + } + } + } + return dc; + } + + public void rewriteOVFFile(final String origOvfFilePath, final String newOvfFilePath, final String diskName) { + try { + final Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().parse(new File(origOvfFilePath)); + NodeList disks = doc.getElementsByTagName("Disk"); + NodeList files = doc.getElementsByTagName("File"); + NodeList items = doc.getElementsByTagName("Item"); + String keepfile = null; + List toremove = new ArrayList(); + for (int j = 0; j < files.getLength(); j++) { + Element file = (Element)files.item(j); + String href = file.getAttribute("ovf:href"); + if (diskName.equals(href)) { + keepfile = file.getAttribute("ovf:id"); + } else { + toremove.add(file); + } + } + String keepdisk = null; + for (int i = 0; i < disks.getLength(); i++) { + Element disk = (Element)disks.item(i); + String fileRef = disk.getAttribute("ovf:fileRef"); + if (keepfile == null) { + s_logger.info("FATAL: OVA format error"); + } else if (keepfile.equals(fileRef)) { + keepdisk = disk.getAttribute("ovf:diskId"); + } else { + toremove.add(disk); + } + } + for (int k = 0; k < items.getLength(); k++) { + Element item = (Element)items.item(k); + NodeList cn = item.getChildNodes(); + for (int l = 0; l < cn.getLength(); l++) { + if (cn.item(l) instanceof Element) { + Element el = (Element)cn.item(l); + if ("rasd:HostResource".equals(el.getNodeName()) + && !(el.getTextContent().contains("ovf:/file/" + keepdisk) || el.getTextContent().contains("ovf:/disk/" + keepdisk))) { + toremove.add(item); + break; + } + } + } + } + + for (Element rme : toremove) { + if (rme.getParentNode() != null) { + rme.getParentNode().removeChild(rme); + } + } + + final StringWriter writer = new StringWriter(); + final StreamResult result = new StreamResult(writer); + final TransformerFactory tf = TransformerFactory.newInstance(); + final Transformer transformer = tf.newTransformer(); + final DOMSource domSource = new DOMSource(doc); + transformer.transform(domSource, result); + PrintWriter outfile = new PrintWriter(newOvfFilePath); + outfile.write(writer.toString()); + outfile.close(); + } catch (SAXException | IOException | ParserConfigurationException | TransformerException e) { + s_logger.info("Unexpected exception caught while removing network elements from OVF:" + e.getMessage(), e); + throw new CloudRuntimeException(e); + } + } + + OVFDisk getDisk(String fileRef, List disks) { + for (OVFDisk disk : disks) { + if (disk._fileRef.equals(fileRef)) { + return disk; + } + } + return null; + } + + class OVFFile { + // + public String _href; + public String _id; + public Long _size; + public boolean _bootable; + public boolean isIso; + } + + class OVFDisk { + // + public Long _capacity; + public String _capacityUnit; + public String _diskId; + public String _fileRef; + public Long _populatedSize; + public OVFDiskController _controller; + } + + class OVFDiskController { + public String _name; + public String _subType; + } +} diff --git a/api/src/com/cloud/agent/api/to/DatadiskTO.java b/api/src/com/cloud/agent/api/to/DatadiskTO.java new file mode 100644 index 000000000000..1d3f91e25dbe --- /dev/null +++ b/api/src/com/cloud/agent/api/to/DatadiskTO.java @@ -0,0 +1,108 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package com.cloud.agent.api.to; + +public class DatadiskTO { + private String path; + private long virtualSize; + private long fileSize; + boolean bootable; + private String diskId; + private boolean isIso; + private String diskController; + private String diskControllerSubType; + + public DatadiskTO() { + } + + public DatadiskTO(String path, long virtualSize, long fileSize, boolean bootable) { + this.path = path; + this.virtualSize = virtualSize; + this.fileSize = fileSize; + this.bootable = bootable; + } + + public DatadiskTO(String path, long virtualSize, long fileSize, String diskId, boolean isIso, boolean bootable, String controller, String controllerSubType) { + this.path = path; + this.virtualSize = virtualSize; + this.fileSize = fileSize; + this.bootable = bootable; + this.diskId = diskId; + this.isIso = isIso; + this.diskController = controller; + this.diskControllerSubType = controllerSubType; + } + + public String getPath() { + return path; + } + + public void setPath(String path) { + this.path = path; + } + + public Long getVirtualSize() { + return virtualSize; + } + + public void setVirtualSize(Long virtualSize) { + this.virtualSize = virtualSize; + } + + public Long getFileSize() { + return fileSize; + } + + public boolean isBootable() { + return bootable; + } + + public String getDiskId() { + return diskId; + } + + public void setDiskId(String diskId) { + this.diskId = diskId; + } + + public boolean isIso() { + return isIso; + } + + public void setIso(boolean isIso) { + this.isIso = isIso; + } + + public String getDiskController() { + return diskController; + } + + public void setDiskController(String diskController) { + this.diskController = diskController; + } + + public String getDiskControllerSubType() { + return diskControllerSubType; + } + + public void setDiskControllerSubType(String diskControllerSubType) { + this.diskControllerSubType = diskControllerSubType; + } + +} \ No newline at end of file diff --git a/api/src/com/cloud/agent/api/to/DiskTO.java b/api/src/com/cloud/agent/api/to/DiskTO.java index f982844486a9..7b3d10bc4dbe 100644 --- a/api/src/com/cloud/agent/api/to/DiskTO.java +++ b/api/src/com/cloud/agent/api/to/DiskTO.java @@ -27,6 +27,7 @@ public class DiskTO { public static final String CHAP_INITIATOR_SECRET = "chapInitiatorSecret"; public static final String CHAP_TARGET_USERNAME = "chapTargetUsername"; public static final String CHAP_TARGET_SECRET = "chapTargetSecret"; + public static final String SCSI_NAA_DEVICE_ID = "scsiNaaDeviceId"; public static final String MANAGED = "managed"; public static final String IQN = "iqn"; public static final String STORAGE_HOST = "storageHost"; @@ -36,6 +37,9 @@ public class DiskTO { public static final String PROTOCOL_TYPE = "protocoltype"; public static final String PATH = "path"; public static final String UUID = "uuid"; + public static final String VMDK = "vmdk"; + public static final String EXPAND_DATASTORE = "expandDatastore"; + public static final String TEMPLATE_RESIGN = "templateResign"; private DataTO data; private Long diskSeq; diff --git a/api/src/com/cloud/agent/api/to/FirewallRuleTO.java b/api/src/com/cloud/agent/api/to/FirewallRuleTO.java index edfb0aa7c17d..25e7b5f60b3a 100644 --- a/api/src/com/cloud/agent/api/to/FirewallRuleTO.java +++ b/api/src/com/cloud/agent/api/to/FirewallRuleTO.java @@ -48,6 +48,7 @@ public class FirewallRuleTO implements InternalIdentity { boolean revoked; boolean alreadyAdded; private List sourceCidrList; + private List destCidrList; FirewallRule.Purpose purpose; private Integer icmpType; private Integer icmpCode; @@ -170,6 +171,7 @@ public FirewallRuleTO(FirewallRule rule, String srcVlanTag, String srcIp, Firewa rule.getSourceCidrList(), rule.getIcmpType(), rule.getIcmpCode()); + this.destCidrList = rule.getDestinationCidrList(); this.trafficType = trafficType; this.defaultEgressPolicy = defaultEgressPolicy; } @@ -257,6 +259,10 @@ public List getSourceCidrList() { return sourceCidrList; } + public List getDestCidrList(){ + return destCidrList; + } + public boolean isAlreadyAdded() { return alreadyAdded; } diff --git a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java index 4d5a2c05db0c..3a3dfa475021 100644 --- a/api/src/com/cloud/agent/api/to/LoadBalancerTO.java +++ b/api/src/com/cloud/agent/api/to/LoadBalancerTO.java @@ -45,6 +45,10 @@ public class LoadBalancerTO { boolean revoked; boolean alreadyAdded; boolean inline; + String srcIpVlan; + String srcIpGateway; + String srcIpNetmask; + Long networkId; DestinationTO[] destinations; private StickinessPolicyTO[] stickinessPolicies; private HealthCheckPolicyTO[] healthCheckPolicies; @@ -82,6 +86,15 @@ public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, Str this(id, srcIp, srcPort, protocol, algorithm, revoked, alreadyAdded, inline, argDestinations, stickinessPolicies, null, null, null); } + public LoadBalancerTO(String id, List destinations) { + this.uuid = id; + int i = 0; + this.destinations = new DestinationTO[destinations.size()]; + for (DestinationTO destination : destinations) { + this.destinations[i++] = new DestinationTO(destination.getDestIp(), destination.getDestPort(), destination.getMonitorState()); + } + } + public LoadBalancerTO(String id, String srcIp, int srcPort, String protocol, String algorithm, boolean revoked, boolean alreadyAdded, boolean inline, List argDestinations, List stickinessPolicies, List healthCheckPolicies, LbSslCert sslCert, String lbProtocol) { @@ -194,21 +207,53 @@ public LbSslCert getSslCert() { return this.sslCert; } + public String getSrcIpVlan() { + return srcIpVlan; + } + + public void setSrcIpVlan(String srcIpVlan) { + this.srcIpVlan = srcIpVlan; + } + + public Long getNetworkId() { + return networkId; + } + + public void setNetworkId(long id) { + this.networkId = id; + } + + public String getSrcIpGateway() { + return srcIpGateway; + } + + public void setSrcIpGateway(String srcIpGateway) { + this.srcIpGateway = srcIpGateway; + } + + public String getSrcIpNetmask() { + return srcIpNetmask; + } + + public void setSrcIpNetmask(String srcIpNetmask) { + this.srcIpNetmask = srcIpNetmask; + } + public static class StickinessPolicyTO { - private String _methodName; - private List> _paramsList; + private String methodName; + private List> params; public String getMethodName() { - return _methodName; + return methodName; } public List> getParams() { - return _paramsList; + return params; } public StickinessPolicyTO(String methodName, List> paramsList) { - this._methodName = methodName; - this._paramsList = paramsList; + this.methodName = methodName; + this.params = paramsList; } } @@ -219,7 +264,7 @@ public static class HealthCheckPolicyTO { private int healthcheckInterval; private int healthcheckThresshold; private int unhealthThresshold; - private boolean revoke = false; + private boolean revoked = false; public HealthCheckPolicyTO(String pingPath, String description, int responseTime, int healthcheckInterval, int healthcheckThresshold, int unhealthThresshold, boolean revoke) { @@ -230,7 +275,7 @@ public HealthCheckPolicyTO(String pingPath, String description, int responseTime this.healthcheckInterval = healthcheckInterval; this.healthcheckThresshold = healthcheckThresshold; this.unhealthThresshold = unhealthThresshold; - this.revoke = revoke; + this.revoked = revoke; } public HealthCheckPolicyTO() { @@ -262,11 +307,11 @@ public int getUnhealthThresshold() { } public void setRevoke(boolean revoke) { - this.revoke = revoke; + this.revoked = revoke; } public boolean isRevoked() { - return revoke; + return revoked; } } @@ -285,6 +330,12 @@ public DestinationTO(String destIp, int destPort, boolean revoked, boolean alrea this.alreadyAdded = alreadyAdded; } + public DestinationTO(String destIp, int destPort, String monitorState) { + this.destIp = destIp; + this.destPort = destPort; + this.monitorState = monitorState; + } + protected DestinationTO() { } diff --git a/api/src/com/cloud/agent/api/to/NetworkTO.java b/api/src/com/cloud/agent/api/to/NetworkTO.java index be11deaa1ec8..9c888059d93c 100644 --- a/api/src/com/cloud/agent/api/to/NetworkTO.java +++ b/api/src/com/cloud/agent/api/to/NetworkTO.java @@ -38,6 +38,8 @@ public class NetworkTO { protected URI isolationUri; protected boolean isSecurityGroupEnabled; protected String name; + protected String ip6address; + protected String ip6cidr; public NetworkTO() { } @@ -62,6 +64,14 @@ public void setIp(String ip) { this.ip = ip; } + public void setIp6Address(String addr) { + this.ip6address = addr; + } + + public void setIp6Cidr(String cidr) { + this.ip6cidr = cidr; + } + public void setNetmask(String netmask) { this.netmask = netmask; } @@ -114,6 +124,7 @@ public NetworkTO(String ip, String netmask, String mac) { * the full information about what is needed. * * @param ip + * @param ip6address * @param vlan * @param netmask * @param mac @@ -130,10 +141,30 @@ public NetworkTO(String ip, String netmask, String mac, String gateway, String d this.dns2 = dns2; } + public NetworkTO(String ip, String netmask, String mac, String gateway, String dns1, String dns2, String ip6address, + String ip6cidr) { + this.ip = ip; + this.netmask = netmask; + this.mac = mac; + this.gateway = gateway; + this.dns1 = dns1; + this.dns2 = dns2; + this.ip6address = ip6address; + this.ip6cidr = ip6cidr; + } + public String getIp() { return ip; } + public String getIp6Address() { + return ip6address; + } + + public String getIp6Cidr() { + return ip6cidr; + } + public String getNetmask() { return netmask; } diff --git a/api/src/com/cloud/agent/api/to/NicTO.java b/api/src/com/cloud/agent/api/to/NicTO.java index bd681f282cd5..3863e1bafe72 100644 --- a/api/src/com/cloud/agent/api/to/NicTO.java +++ b/api/src/com/cloud/agent/api/to/NicTO.java @@ -16,7 +16,10 @@ // under the License. package com.cloud.agent.api.to; +import com.cloud.offering.NetworkOffering; + import java.util.List; +import java.util.Map; public class NicTO extends NetworkTO { int deviceId; @@ -26,6 +29,7 @@ public class NicTO extends NetworkTO { boolean pxeDisable; String nicUuid; List nicSecIps; + Map details; public NicTO() { super(); @@ -97,4 +101,12 @@ public String getNetworkUuid() { public void setNetworkUuid(String uuid) { super.setUuid(uuid); } + + public Map getDetails() { + return details; + } + + public void setDetails(final Map details) { + this.details = details; + } } diff --git a/api/src/com/cloud/agent/api/to/SwiftTO.java b/api/src/com/cloud/agent/api/to/SwiftTO.java index c7a986603021..b89dfea40e0c 100644 --- a/api/src/com/cloud/agent/api/to/SwiftTO.java +++ b/api/src/com/cloud/agent/api/to/SwiftTO.java @@ -26,17 +26,19 @@ public class SwiftTO implements DataStoreTO, SwiftUtil.SwiftClientCfg { String userName; String key; + String storagePolicy; private static final String pathSeparator = "/"; public SwiftTO() { } - public SwiftTO(Long id, String url, String account, String userName, String key) { + public SwiftTO(Long id, String url, String account, String userName, String key, String storagePolicy) { this.id = id; this.url = url; this.account = account; this.userName = userName; this.key = key; + this.storagePolicy = storagePolicy; } public Long getId() { @@ -63,6 +65,11 @@ public String getKey() { return key; } + @Override + public String getStoragePolicy() { + return this.storagePolicy; + } + @Override public DataStoreRole getRole() { return DataStoreRole.Image; diff --git a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java index c367ec9e07d8..84a6bf5fc16e 100644 --- a/api/src/com/cloud/agent/api/to/VirtualMachineTO.java +++ b/api/src/com/cloud/agent/api/to/VirtualMachineTO.java @@ -18,6 +18,7 @@ import java.util.List; import java.util.Map; +import java.util.HashMap; import com.cloud.template.VirtualMachineTemplate.BootloaderType; import com.cloud.vm.VirtualMachine; @@ -69,6 +70,9 @@ public class VirtualMachineTO { String configDriveIsoRootFolder = null; String configDriveIsoFile = null; + Double cpuQuotaPercentage = null; + + Map guestOsDetails = new HashMap(); public VirtualMachineTO(long id, String instanceName, VirtualMachine.Type type, int cpus, Integer speed, long minRam, long maxRam, BootloaderType bootloader, String os, boolean enableHA, boolean limitCpuUse, String vncPassword) { @@ -331,4 +335,19 @@ public void setConfigDriveIsoFile(String configDriveIsoFile) { this.configDriveIsoFile = configDriveIsoFile; } + public Map getGuestOsDetails() { + return guestOsDetails; + } + + public void setGuestOsDetails(Map guestOsDetails) { + this.guestOsDetails = guestOsDetails; + } + + public Double getCpuQuotaPercentage() { + return cpuQuotaPercentage; + } + + public void setCpuQuotaPercentage(Double cpuQuotaPercentage) { + this.cpuQuotaPercentage = cpuQuotaPercentage; + } } diff --git a/api/src/com/cloud/capacity/Capacity.java b/api/src/com/cloud/capacity/Capacity.java index 2fbc1d6eef1d..ba04a82a5dea 100644 --- a/api/src/com/cloud/capacity/Capacity.java +++ b/api/src/com/cloud/capacity/Capacity.java @@ -32,6 +32,8 @@ public interface Capacity extends InternalIdentity, Identity { public static final short CAPACITY_TYPE_LOCAL_STORAGE = 9; public static final short CAPACITY_TYPE_GPU = 19; + public static final short CAPACITY_TYPE_CPU_CORE = 90; + public Long getHostOrPoolId(); public Long getDataCenterId(); @@ -49,4 +51,6 @@ public interface Capacity extends InternalIdentity, Identity { public long getReservedCapacity(); public Float getUsedPercentage(); + + public Long getAllocatedCapacity(); } diff --git a/api/src/com/cloud/configuration/ConfigurationService.java b/api/src/com/cloud/configuration/ConfigurationService.java index b13122208ee9..5af44ed18f44 100644 --- a/api/src/com/cloud/configuration/ConfigurationService.java +++ b/api/src/com/cloud/configuration/ConfigurationService.java @@ -19,7 +19,9 @@ import java.util.List; import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd; +import org.apache.cloudstack.api.command.admin.network.CreateManagementNetworkIpRangeCmd; import org.apache.cloudstack.api.command.admin.network.CreateNetworkOfferingCmd; +import org.apache.cloudstack.api.command.admin.network.DeleteManagementNetworkIpRangeCmd; import org.apache.cloudstack.api.command.admin.network.DeleteNetworkOfferingCmd; import org.apache.cloudstack.api.command.admin.network.UpdateNetworkOfferingCmd; import org.apache.cloudstack.api.command.admin.offering.CreateDiskOfferingCmd; @@ -160,6 +162,19 @@ public interface ConfigurationService { */ Pod createPod(long zoneId, String name, String startIp, String endIp, String gateway, String netmask, String allocationState); + /** + * Creates a mutual exclusive IP range in the pod with same gateway, netmask. + * @param cmd - The command specifying pod ID, start IP, end IP, gateway, netmask. + * @return The new range if successful, null otherwise. + */ + Pod createPodIpRange(CreateManagementNetworkIpRangeCmd cmd); + + /** + * Deletes a mutually exclusive IP range in the pod. + * @param cmd - The command specifying pod ID, start IP, end IP. + */ + void deletePodIpRange(DeleteManagementNetworkIpRangeCmd cmd) throws ResourceUnavailableException, ConcurrentOperationException; + /** * Edits a pod in the database. Will not allow you to edit pods that are being used anywhere in the system. * diff --git a/api/src/com/cloud/configuration/Resource.java b/api/src/com/cloud/configuration/Resource.java index 5550e29eca49..76f2930e6150 100644 --- a/api/src/com/cloud/configuration/Resource.java +++ b/api/src/com/cloud/configuration/Resource.java @@ -37,7 +37,9 @@ public enum ResourceType { // Primary and Secondary storage are allocated_storag private String name; private ResourceOwnerType[] supportedOwners; private int ordinal; - public static final long bytesToGiB = 1024 * 1024 * 1024; + public static final long bytesToKiB = 1024; + public static final long bytesToMiB = bytesToKiB * 1024; + public static final long bytesToGiB = bytesToMiB * 1024; ResourceType(String name, int ordinal, ResourceOwnerType... supportedOwners) { this.name = name; @@ -71,6 +73,15 @@ public boolean supportsOwner(ResourceOwnerType ownerType) { public int getOrdinal() { return ordinal; } + + public static ResourceType fromOrdinal(int ordinal) { + for (ResourceType r : ResourceType.values()) { + if (r.ordinal == ordinal) { + return r; + } + } + return null; + } } public static class ResourceOwnerType { diff --git a/api/src/com/cloud/dc/DataCenter.java b/api/src/com/cloud/dc/DataCenter.java index 5b3d3c01f300..7d434c5f2315 100644 --- a/api/src/com/cloud/dc/DataCenter.java +++ b/api/src/com/cloud/dc/DataCenter.java @@ -18,15 +18,14 @@ import com.cloud.org.Grouping; import org.apache.cloudstack.acl.InfrastructureEntity; -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.kernel.Partition; import java.util.Map; /** * */ -public interface DataCenter extends InfrastructureEntity, Grouping, Identity, InternalIdentity { +public interface DataCenter extends InfrastructureEntity, Grouping, Partition { public enum NetworkType { Basic, Advanced, diff --git a/api/src/com/cloud/dc/StorageNetworkIpRange.java b/api/src/com/cloud/dc/StorageNetworkIpRange.java index 2b50ca1594e8..03d4f44de484 100644 --- a/api/src/com/cloud/dc/StorageNetworkIpRange.java +++ b/api/src/com/cloud/dc/StorageNetworkIpRange.java @@ -21,20 +21,19 @@ import org.apache.cloudstack.api.InternalIdentity; public interface StorageNetworkIpRange extends InfrastructureEntity, InternalIdentity, Identity { - Integer getVlan(); - String getPodUuid(); + String getGateway(); + + String getNetmask(); String getStartIp(); String getEndIp(); - String getNetworkUuid(); - String getZoneUuid(); - String getNetmask(); + String getPodUuid(); - String getGateway(); + String getNetworkUuid(); } diff --git a/api/src/com/cloud/deploy/DataCenterDeployment.java b/api/src/com/cloud/deploy/DataCenterDeployment.java index f046b66ef068..76faf25f7260 100644 --- a/api/src/com/cloud/deploy/DataCenterDeployment.java +++ b/api/src/com/cloud/deploy/DataCenterDeployment.java @@ -19,6 +19,9 @@ import com.cloud.deploy.DeploymentPlanner.ExcludeList; import com.cloud.vm.ReservationContext; +import java.util.ArrayList; +import java.util.List; + public class DataCenterDeployment implements DeploymentPlan { long _dcId; Long _podId; @@ -29,6 +32,7 @@ public class DataCenterDeployment implements DeploymentPlan { ExcludeList _avoids = null; boolean _recreateDisks; ReservationContext _context; + List preferredHostIds = new ArrayList<>(); public DataCenterDeployment(long dataCenterId) { this(dataCenterId, null, null, null, null, null); @@ -93,4 +97,14 @@ public ReservationContext getReservationContext() { return _context; } + @Override + public void setPreferredHosts(List hostIds) { + this.preferredHostIds = new ArrayList<>(hostIds); + } + + @Override + public List getPreferredHosts() { + return this.preferredHostIds; + } + } diff --git a/api/src/com/cloud/deploy/DeploymentClusterPlanner.java b/api/src/com/cloud/deploy/DeploymentClusterPlanner.java index 6c09a6d51061..a668b79187dc 100644 --- a/api/src/com/cloud/deploy/DeploymentClusterPlanner.java +++ b/api/src/com/cloud/deploy/DeploymentClusterPlanner.java @@ -29,6 +29,7 @@ public interface DeploymentClusterPlanner extends DeploymentPlanner { static final String ClusterCPUCapacityDisableThresholdCK = "cluster.cpu.allocated.capacity.disablethreshold"; static final String ClusterMemoryCapacityDisableThresholdCK = "cluster.memory.allocated.capacity.disablethreshold"; + static final String ClusterThresholdEnabledCK = "cluster.threshold.enabled"; static final ConfigKey ClusterCPUCapacityDisableThreshold = new ConfigKey( @@ -46,6 +47,15 @@ public interface DeploymentClusterPlanner extends DeploymentPlanner { "0.85", "Percentage (as a value between 0 and 1) of memory utilization above which allocators will disable using the cluster for low memory available. Keep the corresponding notification threshold lower than this to be notified beforehand.", true, ConfigKey.Scope.Cluster, null); + static final ConfigKey ClusterThresholdEnabled = + new ConfigKey( + "Advanced", + Boolean.class, + ClusterThresholdEnabledCK, + "true", + "Enable/Disable cluster thresholds. If disabled, an instance can start in a cluster even though the threshold may be crossed.", + false, + ConfigKey.Scope.Global); /** * This is called to determine list of possible clusters where a virtual diff --git a/api/src/com/cloud/deploy/DeploymentPlan.java b/api/src/com/cloud/deploy/DeploymentPlan.java index 456d5b85899d..b57fec0cf419 100644 --- a/api/src/com/cloud/deploy/DeploymentPlan.java +++ b/api/src/com/cloud/deploy/DeploymentPlan.java @@ -19,6 +19,8 @@ import com.cloud.deploy.DeploymentPlanner.ExcludeList; import com.cloud.vm.ReservationContext; +import java.util.List; + /** */ public interface DeploymentPlan { @@ -65,4 +67,8 @@ public interface DeploymentPlan { Long getPhysicalNetworkId(); ReservationContext getReservationContext(); + + void setPreferredHosts(List hostIds); + + List getPreferredHosts(); } diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index 3cc4eac81f12..907b93eca103 100644 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.event; +import java.util.HashMap; +import java.util.Map; + import com.cloud.dc.DataCenter; import com.cloud.dc.Pod; import com.cloud.dc.StorageNetworkIpRange; @@ -54,10 +57,10 @@ import com.cloud.offering.ServiceOffering; import com.cloud.projects.Project; import com.cloud.server.ResourceTag; -import com.cloud.storage.StoragePool; import com.cloud.storage.GuestOS; import com.cloud.storage.GuestOSHypervisor; import com.cloud.storage.Snapshot; +import com.cloud.storage.StoragePool; import com.cloud.storage.Volume; import com.cloud.storage.snapshot.SnapshotPolicy; import com.cloud.template.VirtualMachineTemplate; @@ -68,12 +71,11 @@ import com.cloud.vm.VirtualMachine; import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RolePermission; +import org.apache.cloudstack.annotation.Annotation; import org.apache.cloudstack.config.Configuration; +import org.apache.cloudstack.ha.HAConfig; import org.apache.cloudstack.usage.Usage; -import java.util.HashMap; -import java.util.Map; - public class EventTypes { //map of Event and corresponding entity for which Event is applicable @@ -128,6 +130,7 @@ public class EventTypes { public static final String EVENT_NETWORK_CREATE = "NETWORK.CREATE"; public static final String EVENT_NETWORK_DELETE = "NETWORK.DELETE"; public static final String EVENT_NETWORK_UPDATE = "NETWORK.UPDATE"; + public static final String EVENT_NETWORK_MIGRATE = "NETWORK.MIGRATE"; public static final String EVENT_FIREWALL_OPEN = "FIREWALL.OPEN"; public static final String EVENT_FIREWALL_CLOSE = "FIREWALL.CLOSE"; public static final String EVENT_FIREWALL_UPDATE = "FIREWALL.UPDATE"; @@ -176,6 +179,11 @@ public class EventTypes { public static final String EVENT_ROLE_PERMISSION_UPDATE = "ROLE.PERMISSION.UPDATE"; public static final String EVENT_ROLE_PERMISSION_DELETE = "ROLE.PERMISSION.DELETE"; + // CA events + public static final String EVENT_CA_CERTIFICATE_ISSUE = "CA.CERTIFICATE.ISSUE"; + public static final String EVENT_CA_CERTIFICATE_REVOKE = "CA.CERTIFICATE.REVOKE"; + public static final String EVENT_CA_CERTIFICATE_PROVISION = "CA.CERTIFICATE.PROVISION"; + // Account events public static final String EVENT_ACCOUNT_ENABLE = "ACCOUNT.ENABLE"; public static final String EVENT_ACCOUNT_DISABLE = "ACCOUNT.DISABLE"; @@ -190,6 +198,7 @@ public class EventTypes { public static final String EVENT_USER_CREATE = "USER.CREATE"; public static final String EVENT_USER_DELETE = "USER.DELETE"; public static final String EVENT_USER_DISABLE = "USER.DISABLE"; + public static final String EVENT_USER_MOVE = "USER.MOVE"; public static final String EVENT_USER_UPDATE = "USER.UPDATE"; public static final String EVENT_USER_ENABLE = "USER.ENABLE"; public static final String EVENT_USER_LOCK = "USER.LOCK"; @@ -233,6 +242,8 @@ public class EventTypes { // Snapshots public static final String EVENT_SNAPSHOT_CREATE = "SNAPSHOT.CREATE"; + public static final String EVENT_SNAPSHOT_ON_PRIMARY = "SNAPSHOT.ON_PRIMARY"; + public static final String EVENT_SNAPSHOT_OFF_PRIMARY = "SNAPSHOT.OFF_PRIMARY"; public static final String EVENT_SNAPSHOT_DELETE = "SNAPSHOT.DELETE"; public static final String EVENT_SNAPSHOT_REVERT = "SNAPSHOT.REVERT"; public static final String EVENT_SNAPSHOT_POLICY_CREATE = "SNAPSHOTPOLICY.CREATE"; @@ -289,6 +300,9 @@ public class EventTypes { public static final String EVENT_VLAN_IP_RANGE_DEDICATE = "VLAN.IP.RANGE.DEDICATE"; public static final String EVENT_VLAN_IP_RANGE_RELEASE = "VLAN.IP.RANGE.RELEASE"; + public static final String EVENT_MANAGEMENT_IP_RANGE_CREATE = "MANAGEMENT.IP.RANGE.CREATE"; + public static final String EVENT_MANAGEMENT_IP_RANGE_DELETE = "MANAGEMENT.IP.RANGE.DELETE"; + public static final String EVENT_STORAGE_IP_RANGE_CREATE = "STORAGE.IP.RANGE.CREATE"; public static final String EVENT_STORAGE_IP_RANGE_DELETE = "STORAGE.IP.RANGE.DELETE"; public static final String EVENT_STORAGE_IP_RANGE_UPDATE = "STORAGE.IP.RANGE.UPDATE"; @@ -317,6 +331,12 @@ public class EventTypes { public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD = "HOST.OOBM.CHANGEPASSWORD"; public static final String EVENT_HOST_OUTOFBAND_MANAGEMENT_POWERSTATE_TRANSITION = "HOST.OOBM.POWERSTATE.TRANSITION"; + // HA + public static final String EVENT_HA_RESOURCE_ENABLE = "HA.RESOURCE.ENABLE"; + public static final String EVENT_HA_RESOURCE_DISABLE = "HA.RESOURCE.DISABLE"; + public static final String EVENT_HA_RESOURCE_CONFIGURE = "HA.RESOURCE.CONFIGURE"; + public static final String EVENT_HA_STATE_TRANSITION = "HA.STATE.TRANSITION"; + // Maintenance public static final String EVENT_MAINTENANCE_CANCEL = "MAINT.CANCEL"; public static final String EVENT_MAINTENANCE_CANCEL_PRIMARY_STORAGE = "MAINT.CANCEL.PS"; @@ -391,6 +411,10 @@ public class EventTypes { public static final String EVENT_EXTERNAL_LB_DEVICE_DELETE = "PHYSICAL.LOADBALANCER.DELETE"; public static final String EVENT_EXTERNAL_LB_DEVICE_CONFIGURE = "PHYSICAL.LOADBALANCER.CONFIGURE"; + // external NCC device events + public static final String EVENT_EXTERNAL_NCC_DEVICE_ADD = "PHYSICAL.NCC.ADD"; + public static final String EVENT_EXTERNAL_NCC_DEVICE_DELETE = "PHYSICAL.NCC.DELETE"; + // external switch management device events (E.g.: Cisco Nexus 1000v Virtual Supervisor Module. public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_ADD = "SWITCH.MGMT.ADD"; public static final String EVENT_EXTERNAL_SWITCH_MGMT_DEVICE_DELETE = "SWITCH.MGMT.DELETE"; @@ -441,6 +465,8 @@ public class EventTypes { // vm snapshot events public static final String EVENT_VM_SNAPSHOT_CREATE = "VMSNAPSHOT.CREATE"; public static final String EVENT_VM_SNAPSHOT_DELETE = "VMSNAPSHOT.DELETE"; + public static final String EVENT_VM_SNAPSHOT_ON_PRIMARY = "VMSNAPSHOT.ON_PRIMARY"; + public static final String EVENT_VM_SNAPSHOT_OFF_PRIMARY = "VMSNAPSHOT.OFF_PRIMARY"; public static final String EVENT_VM_SNAPSHOT_REVERT = "VMSNAPSHOT.REVERTTO"; // external network device events @@ -545,6 +571,19 @@ public class EventTypes { //Usage related events public static final String EVENT_USAGE_REMOVE_USAGE_RECORDS = "USAGE.REMOVE.USAGE.RECORDS"; + // Netscaler Service Package events + public static final String EVENT_NETSCALER_SERVICEPACKAGE_ADD = "NETSCALER.SERVICEPACKAGE.ADD"; + public static final String EVENT_NETSCALER_SERVICEPACKAGE_DELETE = "NETSCALER.SERVICEPACKAGE.DELETE"; + + public static final String EVENT_NETSCALER_VM_START = "NETSCALERVM.START"; + public static final String EVENT_NETSCALER_VM_STOP = "NETSCALERVM.STOP"; + + public static final String EVENT_ANNOTATION_CREATE = "ANNOTATION.CREATE"; + public static final String EVENT_ANNOTATION_REMOVE = "ANNOTATION.REMOVE"; + + public static final String EVENT_TEMPLATE_DIRECT_DOWNLOAD_FAILURE = "TEMPLATE.DIRECT.DOWNLOAD.FAILURE"; + public static final String EVENT_ISO_DIRECT_DOWNLOAD_FAILURE = "ISO.DIRECT.DOWNLOAD.FAILURE"; + static { // TODO: need a way to force author adding event types to declare the entity details as well, with out braking @@ -679,6 +718,8 @@ public class EventTypes { // Snapshots entityEventDetails.put(EVENT_SNAPSHOT_CREATE, Snapshot.class); entityEventDetails.put(EVENT_SNAPSHOT_DELETE, Snapshot.class); + entityEventDetails.put(EVENT_SNAPSHOT_ON_PRIMARY, Snapshot.class); + entityEventDetails.put(EVENT_SNAPSHOT_OFF_PRIMARY, Snapshot.class); entityEventDetails.put(EVENT_SNAPSHOT_POLICY_CREATE, SnapshotPolicy.class); entityEventDetails.put(EVENT_SNAPSHOT_POLICY_UPDATE, SnapshotPolicy.class); entityEventDetails.put(EVENT_SNAPSHOT_POLICY_DELETE, SnapshotPolicy.class); @@ -733,6 +774,9 @@ public class EventTypes { entityEventDetails.put(EVENT_VLAN_IP_RANGE_DEDICATE, Vlan.class); entityEventDetails.put(EVENT_VLAN_IP_RANGE_RELEASE, Vlan.class); + entityEventDetails.put(EVENT_MANAGEMENT_IP_RANGE_CREATE, Pod.class); + entityEventDetails.put(EVENT_MANAGEMENT_IP_RANGE_DELETE, Pod.class); + entityEventDetails.put(EVENT_STORAGE_IP_RANGE_CREATE, StorageNetworkIpRange.class); entityEventDetails.put(EVENT_STORAGE_IP_RANGE_DELETE, StorageNetworkIpRange.class); entityEventDetails.put(EVENT_STORAGE_IP_RANGE_UPDATE, StorageNetworkIpRange.class); @@ -761,6 +805,12 @@ public class EventTypes { entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_CHANGE_PASSWORD, Host.class); entityEventDetails.put(EVENT_HOST_OUTOFBAND_MANAGEMENT_POWERSTATE_TRANSITION, Host.class); + // HA + entityEventDetails.put(EVENT_HA_RESOURCE_ENABLE, HAConfig.class); + entityEventDetails.put(EVENT_HA_RESOURCE_DISABLE, HAConfig.class); + entityEventDetails.put(EVENT_HA_RESOURCE_CONFIGURE, HAConfig.class); + entityEventDetails.put(EVENT_HA_STATE_TRANSITION, HAConfig.class); + // Maintenance entityEventDetails.put(EVENT_MAINTENANCE_CANCEL, Host.class); entityEventDetails.put(EVENT_MAINTENANCE_CANCEL_PRIMARY_STORAGE, Host.class); @@ -918,6 +968,15 @@ public class EventTypes { //Usage entityEventDetails.put(EVENT_USAGE_REMOVE_USAGE_RECORDS, Usage.class); + // Netscaler Service Packages + entityEventDetails.put(EVENT_NETSCALER_SERVICEPACKAGE_ADD, "NETSCALER.SERVICEPACKAGE.CREATE"); + entityEventDetails.put(EVENT_NETSCALER_SERVICEPACKAGE_DELETE, "NETSCALER.SERVICEPACKAGE.DELETE"); + + entityEventDetails.put(EVENT_ANNOTATION_CREATE, Annotation.class); + entityEventDetails.put(EVENT_ANNOTATION_REMOVE, Annotation.class); + + entityEventDetails.put(EVENT_TEMPLATE_DIRECT_DOWNLOAD_FAILURE, VirtualMachineTemplate.class); + entityEventDetails.put(EVENT_ISO_DIRECT_DOWNLOAD_FAILURE, "Iso"); } public static String getEntityForEvent(String eventName) { diff --git a/api/src/com/cloud/exception/UnavailableCommandException.java b/api/src/com/cloud/exception/UnavailableCommandException.java new file mode 100644 index 000000000000..d5b7faa8f369 --- /dev/null +++ b/api/src/com/cloud/exception/UnavailableCommandException.java @@ -0,0 +1,36 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.exception; + +import com.cloud.utils.SerialVersionUID; + +public class UnavailableCommandException extends PermissionDeniedException { + + private static final long serialVersionUID = SerialVersionUID.UnavailableCommandException; + + protected UnavailableCommandException() { + super(); + } + + public UnavailableCommandException(String msg) { + super(msg); + } + + public UnavailableCommandException(String msg, Throwable cause) { + super(msg, cause); + } +} diff --git a/api/src/com/cloud/host/Host.java b/api/src/com/cloud/host/Host.java index 689ed12b64e3..1ecd48d74ce9 100644 --- a/api/src/com/cloud/host/Host.java +++ b/api/src/com/cloud/host/Host.java @@ -16,22 +16,22 @@ // under the License. package com.cloud.host; -import java.util.Date; - -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.api.InternalIdentity; - import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.resource.ResourceState; import com.cloud.utils.fsm.StateObject; +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.ha.HAResource; +import org.apache.cloudstack.kernel.Partition; + +import java.util.Date; /** * Host represents one particular host server. */ -public interface Host extends StateObject, Identity, InternalIdentity { +public interface Host extends StateObject, Identity, Partition, HAResource { public enum Type { Storage(false), Routing(false), SecondaryStorage(false), SecondaryStorageCmdExecutor(false), ConsoleProxy(true), ExternalFirewall(false), ExternalLoadBalancer( - false), ExternalVirtualSwitchSupervisor(false), PxeServer(false), BaremetalPxe(false), BaremetalDhcp(false), TrafficMonitor(false), + false), ExternalVirtualSwitchSupervisor(false), PxeServer(false), BaremetalPxe(false), BaremetalDhcp(false), TrafficMonitor(false), NetScalerControlCenter(false), ExternalDhcp(false), SecondaryStorageVM(true), LocalSecondaryStorage(false), L2Networking(false); boolean _virtual; @@ -202,5 +202,7 @@ public static String[] toStrings(Host.Type... types) { boolean isInMaintenanceStates(); + boolean isDisabled(); + ResourceState getResourceState(); } diff --git a/api/src/com/cloud/host/Status.java b/api/src/com/cloud/host/Status.java index 73e6cc9185a9..e381115db416 100644 --- a/api/src/com/cloud/host/Status.java +++ b/api/src/com/cloud/host/Status.java @@ -150,12 +150,14 @@ public static String[] toStrings(Status... states) { s_fsm.addTransition(Status.Down, Event.ManagementServerDown, Status.Down); s_fsm.addTransition(Status.Down, Event.AgentDisconnected, Status.Down); s_fsm.addTransition(Status.Down, Event.PingTimeout, Status.Down); + s_fsm.addTransition(Status.Down, Event.HostDown, Status.Down); s_fsm.addTransition(Status.Alert, Event.AgentConnected, Status.Connecting); s_fsm.addTransition(Status.Alert, Event.Ping, Status.Up); s_fsm.addTransition(Status.Alert, Event.Remove, Status.Removed); s_fsm.addTransition(Status.Alert, Event.ManagementServerDown, Status.Alert); s_fsm.addTransition(Status.Alert, Event.AgentDisconnected, Status.Alert); s_fsm.addTransition(Status.Alert, Event.ShutdownRequested, Status.Disconnected); + s_fsm.addTransition(Status.Alert, Event.HostDown, Status.Down); s_fsm.addTransition(Status.Rebalancing, Event.RebalanceFailed, Status.Disconnected); s_fsm.addTransition(Status.Rebalancing, Event.RebalanceCompleted, Status.Connecting); s_fsm.addTransition(Status.Rebalancing, Event.ManagementServerDown, Status.Disconnected); diff --git a/api/src/com/cloud/hypervisor/HypervisorGuru.java b/api/src/com/cloud/hypervisor/HypervisorGuru.java index 6a09dd257afc..45e19ee2674b 100644 --- a/api/src/com/cloud/hypervisor/HypervisorGuru.java +++ b/api/src/com/cloud/hypervisor/HypervisorGuru.java @@ -33,7 +33,7 @@ public interface HypervisorGuru extends Adapter { static final ConfigKey VmwareFullClone = new ConfigKey("Advanced", Boolean.class, "vmware.create.full.clone", "true", - "If set to true, creates guest VMs as full clones on ESX", false); + "If set to true, creates guest VMs as full clones on ESX", false); HypervisorType getHypervisorType(); /** @@ -45,7 +45,7 @@ public interface HypervisorGuru extends Adapter { VirtualMachineTO implement(VirtualMachineProfile vm); /** - * Give hypervisor guru opportunity to decide if certain command needs to be delegated to other host, mainly to secondary storage VM host + * Gives hypervisor guru opportunity to decide if certain commands need to be delegated to another host, for instance, we may have the opportunity to change from a system VM (is considered a host) to a real host to execute commands. * * @param hostId original hypervisor host * @param cmd command that is going to be sent, hypervisor guru usually needs to register various context objects into the command object diff --git a/api/src/com/cloud/network/IpAddress.java b/api/src/com/cloud/network/IpAddress.java index 2061771ed37e..2447809d66f5 100644 --- a/api/src/com/cloud/network/IpAddress.java +++ b/api/src/com/cloud/network/IpAddress.java @@ -92,4 +92,8 @@ enum Purpose { public Date getCreated(); + State getRuleState(); + + void setRuleState(State ruleState); + } diff --git a/api/src/com/cloud/network/Network.java b/api/src/com/cloud/network/Network.java index 7cc5441603ae..75196a469d3e 100644 --- a/api/src/com/cloud/network/Network.java +++ b/api/src/com/cloud/network/Network.java @@ -38,14 +38,16 @@ public interface Network extends ControlledEntity, StateObject, InternalIdentity, Identity, Serializable, Displayable { public enum GuestType { - Shared, Isolated + Shared, Isolated, L2 } + public String updatingInSequence ="updatingInSequence"; + public static class Service { private static List supportedServices = new ArrayList(); public static final Service Vpn = new Service("Vpn", Capability.SupportedVpnProtocols, Capability.VpnTypes); - public static final Service Dhcp = new Service("Dhcp"); + public static final Service Dhcp = new Service("Dhcp", Capability.ExtraDhcpOptions); public static final Service Dns = new Service("Dns", Capability.AllowDnsSuffixModification); public static final Service Gateway = new Service("Gateway"); public static final Service Firewall = new Service("Firewall", Capability.SupportedProtocols, Capability.MultipleIps, Capability.TrafficStatistics, @@ -58,7 +60,8 @@ public static class Service { public static final Service PortForwarding = new Service("PortForwarding"); public static final Service SecurityGroup = new Service("SecurityGroup"); public static final Service NetworkACL = new Service("NetworkACL", Capability.SupportedProtocols); - public static final Service Connectivity = new Service("Connectivity", Capability.DistributedRouter, Capability.RegionLevelVpc, Capability.StretchedL2Subnet); + public static final Service Connectivity = new Service("Connectivity", Capability.DistributedRouter, Capability.RegionLevelVpc, Capability.StretchedL2Subnet, + Capability.NoVlan, Capability.PublicAccess); private final String name; private final Capability[] caps; @@ -139,6 +142,8 @@ public static class Provider { public static final Provider GloboDns = new Provider("GloboDns", true); // add Big Switch Bcf Provider public static final Provider BigSwitchBcf = new Provider("BigSwitchBcf", false); + //Add ConfigDrive provider + public static final Provider ConfigDrive = new Provider("ConfigDrive", false); private final String name; private final boolean isExternal; @@ -213,6 +218,9 @@ public static class Capability { public static final Capability DistributedRouter = new Capability("DistributedRouter"); public static final Capability StretchedL2Subnet = new Capability("StretchedL2Subnet"); public static final Capability RegionLevelVpc = new Capability("RegionLevelVpc"); + public static final Capability NoVlan = new Capability("NoVlan"); + public static final Capability PublicAccess = new Capability("PublicAccess"); + public static final Capability ExtraDhcpOptions = new Capability("ExtraDhcpOptions"); private final String name; @@ -272,12 +280,26 @@ private State(String description) { public class IpAddresses { private String ip4Address; private String ip6Address; + private String macAddress; + + public String getMacAddress() { + return macAddress; + } + + public void setMacAddress(String macAddress) { + this.macAddress = macAddress; + } public IpAddresses(String ip4Address, String ip6Address) { setIp4Address(ip4Address); setIp6Address(ip6Address); } + public IpAddresses(String ipAddress, String ip6Address, String macAddress) { + this(ipAddress, ip6Address); + setMacAddress(macAddress); + } + public String getIp4Address() { return ip4Address; } @@ -329,6 +351,8 @@ public void setIp6Address(String ip6Address) { boolean isRedundant(); + boolean isRollingRestart(); + long getRelated(); URI getBroadcastUri(); @@ -370,4 +394,6 @@ public void setIp6Address(String ip6Address) { void setNetworkACLId(Long networkACLId); boolean isStrechedL2Network(); + + String getExternalId(); } diff --git a/api/src/com/cloud/network/NetworkModel.java b/api/src/com/cloud/network/NetworkModel.java index 780f97d22f4e..a5bf5e446105 100644 --- a/api/src/com/cloud/network/NetworkModel.java +++ b/api/src/com/cloud/network/NetworkModel.java @@ -17,6 +17,8 @@ package com.cloud.network; +import com.google.common.collect.ImmutableMap; + import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -27,6 +29,7 @@ import com.cloud.exception.InvalidParameterValueException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network.Capability; +import com.cloud.network.Network.IpAddresses; import com.cloud.network.Network.Provider; import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; @@ -38,6 +41,7 @@ import com.cloud.vm.Nic; import com.cloud.vm.NicProfile; import com.cloud.vm.VirtualMachine; +import org.apache.cloudstack.framework.config.ConfigKey; /** * The NetworkModel presents a read-only view into the Network data such as L2 networks, @@ -46,6 +50,34 @@ * participants in the orchestration can use this interface to query the data. */ public interface NetworkModel { + String METATDATA_DIR = "metadata"; + String USERDATA_DIR = "userdata"; + String USERDATA_FILE = "user_data"; + String PASSWORD_DIR = "password"; + String PASSWORD_FILE = "vm_password"; + String PASSWORD_CHECKSUM_FILE = "vm-password-md5checksum"; + String SERVICE_OFFERING_FILE = "service-offering"; + String AVAILABILITY_ZONE_FILE = "availability-zone"; + String LOCAL_HOSTNAME_FILE = "local-hostname"; + String LOCAL_IPV4_FILE = "local-ipv4"; + String PUBLIC_HOSTNAME_FILE = "public-hostname"; + String PUBLIC_IPV4_FILE = "public-ipv4"; + String INSTANCE_ID_FILE = "instance-id"; + String VM_ID_FILE = "vm-id"; + String PUBLIC_KEYS_FILE = "public-keys"; + String CLOUD_IDENTIFIER_FILE = "cloud-identifier"; + int CONFIGDATA_DIR = 0; + int CONFIGDATA_FILE = 1; + int CONFIGDATA_CONTENT = 2; + ImmutableMap openStackFileMapping = ImmutableMap.of( + AVAILABILITY_ZONE_FILE, "availability_zone", + LOCAL_HOSTNAME_FILE, "hostname", + VM_ID_FILE, "uuid", + PUBLIC_HOSTNAME_FILE, "name" + ); + + static final ConfigKey MACIdentifier = new ConfigKey("Advanced",Integer.class, "mac.identifier", "0", + "This value will be used while generating the mac addresses for isolated and shared networks. The hexadecimal equivalent value will be present at the 2nd octet of the mac address. Default value is null which means this feature is disabled.Its scope is global.", true, ConfigKey.Scope.Global); /** * Lists IP addresses that belong to VirtualNetwork VLANs @@ -154,6 +186,8 @@ public interface NetworkModel { boolean checkIpForService(IpAddress ip, Service service, Long networkId); + boolean providerSupportsCapability(Set providers, Service service, Capability cap); + void checkCapabilityForProvider(Set providers, Service service, Capability cap, String capValue); Provider getDefaultUniqueProviderForService(String serviceName); @@ -254,7 +288,7 @@ public interface NetworkModel { void checkIp6Parameters(String startIPv6, String endIPv6, String ip6Gateway, String ip6Cidr) throws InvalidParameterValueException; - void checkRequestedIpAddresses(long networkId, String ip4, String ip6) throws InvalidParameterValueException; + void checkRequestedIpAddresses(long networkId, IpAddresses ips) throws InvalidParameterValueException; String getStartIpv6Address(long id); @@ -278,7 +312,9 @@ public interface NetworkModel { boolean getNetworkEgressDefaultPolicy(Long networkId); - List generateVmData(String userData, String serviceOffering, String zoneName, - String vmName, long vmId, String publicKey, String password, Boolean isWindows); + List generateVmData(String userData, String serviceOffering, long datacenterId, + String vmName, String vmHostName, long vmId, String vmUuid, String guestIpAddress, String publicKey, String password, Boolean isWindows); + + String getValidNetworkCidr(Network guestNetwork); } diff --git a/api/src/com/cloud/network/NetworkProfile.java b/api/src/com/cloud/network/NetworkProfile.java index ab033edaa534..d8733ca6c501 100644 --- a/api/src/com/cloud/network/NetworkProfile.java +++ b/api/src/com/cloud/network/NetworkProfile.java @@ -57,6 +57,7 @@ public class NetworkProfile implements Network { private Long networkAclId; private final String guruName; private boolean strechedL2Subnet; + private String externalId; public NetworkProfile(Network network) { id = network.getId(); @@ -91,6 +92,7 @@ public NetworkProfile(Network network) { guruName = network.getGuruName(); strechedL2Subnet = network.isStrechedL2Network(); isRedundant = network.isRedundant(); + externalId = network.getExternalId(); } public String getDns1() { @@ -153,6 +155,11 @@ public boolean isRedundant() { return this.isRedundant; } + @Override + public boolean isRollingRestart() { + return false; + } + @Override public String getName() { return name; @@ -300,4 +307,9 @@ public boolean isStrechedL2Network() { return false; } + @Override + public String getExternalId() { + return externalId; + } + } diff --git a/api/src/com/cloud/network/NetworkService.java b/api/src/com/cloud/network/NetworkService.java index c1b68eb3a463..d76d65972026 100644 --- a/api/src/com/cloud/network/NetworkService.java +++ b/api/src/com/cloud/network/NetworkService.java @@ -19,6 +19,7 @@ import java.util.List; import java.util.Map; +import org.apache.cloudstack.api.command.admin.address.ReleasePodIpCmdByAdmin; import org.apache.cloudstack.api.command.admin.network.DedicateGuestVlanRangeCmd; import org.apache.cloudstack.api.command.admin.network.ListDedicatedGuestVlanRangesCmd; import org.apache.cloudstack.api.command.admin.usage.ListTrafficTypeImplementorsCmd; @@ -26,6 +27,7 @@ import org.apache.cloudstack.api.command.user.network.ListNetworksCmd; import org.apache.cloudstack.api.command.user.network.RestartNetworkCmd; import org.apache.cloudstack.api.command.user.vm.ListNicsCmd; +import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientAddressCapacityException; @@ -34,10 +36,12 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.Network.Service; import com.cloud.network.Networks.TrafficType; +import com.cloud.network.vpc.Vpc; import com.cloud.offering.NetworkOffering; import com.cloud.user.Account; import com.cloud.user.User; import com.cloud.utils.Pair; +import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.vm.Nic; import com.cloud.vm.NicSecondaryIp; @@ -66,7 +70,7 @@ IpAddress allocatePortableIP(Account ipOwner, int regionId, Long zoneId, Long ne boolean deleteNetwork(long networkId, boolean forced); - boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; + boolean restartNetwork(RestartNetworkCmd cmd, boolean cleanup, boolean makeRedundant) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException; int getActiveNicsInNetwork(long networkId); @@ -77,7 +81,25 @@ IpAddress allocatePortableIP(Account ipOwner, int regionId, Long zoneId, Long ne IpAddress getIp(long id); Network updateGuestNetwork(long networkId, String name, String displayText, Account callerAccount, User callerUser, String domainSuffix, Long networkOfferingId, - Boolean changeCidr, String guestVmCidr, Boolean displayNetwork, String newUUID); + Boolean changeCidr, String guestVmCidr, Boolean displayNetwork, String newUUID, boolean updateInSequence, boolean forced); + + /** + * Migrate a network from one physical network to another physical network + * @param networkId of the network that needs to be migrated + * @param networkOfferingId new network offering id for the network + * @param resume if previous migration failed try to resume of just fail directly because anomaly is detected + * @return the migrated network + */ + Network migrateGuestNetwork(long networkId, long networkOfferingId, Account callerAccount, User callerUser, boolean resume); + + /** + * Migrate a vpc from on physical network to another physical network + * @param vpcId the id of the vpc that needs to be migrated + * @param vpcNetworkofferingId the new vpc offering id + * @param resume if previous migration failed try to resume of just fail directly because anomaly is detected + * @return the migrated vpc + */ + Vpc migrateVpcNetwork(long vpcId, long vpcNetworkofferingId, Map networkToOffering, Account account, User callerUser, boolean resume); PhysicalNetwork createPhysicalNetwork(Long zoneId, String vnetRange, String networkSpeed, List isolationMethods, String broadcastDomainRange, Long domainId, List tags, String name); @@ -180,4 +202,10 @@ Network createPrivateNetwork(String networkName, String displayText, long physic IpAddress updateIP(Long id, String customId, Boolean displayIp); boolean configureNicSecondaryIp(NicSecondaryIp secIp, boolean isZoneSgEnabled); + + List listVmNicSecondaryIps(ListNicsCmd listNicsCmd); + + AcquirePodIpCmdResponse allocatePodIp(Account account, String zoneId, String podId) throws ResourceAllocationException, ConcurrentOperationException; + + boolean releasePodIp(ReleasePodIpCmdByAdmin ip) throws CloudRuntimeException; } diff --git a/api/src/com/cloud/network/Networks.java b/api/src/com/cloud/network/Networks.java index f027cf9fe995..06f4236eb7ae 100644 --- a/api/src/com/cloud/network/Networks.java +++ b/api/src/com/cloud/network/Networks.java @@ -75,6 +75,10 @@ public URI toUri(T value) { throw new CloudRuntimeException("Unable to convert to broadcast URI: " + value); } } + @Override + public String getValueFrom(URI uri) { + return uri.getAuthority(); + } }, Vswitch("vs", String.class), LinkLocal(null, null), Vnet("vnet", Long.class), Storage("storage", Integer.class), Lswitch("lswitch", String.class) { @Override @@ -242,6 +246,7 @@ public static String getValue(String uriString) throws URISyntaxException { * encode a string into a BroadcastUri * @param candidate the input string * @return an URI containing an appropriate (possibly given) scheme and the value + * */ public static URI fromString(String candidate) { try { diff --git a/api/src/com/cloud/network/PhysicalNetwork.java b/api/src/com/cloud/network/PhysicalNetwork.java index bdf098f3abba..48e416c4b460 100644 --- a/api/src/com/cloud/network/PhysicalNetwork.java +++ b/api/src/com/cloud/network/PhysicalNetwork.java @@ -16,12 +16,16 @@ // under the License. package com.cloud.network; -import java.util.List; - +import com.cloud.exception.CloudException; +import com.cloud.utils.Pair; +import com.cloud.utils.StringUtils; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; -import com.cloud.utils.Pair; +import java.util.HashSet; +import java.util.List; +import java.util.Objects; +import java.util.Set; /** * @@ -32,8 +36,101 @@ public enum State { Disabled, Enabled; } - public enum IsolationMethod { - VLAN, L3, GRE, STT, BCF_SEGMENT, MIDO, SSP, VXLAN, ODL, L3VPN, VSP, VCS; + public class IsolationMethod { + protected static final String UNKNOWN_PROVIDER = "Unknown"; + static Set registeredIsolationMethods = new HashSet<>(); + + String methodPrefix; + String provider; + + public IsolationMethod(String prfx) { + this(prfx, UNKNOWN_PROVIDER); + } + + public IsolationMethod(String prfx, String prvdr) { + methodPrefix = prfx; + provider = StringUtils.isNotBlank(prvdr)? prvdr : UNKNOWN_PROVIDER; + registeredIsolationMethods.add(this); + } + + /** + * gets a IsolationMethod object that defines this prefix and if any it returns the first one found that has a known provider. If none has a known provider + * it will return the one with the unknown provider. if none is found it return null. + * + * @param prfx + * @return + */ + public static IsolationMethod getIsolationMethod(String prfx) throws IsolationMethodNotRegistered { + IsolationMethod rc = null; + for (IsolationMethod method: registeredIsolationMethods) { + if (method.methodPrefix.equals(prfx)) { + rc = method; + if(! rc.getProvider().equals(UNKNOWN_PROVIDER)) { + break; + } + } + } + if (rc == null) { + throw new IsolationMethodNotRegistered("No registration of prefix '" + prfx + "' found."); + } + return rc; + } + + public static IsolationMethod getIsolationMethod(String prfx, String provider) throws IsolationMethodNotRegistered { + for (IsolationMethod method: registeredIsolationMethods) { + if (method.methodPrefix.equals(prfx) && method.provider.equals(provider)) { + return method; + } + } + throw new IsolationMethodNotRegistered("No registration of prefix '" + prfx + "' for provider '" + provider + "' found."); + } + + static class IsolationMethodNotRegistered extends CloudException { + IsolationMethodNotRegistered (String message) { + super(message); + } + } + + public String getMethodPrefix() { + return methodPrefix; + } + + public String getProvider() { + return provider; + } + + @Override + public boolean equals(Object o) { + if (this == o) + return true; + if (o == null || getClass() != o.getClass()) + return false; + IsolationMethod that = (IsolationMethod)o; + return Objects.equals(methodPrefix, that.methodPrefix) && Objects.equals(provider, that.provider); + } + + @Override + public int hashCode() { + return Objects.hash(methodPrefix, provider); + } + + @Override + public String toString() { + return methodPrefix; + } + + public static boolean remove(String prfx, String prvdr) { + prvdr = StringUtils.isNotBlank(prvdr)? prvdr : UNKNOWN_PROVIDER; + + try { + return remove(getIsolationMethod(prfx, prvdr)); + } catch (IsolationMethodNotRegistered isolationMethodNotRegistered) { + return false; + } + } + public static boolean remove(IsolationMethod method) { + return registeredIsolationMethods.remove(method); + } } public enum BroadcastDomainRange { diff --git a/api/src/com/cloud/network/VirtualRouterProvider.java b/api/src/com/cloud/network/VirtualRouterProvider.java index 8e2fa70d8910..aca526b1832b 100644 --- a/api/src/com/cloud/network/VirtualRouterProvider.java +++ b/api/src/com/cloud/network/VirtualRouterProvider.java @@ -21,7 +21,7 @@ public interface VirtualRouterProvider extends InternalIdentity, Identity { public enum Type { - VirtualRouter, ElasticLoadBalancerVm, VPCVirtualRouter, InternalLbVm + VirtualRouter, ElasticLoadBalancerVm, VPCVirtualRouter, InternalLbVm, NetScalerVm } public Type getType(); diff --git a/api/src/com/cloud/network/element/DhcpServiceProvider.java b/api/src/com/cloud/network/element/DhcpServiceProvider.java index 2bd6ebcba35a..12830f8cec0f 100644 --- a/api/src/com/cloud/network/element/DhcpServiceProvider.java +++ b/api/src/com/cloud/network/element/DhcpServiceProvider.java @@ -16,6 +16,8 @@ // under the License. package com.cloud.network.element; +import java.util.Map; + import com.cloud.deploy.DeployDestination; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -33,4 +35,6 @@ boolean configDhcpSupportForSubnet(Network network, NicProfile nic, VirtualMachi throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; boolean removeDhcpSupportForSubnet(Network network) throws ResourceUnavailableException; + + boolean setExtraDhcpOptions(Network network, long nicId, Map dhcpOptions); } diff --git a/api/src/com/cloud/network/element/DnsServiceProvider.java b/api/src/com/cloud/network/element/DnsServiceProvider.java new file mode 100644 index 000000000000..7abce537221c --- /dev/null +++ b/api/src/com/cloud/network/element/DnsServiceProvider.java @@ -0,0 +1,36 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.element; + +import 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.vm.NicProfile; +import com.cloud.vm.ReservationContext; +import com.cloud.vm.VirtualMachineProfile; + +public interface DnsServiceProvider extends NetworkElement { + boolean addDnsEntry(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; + + boolean configDnsSupportForSubnet(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; + + boolean removeDnsSupportForSubnet(Network network) throws ResourceUnavailableException; +} diff --git a/api/src/com/cloud/network/element/RedundantResource.java b/api/src/com/cloud/network/element/RedundantResource.java new file mode 100644 index 000000000000..6ed2d67e7c9d --- /dev/null +++ b/api/src/com/cloud/network/element/RedundantResource.java @@ -0,0 +1,28 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.element; + +import com.cloud.network.Network; + +/** + * Created by bharat on 11/08/15. + */ +public interface RedundantResource { + public void configureResource(Network network); + public int getResourceCount(Network network); + public void finalize(Network network, boolean success); +} diff --git a/api/src/com/cloud/network/element/UserDataServiceProvider.java b/api/src/com/cloud/network/element/UserDataServiceProvider.java index 45ab0d877a3e..bf6d7e819e91 100644 --- a/api/src/com/cloud/network/element/UserDataServiceProvider.java +++ b/api/src/com/cloud/network/element/UserDataServiceProvider.java @@ -26,7 +26,7 @@ import com.cloud.vm.VirtualMachineProfile; public interface UserDataServiceProvider extends NetworkElement { - public boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) + boolean addPasswordAndUserdata(Network network, NicProfile nic, VirtualMachineProfile vm, DeployDestination dest, ReservationContext context) throws ConcurrentOperationException, InsufficientCapacityException, ResourceUnavailableException; boolean savePassword(Network network, NicProfile nic, VirtualMachineProfile vm) throws ResourceUnavailableException; diff --git a/api/src/com/cloud/network/router/VirtualRouter.java b/api/src/com/cloud/network/router/VirtualRouter.java index 0114a962146f..84c85ce66758 100644 --- a/api/src/com/cloud/network/router/VirtualRouter.java +++ b/api/src/com/cloud/network/router/VirtualRouter.java @@ -23,7 +23,11 @@ */ public interface VirtualRouter extends VirtualMachine { public enum Role { - VIRTUAL_ROUTER, LB, INTERNAL_LB_VM + VIRTUAL_ROUTER, LB, INTERNAL_LB_VM, NETSCALER_VM + } + + public enum UpdateState { + UPDATE_NEEDED, UPDATE_IN_PROGRESS, UPDATE_COMPLETE, UPDATE_FAILED } Role getRole(); diff --git a/api/src/com/cloud/network/rules/FirewallRule.java b/api/src/com/cloud/network/rules/FirewallRule.java index 4346e2f665d7..6a46c7da03dc 100644 --- a/api/src/com/cloud/network/rules/FirewallRule.java +++ b/api/src/com/cloud/network/rules/FirewallRule.java @@ -79,6 +79,8 @@ enum TrafficType { List getSourceCidrList(); + List getDestinationCidrList(); + Long getRelated(); FirewallRuleType getType(); diff --git a/api/src/com/cloud/network/rules/RulesService.java b/api/src/com/cloud/network/rules/RulesService.java index 3eca14d65436..0b4afeef9458 100644 --- a/api/src/com/cloud/network/rules/RulesService.java +++ b/api/src/com/cloud/network/rules/RulesService.java @@ -81,6 +81,6 @@ Pair, Integer> searchStaticNatRules(Long ipId, Long boolean disableStaticNat(long ipId) throws ResourceUnavailableException, NetworkRuleConflictException, InsufficientAddressCapacityException; - PortForwardingRule updatePortForwardingRule(long id, Integer privatePort, Long virtualMachineId, Ip vmGuestIp, String customId, Boolean forDisplay); + PortForwardingRule updatePortForwardingRule(long id, Integer privatePort, Integer privateEndPort, Long virtualMachineId, Ip vmGuestIp, String customId, Boolean forDisplay); } diff --git a/api/src/com/cloud/network/vpc/Vpc.java b/api/src/com/cloud/network/vpc/Vpc.java index dd607fe6caa9..9f40562423d8 100644 --- a/api/src/com/cloud/network/vpc/Vpc.java +++ b/api/src/com/cloud/network/vpc/Vpc.java @@ -87,4 +87,8 @@ public enum State { * @return true if VPC spans multiple zones in the region */ boolean isRegionLevelVpc(); + + boolean isRollingRestart(); + + void setRollingRestart(boolean rollingRestart); } diff --git a/api/src/com/cloud/network/vpc/VpcOffering.java b/api/src/com/cloud/network/vpc/VpcOffering.java index fb4b151fb4ca..c0da6bf967a5 100644 --- a/api/src/com/cloud/network/vpc/VpcOffering.java +++ b/api/src/com/cloud/network/vpc/VpcOffering.java @@ -52,7 +52,7 @@ public enum State { boolean isDefault(); /** - * @return service offering id used by VPC virutal router + * @return service offering id used by VPC virtual router */ Long getServiceOfferingId(); diff --git a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java index decf8c437330..5426d181e70f 100644 --- a/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java +++ b/api/src/com/cloud/network/vpn/RemoteAccessVpnService.java @@ -33,7 +33,7 @@ public interface RemoteAccessVpnService { RemoteAccessVpn createRemoteAccessVpn(long vpnServerAddressId, String ipRange, boolean openFirewall, Boolean forDisplay) throws NetworkRuleConflictException; - boolean destroyRemoteAccessVpnForIp(long ipId, Account caller) throws ResourceUnavailableException; + boolean destroyRemoteAccessVpnForIp(long ipId, Account caller, boolean forceCleanup) throws ResourceUnavailableException; RemoteAccessVpn startRemoteAccessVpn(long vpnServerAddressId, boolean openFirewall) throws ResourceUnavailableException; @@ -43,7 +43,7 @@ public interface RemoteAccessVpnService { List listVpnUsers(long vpnOwnerId, String userName); - boolean applyVpnUsers(long vpnOwnerId, String userName); + boolean applyVpnUsers(long vpnOwnerId, String userName) throws ResourceUnavailableException; Pair, Integer> searchForRemoteAccessVpns(ListRemoteAccessVpnsCmd cmd); diff --git a/api/src/com/cloud/offering/NetworkOffering.java b/api/src/com/cloud/offering/NetworkOffering.java index f1ef69c2f68e..33b165bfa298 100644 --- a/api/src/com/cloud/offering/NetworkOffering.java +++ b/api/src/com/cloud/offering/NetworkOffering.java @@ -38,7 +38,7 @@ public enum State { } public enum Detail { - InternalLbProvider, PublicLbProvider + InternalLbProvider, PublicLbProvider, servicepackageuuid, servicepackagedescription, PromiscuousMode, MacAddressChanges, ForgedTransmits, RelatedNetworkOffering } public final static String SystemPublicNetwork = "System-Public-Network"; @@ -57,6 +57,10 @@ public enum Detail { public final static String DefaultIsolatedNetworkOfferingForVpcNetworks = "DefaultIsolatedNetworkOfferingForVpcNetworks"; public final static String DefaultIsolatedNetworkOfferingForVpcNetworksNoLB = "DefaultIsolatedNetworkOfferingForVpcNetworksNoLB"; public final static String DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB = "DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB"; + public final static String DefaultL2NetworkOffering = "DefaultL2NetworkOffering"; + public final static String DefaultL2NetworkOfferingVlan = "DefaultL2NetworkOfferingVlan"; + public final static String DefaultL2NetworkOfferingConfigDrive = "DefaultL2NetworkOfferingConfigDrive"; + public final static String DefaultL2NetworkOfferingConfigDriveVlan = "DefaultL2NetworkOfferingConfigDriveVlan"; /** * @return name for the network offering. @@ -78,6 +82,8 @@ public enum Detail { */ Integer getMulticastRateMbps(); + boolean getForVpc(); + TrafficType getTrafficType(); boolean getSpecifyVlan(); @@ -131,4 +137,8 @@ public enum Detail { boolean isKeepAliveEnabled(); boolean getSupportsStrechedL2(); + + boolean getSupportsPublicAccess(); + + String getServicePackage(); } diff --git a/api/src/com/cloud/offering/ServiceOffering.java b/api/src/com/cloud/offering/ServiceOffering.java index 05ae2375c178..196d2b4eb47b 100644 --- a/api/src/com/cloud/offering/ServiceOffering.java +++ b/api/src/com/cloud/offering/ServiceOffering.java @@ -31,6 +31,7 @@ public interface ServiceOffering extends DiskOffering, InfrastructureEntity, Int public static final String routerDefaultOffUniqueName = "Cloud.Com-SoftwareRouter"; public static final String elbVmDefaultOffUniqueName = "Cloud.Com-ElasticLBVm"; public static final String internalLbVmDefaultOffUniqueName = "Cloud.Com-InternalLBVm"; + // leaving cloud.com references as these are identifyers and no real world addresses (check against DB) public enum StorageType { local, shared diff --git a/api/src/com/cloud/org/Cluster.java b/api/src/com/cloud/org/Cluster.java index 90fcb5729e48..4079c88dfde3 100644 --- a/api/src/com/cloud/org/Cluster.java +++ b/api/src/com/cloud/org/Cluster.java @@ -16,13 +16,11 @@ // under the License. package com.cloud.org; -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.api.InternalIdentity; - import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.org.Managed.ManagedState; +import org.apache.cloudstack.kernel.Partition; -public interface Cluster extends Grouping, InternalIdentity, Identity { +public interface Cluster extends Grouping, Partition { public static enum ClusterType { CloudManaged, ExternalManaged; }; diff --git a/api/src/com/cloud/resource/ResourceService.java b/api/src/com/cloud/resource/ResourceService.java index 7050b97e0feb..854b53591d63 100644 --- a/api/src/com/cloud/resource/ResourceService.java +++ b/api/src/com/cloud/resource/ResourceService.java @@ -53,7 +53,7 @@ public interface ResourceService { Host reconnectHost(ReconnectHostCmd cmd); /** - * We will automatically create a cloud.com cluster to attach to the external cluster and return a hyper host to perform + * We will automatically create an Apache CloudStack cluster to attach to the external cluster and return a hyper host to perform * host related operation within the cluster * * @param cmd diff --git a/api/src/com/cloud/resource/ResourceState.java b/api/src/com/cloud/resource/ResourceState.java index 5d2c962f989a..d952afa0b7dd 100644 --- a/api/src/com/cloud/resource/ResourceState.java +++ b/api/src/com/cloud/resource/ResourceState.java @@ -93,6 +93,7 @@ public static String[] toString(ResourceState... states) { s_fsm.addTransition(ResourceState.Enabled, Event.InternalCreated, ResourceState.Enabled); s_fsm.addTransition(ResourceState.Enabled, Event.Disable, ResourceState.Disabled); s_fsm.addTransition(ResourceState.Enabled, Event.AdminAskMaintenace, ResourceState.PrepareForMaintenance); + s_fsm.addTransition(ResourceState.Enabled, Event.InternalEnterMaintenance, ResourceState.Maintenance); s_fsm.addTransition(ResourceState.Disabled, Event.Enable, ResourceState.Enabled); s_fsm.addTransition(ResourceState.Disabled, Event.Disable, ResourceState.Disabled); s_fsm.addTransition(ResourceState.Disabled, Event.InternalCreated, ResourceState.Disabled); @@ -109,5 +110,7 @@ public static String[] toString(ResourceState... states) { s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.InternalEnterMaintenance, ResourceState.Maintenance); s_fsm.addTransition(ResourceState.ErrorInMaintenance, Event.AdminCancelMaintenance, ResourceState.Enabled); s_fsm.addTransition(ResourceState.Error, Event.InternalCreated, ResourceState.Error); + s_fsm.addTransition(ResourceState.Disabled, Event.DeleteHost, ResourceState.Disabled); + } } diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index 449e1085239c..56f36a8d90ca 100644 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -390,7 +390,7 @@ public interface ManagementService { * @return Ternary, List, Map> List of all Hosts to which a VM * can be migrated, list of Hosts with enough capacity and hosts requiring storage motion for migration. */ - Ternary, Integer>, List, Map> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize); + Ternary, Integer>, List, Map> listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize, String keyword); /** * List storage pools for live migrating of a volume. The API returns list of all pools in the cluster to which the diff --git a/api/src/com/cloud/server/ResourceTag.java b/api/src/com/cloud/server/ResourceTag.java index ce09fdf955b0..0bd5d734e30e 100644 --- a/api/src/com/cloud/server/ResourceTag.java +++ b/api/src/com/cloud/server/ResourceTag.java @@ -38,6 +38,7 @@ public enum ResourceObjectType { SecurityGroupRule(true, false), PublicIpAddress(true, true), Project(true, false), + Account(true, false), Vpc(true, true), NetworkACL(true, true), StaticRoute(true, false), @@ -57,7 +58,10 @@ public enum ResourceObjectType { AutoScaleVmGroup(false, true), LBStickinessPolicy(false, true), LBHealthCheckPolicy(false, true), - SnapshotPolicy(false, true); + SnapshotPolicy(false, true), + GuestOs(false, true), + NetworkOffering(false, true), + VpcOffering(true, false); ResourceObjectType(boolean resourceTagsSupport, boolean resourceMetadataSupport) { diff --git a/api/src/com/cloud/storage/ImageStore.java b/api/src/com/cloud/storage/ImageStore.java index ec693c4e4939..c019b17421dd 100644 --- a/api/src/com/cloud/storage/ImageStore.java +++ b/api/src/com/cloud/storage/ImageStore.java @@ -41,4 +41,11 @@ public interface ImageStore extends Identity, InternalIdentity { * @return data store protocol */ String getProtocol(); + + /** + * + * @return uri + */ + String getUrl(); + } diff --git a/api/src/com/cloud/storage/Snapshot.java b/api/src/com/cloud/storage/Snapshot.java index 7f0168efd8e3..2f3a59541d9a 100644 --- a/api/src/com/cloud/storage/Snapshot.java +++ b/api/src/com/cloud/storage/Snapshot.java @@ -16,14 +16,13 @@ // under the License. package com.cloud.storage; -import java.util.Date; - +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.utils.fsm.StateObject; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.api.Identity; import org.apache.cloudstack.api.InternalIdentity; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.utils.fsm.StateObject; +import java.util.Date; public interface Snapshot extends ControlledEntity, Identity, InternalIdentity, StateObject { public enum Type { @@ -67,6 +66,10 @@ enum Event { CreateRequested, OperationNotPerformed, BackupToSecondary, BackedupToSecondary, DestroyRequested, CopyingRequested, OperationSucceeded, OperationFailed } + enum LocationType { + PRIMARY, SECONDARY + } + public static final long MANUAL_POLICY_ID = 0L; @Override @@ -76,6 +79,8 @@ enum Event { String getName(); + long getSnapshotId(); + Date getCreated(); Type getRecurringType(); @@ -89,4 +94,5 @@ enum Event { short getsnapshotType(); + LocationType getLocationType(); // This type is in reference to the location where the snapshot resides (ex. primary storage, archive on secondary storage, etc.) } diff --git a/api/src/com/cloud/storage/Storage.java b/api/src/com/cloud/storage/Storage.java index 25ae5ca4dc92..9093dc34f148 100644 --- a/api/src/com/cloud/storage/Storage.java +++ b/api/src/com/cloud/storage/Storage.java @@ -113,36 +113,44 @@ public static enum TemplateType { SYSTEM, /* routing, system vm template */ BUILTIN, /* buildin template */ PERHOST, /* every host has this template, don't need to install it in secondary storage */ - USER /* User supplied template/iso */ + USER, /* User supplied template/iso */ + DATADISK, /* Template corresponding to a datadisk(non root disk) present in an OVA */ + ISODISK /* Template corresponding to a iso (non root disk) present in an OVA */ } public static enum StoragePoolType { - Filesystem(false), // local directory - NetworkFilesystem(true), // NFS - IscsiLUN(true), // shared LUN, with a clusterfs overlay - Iscsi(true), // for e.g., ZFS Comstar - ISO(false), // for iso image - LVM(false), // XenServer local LVM SR - CLVM(true), - RBD(true), // http://libvirt.org/storage.html#StorageBackendRBD - SharedMountPoint(true), - VMFS(true), // VMware VMFS storage - PreSetup(true), // for XenServer, Storage Pool is set up by customers. - EXT(false), // XenServer local EXT SR - OCFS2(true), - SMB(true), - Gluster(true), - ManagedNFS(true); - - boolean shared; - - StoragePoolType(boolean shared) { + Filesystem(false, true), // local directory + NetworkFilesystem(true, true), // NFS + IscsiLUN(true, false), // shared LUN, with a clusterfs overlay + Iscsi(true, false), // for e.g., ZFS Comstar + ISO(false, false), // for iso image + LVM(false, false), // XenServer local LVM SR + CLVM(true, false), + RBD(true, true), // http://libvirt.org/storage.html#StorageBackendRBD + SharedMountPoint(true, false), + VMFS(true, true), // VMware VMFS storage + PreSetup(true, true), // for XenServer, Storage Pool is set up by customers. + EXT(false, true), // XenServer local EXT SR + OCFS2(true, false), + SMB(true, false), + Gluster(true, false), + ManagedNFS(true, false); + + private final boolean shared; + private final boolean overprovisioning; + + StoragePoolType(boolean shared, boolean overprovisioning) { this.shared = shared; + this.overprovisioning = overprovisioning; } public boolean isShared() { return shared; } + + public boolean supportsOverProvisioning() { + return overprovisioning; + } } public static List getNonSharedStoragePoolTypes() { diff --git a/api/src/com/cloud/storage/StoragePool.java b/api/src/com/cloud/storage/StoragePool.java index 8e03c3348f3a..3a2d3bd8feec 100644 --- a/api/src/com/cloud/storage/StoragePool.java +++ b/api/src/com/cloud/storage/StoragePool.java @@ -104,4 +104,6 @@ public interface StoragePool extends Identity, InternalIdentity { boolean isInMaintenance(); Hypervisor.HypervisorType getHypervisor(); + + boolean isManaged(); } diff --git a/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java b/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java index d40eafe7a15c..f43d5331222f 100644 --- a/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java +++ b/api/src/com/cloud/storage/VMTemplateStorageResourceAssoc.java @@ -22,7 +22,7 @@ public interface VMTemplateStorageResourceAssoc extends InternalIdentity { public static enum Status { - UNKNOWN, DOWNLOAD_ERROR, NOT_DOWNLOADED, DOWNLOAD_IN_PROGRESS, DOWNLOADED, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS, CREATING, CREATED + UNKNOWN, DOWNLOAD_ERROR, NOT_DOWNLOADED, DOWNLOAD_IN_PROGRESS, DOWNLOADED, ABANDONED, UPLOADED, NOT_UPLOADED, UPLOAD_ERROR, UPLOAD_IN_PROGRESS, CREATING, CREATED, BYPASSED } String getInstallPath(); diff --git a/api/src/com/cloud/storage/Volume.java b/api/src/com/cloud/storage/Volume.java index f70ead937189..133a59df8a6d 100644 --- a/api/src/com/cloud/storage/Volume.java +++ b/api/src/com/cloud/storage/Volume.java @@ -51,7 +51,8 @@ enum State { NotUploaded("The volume entry is just created in DB, not yet uploaded"), UploadInProgress("Volume upload is in progress"), UploadError("Volume upload encountered some error"), - UploadAbandoned("Volume upload is abandoned since the upload was never initiated within a specificed time"); + UploadAbandoned("Volume upload is abandoned since the upload was never initiated within a specificed time"), + Attaching("The volume is attaching to a VM"); String _description; @@ -118,6 +119,9 @@ public String getDescription() { s_fsm.addTransition(new StateMachine2.Transition(UploadInProgress, Event.OperationTimeout, UploadError, null)); s_fsm.addTransition(new StateMachine2.Transition(UploadError, Event.DestroyRequested, Destroy, null)); s_fsm.addTransition(new StateMachine2.Transition(UploadAbandoned, Event.DestroyRequested, Destroy, null)); + s_fsm.addTransition(new StateMachine2.Transition(Ready, Event.AttachRequested, Attaching, null)); + s_fsm.addTransition(new StateMachine2.Transition(Attaching, Event.OperationSucceeded, Ready, null)); + s_fsm.addTransition(new StateMachine2.Transition(Attaching, Event.OperationFailed, Ready, null)); } } @@ -139,6 +143,7 @@ enum Event { DestroyRequested, ExpungingRequested, ResizeRequested, + AttachRequested, OperationTimeout; } diff --git a/api/src/com/cloud/storage/VolumeApiService.java b/api/src/com/cloud/storage/VolumeApiService.java index 7832b892072d..cf13cd671a91 100644 --- a/api/src/com/cloud/storage/VolumeApiService.java +++ b/api/src/com/cloud/storage/VolumeApiService.java @@ -18,6 +18,8 @@ */ package com.cloud.storage; +import java.net.MalformedURLException; + import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd; import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd; import org.apache.cloudstack.api.command.user.volume.DetachVolumeCmd; @@ -26,13 +28,10 @@ import org.apache.cloudstack.api.command.user.volume.MigrateVolumeCmd; import org.apache.cloudstack.api.command.user.volume.ResizeVolumeCmd; import org.apache.cloudstack.api.command.user.volume.UploadVolumeCmd; +import org.apache.cloudstack.api.response.GetUploadParamsResponse; -import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceAllocationException; import com.cloud.user.Account; -import org.apache.cloudstack.api.response.GetUploadParamsResponse; - -import java.net.MalformedURLException; public interface VolumeApiService { /** @@ -70,23 +69,22 @@ public interface VolumeApiService { /** * Uploads the volume to secondary storage * - * @param UploadVolumeCmdByAdmin cmd - * * @return Volume object */ - Volume uploadVolume(UploadVolumeCmd cmd) throws ResourceAllocationException; + Volume uploadVolume(UploadVolumeCmd cmd) throws ResourceAllocationException; GetUploadParamsResponse uploadVolume(GetUploadParamsForVolumeCmd cmd) throws ResourceAllocationException, MalformedURLException; - boolean deleteVolume(long volumeId, Account caller) throws ConcurrentOperationException; + boolean deleteVolume(long volumeId, Account caller); Volume attachVolumeToVM(AttachVolumeCmd command); - Volume detachVolumeFromVM(DetachVolumeCmd cmmd); + Volume detachVolumeFromVM(DetachVolumeCmd cmd); - Snapshot takeSnapshot(Long volumeId, Long policyId, Long snapshotId, Account account, boolean quiescevm) throws ResourceAllocationException; + Snapshot takeSnapshot(Long volumeId, Long policyId, Long snapshotId, Account account, boolean quiescevm, Snapshot.LocationType locationType, boolean asyncBackup) + throws ResourceAllocationException; - Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName) throws ResourceAllocationException; + Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName, Snapshot.LocationType locationType) throws ResourceAllocationException; Volume updateVolume(long volumeId, String path, String state, Long storageId, Boolean displayVolume, String customId, long owner, String chainInfo); @@ -94,14 +92,14 @@ public interface VolumeApiService { * Extracts the volume to a particular location. * * @param cmd - * the command specifying url (where the volume needs to be extracted to), zoneId (zone where the volume - * exists), + * the command specifying url (where the volume needs to be extracted to), zoneId (zone where the volume exists), * id (the id of the volume) - * */ String extractVolume(ExtractVolumeCmd cmd); boolean isDisplayResourceEnabled(Long id); void updateDisplay(Volume volume, Boolean displayVolume); + + Snapshot allocSnapshotForVm(Long vmId, Long volumeId, String snapshotName) throws ResourceAllocationException; } diff --git a/api/src/com/cloud/storage/VolumeStats.java b/api/src/com/cloud/storage/VolumeStats.java index 70c0b17f84ab..81fa7eabdd76 100644 --- a/api/src/com/cloud/storage/VolumeStats.java +++ b/api/src/com/cloud/storage/VolumeStats.java @@ -20,5 +20,10 @@ public interface VolumeStats { /** * @return bytes used by the volume */ - public long getBytesUsed(); + long getVirtualSize(); + + /** + * @return bytes allocated + */ + long getPhysicalSize(); } diff --git a/api/src/com/cloud/storage/snapshot/SnapshotApiService.java b/api/src/com/cloud/storage/snapshot/SnapshotApiService.java index fb48f4774546..eb1393543c0c 100644 --- a/api/src/com/cloud/storage/snapshot/SnapshotApiService.java +++ b/api/src/com/cloud/storage/snapshot/SnapshotApiService.java @@ -86,7 +86,7 @@ public interface SnapshotApiService { boolean deleteSnapshotPolicies(DeleteSnapshotPoliciesCmd cmd); - Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName) throws ResourceAllocationException; + Snapshot allocSnapshot(Long volumeId, Long policyId, String snapshotName, Snapshot.LocationType locationType) throws ResourceAllocationException; /** * Create a snapshot of a volume @@ -108,5 +108,7 @@ public interface SnapshotApiService { Snapshot revertSnapshot(Long snapshotId); + Snapshot backupSnapshotFromVmSnapshot(Long snapshotId, Long vmId, Long volumeId, Long vmSnapshotId); + SnapshotPolicy updateSnapshotPolicy(UpdateSnapshotPolicyCmd updateSnapshotPolicyCmd); } diff --git a/api/src/com/cloud/template/VirtualMachineTemplate.java b/api/src/com/cloud/template/VirtualMachineTemplate.java index 54d61a4597bd..564f3b987bec 100644 --- a/api/src/com/cloud/template/VirtualMachineTemplate.java +++ b/api/src/com/cloud/template/VirtualMachineTemplate.java @@ -133,6 +133,8 @@ public enum TemplateFilter { boolean isDynamicallyScalable(); + Long getParentTemplateId(); + long getUpdatedCount(); void incrUpdatedCount(); diff --git a/api/src/com/cloud/user/AccountService.java b/api/src/com/cloud/user/AccountService.java index 959a710d6d9f..9683d9fa3303 100644 --- a/api/src/com/cloud/user/AccountService.java +++ b/api/src/com/cloud/user/AccountService.java @@ -21,6 +21,7 @@ import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; +import org.apache.cloudstack.api.command.admin.user.GetUserKeysCmd; import org.apache.cloudstack.api.command.admin.user.RegisterCmd; import com.cloud.domain.Domain; @@ -28,6 +29,7 @@ import com.cloud.offering.DiskOffering; import com.cloud.offering.ServiceOffering; + public interface AccountService { /** @@ -124,6 +126,8 @@ User createUser(String userName, String password, String firstName, String lastN void checkAccess(Account account, DiskOffering dof) throws PermissionDeniedException; + void checkAccess(User user, ControlledEntity entity); + void checkAccess(Account account, AccessType accessType, boolean sameOwner, String apiName, ControlledEntity... entities) throws PermissionDeniedException; @@ -136,4 +140,5 @@ void checkAccess(Account account, AccessType accessType, boolean sameOwner, Stri */ UserAccount getUserAccountById(Long userId); + public Map getKeys(GetUserKeysCmd cmd); } diff --git a/api/src/com/cloud/user/ResourceLimitService.java b/api/src/com/cloud/user/ResourceLimitService.java index fef16da942f6..2df9b037e3d1 100644 --- a/api/src/com/cloud/user/ResourceLimitService.java +++ b/api/src/com/cloud/user/ResourceLimitService.java @@ -23,9 +23,13 @@ import com.cloud.configuration.ResourceLimit; import com.cloud.domain.Domain; import com.cloud.exception.ResourceAllocationException; +import org.apache.cloudstack.framework.config.ConfigKey; public interface ResourceLimitService { + static final ConfigKey ResourceCountCheckInterval = new ConfigKey("Advanced", Long.class, "resourcecount.check.interval", "300", + "Time (in seconds) to wait before running resource recalculation and fixing task. Default is 300 seconds, Setting this to 0 disables execution of the task", false); + /** * Updates an existing resource limit with the specified details. If a limit doesn't exist, will create one. * @@ -64,11 +68,11 @@ public interface ResourceLimitService { * TODO * @param domainId * TODO - * @param type + * @param resourceType * TODO * @return a list of limits that match the criteria */ - public List searchForLimits(Long id, Long accountId, Long domainId, Integer type, Long startIndex, Long pageSizeVal); + public List searchForLimits(Long id, Long accountId, Long domainId, ResourceType resourceType, Long startIndex, Long pageSizeVal); /** * Finds the resource limit for a specified account and type. If the account has an infinite limit, will check @@ -100,6 +104,14 @@ public interface ResourceLimitService { */ public long findCorrectResourceLimitForDomain(Domain domain, ResourceType type); + /** + * Finds the default resource limit for a specified type. + * + * @param resourceType + * @return resource limit + */ + public long findDefaultResourceLimitForDomain(ResourceType resourceType); + /** * Increments the resource count * diff --git a/api/src/com/cloud/user/User.java b/api/src/com/cloud/user/User.java index 0ecdcfa58d4e..c3ac66c69790 100644 --- a/api/src/com/cloud/user/User.java +++ b/api/src/com/cloud/user/User.java @@ -22,8 +22,9 @@ public interface User extends OwnedBy, InternalIdentity { + // UNKNOWN and NATIVE can be used interchangeably public enum Source { - LDAP, SAML2, SAML2DISABLED, UNKNOWN + LDAP, SAML2, SAML2DISABLED, UNKNOWN, NATIVE } public static final long UID_SYSTEM = 1; diff --git a/api/src/com/cloud/vm/DiskProfile.java b/api/src/com/cloud/vm/DiskProfile.java index a37f7aaf57b6..d9097748363b 100644 --- a/api/src/com/cloud/vm/DiskProfile.java +++ b/api/src/com/cloud/vm/DiskProfile.java @@ -139,6 +139,10 @@ public Long getTemplateId() { return templateId; } + public void setTemplateId(Long templateId) { + this.templateId = templateId; + } + /** * @return disk offering id that the disk is based on. */ diff --git a/api/src/com/cloud/vm/NicExtraDhcpOption.java b/api/src/com/cloud/vm/NicExtraDhcpOption.java new file mode 100644 index 000000000000..f5d9fa0c6b46 --- /dev/null +++ b/api/src/com/cloud/vm/NicExtraDhcpOption.java @@ -0,0 +1,41 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.vm; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +public interface NicExtraDhcpOption extends InternalIdentity, Identity { + + /** + * Returns the nic id for which the DHCP option applies + * @return nic id + */ + long getNicId(); + + /** + * Returns the DHCP option code + * @return + */ + int getCode(); + + /** + * Returns the Dhcp value + * @return + */ + String getValue(); +} diff --git a/api/src/com/cloud/vm/NicProfile.java b/api/src/com/cloud/vm/NicProfile.java index 58e05124c89f..6ef9cfe5db16 100644 --- a/api/src/com/cloud/vm/NicProfile.java +++ b/api/src/com/cloud/vm/NicProfile.java @@ -114,6 +114,11 @@ public NicProfile(String requestedIPv4, String requestedIPv6) { this.requestedIPv6 = requestedIPv6; } + public NicProfile(String requestedIPv4, String requestedIPv6, String requestedMacAddress) { + this(requestedIPv4, requestedIPv6); + this.macAddress = requestedMacAddress; + } + public NicProfile(ReservationStrategy strategy, String iPv4Address, String macAddress, String iPv4gateway, String iPv4netmask) { format = AddressFormat.Ip4; this.iPv4Address = iPv4Address; diff --git a/api/src/com/cloud/vm/NicSecondaryIp.java b/api/src/com/cloud/vm/NicSecondaryIp.java index fb90dd351f68..2856e0aea756 100644 --- a/api/src/com/cloud/vm/NicSecondaryIp.java +++ b/api/src/com/cloud/vm/NicSecondaryIp.java @@ -32,8 +32,12 @@ public interface NicSecondaryIp extends ControlledEntity, Identity, InternalIden long getNicId(); + void setNicId(long nicId); + String getIp4Address(); + String getIp6Address(); + long getNetworkId(); long getVmId(); diff --git a/api/src/com/cloud/vm/UserVmService.java b/api/src/com/cloud/vm/UserVmService.java index 54206ed23952..74090ec40e65 100644 --- a/api/src/com/cloud/vm/UserVmService.java +++ b/api/src/com/cloud/vm/UserVmService.java @@ -50,6 +50,7 @@ import com.cloud.host.Host; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network.IpAddresses; +import com.cloud.offering.DiskOffering; import com.cloud.offering.ServiceOffering; import com.cloud.storage.StoragePool; import com.cloud.template.VirtualMachineTemplate; @@ -75,14 +76,14 @@ public interface UserVmService { /** * Destroys one virtual machine * - * @param userId - * the id of the user performing the action * @param vmId * the id of the virtual machine. + * @param expunge + * indicates if vm should be expunged * @throws ConcurrentOperationException * @throws ResourceUnavailableException */ - UserVm destroyVm(long vmId) throws ResourceUnavailableException, ConcurrentOperationException; + UserVm destroyVm(long vmId, boolean expunge) throws ResourceUnavailableException, ConcurrentOperationException; /** * Resets the password of a virtual machine. @@ -194,7 +195,14 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E * @param memory * @param cpuNumber * @param customId + * @param dhcpOptionMap + * - Maps the dhcp option code and the dhcp value to the network uuid * @return UserVm object if successful. + * @param dataDiskTemplateToDiskOfferingMap + * - Datadisk template to Disk offering Map + * an optional parameter that creates additional data disks for the virtual machine + * For each of the templates in the map, a data disk will be created from the corresponding + * disk offering obtained from the map * * @throws InsufficientCapacityException * if there is insufficient capacity to deploy the VM. @@ -208,7 +216,8 @@ UserVm startVirtualMachine(StartVMCmd cmd) throws StorageUnavailableException, E UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData, String sshKeyPair, Map requestedIps, IpAddresses defaultIp, Boolean displayVm, String keyboard, - List affinityGroupIdList, Map customParameter, String customId) throws InsufficientCapacityException, + List affinityGroupIdList, Map customParameter, String customId, Map> dhcpOptionMap, + Map dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException; /** @@ -267,6 +276,13 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s * @param memory * @param cpuNumber * @param customId + * @param dhcpOptionMap + * - Maps the dhcp option code and the dhcp value to the network uuid + * @param dataDiskTemplateToDiskOfferingMap + * - Datadisk template to Disk offering Map + * an optional parameter that creates additional data disks for the virtual machine + * For each of the templates in the map, a data disk will be created from the corresponding + * disk offering obtained from the map * @return UserVm object if successful. * * @throws InsufficientCapacityException @@ -281,7 +297,8 @@ UserVm createBasicSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering s UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, List securityGroupIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData, String sshKeyPair, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, - List affinityGroupIdList, Map customParameters, String customId) throws InsufficientCapacityException, + List affinityGroupIdList, Map customParameters, String customId, Map> dhcpOptionMap, + Map dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException; /** @@ -338,6 +355,13 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin * @param memory * @param cpuNumber * @param customId + * @param dhcpOptionMap + * - Map that maps the DhcpOption code and their value on the Network uuid + * @param dataDiskTemplateToDiskOfferingMap + * - Datadisk template to Disk offering Map + * an optional parameter that creates additional data disks for the virtual machine + * For each of the templates in the map, a data disk will be created from the corresponding + * disk offering obtained from the map * @return UserVm object if successful. * * @throws InsufficientCapacityException @@ -352,7 +376,7 @@ UserVm createAdvancedSecurityGroupVirtualMachine(DataCenter zone, ServiceOfferin UserVm createAdvancedVirtualMachine(DataCenter zone, ServiceOffering serviceOffering, VirtualMachineTemplate template, List networkIdList, Account owner, String hostName, String displayName, Long diskOfferingId, Long diskSize, String group, HypervisorType hypervisor, HTTPMethod httpmethod, String userData, String sshKeyPair, Map requestedIps, IpAddresses defaultIps, Boolean displayVm, String keyboard, List affinityGroupIdList, - Map customParameters, String customId) + Map customParameters, String customId, Map> dhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, StorageUnavailableException, ResourceAllocationException; @@ -482,4 +506,8 @@ UserVm upgradeVirtualMachine(ScaleVMCmd cmd) throws ResourceUnavailableException */ public boolean isDisplayResourceEnabled(Long vmId); + void collectVmDiskStatistics(UserVm userVm); + + void collectVmNetworkStatistics (UserVm userVm); + } diff --git a/api/src/com/cloud/vm/VirtualMachine.java b/api/src/com/cloud/vm/VirtualMachine.java index b45ac7c9be9f..a46edd78f447 100644 --- a/api/src/com/cloud/vm/VirtualMachine.java +++ b/api/src/com/cloud/vm/VirtualMachine.java @@ -16,26 +16,24 @@ // under the License. package com.cloud.vm; -import java.util.Arrays; -import java.util.Date; -import java.util.Map; - -import org.apache.cloudstack.acl.ControlledEntity; -import org.apache.cloudstack.api.Displayable; -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.api.InternalIdentity; - import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.utils.fsm.StateMachine2; import com.cloud.utils.fsm.StateMachine2.Transition; import com.cloud.utils.fsm.StateMachine2.Transition.Impact; import com.cloud.utils.fsm.StateObject; +import org.apache.cloudstack.acl.ControlledEntity; +import org.apache.cloudstack.api.Displayable; +import org.apache.cloudstack.kernel.Partition; + +import java.util.Arrays; +import java.util.Date; +import java.util.Map; /** * VirtualMachine describes the properties held by a virtual machine * */ -public interface VirtualMachine extends RunningOn, ControlledEntity, Identity, InternalIdentity, Displayable, StateObject { +public interface VirtualMachine extends RunningOn, ControlledEntity, Partition, Displayable, StateObject { public enum PowerState { PowerUnknown, @@ -214,6 +212,7 @@ public enum Event { public enum Type { User(false), DomainRouter(true), ConsoleProxy(true), SecondaryStorageVm(true), ElasticIpVm(true), ElasticLoadBalancerVm(true), InternalLoadBalancerVm(true), + NetScalerVm(true), /* * UserBareMetal is only used for selecting VirtualMachineGuru, there is no diff --git a/api/src/com/cloud/vm/VirtualMachineProfile.java b/api/src/com/cloud/vm/VirtualMachineProfile.java index ed02dcb9c670..977e27eb14f2 100644 --- a/api/src/com/cloud/vm/VirtualMachineProfile.java +++ b/api/src/com/cloud/vm/VirtualMachineProfile.java @@ -56,6 +56,7 @@ public static class Param { public static final Param VmSshPubKey = new Param("VmSshPubKey"); public static final Param ControlNic = new Param("ControlNic"); public static final Param ReProgramGuestNetworks = new Param("RestartNetwork"); + public static final Param RollingRestart = new Param("RollingRestart"); public static final Param PxeSeverType = new Param("PxeSeverType"); public static final Param HaTag = new Param("HaTag"); public static final Param HaOperation = new Param("HaOperation"); @@ -173,4 +174,6 @@ public boolean equals(Object obj) { Float getMemoryOvercommitRatio(); + boolean isRollingRestart(); + } diff --git a/api/src/com/cloud/vm/VmDetailConstants.java b/api/src/com/cloud/vm/VmDetailConstants.java index d34afc13a169..f24c4f587c40 100644 --- a/api/src/com/cloud/vm/VmDetailConstants.java +++ b/api/src/com/cloud/vm/VmDetailConstants.java @@ -23,4 +23,8 @@ public interface VmDetailConstants { public static final String NESTED_VIRTUALIZATION_FLAG = "nestedVirtualizationFlag"; public static final String HYPERVISOR_TOOLS_VERSION = "hypervisortoolsversion"; public static final String DATA_DISK_CONTROLLER = "dataDiskController"; + public static final String SVGA_VRAM_SIZE = "svga.vramSize"; + public static final String CPU_NUMBER = "cpuNumber"; + public static final String CPU_SPEED = "cpuSpeed"; + public static final String MEMORY = "memory"; } diff --git a/api/src/com/cloud/vm/VmNetworkStats.java b/api/src/com/cloud/vm/VmNetworkStats.java new file mode 100644 index 000000000000..7f96fdfdfac0 --- /dev/null +++ b/api/src/com/cloud/vm/VmNetworkStats.java @@ -0,0 +1,26 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.vm; + +public interface VmNetworkStats { + // vm related network stats + + public long getBytesSent(); + + public long getBytesReceived(); + +} diff --git a/api/src/com/cloud/vm/snapshot/VMSnapshot.java b/api/src/com/cloud/vm/snapshot/VMSnapshot.java index 7713b2052ace..c398e583fae5 100644 --- a/api/src/com/cloud/vm/snapshot/VMSnapshot.java +++ b/api/src/com/cloud/vm/snapshot/VMSnapshot.java @@ -102,4 +102,6 @@ enum Event { @Override public long getAccountId(); + + public long getServiceOfferingId(); } diff --git a/api/src/com/cloud/vm/snapshot/VMSnapshotService.java b/api/src/com/cloud/vm/snapshot/VMSnapshotService.java index 12767b3db158..e376265acfa4 100644 --- a/api/src/com/cloud/vm/snapshot/VMSnapshotService.java +++ b/api/src/com/cloud/vm/snapshot/VMSnapshotService.java @@ -36,7 +36,7 @@ public interface VMSnapshotService { VMSnapshot getVMSnapshotById(Long id); - VMSnapshot creatVMSnapshot(Long vmId, Long vmSnapshotId, Boolean quiescevm); + VMSnapshot createVMSnapshot(Long vmId, Long vmSnapshotId, Boolean quiescevm); VMSnapshot allocVMSnapshot(Long vmId, String vsDisplayName, String vsDescription, Boolean snapshotMemory) throws ResourceAllocationException; @@ -46,4 +46,11 @@ UserVm revertToSnapshot(Long vmSnapshotId) throws InsufficientServerCapacityExce ConcurrentOperationException; VirtualMachine getVMBySnapshotId(Long id); + + /** + * Delete vm snapshots only from database. Introduced as a Vmware optimization in which vm snapshots are deleted when + * the vm gets deleted on hypervisor (no need to delete each vm snapshot before deleting vm, just mark them as deleted on DB) + * @param id vm id + */ + boolean deleteVMSnapshotsFromDB(Long vmId); } diff --git a/api/src/org/apache/cloudstack/acl/RoleService.java b/api/src/org/apache/cloudstack/acl/RoleService.java index 59eef51e782f..6130c62a7d45 100644 --- a/api/src/org/apache/cloudstack/acl/RoleService.java +++ b/api/src/org/apache/cloudstack/acl/RoleService.java @@ -17,36 +17,64 @@ package org.apache.cloudstack.acl; -import org.apache.cloudstack.framework.config.ConfigKey; - import java.util.List; +import org.apache.cloudstack.acl.RolePermission.Permission; +import org.apache.cloudstack.framework.config.ConfigKey; + public interface RoleService { ConfigKey EnableDynamicApiChecker = new ConfigKey<>("Advanced", Boolean.class, "dynamic.apichecker.enabled", "false", - "If set to true, this enables the dynamic role-based api access checker and disables the default static role-based api access checker.", - true); + "If set to true, this enables the dynamic role-based api access checker and disables the default static role-based api access checker.", true); boolean isEnabled(); - Role findRole(final Long id); - Role createRole(final String name, final RoleType roleType, final String description); - boolean updateRole(final Role role, final String name, final RoleType roleType, final String description); - boolean deleteRole(final Role role); - RolePermission findRolePermission(final Long id); - RolePermission findRolePermissionByUuid(final String uuid); + /** + * Searches for a role with the given ID. If the ID is null or less than zero, this method will return null. + * This method will also return null if no role is found with the provided ID. + * Moreover, we will check if the requested role is of 'Admin' type; roles with 'Admin' type should only be visible to 'root admins'. + * Therefore, if a non-'root admin' user tries to search for an 'Admin' role, this method will return null. + */ + Role findRole(Long id); + + Role createRole(String name, RoleType roleType, String description); + + Role updateRole(Role role, String name, RoleType roleType, String description); + + boolean deleteRole(Role role); + + RolePermission findRolePermission(Long id); + + RolePermission findRolePermissionByUuid(String uuid); + + RolePermission createRolePermission(Role role, Rule rule, Permission permission, String description); - RolePermission createRolePermission(final Role role, final Rule rule, final RolePermission.Permission permission, final String description); /** * updateRolePermission updates the order/position of an role permission * @param role The role whose permissions needs to be re-ordered * @param newOrder The new list of ordered role permissions */ - boolean updateRolePermission(final Role role, final List newOrder); - boolean deleteRolePermission(final RolePermission rolePermission); + boolean updateRolePermission(Role role, List newOrder); + boolean updateRolePermission(Role role, RolePermission rolePermission, Permission permission); + + boolean deleteRolePermission(RolePermission rolePermission); + + /** + * List all roles configured in the database. Roles that have the type {@link RoleType#Admin} will not be shown for users that are not 'root admin'. + */ List listRoles(); - List findRolesByName(final String name); - List findRolesByType(final RoleType roleType); - List findAllPermissionsBy(final Long roleId); + + /** + * Find all roles that have the giving {@link String} as part of their name. + * If the user calling the method is not a 'root admin', roles of type {@link RoleType#Admin} wil lbe removed of the returned list. + */ + List findRolesByName(String name); + + /** + * Find all roles by {@link RoleType}. If the role type is {@link RoleType#Admin}, the calling account must be a root admin, otherwise we return an empty list. + */ + List findRolesByType(RoleType roleType); + + List findAllPermissionsBy(Long roleId); } diff --git a/api/src/org/apache/cloudstack/alert/AlertService.java b/api/src/org/apache/cloudstack/alert/AlertService.java index ad711ecea4e8..26c3f3cf3ab4 100644 --- a/api/src/org/apache/cloudstack/alert/AlertService.java +++ b/api/src/org/apache/cloudstack/alert/AlertService.java @@ -16,12 +16,12 @@ // under the License. package org.apache.cloudstack.alert; -import java.util.HashSet; -import java.util.Set; - import com.cloud.capacity.Capacity; import com.cloud.exception.InvalidParameterValueException; +import java.util.HashSet; +import java.util.Set; + public interface AlertService { public static class AlertType { private static Set defaultAlertTypes = new HashSet(); @@ -67,6 +67,8 @@ private AlertType(short type, String name, boolean isDefault) { public static final AlertType ALERT_TYPE_SYNC = new AlertType((short)27, "ALERT.TYPE.SYNC", true); public static final AlertType ALERT_TYPE_UPLOAD_FAILED = new AlertType((short)28, "ALERT.UPLOAD.FAILED", true); public static final AlertType ALERT_TYPE_OOBM_AUTH_ERROR = new AlertType((short)29, "ALERT.OOBM.AUTHERROR", true); + public static final AlertType ALERT_TYPE_HA_ACTION = new AlertType((short)30, "ALERT.HA.ACTION", true); + public static final AlertType ALERT_TYPE_CA_CERT = new AlertType((short)31, "ALERT.CA.CERT", true); public short getType() { return type; diff --git a/api/src/org/apache/cloudstack/annotation/Annotation.java b/api/src/org/apache/cloudstack/annotation/Annotation.java new file mode 100644 index 000000000000..90e371e5071d --- /dev/null +++ b/api/src/org/apache/cloudstack/annotation/Annotation.java @@ -0,0 +1,37 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.annotation; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +import java.util.Date; + +public interface Annotation extends InternalIdentity, Identity { + + String getAnnotation(); + + String getEntityUuid(); + + AnnotationService.EntityType getEntityType(); + + String getUserUuid(); + + Date getCreated(); + + Date getRemoved(); +} diff --git a/api/src/org/apache/cloudstack/annotation/AnnotationService.java b/api/src/org/apache/cloudstack/annotation/AnnotationService.java new file mode 100644 index 000000000000..769a753b587b --- /dev/null +++ b/api/src/org/apache/cloudstack/annotation/AnnotationService.java @@ -0,0 +1,49 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.annotation; + +import org.apache.cloudstack.api.command.admin.annotation.AddAnnotationCmd; +import org.apache.cloudstack.api.command.admin.annotation.ListAnnotationsCmd; +import org.apache.cloudstack.api.command.admin.annotation.RemoveAnnotationCmd; +import org.apache.cloudstack.api.response.AnnotationResponse; +import org.apache.cloudstack.api.response.ListResponse; + +public interface AnnotationService { + ListResponse searchForAnnotations(ListAnnotationsCmd cmd); + + AnnotationResponse addAnnotation(AddAnnotationCmd addAnnotationCmd); + AnnotationResponse addAnnotation(String text, EntityType type, String uuid); + + AnnotationResponse removeAnnotation(RemoveAnnotationCmd removeAnnotationCmd); + + enum EntityType { + HOST("host"), DOMAIN("domain"), VM("vm_instance"); + private String tableName; + + EntityType(String tableName) { + this.tableName = tableName; + } + static public boolean contains(String representation) { + try { + /* EntityType tiep = */ valueOf(representation); + return true; + } catch (IllegalArgumentException iae) { + return false; + } + } + } +} diff --git a/api/src/org/apache/cloudstack/api/APICommand.java b/api/src/org/apache/cloudstack/api/APICommand.java index d451e4b10a3a..c559be081165 100644 --- a/api/src/org/apache/cloudstack/api/APICommand.java +++ b/api/src/org/apache/cloudstack/api/APICommand.java @@ -16,8 +16,6 @@ // under the License. package org.apache.cloudstack.api; -import static java.lang.annotation.ElementType.TYPE; - import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @@ -25,9 +23,12 @@ import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.ResponseObject.ResponseView; +import static java.lang.annotation.ElementType.TYPE; + @Retention(RetentionPolicy.RUNTIME) @Target({TYPE}) public @interface APICommand { + Class responseObject(); String name() default ""; diff --git a/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java b/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java index df63d7471581..c82f4789367c 100644 --- a/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java +++ b/api/src/org/apache/cloudstack/api/AbstractGetUploadParamsCmd.java @@ -18,15 +18,15 @@ */ package org.apache.cloudstack.api; +import java.net.URL; +import java.util.UUID; + import org.apache.cloudstack.api.response.DomainResponse; import org.apache.cloudstack.api.response.GetUploadParamsResponse; import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.log4j.Logger; -import java.net.URL; -import java.util.UUID; - public abstract class AbstractGetUploadParamsCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(AbstractGetUploadParamsCmd.class.getName()); @@ -42,7 +42,7 @@ public abstract class AbstractGetUploadParamsCmd extends BaseCmd { + "to be hosted on") private Long zoneId; - @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this volume/template") + @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this volume/template " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION) private String checksum; @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.") diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index 1d0b4a3756a7..03ee7fc1b20b 100644 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -21,10 +21,13 @@ public class ApiConstants { public static final String ACCOUNTS = "accounts"; public static final String ACCOUNT_TYPE = "accounttype"; public static final String ACCOUNT_ID = "accountid"; + public static final String ACTIVITY = "activity"; public static final String ADDRESS = "address"; public static final String ALGORITHM = "algorithm"; public static final String ALLOCATED_ONLY = "allocatedonly"; + public static final String ANNOTATION = "annotation"; public static final String API_KEY = "apikey"; + public static final String ASYNC_BACKUP = "asyncbackup"; public static final String USER_API_KEY = "userapikey"; public static final String APPLIED = "applied"; public static final String LIST_LB_VMIPS = "lbvmips"; @@ -35,12 +38,15 @@ public class ApiConstants { public static final String BIND_PASSWORD = "bindpass"; public static final String BYTES_READ_RATE = "bytesreadrate"; public static final String BYTES_WRITE_RATE = "byteswriterate"; + public static final String BYPASS_VLAN_OVERLAP_CHECK = "bypassvlanoverlapcheck"; public static final String CATEGORY = "category"; public static final String CAN_REVERT = "canrevert"; + public static final String CA_CERTIFICATES = "cacertificates"; public static final String CERTIFICATE = "certificate"; public static final String CERTIFICATE_CHAIN = "certchain"; public static final String CERTIFICATE_FINGERPRINT = "fingerprint"; public static final String CERTIFICATE_ID = "certid"; + public static final String CSR = "csr"; public static final String PRIVATE_KEY = "privatekey"; public static final String DOMAIN_SUFFIX = "domainsuffix"; public static final String DNS_SEARCH_ORDER = "dnssearchorder"; @@ -48,11 +54,13 @@ public class ApiConstants { public static final String CIDR = "cidr"; public static final String IP6_CIDR = "ip6cidr"; public static final String CIDR_LIST = "cidrlist"; + public static final String DEST_CIDR_LIST = "destcidrlist"; public static final String CLEANUP = "cleanup"; - public static final String MAKEREDUNDANTE = "makeredundant"; + public static final String MAKEREDUNDANT = "makeredundant"; public static final String CLUSTER_ID = "clusterid"; public static final String CLUSTER_NAME = "clustername"; public static final String CLUSTER_TYPE = "clustertype"; + public static final String CN = "cn"; public static final String COMMAND = "command"; public static final String CMD_EVENT_TYPE = "cmdeventtype"; public static final String COMPONENT = "component"; @@ -71,14 +79,20 @@ public class ApiConstants { public static final String MIN_IOPS = "miniops"; public static final String MAX_IOPS = "maxiops"; public static final String HYPERVISOR_SNAPSHOT_RESERVE = "hypervisorsnapshotreserve"; + public static final String DATADISK_OFFERING_LIST = "datadiskofferinglist"; public static final String DESCRIPTION = "description"; public static final String DESTINATION_ZONE_ID = "destzoneid"; public static final String DETAILS = "details"; public static final String DEVICE_ID = "deviceid"; + public static final String DIRECT_DOWNLOAD = "directdownload"; public static final String DISK_OFFERING_ID = "diskofferingid"; public static final String DISK_SIZE = "disksize"; + public static final String UTILIZATION = "utilization"; public static final String DRIVER = "driver"; public static final String ROOT_DISK_SIZE = "rootdisksize"; + public static final String DHCP_OPTIONS_NETWORK_LIST = "dhcpoptionsnetworklist"; + public static final String DHCP_OPTIONS = "dhcpoptions"; + public static final String DHCP_PREFIX = "dhcp:"; public static final String DISPLAY_NAME = "displayname"; public static final String DISPLAY_NETWORK = "displaynetwork"; public static final String DISPLAY_NIC = "displaynic"; @@ -94,6 +108,7 @@ public class ApiConstants { public static final String DOMAIN_ID = "domainid"; public static final String DOMAIN__ID = "domainId"; public static final String DURATION = "duration"; + public static final String ELIGIBLE = "eligible"; public static final String EMAIL = "email"; public static final String END_DATE = "enddate"; public static final String END_IP = "endip"; @@ -101,12 +116,18 @@ public class ApiConstants { public static final String END_PORT = "endport"; public static final String ENTRY_TIME = "entrytime"; public static final String EXPIRES = "expires"; + public static final String EXTRA_DHCP_OPTION = "extradhcpoption"; + public static final String EXTRA_DHCP_OPTION_NAME = "extradhcpoptionname"; + public static final String EXTRA_DHCP_OPTION_CODE = "extradhcpoptioncode"; + public static final String EXTRA_DHCP_OPTION_VALUE = "extradhcpvalue"; + public static final String FENCE = "fence"; public static final String FETCH_LATEST = "fetchlatest"; public static final String FIRSTNAME = "firstname"; public static final String FORCED = "forced"; public static final String FORCED_DESTROY_LOCAL_STORAGE = "forcedestroylocalstorage"; public static final String FORMAT = "format"; public static final String FOR_VIRTUAL_NETWORK = "forvirtualnetwork"; + public static final String FOR_SYSTEM_VMS = "forsystemvms"; public static final String GATEWAY = "gateway"; public static final String IP6_GATEWAY = "ip6gateway"; public static final String GROUP = "group"; @@ -119,6 +140,9 @@ public class ApiConstants { public static final String GUEST_CIDR_ADDRESS = "guestcidraddress"; public static final String GUEST_VLAN_RANGE = "guestvlanrange"; public static final String HA_ENABLE = "haenable"; + public static final String HA_PROVIDER = "haprovider"; + public static final String HA_STATE = "hastate"; + public static final String HEALTH = "health"; public static final String HOST_ID = "hostid"; public static final String HOST_NAME = "hostname"; public static final String HYPERVISOR = "hypervisor"; @@ -131,6 +155,7 @@ public class ApiConstants { public static final String INTERNAL_DNS1 = "internaldns1"; public static final String INTERNAL_DNS2 = "internaldns2"; public static final String INTERVAL_TYPE = "intervaltype"; + public static final String LOCATION_TYPE = "locationtype"; public static final String IOPS_READ_RATE = "iopsreadrate"; public static final String IOPS_WRITE_RATE = "iopswriterate"; public static final String IP_ADDRESS = "ipaddress"; @@ -161,6 +186,7 @@ public class ApiConstants { public static final String LUN = "lun"; public static final String LBID = "lbruleid"; public static final String MAX = "max"; + public static final String MAC_ADDRESS = "macaddress"; public static final String MAX_SNAPS = "maxsnaps"; public static final String MEMORY = "memory"; public static final String MODE = "mode"; @@ -182,7 +208,9 @@ public class ApiConstants { public static final String OUTOFBANDMANAGEMENT_POWERSTATE = "outofbandmanagementpowerstate"; public static final String OUTOFBANDMANAGEMENT_ENABLED = "outofbandmanagementenabled"; public static final String PARAMS = "params"; + public static final String PARENT_ID = "parentid"; public static final String PARENT_DOMAIN_ID = "parentdomainid"; + public static final String PARENT_TEMPLATE_ID = "parenttemplateid"; public static final String PASSWORD = "password"; public static final String SHOULD_UPDATE_PASSWORD = "update_passwd_on_host"; public static final String NEW_PASSWORD = "new_password"; @@ -190,6 +218,7 @@ public class ApiConstants { public static final String SSHKEY_ENABLED = "sshkeyenabled"; public static final String PATH = "path"; public static final String POD_ID = "podid"; + public static final String POD_NAME = "podname"; public static final String POD_IDS = "podids"; public static final String POLICY_ID = "policyid"; public static final String PORT = "port"; @@ -214,8 +243,11 @@ public class ApiConstants { public static final String PUBLIC_END_PORT = "publicendport"; public static final String PUBLIC_ZONE = "publiczone"; public static final String RECEIVED_BYTES = "receivedbytes"; + public static final String RECONNECT = "reconnect"; + public static final String RECOVER = "recover"; public static final String REQUIRES_HVM = "requireshvm"; public static final String RESOURCE_TYPE = "resourcetype"; + public static final String RESOURCE_TYPE_NAME = "resourcetypename"; public static final String RESPONSE = "response"; public static final String REVERTABLE = "revertable"; public static final String REGISTERED = "registered"; @@ -223,6 +255,7 @@ public class ApiConstants { public static final String SCHEDULE = "schedule"; public static final String SCOPE = "scope"; public static final String SECRET_KEY = "usersecretkey"; + public static final String SECONDARY_IP = "secondaryip"; public static final String SINCE = "since"; public static final String KEY = "key"; public static final String SEARCH_BASE = "searchbase"; @@ -232,6 +265,7 @@ public class ApiConstants { public static final String SECURITY_GROUP_ID = "securitygroupid"; public static final String SENT = "sent"; public static final String SENT_BYTES = "sentbytes"; + public static final String SERIAL = "serial"; public static final String SERVICE_OFFERING_ID = "serviceofferingid"; public static final String SESSIONKEY = "sessionkey"; public static final String SHOW_CAPACITIES = "showcapacities"; @@ -239,18 +273,21 @@ public class ApiConstants { public static final String SIGNATURE = "signature"; public static final String SIGNATURE_VERSION = "signatureversion"; public static final String SIZE = "size"; + public static final String SNAPSHOT = "snapshot"; public static final String SNAPSHOT_ID = "snapshotid"; public static final String SNAPSHOT_POLICY_ID = "snapshotpolicyid"; public static final String SNAPSHOT_TYPE = "snapshottype"; public static final String SNAPSHOT_QUIESCEVM = "quiescevm"; public static final String SOURCE_ZONE_ID = "sourcezoneid"; public static final String START_DATE = "startdate"; + public static final String START_ID = "startid"; public static final String START_IP = "startip"; public static final String START_IPV6 = "startipv6"; public static final String START_PORT = "startport"; public static final String STATE = "state"; public static final String STATUS = "status"; public static final String STORAGE_TYPE = "storagetype"; + public static final String STORAGE_POLICY = "storagepolicy"; public static final String STORAGE_MOTION_ENABLED = "storagemotionenabled"; public static final String STORAGE_CAPABILITIES = "storagecapabilities"; public static final String SYSTEM_VM_TYPE = "systemvmtype"; @@ -261,6 +298,7 @@ public class ApiConstants { public static final String ISO_ID = "isoid"; public static final String TIMEOUT = "timeout"; public static final String TIMEZONE = "timezone"; + public static final String TIMEZONEOFFSET = "timezoneoffset"; public static final String TYPE = "type"; public static final String TRUST_STORE = "truststore"; public static final String TRUST_STORE_PASSWORD = "truststorepass"; @@ -272,6 +310,7 @@ public class ApiConstants { public static final String USERNAME = "username"; public static final String USER_SECURITY_GROUP_LIST = "usersecuritygrouplist"; public static final String USE_VIRTUAL_NETWORK = "usevirtualnetwork"; + public static final String Update_IN_SEQUENCE ="updateinsequence"; public static final String VALUE = "value"; public static final String VIRTUAL_MACHINE_ID = "virtualmachineid"; public static final String VIRTUAL_MACHINE_IDS = "virtualmachineids"; @@ -279,12 +318,14 @@ public class ApiConstants { public static final String VIRTUAL_MACHINE_COUNT = "virtualmachinecount"; public static final String USAGE_ID = "usageid"; public static final String USAGE_TYPE = "usagetype"; + public static final String INCLUDE_TAGS = "includetags"; public static final String VLAN = "vlan"; public static final String VLAN_RANGE = "vlanrange"; public static final String REMOVE_VLAN = "removevlan"; public static final String VLAN_ID = "vlanid"; public static final String ISOLATED_PVLAN = "isolatedpvlan"; + public static final String ISOLATION_URI = "isolationuri"; public static final String VM_AVAILABLE = "vmavailable"; public static final String VM_LIMIT = "vmlimit"; public static final String VM_TOTAL = "vmtotal"; @@ -299,6 +340,7 @@ public class ApiConstants { public static final String COUNT = "count"; public static final String TRAFFIC_TYPE = "traffictype"; public static final String NETWORK_OFFERING_ID = "networkofferingid"; + public static final String TIER_NETWORK_OFFERINGS = "tiernetworkofferings"; public static final String NETWORK_IDS = "networkids"; public static final String NETWORK_ID = "networkid"; public static final String NIC_ID = "nicid"; @@ -342,6 +384,7 @@ public class ApiConstants { public static final String ZONE_TOKEN = "zonetoken"; public static final String DHCP_PROVIDER = "dhcpprovider"; public static final String RESULT = "success"; + public static final String RESUME = "resume"; public static final String LUN_ID = "lunId"; public static final String IQN = "iqn"; public static final String AGGREGATE_NAME = "aggregatename"; @@ -368,6 +411,7 @@ public class ApiConstants { public static final String ROLE_NAME = "rolename"; public static final String PERMISSION = "permission"; public static final String RULE = "rule"; + public static final String RULE_ID = "ruleid"; public static final String RULE_ORDER = "ruleorder"; public static final String USER = "user"; public static final String ACTIVE_ONLY = "activeonly"; @@ -385,6 +429,7 @@ public class ApiConstants { public static final String CAPACITY_IOPS = "capacityiops"; public static final String NETWORK_SPEED = "networkspeed"; public static final String BROADCAST_DOMAIN_RANGE = "broadcastdomainrange"; + public static final String BROADCAST_URI = "broadcasturi"; public static final String ISOLATION_METHOD = "isolationmethod"; public static final String ISOLATION_METHODS = "isolationmethods"; public static final String PHYSICAL_NETWORK_ID = "physicalnetworkid"; @@ -511,6 +556,8 @@ public class ApiConstants { public static final String NICIRA_NVP_DEVICE_NAME = "niciradevicename"; public static final String NICIRA_NVP_GATEWAYSERVICE_UUID = "l3gatewayserviceuuid"; public static final String NICIRA_NVP_L2_GATEWAYSERVICE_UUID = "l2gatewayserviceuuid"; + public static final String NSX_LOGICAL_SWITCH = "nsxlogicalswitch"; + public static final String NSX_LOGICAL_SWITCH_PORT = "nsxlogicalswitchport"; public static final String S3_ACCESS_KEY = "accesskey"; public static final String S3_SECRET_KEY = "secretkey"; public static final String S3_END_POINT = "endpoint"; @@ -613,6 +660,7 @@ public class ApiConstants { public static final String IAM_ALLOW_DENY = "permission"; public static final String ENTITY_TYPE = "entitytype"; public static final String ENTITY_ID = "entityid"; + public static final String EXTERNAL_ID = "externalid"; public static final String ACCESS_TYPE = "accesstype"; public static final String RESOURCE_DETAILS = "resourcedetails"; @@ -633,20 +681,40 @@ public class ApiConstants { public static final String REMAININGCAPACITY = "remainingcapacity"; public static final String MAXCAPACITY = "maxcapacity"; public static final String DISTRIBUTED_VPC_ROUTER = "distributedvpcrouter"; + public static final String REDUNDANT_ROUTER = "redundantrouter"; public static final String REDUNDANT_VPC_ROUTER = "redundantvpcrouter"; public static final String READ_ONLY = "readonly"; public static final String SUPPORTS_REGION_LEVEL_VPC = "supportsregionLevelvpc"; public static final String SUPPORTS_STRECHED_L2_SUBNET = "supportsstrechedl2subnet"; + public static final String SUPPORTS_PUBLIC_ACCESS = "supportspublicaccess"; public static final String REGION_LEVEL_VPC = "regionlevelvpc"; public static final String STRECHED_L2_SUBNET = "strechedl2subnet"; + public static final String NETWORK_NAME = "networkname"; public static final String NETWORK_SPANNED_ZONES = "zonesnetworkspans"; public static final String METADATA = "metadata"; public static final String PHYSICAL_SIZE = "physicalsize"; public static final String OVM3_POOL = "ovm3pool"; public static final String OVM3_CLUSTER = "ovm3cluster"; public static final String OVM3_VIP = "ovm3vip"; + public static final String CLEAN_UP_DETAILS = "cleanupdetails"; + public static final String VIRTUAL_SIZE = "virtualsize"; + public static final String NETSCALER_CONTROLCENTER_ID = "netscalercontrolcenterid"; + public static final String NETSCALER_SERVICEPACKAGE_ID = "netscalerservicepackageid"; + public static final String ZONE_ID_LIST = "zoneids"; + public static final String DESTINATION_ZONE_ID_LIST = "destzoneids"; public static final String ADMIN = "admin"; + public static final String CHECKSUM_PARAMETER_PREFIX_DESCRIPTION = "The parameter containing the checksum will be considered a MD5sum if it is not prefixed\n" + + " and just a plain ascii/utf8 representation of a hexadecimal string. If it is required to\n" + + " use another algorithm the hexadecimal string is to be prefixed with a string of the form,\n" + + " \"{}\", not including the double quotes. In this is the exact string\n" + + " representing the java supported algorithm, i.e. MD5 or SHA-256. Note that java does not\n" + + " contain an algorithm called SHA256 or one called sha-256, only SHA-256."; + + public static final String HAS_ANNOTATION = "hasannotation"; + public static final String LAST_ANNOTATED = "lastannotated"; + public static final String LDAP_DOMAIN = "ldapdomain"; + public enum HostDetails { all, capacity, events, stats, min; @@ -655,4 +723,8 @@ public enum HostDetails { public enum VMDetails { all, group, nics, stats, secgrp, tmpl, servoff, diskoff, iso, volume, min, affgrp; } + + public enum DomainDetails { + all, resource, min; + } } diff --git a/api/src/org/apache/cloudstack/api/ApiServerService.java b/api/src/org/apache/cloudstack/api/ApiServerService.java index aeeb7b613cab..382b48a5e026 100644 --- a/api/src/org/apache/cloudstack/api/ApiServerService.java +++ b/api/src/org/apache/cloudstack/api/ApiServerService.java @@ -24,7 +24,7 @@ import com.cloud.exception.CloudAuthenticationException; public interface ApiServerService { - public boolean verifyRequest(Map requestParameters, Long userId) throws ServerApiException; + public boolean verifyRequest(Map requestParameters, Long userId, InetAddress remoteAddress) throws ServerApiException; public Long fetchDomainId(String domainUUID); @@ -43,7 +43,4 @@ public ResponseObject loginUser(HttpSession session, String username, String pas public Class getCmdClass(String cmdName); - public String getJSONContentType(); - - public boolean isSecureSessionCookieEnabled(); } diff --git a/api/src/org/apache/cloudstack/api/BaseCmd.java b/api/src/org/apache/cloudstack/api/BaseCmd.java index 5be75196d39a..37dbeaab841a 100644 --- a/api/src/org/apache/cloudstack/api/BaseCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseCmd.java @@ -17,32 +17,6 @@ package org.apache.cloudstack.api; -import java.lang.reflect.Field; -import java.text.DateFormat; -import java.text.SimpleDateFormat; -import java.util.ArrayList; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.regex.Pattern; - -import javax.inject.Inject; - -import com.cloud.utils.HttpUtils; -import org.apache.cloudstack.acl.RoleService; -import org.apache.log4j.Logger; - -import org.apache.cloudstack.acl.RoleType; -import org.apache.cloudstack.affinity.AffinityGroupService; -import org.apache.cloudstack.alert.AlertService; -import org.apache.cloudstack.context.CallContext; -import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; -import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService; -import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService; -import org.apache.cloudstack.query.QueryService; -import org.apache.cloudstack.usage.UsageService; - import com.cloud.configuration.ConfigurationService; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; @@ -78,11 +52,35 @@ import com.cloud.user.AccountService; import com.cloud.user.DomainService; import com.cloud.user.ResourceLimitService; +import com.cloud.utils.HttpUtils; import com.cloud.utils.ReflectUtil; import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.UUIDManager; import com.cloud.vm.UserVmService; import com.cloud.vm.snapshot.VMSnapshotService; +import org.apache.cloudstack.acl.RoleService; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.affinity.AffinityGroupService; +import org.apache.cloudstack.alert.AlertService; +import org.apache.cloudstack.annotation.AnnotationService; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.network.element.InternalLoadBalancerElementService; +import org.apache.cloudstack.network.lb.ApplicationLoadBalancerService; +import org.apache.cloudstack.network.lb.InternalLoadBalancerVMService; +import org.apache.cloudstack.query.QueryService; +import org.apache.cloudstack.usage.UsageService; +import org.apache.log4j.Logger; + +import javax.inject.Inject; +import java.lang.reflect.Field; +import java.text.DateFormat; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.regex.Pattern; public abstract class BaseCmd { private static final Logger s_logger = Logger.getLogger(BaseCmd.class.getName()); @@ -93,6 +91,7 @@ public abstract class BaseCmd { public static Pattern newInputDateFormat = Pattern.compile("[\\d]+-[\\d]+-[\\d]+ [\\d]+:[\\d]+:[\\d]+"); private static final DateFormat s_outputFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ"); protected static final Map, List> fieldsForCmdClass = new HashMap, List>(); + public static enum HTTPMethod { GET, POST, PUT, DELETE } @@ -192,6 +191,8 @@ public static enum CommandType { public AlertService _alertSvc; @Inject public UUIDManager _uuidMgr; + @Inject + public AnnotationService annotationService; public abstract void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException; diff --git a/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java b/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java index 5dc2b06f4c71..36767345a4bf 100644 --- a/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java +++ b/api/src/org/apache/cloudstack/api/BaseUpdateTemplateOrIsoCmd.java @@ -17,7 +17,6 @@ package org.apache.cloudstack.api; import org.apache.log4j.Logger; - import org.apache.cloudstack.api.command.user.iso.UpdateIsoCmd; import org.apache.cloudstack.api.response.GuestOSResponse; import org.apache.cloudstack.api.response.TemplateResponse; @@ -73,6 +72,11 @@ public abstract class BaseUpdateTemplateOrIsoCmd extends BaseCmd { @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61") protected Map details; + @Parameter(name = ApiConstants.CLEAN_UP_DETAILS, + type = CommandType.BOOLEAN, + description = "optional boolean field, which indicates if details should be cleaned up or not (if set to true, details removed for this resource, details field ignored; if false or not set, no action)") + private Boolean cleanupDetails; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -129,4 +133,8 @@ public Map getDetails() { Collection paramsCollection = this.details.values(); return (Map) (paramsCollection.toArray())[0]; } -} \ No newline at end of file + + public boolean isCleanupDetails(){ + return cleanupDetails == null ? false : cleanupDetails.booleanValue(); + } +} diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index 1cc5bc8ae012..4fb248cd1055 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -20,6 +20,7 @@ import java.util.EnumSet; import java.util.List; import java.util.Map; +import java.util.Set; import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupResponse; @@ -237,6 +238,8 @@ public interface ResponseGenerator { VlanIpRangeResponse createVlanIpRangeResponse(Vlan vlan); + VlanIpRangeResponse createVlanIpRangeResponse(Class subClass, Vlan vlan); + IPAddressResponse createIPAddressResponse(ResponseView view, IpAddress ipAddress); GuestVlanRangeResponse createDedicatedGuestVlanRangeResponse(GuestVlan result); @@ -283,6 +286,8 @@ public interface ResponseGenerator { Host findHostById(Long hostId); + DiskOffering findDiskOfferingById(Long diskOfferingId); + VpnUsersResponse createVpnUserResponse(VpnUser user); RemoteAccessVpnResponse createRemoteAccessVpnResponse(RemoteAccessVpn vpn); @@ -305,7 +310,11 @@ public interface ResponseGenerator { TemplateResponse createTemplateUpdateResponse(ResponseView view, VirtualMachineTemplate result); - List createTemplateResponses(ResponseView view, VirtualMachineTemplate result, Long zoneId, boolean readyOnly); + List createTemplateResponses(ResponseView view, VirtualMachineTemplate result, + Long zoneId, boolean readyOnly); + + List createTemplateResponses(ResponseView view, VirtualMachineTemplate result, + List zoneIds, boolean readyOnly); List createCapacityResponse(List result, DecimalFormat format); @@ -424,6 +433,10 @@ public interface ResponseGenerator { UsageRecordResponse createUsageResponse(Usage usageRecord); + UsageRecordResponse createUsageResponse(Usage usageRecord, Map> resourceTagResponseMap); + + public Map> getUsageResourceTags(); + TrafficMonitorResponse createTrafficMonitorResponse(Host trafficMonitor); VMSnapshotResponse createVMSnapshotResponse(VMSnapshot vmSnapshot); diff --git a/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java b/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java index 2e1fbd6f8614..074df8d5fc22 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/account/CreateAccountCmd.java @@ -184,7 +184,7 @@ public long getEntityOwnerId() { @Override public void execute() { validateParams(); - CallContext.current().setEventDetails("Account Name: " + getAccountName() + ", Domain Id:" + getDomainId()); + CallContext.current().setEventDetails("Account Name: " + getUsername() + ", Domain Id:" + getDomainId()); UserAccount userAccount = _accountService.createUserAccount(getUsername(), getPassword(), getFirstName(), getLastName(), getEmail(), getTimeZone(), getAccountName(), getAccountType(), getRoleId(), getDomainId(), getNetworkDomain(), getDetails(), getAccountUUID(), getUserUUID()); diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java index 994573d17966..87f0288dd01d 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/acl/CreateRoleCmd.java @@ -34,7 +34,7 @@ requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", authorized = {RoleType.Admin}) -public class CreateRoleCmd extends BaseCmd { +public class CreateRoleCmd extends RoleCmd { public static final String APINAME = "createRole"; ///////////////////////////////////////////////////// @@ -83,16 +83,6 @@ public long getEntityOwnerId() { return Account.ACCOUNT_ID_SYSTEM; } - private void setupResponse(final Role role) { - final RoleResponse response = new RoleResponse(); - response.setId(role.getUuid()); - response.setRoleName(role.getName()); - response.setRoleType(role.getRoleType()); - response.setResponseName(getCommandName()); - response.setObjectName("role"); - setResponseObject(response); - } - @Override public void execute() { CallContext.current().setEventDetails("Role: " + getRoleName() + ", type:" + getRoleType() + ", description: " + getRoleDescription()); diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java index 5cf870bfc063..9025e89a93cd 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/acl/ListRolesCmd.java @@ -17,31 +17,25 @@ package org.apache.cloudstack.api.command.admin.acl; -import com.cloud.exception.ConcurrentOperationException; -import com.cloud.exception.InsufficientCapacityException; -import com.cloud.exception.NetworkRuleConflictException; -import com.cloud.exception.ResourceAllocationException; -import com.cloud.exception.ResourceUnavailableException; -import com.cloud.user.Account; -import com.google.common.base.Strings; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; -import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.RoleResponse; +import org.apache.commons.lang3.StringUtils; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; +import com.cloud.user.Account; +import com.google.common.base.Strings; -@APICommand(name = ListRolesCmd.APINAME, description = "Lists dynamic roles in CloudStack", responseObject = RoleResponse.class, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, - since = "4.9.0", - authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin}) +@APICommand(name = ListRolesCmd.APINAME, description = "Lists dynamic roles in CloudStack", responseObject = RoleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", authorized = { + RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin}) public class ListRolesCmd extends BaseCmd { public static final String APINAME = "listRoles"; @@ -112,13 +106,13 @@ private void setupResponse(final List roles) { } @Override - public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { - final List roles; + public void execute() { + List roles; if (getId() != null && getId() > 0L) { roles = Collections.singletonList(roleService.findRole(getId())); - } else if (!Strings.isNullOrEmpty(getName())) { + } else if (StringUtils.isNotBlank(getName())) { roles = roleService.findRolesByName(getName()); - } else if (getRoleType() != null){ + } else if (getRoleType() != null) { roles = roleService.findRolesByType(getRoleType()); } else { roles = roleService.listRoles(); diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java new file mode 100644 index 000000000000..9054ff5fadaf --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/acl/RoleCmd.java @@ -0,0 +1,36 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.acl; + +import org.apache.cloudstack.acl.Role; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.response.RoleResponse; + +public abstract class RoleCmd extends BaseCmd { + + protected void setupResponse(final Role role) { + final RoleResponse response = new RoleResponse(); + response.setId(role.getUuid()); + response.setRoleName(role.getName()); + response.setRoleType(role.getRoleType()); + response.setDescription(role.getDescription()); + response.setResponseName(getCommandName()); + response.setObjectName("role"); + setResponseObject(response); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java index e17fc6f5714b..f9519aeec5a1 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRoleCmd.java @@ -22,21 +22,20 @@ import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; -import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.response.RoleResponse; -import org.apache.cloudstack.api.response.SuccessResponse; import org.apache.cloudstack.context.CallContext; -@APICommand(name = UpdateRoleCmd.APINAME, description = "Updates a role", responseObject = SuccessResponse.class, +@APICommand(name = UpdateRoleCmd.APINAME, description = "Updates a role", responseObject = RoleResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.9.0", authorized = {RoleType.Admin}) -public class UpdateRoleCmd extends BaseCmd { +public class UpdateRoleCmd extends RoleCmd { public static final String APINAME = "updateRole"; ///////////////////////////////////////////////////// @@ -100,9 +99,7 @@ public void execute() { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided"); } CallContext.current().setEventDetails("Role: " + getRoleName() + ", type:" + getRoleType() + ", description: " + getRoleDescription()); - boolean result = roleService.updateRole(role, getRoleName(), getRoleType(), getRoleDescription()); - SuccessResponse response = new SuccessResponse(getCommandName()); - response.setSuccess(result); - setResponseObject(response); + role = roleService.updateRole(role, getRoleName(), getRoleType(), getRoleDescription()); + setupResponse(role); } } diff --git a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java index 055265c5ccc8..045464eab79a 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/acl/UpdateRolePermissionCmd.java @@ -20,6 +20,7 @@ import com.cloud.user.Account; import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RolePermission; +import org.apache.cloudstack.acl.RolePermission.Permission; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiArgValidator; @@ -51,10 +52,18 @@ public class UpdateRolePermissionCmd extends BaseCmd { description = "ID of the role", validations = {ApiArgValidator.PositiveNumber}) private Long roleId; - @Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, required = true, entityType = RolePermissionResponse.class, + @Parameter(name = ApiConstants.RULE_ORDER, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = RolePermissionResponse.class, description = "The parent role permission uuid, use 0 to move this rule at the top of the list") private List rulePermissionOrder; + @Parameter(name = ApiConstants.RULE_ID, type = CommandType.UUID, entityType = RolePermissionResponse.class, + description = "Role permission rule id", since="4.11") + private Long ruleId; + + @Parameter(name = ApiConstants.PERMISSION, type = CommandType.STRING, + description = "Rule permission, can be: allow or deny", since="4.11") + private String rulePermission; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -67,6 +76,21 @@ public List getRulePermissionOrder() { return rulePermissionOrder; } + public Long getRuleId() { + return ruleId; + } + + public Permission getRulePermission() { + if (this.rulePermission == null) { + return null; + } + if (!this.rulePermission.equalsIgnoreCase(Permission.ALLOW.toString()) && + !this.rulePermission.equalsIgnoreCase(Permission.DENY.toString())) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Values for permission parameter should be: allow or deny"); + } + return rulePermission.equalsIgnoreCase(Permission.ALLOW.toString()) ? Permission.ALLOW : Permission.DENY; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -84,19 +108,35 @@ public long getEntityOwnerId() { @Override public void execute() { final Role role = roleService.findRole(getRoleId()); + boolean result = false; if (role == null) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid role id provided"); } - CallContext.current().setEventDetails("Reordering permissions for role id: " + role.getId()); - final List rolePermissionsOrder = new ArrayList<>(); - for (Long rolePermissionId : getRulePermissionOrder()) { - final RolePermission rolePermission = roleService.findRolePermission(rolePermissionId); + if (getRulePermissionOrder() != null) { + if (getRuleId() != null || getRulePermission() != null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Parameters permission and ruleid must be mutually exclusive with ruleorder"); + } + CallContext.current().setEventDetails("Reordering permissions for role id: " + role.getId()); + final List rolePermissionsOrder = new ArrayList<>(); + for (Long rolePermissionId : getRulePermissionOrder()) { + final RolePermission rolePermission = roleService.findRolePermission(rolePermissionId); + if (rolePermission == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Provided role permission(s) do not exist"); + } + rolePermissionsOrder.add(rolePermission); + } + result = roleService.updateRolePermission(role, rolePermissionsOrder); + } else if (getRuleId() != null && getRulePermission() != null) { + if (getRulePermissionOrder() != null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Parameters permission and ruleid must be mutually exclusive with ruleorder"); + } + RolePermission rolePermission = roleService.findRolePermission(getRuleId()); if (rolePermission == null) { - throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Provided role permission(s) do not exist"); + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid rule id provided"); } - rolePermissionsOrder.add(rolePermission); + CallContext.current().setEventDetails("Updating permission for rule id: " + getRuleId() + " to: " + getRulePermission().toString()); + result = roleService.updateRolePermission(role, rolePermission, getRulePermission()); } - boolean result = roleService.updateRolePermission(role, rolePermissionsOrder); SuccessResponse response = new SuccessResponse(getCommandName()); response.setSuccess(result); setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java new file mode 100644 index 000000000000..fea0ca64d9c4 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/address/AcquirePodIpCmdByAdmin.java @@ -0,0 +1,92 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.address; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.AcquirePodIpCmdResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; + +@APICommand(name = "acquirePodIpAddress", description = "Allocates IP addresses in respective Pod of a Zone", responseObject = AcquirePodIpCmdResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class AcquirePodIpCmdByAdmin extends BaseCmd { + + public static final Logger s_logger = Logger.getLogger(AcquirePodIpCmdByAdmin.class.getName()); + private static final String s_name = "acquirepodipaddress"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = true, description = "the ID of the zone") + private String zoneId; + + @Parameter(name = ApiConstants.POD_ID, type = CommandType.STRING, entityType = ZoneResponse.class, required = false, description = "Pod ID") + private String podId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + private String getZoneId() { + return zoneId; + } + + public String getPodId() { + return podId; + } + + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException { + AcquirePodIpCmdResponse podIp = null; + podIp = _networkService.allocatePodIp(_accountService.getAccount(getEntityOwnerId()), getZoneId(), getPodId()); + if (podIp != null) { + podIp.setResponseName(getCommandName()); + podIp.setObjectName(getCommandName()); + setResponseObject(podIp); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to assign IP address"); + } + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getAccountId(); + } + +} \ No newline at end of file diff --git a/api/src/org/apache/cloudstack/api/command/admin/address/ReleasePodIpCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/address/ReleasePodIpCmdByAdmin.java new file mode 100644 index 000000000000..750a85d57f2f --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/address/ReleasePodIpCmdByAdmin.java @@ -0,0 +1,79 @@ +//Licensed to the Apache Software Foundation (ASF) under one +//or more contributor license agreements. See the NOTICE file +//distributed with this work for additional information +//regarding copyright ownership. The ASF licenses this file +//to you under the Apache License, Version 2.0 (the +//"License"); you may not use this file except in compliance +//with the License. You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, +//software distributed under the License is distributed on an +//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +//KIND, either express or implied. See the License for the +//specific language governing permissions and limitations +//under the License. +package org.apache.cloudstack.api.command.admin.address; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.command.admin.vlan.ReleasePublicIpRangeCmd; +import org.apache.cloudstack.api.response.AcquireIPAddressResponse; +import org.apache.cloudstack.api.response.SuccessResponse; + +import com.cloud.user.Account; + +@APICommand(name = "releasePodIpAddress", description = "Releases a Pod IP back to the Pod", responseObject = SuccessResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class ReleasePodIpCmdByAdmin extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(ReleasePublicIpRangeCmd.class.getName()); + + private static final String s_name = "releasepodipresponse"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ID, type = CommandType.LONG, entityType = AcquireIPAddressResponse.class, required = true, description = "UUID of the Pod IP") + private Long id; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public long getId() { + return id; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + @Override + public void execute() { + boolean result = _networkService.releasePodIp(this); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + response.setDisplayText("IP is released sucessfully"); + setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to release Pod ip "); + } + } +} \ No newline at end of file diff --git a/api/src/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmd.java new file mode 100644 index 000000000000..07a73ce095f4 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmd.java @@ -0,0 +1,86 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.annotation; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.google.common.base.Preconditions; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.annotation.AnnotationService; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.AnnotationResponse; +import org.apache.cloudstack.context.CallContext; + +@APICommand(name = AddAnnotationCmd.APINAME, description = "add an annotation.", responseObject = AnnotationResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin}) +public class AddAnnotationCmd extends BaseCmd { + + public static final String APINAME = "addAnnotation"; + + @Parameter(name = ApiConstants.ANNOTATION, type = CommandType.STRING, description = "the annotation text") + private String annotation; + @Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "the entity type (only HOST is allowed atm)") + private String entityType; + @Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "the id of the entity to annotate") + private String entityUuid; + + public String getAnnotation() { + return annotation; + } + + protected void setEntityType(String newType) { + entityType = newType; + } + public AnnotationService.EntityType getEntityType() { + return AnnotationService.EntityType.valueOf(entityType); + } + + protected void setEntityUuid(String newUuid) { + entityUuid = newUuid; + } + public String getEntityUuid() { + return entityUuid; + } + + @Override + public void execute() + throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, + NetworkRuleConflictException { + Preconditions.checkNotNull(getEntityUuid(),"I have to have an entity to set an annotation on!"); + Preconditions.checkState(AnnotationService.EntityType.contains(entityType),(java.lang.String)"'%s' is ot a valid EntityType to put annotations on", entityType); + AnnotationResponse annotationResponse = annotationService.addAnnotation(this); + annotationResponse.setResponseName(getCommandName()); + this.setResponseObject(annotationResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getAccountId(); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/annotation/ListAnnotationsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/annotation/ListAnnotationsCmd.java new file mode 100644 index 000000000000..4657eb9e16a3 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/annotation/ListAnnotationsCmd.java @@ -0,0 +1,81 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.annotation; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.utils.StringUtils; +import com.google.common.base.Preconditions; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.BaseListCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.AnnotationResponse; +import org.apache.cloudstack.api.response.ListResponse; + +@APICommand(name = ListAnnotationsCmd.APINAME, description = "Lists annotations.", responseObject = AnnotationResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin}) +public class ListAnnotationsCmd extends BaseListCmd { + + public static final String APINAME = "listAnnotations"; + + @Parameter(name = ApiConstants.ID, type = CommandType.STRING, description = "the id of the annotation") + private String uuid; + @Parameter(name = ApiConstants.ENTITY_TYPE, type = CommandType.STRING, description = "the entity type") + private String entityType; + @Parameter(name = ApiConstants.ENTITY_ID, type = CommandType.STRING, description = "the id of the entity for which to show annotations") + private String entityUuid; + + public String getUuid() { + return uuid; + } + + public String getEntityType() { + return entityType; + } + + public String getEntityUuid() { + return entityUuid; + } + + @Override public void execute() + throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, + NetworkRuleConflictException { + // preconditions to check: + // if entity type is null entity uuid can not have a value + Preconditions.checkArgument(StringUtils.isNotBlank(entityType) ? ! StringUtils.isNotBlank(uuid) : true, + "I can search for an anotation on an entity or for a specific annotation, not both"); + // if uuid has a value entity type and entity uuid can not have a value + Preconditions.checkArgument(StringUtils.isNotBlank(uuid) ? entityType == null && entityUuid == null : true, + "I will either search for a specific annotation or for annotations on an entity, not both"); + + ListResponse response = annotationService.searchForAnnotations(this); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + response.setObjectName("annotations"); + } + + @Override public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/annotation/RemoveAnnotationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/annotation/RemoveAnnotationCmd.java new file mode 100644 index 000000000000..581ce45f2520 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/annotation/RemoveAnnotationCmd.java @@ -0,0 +1,64 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.annotation; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.AnnotationResponse; +import org.apache.cloudstack.context.CallContext; + +@APICommand(name = RemoveAnnotationCmd.APINAME, description = "remove an annotation.", responseObject = AnnotationResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, since = "4.11", authorized = {RoleType.Admin}) +public class RemoveAnnotationCmd extends BaseCmd { + + public static final String APINAME = "removeAnnotation"; + + @Parameter(name = ApiConstants.ID, type = CommandType.STRING, required = true, description = "the id of the annotation") + private String uuid; + + public String getUuid() { + return uuid; + } + + @Override + public void execute() + throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, + NetworkRuleConflictException { + AnnotationResponse annotationResponse = annotationService.removeAnnotation(this); + annotationResponse.setResponseName(getCommandName()); + this.setResponseObject(annotationResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getAccountId(); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/IssueCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/IssueCertificateCmd.java new file mode 100644 index 000000000000..8926829205f6 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ca/IssueCertificateCmd.java @@ -0,0 +1,162 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ca; + +import java.io.IOException; +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.CertificateResponse; +import org.apache.cloudstack.ca.CAManager; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.framework.ca.Certificate; +import org.apache.cloudstack.utils.security.CertUtils; +import org.apache.log4j.Logger; + +import com.cloud.event.EventTypes; +import com.google.common.base.Strings; + +@APICommand(name = IssueCertificateCmd.APINAME, + description = "Issues a client certificate using configured or provided CA plugin", + responseObject = CertificateResponse.class, + requestHasSensitiveInfo = true, + responseHasSensitiveInfo = true, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class IssueCertificateCmd extends BaseAsyncCmd { + private static final Logger LOG = Logger.getLogger(IssueCertificateCmd.class); + + public static final String APINAME = "issueCertificate"; + + @Inject + private CAManager caManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.CSR, type = BaseCmd.CommandType.STRING, description = "The certificate signing request (in pem format), if CSR is not provided then configured/provided options are considered", length = 65535) + private String csr; + + @Parameter(name = ApiConstants.DOMAIN, type = BaseCmd.CommandType.STRING, description = "Comma separated list of domains, the certificate should be issued for. When csr is not provided, the first domain is used as a subject/CN") + private String domains; + + @Parameter(name = ApiConstants.IP_ADDRESS, type = BaseCmd.CommandType.STRING, description = "Comma separated list of IP addresses, the certificate should be issued for") + private String addresses; + + @Parameter(name = ApiConstants.DURATION, type = CommandType.INTEGER, description = "Certificate validity duration in number of days, when not provided the default configured value will be used") + private Integer validityDuration; + + @Parameter(name = ApiConstants.PROVIDER, type = BaseCmd.CommandType.STRING, description = "Name of the CA service provider, otherwise the default configured provider plugin will be used") + private String provider; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public String getCsr() { + return csr; + } + + private List processList(final String string) { + final List list = new ArrayList<>(); + if (!Strings.isNullOrEmpty(string)) { + for (final String address: string.split(",")) { + list.add(address.trim()); + } + } + return list; + } + + public List getAddresses() { + return processList(addresses); + } + + public List getDomains() { + return processList(domains); + } + + public Integer getValidityDuration() { + return validityDuration; + } + + public String getProvider() { + return provider; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() { + if (Strings.isNullOrEmpty(getCsr()) && getDomains().isEmpty()) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Please provide the domains or the CSR, none of them are provided"); + } + final Certificate certificate = caManager.issueCertificate(getCsr(), getDomains(), getAddresses(), getValidityDuration(), getProvider()); + if (certificate == null) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to issue client certificate with given provider"); + } + + final CertificateResponse certificateResponse = new CertificateResponse(); + try { + certificateResponse.setCertificate(CertUtils.x509CertificateToPem(certificate.getClientCertificate())); + if (certificate.getPrivateKey() != null) { + certificateResponse.setPrivateKey(CertUtils.privateKeyToPem(certificate.getPrivateKey())); + } + if (certificate.getCaCertificates() != null) { + certificateResponse.setCaCertificate(CertUtils.x509CertificatesToPem(certificate.getCaCertificates())); + } + } catch (final IOException e) { + LOG.error("Failed to generate and convert client certificate(s) to PEM due to error: ", e); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to process and return client certificate"); + } + certificateResponse.setResponseName(getCommandName()); + setResponseObject(certificateResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_CA_CERTIFICATE_ISSUE; + } + + @Override + public String getEventDescription() { + return "issuing certificate for domain(s)=" + domains + ", ip(s)=" + addresses; + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/ListCAProvidersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCAProvidersCmd.java new file mode 100644 index 000000000000..e1e8e3751633 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCAProvidersCmd.java @@ -0,0 +1,102 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ca; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.response.CAProviderResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.ca.CAManager; +import org.apache.cloudstack.framework.ca.CAProvider; + +import com.cloud.user.Account; + +@APICommand(name = ListCAProvidersCmd.APINAME, + description = "Lists available certificate authority providers in CloudStack", + responseObject = CAProviderResponse.class, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class ListCAProvidersCmd extends BaseCmd { + public static final String APINAME = "listCAProviders"; + + @Inject + private CAManager caManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "List CA service provider by name") + private String name; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public String getName() { + return name; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + private void setupResponse(final List providers) { + final ListResponse response = new ListResponse<>(); + final List responses = new ArrayList<>(); + for (final CAProvider provider : providers) { + if (provider == null || (getName() != null && !provider.getProviderName().equals(getName()))) { + continue; + } + final CAProviderResponse caProviderResponse = new CAProviderResponse(); + caProviderResponse.setName(provider.getProviderName()); + caProviderResponse.setDescription(provider.getDescription()); + caProviderResponse.setObjectName("caprovider"); + responses.add(caProviderResponse); + } + response.setResponses(responses); + response.setResponseName(getCommandName()); + setResponseObject(response); + } + + @Override + public void execute() { + final List caProviders = caManager.getCaProviders(); + setupResponse(caProviders); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/ListCaCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCaCertificateCmd.java new file mode 100644 index 000000000000..1baa84179f03 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ca/ListCaCertificateCmd.java @@ -0,0 +1,90 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ca; + +import java.io.IOException; + +import javax.inject.Inject; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.response.CertificateResponse; +import org.apache.cloudstack.ca.CAManager; + +import com.cloud.user.Account; +import com.cloud.utils.exception.CloudRuntimeException; + +@APICommand(name = ListCaCertificateCmd.APINAME, + description = "Lists the CA public certificate(s) as support by the configured/provided CA plugin", + responseObject = CertificateResponse.class, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin, RoleType.ResourceAdmin, RoleType.DomainAdmin, RoleType.User}) +public class ListCaCertificateCmd extends BaseCmd { + public static final String APINAME = "listCaCertificate"; + + @Inject + private CAManager caManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.PROVIDER, type = CommandType.STRING, description = "Name of the CA service provider, otherwise the default configured provider plugin will be used") + private String provider; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public String getProvider() { + return provider; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() { + final String caCertificates; + try { + caCertificates = caManager.getCaCertificate(getProvider()); + } catch (final IOException e) { + throw new CloudRuntimeException("Failed to get CA certificates for given CA provider"); + } + final CertificateResponse certificateResponse = new CertificateResponse("cacertificates"); + certificateResponse.setCertificate(caCertificates); + certificateResponse.setResponseName(getCommandName()); + setResponseObject(certificateResponse); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_TYPE_NORMAL; + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java new file mode 100644 index 000000000000..2745f071dd07 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ca/ProvisionCertificateCmd.java @@ -0,0 +1,125 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ca; + +import javax.inject.Inject; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.HostResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.ca.CAManager; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.event.EventTypes; +import com.cloud.host.Host; + +@APICommand(name = ProvisionCertificateCmd.APINAME, + description = "Issues and propagates client certificate on a connected host/agent using configured CA plugin", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class ProvisionCertificateCmd extends BaseAsyncCmd { + public static final String APINAME = "provisionCertificate"; + + @Inject + private CAManager caManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, required = true, entityType = HostResponse.class, + description = "The host/agent uuid to which the certificate has to be provisioned (issued and propagated)") + private Long hostId; + + @Parameter(name = ApiConstants.RECONNECT, type = CommandType.BOOLEAN, + description = "Whether to attempt reconnection with host/agent after successful deployment of certificate. When option is not provided, configured global setting is used") + private Boolean reconnect; + + @Parameter(name = ApiConstants.PROVIDER, type = CommandType.STRING, + description = "Name of the CA service provider, otherwise the default configured provider plugin will be used") + private String provider; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getHostId() { + return hostId; + } + + public Boolean getReconnect() { + return reconnect; + } + + public String getProvider() { + return provider; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() { + final Host host = _resourceService.getHost(getHostId()); + if (host == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); + } + + boolean result = caManager.provisionCertificate(host, getReconnect(), getProvider()); + SuccessResponse response = new SuccessResponse(getCommandName()); + response.setSuccess(result); + setResponseObject(response); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_CA_CERTIFICATE_PROVISION; + } + + @Override + public String getEventDescription() { + return "provisioning certificate for host id=" + hostId + " using provider=" + provider; + } + + @Override + public ApiCommandJobType getInstanceType() { + return ApiCommandJobType.Host; + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ca/RevokeCertificateCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ca/RevokeCertificateCmd.java new file mode 100644 index 000000000000..0f154f045df0 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ca/RevokeCertificateCmd.java @@ -0,0 +1,116 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ca; + +import java.math.BigInteger; + +import javax.inject.Inject; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.ca.CAManager; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.event.EventTypes; +import com.google.common.base.Strings; + +@APICommand(name = RevokeCertificateCmd.APINAME, + description = "Revokes certificate using configured CA plugin", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = true, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class RevokeCertificateCmd extends BaseAsyncCmd { + + public static final String APINAME = "revokeCertificate"; + + @Inject + private CAManager caManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.SERIAL, type = BaseCmd.CommandType.STRING, required = true, description = "The certificate serial number, as a hex value") + private String serial; + + @Parameter(name = ApiConstants.CN, type = BaseCmd.CommandType.STRING, description = "The certificate CN") + private String cn; + + @Parameter(name = ApiConstants.PROVIDER, type = BaseCmd.CommandType.STRING, description = "Name of the CA service provider, otherwise the default configured provider plugin will be used") + private String provider; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public BigInteger getSerialBigInteger() { + if (Strings.isNullOrEmpty(serial)) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Certificate serial cannot be empty"); + } + return new BigInteger(serial, 16); + } + + public String getCn() { + return cn; + } + + public String getProvider() { + return provider; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public void execute() { + boolean result = caManager.revokeCertificate(getSerialBigInteger(), getCn(), getProvider()); + SuccessResponse response = new SuccessResponse(getCommandName()); + response.setSuccess(result); + setResponseObject(response); + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_CA_CERTIFICATE_REVOKE; + } + + @Override + public String getEventDescription() { + return "revoking certificate with serial id=" + serial + ", cn=" + cn; + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java b/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java index a34bc3eb6221..80ebaf43f647 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/config/ListCfgsByCmd.java @@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.List; +import org.apache.cloudstack.api.response.DomainResponse; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -28,6 +29,7 @@ import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.ClusterResponse; import org.apache.cloudstack.api.response.ConfigurationResponse; +import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; import org.apache.cloudstack.api.response.ZoneResponse; @@ -76,6 +78,18 @@ public class ListCfgsByCmd extends BaseListCmd { description = "the ID of the Account to update the parameter value for corresponding account") private Long accountId; + @Parameter(name = ApiConstants.DOMAIN_ID, + type = CommandType.UUID, + entityType = DomainResponse.class, + description = "the ID of the Domain to update the parameter value for corresponding domain") + private Long domainId; + + @Parameter(name = ApiConstants.IMAGE_STORE_UUID, + type = CommandType.UUID, + entityType = ImageStoreResponse.class, + description = "the ID of the Image Store to update the parameter value for corresponding image store") + private Long imageStoreId; + // /////////////////////////////////////////////////// // ///////////////// Accessors /////////////////////// // /////////////////////////////////////////////////// @@ -104,6 +118,14 @@ public Long getAccountId() { return accountId; } + public Long getDomainId() { + return domainId; + } + + public Long getImageStoreId() { + return imageStoreId; + } + @Override public Long getPageSizeVal() { Long defaultPageSize = 500L; @@ -147,6 +169,12 @@ public void execute() { if (getAccountId() != null) { cfgResponse.setScope("account"); } + if (getDomainId() != null) { + cfgResponse.setScope("domain"); + } + if (getImageStoreId() != null){ + cfgResponse.setScope("imagestore"); + } configResponses.add(cfgResponse); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java b/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java index 45f790fb70be..936f0cd69f1a 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/config/UpdateCfgCmd.java @@ -18,9 +18,10 @@ import com.google.common.base.Strings; import org.apache.cloudstack.acl.RoleService; +import org.apache.cloudstack.api.response.DomainResponse; import org.apache.log4j.Logger; - import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; import org.apache.cloudstack.api.BaseCmd; @@ -29,6 +30,7 @@ import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.ClusterResponse; import org.apache.cloudstack.api.response.ConfigurationResponse; +import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.StoragePoolResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.config.Configuration; @@ -75,6 +77,19 @@ public class UpdateCfgCmd extends BaseCmd { description = "the ID of the Account to update the parameter value for corresponding account") private Long accountId; + @Parameter(name = ApiConstants.DOMAIN_ID, + type = CommandType.UUID, + entityType = DomainResponse.class, + description = "the ID of the Domain to update the parameter value for corresponding domain") + private Long domainId; + + @Parameter(name = ApiConstants.IMAGE_STORE_UUID, + type = CommandType.UUID, + entityType = ImageStoreResponse.class, + description = "the ID of the Image Store to update the parameter value for corresponding image store", + validations = ApiArgValidator.PositiveNumber) + private Long imageStoreId; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -107,6 +122,14 @@ public Long getAccountId() { return accountId; } + public Long getDomainId() { + return domainId; + } + + public Long getImageStoreId() { + return imageStoreId; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -145,6 +168,9 @@ public void execute() { if (getAccountId() != null) { response.setScope("account"); } + if (getDomainId() != null) { + response.setScope("domain"); + } response.setValue(value); this.setResponseObject(response); } else { diff --git a/api/src/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificate.java b/api/src/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificate.java new file mode 100755 index 000000000000..89c0c25c9ca0 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/direct/download/UploadTemplateDirectDownloadCertificate.java @@ -0,0 +1,92 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.direct.download; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.exception.NetworkRuleConflictException; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.direct.download.DirectDownloadManager; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = UploadTemplateDirectDownloadCertificate.APINAME, + description = "Upload a certificate for HTTPS direct template download on KVM hosts", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = true, + responseHasSensitiveInfo = true, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class UploadTemplateDirectDownloadCertificate extends BaseCmd { + + @Inject + DirectDownloadManager directDownloadManager; + + private static final Logger LOG = Logger.getLogger(UploadTemplateDirectDownloadCertificate.class); + public static final String APINAME = "uploadTemplateDirectDownloadCertificate"; + + @Parameter(name = ApiConstants.CERTIFICATE, type = BaseCmd.CommandType.STRING, required = true, length = 65535, + description = "SSL certificate") + private String certificate; + + @Parameter(name = ApiConstants.NAME , type = BaseCmd.CommandType.STRING, required = true, + description = "Name for the uploaded certificate") + private String name; + + @Parameter(name = ApiConstants.HYPERVISOR, type = BaseCmd.CommandType.STRING, required = true, description = "Hypervisor type") + private String hypervisor; + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + if (!hypervisor.equalsIgnoreCase("kvm")) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Currently supporting KVM hosts only"); + } + + SuccessResponse response = new SuccessResponse(getCommandName()); + try { + LOG.debug("Uploading certificate " + name + " to agents for Direct Download"); + boolean result = directDownloadManager.uploadCertificateToHosts(certificate, name, hypervisor); + response.setSuccess(result); + setResponseObject(response); + } catch (Exception e) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage()); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } +} + + diff --git a/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java b/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java index 312c9ee4b095..fe1c20206b67 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/domain/CreateDomainCmd.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.command.admin.domain; import org.apache.log4j.Logger; - +import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; @@ -31,7 +31,8 @@ import com.cloud.user.Account; @APICommand(name = "createDomain", description = "Creates a domain", responseObject = DomainResponse.class, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = { + RoleType.Admin, RoleType.DomainAdmin }) public class CreateDomainCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(CreateDomainCmd.class.getName()); @@ -45,9 +46,9 @@ public class CreateDomainCmd extends BaseCmd { private String domainName; @Parameter(name = ApiConstants.PARENT_DOMAIN_ID, - type = CommandType.UUID, - entityType = DomainResponse.class, - description = "assigns new domain a parent domain by domain ID of the parent. If no parent domain is specied, the ROOT domain is assumed.") + type = CommandType.UUID, + entityType = DomainResponse.class, + description = "assigns new domain a parent domain by domain ID of the parent. If no parent domain is specied, the ROOT domain is assumed.") private Long parentDomainId; @Parameter(name = ApiConstants.NETWORK_DOMAIN, type = CommandType.STRING, description = "Network domain for networks in the domain") diff --git a/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java b/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java index a6d2b0b10c19..037cf3d9ab4b 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/domain/DeleteDomainCmd.java @@ -18,8 +18,7 @@ import javax.inject.Inject; -import org.apache.log4j.Logger; - +import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; @@ -30,13 +29,15 @@ import org.apache.cloudstack.api.response.SuccessResponse; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.region.RegionService; +import org.apache.log4j.Logger; import com.cloud.domain.Domain; import com.cloud.event.EventTypes; import com.cloud.user.Account; @APICommand(name = "deleteDomain", description = "Deletes a specified domain", responseObject = SuccessResponse.class, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, authorized = { + RoleType.Admin, RoleType.DomainAdmin }) public class DeleteDomainCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(DeleteDomainCmd.class.getName()); private static final String s_name = "deletedomainresponse"; @@ -49,8 +50,8 @@ public class DeleteDomainCmd extends BaseAsyncCmd { private Long id; @Parameter(name = ApiConstants.CLEANUP, - type = CommandType.BOOLEAN, - description = "true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise") + type = CommandType.BOOLEAN, + description = "true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise") private Boolean cleanup; @Inject diff --git a/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java index e382ed9b41c6..9c1ae2213285 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/domain/ListDomainsCmd.java @@ -16,10 +16,15 @@ // under the License. package org.apache.cloudstack.api.command.admin.domain; +import java.util.ArrayList; +import java.util.EnumSet; +import java.util.List; + import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiConstants.DomainDetails; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ResponseObject.ResponseView; @@ -27,6 +32,7 @@ import org.apache.cloudstack.api.response.ListResponse; import com.cloud.domain.Domain; +import com.cloud.exception.InvalidParameterValueException; @APICommand(name = "listDomains", description = "Lists domains and provides detailed information for listed domains", responseObject = DomainResponse.class, responseView = ResponseView.Restricted, entityType = {Domain.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) @@ -53,6 +59,12 @@ public class ListDomainsCmd extends BaseListCmd { description = "If set to false, list only resources belonging to the command's caller; if set to true - list resources that the caller is authorized to see. Default value is false") private Boolean listAll; + @Parameter(name = ApiConstants.DETAILS, + type = CommandType.LIST, + collectionType = CommandType.STRING, + description = "comma separated list of domain details requested, value can be a list of [ all, resource, min]") + private List viewDetails; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -73,6 +85,25 @@ public boolean listAll() { return listAll == null ? false : listAll; } + public EnumSet getDetails() throws InvalidParameterValueException { + EnumSet dv; + if (viewDetails == null || viewDetails.size() <= 0) { + dv = EnumSet.of(DomainDetails.all); + } else { + try { + ArrayList dc = new ArrayList(); + for (String detail : viewDetails) { + dc.add(DomainDetails.valueOf(detail)); + } + dv = EnumSet.copyOf(dc); + } catch (IllegalArgumentException e) { + throw new InvalidParameterValueException("The details parameter contains a non permitted value. The allowed values are " + + EnumSet.allOf(DomainDetails.class)); + } + } + return dv; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java index 3ba9669b305a..717bcfe81550 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/guest/AddGuestOsCmd.java @@ -33,6 +33,11 @@ import com.cloud.storage.GuestOS; import com.cloud.user.Account; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + @APICommand(name = "addGuestOs", description = "Add a new guest OS type", responseObject = GuestOSResponse.class, since = "4.4.0", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class AddGuestOsCmd extends BaseAsyncCreateCmd { @@ -53,8 +58,11 @@ public class AddGuestOsCmd extends BaseAsyncCreateCmd { @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, required = false, description = "Optional name for Guest OS") private String osName; + @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, required = true, description = "Map of (key/value pairs)") + private Map details; + -///////////////////////////////////////////////////// + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -70,6 +78,22 @@ public String getOsName() { return osName; } + public Map getDetails() { + Map detailsMap = new HashMap(); + if (!details.isEmpty()) { + Collection servicesCollection = details.values(); + Iterator iter = servicesCollection.iterator(); + while (iter.hasNext()) { + HashMap services = (HashMap)iter.next(); + String key = services.get("key"); + String value = services.get("value"); + detailsMap.put(key, value); + } + } + return detailsMap; + } + + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java index e4b1ecd57196..ff3b49d79be6 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/guest/UpdateGuestOsCmd.java @@ -31,6 +31,11 @@ import com.cloud.storage.GuestOS; import com.cloud.user.Account; +import java.util.Collection; +import java.util.HashMap; +import java.util.Iterator; +import java.util.Map; + @APICommand(name = "updateGuestOs", description = "Updates the information about Guest OS", responseObject = GuestOSResponse.class, since = "4.4.0", requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class UpdateGuestOsCmd extends BaseAsyncCmd { @@ -49,6 +54,10 @@ public class UpdateGuestOsCmd extends BaseAsyncCmd { @Parameter(name = ApiConstants.OS_DISPLAY_NAME, type = CommandType.STRING, required = true, description = "Unique display name for Guest OS") private String osDisplayName; + @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, required = true, description = "Map of (key/value pairs)") + private Map details; + + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -61,6 +70,21 @@ public String getOsDisplayName() { return osDisplayName; } + public Map getDetails() { + Map detailsMap = new HashMap();; + if (!details.isEmpty()) { + Collection servicesCollection = details.values(); + Iterator iter = servicesCollection.iterator(); + while (iter.hasNext()) { + HashMap services = (HashMap)iter.next(); + String key = services.get("key"); + String value = services.get("value"); + detailsMap.put(key, value); + } + } + return detailsMap; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/ConfigureHAForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/ConfigureHAForHostCmd.java new file mode 100644 index 000000000000..f85dbb235045 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/ConfigureHAForHostCmd.java @@ -0,0 +1,127 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import com.cloud.user.Account; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.HostHAResponse; +import org.apache.cloudstack.api.response.HostResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.ha.HAConfigManager; +import org.apache.cloudstack.ha.HAResource; + +import javax.inject.Inject; + +@APICommand(name = ConfigureHAForHostCmd.APINAME, description = "Configures HA for a host", + responseObject = HostHAResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class ConfigureHAForHostCmd extends BaseAsyncCmd { + public static final String APINAME = "configureHAForHost"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class, + description = "ID of the host", required = true, validations = {ApiArgValidator.PositiveNumber}) + private Long hostId; + + @Parameter(name = ApiConstants.PROVIDER, type = CommandType.STRING, + description = "HA provider", required = true, validations = {ApiArgValidator.NotNullOrEmpty}) + private String haProvider; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getHostId() { + return hostId; + } + + public String getHaProvider() { + return haProvider; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + private void setupResponse(final boolean result, final String resourceUuid) { + final HostHAResponse response = new HostHAResponse(); + response.setId(resourceUuid); + response.setProvider(getHaProvider().toLowerCase()); + response.setResponseName(getCommandName()); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final Host host = _resourceService.getHost(getHostId()); + if (host == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); + } + + final boolean result = haConfigManager.configureHA(host.getId(), HAResource.ResourceType.Host, getHaProvider()); + if (!result) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to configure HA provider for the host"); + } + CallContext.current().setEventDetails("Host Id:" + host.getId() + " HA configured with provider: " + getHaProvider()); + CallContext.current().putContextParameter(Host.class, host.getUuid()); + + setupResponse(result, host.getUuid()); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_HA_RESOURCE_DISABLE; + } + + @Override + public String getEventDescription() { + return "configure HA for host: " + getHostId(); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForClusterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForClusterCmd.java new file mode 100644 index 000000000000..053c978b831d --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForClusterCmd.java @@ -0,0 +1,114 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.org.Cluster; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ClusterResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.ha.HAConfigManager; + +import javax.inject.Inject; + +@APICommand(name = DisableHAForClusterCmd.APINAME, description = "Disables HA cluster-wide", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class DisableHAForClusterCmd extends BaseAsyncCmd { + public static final String APINAME = "disableHAForCluster"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.CLUSTER_ID, type = BaseCmd.CommandType.UUID, entityType = ClusterResponse.class, + description = "ID of the cluster", required = true, validations = {ApiArgValidator.PositiveNumber}) + private Long clusterId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getClusterId() { + return clusterId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccountId(); + } + + private void setupResponse(final boolean result) { + final SuccessResponse response = new SuccessResponse(); + response.setSuccess(result); + response.setResponseName(getCommandName()); + response.setObjectName("ha"); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final Cluster cluster = _resourceService.getCluster(getClusterId()); + if (cluster == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find cluster by ID: " + getClusterId()); + } + final boolean result = haConfigManager.disableHA(cluster); + CallContext.current().setEventDetails("Cluster Id:" + cluster.getId() + " HA enabled: false"); + CallContext.current().putContextParameter(Cluster.class, cluster.getUuid()); + + setupResponse(result); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_HA_RESOURCE_DISABLE; + } + + @Override + public String getEventDescription() { + return "disable HA for cluster: " + getClusterId(); + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForHostCmd.java new file mode 100644 index 000000000000..87ebe878cebe --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForHostCmd.java @@ -0,0 +1,116 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.HostHAResponse; +import org.apache.cloudstack.api.response.HostResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.ha.HAConfigManager; +import org.apache.cloudstack.ha.HAResource; + +import javax.inject.Inject; + +@APICommand(name = DisableHAForHostCmd.APINAME, description = "Disables HA for a host", + responseObject = HostHAResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class DisableHAForHostCmd extends BaseAsyncCmd { + public static final String APINAME = "disableHAForHost"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class, + description = "ID of the host", required = true, validations = {ApiArgValidator.PositiveNumber}) + private Long hostId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getHostId() { + return hostId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccountId(); + } + + private void setupResponse(final boolean result, final String resourceUuid) { + final HostHAResponse response = new HostHAResponse(); + response.setId(resourceUuid); + response.setEnabled(false); + response.setStatus(result); + response.setResponseName(getCommandName()); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final Host host = _resourceService.getHost(getHostId()); + if (host == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); + } + + final boolean result = haConfigManager.disableHA(host.getId(), HAResource.ResourceType.Host); + CallContext.current().setEventDetails("Host Id:" + host.getId() + " HA enabled: false"); + CallContext.current().putContextParameter(Host.class, host.getUuid()); + + setupResponse(result, host.getUuid()); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_HA_RESOURCE_DISABLE; + } + + @Override + public String getEventDescription() { + return "disable HA for host: " + getHostId(); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForZoneCmd.java new file mode 100644 index 000000000000..845c4a663b5a --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/DisableHAForZoneCmd.java @@ -0,0 +1,115 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.dc.DataCenter; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.ha.HAConfigManager; + +import javax.inject.Inject; + +@APICommand(name = DisableHAForZoneCmd.APINAME, description = "Disables HA for a zone", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class DisableHAForZoneCmd extends BaseAsyncCmd { + public static final String APINAME = "disableHAForZone"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ZONE_ID, type = BaseCmd.CommandType.UUID, entityType = ZoneResponse.class, + description = "ID of the zone", required = true, validations = {ApiArgValidator.PositiveNumber}) + private Long zoneId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getZoneId() { + return zoneId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccountId(); + } + + private void setupResponse(final boolean result) { + final SuccessResponse response = new SuccessResponse(); + response.setSuccess(result); + response.setResponseName(getCommandName()); + response.setObjectName("ha"); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final DataCenter dataCenter = _resourceService.getZone(getZoneId()); + if (dataCenter == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find zone by ID: " + getZoneId()); + } + + final boolean result = haConfigManager.disableHA(dataCenter); + CallContext.current().setEventDetails("Zone Id:" + dataCenter.getId() + " HA enabled: false"); + CallContext.current().putContextParameter(DataCenter.class, dataCenter.getUuid()); + + setupResponse(result); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_HA_RESOURCE_DISABLE; + } + + @Override + public String getEventDescription() { + return "disable HA for zone: " + getZoneId(); + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForClusterCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForClusterCmd.java new file mode 100644 index 000000000000..e06d0d2c1b07 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForClusterCmd.java @@ -0,0 +1,114 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.org.Cluster; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.ClusterResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.ha.HAConfigManager; + +import javax.inject.Inject; + +@APICommand(name = EnableHAForClusterCmd.APINAME, description = "Enables HA cluster-wide", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class EnableHAForClusterCmd extends BaseAsyncCmd { + public static final String APINAME = "enableHAForCluster"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.CLUSTER_ID, type = BaseCmd.CommandType.UUID, entityType = ClusterResponse.class, + description = "ID of the cluster", required = true, validations = {ApiArgValidator.PositiveNumber}) + private Long clusterId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getClusterId() { + return clusterId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccountId(); + } + + private void setupResponse(final boolean result) { + final SuccessResponse response = new SuccessResponse(); + response.setSuccess(result); + response.setResponseName(getCommandName()); + response.setObjectName("ha"); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final Cluster cluster = _resourceService.getCluster(getClusterId()); + if (cluster == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find cluster by ID: " + getClusterId()); + } + + final boolean result = haConfigManager.enableHA(cluster); + CallContext.current().setEventDetails("Cluster Id:" + cluster.getId() + " HA enabled: true"); + CallContext.current().putContextParameter(Cluster.class, cluster.getUuid()); + + setupResponse(result); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_HA_RESOURCE_ENABLE; + } + + @Override + public String getEventDescription() { + return "enable HA for cluster: " + getClusterId(); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForHostCmd.java new file mode 100644 index 000000000000..b23841ad56f4 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForHostCmd.java @@ -0,0 +1,116 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.HostHAResponse; +import org.apache.cloudstack.api.response.HostResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.ha.HAConfigManager; +import org.apache.cloudstack.ha.HAResource; + +import javax.inject.Inject; + +@APICommand(name = EnableHAForHostCmd.APINAME, description = "Enables HA for a host", + responseObject = HostHAResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class EnableHAForHostCmd extends BaseAsyncCmd { + public static final String APINAME = "enableHAForHost"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class, + description = "ID of the host", required = true, validations = {ApiArgValidator.PositiveNumber}) + private Long hostId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getHostId() { + return hostId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccountId(); + } + + private void setupResponse(final boolean result, final String resourceUuid) { + final HostHAResponse response = new HostHAResponse(); + response.setId(resourceUuid); + response.setEnabled(true); + response.setStatus(result); + response.setResponseName(getCommandName()); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final Host host = _resourceService.getHost(getHostId()); + if (host == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); + } + final boolean result = haConfigManager.enableHA(host.getId(), HAResource.ResourceType.Host); + + CallContext.current().setEventDetails("Host Id:" + host.getId() + " HA enabled: true"); + CallContext.current().putContextParameter(Host.class, host.getUuid()); + + setupResponse(result, host.getUuid()); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_HA_RESOURCE_ENABLE; + } + + @Override + public String getEventDescription() { + return "enable HA for host: " + getHostId(); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForZoneCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForZoneCmd.java new file mode 100644 index 000000000000..443d303c2961 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/EnableHAForZoneCmd.java @@ -0,0 +1,115 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.dc.DataCenter; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.ha.HAConfigManager; + +import javax.inject.Inject; + +@APICommand(name = EnableHAForZoneCmd.APINAME, description = "Enables HA for a zone", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class EnableHAForZoneCmd extends BaseAsyncCmd { + public static final String APINAME = "enableHAForZone"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ZONE_ID, type = BaseCmd.CommandType.UUID, entityType = ZoneResponse.class, + description = "ID of the zone", required = true, validations = {ApiArgValidator.PositiveNumber}) + private Long zoneId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getZoneId() { + return zoneId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccountId(); + } + + private void setupResponse(final boolean result) { + final SuccessResponse response = new SuccessResponse(); + response.setSuccess(result); + response.setResponseName(getCommandName()); + response.setObjectName("ha"); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final DataCenter dataCenter = _resourceService.getZone(getZoneId()); + if (dataCenter == null) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find zone by ID: " + getZoneId()); + } + + final boolean result = haConfigManager.enableHA(dataCenter); + CallContext.current().setEventDetails("Zone Id:" + dataCenter.getId() + " HA enabled: true"); + CallContext.current().putContextParameter(DataCenter.class, dataCenter.getUuid()); + + setupResponse(result); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_HA_RESOURCE_ENABLE; + } + + @Override + public String getEventDescription() { + return "enable HA for zone: " + getZoneId(); + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAProvidersCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAProvidersCmd.java new file mode 100644 index 000000000000..64b9a6a8e5cd --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAProvidersCmd.java @@ -0,0 +1,106 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; +import com.google.common.base.Enums; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.HAProviderResponse; +import org.apache.cloudstack.api.response.HostHAResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.ha.HAConfigManager; +import org.apache.cloudstack.ha.HAResource; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +@APICommand(name = ListHostHAProvidersCmd.APINAME, description = "Lists HA providers", responseObject = HostHAResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class ListHostHAProvidersCmd extends BaseCmd { + public static final String APINAME = "listHostHAProviders"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.HYPERVISOR, type = CommandType.STRING, required = true, + description = "Hypervisor type of the resource", validations = {ApiArgValidator.NotNullOrEmpty}) + private String hypervisorType; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public HAResource.ResourceSubType getHypervisorType() { + return HAResource.ResourceSubType.valueOf(hypervisorType); + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + private void setupResponse(final List hostHAProviderList) { + final ListResponse response = new ListResponse<>(); + final List hostHAResponses = new ArrayList<>(); + for (final String provider : hostHAProviderList) { + final HAProviderResponse haProviderResponse = new HAProviderResponse(); + haProviderResponse.setProvider(provider); + hostHAResponses.add(haProviderResponse); + } + response.setResponses(hostHAResponses); + response.setResponseName(getCommandName()); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + if (!Enums.getIfPresent(HAResource.ResourceSubType.class, hypervisorType).isPresent()) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Invalid or unsupported host hypervisor type provided. Supported types are: " + Arrays.toString(HAResource.ResourceSubType.values())); + } + final List hostHAProviders = haConfigManager.listHAProviders(HAResource.ResourceType.Host, getHypervisorType()); + setupResponse(hostHAProviders); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAResourcesCmd.java b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAResourcesCmd.java new file mode 100644 index 000000000000..75a900c2198d --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/ha/ListHostHAResourcesCmd.java @@ -0,0 +1,109 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.ha; + +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.NetworkRuleConflictException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.host.Host; +import com.cloud.user.Account; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.HostHAResponse; +import org.apache.cloudstack.api.response.HostResponse; +import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.ha.HAConfig; +import org.apache.cloudstack.ha.HAConfigManager; +import org.apache.cloudstack.ha.HAResource; + +import javax.inject.Inject; +import java.util.ArrayList; +import java.util.List; + +@APICommand(name = ListHostHAResourcesCmd.APINAME, description = "Lists host HA resources", responseObject = HostHAResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11", authorized = {RoleType.Admin}) +public final class ListHostHAResourcesCmd extends BaseCmd { + public static final String APINAME = "listHostHAResources"; + + @Inject + private HAConfigManager haConfigManager; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.HOST_ID, type = CommandType.UUID, entityType = HostResponse.class, + description = "List by host ID", validations = {ApiArgValidator.PositiveNumber}) + private Long hostId; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getHostId() { + return hostId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + + private void setupResponse(final List hostHAConfigList) { + final ListResponse response = new ListResponse<>(); + final List hostHAResponses = new ArrayList<>(); + for (final HAConfig config : hostHAConfigList) { + final Host host = _resourceService.getHost(config.getResourceId()); + if (host == null) { + continue; + } + final HostHAResponse hostHAResponse = new HostHAResponse(); + hostHAResponse.setId(host.getUuid()); + hostHAResponse.setEnabled(config.isEnabled()); + hostHAResponse.setHaState(config.getState()); + hostHAResponse.setProvider(config.getHaProvider()); + hostHAResponses.add(hostHAResponse); + } + response.setResponses(hostHAResponses); + response.setResponseName(getCommandName()); + setResponseObject(response); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { + final List hostHAConfig = haConfigManager.listHAResources(getHostId(), HAResource.ResourceType.Host); + setupResponse(hostHAConfig); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java index dbb94384523e..ad9b6af34364 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/host/FindHostsForMigrationCmd.java @@ -76,7 +76,7 @@ public void execute() { Map hostsRequiringStorageMotion; Ternary, Integer>, List, Map> hostsForMigration = - _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal()); + _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal(), this.getKeyword()); result = hostsForMigration.first(); List hostsWithCapacity = hostsForMigration.second(); hostsRequiringStorageMotion = hostsForMigration.third(); diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java index 3391fdca1e34..9a5d3115b597 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/host/ListHostsCmd.java @@ -209,7 +209,7 @@ protected ListResponse getHostResponses() { } else { Pair, Integer> result; Ternary, Integer>, List, Map> hostsForMigration = - _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal()); + _mgr.listHostsForMigrationOfVM(getVirtualMachineId(), this.getStartIndex(), this.getPageSizeVal(), null); result = hostsForMigration.first(); List hostsWithCapacity = hostsForMigration.second(); List hostResponses = new ArrayList(); diff --git a/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java b/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java index c6f6530dc503..aa0a690e2a98 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/host/UpdateHostCmd.java @@ -16,10 +16,10 @@ // under the License. package org.apache.cloudstack.api.command.admin.host; -import java.util.List; - -import org.apache.log4j.Logger; - +import com.cloud.host.Host; +import com.cloud.user.Account; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.annotation.AnnotationService; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.ApiErrorCode; @@ -28,9 +28,9 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.GuestOSCategoryResponse; import org.apache.cloudstack.api.response.HostResponse; +import org.apache.log4j.Logger; -import com.cloud.host.Host; -import com.cloud.user.Account; +import java.util.List; @APICommand(name = "updateHost", description = "Updates a host.", responseObject = HostResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) @@ -62,6 +62,9 @@ public class UpdateHostCmd extends BaseCmd { @Parameter(name = ApiConstants.URL, type = CommandType.STRING, description = "the new uri for the secondary storage: nfs://host/path") private String url; + @Parameter(name = ApiConstants.ANNOTATION, type = CommandType.STRING, description = "Add an annotation to this host", since = "4.11", authorized = {RoleType.Admin}) + private String annotation; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -86,6 +89,10 @@ public String getUrl() { return url; } + public String getAnnotation() { + return annotation; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -109,6 +116,9 @@ public void execute() { Host result; try { result = _resourceService.updateHost(this); + if(getAnnotation() != null) { + annotationService.addAnnotation(getAnnotation(), AnnotationService.EntityType.HOST, result.getUuid()); + } HostResponse hostResponse = _responseGenerator.createHostResponse(result); hostResponse.setResponseName(getCommandName()); this.setResponseObject(hostResponse); diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java new file mode 100644 index 000000000000..f7957469cd13 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateManagementNetworkIpRangeCmd.java @@ -0,0 +1,166 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.network; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.PodResponse; + +import com.cloud.dc.Pod; +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.InsufficientCapacityException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; + +@APICommand(name = CreateManagementNetworkIpRangeCmd.APINAME, + description = "Creates a Management network IP range.", + responseObject = PodResponse.class, + since = "4.11.0.0", + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + authorized = {RoleType.Admin}) +public class CreateManagementNetworkIpRangeCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(CreateManagementNetworkIpRangeCmd.class); + + public static final String APINAME = "createManagementNetworkIpRange"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + @Parameter(name = ApiConstants.POD_ID, + type = CommandType.UUID, + entityType = PodResponse.class, + required = true, + description = "UUID of POD, where the IP range belongs to.", + validations = {ApiArgValidator.PositiveNumber}) + private Long podId; + + @Parameter(name = ApiConstants.GATEWAY, + type = CommandType.STRING, + required = true, + description = "The gateway for the management network.", + validations = {ApiArgValidator.NotNullOrEmpty}) + private String gateway; + + @Parameter(name = ApiConstants.NETMASK, + type = CommandType.STRING, + required = true, + description = "The netmask for the management network.", + validations = {ApiArgValidator.NotNullOrEmpty}) + private String netmask; + + @Parameter(name = ApiConstants.START_IP, + type = CommandType.STRING, + required = true, + description = "The starting IP address.", + validations = {ApiArgValidator.NotNullOrEmpty}) + private String startIp; + + @Parameter(name = ApiConstants.END_IP, + type = CommandType.STRING, + description = "The ending IP address.") + private String endIp; + + @Parameter(name = ApiConstants.FOR_SYSTEM_VMS, + type = CommandType.BOOLEAN, + description = "Specify if range is dedicated for CPVM and SSVM.") + private Boolean forSystemVms; + + @Parameter(name = ApiConstants.VLAN, + type = CommandType.STRING, + description = "Optional. The vlan id the ip range sits on, default to Null when it is not specificed which means you network is not on any Vlan") + private String vlan; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getPodId() { + return podId; + } + + public String getGateWay() { + return gateway; + } + + public String getNetmask() { + return netmask; + } + + public String getStartIp() { + return startIp; + } + + public String getEndIp() { + return endIp; + } + + public Boolean isForSystemVms() { + return forSystemVms == null ? Boolean.FALSE : forSystemVms; + } + + public String getVlan() { + if (vlan == null || vlan.isEmpty()) { + vlan = "untagged"; + } + return vlan; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_MANAGEMENT_IP_RANGE_CREATE; + } + + @Override + public String getEventDescription() { + return "Creating management ip range from " + getStartIp() + " to " + getEndIp() + " and gateway=" + getGateWay() + ", netmask=" + getNetmask() + " of pod=" + getPodId(); + } + + @Override + public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, + ResourceAllocationException { + Pod result = _configService.createPodIpRange(this); + if (result != null) { + PodResponse response = _responseGenerator.createPodResponse(result, false); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create Pod IP Range."); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseAsyncCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java index 6cf9e2308dcd..6d346e9a4dbe 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkCmdByAdmin.java @@ -40,6 +40,9 @@ public class CreateNetworkCmdByAdmin extends CreateNetworkCmd { @Parameter(name=ApiConstants.VLAN, type=CommandType.STRING, description="the ID or VID of the network") private String vlan; + @Parameter(name=ApiConstants.BYPASS_VLAN_OVERLAP_CHECK, type=CommandType.BOOLEAN, description="when true bypasses VLAN id/range overlap check during network creation for shared networks") + private Boolean bypassVlanOverlapCheck; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -48,6 +51,13 @@ public String getVlan() { return vlan; } + public Boolean getBypassVlanOverlapCheck() { + if (bypassVlanOverlapCheck != null) { + return bypassVlanOverlapCheck; + } + return false; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java index a09c9797b68a..7c8c46a9c9e0 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/CreateNetworkOfferingCmd.java @@ -112,8 +112,14 @@ public class CreateNetworkOfferingCmd extends BaseCmd { description = "true if network offering supports persistent networks; defaulted to false if not specified") private Boolean isPersistent; + @Parameter(name = ApiConstants.FOR_VPC, + type = CommandType.BOOLEAN, + description = "true if network offering is meant to be used for VPC, false otherwise.") + private Boolean forVpc; + @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, since = "4.2.0", description = "Network offering details in key/value pairs." - + " Supported keys are internallbprovider/publiclbprovider with service provider as a value") + + " Supported keys are internallbprovider/publiclbprovider with service provider as a value, and" + + " promiscuousmode/macaddresschanges/forgedtransmits with true/false as value to accept/reject the security settings if available for a nic/portgroup") protected Map details; @Parameter(name = ApiConstants.EGRESS_DEFAULT_POLICY, @@ -195,6 +201,10 @@ public Boolean getIsPersistent() { return isPersistent == null ? false : isPersistent; } + public Boolean getForVpc() { + return forVpc; + } + public Boolean getEgressDefaultPolicy() { if (egressDefaultPolicy == null) { return true; @@ -273,10 +283,23 @@ public Map getDetails() { } Collection paramsCollection = details.values(); - Map params = (Map)(paramsCollection.toArray())[0]; + Object objlist[]= paramsCollection.toArray(); + Map params = (Map)(objlist[0]); + for(int i=1; i< objlist.length; i++) + { + params.putAll((Map)(objlist[i])); + } + return params; } + public String getServicePackageId() { + Map data = getDetails(); + if (data == null) + return null; + return data.get(NetworkOffering.Detail.servicepackageuuid+ ""); + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/DeleteManagementNetworkIpRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/DeleteManagementNetworkIpRangeCmd.java new file mode 100644 index 000000000000..d6481846f431 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/DeleteManagementNetworkIpRangeCmd.java @@ -0,0 +1,139 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.network; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.ApiArgValidator; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.response.PodResponse; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SuccessResponse; + +import com.cloud.event.EventTypes; +import com.cloud.exception.ConcurrentOperationException; +import com.cloud.exception.ResourceUnavailableException; +import com.cloud.user.Account; + +@APICommand(name = DeleteManagementNetworkIpRangeCmd.APINAME, + description = "Deletes a management network IP range. This action is only allowed when no IPs in this range are allocated.", + responseObject = SuccessResponse.class, + since = "4.11.0.0", + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + authorized = {RoleType.Admin}) +public class DeleteManagementNetworkIpRangeCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(DeleteManagementNetworkIpRangeCmd.class); + + public static final String APINAME = "deleteManagementNetworkIpRange"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.POD_ID, + type = CommandType.UUID, + entityType = PodResponse.class, + required = true, + description = "UUID of POD, where the IP range belongs to.", + validations = ApiArgValidator.PositiveNumber) + private Long podId; + + @Parameter(name = ApiConstants.START_IP, + type = CommandType.STRING, + required = true, + description = "The starting IP address.", + validations = ApiArgValidator.NotNullOrEmpty) + private String startIp; + + @Parameter(name = ApiConstants.END_IP, + type = CommandType.STRING, + required = true, + description = "The ending IP address.", + validations = ApiArgValidator.NotNullOrEmpty) + private String endIp; + + @Parameter(name = ApiConstants.VLAN, + type = CommandType.STRING, + required = true, + description = "The vlan id the ip range sits on") + private String vlan; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getPodId() { + return podId; + } + + public String getStartIp() { + return startIp; + } + + public String getEndIp() { + return endIp; + } + + public String getVlan() { + return vlan; + } + + @Override + public String getEventType() { + return EventTypes.EVENT_MANAGEMENT_IP_RANGE_DELETE; + } + + @Override + public String getEventDescription() { + return "Deleting management ip range from " + getStartIp() + " to " + getEndIp() + " of Pod: " + getPodId(); + } + + @Override + public void execute() { + try { + _configService.deletePodIpRange(this); + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } catch (ResourceUnavailableException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(ApiErrorCode.RESOURCE_UNAVAILABLE_ERROR, ex.getMessage()); + } catch (ConcurrentOperationException ex) { + s_logger.warn("Exception: ", ex); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage()); + } catch (Exception e) { + s_logger.warn("Failed to delete management ip range from " + getStartIp() + " to " + getEndIp() + " of Pod: " + getPodId(), e); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage()); + } + } + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseAsyncCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + return Account.ACCOUNT_ID_SYSTEM; + } + +} \ No newline at end of file diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java new file mode 100644 index 000000000000..298d9b043e8f --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateNetworkCmd.java @@ -0,0 +1,163 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.network; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.acl.SecurityChecker.AccessType; +import org.apache.cloudstack.api.ACL; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ResponseObject.ResponseView; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.NetworkOfferingResponse; +import org.apache.cloudstack.api.response.NetworkResponse; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.network.Network; +import com.cloud.offering.NetworkOffering; +import com.cloud.user.Account; +import com.cloud.user.User; + +@APICommand(name = MigrateNetworkCmd.APINAME, description = "moves a network to another physical network", + responseObject = NetworkResponse.class, + responseView = ResponseView.Restricted, + entityType = {Network.class}, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class MigrateNetworkCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(MigrateNetworkCmd.class.getName()); + + public static final String APINAME = "migrateNetwork"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + @ACL(accessType = AccessType.OperateEntry) + @Parameter(name=ApiConstants.NETWORK_ID, type=CommandType.UUID, entityType = NetworkResponse.class, + required=true, description="the ID of the network") + protected Long id; + + @Parameter(name = ApiConstants.NETWORK_OFFERING_ID, type = CommandType.UUID, entityType = NetworkOfferingResponse.class, description = "network offering ID") + private Long networkOfferingId; + + @Parameter(name = ApiConstants.RESUME, type = CommandType.BOOLEAN, description = "true if previous network migration cmd failed") + private Boolean resume; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getNetworkOfferingId() { + return networkOfferingId; + } + + public Boolean getResume() { + return resume != null ? resume : false; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + Network network = _networkService.getNetwork(id); + if (network == null) { + throw new InvalidParameterValueException("Networkd id=" + id + " doesn't exist"); + } else { + return _networkService.getNetwork(id).getAccountId(); + } + } + + @Override + public void execute() { + User callerUser = _accountService.getActiveUser(CallContext.current().getCallingUserId()); + Account callerAccount = _accountService.getActiveAccountById(callerUser.getAccountId()); + Network network = _networkService.getNetwork(id); + if (network == null) { + throw new InvalidParameterValueException("Couldn't find network by id"); + } + + Network result = + _networkService.migrateGuestNetwork(getId(), getNetworkOfferingId(), callerAccount, callerUser, getResume()); + + if (result != null) { + NetworkResponse response = _responseGenerator.createNetworkResponse(ResponseView.Restricted, result); + response.setResponseName(getCommandName()); + setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to update network"); + } + } + + @Override + public String getEventDescription() { + StringBuilder eventMsg = new StringBuilder("Migrating network: " + getId()); + if (getNetworkOfferingId() != null) { + Network network = _networkService.getNetwork(getId()); + if (network == null) { + throw new InvalidParameterValueException("Network id=" + id + " doesn't exist"); + } + if (network.getNetworkOfferingId() != getNetworkOfferingId()) { + NetworkOffering oldOff = _entityMgr.findById(NetworkOffering.class, network.getNetworkOfferingId()); + NetworkOffering newOff = _entityMgr.findById(NetworkOffering.class, getNetworkOfferingId()); + if (newOff == null) { + throw new InvalidParameterValueException("Network offering id supplied is invalid"); + } + + eventMsg.append(". Original network offering id: " + oldOff.getUuid() + ", new network offering id: " + newOff.getUuid()); + } + } + + return eventMsg.toString(); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_NETWORK_MIGRATE; + } + + @Override + public String getSyncObjType() { + return BaseAsyncCmd.networkSyncObject; + } + + @Override + public Long getSyncObjId() { + return id; + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java new file mode 100644 index 000000000000..a5611c67aa4c --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/network/MigrateVPCCmd.java @@ -0,0 +1,154 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.network; + +import java.util.HashMap; +import java.util.Map; + +import org.apache.log4j.Logger; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.acl.SecurityChecker; +import org.apache.cloudstack.api.ACL; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ResponseObject; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.VpcOfferingResponse; +import org.apache.cloudstack.api.response.VpcResponse; +import org.apache.cloudstack.context.CallContext; + +import com.cloud.event.EventTypes; +import com.cloud.network.vpc.Vpc; +import com.cloud.user.Account; +import com.cloud.user.User; + +@APICommand(name = MigrateVPCCmd.APINAME, + description = "moves a vpc to another physical network", + responseObject = VpcResponse.class, + responseView = ResponseObject.ResponseView.Restricted, + entityType = {Vpc.class}, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class MigrateVPCCmd extends BaseAsyncCmd { + public static final Logger s_logger = Logger.getLogger(MigrateVPCCmd.class.getName()); + + public static final String APINAME = "migrateVPC"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + @ACL(accessType = SecurityChecker.AccessType.OperateEntry) + @Parameter(name= ApiConstants.VPC_ID, type=CommandType.UUID, entityType = VpcResponse.class, + required=true, description = "the ID of the vpc") + protected Long id; + + @Parameter(name = ApiConstants.VPC_OFF_ID, type = CommandType.UUID, entityType = VpcOfferingResponse.class, required=true, description = "vpc offering ID") + private Long vpcOfferingId; + + @Parameter(name = ApiConstants.TIER_NETWORK_OFFERINGS, type = CommandType.MAP, description = "network offering ids for each network in the vpc. Example: tierNetworkOfferings[0].networkId=networkId1&tierNetworkOfferings[0].networkOfferingId=newNetworkofferingId1&tierNetworkOfferings[1].networkId=networkId2&tierNetworkOfferings[1].networkOfferingId=newNetworkofferingId2") + private Map> tierNetworkOfferings; + + @Parameter(name = ApiConstants.RESUME, type = CommandType.BOOLEAN, description = "true if previous network migration cmd failed") + private Boolean resume; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public Long getVpcOfferingId() { + return vpcOfferingId; + } + + public Boolean getResume() { + return resume == null ? false : resume; + } + + public Map getTierNetworkOfferings() { + HashMap flatMap = new HashMap<>(); + + if (tierNetworkOfferings == null) { + return flatMap; + } + + for (HashMap map : tierNetworkOfferings.values()) { + flatMap.put(map.get("networkid"), map.get("networkofferingid")); + } + + return flatMap; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public void execute() { + User callerUser = _accountService.getActiveUser(CallContext.current().getCallingUserId()); + Account callerAccount = _accountService.getActiveAccountById(callerUser.getAccountId()); + + Vpc result = + _networkService.migrateVpcNetwork(getId(), getVpcOfferingId(), getTierNetworkOfferings(), callerAccount, callerUser, getResume()); + + if (result != null) { + VpcResponse response = _responseGenerator.createVpcResponse(ResponseObject.ResponseView.Restricted, result); + response.setResponseName(getCommandName()); + setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to migrate vpc"); + } + } + + @Override + public String getEventDescription() { return "Migrating vpc: " + getId() + " to new vpc offering (" + vpcOfferingId + ")"; } + + @Override + public String getEventType() { + return EventTypes.EVENT_NETWORK_MIGRATE; + } + + @Override + public String getSyncObjType() { + return BaseAsyncCmd.networkSyncObject; + } + + @Override + public Long getSyncObjId() { + return id; + } + + @Override + public long getEntityOwnerId() { + return CallContext.current().getCallingAccount().getId(); + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java index 269f43ec9596..388348c592c1 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkCmdByAdmin.java @@ -49,7 +49,7 @@ public void execute() throws InsufficientCapacityException, ConcurrentOperationE } Network result = _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount, - callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId()); + callerUser, getNetworkDomain(), getNetworkOfferingId(), getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId(), getUpdateInSequence(),getForced()); if (result != null) { diff --git a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java index 411da4fd36b5..5c58530fe1f9 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/network/UpdateNetworkOfferingCmd.java @@ -69,6 +69,9 @@ public class UpdateNetworkOfferingCmd extends BaseCmd { description = "maximum number of concurrent connections supported by the network offering") private Integer maxConnections; + @Parameter(name = ApiConstants.TAGS, type = CommandType.STRING, description = "the tags for the network offering.", length = 4096) + private String tags; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -105,6 +108,10 @@ public Boolean getKeepAliveEnabled() { return keepAliveEnabled; } + public String getTags() { + return tags; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java index ea2e3cdb76b5..0499a6e4577c 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ChangeOutOfBandManagementPasswordCmd.java @@ -74,7 +74,7 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE CallContext.current().setEventDetails("Host Id: " + host.getId() + " Password: " + getPassword().charAt(0) + "****"); CallContext.current().putContextParameter(Host.class, host.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.changeOutOfBandManagementPassword(host, getPassword()); + final OutOfBandManagementResponse response = outOfBandManagementService.changePassword(host, getPassword()); response.setResponseName(getCommandName()); setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java index db224108df07..d9c6c9f439e4 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/ConfigureOutOfBandManagementCmd.java @@ -83,7 +83,7 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Unable to find host by ID: " + getHostId()); } CallContext.current().putContextParameter(Host.class, host.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.configureOutOfBandManagement(host, getHostPMOptions()); + final OutOfBandManagementResponse response = outOfBandManagementService.configure(host, getHostPMOptions()); response.setId(host.getUuid()); response.setResponseName(getCommandName()); setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java index 8d6bdd350d00..7593a3cbc522 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/outofbandmanagement/IssueOutOfBandManagementPowerActionCmd.java @@ -80,7 +80,7 @@ public void execute() throws ResourceUnavailableException, InsufficientCapacityE CallContext.current().setEventDetails("Host Id: " + host.getId() + " Action: " + powerOperation.toString()); CallContext.current().putContextParameter(Host.class, host.getUuid()); - final OutOfBandManagementResponse response = outOfBandManagementService.executeOutOfBandManagementPowerOperation(host, powerOperation, getActionTimeout()); + final OutOfBandManagementResponse response = outOfBandManagementService.executePowerOperation(host, powerOperation, getActionTimeout()); response.setResponseName(getCommandName()); setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java b/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java index d79ff07fbccf..76ca3a79b11d 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/resource/ListCapacityCmd.java @@ -17,6 +17,8 @@ package org.apache.cloudstack.api.command.admin.resource; import java.text.DecimalFormat; +import java.util.Collections; +import java.util.Comparator; import java.util.List; import org.apache.log4j.Logger; @@ -65,7 +67,8 @@ public class ListCapacityCmd extends BaseListCmd { @Parameter(name = ApiConstants.TYPE, type = CommandType.INTEGER, description = "lists capacity by type" + "* CAPACITY_TYPE_MEMORY = 0" + "* CAPACITY_TYPE_CPU = 1" + "* CAPACITY_TYPE_STORAGE = 2" + "* CAPACITY_TYPE_STORAGE_ALLOCATED = 3" + "* CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP = 4" + "* CAPACITY_TYPE_PRIVATE_IP = 5" - + "* CAPACITY_TYPE_SECONDARY_STORAGE = 6" + "* CAPACITY_TYPE_VLAN = 7" + "* CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP = 8" + "* CAPACITY_TYPE_LOCAL_STORAGE = 9.") + + "* CAPACITY_TYPE_SECONDARY_STORAGE = 6" + "* CAPACITY_TYPE_VLAN = 7" + "* CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP = 8" + "* CAPACITY_TYPE_LOCAL_STORAGE = 9" + + "* CAPACITY_TYPE_GPU = 19" + "* CAPACITY_TYPE_CPU_CORE = 90.") private Integer type; @Parameter(name = ApiConstants.SORT_BY, type = CommandType.STRING, since = "3.0.0", description = "Sort the results. Available values: Usage") @@ -127,6 +130,17 @@ public void execute() { ListResponse response = new ListResponse(); List capacityResponses = _responseGenerator.createCapacityResponse(result, s_percentFormat); + Collections.sort(capacityResponses, new Comparator() { + public int compare(CapacityResponse resp1, CapacityResponse resp2) { + int res = resp1.getZoneName().compareTo(resp2.getZoneName()); + if (res != 0) { + return res; + } else { + return resp1.getCapacityType().compareTo(resp2.getCapacityType()); + } + } + }); + response.setResponses(capacityResponses); response.setResponseName(getCommandName()); this.setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java index 11c00e3a4b70..e0c798c78491 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java +++ b/api/src/org/apache/cloudstack/api/command/admin/template/CopyTemplateCmdByAdmin.java @@ -40,11 +40,20 @@ public class CopyTemplateCmdByAdmin extends CopyTemplateCmd { @Override public void execute() throws ResourceAllocationException{ try { + if (destZoneId == null && (destZoneIds == null || destZoneIds.size() == 0)) + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Either destzoneid or destzoneids parameters have to be specified."); + + if (destZoneId != null && destZoneIds != null && destZoneIds.size() != 0) + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Both destzoneid and destzoneids cannot be specified at the same time."); + CallContext.current().setEventDetails(getEventDescription()); VirtualMachineTemplate template = _templateService.copyTemplate(this); if (template != null){ - List listResponse = _responseGenerator.createTemplateResponses(ResponseView.Full, template, getDestinationZoneId(), false); + List listResponse = _responseGenerator.createTemplateResponses(ResponseView.Full, template, + getDestinationZoneIds(), false); TemplateResponse response = new TemplateResponse(); if (listResponse != null && !listResponse.isEmpty()) { response = listResponse.get(0); diff --git a/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java index 68d53f9df6fa..ba4772b66971 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java +++ b/api/src/org/apache/cloudstack/api/command/admin/template/RegisterTemplateCmdByAdmin.java @@ -40,10 +40,13 @@ public class RegisterTemplateCmdByAdmin extends RegisterTemplateCmd { @Override public void execute() throws ResourceAllocationException{ try { + validateParameters(); + VirtualMachineTemplate template = _templateService.registerTemplate(this); if (template != null){ ListResponse response = new ListResponse(); - List templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Full, template, zoneId, false); + List templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Full, template, + zoneIds, false); response.setResponses(templateResponses); response.setResponseName(getCommandName()); setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java index 4cceb3b5f9fc..90bc4f2153a1 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/usage/GetUsageRecordsCmd.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; +import java.util.Map; +import java.util.Set; import org.apache.log4j.Logger; @@ -31,6 +33,7 @@ import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.cloudstack.api.response.UsageRecordResponse; +import org.apache.cloudstack.api.response.ResourceTagResponse; import org.apache.cloudstack.usage.Usage; import com.cloud.utils.Pair; @@ -76,6 +79,9 @@ public class GetUsageRecordsCmd extends BaseListCmd { @Parameter(name = ApiConstants.USAGE_ID, type = CommandType.STRING, description = "List usage records for the specified usage UUID. Can be used only together with TYPE parameter.") private String usageId; + @Parameter(name = ApiConstants.INCLUDE_TAGS, type = CommandType.BOOLEAN, description = "Flag to enable display of Tags for a resource") + private Boolean includeTags; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -115,6 +121,10 @@ public void setAccountName(String accountName) { this.accountName = accountName; } + public Boolean getIncludeTags() { + return includeTags; + } + public void setDomainId(Long domainId) { this.domainId = domainId; } @@ -150,12 +160,18 @@ public void execute() { Pair, Integer> usageRecords = _usageService.getUsageRecords(this); ListResponse response = new ListResponse(); List usageResponses = new ArrayList(); + Map> resourceTagResponseMap = null; if (usageRecords != null) { + //read the resource tags details for all the resources in usage data and store in Map + if(null != includeTags && includeTags) { + resourceTagResponseMap = _responseGenerator.getUsageResourceTags(); + } for (Usage usageRecord : usageRecords.first()) { - UsageRecordResponse usageResponse = _responseGenerator.createUsageResponse(usageRecord); + UsageRecordResponse usageResponse = _responseGenerator.createUsageResponse(usageRecord, resourceTagResponseMap); usageResponse.setObjectName("usagerecord"); usageResponses.add(usageResponse); } + response.setResponses(usageResponses, usageRecords.second()); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java b/api/src/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java new file mode 100644 index 000000000000..f93c6e11728a --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/user/GetUserKeysCmd.java @@ -0,0 +1,77 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.admin.user; + + +import com.cloud.user.Account; +import com.cloud.user.User; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.response.RegisterResponse; +import org.apache.cloudstack.api.response.UserResponse; + +import java.util.Map; +import java.util.logging.Logger; + +@APICommand(name = GetUserKeysCmd.APINAME, + description = "This command allows the user to query the seceret and API keys for the account", + responseObject = RegisterResponse.class, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = true, + authorized = {RoleType.User, RoleType.Admin, RoleType.DomainAdmin, RoleType.ResourceAdmin}, + since = "4.10.0") + +public class GetUserKeysCmd extends BaseCmd{ + + @Parameter(name= ApiConstants.ID, type = CommandType.UUID, entityType = UserResponse.class, required = true, description = "ID of the user whose keys are required") + private Long id; + + public static final Logger s_logger = Logger.getLogger(RegisterCmd.class.getName()); + public static final String APINAME = "getUserKeys"; + + public Long getID(){ + return id; + } + + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + public long getEntityOwnerId(){ + User user = _entityMgr.findById(User.class, getID()); + if(user != null){ + return user.getAccountId(); + } + else return Account.ACCOUNT_ID_SYSTEM; + } + public void execute(){ + Map keys = _accountService.getKeys(this); + RegisterResponse response = new RegisterResponse(); + if(keys != null){ + response.setApiKey(keys.get("apikey")); + response.setSecretKey(keys.get("secretkey")); + } + + response.setObjectName("userkeys"); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java b/api/src/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java new file mode 100644 index 000000000000..b32aa2f13268 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/user/MoveUserCmd.java @@ -0,0 +1,126 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.user; + +import com.cloud.user.Account; +import com.cloud.user.User; +import com.google.common.base.Preconditions; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.AccountResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.cloudstack.api.response.UserResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.region.RegionService; +import org.apache.commons.lang3.ObjectUtils; +import org.apache.log4j.Logger; + +import javax.inject.Inject; + +@APICommand(name = "moveUser", + description = "Moves a user to another account", + responseObject = SuccessResponse.class, + requestHasSensitiveInfo = false, + responseHasSensitiveInfo = false, + since = "4.11", + authorized = {RoleType.Admin}) +public class MoveUserCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(UpdateUserCmd.class.getName()); + + public static final String APINAME = "moveUser"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + @Parameter(name = ApiConstants.ID, + type = CommandType.UUID, + entityType = UserResponse.class, + required = true, + description = "id of the user to be deleted") + private Long id; + + @Parameter(name = ApiConstants.ACCOUNT, + type = CommandType.STRING, + description = "Creates the user under the specified account. If no account is specified, the username will be used as the account name.") + private String accountName; + + @Parameter(name = ApiConstants.ACCOUNT_ID, + type = CommandType.UUID, + entityType = AccountResponse.class, + description = "Creates the user under the specified domain. Has to be accompanied with the account parameter") + private Long accountId; + + @Inject + RegionService _regionService; + + ///////////////////////////////////////////////////// + /////////////////// Accessors /////////////////////// + ///////////////////////////////////////////////////// + + public Long getId() { + return id; + } + + public String getAccountName() { + return accountName; + } + + public Long getAccountId() { + return accountId; + } + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + User user = _entityMgr.findById(User.class, getId()); + if (user != null) { + return user.getAccountId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked + } + + @Override + public void execute() { + Preconditions.checkNotNull(getId(),"I have to have an user to move!"); + Preconditions.checkState(ObjectUtils.anyNotNull(getAccountId(),getAccountName()),"provide either an account name or an account id!"); + + CallContext.current().setEventDetails("UserId: " + getId()); + boolean result = + _regionService.moveUser(this); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to move the user to a new account"); + } + } + +} diff --git a/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java index a2da7dbc8da5..fa66fdde1a72 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/vlan/CreateVlanIpRangeCmd.java @@ -112,6 +112,9 @@ public class CreateVlanIpRangeCmd extends BaseCmd { @Parameter(name = ApiConstants.IP6_CIDR, type = CommandType.STRING, description = "the CIDR of IPv6 network, must be at least /64") private String ip6Cidr; + @Parameter(name = ApiConstants.FOR_SYSTEM_VMS, type = CommandType.BOOLEAN, description = "true if IP range is set to system vms, false if not") + private Boolean forSystemVms; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -136,6 +139,10 @@ public String getGateway() { return gateway; } + public Boolean isForSystemVms() { + return forSystemVms == null ? Boolean.FALSE : forSystemVms; + } + public String getNetmask() { return netmask; } diff --git a/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java b/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java index 435b7f184840..da5f68860bc6 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/vm/AssignVMCmd.java @@ -29,9 +29,11 @@ import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.DomainResponse; import org.apache.cloudstack.api.response.NetworkResponse; +import org.apache.cloudstack.api.response.ProjectResponse; import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.UserVmResponse; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; import com.cloud.uservm.UserVm; import com.cloud.vm.VirtualMachine; @@ -58,12 +60,15 @@ public class AssignVMCmd extends BaseCmd { description = "id of the VM to be moved") private Long virtualMachineId; - @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, required = true, description = "account name of the new VM owner.") + @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "account name of the new VM owner.") private String accountName; - @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, required = true, description = "domain id of the new VM owner.") + @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain id of the new VM owner.") private Long domainId; + @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "an optional project for the new VM owner.") + private Long projectId; + //Network information @Parameter(name = ApiConstants.NETWORK_IDS, type = CommandType.LIST, @@ -98,6 +103,10 @@ public Long getDomainId() { return domainId; } + public Long getProjectId() { + return projectId; + } + public List getNetworkIds() { return networkIds; } @@ -125,6 +134,9 @@ public void execute() { UserVmResponse response = _responseGenerator.createUserVmResponse(ResponseView.Full, "virtualmachine", userVm).get(0); response.setResponseName(getCommandName()); setResponseObject(response); + } catch (InvalidParameterValueException e){ + e.printStackTrace(); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage()); } catch (Exception e) { e.printStackTrace(); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to move vm " + e.getMessage()); diff --git a/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java b/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java index 5fe5bfea485c..add22713931c 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java +++ b/api/src/org/apache/cloudstack/api/command/admin/volume/ListVolumesCmdByAdmin.java @@ -16,50 +16,15 @@ // under the License. package org.apache.cloudstack.api.command.admin.volume; -import org.apache.log4j.Logger; - -import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ResponseObject.ResponseView; import org.apache.cloudstack.api.command.user.volume.ListVolumesCmd; -import org.apache.cloudstack.api.response.PodResponse; -import org.apache.cloudstack.api.response.StoragePoolResponse; import org.apache.cloudstack.api.response.VolumeResponse; import com.cloud.storage.Volume; - -@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Full, entityType = {Volume.class}, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Full, entityType = { + Volume.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class ListVolumesCmdByAdmin extends ListVolumesCmd { - public static final Logger s_logger = Logger.getLogger(ListVolumesCmdByAdmin.class.getName()); - - @Parameter(name=ApiConstants.POD_ID, type=CommandType.UUID, entityType=PodResponse.class, - description="the pod id the disk volume belongs to") - private Long podId; - - - @Parameter(name=ApiConstants.STORAGE_ID, type=CommandType.UUID, entityType=StoragePoolResponse.class, - description="the ID of the storage pool, available to ROOT admin only", since="4.3", authorized = { RoleType.Admin }) - private Long storageId; - - - ///////////////////////////////////////////////////// - /////////////////// Accessors /////////////////////// - ///////////////////////////////////////////////////// - - - @Override - public Long getPodId() { - return podId; - } - - - @Override - public Long getStorageId() { - return storageId; - } } diff --git a/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java b/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java index 75bd9d21d1bd..15072ca9a4fd 100644 --- a/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/address/AssociateIPAddrCmd.java @@ -57,7 +57,7 @@ import com.cloud.projects.Project; import com.cloud.user.Account; -@APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account.", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted, +@APICommand(name = "associateIpAddress", description = "Acquires and associates a public IP to an account. Either of the parameters are required, i.e. either zoneId, or networkId, or vpcId ", responseObject = IPAddressResponse.class, responseView = ResponseView.Restricted, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class AssociateIPAddrCmd extends BaseAsyncCreateCmd { public static final Logger s_logger = Logger.getLogger(AssociateIPAddrCmd.class.getName()); diff --git a/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java b/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java index a4934fa1dd9b..b98c30897a05 100644 --- a/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/event/ListEventsCmd.java @@ -65,6 +65,9 @@ public class ListEventsCmd extends BaseListProjectAndAccountResourcesCmd { @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "the event type (see event types)") private String type; + @Parameter(name = ApiConstants.START_ID, type = CommandType.UUID, entityType = EventResponse.class, description = "the parent/start ID of the event, when provided this will list all the events with the start/parent ID including the parent event") + private Long startId; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -97,6 +100,10 @@ public String getType() { return type; } + public Long getStartId() { + return startId; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java index 0303445af77d..9299c3ddd2c8 100644 --- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateEgressFirewallRuleCmd.java @@ -77,6 +77,9 @@ public class CreateEgressFirewallRuleCmd extends BaseAsyncCreateCmd implements F @Parameter(name = ApiConstants.CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic from") private List cidrlist; + @Parameter(name = ApiConstants.DEST_CIDR_LIST, type = CommandType.LIST, collectionType = CommandType.STRING, description = "the cidr list to forward traffic to") + private List destCidrList; + @Parameter(name = ApiConstants.ICMP_TYPE, type = CommandType.INTEGER, description = "type of the icmp message being sent") private Integer icmpType; @@ -113,6 +116,11 @@ public List getSourceCidrList() { } } + @Override + public List getDestinationCidrList(){ + return destCidrList; + } + public Long getVpcId() { Network network = _networkService.getNetwork(getNetworkId()); if (network == null) { @@ -136,6 +144,10 @@ public void setSourceCidrList(List cidrs) { cidrlist = cidrs; } + public void setDestCidrList(List cidrs){ + destCidrList = cidrs; + } + @Override public void execute() throws ResourceUnavailableException { CallContext callerContext = CallContext.current(); @@ -234,10 +246,10 @@ public void create() { String guestCidr = _networkService.getNetwork(getNetworkId()).getCidr(); for (String cidr : getSourceCidrList()) { - if (!NetUtils.isValidCIDR(cidr)) { + if (!NetUtils.isValidIp4Cidr(cidr) && !NetUtils.isValidIp6Cidr(cidr)) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Source cidrs formatting error " + cidr); } - if (cidr.equals(NetUtils.ALL_CIDRS)) { + if (cidr.equals(NetUtils.ALL_IP4_CIDRS)) { continue; } if (!NetUtils.isNetworkAWithinNetworkB(cidr, guestCidr)) { @@ -245,6 +257,16 @@ public void create() { } } } + + //Destination CIDR formatting check. Since it's optional param, no need to set a default as in the case of source. + if(destCidrList != null){ + for(String cidr : destCidrList){ + if(!NetUtils.isValidIp4Cidr(cidr) && !NetUtils.isValidIp6Cidr(cidr)) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Destination cidrs formatting error" + cidr); + } + } + } + if (getProtocol().equalsIgnoreCase(NetUtils.ALL_PROTO)) { if (getSourcePortStart() != null && getSourcePortEnd() != null) { throw new InvalidParameterValueException("Do not pass ports to protocol ALL, protocol ALL do not require ports. Unable to create " + diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java index ee62aa5ad4ad..fab7d9eef29a 100644 --- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreateFirewallRuleCmd.java @@ -108,7 +108,7 @@ public List getSourceCidrList() { return cidrlist; } else { List oneCidrList = new ArrayList(); - oneCidrList.add(NetUtils.ALL_CIDRS); + oneCidrList.add(NetUtils.ALL_IP4_CIDRS); return oneCidrList; } @@ -242,7 +242,7 @@ public long getDomainId() { public void create() { if (getSourceCidrList() != null) { for (String cidr : getSourceCidrList()) { - if (!NetUtils.isValidCIDR(cidr)) { + if (!NetUtils.isValidIp4Cidr(cidr) && !NetUtils.isValidIp6Cidr(cidr)) { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, "Source CIDRs formatting error " + cidr); } } @@ -349,6 +349,11 @@ public boolean isDisplay() { } } + @Override + public List getDestinationCidrList(){ + return null; + } + @Override public Class getEntityType() { return FirewallRule.class; diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java index 9a0dffe1fdc5..ea0cb00301a0 100644 --- a/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/firewall/CreatePortForwardingRuleCmd.java @@ -348,7 +348,7 @@ public void create() { Ip privateIp = getVmSecondaryIp(); if (privateIp != null) { - if (!NetUtils.isValidIp(privateIp.toString())) { + if (!NetUtils.isValidIp4(privateIp.toString())) { throw new InvalidParameterValueException("Invalid vm ip address"); } } @@ -429,6 +429,11 @@ public TrafficType getTrafficType() { return null; } + @Override + public List getDestinationCidrList(){ + return null; + } + @Override public boolean isDisplay() { if (display != null) { diff --git a/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java index 5f609b726f80..7de50761630b 100644 --- a/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/firewall/UpdatePortForwardingRuleCmd.java @@ -47,9 +47,13 @@ public class UpdatePortForwardingRuleCmd extends BaseAsyncCustomIdCmd { @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = FirewallRuleResponse.class, required = true, description = "the ID of the port forwarding rule", since = "4.4") private Long id; - @Parameter(name=ApiConstants.PRIVATE_PORT, type=CommandType.INTEGER, description="the private port of the port forwarding rule") + @Parameter(name=ApiConstants.PRIVATE_START_PORT, type=CommandType.INTEGER, description="the private start port of the port forwarding rule") private Integer privatePort; + + @Parameter(name=ApiConstants.PRIVATE_END_PORT, type=CommandType.INTEGER, description="the private end port of the port forwarding rule") + private Integer privateEndPort; + @Parameter(name = ApiConstants.VIRTUAL_MACHINE_ID, type = CommandType.UUID, entityType = UserVmResponse.class, @@ -74,6 +78,10 @@ public Integer getPrivatePort() { return privatePort; } + public Integer getPrivateEndPort() { + return privateEndPort; + } + public Long getVirtualMachineId() { return virtualMachineId; } @@ -130,7 +138,7 @@ public void checkUuid() { @Override public void execute() { - PortForwardingRule rule = _rulesService.updatePortForwardingRule(id, getPrivatePort(), getVirtualMachineId(), getVmGuestIp(), getCustomId(), getDisplay()); + PortForwardingRule rule = _rulesService.updatePortForwardingRule(getId(), getPrivatePort(), getPrivateEndPort(), getVirtualMachineId(), getVmGuestIp(), getCustomId(), getDisplay()); FirewallRuleResponse fwResponse = new FirewallRuleResponse(); if (rule != null) { fwResponse = _responseGenerator.createPortForwardingRuleResponse(rule); diff --git a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java index 599aac1fd03c..745b87dd941a 100644 --- a/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/iso/RegisterIsoCmd.java @@ -94,7 +94,7 @@ public class RegisterIsoCmd extends BaseCmd { @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional account name. Must be used with domainId.") private String accountName; - @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this ISO") + @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this ISO. " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION) private String checksum; @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "Register ISO for the project") @@ -108,6 +108,11 @@ public class RegisterIsoCmd extends BaseCmd { description = "true if ISO contains XS/VMWare tools inorder to support dynamic scaling of VM CPU/memory") protected Boolean isDynamicallyScalable; + @Parameter(name=ApiConstants.DIRECT_DOWNLOAD, + type = CommandType.BOOLEAN, + description = "true if ISO should bypass Secondary Storage and be downloaded to Primary Storage on deployment") + private Boolean directDownload; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -168,6 +173,10 @@ public Boolean isDynamicallyScalable() { return isDynamicallyScalable == null ? Boolean.FALSE : isDynamicallyScalable; } + public boolean isDirectDownload() { + return directDownload == null ? false : directDownload; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java index fdc8a31c59a5..1e7303708014 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/AssignToLoadBalancerRuleCmd.java @@ -140,7 +140,7 @@ public Map> getVmIdIpListMap() { } //check wether the given ip is valid ip or not - if (vmIp == null || !NetUtils.isValidIp(vmIp)) { + if (vmIp == null || !NetUtils.isValidIp4(vmIp)) { throw new InvalidParameterValueException("Invalid ip address "+ vmIp +" passed in vmidipmap for " + "vmid " + vmId); } diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java index 2efd036cc97f..656c14c10483 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/DeleteSslCertCmd.java @@ -34,7 +34,7 @@ import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.lb.CertService; +import org.apache.cloudstack.network.tls.CertService; import com.cloud.utils.exception.CloudRuntimeException; @APICommand(name = "deleteSslCert", description = "Delete a certificate to CloudStack", responseObject = SuccessResponse.class, diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java index d1dbdcb28236..cfa567548500 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListSslCertsCmd.java @@ -33,7 +33,7 @@ import org.apache.cloudstack.api.response.SslCertResponse; import org.apache.cloudstack.context.CallContext; -import com.cloud.network.lb.CertService; +import org.apache.cloudstack.network.tls.CertService; import com.cloud.utils.exception.CloudRuntimeException; @APICommand(name = "listSslCerts", description = "Lists SSL certificates", responseObject = SslCertResponse.class, diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java index 6b1e0fddd54a..6ee277a354c9 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UpdateLoadBalancerRuleCmd.java @@ -64,6 +64,9 @@ public class UpdateLoadBalancerRuleCmd extends BaseAsyncCustomIdCmd { @Parameter(name = ApiConstants.FOR_DISPLAY, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the rule to the end user or not", since = "4.4", authorized = {RoleType.Admin}) private Boolean display; + @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, description = "The protocol for the LB") + private String lbProtocol; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -88,6 +91,10 @@ public Boolean getDisplay() { return display; } + public String getLbProtocol() { + return lbProtocol; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java index 4bd2de9017f4..309e43fcbbe9 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/UploadSslCertCmd.java @@ -36,7 +36,7 @@ import com.cloud.exception.NetworkRuleConflictException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.network.lb.CertService; +import org.apache.cloudstack.network.tls.CertService; @APICommand(name = "uploadSslCert", description = "Upload a certificate to CloudStack", responseObject = SslCertResponse.class, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) @@ -73,6 +73,9 @@ public class UploadSslCertCmd extends BaseCmd { @Parameter(name = ApiConstants.DOMAIN_ID, type = CommandType.UUID, entityType = DomainResponse.class, description = "domain ID of the account owning the SSL certificate") private Long domainId; + @Parameter(name = ApiConstants.NAME , type = CommandType.STRING, required = true, description = "Name for the uploaded certificate") + private String name; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -105,10 +108,15 @@ public Long getProjectId() { return projectId; } + public String getName() { + return name; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// + @Override public void execute() throws ResourceUnavailableException, InsufficientCapacityException, ServerApiException, ConcurrentOperationException, ResourceAllocationException, NetworkRuleConflictException { diff --git a/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java b/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java index d85030e3cd96..1b367a9fa7b3 100644 --- a/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/nat/CreateIpForwardingRuleCmd.java @@ -323,6 +323,11 @@ public boolean isDisplay() { return true; } + @Override + public List getDestinationCidrList(){ + return null; + } + @Override public Class getEntityType() { return FirewallRule.class; diff --git a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java index c8a8f8cae394..4b6a836f32a8 100644 --- a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkACLCmd.java @@ -134,7 +134,7 @@ public List getSourceCidrList() { return cidrlist; } else { List oneCidrList = new ArrayList(); - oneCidrList.add(NetUtils.ALL_CIDRS); + oneCidrList.add(NetUtils.ALL_IP4_CIDRS); return oneCidrList; } } diff --git a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java index 173126148082..befef999bfd5 100644 --- a/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/network/CreateNetworkCmd.java @@ -16,7 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.user.network; -import com.cloud.utils.net.NetUtils; import org.apache.log4j.Logger; import org.apache.cloudstack.acl.RoleType; @@ -44,6 +43,7 @@ import com.cloud.network.Network; import com.cloud.network.Network.GuestType; import com.cloud.offering.NetworkOffering; +import com.cloud.utils.net.NetUtils; @APICommand(name = "createNetwork", description = "Creates a network", responseObject = NetworkResponse.class, responseView = ResponseView.Restricted, entityType = {Network.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) @@ -134,6 +134,9 @@ public class CreateNetworkCmd extends BaseCmd { @Parameter(name = ApiConstants.IP6_CIDR, type = CommandType.STRING, description = "the CIDR of IPv6 network, must be at least /64") private String ip6Cidr; + @Parameter(name = ApiConstants.EXTERNAL_ID, type = CommandType.STRING, description = "ID of the network in an external system.") + private String externalId; + @Parameter(name = ApiConstants.DISPLAY_NETWORK, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the network to the end user or not.", authorized = {RoleType.Admin}) @@ -209,6 +212,10 @@ public Boolean getDisplayNetwork() { return displayNetwork; } + public String getExternalId() { + return externalId; + } + @Override public boolean isDisplay() { if(displayNetwork == null) diff --git a/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java index 62566653bca7..645ae5aff8e3 100644 --- a/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/network/RestartNetworkCmd.java @@ -55,7 +55,10 @@ public class RestartNetworkCmd extends BaseAsyncCmd { private Long id; @Parameter(name = ApiConstants.CLEANUP, type = CommandType.BOOLEAN, required = false, description = "If cleanup old network elements") - private Boolean cleanup; + private Boolean cleanup = false; + + @Parameter(name = ApiConstants.MAKEREDUNDANT, type = CommandType.BOOLEAN, required = false, description = "Turn the network into a network with redundant routers.", since = "4.11.1") + private Boolean makeRedundant = false; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -71,10 +74,11 @@ public Long getNetworkId() { } public Boolean getCleanup() { - if (cleanup != null) { - return cleanup; - } - return true; + return cleanup; + } + + public Boolean getMakeRedundant() { + return makeRedundant; } ///////////////////////////////////////////////////// @@ -92,7 +96,7 @@ public static String getResultObjectName() { @Override public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException { - boolean result = _networkService.restartNetwork(this, getCleanup()); + boolean result = _networkService.restartNetwork(this, getCleanup(), getMakeRedundant()); if (result) { SuccessResponse response = new SuccessResponse(getCommandName()); setResponseObject(response); diff --git a/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java b/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java index 921e74b67b2c..c313f369b0e2 100644 --- a/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/network/UpdateNetworkCmd.java @@ -75,11 +75,17 @@ public class UpdateNetworkCmd extends BaseAsyncCustomIdCmd { @Parameter(name = ApiConstants.GUEST_VM_CIDR, type = CommandType.STRING, description = "CIDR for guest VMs, CloudStack allocates IPs to guest VMs only from this CIDR") private String guestVmCidr; + @Parameter(name =ApiConstants.Update_IN_SEQUENCE, type=CommandType.BOOLEAN, description = "if true, we will update the routers one after the other. applicable only for redundant router based networks using virtual router as provider") + private Boolean updateInSequence; + @Parameter(name = ApiConstants.DISPLAY_NETWORK, type = CommandType.BOOLEAN, description = "an optional field, whether to the display the network to the end user or not.", authorized = {RoleType.Admin}) private Boolean displayNetwork; + @Parameter(name= ApiConstants.FORCED, type = CommandType.BOOLEAN, description = "Setting this to true will cause a forced network update,", authorized = {RoleType.Admin}) + private Boolean forced; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -119,6 +125,19 @@ public Boolean getDisplayNetwork() { return displayNetwork; } + public Boolean getUpdateInSequence(){ + if(updateInSequence ==null) + return false; + else + return updateInSequence; + } + + public boolean getForced(){ + if(forced==null){ + return false; + } + return forced; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -149,7 +168,7 @@ public void execute() throws InsufficientCapacityException, ConcurrentOperationE Network result = _networkService.updateGuestNetwork(getId(), getNetworkName(), getDisplayText(), callerAccount, callerUser, getNetworkDomain(), getNetworkOfferingId(), - getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId()); + getChangeCidr(), getGuestVmCidr(), getDisplayNetwork(), getCustomId(), getUpdateInSequence(), getForced()); if (result != null) { NetworkResponse response = _responseGenerator.createNetworkResponse(ResponseView.Restricted, result); diff --git a/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java b/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java index 14d1d55ff8bb..68c09c27fb03 100644 --- a/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/resource/ListResourceLimitsCmd.java @@ -19,6 +19,8 @@ import java.util.ArrayList; import java.util.List; +import com.cloud.configuration.Resource; +import com.cloud.exception.InvalidParameterValueException; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; @@ -58,6 +60,21 @@ public class ListResourceLimitsCmd extends BaseListProjectAndAccountResourcesCmd + "11 - SecondaryStorage. Total secondary storage space (in GiB) a user can use. ") private Integer resourceType; + @Parameter(name = ApiConstants.RESOURCE_TYPE_NAME, type = CommandType.STRING, description = "Type of resource (wins over resourceType if both are provided). Values are: " + + "user_vm - Instance. Number of instances a user can create. " + + "public_ip - IP. Number of public IP addresses an account can own. " + + "volume - Volume. Number of disk volumes an account can own. " + + "snapshot - Snapshot. Number of snapshots an account can own. " + + "template - Template. Number of templates an account can register/create. " + + "project - Project. Number of projects an account can own. " + + "network - Network. Number of networks an account can own. " + + "vpc - VPC. Number of VPC an account can own. " + + "cpu - CPU. Number of CPU an account can allocate for his resources. " + + "memory - Memory. Amount of RAM an account can allocate for his resources. " + + "primary_storage - PrimaryStorage. Total primary storage space (in GiB) a user can use. " + + "secondary_storage - SecondaryStorage. Total secondary storage space (in GiB) a user can use. ") + private String resourceTypeName; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -70,6 +87,10 @@ public Integer getResourceType() { return resourceType; } + public String getResourceTypeName() { + return resourceTypeName; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -83,7 +104,7 @@ public String getCommandName() { public void execute() { List result = _resourceLimitService.searchForLimits(id, _accountService.finalyzeAccountId(this.getAccountName(), this.getDomainId(), this.getProjectId(), false), this.getDomainId(), - resourceType, this.getStartIndex(), this.getPageSizeVal()); + getResourceTypeEnum(), this.getStartIndex(), this.getPageSizeVal()); ListResponse response = new ListResponse(); List limitResponses = new ArrayList(); for (ResourceLimit limit : result) { @@ -96,4 +117,23 @@ public void execute() { response.setResponseName(getCommandName()); this.setResponseObject(response); } + + private Resource.ResourceType getResourceTypeEnum() { + // Map resource type + Resource.ResourceType resourceTypeResult = null; + if (resourceTypeName != null) { + try { + resourceTypeResult = Resource.ResourceType.valueOf(resourceTypeName); + } catch (IllegalArgumentException e) { + throw new InvalidParameterValueException("Please specify a valid resource type name."); + } + } else if (resourceType != null) { + resourceTypeResult = Resource.ResourceType.fromOrdinal(resourceType); + if (resourceTypeResult == null) { + throw new InvalidParameterValueException("Please specify a valid resource type."); + } + } + + return resourceTypeResult; + } } diff --git a/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java index 306ab5fb877f..d66b64993997 100644 --- a/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotCmd.java @@ -16,8 +16,15 @@ // under the License. package org.apache.cloudstack.api.command.user.snapshot; -import org.apache.log4j.Logger; - +import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.projects.Project; +import com.cloud.storage.Snapshot; +import com.cloud.storage.Volume; +import com.cloud.user.Account; +import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiCommandJobType; import org.apache.cloudstack.api.ApiConstants; @@ -30,16 +37,7 @@ import org.apache.cloudstack.api.response.SnapshotPolicyResponse; import org.apache.cloudstack.api.response.SnapshotResponse; import org.apache.cloudstack.api.response.VolumeResponse; -import org.apache.cloudstack.context.CallContext; - -import com.cloud.event.EventTypes; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.PermissionDeniedException; -import com.cloud.exception.ResourceAllocationException; -import com.cloud.projects.Project; -import com.cloud.storage.Snapshot; -import com.cloud.storage.Volume; -import com.cloud.user.Account; +import org.apache.log4j.Logger; @APICommand(name = "createSnapshot", description = "Creates an instant snapshot of a volume.", responseObject = SnapshotResponse.class, entityType = {Snapshot.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) @@ -74,9 +72,16 @@ public class CreateSnapshotCmd extends BaseAsyncCreateCmd { @Parameter(name = ApiConstants.SNAPSHOT_QUIESCEVM, type = CommandType.BOOLEAN, required = false, description = "quiesce vm if true") private Boolean quiescevm; + @Parameter(name = ApiConstants.LOCATION_TYPE, type = CommandType.STRING, required = false, description = "Currently applicable only for managed storage. " + + "Valid location types: 'primary', 'secondary'. Default = 'primary'.") + private String locationType; + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the snapshot") private String snapshotName; + @Parameter(name = ApiConstants.ASYNC_BACKUP, type = CommandType.BOOLEAN, required = false, description = "asynchronous backup if true") + private Boolean asyncBackup; + private String syncObjectType = BaseAsyncCmd.snapshotHostSyncObject; // /////////////////////////////////////////////////// @@ -108,7 +113,7 @@ public String getSnapshotName() { } public String getVolumeUuid() { - Volume volume = (Volume)this._entityMgr.findById(Volume.class, getVolumeId()); + Volume volume = _entityMgr.findById(Volume.class, getVolumeId()); if (volume == null) { throw new InvalidParameterValueException("Unable to find volume's UUID"); } @@ -141,7 +146,7 @@ public String getCommandName() { } public static String getResultObjectName() { - return "snapshot"; + return ApiConstants.SNAPSHOT; } @Override @@ -184,7 +189,7 @@ public ApiCommandJobType getInstanceType() { @Override public void create() throws ResourceAllocationException { - Snapshot snapshot = _volumeService.allocSnapshot(getVolumeId(), getPolicyId(), getSnapshotName()); + Snapshot snapshot = _volumeService.allocSnapshot(getVolumeId(), getPolicyId(), getSnapshotName(), getLocationType()); if (snapshot != null) { setEntityId(snapshot.getId()); setEntityUuid(snapshot.getUuid()); @@ -195,21 +200,37 @@ public void create() throws ResourceAllocationException { @Override public void execute() { - s_logger.info("VOLSS: createSnapshotCmd starts:" + System.currentTimeMillis()); - CallContext.current().setEventDetails("Volume Id: " + getVolumeUuid()); Snapshot snapshot; try { snapshot = - _volumeService.takeSnapshot(getVolumeId(), getPolicyId(), getEntityId(), _accountService.getAccount(getEntityOwnerId()), getQuiescevm()); + _volumeService.takeSnapshot(getVolumeId(), getPolicyId(), getEntityId(), _accountService.getAccount(getEntityOwnerId()), getQuiescevm(), getLocationType(), getAsyncBackup()); + if (snapshot != null) { SnapshotResponse response = _responseGenerator.createSnapshotResponse(snapshot); response.setResponseName(getCommandName()); setResponseObject(response); } else { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + volumeId); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + getVolumeId()); } } catch (Exception e) { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + volumeId); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot for volume " + getVolumeId()); + } + } + + private Snapshot.LocationType getLocationType() { + + if (Snapshot.LocationType.values() == null || Snapshot.LocationType.values().length == 0 || locationType == null) { + return null; + } + + try { + String lType = locationType.trim().toUpperCase(); + return Snapshot.LocationType.valueOf(lType); + } catch (IllegalArgumentException e) { + String errMesg = "Invalid locationType " + locationType + "Specified for volume " + getVolumeId() + + " Valid values are: primary,secondary "; + s_logger.warn(errMesg); + throw new CloudRuntimeException(errMesg); } } @@ -228,4 +249,12 @@ public Long getSyncObjId() { } return null; } + + public Boolean getAsyncBackup() { + if (asyncBackup == null) { + return false; + } else { + return asyncBackup; + } + } } diff --git a/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java new file mode 100644 index 000000000000..7a35d3462f5b --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/CreateSnapshotFromVMSnapshotCmd.java @@ -0,0 +1,219 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.user.snapshot; + +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiCommandJobType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.BaseAsyncCmd; +import org.apache.cloudstack.api.BaseAsyncCreateCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.response.SnapshotResponse; +import org.apache.cloudstack.api.response.VMSnapshotResponse; +import org.apache.cloudstack.api.response.VolumeResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; + +import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.exception.PermissionDeniedException; +import com.cloud.exception.ResourceAllocationException; +import com.cloud.projects.Project; +import com.cloud.storage.Snapshot; +import com.cloud.user.Account; +import com.cloud.uservm.UserVm; +import com.cloud.vm.snapshot.VMSnapshot; + +@APICommand(name = "createSnapshotFromVMSnapshot", description = "Creates an instant snapshot of a volume from existing vm snapshot.", responseObject = SnapshotResponse.class, entityType = {Snapshot.class}, since = "4.10.0", + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +public class CreateSnapshotFromVMSnapshotCmd extends BaseAsyncCreateCmd { + public static final Logger s_logger = Logger.getLogger(CreateSnapshotFromVMSnapshotCmd.class.getName()); + private static final String s_name = "createsnapshotfromvmsnapshotresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.VOLUME_ID, type = CommandType.UUID, entityType = VolumeResponse.class, required = true, description = "The ID of the disk volume") + private Long volumeId; + + @Parameter(name=ApiConstants.VM_SNAPSHOT_ID, type=CommandType.UUID, entityType=VMSnapshotResponse.class, + required=true, description="The ID of the VM snapshot") + private Long vmSnapshotId; + + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the snapshot") + private String snapshotName; + + private String syncObjectType = BaseAsyncCmd.snapshotHostSyncObject; + + // /////////////////////////////////////////////////// + // ///////////////// Accessors /////////////////////// + // /////////////////////////////////////////////////// + + public Long getVolumeId() { + return volumeId; + } + + public Long getVMSnapshotId() { + return vmSnapshotId; + } + + public String getSnapshotName() { + return snapshotName; + } + + private Long getVmId() { + VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class, getVMSnapshotId()); + if (vmsnapshot == null) { + throw new InvalidParameterValueException("Unable to find vm snapshot by id=" + getVMSnapshotId()); + } + UserVm vm = _entityMgr.findById(UserVm.class, vmsnapshot.getVmId()); + if (vm == null) { + throw new InvalidParameterValueException("Unable to find vm by vm snapshot id=" + getVMSnapshotId()); + } + return vm.getId(); + } + private Long getHostId() { + VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class, getVMSnapshotId()); + if (vmsnapshot == null) { + throw new InvalidParameterValueException("Unable to find vm snapshot by id=" + getVMSnapshotId()); + } + UserVm vm = _entityMgr.findById(UserVm.class, vmsnapshot.getVmId()); + if (vm != null) { + if(vm.getHostId() != null) { + return vm.getHostId(); + } else if(vm.getLastHostId() != null) { + return vm.getLastHostId(); + } + } + return null; + } + + + // /////////////////////////////////////////////////// + // ///////////// API Implementation/////////////////// + // /////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return s_name; + } + + public static String getResultObjectName() { + return ApiConstants.SNAPSHOT; + } + + @Override + public long getEntityOwnerId() { + + VMSnapshot vmsnapshot = _entityMgr.findById(VMSnapshot.class, getVMSnapshotId()); + if (vmsnapshot == null) { + throw new InvalidParameterValueException("Unable to find vmsnapshot by id=" + getVMSnapshotId()); + } + + Account account = _accountService.getAccount(vmsnapshot.getAccountId()); + //Can create templates for enabled projects/accounts only + if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { + Project project = _projectService.findByProjectAccountId(vmsnapshot.getAccountId()); + if (project == null) { + throw new InvalidParameterValueException("Unable to find project by account id=" + account.getUuid()); + } + if (project.getState() != Project.State.Active) { + throw new PermissionDeniedException("Can't add resources to the project id=" + project.getUuid() + " in state=" + project.getState() + " as it's no longer active"); + } + } else if (account.getState() == Account.State.disabled) { + throw new PermissionDeniedException("The owner of template is disabled: " + account); + } + + return vmsnapshot.getAccountId(); + } + + @Override + public String getEventType() { + return EventTypes.EVENT_SNAPSHOT_CREATE; + } + + @Override + public String getEventDescription() { + return "creating snapshot from vm snapshot : " + getVMSnapshotId(); + } + + @Override + public ApiCommandJobType getInstanceType() { + return ApiCommandJobType.Snapshot; + } + + @Override + public void create() throws ResourceAllocationException { + Snapshot snapshot = this._volumeService.allocSnapshotForVm(getVmId(), getVolumeId(), getSnapshotName()); + if (snapshot != null) { + this.setEntityId(snapshot.getId()); + this.setEntityUuid(snapshot.getUuid()); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot from vm snapshot"); + } + } + + @Override + public void execute() { + s_logger.info("CreateSnapshotFromVMSnapshotCmd with vm snapshot id:" + getVMSnapshotId() + " and snapshot id:" + getEntityId() + " starts:" + System.currentTimeMillis()); + CallContext.current().setEventDetails("Vm Snapshot Id: "+ getVMSnapshotId()); + Snapshot snapshot = null; + try { + snapshot = _snapshotService.backupSnapshotFromVmSnapshot(getEntityId(), getVmId(), getVolumeId(), getVMSnapshotId()); + if (snapshot != null) { + SnapshotResponse response = _responseGenerator.createSnapshotResponse(snapshot); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot from vm snapshot " + getVMSnapshotId()); + } + } catch (InvalidParameterValueException ex) { + throw ex; + } catch (Exception e) { + s_logger.debug("Failed to create snapshot", e); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to create snapshot due to an internal error creating snapshot from vm snapshot " + getVMSnapshotId()); + } finally { + if (snapshot == null) { + try { + _snapshotService.deleteSnapshot(getEntityId()); + } catch (Exception e) { + s_logger.debug("Failed to clean failed snapshot" + getEntityId()); + } + } + } + } + + + @Override + public String getSyncObjType() { + if (getSyncObjId() != null) { + return syncObjectType; + } + return null; + } + + @Override + public Long getSyncObjId() { + if (getHostId() != null) { + return getHostId(); + } + return null; + } +} diff --git a/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java b/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java index 97bb187dd525..bdb23e4ad5b0 100644 --- a/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/snapshot/ListSnapshotsCmd.java @@ -34,8 +34,8 @@ import com.cloud.storage.Snapshot; import com.cloud.utils.Pair; -@APICommand(name = "listSnapshots", description = "Lists all available snapshots for the account.", responseObject = SnapshotResponse.class, entityType = {Snapshot.class}, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +@APICommand(name = "listSnapshots", description = "Lists all available snapshots for the account.", responseObject = SnapshotResponse.class, entityType = { + Snapshot.class }, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class ListSnapshotsCmd extends BaseListTaggedResourcesCmd { public static final Logger s_logger = Logger.getLogger(ListSnapshotsCmd.class.getName()); diff --git a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java index fdbdafd14469..d16b87cd95e8 100644 --- a/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/CopyTemplateCmd.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.command.user.template; +import java.util.ArrayList; import java.util.List; import org.apache.log4j.Logger; @@ -51,25 +52,46 @@ public class CopyTemplateCmd extends BaseAsyncCmd { @Parameter(name = ApiConstants.DESTINATION_ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, - required = true, + required = false, description = "ID of the zone the template is being copied to.") - private Long destZoneId; + protected Long destZoneId; - @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = TemplateResponse.class, required = true, description = "Template ID.") + @Parameter(name = ApiConstants.ID, type = CommandType.UUID, + entityType = TemplateResponse.class, required = true, description = "Template ID.") private Long id; @Parameter(name = ApiConstants.SOURCE_ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, - description = "ID of the zone the template is currently hosted on. If not specified and template is cross-zone, then we will sync this template to region wide image store.") + description = "ID of the zone the template is currently hosted on. " + + "If not specified and template is cross-zone, " + + "then we will sync this template to region wide image store.") private Long sourceZoneId; + @Parameter(name = ApiConstants.DESTINATION_ZONE_ID_LIST, + type=CommandType.LIST, + collectionType = CommandType.UUID, + entityType = ZoneResponse.class, + required = false, + description = "A list of IDs of the zones that the template needs to be copied to." + + "Specify this list if the template needs to copied to multiple zones in one go. " + + "Do not specify destzoneid and destzoneids together, however one of them is required.") + protected List destZoneIds; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// - public Long getDestinationZoneId() { - return destZoneId; + public List getDestinationZoneIds() { + if (destZoneIds != null && destZoneIds.size() != 0) { + return destZoneIds; + } + if (destZoneId != null) { + List < Long > destIds = new ArrayList<>(); + destIds.add(destZoneId); + return destIds; + } + return null; } public Long getId() { @@ -111,7 +133,8 @@ public String getEventType() { @Override public String getEventDescription() { - return "copying template: " + getId() + " from zone: " + getSourceZoneId() + " to zone: " + getDestinationZoneId(); + return "copying template: " + getId() + " from zone: " + getSourceZoneId() + + " to zone: " + getDestinationZoneIds(); } @Override @@ -127,11 +150,20 @@ public Long getInstanceId() { @Override public void execute() throws ResourceAllocationException { try { + if (destZoneId == null && (destZoneIds == null || destZoneIds.size() == 0)) + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Either destzoneid or destzoneids parameters have to be specified."); + + if (destZoneId != null && destZoneIds != null && destZoneIds.size() != 0) + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Both destzoneid and destzoneids cannot be specified at the same time."); + CallContext.current().setEventDetails(getEventDescription()); VirtualMachineTemplate template = _templateService.copyTemplate(this); if (template != null){ - List listResponse = _responseGenerator.createTemplateResponses(ResponseView.Restricted, template, getDestinationZoneId(), false); + List listResponse = _responseGenerator.createTemplateResponses(ResponseView.Restricted, + template, getDestinationZoneIds(), false); TemplateResponse response = new TemplateResponse(); if (listResponse != null && !listResponse.isEmpty()) { response = listResponse.get(0); diff --git a/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java old mode 100644 new mode 100755 index 98d53be836e5..95b3eeee0595 --- a/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/DeleteTemplateCmd.java @@ -52,6 +52,9 @@ public class DeleteTemplateCmd extends BaseAsyncCmd { @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of zone of the template") private Long zoneId; + @Parameter(name = ApiConstants.FORCED, type = CommandType.BOOLEAN, required = false, description = "Force delete a template.", since = "4.9+") + private Boolean forced; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -64,6 +67,9 @@ public Long getZoneId() { return zoneId; } + public boolean isForced() { + return (forced != null) ? forced : true; + } ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java index 772ca2749e7d..e7d328495ed6 100644 --- a/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/ListTemplatesCmd.java @@ -72,9 +72,12 @@ public class ListTemplatesCmd extends BaseListTaggedResourcesCmd { @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "list templates by zoneId") private Long zoneId; - @Parameter(name=ApiConstants.SHOW_REMOVED, type=CommandType.BOOLEAN, description="show removed templates as well") + @Parameter(name = ApiConstants.SHOW_REMOVED, type = CommandType.BOOLEAN, description = "show removed templates as well") private Boolean showRemoved; + @Parameter(name = ApiConstants.PARENT_TEMPLATE_ID, type = CommandType.UUID, entityType = TemplateResponse.class, description = "list datadisk templates by parent template id", since = "4.4") + private Long parentTemplateId; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -103,6 +106,10 @@ public Boolean getShowRemoved() { return (showRemoved != null ? showRemoved : false); } + public Long getParentTemplateId() { + return parentTemplateId; + } + public boolean listInReadyState() { Account account = CallContext.current().getCallingAccount(); diff --git a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java index 8ff0b6b449e8..333b363d16a9 100644 --- a/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmd.java @@ -16,7 +16,9 @@ // under the License. package org.apache.cloudstack.api.command.user.template; +import com.cloud.hypervisor.Hypervisor; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Collection; import java.util.List; import java.util.Map; @@ -109,7 +111,7 @@ public class RegisterTemplateCmd extends BaseCmd { private String url; @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class, - required=true, description="the ID of the zone the template is to be hosted on") + required=false, description="the ID of the zone the template is to be hosted on") protected Long zoneId; @Parameter(name = ApiConstants.DOMAIN_ID, @@ -121,7 +123,7 @@ public class RegisterTemplateCmd extends BaseCmd { @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.") private String accountName; - @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this template") + @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this template. " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION) private String checksum; @Parameter(name = ApiConstants.TEMPLATE_TAG, type = CommandType.STRING, description = "the tag for this template.") @@ -130,7 +132,8 @@ public class RegisterTemplateCmd extends BaseCmd { @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, description = "Register template for the project") private Long projectId; - @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "Template details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61") + @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, + description = "Template details in key/value pairs using format details[i].keyname=keyvalue. Example: details[0].hypervisortoolsversion=xenserver61") protected Map details; @Parameter(name = ApiConstants.IS_DYNAMICALLY_SCALABLE, @@ -141,6 +144,23 @@ public class RegisterTemplateCmd extends BaseCmd { @Parameter(name = ApiConstants.ROUTING, type = CommandType.BOOLEAN, description = "true if the template type is routing i.e., if template is used to deploy router") protected Boolean isRoutingType; + @Parameter(name=ApiConstants.ZONE_ID_LIST, + type=CommandType.LIST, + collectionType = CommandType.UUID, + entityType = ZoneResponse.class, + required=false, + description="A list of zone ids where the template will be hosted. Use this parameter if the template needs " + + "to be registered to multiple zones in one go. Use zoneid if the template " + + "needs to be registered to only one zone." + + "Passing only -1 to this will cause the template to be registered as a cross " + + "zone template and will be copied to all zones. ") + protected List zoneIds; + + @Parameter(name=ApiConstants.DIRECT_DOWNLOAD, + type = CommandType.BOOLEAN, + description = "true if template should bypass Secondary Storage and be downloaded to Primary Storage on deployment") + private Boolean directDownload; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -197,8 +217,22 @@ public String getUrl() { return url; } - public Long getZoneId() { - return zoneId; + public List getZoneIds() { + // This function will return null when the zoneId + //is -1 which means all zones. + if (zoneIds != null && !(zoneIds.isEmpty())) { + if ((zoneIds.size() == 1) && (zoneIds.get(0) == -1L)) + return null; + else + return zoneIds; + } + if (zoneId == null) + return null; + if (zoneId!= null && zoneId == -1) + return null; + List zones = new ArrayList<>(); + zones.add(zoneId); + return zones; } public Long getDomainId() { @@ -235,6 +269,10 @@ public Boolean isRoutingType() { return isRoutingType; } + public boolean isDirectDownload() { + return directDownload == null ? false : directDownload; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -261,10 +299,13 @@ public long getEntityOwnerId() { @Override public void execute() throws ResourceAllocationException { try { + validateParameters(); + VirtualMachineTemplate template = _templateService.registerTemplate(this); if (template != null) { ListResponse response = new ListResponse(); - List templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Restricted, template, zoneId, false); + List templateResponses = _responseGenerator.createTemplateResponses(ResponseView.Restricted, + template, getZoneIds(), false); response.setResponses(templateResponses); response.setResponseName(getCommandName()); setResponseObject(response); @@ -276,4 +317,23 @@ public void execute() throws ResourceAllocationException { throw new ServerApiException(ApiErrorCode.PARAM_ERROR, ex1.getMessage()); } } + + protected void validateParameters() { + if ((zoneId != null) && (zoneIds != null && !zoneIds.isEmpty())) + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Both zoneid and zoneids cannot be specified at the same time"); + + if (zoneId == null && (zoneIds == null || zoneIds.isEmpty())) + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Either zoneid or zoneids is required. Both cannot be null."); + + if (zoneIds != null && zoneIds.size() > 1 && zoneIds.contains(-1L)) + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Parameter zoneids cannot combine all zones (-1) option with other zones"); + + if (isDirectDownload() && !getHypervisor().equalsIgnoreCase(Hypervisor.HypervisorType.KVM.toString())) { + throw new ServerApiException(ApiErrorCode.PARAM_ERROR, + "Parameter directdownload is only allowed for KVM templates"); + } + } } diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java index 4b805acc396f..41481c8ff54e 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/AddIpToVmNicCmd.java @@ -173,7 +173,7 @@ public void create() throws ResourceAllocationException { NicSecondaryIp result; String secondaryIp = null; if ((ip = getIpaddress()) != null) { - if (!NetUtils.isValidIp(ip)) { + if (!NetUtils.isValidIp4(ip)) { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Invalid ip address " + ip); } } diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java index f265ecf236a0..ed2a4b563755 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/AddNicToVMCmd.java @@ -17,7 +17,10 @@ package org.apache.cloudstack.api.command.user.vm; import java.util.ArrayList; +import java.util.Collection; import java.util.EnumSet; +import java.util.HashMap; +import java.util.Map; import org.apache.log4j.Logger; @@ -36,8 +39,11 @@ import org.apache.cloudstack.context.CallContext; import com.cloud.event.EventTypes; +import com.cloud.exception.InvalidParameterValueException; import com.cloud.user.Account; import com.cloud.uservm.UserVm; +import com.cloud.utils.net.Dhcp; +import com.cloud.utils.net.NetUtils; import com.cloud.vm.VirtualMachine; @APICommand(name = "addNicToVirtualMachine", description = "Adds VM to specified network by creating a NIC", responseObject = UserVmResponse.class, responseView = ResponseView.Restricted, entityType = {VirtualMachine.class}, @@ -60,6 +66,13 @@ public class AddNicToVMCmd extends BaseAsyncCmd { @Parameter(name = ApiConstants.IP_ADDRESS, type = CommandType.STRING, description = "IP Address for the new network") private String ipaddr; + @Parameter(name = ApiConstants.MAC_ADDRESS, type = CommandType.STRING, description = "Mac Address for the new network") + private String macaddr; + + @Parameter(name = ApiConstants.DHCP_OPTIONS, type = CommandType.MAP, description = "DHCP options which are passed to the nic" + + " Example: dhcpoptions[0].dhcp:114=url&dhcpoptions[0].dhcp:66=www.test.com") + private Map dhcpOptions; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -76,6 +89,18 @@ public String getIpAddress() { return ipaddr; } + public String getMacAddress() { + if (macaddr == null) { + return null; + } + if(!NetUtils.isValidMac(macaddr)) { + throw new InvalidParameterValueException("Mac address is not valid: " + macaddr); + } else if(!NetUtils.isUnicastMac(macaddr)) { + throw new InvalidParameterValueException("Mac address is not unicast: " + macaddr); + } + return NetUtils.standardizeMacAddress(macaddr); + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// @@ -108,6 +133,28 @@ public long getEntityOwnerId() { return vm.getAccountId(); } + public Map getDhcpOptionsMap() { + Map dhcpOptionsMap = new HashMap<>(); + if (dhcpOptions != null && !dhcpOptions.isEmpty()) { + + Collection> paramsCollection = this.dhcpOptions.values(); + for(Map dhcpNetworkOptions : paramsCollection) { + for (String key : dhcpNetworkOptions.keySet()) { + if (key.startsWith(ApiConstants.DHCP_PREFIX)) { + int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, "")); + dhcpOptionsMap.put(dhcpOptionValue, dhcpNetworkOptions.get(key)); + } else { + Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key); + dhcpOptionsMap.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key)); + } + } + + } + } + + return dhcpOptionsMap; + } + @Override public void execute() { CallContext.current().setEventDetails("Vm Id: " + getVmId() + " Network Id: " + getNetworkId()); diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java index da0ce2a2ff9f..8161fb2564b1 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/DeployVMCmd.java @@ -24,6 +24,8 @@ import java.util.List; import java.util.Map; +import org.apache.log4j.Logger; + import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.ACL; @@ -46,7 +48,7 @@ import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; +import org.apache.commons.collections.MapUtils; import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; @@ -58,7 +60,10 @@ import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; import com.cloud.network.Network.IpAddresses; +import com.cloud.offering.DiskOffering; +import com.cloud.template.VirtualMachineTemplate; import com.cloud.uservm.UserVm; +import com.cloud.utils.net.Dhcp; import com.cloud.utils.net.NetUtils; import com.cloud.vm.VirtualMachine; @@ -147,7 +152,7 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG private List securityGroupNameList; @Parameter(name = ApiConstants.IP_NETWORK_LIST, type = CommandType.MAP, description = "ip to network mapping. Can't be specified with networkIds parameter." - + " Example: iptonetworklist[0].ip=10.10.10.11&iptonetworklist[0].ipv6=fc00:1234:5678::abcd&iptonetworklist[0].networkid=uuid - requests to use ip 10.10.10.11 in network id=uuid") + + " Example: iptonetworklist[0].ip=10.10.10.11&iptonetworklist[0].ipv6=fc00:1234:5678::abcd&iptonetworklist[0].networkid=uuid&iptonetworklist[0].mac=aa:bb:cc:dd:ee::ff - requests to use ip 10.10.10.11 in network id=uuid") private Map ipToNetworkList; @Parameter(name = ApiConstants.IP_ADDRESS, type = CommandType.STRING, description = "the ip address for default vm's network") @@ -156,6 +161,9 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG @Parameter(name = ApiConstants.IP6_ADDRESS, type = CommandType.STRING, description = "the ipv6 address for default vm's network") private String ip6Address; + @Parameter(name = ApiConstants.MAC_ADDRESS, type = CommandType.STRING, description = "the mac address for default vm's network") + private String macAddress; + @Parameter(name = ApiConstants.KEYBOARD, type = CommandType.STRING, description = "an optional keyboard device type for the virtual machine. valid value can be one of de,de-ch,es,fi,fr,fr-be,fr-ch,is,it,jp,nl-be,no,pt,uk,us") private String keyboard; @@ -184,6 +192,14 @@ public class DeployVMCmd extends BaseAsyncCreateCustomIdCmd implements SecurityG @Parameter(name = ApiConstants.DEPLOYMENT_PLANNER, type = CommandType.STRING, description = "Deployment planner to use for vm allocation. Available to ROOT admin only", since = "4.4", authorized = { RoleType.Admin }) private String deploymentPlanner; + @Parameter(name = ApiConstants.DHCP_OPTIONS_NETWORK_LIST, type = CommandType.MAP, description = "DHCP options which are passed to the VM on start up" + + " Example: dhcpoptionsnetworklist[0].dhcp:114=url&dhcpoptionsetworklist[0].networkid=networkid&dhcpoptionsetworklist[0].dhcp:66=www.test.com") + private Map dhcpOptionsNetworkList; + + @Parameter(name = ApiConstants.DATADISK_OFFERING_LIST, type = CommandType.MAP, since = "4.11", description = "datadisk template to disk-offering mapping;" + + " an optional parameter used to create additional data disks from datadisk templates; can't be specified with diskOfferingId parameter") + private Map dataDiskTemplateToDiskOfferingList; + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -333,10 +349,19 @@ public Map getIpToNetworkMap() { } String requestedIp = ips.get("ip"); String requestedIpv6 = ips.get("ipv6"); + String requestedMac = ips.get("mac"); if (requestedIpv6 != null) { requestedIpv6 = NetUtils.standardizeIp6Address(requestedIpv6); } - IpAddresses addrs = new IpAddresses(requestedIp, requestedIpv6); + if (requestedMac != null) { + if(!NetUtils.isValidMac(requestedMac)) { + throw new InvalidParameterValueException("Mac address is not valid: " + requestedMac); + } else if(!NetUtils.isUnicastMac(requestedMac)) { + throw new InvalidParameterValueException("Mac address is not unicast: " + requestedMac); + } + requestedMac = NetUtils.standardizeMacAddress(requestedMac); + } + IpAddresses addrs = new IpAddresses(requestedIp, requestedIpv6, requestedMac); ipToNetworkMap.put(networkId, addrs); } } @@ -355,6 +380,19 @@ public String getIp6Address() { return NetUtils.standardizeIp6Address(ip6Address); } + + public String getMacAddress() { + if (macAddress == null) { + return null; + } + if(!NetUtils.isValidMac(macAddress)) { + throw new InvalidParameterValueException("Mac address is not valid: " + macAddress); + } else if(!NetUtils.isUnicastMac(macAddress)) { + throw new InvalidParameterValueException("Mac address is not unicast: " + macAddress); + } + return NetUtils.standardizeMacAddress(macAddress); + } + public List getAffinityGroupIdList() { if (affinityGroupNameList != null && affinityGroupIdList != null) { throw new InvalidParameterValueException("affinitygroupids parameter is mutually exclusive with affinitygroupnames parameter"); @@ -382,6 +420,68 @@ public String getKeyboard() { return keyboard; } + public Map> getDhcpOptionsMap() { + Map> dhcpOptionsMap = new HashMap<>(); + if (dhcpOptionsNetworkList != null && !dhcpOptionsNetworkList.isEmpty()) { + + Collection> paramsCollection = this.dhcpOptionsNetworkList.values(); + for (Map dhcpNetworkOptions : paramsCollection) { + String networkId = dhcpNetworkOptions.get(ApiConstants.NETWORK_ID); + + if (networkId == null) { + throw new IllegalArgumentException("No networkid specified when providing extra dhcp options."); + } + + Map dhcpOptionsForNetwork = new HashMap<>(); + dhcpOptionsMap.put(networkId, dhcpOptionsForNetwork); + + for (String key : dhcpNetworkOptions.keySet()) { + if (key.startsWith(ApiConstants.DHCP_PREFIX)) { + int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, "")); + dhcpOptionsForNetwork.put(dhcpOptionValue, dhcpNetworkOptions.get(key)); + } else if (!key.equals(ApiConstants.NETWORK_ID)) { + Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key); + dhcpOptionsForNetwork.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key)); + } + } + + } + } + + return dhcpOptionsMap; + } + + public Map getDataDiskTemplateToDiskOfferingMap() { + if (diskOfferingId != null && dataDiskTemplateToDiskOfferingList != null) { + throw new InvalidParameterValueException("diskofferingid paramter can't be specified along with datadisktemplatetodiskofferinglist parameter"); + } + if (MapUtils.isEmpty(dataDiskTemplateToDiskOfferingList)) { + return new HashMap(); + } + + HashMap dataDiskTemplateToDiskOfferingMap = new HashMap(); + for (Object objDataDiskTemplates : dataDiskTemplateToDiskOfferingList.values()) { + HashMap dataDiskTemplates = (HashMap) objDataDiskTemplates; + Long dataDiskTemplateId; + DiskOffering dataDiskOffering = null; + VirtualMachineTemplate dataDiskTemplate= _entityMgr.findByUuid(VirtualMachineTemplate.class, dataDiskTemplates.get("datadisktemplateid")); + if (dataDiskTemplate == null) { + dataDiskTemplate = _entityMgr.findById(VirtualMachineTemplate.class, dataDiskTemplates.get("datadisktemplateid")); + if (dataDiskTemplate == null) + throw new InvalidParameterValueException("Unable to translate and find entity with datadisktemplateid " + dataDiskTemplates.get("datadisktemplateid")); + } + dataDiskTemplateId = dataDiskTemplate.getId(); + dataDiskOffering = _entityMgr.findByUuid(DiskOffering.class, dataDiskTemplates.get("diskofferingid")); + if (dataDiskOffering == null) { + dataDiskOffering = _entityMgr.findById(DiskOffering.class, dataDiskTemplates.get("diskofferingid")); + if (dataDiskOffering == null) + throw new InvalidParameterValueException("Unable to translate and find entity with diskofferingId " + dataDiskTemplates.get("diskofferingid")); + } + dataDiskTemplateToDiskOfferingMap.put(dataDiskTemplateId, dataDiskOffering); + } + return dataDiskTemplateToDiskOfferingMap; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java index ccec3e6ac13b..30a3b8cce907 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/ListNicsCmd.java @@ -18,7 +18,8 @@ import java.util.ArrayList; import java.util.List; - +import com.cloud.vm.NicSecondaryIp; +import org.apache.cloudstack.api.response.NicSecondaryIpResponse; import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiCommandJobType; @@ -122,22 +123,45 @@ public static String getResultObjectName() { public void execute() throws ResourceUnavailableException, ResourceAllocationException, ConcurrentOperationException, InsufficientCapacityException { try { - List results = _networkService.listNics(this); - ListResponse response = new ListResponse(); - List resList = null; - if (results != null) { - resList = new ArrayList(results.size()); - for (Nic r : results) { - NicResponse resp = _responseGenerator.createNicResponse(r); - resp.setObjectName("nic"); - resList.add(resp); + if (this.getKeyword() != null && !this.getKeyword().isEmpty() && this.getNicId() != null) { + List results = _networkService.listVmNicSecondaryIps(this); + ListResponse response = new ListResponse(); + List resList = new ArrayList(); + NicSecondaryIpResponse res = new NicSecondaryIpResponse(); + List res_List = new ArrayList(); + if (results != null) { + for (NicSecondaryIp r : results) { + NicSecondaryIpResponse ipRes = _responseGenerator.createSecondaryIPToNicResponse(r); + resList.add(ipRes); + res.setSecondaryIpsList(resList); + res.setObjectName("nic"); + } + + res_List.add(res); + response.setResponses(res_List); + } + response.setResponses(res_List); + response.setResponseName(getCommandName()); + this.setResponseObject(response); + + } else { + List results = _networkService.listNics(this); + ListResponse response = new ListResponse(); + List resList = null; + if (results != null) { + resList = new ArrayList(results.size()); + for (Nic r : results) { + NicResponse resp = _responseGenerator.createNicResponse(r); + resp.setObjectName("nic"); + resList.add(resp); + } + response.setResponses(resList); } + response.setResponses(resList); + response.setResponseName(getCommandName()); + this.setResponseObject(response); } - response.setResponses(resList); - response.setResponseName(getCommandName()); - this.setResponseObject(response); - } catch (Exception e) { s_logger.warn("Failed to list secondary ip address per nic "); throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, e.getMessage()); diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java index 4508f7e471af..57e2e9c3c016 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVMCmd.java @@ -17,9 +17,12 @@ package org.apache.cloudstack.api.command.user.vm; import java.util.Collection; +import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.log4j.Logger; + import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.acl.SecurityChecker.AccessType; import org.apache.cloudstack.api.ACL; @@ -34,12 +37,12 @@ import org.apache.cloudstack.api.response.SecurityGroupResponse; import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.context.CallContext; -import org.apache.log4j.Logger; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.user.Account; import com.cloud.uservm.UserVm; +import com.cloud.utils.net.Dhcp; import com.cloud.vm.VirtualMachine; @APICommand(name = "updateVirtualMachine", description="Updates properties of a virtual machine. The VM has to be stopped and restarted for the " + @@ -116,6 +119,16 @@ public class UpdateVMCmd extends BaseCustomIdCmd implements SecurityGroupAction ) private List securityGroupNameList; + @Parameter(name = ApiConstants.CLEAN_UP_DETAILS, + type = CommandType.BOOLEAN, + description = "optional boolean field, which indicates if details should be cleaned up or not (if set to true, details removed for this resource, details field ignored; if false or not set, no action)") + private Boolean cleanupDetails; + + @Parameter(name = ApiConstants.DHCP_OPTIONS_NETWORK_LIST, type = CommandType.MAP, description = "DHCP options which are passed to the VM on start up" + + " Example: dhcpoptionsnetworklist[0].dhcp:114=url&dhcpoptionsetworklist[0].networkid=networkid&dhcpoptionsetworklist[0].dhcp:66=www.test.com") + private Map dhcpOptionsNetworkList; + + ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// @@ -173,6 +186,41 @@ public List getSecurityGroupNameList() { return securityGroupNameList; } + public boolean isCleanupDetails(){ + return cleanupDetails == null ? false : cleanupDetails.booleanValue(); + } + + public Map> getDhcpOptionsMap() { + Map> dhcpOptionsMap = new HashMap<>(); + if (dhcpOptionsNetworkList != null && !dhcpOptionsNetworkList.isEmpty()) { + + Collection> paramsCollection = this.dhcpOptionsNetworkList.values(); + for(Map dhcpNetworkOptions : paramsCollection) { + String networkId = dhcpNetworkOptions.get(ApiConstants.NETWORK_ID); + + if(networkId == null) { + throw new IllegalArgumentException("No networkid specified when providing extra dhcp options."); + } + + Map dhcpOptionsForNetwork = new HashMap<>(); + dhcpOptionsMap.put(networkId, dhcpOptionsForNetwork); + + for (String key : dhcpNetworkOptions.keySet()) { + if (key.startsWith(ApiConstants.DHCP_PREFIX)) { + int dhcpOptionValue = Integer.parseInt(key.replaceFirst(ApiConstants.DHCP_PREFIX, "")); + dhcpOptionsForNetwork.put(dhcpOptionValue, dhcpNetworkOptions.get(key)); + } else if (!key.equals(ApiConstants.NETWORK_ID)) { + Dhcp.DhcpOptionCode dhcpOptionEnum = Dhcp.DhcpOptionCode.valueOfString(key); + dhcpOptionsForNetwork.put(dhcpOptionEnum.getCode(), dhcpNetworkOptions.get(key)); + } + } + + } + } + + return dhcpOptionsMap; + } + ///////////////////////////////////////////////////// /////////////// API Implementation/////////////////// ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java index c6fbedbf6318..83fe72e70430 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vm/UpdateVmNicIpCmd.java @@ -150,7 +150,7 @@ public void execute() throws ResourceUnavailableException, ResourceAllocationExc CallContext.current().setEventDetails("Nic Id: " + getNicId() ); String ip; if ((ip = getIpaddress()) != null) { - if (!NetUtils.isValidIp(ip)) { + if (!NetUtils.isValidIp4(ip)) { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Invalid ip address " + ip); } } diff --git a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java index f18793ac5810..3e37bbe5e36a 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vmsnapshot/CreateVMSnapshotCmd.java @@ -110,7 +110,7 @@ public String getEventType() { @Override public void execute() { CallContext.current().setEventDetails("VM Id: " + getVmId()); - VMSnapshot result = _vmSnapshotService.creatVMSnapshot(getVmId(), getEntityId(), getQuiescevm()); + VMSnapshot result = _vmSnapshotService.createVMSnapshot(getVmId(), getEntityId(), getQuiescevm()); if (result != null) { VMSnapshotResponse response = _responseGenerator.createVMSnapshotResponse(result); response.setResponseName(getCommandName()); diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java index 059def7c1676..c858f494fef7 100644 --- a/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/volume/ListVolumesCmd.java @@ -16,9 +16,8 @@ // under the License. package org.apache.cloudstack.api.command.user.volume; -import org.apache.log4j.Logger; - import java.util.List; + import org.apache.cloudstack.acl.RoleType; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiCommandJobType; @@ -26,6 +25,7 @@ import org.apache.cloudstack.api.BaseListTaggedResourcesCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ResponseObject.ResponseView; +import org.apache.cloudstack.api.response.ClusterResponse; import org.apache.cloudstack.api.response.DiskOfferingResponse; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.ListResponse; @@ -34,11 +34,12 @@ import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.cloudstack.api.response.VolumeResponse; import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.log4j.Logger; import com.cloud.storage.Volume; -@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = {Volume.class}, - requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) +@APICommand(name = "listVolumes", description = "Lists all volumes.", responseObject = VolumeResponse.class, responseView = ResponseView.Restricted, entityType = { + Volume.class}, requestHasSensitiveInfo = false, responseHasSensitiveInfo = false) public class ListVolumesCmd extends BaseListTaggedResourcesCmd { public static final Logger s_logger = Logger.getLogger(ListVolumesCmd.class.getName()); @@ -54,7 +55,7 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd { @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = VolumeResponse.class, description = "the ID of the disk volume") private Long id; - @Parameter(name=ApiConstants.IDS, type=CommandType.LIST, collectionType=CommandType.UUID, entityType=VolumeResponse.class, description="the IDs of the volumes, mutually exclusive with id", since = "4.9") + @Parameter(name = ApiConstants.IDS, type = CommandType.LIST, collectionType = CommandType.UUID, entityType = VolumeResponse.class, description = "the IDs of the volumes, mutually exclusive with id", since = "4.9") private List ids; @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the disk volume") @@ -63,6 +64,9 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd { @Parameter(name = ApiConstants.POD_ID, type = CommandType.UUID, entityType = PodResponse.class, description = "the pod id the disk volume belongs to") private Long podId; + @Parameter(name = ApiConstants.CLUSTER_ID, type = CommandType.UUID, entityType = ClusterResponse.class, description = "the cluster id the disk volume belongs to", authorized = {RoleType.Admin}) + private Long clusterId; + @Parameter(name = ApiConstants.TYPE, type = CommandType.STRING, description = "the type of disk volume") private String type; @@ -72,22 +76,15 @@ public class ListVolumesCmd extends BaseListTaggedResourcesCmd { @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "the ID of the availability zone") private Long zoneId; - @Parameter(name = ApiConstants.STORAGE_ID, - type = CommandType.UUID, - entityType = StoragePoolResponse.class, - description = "the ID of the storage pool, available to ROOT admin only", - since = "4.3", - authorized = {RoleType.Admin}) - private Long storageId; - - @Parameter(name = ApiConstants.DISK_OFFERING_ID, - type = CommandType.UUID, - entityType = DiskOfferingResponse.class, - description = "list volumes by disk offering", - since = "4.4") + @Parameter(name = ApiConstants.STORAGE_ID, type = CommandType.STRING, entityType = StoragePoolResponse.class, description = "the ID of the storage pool, available to ROOT admin only", since = "4.3", authorized = { + RoleType.Admin}) + private String storageId; + + @Parameter(name = ApiConstants.DISK_OFFERING_ID, type = CommandType.UUID, entityType = DiskOfferingResponse.class, description = "list volumes by disk offering", since = "4.4") private Long diskOfferingId; - @Parameter(name = ApiConstants.DISPLAY_VOLUME, type = CommandType.BOOLEAN, description = "list resources by display flag; only ROOT admin is eligible to pass this parameter", since = "4.4", authorized = {RoleType.Admin}) + @Parameter(name = ApiConstants.DISPLAY_VOLUME, type = CommandType.BOOLEAN, description = "list resources by display flag; only ROOT admin is eligible to pass this parameter", since = "4.4", authorized = { + RoleType.Admin}) private Boolean display; ///////////////////////////////////////////////////// @@ -98,6 +95,10 @@ public Long getHostId() { return hostId; } + public Long getClusterId() { + return clusterId; + } + public Long getId() { return id; } @@ -126,7 +127,7 @@ public Long getZoneId() { return zoneId; } - public Long getStorageId() { + public String getStorageId() { return storageId; } diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java index 4ec94494ac18..8eea632a72ec 100644 --- a/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/volume/ResizeVolumeCmd.java @@ -78,6 +78,14 @@ public class ResizeVolumeCmd extends BaseAsyncCmd { /////////////////// Accessors /////////////////////// ///////////////////////////////////////////////////// + public ResizeVolumeCmd() {} + + public ResizeVolumeCmd(Long id, Long minIops, Long maxIops) { + this.id = id; + this.minIops = minIops; + this.maxIops = maxIops; + } + //TODO use the method getId() instead of this one. public Long getEntityId() { return id; diff --git a/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java b/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java index 217496167531..a48a89b79b4e 100644 --- a/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/volume/UploadVolumeCmd.java @@ -82,7 +82,7 @@ public class UploadVolumeCmd extends BaseAsyncCmd { @Parameter(name = ApiConstants.ACCOUNT, type = CommandType.STRING, description = "an optional accountName. Must be used with domainId.") private String accountName; - @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the MD5 checksum value of this volume") + @Parameter(name = ApiConstants.CHECKSUM, type = CommandType.STRING, description = "the checksum value of this volume. " + ApiConstants.CHECKSUM_PARAMETER_PREFIX_DESCRIPTION) private String checksum; @Parameter(name = ApiConstants.IMAGE_STORE_UUID, type = CommandType.STRING, description = "Image store uuid") diff --git a/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java index ea34c6a95807..edfd93e785ec 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vpc/RestartVPCCmd.java @@ -49,10 +49,10 @@ public class RestartVPCCmd extends BaseAsyncCmd { private Long id; @Parameter(name = ApiConstants.CLEANUP, type = CommandType.BOOLEAN, required = false, description = "If cleanup old network elements") - private Boolean cleanup; + private Boolean cleanup = false; - @Parameter(name = ApiConstants.MAKEREDUNDANTE, type = CommandType.BOOLEAN, required = false, description = "Turn a single VPC into a redundant one.") - private Boolean makeredundant; + @Parameter(name = ApiConstants.MAKEREDUNDANT, type = CommandType.BOOLEAN, required = false, description = "Turn a single VPC into a redundant one.") + private Boolean makeredundant = false; ///////////////////////////////////////////////////// /////////////////// Accessors /////////////////////// @@ -63,17 +63,11 @@ public Long getId() { } public Boolean getCleanup() { - if (cleanup != null) { - return cleanup; - } - return true; + return cleanup; } public Boolean getMakeredundant() { - if (makeredundant != null) { - return makeredundant; - } - return true; + return makeredundant; } ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java index 9993102eca1a..9fd4c5a2dfc4 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vpn/AddVpnUserCmd.java @@ -119,8 +119,12 @@ public String getEventType() { public void execute() { VpnUser vpnUser = _entityMgr.findById(VpnUser.class, getEntityId()); Account account = _entityMgr.findById(Account.class, vpnUser.getAccountId()); - if (!_ravService.applyVpnUsers(vpnUser.getAccountId(), userName)) { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add vpn user"); + try { + if (!_ravService.applyVpnUsers(vpnUser.getAccountId(), userName)) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add vpn user"); + } + }catch (Exception ex) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, ex.getMessage()); } VpnUsersResponse vpnResponse = new VpnUsersResponse(); diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java index e1131092f02b..5c2cbfe11288 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vpn/CreateVpnCustomerGatewayCmd.java @@ -89,7 +89,7 @@ public class CreateVpnCustomerGatewayCmd extends BaseAsyncCmd { private Long domainId; @Parameter(name = ApiConstants.PROJECT_ID, type = CommandType.UUID, entityType = ProjectResponse.class, - description = "create site-to-site VPN customer gateway for the project") + description = "create site-to-site VPN customer gateway for the project", since = "4.6") private Long projectId; ///////////////////////////////////////////////////// diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java index 37b7b5aaa3e7..12ab531375f1 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vpn/DeleteRemoteAccessVpnCmd.java @@ -93,7 +93,7 @@ public String getEventType() { @Override public void execute() throws ResourceUnavailableException { - if (! _ravService.destroyRemoteAccessVpnForIp(publicIpId, CallContext.current().getCallingAccount())) { + if (! _ravService.destroyRemoteAccessVpnForIp(publicIpId, CallContext.current().getCallingAccount(), false)) { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete remote access vpn"); } } diff --git a/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java b/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java index f552b14fbf13..140bdad717f7 100644 --- a/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/vpn/RemoveVpnUserCmd.java @@ -115,9 +115,14 @@ public void execute() { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove vpn user"); } - if (!_ravService.applyVpnUsers(owner.getId(), userName)) { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to apply vpn user removal"); + try { + if (!_ravService.applyVpnUsers(owner.getId(), userName)) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to apply vpn user removal"); + } + }catch (Exception ex) { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to remove vpn user due to resource unavailable"); } + SuccessResponse response = new SuccessResponse(getCommandName()); setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/api/response/AccountResponse.java b/api/src/org/apache/cloudstack/api/response/AccountResponse.java index 7b48a1ea8a1c..18b11f10bd17 100644 --- a/api/src/org/apache/cloudstack/api/response/AccountResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AccountResponse.java @@ -29,7 +29,6 @@ import com.cloud.serializer.Param; import com.cloud.user.Account; -@SuppressWarnings("unused") @EntityReference(value = Account.class) public class AccountResponse extends BaseResponse implements ResourceLimitAndCountResponse { @SerializedName(ApiConstants.ID) @@ -222,7 +221,7 @@ public class AccountResponse extends BaseResponse implements ResourceLimitAndCou @SerializedName("secondarystoragetotal") @Param(description = "the total secondary storage space (in GiB) owned by account", since = "4.2.0") - private Long secondaryStorageTotal; + private float secondaryStorageTotal; @SerializedName("secondarystorageavailable") @Param(description = "the total secondary storage space (in GiB) available to be used for this account", since = "4.2.0") @@ -501,7 +500,7 @@ public void setSecondaryStorageLimit(String secondaryStorageLimit) { } @Override - public void setSecondaryStorageTotal(Long secondaryStorageTotal) { + public void setSecondaryStorageTotal(float secondaryStorageTotal) { this.secondaryStorageTotal = secondaryStorageTotal; } diff --git a/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java b/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java new file mode 100644 index 000000000000..a74c95780d1f --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/AcquireIPAddressResponse.java @@ -0,0 +1,286 @@ +//Licensed to the Apache Software Foundation (ASF) under one +//or more contributor license agreements. See the NOTICE file +//distributed with this work for additional information +//regarding copyright ownership. The ASF licenses this file +//to you under the Apache License, Version 2.0 (the +//"License"); you may not use this file except in compliance +//with the License. You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, +//software distributed under the License is distributed on an +//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +//KIND, either express or implied. See the License for the +//specific language governing permissions and limitations +//under the License. +package org.apache.cloudstack.api.response; + +import java.util.Date; +import java.util.List; + +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +import com.cloud.network.IpAddress; +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +@EntityReference(value = IpAddress.class) +@SuppressWarnings("unused") +public class AcquireIPAddressResponse extends BaseResponse implements ControlledEntityResponse { + @SerializedName(ApiConstants.ID) + @Param(description = "public IP address id") + private String id; + + @SerializedName(ApiConstants.IP_ADDRESS) + @Param(description = "public IP address") + private String ipAddress; + + @SerializedName("allocated") + @Param(description = "date the public IP address was acquired") + private Date allocated; + + @SerializedName(ApiConstants.ZONE_ID) + @Param(description = "the ID of the zone the public IP address belongs to") + private String zoneId; + + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "the name of the zone the public IP address belongs to") + private String zoneName; + + @SerializedName("issourcenat") + @Param(description = "true if the IP address is a source nat address, false otherwise") + private Boolean sourceNat; + + @SerializedName(ApiConstants.ACCOUNT) + @Param(description = "the account the public IP address is associated with") + private String accountName; + + @SerializedName(ApiConstants.PROJECT_ID) + @Param(description = "the project id of the ipaddress") + private String projectId; + + @SerializedName(ApiConstants.PROJECT) + @Param(description = "the project name of the address") + private String projectName; + + @SerializedName(ApiConstants.DOMAIN_ID) + @Param(description = "the domain ID the public IP address is associated with") + private String domainId; + + @SerializedName(ApiConstants.DOMAIN) + @Param(description = "the domain the public IP address is associated with") + private String domainName; + + @SerializedName(ApiConstants.FOR_VIRTUAL_NETWORK) + @Param(description = "the virtual network for the IP address") + private Boolean forVirtualNetwork; + + @SerializedName(ApiConstants.VLAN_ID) + @Param(description = "the ID of the VLAN associated with the IP address." + " This parameter is visible to ROOT admins only") + private String vlanId; + + @SerializedName("vlanname") + @Param(description = "the VLAN associated with the IP address") + private String vlanName; + + @SerializedName("isstaticnat") + @Param(description = "true if this ip is for static nat, false otherwise") + private Boolean staticNat; + + @SerializedName(ApiConstants.IS_SYSTEM) + @Param(description = "true if this ip is system ip (was allocated as a part of deployVm or createLbRule)") + private Boolean isSystem; + + @SerializedName(ApiConstants.VIRTUAL_MACHINE_ID) + @Param(description = "virtual machine id the ip address is assigned to (not null only for static nat Ip)") + private String virtualMachineId; + + @SerializedName("vmipaddress") + @Param(description = "virtual machine (dnat) ip address (not null only for static nat Ip)") + private String virtualMachineIp; + + @SerializedName("virtualmachinename") + @Param(description = "virtual machine name the ip address is assigned to (not null only for static nat Ip)") + private String virtualMachineName; + + @SerializedName("virtualmachinedisplayname") + @Param(description = "virtual machine display name the ip address is assigned to (not null only for static nat Ip)") + private String virtualMachineDisplayName; + + @SerializedName(ApiConstants.ASSOCIATED_NETWORK_ID) + @Param(description = "the ID of the Network associated with the IP address") + private String associatedNetworkId; + + @SerializedName(ApiConstants.ASSOCIATED_NETWORK_NAME) + @Param(description = "the name of the Network associated with the IP address") + private String associatedNetworkName; + + @SerializedName(ApiConstants.NETWORK_ID) + @Param(description = "the ID of the Network where ip belongs to") + private String networkId; + + @SerializedName(ApiConstants.STATE) + @Param(description = "State of the ip address. Can be: Allocatin, Allocated and Releasing") + private String state; + + @SerializedName(ApiConstants.PHYSICAL_NETWORK_ID) + @Param(description = "the physical network this belongs to") + private String physicalNetworkId; + + @SerializedName(ApiConstants.PURPOSE) + @Param(description = "purpose of the IP address. In Acton this value is not null for Ips with isSystem=true, and can have either StaticNat or LB value") + private String purpose; + + @SerializedName(ApiConstants.VPC_ID) + @Param(description = "VPC the ip belongs to") + private String vpcId; + @SerializedName(ApiConstants.TAGS) + @Param(description = "the list of resource tags associated with ip address", responseObject = ResourceTagResponse.class) + private List tags; + + @SerializedName(ApiConstants.IS_PORTABLE) + @Param(description = "is public IP portable across the zones") + private Boolean isPortable; + + @SerializedName(ApiConstants.FOR_DISPLAY) + @Param(description = "is public ip for display to the regular user", since = "4.4", authorized = {RoleType.Admin}) + private Boolean forDisplay; + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + @Override + public String getObjectId() { + return this.getId(); + } + + public void setAllocated(Date allocated) { + this.allocated = allocated; + } + + public void setZoneId(String zoneId) { + this.zoneId = zoneId; + } + + public void setZoneName(String zoneName) { + this.zoneName = zoneName; + } + + public void setSourceNat(Boolean sourceNat) { + this.sourceNat = sourceNat; + } + + @Override + public void setAccountName(String accountName) { + this.accountName = accountName; + } + + @Override + public void setDomainId(String domainId) { + this.domainId = domainId; + } + + @Override + public void setDomainName(String domainName) { + this.domainName = domainName; + } + + public void setForVirtualNetwork(Boolean forVirtualNetwork) { + this.forVirtualNetwork = forVirtualNetwork; + } + + public void setVlanId(String vlanId) { + this.vlanId = vlanId; + } + + public void setVlanName(String vlanName) { + this.vlanName = vlanName; + } + + public void setStaticNat(Boolean staticNat) { + this.staticNat = staticNat; + } + + public void setAssociatedNetworkId(String networkId) { + this.associatedNetworkId = networkId; + } + + public void setNetworkId(String networkId) { + this.networkId = networkId; + } + + public void setVirtualMachineId(String virtualMachineId) { + this.virtualMachineId = virtualMachineId; + } + + public void setVirtualMachineIp(String virtualMachineIp) { + this.virtualMachineIp = virtualMachineIp; + } + + public void setVirtualMachineName(String virtualMachineName) { + this.virtualMachineName = virtualMachineName; + } + + public void setVirtualMachineDisplayName(String virtualMachineDisplayName) { + this.virtualMachineDisplayName = virtualMachineDisplayName; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public void setState(String state) { + this.state = state; + } + + @Override + public void setProjectId(String projectId) { + this.projectId = projectId; + } + + @Override + public void setProjectName(String projectName) { + this.projectName = projectName; + } + + public void setPhysicalNetworkId(String physicalNetworkId) { + this.physicalNetworkId = physicalNetworkId; + } + + public void setIsSystem(Boolean isSystem) { + this.isSystem = isSystem; + } + + public void setPurpose(String purpose) { + this.purpose = purpose; + } + + public void setVpcId(String vpcId) { + this.vpcId = vpcId; + } + + public void setTags(List tags) { + this.tags = tags; + } + + public void setAssociatedNetworkName(String associatedNetworkName) { + this.associatedNetworkName = associatedNetworkName; + } + + public void setPortable(Boolean portable) { + this.isPortable = portable; + } + + public void setForDisplay(Boolean forDisplay) { + this.forDisplay = forDisplay; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/AcquirePodIpCmdResponse.java b/api/src/org/apache/cloudstack/api/response/AcquirePodIpCmdResponse.java new file mode 100644 index 000000000000..3eece1d7afb0 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/AcquirePodIpCmdResponse.java @@ -0,0 +1,113 @@ +//Licensed to the Apache Software Foundation (ASF) under one +//or more contributor license agreements. See the NOTICE file +//distributed with this work for additional information +//regarding copyright ownership. The ASF licenses this file +//to you under the Apache License, Version 2.0 (the +//"License"); you may not use this file except in compliance +//with the License. You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, +//software distributed under the License is distributed on an +//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +//KIND, either express or implied. See the License for the +//specific language governing permissions and limitations +//under the License. + +package org.apache.cloudstack.api.response; + +import com.google.gson.annotations.SerializedName; + +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import com.cloud.serializer.Param; + +public class AcquirePodIpCmdResponse extends BaseResponse { + + @SerializedName(ApiConstants.IP_ADDRESS) + @Param(description = "Allocated IP address") + private String ipAddress; + + @SerializedName(ApiConstants.POD_ID) + @Param(description = "the ID of the pod the IP address belongs to") + private Long podId; + + @SerializedName(ApiConstants.GATEWAY) + @Param(description = "Gateway for Pod ") + private String gateway; + + @SerializedName(ApiConstants.CIDR) + @Param(description = "CIDR of the Pod") + private String cidrAddress; + + @SerializedName(ApiConstants.NIC_ID) + @Param(description = "the ID of the nic") + private Long instanceId; + + @SerializedName(ApiConstants.HOST_MAC) + @Param(description = "MAC address of the pod the IP") + private Long macAddress; + + @SerializedName(ApiConstants.ID) + @Param(description = "the ID of the pod the IP address") + private long id; + + public void setIpAddress(String ipAddress) { + this.ipAddress = ipAddress; + } + + public void setInstanceId(Long instanceId) { + this.instanceId = instanceId; + } + + public void setPodId(long podId) { + this.podId = podId; + } + + public void setMacAddress(long macAddress) { + this.macAddress = macAddress; + } + + public void setGateway(String gateway) { + this.gateway = gateway; + } + + public void setCidrAddress(String cidrAddress) { + this.cidrAddress = cidrAddress; + } + + public long getId() { + return id; + } + + public Long getInstanceId() { + return instanceId; + } + + public long getPodId() { + return podId; + } + + public String getIpAddress() { + return ipAddress; + } + + public long getMacAddress() { + return macAddress; + } + + public String getCidrAddress() { + return cidrAddress; + } + + public String getGateway() { + return gateway; + } + + public void setId(long id) { + this.id = id; + } + +} \ No newline at end of file diff --git a/api/src/org/apache/cloudstack/api/response/AnnotationResponse.java b/api/src/org/apache/cloudstack/api/response/AnnotationResponse.java new file mode 100644 index 000000000000..c16971ae7f3d --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/AnnotationResponse.java @@ -0,0 +1,121 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.response; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.annotation.Annotation; +import org.apache.cloudstack.annotation.AnnotationService; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +import java.util.Date; + +/** + * @since 4.11 + */ +@EntityReference(value = Annotation.class) +public class AnnotationResponse extends BaseResponse { + @SerializedName(ApiConstants.ID) + @Param(description = "the (uu)id of the annotation") + private String uuid; + + @SerializedName(ApiConstants.ENTITY_TYPE) + @Param(description = "the type of the annotated entity") + private String entityType; + + @SerializedName(ApiConstants.ENTITY_ID) + @Param(description = "the (uu)id of the entitiy to which this annotation pertains") + private String entityUuid; + + @SerializedName(ApiConstants.ANNOTATION) + @Param(description = "the contents of the annotation") + private String annotation; + + @SerializedName(ApiConstants.USER_ID) + @Param(description = "The (uu)id of the user that entered the annotation") + private String userUuid; + + @SerializedName(ApiConstants.CREATED) + @Param(description = "the creation timestamp for this annotation") + private Date created; + + @SerializedName(ApiConstants.REMOVED) + @Param(description = "the removal timestamp for this annotation") + private Date removed; + + public String getUuid() { + return uuid; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public String getEntityType() { + return entityType; + } + + public void setEntityType(String entityType) { + this.entityType = entityType; + } + + public void setEntityType(AnnotationService.EntityType entityType) { + this.entityType = entityType.toString(); + } + + public String getEntityUuid() { + return entityUuid; + } + + public void setEntityUuid(String entityUuid) { + this.entityUuid = entityUuid; + } + + public String getAnnotation() { + return annotation; + } + + public void setAnnotation(String annotation) { + this.annotation = annotation; + } + + public String getUserUuid() { + return userUuid; + } + + public void setUserUuid(String userUuid) { + this.userUuid = userUuid; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public Date getRemoved() { + return removed; + } + + public void setRemoved(Date removed) { + this.removed = removed; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java b/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java index 2c219357150f..412af1c27362 100644 --- a/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java +++ b/api/src/org/apache/cloudstack/api/response/AutoScaleVmProfileResponse.java @@ -75,6 +75,7 @@ public class AutoScaleVmProfileResponse extends BaseResponse implements Controll @Parameter(name = ApiConstants.CS_URL, type = CommandType.STRING, description = "the API URL including port of the CloudStack Management Server example: http://server.cloud.com:8080/client/api?") + // leaving cloud.com reference above as it serves only as an example private String csUrl; @SerializedName(ApiConstants.ACCOUNT) diff --git a/api/src/org/apache/cloudstack/api/response/CAProviderResponse.java b/api/src/org/apache/cloudstack/api/response/CAProviderResponse.java new file mode 100644 index 000000000000..94d5882e18ac --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/CAProviderResponse.java @@ -0,0 +1,52 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.response; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; +import org.apache.cloudstack.framework.ca.CAProvider; + +@EntityReference(value = CAProvider.class) +public class CAProviderResponse extends BaseResponse { + @SerializedName(ApiConstants.NAME) + @Param(description = "the CA service provider name") + private String name; + + @SerializedName(ApiConstants.DESCRIPTION) + @Param(description = "the description of the CA service provider") + private String description; + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/CapacityResponse.java b/api/src/org/apache/cloudstack/api/response/CapacityResponse.java index 460e4af89263..e9724497c38b 100644 --- a/api/src/org/apache/cloudstack/api/response/CapacityResponse.java +++ b/api/src/org/apache/cloudstack/api/response/CapacityResponse.java @@ -28,6 +28,10 @@ public class CapacityResponse extends BaseResponse { @Param(description = "the capacity type") private Short capacityType; + @SerializedName(ApiConstants.NAME) + @Param(description="the capacity name") + private String capacityName; + @SerializedName(ApiConstants.ZONE_ID) @Param(description = "the Zone ID") private String zoneId; @@ -52,6 +56,10 @@ public class CapacityResponse extends BaseResponse { @Param(description = "the Cluster name") private String clusterName; + @SerializedName("capacityallocated") + @Param(description="the capacity currently in allocated") + private Long capacityAllocated; + @SerializedName("capacityused") @Param(description = "the capacity currently in use") private Long capacityUsed; @@ -72,6 +80,14 @@ public void setCapacityType(Short capacityType) { this.capacityType = capacityType; } + public String getCapacityName() { + return capacityName; + } + + public void setCapacityName(String capacityName) { + this.capacityName = capacityName; + } + public String getZoneId() { return zoneId; } @@ -120,6 +136,14 @@ public void setClusterName(String clusterName) { this.clusterName = clusterName; } + public Long getCapacityAllocated() { + return capacityAllocated; + } + + public void setCapacityAllocated(Long capacityAllocated) { + this.capacityAllocated = capacityAllocated; + } + public Long getCapacityUsed() { return capacityUsed; } diff --git a/api/src/org/apache/cloudstack/api/response/CertificateResponse.java b/api/src/org/apache/cloudstack/api/response/CertificateResponse.java new file mode 100644 index 000000000000..f8c3ecc74044 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/CertificateResponse.java @@ -0,0 +1,58 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.response; + +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +public class CertificateResponse extends BaseResponse { + @SerializedName(ApiConstants.CERTIFICATE) + @Param(description = "The client certificate") + private String certificate = ""; + + @SerializedName(ApiConstants.PRIVATE_KEY) + @Param(description = "Private key for the certificate") + private String privateKey; + + @SerializedName(ApiConstants.CA_CERTIFICATES) + @Param(description = "The CA certificate(s)") + private String caCertificate; + + public CertificateResponse() { + setObjectName("certificates"); + } + + public CertificateResponse(final String objectName) { + setObjectName(objectName); + } + + public void setCertificate(final String certificate) { + this.certificate = certificate; + } + + public void setPrivateKey(final String privateKey) { + this.privateKey = privateKey; + } + + public void setCaCertificate(final String caCertificate) { + this.caCertificate = caCertificate; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/ChildTemplateResponse.java b/api/src/org/apache/cloudstack/api/response/ChildTemplateResponse.java new file mode 100644 index 000000000000..b036cd48e879 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/ChildTemplateResponse.java @@ -0,0 +1,66 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.response; + +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +import com.cloud.serializer.Param; +import com.cloud.template.VirtualMachineTemplate; +import com.google.gson.annotations.SerializedName; + +@EntityReference(value = VirtualMachineTemplate.class) +@SuppressWarnings("unused") +public class ChildTemplateResponse extends BaseResponse { + @SerializedName(ApiConstants.ID) + @Param(description = "the template ID") + private String id; + + @SerializedName(ApiConstants.NAME) + @Param(description = "the template name") + private String name; + + @SerializedName(ApiConstants.SIZE) + @Param(description = "the size of the template") + private Integer size; + + @SerializedName("templatetype") + @Param(description = "the type of the template") + private String templateType; + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public void setName(String name) { + this.name = name; + } + + public void setSize(Integer size) { + this.size = size; + } + + public void setTemplateType(String templateType) { + this.templateType = templateType; + } + +} diff --git a/api/src/org/apache/cloudstack/api/response/DomainResponse.java b/api/src/org/apache/cloudstack/api/response/DomainResponse.java index e848759c9e4d..7e5bd970d295 100644 --- a/api/src/org/apache/cloudstack/api/response/DomainResponse.java +++ b/api/src/org/apache/cloudstack/api/response/DomainResponse.java @@ -165,7 +165,7 @@ public class DomainResponse extends BaseResponse implements ResourceLimitAndCoun private String secondaryStorageLimit; @SerializedName("secondarystoragetotal") @Param(description="the total secondary storage space (in GiB) owned by domain", since="4.2.0") - private Long secondaryStorageTotal; + private float secondaryStorageTotal; @SerializedName("secondarystorageavailable") @Param(description="the total secondary storage space (in GiB) available to be used for this domain", since="4.2.0") private String secondaryStorageAvailable; @@ -399,7 +399,7 @@ public void setSecondaryStorageLimit(String secondaryStorageLimit) { } @Override - public void setSecondaryStorageTotal(Long secondaryStorageTotal) { + public void setSecondaryStorageTotal(float secondaryStorageTotal) { this.secondaryStorageTotal = secondaryStorageTotal; } diff --git a/api/src/org/apache/cloudstack/api/response/EventResponse.java b/api/src/org/apache/cloudstack/api/response/EventResponse.java index 5ce66edcd28c..da15434e6d0f 100644 --- a/api/src/org/apache/cloudstack/api/response/EventResponse.java +++ b/api/src/org/apache/cloudstack/api/response/EventResponse.java @@ -78,7 +78,7 @@ public class EventResponse extends BaseResponse implements ControlledViewEntityR @Param(description = "the state of the event") private Event.State state; - @SerializedName("parentid") + @SerializedName(ApiConstants.PARENT_ID) @Param(description = "whether the event is parented") private String parentId; diff --git a/api/src/org/apache/cloudstack/api/response/FirewallResponse.java b/api/src/org/apache/cloudstack/api/response/FirewallResponse.java index 462bd1bd1b06..eabc935f4248 100644 --- a/api/src/org/apache/cloudstack/api/response/FirewallResponse.java +++ b/api/src/org/apache/cloudstack/api/response/FirewallResponse.java @@ -79,6 +79,10 @@ public class FirewallResponse extends BaseResponse { @Param(description = "is rule for display to the regular user", since = "4.4", authorized = {RoleType.Admin}) private Boolean forDisplay; + @SerializedName(ApiConstants.DEST_CIDR_LIST) + @Param(description = "the cidr list to forward traffic to") + private String destCidr; + public void setId(String id) { this.id = id; } @@ -130,4 +134,8 @@ public void setTags(List tags) { public void setForDisplay(Boolean forDisplay) { this.forDisplay = forDisplay; } + + public void setDestCidr(String cidrList){ + this.destCidr = cidrList; + } } diff --git a/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java b/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java index 6822288a862c..c1a57c3e0e14 100644 --- a/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java +++ b/api/src/org/apache/cloudstack/api/response/GuestOSResponse.java @@ -41,7 +41,7 @@ public class GuestOSResponse extends BaseResponse { @SerializedName(ApiConstants.IS_USER_DEFINED) @Param(description = "is the guest OS user defined") - private String isUserDefined; + private Boolean isUserDefined; public String getId() { return id; @@ -67,11 +67,11 @@ public void setDescription(String description) { this.description = description; } - public String getIsUserDefined() { + public Boolean getIsUserDefined() { return isUserDefined; } - public void setIsUserDefined(String isUserDefined) { + public void setIsUserDefined(Boolean isUserDefined) { this.isUserDefined = isUserDefined; } diff --git a/api/src/org/apache/cloudstack/api/response/HAProviderResponse.java b/api/src/org/apache/cloudstack/api/response/HAProviderResponse.java new file mode 100644 index 000000000000..d75cbc3e1205 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/HAProviderResponse.java @@ -0,0 +1,58 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.response; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; +import org.apache.cloudstack.ha.HAConfig; + +import java.util.List; + +@EntityReference(value = HAConfig.class) +public final class HAProviderResponse extends BaseResponse { + @SerializedName(ApiConstants.HA_PROVIDER) + @Param(description = "the HA provider") + private String provider; + + @SerializedName(ApiConstants.TYPE) + @Param(description = "the HA provider resource type detail") + private List supportedResourceTypes; + + public HAProviderResponse() { + super("haprovider"); + } + + public String getProvider() { + return provider; + } + + public void setProvider(String provider) { + this.provider = provider; + } + + public List getSupportedResourceTypes() { + return supportedResourceTypes; + } + + public void setSupportedResourceTypes(List supportedResourceTypes) { + this.supportedResourceTypes = supportedResourceTypes; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java b/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java index 2f3c86b0a0cf..8cc31097205d 100644 --- a/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java +++ b/api/src/org/apache/cloudstack/api/response/HostForMigrationResponse.java @@ -107,6 +107,15 @@ public class HostForMigrationResponse extends BaseResponse { @Param(description = "the amount of the host's CPU after applying the cpu.overprovisioning.factor ") private String cpuWithOverprovisioning; + @Deprecated + @SerializedName("memorytotal") + @Param(description = "the memory total of the host, this parameter is deprecated use memorywithoverprovisioning") + private Long memoryTotal; + + @SerializedName("memorywithoverprovisioning") + @Param(description = "the amount of the host's memory after applying the mem.overprovisioning.factor ") + private String memWithOverprovisioning; + @SerializedName("averageload") @Param(description = "the cpu average load on the host") private Long averageLoad; @@ -119,13 +128,9 @@ public class HostForMigrationResponse extends BaseResponse { @Param(description = "the outgoing network traffic on the host") private Long networkKbsWrite; - @SerializedName("memorytotal") - @Param(description = "the memory total of the host") - private Long memoryTotal; - @SerializedName("memoryallocated") @Param(description = "the amount of the host's memory currently allocated") - private Long memoryAllocated; + private String memoryAllocated; @SerializedName("memoryused") @Param(description = "the amount of the host's memory currently used") @@ -305,11 +310,7 @@ public void setNetworkKbsWrite(Long networkKbsWrite) { this.networkKbsWrite = networkKbsWrite; } - public void setMemoryTotal(Long memoryTotal) { - this.memoryTotal = memoryTotal; - } - - public void setMemoryAllocated(Long memoryAllocated) { + public void setMemoryAllocated(String memoryAllocated) { this.memoryAllocated = memoryAllocated; } @@ -401,6 +402,10 @@ public void setCpuWithOverprovisioning(String cpuWithOverprovisioning) { this.cpuWithOverprovisioning = cpuWithOverprovisioning; } + public void setMemWithOverprovisioning(String memWithOverprovisioning){ + this.memWithOverprovisioning=memWithOverprovisioning; + } + public void setHypervisorVersion(String hypervisorVersion) { this.hypervisorVersion = hypervisorVersion; } @@ -408,4 +413,8 @@ public void setHypervisorVersion(String hypervisorVersion) { public void setHaHost(Boolean haHost) { this.haHost = haHost; } + + public void setMemoryTotal(Long memoryTotal) { + this.memoryTotal = memoryTotal; + } } diff --git a/api/src/org/apache/cloudstack/api/response/HostHAResponse.java b/api/src/org/apache/cloudstack/api/response/HostHAResponse.java new file mode 100644 index 000000000000..a8b44bd56496 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/HostHAResponse.java @@ -0,0 +1,107 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.response; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; +import org.apache.cloudstack.ha.HAConfig; + +@EntityReference(value = HAConfig.class) +public final class HostHAResponse extends BaseResponse { + @SerializedName(ApiConstants.HOST_ID) + @Param(description = "the ID of the host") + private String id; + + @SerializedName(ApiConstants.HA_ENABLE) + @Param(description = "if host HA is enabled for the host") + private Boolean enabled; + + @SerializedName(ApiConstants.HA_STATE) + @Param(description = "the HA state of the host") + private HAConfig.HAState haState; + + @SerializedName(ApiConstants.HA_PROVIDER) + @Param(description = "the host HA provider") + private String provider; + + @SerializedName(ApiConstants.STATUS) + @Param(description = "operation status") + private Boolean status; + + public HostHAResponse() { + super("hostha"); + } + + public HostHAResponse(final HAConfig config) { + this(); + if (config == null) { + this.enabled = false; + this.haState = HAConfig.HAState.Disabled; + return; + } + setProvider(config.getHaProvider()); + setEnabled(config.isEnabled()); + setHaState(config.getState()); + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public Boolean getEnabled() { + return enabled; + } + + public void setEnabled(Boolean enabled) { + this.enabled = enabled; + } + + public HAConfig.HAState getHaState() { + return haState; + } + + public void setHaState(HAConfig.HAState haState) { + this.haState = haState; + if (haState == null) { + this.haState = HAConfig.HAState.Disabled; + } + } + + public String getProvider() { + return provider; + } + + public void setProvider(String provider) { + this.provider = provider; + } + + public Boolean getStatus() { + return status; + } + + public void setStatus(Boolean status) { + this.status = status; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/HostResponse.java b/api/src/org/apache/cloudstack/api/response/HostResponse.java index 90fe800a8bc5..b9667eca2411 100644 --- a/api/src/org/apache/cloudstack/api/response/HostResponse.java +++ b/api/src/org/apache/cloudstack/api/response/HostResponse.java @@ -24,6 +24,7 @@ import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; +import org.apache.cloudstack.ha.HAConfig; import org.apache.cloudstack.outofbandmanagement.OutOfBandManagement; import java.util.Date; @@ -125,13 +126,18 @@ public class HostResponse extends BaseResponse { @Param(description = "the outgoing network traffic on the host") private Long networkKbsWrite; + @Deprecated @SerializedName("memorytotal") - @Param(description = "the memory total of the host") + @Param(description = "the memory total of the host, this parameter is deprecated use memorywithoverprovisioning") private Long memoryTotal; + @SerializedName("memorywithoverprovisioning") + @Param(description = "the amount of the host's memory after applying the mem.overprovisioning.factor") + private String memWithOverprovisioning; + @SerializedName("memoryallocated") @Param(description = "the amount of the host's memory currently allocated") - private Long memoryAllocated; + private long memoryAllocated; @SerializedName("memoryused") @Param(description = "the amount of the host's memory currently used") @@ -201,6 +207,10 @@ public class HostResponse extends BaseResponse { @Param(description = "true if this host is suitable(has enough capacity and satisfies all conditions like hosttags, max guests vm limit etc) to migrate a VM to it , false otherwise") private Boolean suitableForMigration; + @SerializedName("hostha") + @Param(description = "the host HA information information") + private HostHAResponse hostHAResponse; + @SerializedName("outofbandmanagement") @Param(description = "the host out-of-band management information") private OutOfBandManagementResponse outOfBandManagementResponse; @@ -221,6 +231,17 @@ public class HostResponse extends BaseResponse { @Param(description = "Host details in key/value pairs.", since = "4.5") private Map details; + @SerializedName(ApiConstants.ANNOTATION) + @Param(description = "the last annotation set on this host by an admin", since = "4.11") + private String annotation; + + @SerializedName(ApiConstants.LAST_ANNOTATED) + @Param(description = "the last time this host was annotated", since = "4.11") + private Date lastAnnotated; + + @SerializedName(ApiConstants.USERNAME) + @Param(description = "the admin that annotated this host", since = "4.11") + private String username; // Default visibility to support accessing the details from unit tests Map getDetails() { @@ -328,11 +349,11 @@ public void setNetworkKbsWrite(Long networkKbsWrite) { this.networkKbsWrite = networkKbsWrite; } - public void setMemoryTotal(Long memoryTotal) { - this.memoryTotal = memoryTotal; + public void setMemWithOverprovisioning(String memWithOverprovisioning){ + this.memWithOverprovisioning=memWithOverprovisioning; } - public void setMemoryAllocated(Long memoryAllocated) { + public void setMemoryAllocated(long memoryAllocated) { this.memoryAllocated = memoryAllocated; } @@ -408,6 +429,14 @@ public void setSuitableForMigration(Boolean suitableForMigration) { this.suitableForMigration = suitableForMigration; } + public HostHAResponse getHostHAResponse() { + return hostHAResponse; + } + + public void setHostHAResponse(final HAConfig config) { + this.hostHAResponse = new HostHAResponse(config); + } + public OutOfBandManagementResponse getOutOfBandManagementResponse() { return outOfBandManagementResponse; } @@ -440,6 +469,18 @@ public void setHaHost(Boolean haHost) { this.haHost = haHost; } + public void setAnnotation(String annotation) { + this.annotation = annotation; + } + + public void setLastAnnotated(Date lastAnnotated) { + this.lastAnnotated = lastAnnotated; + } + + public void setUsername(String username) { + this.username = username; + } + public void setDetails(Map details) { if (details == null) { @@ -458,6 +499,9 @@ public void setDetails(Map details) { } + public void setMemoryTotal(Long memoryTotal) { + this.memoryTotal = memoryTotal; + } public String getName() { return name; } @@ -542,7 +586,7 @@ public Long getMemoryTotal() { return memoryTotal; } - public Long getMemoryAllocated() { + public long getMemoryAllocated() { return memoryAllocated; } diff --git a/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java b/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java index 3c03247eddb1..d3d98c87f17b 100644 --- a/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java +++ b/api/src/org/apache/cloudstack/api/response/IPAddressResponse.java @@ -96,19 +96,19 @@ public class IPAddressResponse extends BaseResponse implements ControlledEntityR private Boolean isSystem; @SerializedName(ApiConstants.VIRTUAL_MACHINE_ID) - @Param(description = "virutal machine id the ip address is assigned to (not null only for static nat Ip)") + @Param(description = "virtual machine id the ip address is assigned to (not null only for static nat Ip)") private String virtualMachineId; @SerializedName("vmipaddress") - @Param(description = "virutal machine (dnat) ip address (not null only for static nat Ip)") + @Param(description = "virtual machine (dnat) ip address (not null only for static nat Ip)") private String virtualMachineIp; @SerializedName("virtualmachinename") - @Param(description = "virutal machine name the ip address is assigned to (not null only for static nat Ip)") + @Param(description = "virtual machine name the ip address is assigned to (not null only for static nat Ip)") private String virtualMachineName; @SerializedName("virtualmachinedisplayname") - @Param(description = "virutal machine display name the ip address is assigned to (not null only for static nat Ip)") + @Param(description = "virtual machine display name the ip address is assigned to (not null only for static nat Ip)") private String virtualMachineDisplayName; @SerializedName(ApiConstants.ASSOCIATED_NETWORK_ID) diff --git a/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java index bb44a01979ce..aaef652073e8 100644 --- a/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ImageStoreResponse.java @@ -16,9 +16,6 @@ // under the License. package org.apache.cloudstack.api.response; -import java.util.LinkedHashSet; -import java.util.Set; - import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.api.ApiConstants; @@ -63,12 +60,7 @@ public class ImageStoreResponse extends BaseResponse { @Param(description = "the scope of the image store") private ScopeType scope; - @SerializedName("details") - @Param(description = "the details of the image store") - private Set details; - public ImageStoreResponse() { - this.details = new LinkedHashSet(); } @Override @@ -140,16 +132,4 @@ public void setProtocol(String protocol) { this.protocol = protocol; } - public Set getDetails() { - return details; - } - - public void setDetails(Set details) { - this.details = details; - } - - public void addDetail(ImageStoreDetailResponse detail) { - this.details.add(detail); - } - } diff --git a/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java b/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java index 21e1dab450e6..1eb8fca5087b 100644 --- a/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java +++ b/api/src/org/apache/cloudstack/api/response/LoadBalancerResponse.java @@ -95,6 +95,10 @@ public class LoadBalancerResponse extends BaseResponse implements ControlledEnti @Param(description = "the id of the zone the rule belongs to") private String zoneId; + @SerializedName(ApiConstants.ZONE_NAME) + @Param(description = "the name of the zone the load balancer rule belongs to", since = "4.11") + private String zoneName; + @SerializedName(ApiConstants.PROTOCOL) @Param(description = "the protocol of the loadbalanacer rule") private String lbProtocol; @@ -166,6 +170,10 @@ public void setZoneId(String zoneId) { this.zoneId = zoneId; } + public void setZoneName(String zoneName) { + this.zoneName = zoneName; + } + @Override public void setProjectId(String projectId) { this.projectId = projectId; diff --git a/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java b/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java index 55eb2c40a383..d2d122efb665 100644 --- a/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java +++ b/api/src/org/apache/cloudstack/api/response/LoginCmdResponse.java @@ -58,6 +58,10 @@ public class LoginCmdResponse extends AuthenticationCmdResponse { @Param(description = "user time zone") private String timeZone; + @SerializedName(value = ApiConstants.TIMEZONEOFFSET) + @Param(description = "user time zoneoffset") + private String timeZoneOffset; + @SerializedName(value = ApiConstants.REGISTERED) @Param(description = "Is user registered") private String registered; @@ -138,6 +142,12 @@ public void setTimeZone(String timeZone) { this.timeZone = timeZone; } + public String getTimeZoneOffset() { + return timeZoneOffset; + } + + public void setTimeZoneOffset(String timeZoneOffset) { this.timeZoneOffset = timeZoneOffset; } + public String getRegistered() { return registered; } diff --git a/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java index 775c9a8fdd1c..93cbb12976bb 100644 --- a/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java +++ b/api/src/org/apache/cloudstack/api/response/NetworkOfferingResponse.java @@ -120,6 +120,10 @@ public class NetworkOfferingResponse extends BaseResponse { @Param(description = "true if network offering supports network that span multiple zones", since = "4.4") private Boolean supportsStrechedL2Subnet; + @SerializedName(ApiConstants.SUPPORTS_PUBLIC_ACCESS) + @Param(description = "true if network offering supports public access for guest networks", since = "4.10.0") + private Boolean supportsPublicAccess; + public void setId(String id) { this.id = id; } @@ -207,4 +211,8 @@ public void setConcurrentConnections(Integer concurrentConnections) { public void setSupportsStrechedL2Subnet(Boolean supportsStrechedL2Subnet) { this.supportsStrechedL2Subnet = supportsStrechedL2Subnet; } + + public void setSupportsPublicAccess(Boolean supportsPublicAccess) { + this.supportsPublicAccess = supportsPublicAccess; + } } diff --git a/api/src/org/apache/cloudstack/api/response/NetworkResponse.java b/api/src/org/apache/cloudstack/api/response/NetworkResponse.java index 40c90729cd62..8d0f725500bb 100644 --- a/api/src/org/apache/cloudstack/api/response/NetworkResponse.java +++ b/api/src/org/apache/cloudstack/api/response/NetworkResponse.java @@ -225,6 +225,14 @@ public class NetworkResponse extends BaseResponse implements ControlledEntityRes @Param(description = "If a network is enabled for 'streched l2 subnet' then represents zones on which network currently spans", since = "4.4") private Set networkSpannedZones; + @SerializedName(ApiConstants.EXTERNAL_ID) + @Param(description = "The external id of the network", since = "4.11") + private String externalId; + + @SerializedName(ApiConstants.REDUNDANT_ROUTER) + @Param(description = "If the network has redundant routers enabled", since = "4.11.1") + private Boolean redundantRouter; + public Boolean getDisplayNetwork() { return displayNetwork; } @@ -429,4 +437,16 @@ public void setStrechedL2Subnet(Boolean strechedL2Subnet) { public void setNetworkSpannedZones(Set networkSpannedZones) { this.networkSpannedZones = networkSpannedZones; } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + + public Boolean getRedundantRouter() { + return redundantRouter; + } + + public void setRedundantRouter(Boolean redundantRouter) { + this.redundantRouter = redundantRouter; + } } diff --git a/api/src/org/apache/cloudstack/api/response/NicExtraDhcpOptionResponse.java b/api/src/org/apache/cloudstack/api/response/NicExtraDhcpOptionResponse.java new file mode 100644 index 000000000000..4af89a37d8dd --- /dev/null +++ b/api/src/org/apache/cloudstack/api/response/NicExtraDhcpOptionResponse.java @@ -0,0 +1,99 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.response; + + +import com.google.gson.annotations.SerializedName; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseResponse; +import org.apache.cloudstack.api.EntityReference; + +import com.cloud.serializer.Param; + +@EntityReference(value = NicExtraDhcpOptionResponse.class) +public class NicExtraDhcpOptionResponse extends BaseResponse { + + @SerializedName(ApiConstants.ID) + @Param(description = "the ID of the extra dhcp option") + private String id; + + @SerializedName(ApiConstants.NIC_ID) + @Param(description = "the ID of the nic") + private String nicId; + + @SerializedName(ApiConstants.EXTRA_DHCP_OPTION_NAME) + @Param(description = "the name of the extra DHCP option") + private String codeName; + + @SerializedName(ApiConstants.EXTRA_DHCP_OPTION_CODE) + @Param(description = "the extra DHCP option code") + private int code; + + @SerializedName(ApiConstants.EXTRA_DHCP_OPTION_VALUE) + @Param(description = "the extra DHCP option value") + private String value; + + public NicExtraDhcpOptionResponse() { + super(); + } + + public NicExtraDhcpOptionResponse(String codeName, int code, String value) { + this.codeName = codeName; + this.code = code; + this.value = value; + } + + public String getId() { + return id; + } + + public void setId(String id) { + this.id = id; + } + + public String getNicId() { + return nicId; + } + + public void setNicId(String nicId) { + this.nicId = nicId; + } + + public String getCodeName() { + return codeName; + } + + public void setCodeName(String codeName) { + this.codeName = codeName; + } + + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } +} diff --git a/api/src/org/apache/cloudstack/api/response/NicResponse.java b/api/src/org/apache/cloudstack/api/response/NicResponse.java index 7689123cbafe..5c3fd7a75a67 100644 --- a/api/src/org/apache/cloudstack/api/response/NicResponse.java +++ b/api/src/org/apache/cloudstack/api/response/NicResponse.java @@ -29,15 +29,15 @@ @EntityReference(value = Nic.class) public class NicResponse extends BaseResponse { - @SerializedName("id") + @SerializedName(ApiConstants.ID) @Param(description = "the ID of the nic") private String id; - @SerializedName("networkid") + @SerializedName(ApiConstants.NETWORK_ID) @Param(description = "the ID of the corresponding network") private String networkId; - @SerializedName("networkname") + @SerializedName(ApiConstants.NETWORK_NAME) @Param(description = "the name of the corresponding network") private String networkName; @@ -53,11 +53,11 @@ public class NicResponse extends BaseResponse { @Param(description = "the ip address of the nic") private String ipaddress; - @SerializedName("isolationuri") + @SerializedName(ApiConstants.ISOLATION_URI) @Param(description = "the isolation uri of the nic") private String isolationUri; - @SerializedName("broadcasturi") + @SerializedName(ApiConstants.BROADCAST_URI) @Param(description = "the broadcast uri of the nic") private String broadcastUri; @@ -73,7 +73,7 @@ public class NicResponse extends BaseResponse { @Param(description = "true if nic is default, false otherwise") private Boolean isDefault; - @SerializedName("macaddress") + @SerializedName(ApiConstants.MAC_ADDRESS) @Param(description = "true if nic is default, false otherwise") private String macAddress; @@ -89,10 +89,14 @@ public class NicResponse extends BaseResponse { @Param(description = "the IPv6 address of network") private String ip6Address; - @SerializedName("secondaryip") + @SerializedName(ApiConstants.SECONDARY_IP) @Param(description = "the Secondary ipv4 addr of nic") private List secondaryIps; + @SerializedName(ApiConstants.EXTRA_DHCP_OPTION) + @Param(description = "the extra dhcp options on the nic", since = "4.11.0") + private List extraDhcpOptions; + @SerializedName(ApiConstants.DEVICE_ID) @Param(description = "device id for the network when plugged into the virtual machine", since = "4.4") private String deviceId; @@ -101,11 +105,11 @@ public class NicResponse extends BaseResponse { @Param(description = "Id of the vm to which the nic belongs") private String vmId; - @SerializedName("nsxlogicalswitch") + @SerializedName(ApiConstants.NSX_LOGICAL_SWITCH) @Param(description = "Id of the NSX Logical Switch (if NSX based), null otherwise", since="4.6.0") private String nsxLogicalSwitch; - @SerializedName("nsxlogicalswitchport") + @SerializedName(ApiConstants.NSX_LOGICAL_SWITCH_PORT) @Param(description = "Id of the NSX Logical Switch Port (if NSX based), null otherwise", since="4.6.0") private String nsxLogicalSwitchPort; @@ -181,6 +185,10 @@ public void setDeviceId(String deviceId) { this.deviceId = deviceId; } + public void setExtraDhcpOptions(List extraDhcpOptions) { + this.extraDhcpOptions = extraDhcpOptions; + } + @Override public int hashCode() { final int prime = 31; diff --git a/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java b/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java index e0884c08df18..467a1c9e987a 100644 --- a/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java +++ b/api/src/org/apache/cloudstack/api/response/NicSecondaryIpResponse.java @@ -17,7 +17,7 @@ package org.apache.cloudstack.api.response; import com.google.gson.annotations.SerializedName; - +import java.util.List; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; @@ -33,6 +33,10 @@ public class NicSecondaryIpResponse extends BaseResponse { @Param(description = "the ID of the secondary private IP addr") private String id; + @SerializedName("secondaryip") + @Param(description = "the list of Secondary ipv4 addr of nic") + private List secondaryIpsList; + @SerializedName(ApiConstants.IP_ADDRESS) @Param(description = "Secondary IP address") private String ipAddr; @@ -94,4 +98,11 @@ public void setId(String id) { this.id = id; } + public List getSecondaryIpsList() { + return secondaryIpsList; + } + + public void setSecondaryIpsList(List secondaryIpsList) { + this.secondaryIpsList = secondaryIpsList; + } } diff --git a/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java b/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java index 19594d29506f..c0282c8a8237 100644 --- a/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java +++ b/api/src/org/apache/cloudstack/api/response/OutOfBandManagementResponse.java @@ -91,7 +91,7 @@ public OutOfBandManagementResponse(final OutOfBandManagement outOfBandManagement this.setDriver(outOfBandManagementConfig.getDriver()); this.setIpAddress(outOfBandManagementConfig.getAddress()); if (outOfBandManagementConfig.getPort() != null) { - this.setPort(String.valueOf(outOfBandManagementConfig.getPort())); + this.setPort(outOfBandManagementConfig.getPort()); } this.setUsername(outOfBandManagementConfig.getUsername()); if (!Strings.isNullOrEmpty(outOfBandManagementConfig.getPassword())) { diff --git a/api/src/org/apache/cloudstack/api/response/PodResponse.java b/api/src/org/apache/cloudstack/api/response/PodResponse.java index 7ff0bfc8bcb8..27ebf71a9946 100644 --- a/api/src/org/apache/cloudstack/api/response/PodResponse.java +++ b/api/src/org/apache/cloudstack/api/response/PodResponse.java @@ -55,11 +55,19 @@ public class PodResponse extends BaseResponse { @SerializedName("startip") @Param(description = "the starting IP for the Pod") - private String startIp; + private List startIp; @SerializedName("endip") @Param(description = "the ending IP for the Pod") - private String endIp; + private List endIp; + + @SerializedName("forsystemvms") + @Param(description = "indicates if range is dedicated for CPVM and SSVM") + private List forSystemVms; + + @SerializedName("vlanid") + @Param(description = "indicates Vlan ID for the range") + private List vlanId; @SerializedName("allocationstate") @Param(description = "the allocation state of the Pod") @@ -117,22 +125,38 @@ public void setNetmask(String netmask) { this.netmask = netmask; } - public String getStartIp() { + public List getStartIp() { return startIp; } - public void setStartIp(String startIp) { + public void setStartIp(List startIp) { this.startIp = startIp; } - public String getEndIp() { + public List getEndIp() { return endIp; } - public void setEndIp(String endIp) { + public void setEndIp(List endIp) { this.endIp = endIp; } + public void setForSystemVms(List forSystemVms) { + this.forSystemVms = forSystemVms; + } + + public List getForSystemVms() { + return forSystemVms; + } + + public List getVlanId() { + return vlanId; + } + + public void setVlanId(List vlanId) { + this.vlanId = vlanId; + } + public String getAllocationState() { return allocationState; } diff --git a/api/src/org/apache/cloudstack/api/response/ProjectResponse.java b/api/src/org/apache/cloudstack/api/response/ProjectResponse.java index ad29d2b18cb7..8bfa6d94b63c 100644 --- a/api/src/org/apache/cloudstack/api/response/ProjectResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ProjectResponse.java @@ -29,7 +29,6 @@ import com.cloud.serializer.Param; @EntityReference(value = Project.class) -@SuppressWarnings("unused") public class ProjectResponse extends BaseResponse implements ResourceLimitAndCountResponse { @SerializedName(ApiConstants.ID) @@ -56,6 +55,10 @@ public class ProjectResponse extends BaseResponse implements ResourceLimitAndCou @Param(description = "the account name of the project's owner") private String ownerName; + @SerializedName("projectaccountname") + @Param(description="the project account name of the project") + private String projectAccountName; + @SerializedName(ApiConstants.STATE) @Param(description = "the state of the project") private String state; @@ -130,7 +133,7 @@ public class ProjectResponse extends BaseResponse implements ResourceLimitAndCou @SerializedName("secondarystoragetotal") @Param(description = "the total secondary storage space (in GiB) owned by project", since = "4.2.0") - private Long secondaryStorageTotal; + private float secondaryStorageTotal; @SerializedName("secondarystorageavailable") @Param(description = "the total secondary storage space (in GiB) available to be used for this project", since = "4.2.0") @@ -228,6 +231,10 @@ public void setOwner(String owner) { ownerName = owner; } + public void setProjectAccountName(String projectAccountName) { + this.projectAccountName = projectAccountName; + } + public void setState(String state) { this.state = state; } @@ -406,7 +413,7 @@ public void setSecondaryStorageLimit(String secondaryStorageLimit) { } @Override - public void setSecondaryStorageTotal(Long secondaryStorageTotal) { + public void setSecondaryStorageTotal(float secondaryStorageTotal) { this.secondaryStorageTotal = secondaryStorageTotal; } diff --git a/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java index 7173235608eb..d0a4982f8724 100644 --- a/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ResourceCountResponse.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.response; +import com.cloud.configuration.Resource; import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.api.ApiConstants; @@ -49,6 +50,10 @@ public class ResourceCountResponse extends BaseResponse implements ControlledEnt @Param(description = "resource type. Values include 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11. See the resourceType parameter for more information on these values.") private String resourceType; + @SerializedName(ApiConstants.RESOURCE_TYPE_NAME) + @Param(description = "resource type name. Values include user_vm, public_ip, volume, snapshot, template, project, network, vpc, cpu, memory, primary_storage, secondary_storage.") + private String resourceTypeName; + @SerializedName("resourcecount") @Param(description = "resource count") private long resourceCount; @@ -68,8 +73,9 @@ public void setDomainName(String domainName) { this.domainName = domainName; } - public void setResourceType(String resourceType) { - this.resourceType = resourceType; + public void setResourceType(Resource.ResourceType resourceType) { + this.resourceType = Integer.valueOf(resourceType.getOrdinal()).toString(); + this.resourceTypeName = resourceType.getName(); } public void setResourceCount(Long resourceCount) { diff --git a/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java index ba97c2c83cea..f247be834cb1 100644 --- a/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ResourceLimitAndCountResponse.java @@ -54,7 +54,7 @@ public interface ResourceLimitAndCountResponse { public void setSecondaryStorageLimit(String secondaryStorageLimit); - public void setSecondaryStorageTotal(Long secondaryStorageTotal); + public void setSecondaryStorageTotal(float secondaryStorageTotal); public void setSecondaryStorageAvailable(String secondaryStorageAvailable); diff --git a/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java b/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java index 6890915fdde1..13e1198177d7 100644 --- a/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ResourceLimitResponse.java @@ -16,6 +16,7 @@ // under the License. package org.apache.cloudstack.api.response; +import com.cloud.configuration.Resource; import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.api.ApiConstants; @@ -44,6 +45,10 @@ public class ResourceLimitResponse extends BaseResponse implements ControlledEnt @Param(description = "resource type. Values include 0, 1, 2, 3, 4, 6, 7, 8, 9, 10, 11. See the resourceType parameter for more information on these values.") private String resourceType; + @SerializedName(ApiConstants.RESOURCE_TYPE_NAME) + @Param(description = "resource type name. Values include user_vm, public_ip, volume, snapshot, template, project, network, vpc, cpu, memory, primary_storage, secondary_storage.") + private String resourceTypeName; + @SerializedName("max") @Param(description = "the maximum number of the resource. A -1 means the resource currently has no limit.") private Long max; @@ -76,8 +81,9 @@ public void setDomainName(String domainName) { this.domainName = domainName; } - public void setResourceType(String resourceType) { - this.resourceType = resourceType; + public void setResourceType(Resource.ResourceType resourceType) { + this.resourceType = Integer.valueOf(resourceType.getOrdinal()).toString(); + this.resourceTypeName = resourceType.getName(); } public void setMax(Long max) { diff --git a/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java b/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java index aa8de5c6fd44..bb2ff7f6d0e9 100644 --- a/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SnapshotResponse.java @@ -16,17 +16,15 @@ // under the License. package org.apache.cloudstack.api.response; -import java.util.Date; -import java.util.List; - +import com.cloud.serializer.Param; +import com.cloud.storage.Snapshot; import com.google.gson.annotations.SerializedName; - import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; -import com.cloud.serializer.Param; -import com.cloud.storage.Snapshot; +import java.util.Date; +import java.util.List; @EntityReference(value = Snapshot.class) public class SnapshotResponse extends BaseResponse implements ControlledEntityResponse { @@ -82,6 +80,10 @@ public class SnapshotResponse extends BaseResponse implements ControlledEntityRe @Param(description = "valid types are hourly, daily, weekly, monthy, template, and none.") private String intervalType; + @SerializedName(ApiConstants.LOCATION_TYPE) + @Param(description = "valid location types are primary and secondary.") + private String locationType; + @SerializedName(ApiConstants.STATE) @Param(description = "the state of the snapshot. BackedUp means that snapshot is ready to be used; Creating - the snapshot is being allocated on the primary storage; BackingUp - the snapshot is being backed up on secondary storage") private Snapshot.State state; @@ -102,6 +104,18 @@ public class SnapshotResponse extends BaseResponse implements ControlledEntityRe @Param(description = "indicates whether the underlying storage supports reverting the volume to this snapshot") private boolean revertable; + @SerializedName(ApiConstants.OS_TYPE_ID) + @Param(description = "id of the os on volume", since = "4.10") + private String osTypeId; + + @SerializedName(ApiConstants.OS_DISPLAY_NAME) + @Param(description = "display name of the os on volume") + private String osDisplayName; + + @SerializedName(ApiConstants.VIRTUAL_SIZE) + @Param(description = "virtual size of backedup snapshot on image store") + private long virtualSize; + @Override public String getObjectId() { return this.getId(); @@ -166,6 +180,10 @@ public void setIntervalType(String intervalType) { this.intervalType = intervalType; } + public void setLocationType(String locationType) { + this.locationType = locationType; + } + public void setState(Snapshot.State state) { this.state = state; } @@ -192,11 +210,23 @@ public void setTags(List tags) { this.tags = tags; } - public boolean isRevertable() { - return revertable; - } - public void setRevertable(boolean revertable) { this.revertable = revertable; } -} + + public String getOsTypeId() { + return osTypeId; + } + + public void setOsTypeId(String osTypeId) { + this.osTypeId = osTypeId; + } + + public void setOsDisplayName(String osDisplayName) { + this.osDisplayName = osDisplayName; + } + + public void setVirtualSize(long virtualSize) { + this.virtualSize = virtualSize; + } +} \ No newline at end of file diff --git a/api/src/org/apache/cloudstack/api/response/SslCertResponse.java b/api/src/org/apache/cloudstack/api/response/SslCertResponse.java index 8b3db465bfa2..aa729f123b44 100644 --- a/api/src/org/apache/cloudstack/api/response/SslCertResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SslCertResponse.java @@ -24,7 +24,7 @@ import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; -import com.cloud.network.lb.SslCert; +import org.apache.cloudstack.network.tls.SslCert; import com.cloud.serializer.Param; //import org.apache.cloudstack.api.EntityReference; @@ -72,6 +72,10 @@ public class SslCertResponse extends BaseResponse { @Param(description = "List of loabalancers this certificate is bound to") List lbIds; + @SerializedName(ApiConstants.NAME) + @Param(description = "name") + private String name; + public SslCertResponse() { } @@ -83,6 +87,10 @@ public void setCertificate(String cert) { this.certificate = cert; } + public void setName(String name) { + this.name = name; + } + public void setAccountName(String accountName) { this.accountName = accountName; } diff --git a/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java b/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java index b7f7d0b41ee7..a03c2d8d751e 100644 --- a/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java +++ b/api/src/org/apache/cloudstack/api/response/StoragePoolResponse.java @@ -16,18 +16,16 @@ // under the License. package org.apache.cloudstack.api.response; -import java.util.Date; -import java.util.Map; - +import com.cloud.serializer.Param; +import com.cloud.storage.StoragePool; +import com.cloud.storage.StoragePoolStatus; import com.google.gson.annotations.SerializedName; - import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; -import com.cloud.serializer.Param; -import com.cloud.storage.StoragePool; -import com.cloud.storage.StoragePoolStatus; +import java.util.Date; +import java.util.Map; @EntityReference(value = StoragePool.class) public class StoragePoolResponse extends BaseResponse { @@ -95,6 +93,10 @@ public class StoragePoolResponse extends BaseResponse { @Param(description = "IOPS CloudStack can provision from this storage pool") private Long capacityIops; + @SerializedName("allocatediops") + @Param(description = "total min IOPS currently in use by volumes") + private Long allocatedIops; + @SerializedName("tags") @Param(description = "the tags for the storage pool") private String tags; @@ -119,6 +121,10 @@ public class StoragePoolResponse extends BaseResponse { @Param(description = "true if this pool is suitable to migrate a volume," + " false otherwise") private Boolean suitableForMigration; + @SerializedName("provider") + @Param(description = "Storage provider for this pool") + private String provider; + @SerializedName(ApiConstants.STORAGE_CAPABILITIES) @Param(description = "the storage pool capabilities") private Map caps; @@ -286,6 +292,10 @@ public void setCapacityIops(Long capacityIops) { this.capacityIops = capacityIops; } + public void setAllocatedIops(Long allocatedIops) { + this.allocatedIops = allocatedIops; + } + public String getTags() { return tags; } @@ -317,4 +327,12 @@ public String getOverProvisionFactor() { public Boolean getSuitableForMigration() { return suitableForMigration; } + + public String getProvider() { + return provider; + } + + public void setProvider(String provider) { + this.provider = provider; + } } diff --git a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java index 9e20b49dfdeb..49ab473a37a1 100644 --- a/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java +++ b/api/src/org/apache/cloudstack/api/response/SystemVmResponse.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.response; import java.util.Date; +import java.util.List; import com.google.gson.annotations.SerializedName; @@ -141,7 +142,13 @@ public class SystemVmResponse extends BaseResponse { @Param(description = "the number of active console sessions for the console proxy system vm") private Integer activeViewerSessions; - // private Long objectId; + @SerializedName("guestvlan") + @Param(description = "guest vlan range") + private String guestVlan; + + @SerializedName("publicvlan") + @Param(description = "public vlan range") + private List publicVlan; @Override public String getObjectId() { @@ -355,4 +362,20 @@ public String getLinkLocalNetmask() { public void setLinkLocalNetmask(String linkLocalNetmask) { this.linkLocalNetmask = linkLocalNetmask; } + + public String getGuestVlan() { + return guestVlan; + } + + public void setGuestVlan(String guestVlan) { + this.guestVlan = guestVlan; + } + + public List getPublicVlan() { + return publicVlan; + } + + public void setPublicVlan(List publicVlan) { + this.publicVlan = publicVlan; + } } diff --git a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java index 237f181d4d8f..373198ed29f3 100644 --- a/api/src/org/apache/cloudstack/api/response/TemplateResponse.java +++ b/api/src/org/apache/cloudstack/api/response/TemplateResponse.java @@ -117,6 +117,10 @@ public class TemplateResponse extends BaseResponseWithTagInformation implements @Param(description = "the size of the template") private Long size; + @SerializedName(ApiConstants.PHYSICAL_SIZE) + @Param(description = "the physical size of the template") + private Long physicalSize; + @SerializedName("templatetype") @Param(description = "the type of the template") private String templateType; @@ -169,6 +173,10 @@ public class TemplateResponse extends BaseResponseWithTagInformation implements @Param(description = "additional key/value details tied with template") private Map details; + @SerializedName(ApiConstants.BITS) + @Param(description = "the processor bit size", since = "4.10") + private int bits; + @SerializedName(ApiConstants.SSHKEY_ENABLED) @Param(description = "true if template is sshkey enabled, false otherwise") private Boolean sshKeyEnabled; @@ -177,6 +185,18 @@ public class TemplateResponse extends BaseResponseWithTagInformation implements @Param(description = "true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory") private Boolean isDynamicallyScalable; + @SerializedName(ApiConstants.DIRECT_DOWNLOAD) + @Param(description = "KVM Only: true if template is directly downloaded to Primary Storage bypassing Secondary Storage") + private Boolean directDownload; + + @SerializedName("parenttemplateid") + @Param(description = "if Datadisk template, then id of the root disk template this template belongs to") + private String parentTemplateId; + + @SerializedName("childtemplates") + @Param(description = "if root disk template, then ids of the datas disk templates this template owns") + private Set childTemplates; + public TemplateResponse() { tags = new LinkedHashSet(); } @@ -271,6 +291,10 @@ public void setSize(Long size) { this.size = size; } + public void setPhysicalSize(Long physicalSize) { + this.physicalSize = physicalSize; + } + public void setTemplateType(String templateType) { this.templateType = templateType; } @@ -347,4 +371,24 @@ public String getZoneId() { return zoneId; } + public void setBits(int bits) { + this.bits = bits; + } + + public void setDirectDownload(Boolean directDownload) { + this.directDownload = directDownload; + } + + public Boolean getDirectDownload() { + return directDownload; + } + + public void setParentTemplateId(String parentTemplateId) { + this.parentTemplateId = parentTemplateId; + } + + public void setChildTemplates(Set childTemplateIds) { + this.childTemplates = childTemplateIds; + } + } diff --git a/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java b/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java index 87a085c2a5ce..c53f2b99e0b0 100644 --- a/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java +++ b/api/src/org/apache/cloudstack/api/response/UsageRecordResponse.java @@ -19,12 +19,15 @@ import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.api.BaseResponse; import com.cloud.serializer.Param; +import org.apache.cloudstack.api.BaseResponseWithTagInformation; + +import java.util.LinkedHashSet; +import java.util.Set; @SuppressWarnings("unused") -public class UsageRecordResponse extends BaseResponse implements ControlledEntityResponse { +public class UsageRecordResponse extends BaseResponseWithTagInformation implements ControlledEntityResponse { @SerializedName(ApiConstants.ACCOUNT) @Param(description = "the user account name") private String accountName; @@ -137,6 +140,14 @@ public class UsageRecordResponse extends BaseResponse implements ControlledEntit @Param(description = "True if the resource is default") private Boolean isDefault; + public UsageRecordResponse() { + tags = new LinkedHashSet(); + } + + public void setTags(Set tags) { + this.tags = tags; + } + @Override public void setAccountName(String accountName) { this.accountName = accountName; @@ -253,4 +264,8 @@ public void setCpuSpeed(Long cpuSpeed) { public void setMemory(Long memory) { this.memory = memory; } + + public String getDomainName(){ + return domainName; + } } diff --git a/api/src/org/apache/cloudstack/api/response/UserResponse.java b/api/src/org/apache/cloudstack/api/response/UserResponse.java index cc986b38a1c6..dd10510c03cf 100644 --- a/api/src/org/apache/cloudstack/api/response/UserResponse.java +++ b/api/src/org/apache/cloudstack/api/response/UserResponse.java @@ -66,6 +66,10 @@ public class UserResponse extends BaseResponse { @Param(description = "the account type of the user") private Short accountType; + @SerializedName("usersource") + @Param(description = "the source type of the user in lowercase, such as native, ldap, saml2") + private String userSource; + @SerializedName(ApiConstants.ROLE_ID) @Param(description = "the ID of the role") private String roleId; @@ -94,6 +98,7 @@ public class UserResponse extends BaseResponse { @Param(description = "the api key of the user", isSensitive = true) private String apiKey; + @Deprecated @SerializedName("secretkey") @Param(description = "the secret key of the user", isSensitive = true) private String secretKey; @@ -236,7 +241,6 @@ public void setApiKey(String apiKey) { public String getSecretKey() { return secretKey; } - public void setSecretKey(String secretKey) { this.secretKey = secretKey; } @@ -260,4 +264,15 @@ public void setIsCallerChildDomain(boolean isCallerChildDomain) { public void setIsDefault(Boolean isDefault) { this.isDefault = isDefault; } + + public String getUserSource() { + return userSource; + } + + public void setUserSource(User.Source userSource) { + this.userSource = userSource.toString().toLowerCase(); + if (this.userSource.equals(User.Source.UNKNOWN.toString().toLowerCase())) { + this.userSource = User.Source.NATIVE.toString().toLowerCase(); + } + } } diff --git a/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java b/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java index 59214847a92f..5656a92955d1 100644 --- a/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java +++ b/api/src/org/apache/cloudstack/api/response/VlanIpRangeResponse.java @@ -116,10 +116,22 @@ public class VlanIpRangeResponse extends BaseResponse implements ControlledEntit @Param(description = "the cidr of IPv6 network") private String ip6Cidr; + @SerializedName(ApiConstants.FOR_SYSTEM_VMS) + @Param(description = "indicates whether VLAN IP range is dedicated to system vms or not") + private Boolean forSystemVms; + public void setId(String id) { this.id = id; } + public Boolean getForSystemVms() { + return forSystemVms; + } + + public void setForSystemVms(Boolean forSystemVms) { + this.forSystemVms = forSystemVms; + } + public void setForVirtualNetwork(Boolean forVirtualNetwork) { this.forVirtualNetwork = forVirtualNetwork; } diff --git a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java index e25adf618d8a..895e13c5c5c9 100644 --- a/api/src/org/apache/cloudstack/api/response/VolumeResponse.java +++ b/api/src/org/apache/cloudstack/api/response/VolumeResponse.java @@ -228,9 +228,36 @@ public class VolumeResponse extends BaseResponseWithTagInformation implements Co String chainInfo; @SerializedName(ApiConstants.SNAPSHOT_QUIESCEVM) - @Param(description = "need quiesce vm or not when taking snapshot", since="4.3") + @Param(description = "need quiesce vm or not when taking snapshot", since = "4.3") private boolean needQuiescevm; + @SerializedName(ApiConstants.PHYSICAL_SIZE) + @Param(description = "the bytes alloaated") + private Long physicalsize; + + @SerializedName(ApiConstants.VIRTUAL_SIZE) + @Param(description = "the bytes actually consumed on disk") + private Long virtualsize; + + @SerializedName(ApiConstants.UTILIZATION) + @Param(description = "the disk utilization") + private String utilization; + + @SerializedName(ApiConstants.CLUSTER_ID) + @Param(description = "cluster id of the volume") + private String clusterid; + + @SerializedName(ApiConstants.CLUSTER_NAME) + @Param(description = "cluster name where the volume is allocated") + private String clustername; + + @SerializedName(ApiConstants.POD_ID) + @Param(description = "pod id of the volume") + private String podid; + + @SerializedName(ApiConstants.POD_NAME) + @Param(description = "pod name of the volume") + private String podname; public String getPath() { return path; @@ -301,7 +328,7 @@ public void setVirtualMachineState(String virtualMachineState) { this.virtualMachineState = virtualMachineState; } - public void setProvisioningType(String provisioningType){ + public void setProvisioningType(String provisioningType) { this.provisioningType = provisioningType; } @@ -649,4 +676,61 @@ public String getStatus() { public Boolean getDisplayVolume() { return displayVolume; } + + public Long getPhysicalsize() { + return physicalsize; + } + + public void setPhysicalsize(Long physicalsize) { + this.physicalsize = physicalsize; + } + + public Long getVirtualsize() { + return virtualsize; + } + + public void setVirtualsize(Long virtualsize) { + this.virtualsize = virtualsize; + } + + public String getUtilization() { + return utilization; + } + + public void setUtilization(String utilization) { + this.utilization = utilization; + } + + public String getClusterId() { + return clusterid; + } + + public void setClusterId(String clusterid) { + this.clusterid = clusterid; + } + + public String getClusterName() { + return clustername; + } + + public void setClusterName(String clustername) { + this.clustername = clustername; + } + + public String getPodId() { + return podid; + } + + public void setPodId(String podid) { + this.podid = podid; + } + + public String getPodName() { + return podname; + } + + public void setPodName(String podname) { + this.podname = podname; + } + } diff --git a/api/src/org/apache/cloudstack/ca/CAManager.java b/api/src/org/apache/cloudstack/ca/CAManager.java new file mode 100644 index 000000000000..c32cfbfe3455 --- /dev/null +++ b/api/src/org/apache/cloudstack/ca/CAManager.java @@ -0,0 +1,163 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ca; + +import java.io.IOException; +import java.math.BigInteger; +import java.security.cert.X509Certificate; +import java.util.List; +import java.util.Map; + +import org.apache.cloudstack.framework.ca.CAProvider; +import org.apache.cloudstack.framework.ca.CAService; +import org.apache.cloudstack.framework.ca.Certificate; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; + +import com.cloud.exception.AgentUnavailableException; +import com.cloud.exception.OperationTimedoutException; +import com.cloud.host.Host; +import com.cloud.utils.component.PluggableService; + +public interface CAManager extends CAService, Configurable, PluggableService { + + ConfigKey CAProviderPlugin = new ConfigKey<>("Advanced", String.class, + "ca.framework.provider.plugin", + "root", + "The CA provider plugin that is used for secure CloudStack management server-agent communication for encryption and authentication. Restart management server(s) when changed.", true); + + ConfigKey CertKeySize = new ConfigKey<>("Advanced", Integer.class, + "ca.framework.cert.keysize", + "2048", + "The key size to be used for random certificate keypair generation.", true); + + ConfigKey CertSignatureAlgorithm = new ConfigKey<>("Advanced", String.class, + "ca.framework.cert.signature.algorithm", + "SHA256withRSA", + "The default signature algorithm to use for certificate generation.", true); + + + ConfigKey CertValidityPeriod = new ConfigKey<>("Advanced", Integer.class, + "ca.framework.cert.validity.period", + "365", + "The validity period of a client certificate in number of days. Set the value to be more than the expiry alert period.", true); + + ConfigKey AutomaticCertRenewal = new ConfigKey<>("Advanced", Boolean.class, + "ca.framework.cert.automatic.renewal", + "true", + "Enable automatic renewal and provisioning of certificate to agents as supported by the configured CA plugin.", true, ConfigKey.Scope.Cluster); + + ConfigKey CABackgroundJobDelay = new ConfigKey<>("Advanced", Long.class, + "ca.framework.background.task.delay", + "3600", + "The CA framework background task delay in seconds. Background task runs expiry checks and renews certificate if auto-renewal is enabled.", true); + + ConfigKey CertExpiryAlertPeriod = new ConfigKey<>("Advanced", Integer.class, + "ca.framework.cert.expiry.alert.period", + "15", + "The number of days before expiry of a client certificate, the validations are checked. Admins are alerted when auto-renewal is not allowed, otherwise auto-renewal is attempted.", true, ConfigKey.Scope.Cluster); + + /** + * Returns a list of available CA provider plugins + * @return returns list of CAProvider + */ + List getCaProviders(); + + /** + * Returns a map of active agents/hosts certificates + * @return returns a non-null map + */ + Map getActiveCertificatesMap(); + + /** + * Checks whether the configured CA plugin can provision/create certificates + * @return returns certificate creation capability + */ + boolean canProvisionCertificates(); + + /** + * Returns PEM-encoded chained CA certificate + * @param caProvider + * @return returns CA certificate chain string + */ + String getCaCertificate(final String caProvider) throws IOException; + + /** + * Issues client Certificate + * @param csr + * @param ipAddresses + * @param domainNames + * @param validityDays + * @param provider + * @return returns Certificate + */ + Certificate issueCertificate(final String csr, final List domainNames, final List ipAddresses, final Integer validityDays, final String provider); + + /** + * Revokes certificate from provided serial and CN + * @param certSerial + * @param certCn + * @return returns success/failure as boolean + */ + boolean revokeCertificate(final BigInteger certSerial, final String certCn, final String provider); + + /** + * Provisions certificate for given active and connected agent host + * @param host + * @param provider + * @return returns success/failure as boolean + */ + boolean provisionCertificate(final Host host, final Boolean reconnect, final String provider); + + /** + * Setups up a new keystore and generates CSR for a host + * @param host + * @param sshAccessDetails when provided, VirtualRoutingResource uses router proxy to execute commands via SSH in systemvms + * @return + * @throws AgentUnavailableException + * @throws OperationTimedoutException + */ + String generateKeyStoreAndCsr(final Host host, final Map sshAccessDetails) throws AgentUnavailableException, OperationTimedoutException; + + /** + * Deploys a Certificate payload to a provided host + * @param host + * @param certificate + * @param reconnect when true the host/agent is reconnected on successful deployment of the certificate + * @param sshAccessDetails when provided, VirtualRoutingResource uses router proxy to execute commands via SSH in systemvms + * @return + * @throws AgentUnavailableException + * @throws OperationTimedoutException + */ + boolean deployCertificate(final Host host, final Certificate certificate, final Boolean reconnect, final Map sshAccessDetails) throws AgentUnavailableException, OperationTimedoutException; + + /** + * Removes the host from an internal active client/certificate map + * @param host + */ + void purgeHostCertificate(final Host host); + + /** + * Sends a CA cert event alert to admins with a subject and a message + * @param host + * @param subject + * @param message + */ + void sendAlert(final Host host, final String subject, final String message); + +} diff --git a/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java b/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java index 701af625884f..55e8202ff488 100644 --- a/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java +++ b/api/src/org/apache/cloudstack/config/ApiServiceConfiguration.java @@ -16,19 +16,19 @@ // under the License. package org.apache.cloudstack.config; -import javax.ejb.Local; - import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; -@Local(value = {ApiServiceConfiguration.class}) public class ApiServiceConfiguration implements Configurable { - public static final ConfigKey ManagementHostIPAdr = new ConfigKey("Advanced", String.class, "host", "localhost", "The ip address of management server", true); + public static final ConfigKey ManagementServerAddresses = new ConfigKey("Advanced", String.class, "host", "localhost", "The ip address of management server. This can also accept comma separated addresses.", true); public static final ConfigKey ApiServletPath = new ConfigKey("Advanced", String.class, "endpointe.url", "http://localhost:8080/client/api", "API end point. Can be used by CS components/services deployed remotely, for sending CS API requests", true); public static final ConfigKey DefaultUIPageSize = new ConfigKey("Advanced", Long.class, "default.ui.page.size", "20", "The default pagesize to be used by UI and other clients when making list* API calls", true, ConfigKey.Scope.Global); - + public static final ConfigKey ApiSourceCidrChecksEnabled = new ConfigKey<>("Advanced", Boolean.class, "api.source.cidr.checks.enabled", + "true", "Are the source checks on API calls enabled (true) or not (false)? See api.allowed.source.cidr.list", true, ConfigKey.Scope.Global); + public static final ConfigKey ApiAllowedSourceCidrList = new ConfigKey("Advanced", String.class, "api.allowed.source.cidr.list", + "0.0.0.0/0,::/0", "Comma separated list of IPv4/IPv6 CIDRs from which API calls can be performed. Can be set on Global and Account levels.", true, ConfigKey.Scope.Account); @Override public String getConfigComponentName() { return ApiServiceConfiguration.class.getSimpleName(); @@ -36,7 +36,7 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {ManagementHostIPAdr, ApiServletPath, DefaultUIPageSize}; + return new ConfigKey[] {ManagementServerAddresses, ApiServletPath, DefaultUIPageSize, ApiSourceCidrChecksEnabled, ApiAllowedSourceCidrList}; } } diff --git a/api/src/org/apache/cloudstack/direct/download/DirectDownloadManager.java b/api/src/org/apache/cloudstack/direct/download/DirectDownloadManager.java new file mode 100644 index 000000000000..b3f0841a6e89 --- /dev/null +++ b/api/src/org/apache/cloudstack/direct/download/DirectDownloadManager.java @@ -0,0 +1,25 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.direct.download; + +import com.cloud.utils.component.PluggableService; +import org.apache.cloudstack.framework.agent.direct.download.DirectDownloadService; + +public interface DirectDownloadManager extends DirectDownloadService, PluggableService { + +} diff --git a/api/src/org/apache/cloudstack/ha/HAConfig.java b/api/src/org/apache/cloudstack/ha/HAConfig.java new file mode 100644 index 000000000000..95b5c9bdfd7b --- /dev/null +++ b/api/src/org/apache/cloudstack/ha/HAConfig.java @@ -0,0 +1,146 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package org.apache.cloudstack.ha; + +import com.cloud.utils.fsm.StateMachine2; +import com.cloud.utils.fsm.StateObject; +import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.utils.identity.ManagementServerNode; + +public interface HAConfig extends StateObject, InternalIdentity { + + long getResourceId(); + HAResource.ResourceType getResourceType(); + boolean isEnabled(); + HAState getState(); + String getHaProvider(); + Long getManagementServerId(); + + enum Event { + Eligible, + Ineligible, + Disabled, + Enabled, + HealthCheckPassed, + HealthCheckFailed, + PerformActivityCheck, + TooFewActivityCheckSamples, + PeriodicRecheckResourceActivity, + ActivityCheckFailureOverThresholdRatio, + ActivityCheckFailureUnderThresholdRatio, + PowerCycle, + Recovered, + RetryRecovery, + RecoveryWaitPeriodTimeout, + RecoveryOperationThresholdExceeded, + RetryFencing, + Fenced; + + public Long getServerId() { + // TODO: change in future if we've better claim & ownership + // Right now the first one to update the db wins + // and mgmt server id would eventually become consistent + return ManagementServerNode.getManagementServerId(); + } + } + + enum HAState { + Disabled("HA Operations disabled"), + Available("The resource is healthy"), + Ineligible("The current state does not support HA/recovery"), + Suspect("Most recent health check failed"), + Degraded("The resource cannot be managed, but services end user requests"), + Checking("The activity checks are currently being performed"), + Recovering("The resource is undergoing recovery operation"), + Recovered("The resource is recovered"), + Fencing("The resource is undergoing fence operation"), + Fenced("The resource is fenced"); + + String description; + + HAState(String description) { + this.description = description; + } + + public static StateMachine2 getStateMachine() { + return FSM; + } + + public String getDescription() { + return description; + } + + private static final StateMachine2 FSM = new StateMachine2<>(); + + static { + FSM.addInitialTransition(Event.Disabled, Disabled); + FSM.addInitialTransition(Event.Enabled, Available); + FSM.addInitialTransition(Event.Ineligible, Ineligible); + + FSM.addTransition(Disabled, Event.Enabled, Available); + + FSM.addTransition(Ineligible, Event.Disabled, Disabled); + FSM.addTransition(Ineligible, Event.Ineligible, Ineligible); + FSM.addTransition(Ineligible, Event.Eligible, Available); + + FSM.addTransition(Available, Event.Disabled, Disabled); + FSM.addTransition(Available, Event.Ineligible, Ineligible); + FSM.addTransition(Available, Event.HealthCheckPassed, Available); + FSM.addTransition(Available, Event.HealthCheckFailed, Suspect); + + FSM.addTransition(Suspect, Event.Disabled, Disabled); + FSM.addTransition(Suspect, Event.Ineligible, Ineligible); + FSM.addTransition(Suspect, Event.HealthCheckFailed, Suspect); + FSM.addTransition(Suspect, Event.PerformActivityCheck, Checking); + FSM.addTransition(Suspect, Event.HealthCheckPassed, Available); + + FSM.addTransition(Checking, Event.Disabled, Disabled); + FSM.addTransition(Checking, Event.Ineligible, Ineligible); + FSM.addTransition(Checking, Event.TooFewActivityCheckSamples, Suspect); + FSM.addTransition(Checking, Event.ActivityCheckFailureUnderThresholdRatio, Degraded); + FSM.addTransition(Checking, Event.ActivityCheckFailureOverThresholdRatio, Recovering); + + FSM.addTransition(Degraded, Event.Disabled, Disabled); + FSM.addTransition(Degraded, Event.Ineligible, Ineligible); + FSM.addTransition(Degraded, Event.HealthCheckFailed, Degraded); + FSM.addTransition(Degraded, Event.HealthCheckPassed, Available); + FSM.addTransition(Degraded, Event.PeriodicRecheckResourceActivity, Suspect); + + FSM.addTransition(Recovering, Event.Disabled, Disabled); + FSM.addTransition(Recovering, Event.Ineligible, Ineligible); + FSM.addTransition(Recovering, Event.RetryRecovery, Recovering); + FSM.addTransition(Recovering, Event.Recovered, Recovered); + FSM.addTransition(Recovering, Event.RecoveryOperationThresholdExceeded, Fencing); + + FSM.addTransition(Recovered, Event.Disabled, Disabled); + FSM.addTransition(Recovered, Event.Ineligible, Ineligible); + FSM.addTransition(Recovered, Event.RecoveryWaitPeriodTimeout, Available); + + FSM.addTransition(Fencing, Event.Disabled, Disabled); + FSM.addTransition(Fencing, Event.Ineligible, Ineligible); + FSM.addTransition(Fencing, Event.RetryFencing, Fencing); + FSM.addTransition(Fencing, Event.Fenced, Fenced); + + FSM.addTransition(Fenced, Event.Disabled, Disabled); + FSM.addTransition(Fenced, Event.HealthCheckPassed, Ineligible); + FSM.addTransition(Fenced, Event.HealthCheckFailed, Fenced); + } + } +} diff --git a/api/src/org/apache/cloudstack/ha/HAConfigManager.java b/api/src/org/apache/cloudstack/ha/HAConfigManager.java new file mode 100644 index 000000000000..c9a20358c361 --- /dev/null +++ b/api/src/org/apache/cloudstack/ha/HAConfigManager.java @@ -0,0 +1,96 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ha; + +import com.cloud.dc.DataCenter; +import com.cloud.org.Cluster; + +import java.util.List; + +/** + * @since 4.11 + */ +public interface HAConfigManager { + /** + * Configures HA for a resource by accepting the resource type and HA provider + * @param resourceId the ID of the resource + * @param resourceType the type of the resource + * @param haProvider the name of the HA provider + */ + boolean configureHA(Long resourceId, HAResource.ResourceType resourceType, String haProvider); + + /** + * Enables HA for resource Id of a specific resource type + * @param resourceId the ID of the resource + * @param resourceType the type of the resource + * @return returns true on successful enable + */ + boolean enableHA(Long resourceId, HAResource.ResourceType resourceType); + + /** + * Disables HA for resource Id of a specific resource type + * @param resourceId the ID of the resource + * @param resourceType the type of the resource + * @return returns true on successful disable + */ + boolean disableHA(Long resourceId, HAResource.ResourceType resourceType); + + /** + * Enables HA across a cluster + * @param cluster the cluster + * @return returns operation success + */ + boolean enableHA(final Cluster cluster); + + /** + * Disables HA across a cluster + * @param cluster the cluster + * @return returns operation success + */ + boolean disableHA(final Cluster cluster); + + /** + * Enables HA across a zone + * @param zone the zone + * @return returns operation success + */ + boolean enableHA(final DataCenter zone); + + /** + * Disables HA across a zone + * @param zone the zone + * @return returns operation success + */ + boolean disableHA(final DataCenter zone); + + /** + * Returns list of HA config for resources, by resource ID and/or type if provided + * @param resourceId (optional) ID of the resource + * @param resourceType (optional) type of the resource + * @return returns list of ha config for the resource + */ + List listHAResources(final Long resourceId, final HAResource.ResourceType resourceType); + + /** + * Returns list of HA providers for resources + * @param resourceType type of the resource + * @param entityType sub-type of the resource + * @return returns list of ha provider names + */ + List listHAProviders(final HAResource.ResourceType resourceType, final HAResource.ResourceSubType entityType); +} diff --git a/api/src/org/apache/cloudstack/ha/HAResource.java b/api/src/org/apache/cloudstack/ha/HAResource.java new file mode 100644 index 000000000000..650a58b32977 --- /dev/null +++ b/api/src/org/apache/cloudstack/ha/HAResource.java @@ -0,0 +1,37 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ha; + +import org.apache.cloudstack.kernel.Partition; + +public interface HAResource extends Partition { + enum ResourceType { + Host, + VirtualMachine + } + + enum ResourceSubType { + KVM, + Simulator, + Unknown + } + + long getDataCenterId(); + Long getClusterId(); + ResourceType resourceType(); +} diff --git a/api/src/org/apache/cloudstack/kernel/Partition.java b/api/src/org/apache/cloudstack/kernel/Partition.java new file mode 100644 index 000000000000..6d93e3e23cef --- /dev/null +++ b/api/src/org/apache/cloudstack/kernel/Partition.java @@ -0,0 +1,28 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.kernel; + +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.api.InternalIdentity; + +public interface Partition extends InternalIdentity, Identity { + enum PartitionType { + Zone, Pod, Cluster, Host, VM + } + PartitionType partitionType(); +} diff --git a/api/src/com/cloud/network/lb/CertService.java b/api/src/org/apache/cloudstack/network/tls/CertService.java similarity index 90% rename from api/src/com/cloud/network/lb/CertService.java rename to api/src/org/apache/cloudstack/network/tls/CertService.java index e9219e078785..6f4feff9fab5 100644 --- a/api/src/com/cloud/network/lb/CertService.java +++ b/api/src/org/apache/cloudstack/network/tls/CertService.java @@ -14,8 +14,9 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.network.lb; +package org.apache.cloudstack.network.tls; +import java.security.cert.Certificate; import java.util.List; import org.apache.cloudstack.api.command.user.loadbalancer.DeleteSslCertCmd; @@ -30,4 +31,6 @@ public interface CertService { public void deleteSslCert(DeleteSslCertCmd deleteSslCertCmd); public List listSslCerts(ListSslCertsCmd listSslCertCmd); + + public Certificate parseCertificate(final String cert); } \ No newline at end of file diff --git a/api/src/com/cloud/network/lb/SslCert.java b/api/src/org/apache/cloudstack/network/tls/SslCert.java similarity index 94% rename from api/src/com/cloud/network/lb/SslCert.java rename to api/src/org/apache/cloudstack/network/tls/SslCert.java index 98f96ce4020e..074bba6c111a 100644 --- a/api/src/com/cloud/network/lb/SslCert.java +++ b/api/src/org/apache/cloudstack/network/tls/SslCert.java @@ -14,7 +14,7 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.network.lb; +package org.apache.cloudstack.network.tls; import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.api.Identity; @@ -31,5 +31,5 @@ public interface SslCert extends InternalIdentity, Identity, ControlledEntity { public String getPassword(); public String getFingerPrint(); - + public String getName(); } diff --git a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java index 1a22328e02ef..972d6261674c 100644 --- a/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java +++ b/api/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagement.java @@ -39,7 +39,7 @@ public interface OutOfBandManagement extends StateObject ActionTimeout = new ConfigKey("Advanced", Long.class, "outofbandmanagement.action.timeout", "60", "The out of band management action timeout in seconds, configurable by cluster", true, ConfigKey.Scope.Cluster); - ConfigKey SyncThreadInterval = new ConfigKey("Advanced", Long.class, "outofbandmanagement.sync.interval", "300000", - "The interval (in milliseconds) when the out-of-band management background sync are retrieved", true, ConfigKey.Scope.Global); - ConfigKey SyncThreadPoolSize = new ConfigKey("Advanced", Integer.class, "outofbandmanagement.sync.poolsize", "50", "The out of band management background sync thread pool size", true, ConfigKey.Scope.Global); @@ -49,7 +46,7 @@ public interface OutOfBandManagementService { OutOfBandManagementResponse disableOutOfBandManagement(Cluster cluster); OutOfBandManagementResponse disableOutOfBandManagement(Host host); - OutOfBandManagementResponse configureOutOfBandManagement(Host host, ImmutableMap options); - OutOfBandManagementResponse executeOutOfBandManagementPowerOperation(Host host, OutOfBandManagement.PowerOperation operation, Long timeout); - OutOfBandManagementResponse changeOutOfBandManagementPassword(Host host, String password); + OutOfBandManagementResponse configure(Host host, ImmutableMap options); + OutOfBandManagementResponse executePowerOperation(Host host, OutOfBandManagement.PowerOperation operation, Long timeout); + OutOfBandManagementResponse changePassword(Host host, String password); } diff --git a/api/src/org/apache/cloudstack/poll/BackgroundPollManager.java b/api/src/org/apache/cloudstack/poll/BackgroundPollManager.java new file mode 100644 index 000000000000..b9d550002941 --- /dev/null +++ b/api/src/org/apache/cloudstack/poll/BackgroundPollManager.java @@ -0,0 +1,30 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.poll; + +public interface BackgroundPollManager { + /** + * Submits a background poll task that need to run continuously in the background + * to poll external resources, update states, trigger actions etc. + * Tasks must be submitted by a manager in configure-phase, the list of submitted tasks + * are then submitted to the internal executor service during start-phase. + * @param task periodic background task + * @since 4.11 + */ + void submitTask(final BackgroundPollTask task); +} diff --git a/api/src/org/apache/cloudstack/poll/BackgroundPollTask.java b/api/src/org/apache/cloudstack/poll/BackgroundPollTask.java new file mode 100644 index 000000000000..5f1b3300c483 --- /dev/null +++ b/api/src/org/apache/cloudstack/poll/BackgroundPollTask.java @@ -0,0 +1,27 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.poll; + +public interface BackgroundPollTask extends Runnable { + /** + * Returns delay in milliseconds between two rounds + * When it returns null a default value is used + * @return + */ + Long getDelay(); +} diff --git a/api/src/org/apache/cloudstack/region/RegionService.java b/api/src/org/apache/cloudstack/region/RegionService.java index afefcc7672e7..bee66910b4d9 100644 --- a/api/src/org/apache/cloudstack/region/RegionService.java +++ b/api/src/org/apache/cloudstack/region/RegionService.java @@ -27,6 +27,7 @@ import org.apache.cloudstack.api.command.admin.user.DeleteUserCmd; import org.apache.cloudstack.api.command.admin.user.DisableUserCmd; import org.apache.cloudstack.api.command.admin.user.EnableUserCmd; +import org.apache.cloudstack.api.command.admin.user.MoveUserCmd; import org.apache.cloudstack.api.command.admin.user.UpdateUserCmd; import org.apache.cloudstack.api.command.user.region.ListRegionsCmd; @@ -110,10 +111,17 @@ public interface RegionService { */ boolean deleteUser(DeleteUserCmd deleteUserCmd); + /** + * Deletes user by Id + * @param moveUserCmd + * @return true if delete was successful, false otherwise + */ + boolean moveUser(MoveUserCmd moveUserCmd); + /** * update an existing domain * - * @param cmd + * @param updateDomainCmd * - the command containing domainId and new domainName * @return Domain object if the command succeeded */ diff --git a/api/src/org/apache/cloudstack/usage/UsageTypes.java b/api/src/org/apache/cloudstack/usage/UsageTypes.java index d9cfc132e15d..f03d9a9f7333 100644 --- a/api/src/org/apache/cloudstack/usage/UsageTypes.java +++ b/api/src/org/apache/cloudstack/usage/UsageTypes.java @@ -42,6 +42,8 @@ public class UsageTypes { public static final int VM_DISK_BYTES_READ = 23; public static final int VM_DISK_BYTES_WRITE = 24; public static final int VM_SNAPSHOT = 25; + public static final int VOLUME_SECONDARY = 26; + public static final int VM_SNAPSHOT_ON_PRIMARY = 27; public static List listUsageTypes() { List responseList = new ArrayList(); @@ -64,6 +66,7 @@ public static List listUsageTypes() { responseList.add(new UsageTypeResponse(VM_DISK_BYTES_READ, "VM Disk usage(Bytes Read)")); responseList.add(new UsageTypeResponse(VM_DISK_BYTES_WRITE, "VM Disk usage(Bytes Write)")); responseList.add(new UsageTypeResponse(VM_SNAPSHOT, "VM Snapshot storage usage")); + responseList.add(new UsageTypeResponse(VM_SNAPSHOT_ON_PRIMARY, "VM Snapshot on primary storage usage")); return responseList; } } diff --git a/api/test/com/cloud/network/IsolationMethodTest.java b/api/test/com/cloud/network/IsolationMethodTest.java new file mode 100644 index 000000000000..2db3ec55db24 --- /dev/null +++ b/api/test/com/cloud/network/IsolationMethodTest.java @@ -0,0 +1,89 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network; + +import org.junit.After; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; + +public class IsolationMethodTest { + @After + public void cleanTheRegistry() { + PhysicalNetwork.IsolationMethod.registeredIsolationMethods.removeAll(PhysicalNetwork.IsolationMethod.registeredIsolationMethods); + } + + @Test + public void equalsTest() throws Exception { + PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla"); + assertEquals(PhysicalNetwork.IsolationMethod.UNKNOWN_PROVIDER, method.provider); + assertEquals(new PhysicalNetwork.IsolationMethod("bla", PhysicalNetwork.IsolationMethod.UNKNOWN_PROVIDER), method); + } + + @Test + public void toStringTest() throws Exception { + PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob"); + assertEquals("bla", method.toString()); + + } + + @Test + public void getGeneric() throws Exception { + PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob"); + method = new PhysicalNetwork.IsolationMethod("bla"); + + assertEquals("blob",PhysicalNetwork.IsolationMethod.getIsolationMethod("bla").getProvider()); + } + + @Test + public void removeUnregistered() throws Exception { + assertFalse(PhysicalNetwork.IsolationMethod.remove("bla", "blob")); + } + + @Test + public void removeSuccesfulGeneric() throws Exception { + PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob"); + method = new PhysicalNetwork.IsolationMethod("bla"); + + PhysicalNetwork.IsolationMethod.remove("bla", "blob"); + assertEquals(PhysicalNetwork.IsolationMethod.UNKNOWN_PROVIDER,PhysicalNetwork.IsolationMethod.getIsolationMethod("bla").getProvider()); + } + + @Test(expected= PhysicalNetwork.IsolationMethod.IsolationMethodNotRegistered.class) + public void removeSuccesfulSpecificByString() throws Exception { + PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla", "blob"); + + PhysicalNetwork.IsolationMethod.remove("bla", "blob"); + PhysicalNetwork.IsolationMethod.getIsolationMethod("bla"); + } + + @Test(expected= PhysicalNetwork.IsolationMethod.IsolationMethodNotRegistered.class) + public void removeSuccesfulSpecificObject() throws Exception { + PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla"); + + PhysicalNetwork.IsolationMethod.remove(method); + PhysicalNetwork.IsolationMethod.getIsolationMethod("bla"); + } + + @Test + public void getIsolationMethodTest() throws Exception { + PhysicalNetwork.IsolationMethod method = new PhysicalNetwork.IsolationMethod("bla"); + final PhysicalNetwork.IsolationMethod isolationMethod = PhysicalNetwork.IsolationMethod.getIsolationMethod("bla"); + assertEquals(method, isolationMethod); + } +} diff --git a/api/test/com/cloud/network/NetworksTest.java b/api/test/com/cloud/network/NetworksTest.java index c9102d3a02aa..ef5829243421 100644 --- a/api/test/com/cloud/network/NetworksTest.java +++ b/api/test/com/cloud/network/NetworksTest.java @@ -16,16 +16,16 @@ // under the License. package com.cloud.network; -import java.net.URISyntaxException; - -import org.junit.Assert; -import org.junit.Before; -import org.junit.Test; - import com.cloud.dc.Vlan; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.network.Networks.IsolationType; import com.cloud.utils.exception.CloudRuntimeException; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +import java.net.URI; +import java.net.URISyntaxException; /** * @author dhoogland @@ -43,6 +43,13 @@ public void emptyBroadcastDomainTypeTest() throws URISyntaxException { Assert.assertEquals("an empty uri should mean a broadcasttype of undecided", BroadcastDomainType.UnDecided, type); } + @Test + public void vlanCommaSeparatedTest() throws URISyntaxException { + Assert.assertEquals(BroadcastDomainType.getValue(new URI("vlan://100")), "100"); + Assert.assertEquals(BroadcastDomainType.getValue(new URI("vlan://100-200")), "100-200"); + Assert.assertEquals(BroadcastDomainType.getValue(new URI("vlan://10-50,12,11,112-170")), "10-50,12,11,112-170"); + } + @Test public void vlanBroadcastDomainTypeTest() throws URISyntaxException { String uri1 = "vlan://1"; diff --git a/api/test/com/cloud/storage/StorageTest.java b/api/test/com/cloud/storage/StorageTest.java new file mode 100644 index 000000000000..332a8060d08d --- /dev/null +++ b/api/test/com/cloud/storage/StorageTest.java @@ -0,0 +1,70 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.storage; + +import com.cloud.storage.Storage.StoragePoolType; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; + +public class StorageTest { + @Before + public void setUp() { + } + + @Test + public void isSharedStoragePool() { + Assert.assertFalse(StoragePoolType.Filesystem.isShared()); + Assert.assertTrue(StoragePoolType.NetworkFilesystem.isShared()); + Assert.assertTrue(StoragePoolType.IscsiLUN.isShared()); + Assert.assertTrue(StoragePoolType.Iscsi.isShared()); + Assert.assertFalse(StoragePoolType.ISO.isShared()); + Assert.assertTrue(StoragePoolType.Iscsi.isShared()); + Assert.assertFalse(StoragePoolType.LVM.isShared()); + Assert.assertTrue(StoragePoolType.CLVM.isShared()); + Assert.assertTrue(StoragePoolType.RBD.isShared()); + Assert.assertTrue(StoragePoolType.SharedMountPoint.isShared()); + Assert.assertTrue(StoragePoolType.VMFS.isShared()); + Assert.assertTrue(StoragePoolType.PreSetup.isShared()); + Assert.assertFalse(StoragePoolType.EXT.isShared()); + Assert.assertTrue(StoragePoolType.OCFS2.isShared()); + Assert.assertTrue(StoragePoolType.SMB.isShared()); + Assert.assertTrue(StoragePoolType.Gluster.isShared()); + Assert.assertTrue(StoragePoolType.ManagedNFS.isShared()); + } + + @Test + public void supportsOverprovisioningStoragePool() { + Assert.assertTrue(StoragePoolType.Filesystem.supportsOverProvisioning()); + Assert.assertTrue(StoragePoolType.NetworkFilesystem.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.IscsiLUN.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.Iscsi.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.ISO.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.Iscsi.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.LVM.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.CLVM.supportsOverProvisioning()); + Assert.assertTrue(StoragePoolType.RBD.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.SharedMountPoint.supportsOverProvisioning()); + Assert.assertTrue(StoragePoolType.VMFS.supportsOverProvisioning()); + Assert.assertTrue(StoragePoolType.PreSetup.supportsOverProvisioning()); + Assert.assertTrue(StoragePoolType.EXT.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.OCFS2.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.SMB.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.Gluster.supportsOverProvisioning()); + Assert.assertFalse(StoragePoolType.ManagedNFS.supportsOverProvisioning()); + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java b/api/test/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmdTest.java similarity index 56% rename from engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java rename to api/test/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmdTest.java index 1827edfe8617..06656868994c 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDao.java +++ b/api/test/org/apache/cloudstack/api/command/admin/annotation/AddAnnotationCmdTest.java @@ -16,16 +16,25 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cloudstack.storage.volume.db; +package org.apache.cloudstack.api.command.admin.annotation; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; +import org.junit.Before; +import org.junit.Test; +import org.mockito.MockitoAnnotations; -import com.cloud.utils.db.GenericDao; -import com.cloud.utils.fsm.StateDao; +public class AddAnnotationCmdTest { -public interface TemplatePrimaryDataStoreDao extends GenericDao, - StateDao { - public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolId(long templateId, long poolId); + private AddAnnotationCmd addAnnotationCmd = new AddAnnotationCmd(); - public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolIdAndReady(long templateId, long poolId); + @Before + public void setUp() throws Exception { + MockitoAnnotations.initMocks(this); + } + + @Test (expected = IllegalStateException.class) + public void wrongEntityType() throws Exception { + addAnnotationCmd.setEntityType("BLA"); + addAnnotationCmd.setEntityUuid("1"); + addAnnotationCmd.execute(); + } } diff --git a/api/test/org/apache/cloudstack/api/command/test/CreateSnapshotCmdTest.java b/api/test/org/apache/cloudstack/api/command/test/CreateSnapshotCmdTest.java new file mode 100644 index 000000000000..bc2beb6cb667 --- /dev/null +++ b/api/test/org/apache/cloudstack/api/command/test/CreateSnapshotCmdTest.java @@ -0,0 +1,132 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.test; + +import com.cloud.storage.Snapshot; +import com.cloud.storage.VolumeApiService; +import com.cloud.user.Account; +import com.cloud.user.AccountService; +import junit.framework.TestCase; +import org.apache.cloudstack.api.ResponseGenerator; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.command.user.snapshot.CreateSnapshotCmd; +import org.apache.cloudstack.api.response.SnapshotResponse; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.rules.ExpectedException; +import org.mockito.Mockito; + +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.anyBoolean; +import static org.mockito.Matchers.anyLong; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.isNull; + +public class CreateSnapshotCmdTest extends TestCase { + + private CreateSnapshotCmd createSnapshotCmd; + private ResponseGenerator responseGenerator; + + @Rule + public ExpectedException expectedException = ExpectedException.none(); + + @Override + @Before + public void setUp() { + + createSnapshotCmd = new CreateSnapshotCmd() { + + @Override + public String getCommandName() { + return "createsnapshotresponse"; + } + + @Override + public Long getVolumeId(){ + return 1L; + } + + @Override + public long getEntityOwnerId(){ + return 1L; + } + }; + + } + + @Test + public void testCreateSuccess() { + + AccountService accountService = Mockito.mock(AccountService.class); + Account account = Mockito.mock(Account.class); + Mockito.when(accountService.getAccount(anyLong())).thenReturn(account); + + VolumeApiService volumeApiService = Mockito.mock(VolumeApiService.class); + Snapshot snapshot = Mockito.mock(Snapshot.class); + try { + + Mockito.when(volumeApiService.takeSnapshot(anyLong(), anyLong(), anyLong(), + any(Account.class), anyBoolean(), isNull(Snapshot.LocationType.class), anyBoolean())).thenReturn(snapshot); + + } catch (Exception e) { + Assert.fail("Received exception when success expected " + e.getMessage()); + } + + responseGenerator = Mockito.mock(ResponseGenerator.class); + SnapshotResponse snapshotResponse = Mockito.mock(SnapshotResponse.class); + Mockito.when(responseGenerator.createSnapshotResponse(snapshot)).thenReturn(snapshotResponse); + Mockito.doNothing().when(snapshotResponse).setAccountName(anyString()); + + createSnapshotCmd._accountService = accountService; + createSnapshotCmd._responseGenerator = responseGenerator; + createSnapshotCmd._volumeService = volumeApiService; + + try { + createSnapshotCmd.execute(); + } catch (Exception e) { + Assert.fail("Received exception when success expected " + e.getMessage()); + } + } + + @Test + public void testCreateFailure() { + + AccountService accountService = Mockito.mock(AccountService.class); + Account account = Mockito.mock(Account.class); + Mockito.when(accountService.getAccount(anyLong())).thenReturn(account); + + VolumeApiService volumeApiService = Mockito.mock(VolumeApiService.class); + + try { + Mockito.when(volumeApiService.takeSnapshot(anyLong(), anyLong(), anyLong(), + any(Account.class), anyBoolean(), isNull(Snapshot.LocationType.class), anyBoolean())).thenReturn(null); + } catch (Exception e) { + Assert.fail("Received exception when success expected " + e.getMessage()); + } + + createSnapshotCmd._accountService = accountService; + createSnapshotCmd._volumeService = volumeApiService; + + try { + createSnapshotCmd.execute(); + } catch (ServerApiException exception) { + Assert.assertEquals("Failed to create snapshot due to an internal error creating snapshot for volume 1", exception.getDescription()); + } + } +} diff --git a/api/test/org/apache/cloudstack/api/command/test/UpdateRoleCmdTest.java b/api/test/org/apache/cloudstack/api/command/test/UpdateRoleCmdTest.java new file mode 100644 index 000000000000..c0bd390c1963 --- /dev/null +++ b/api/test/org/apache/cloudstack/api/command/test/UpdateRoleCmdTest.java @@ -0,0 +1,70 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.test; + +import junit.framework.TestCase; +import org.apache.cloudstack.acl.Role; +import org.apache.cloudstack.acl.RoleService; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.command.admin.acl.UpdateRoleCmd; +import org.apache.cloudstack.api.response.RoleResponse; +import org.junit.Before; +import org.junit.Test; +import org.mockito.Mockito; +import org.springframework.test.util.ReflectionTestUtils; + +import static org.mockito.Mockito.when; + + +public class UpdateRoleCmdTest extends TestCase{ + + private UpdateRoleCmd updateRoleCmd; + private RoleService roleService; + private Role role; + + @Override + @Before + public void setUp() { + roleService = Mockito.spy(RoleService.class); + updateRoleCmd = new UpdateRoleCmd(); + ReflectionTestUtils.setField(updateRoleCmd,"roleService",roleService); + ReflectionTestUtils.setField(updateRoleCmd,"roleId",1L); + ReflectionTestUtils.setField(updateRoleCmd,"roleName","user"); + ReflectionTestUtils.setField(updateRoleCmd,"roleType", "User"); + ReflectionTestUtils.setField(updateRoleCmd,"roleDescription","Description Initial"); + role = Mockito.mock(Role.class); + } + + @Test + public void testUpdateSuccess() { + when(roleService.findRole(updateRoleCmd.getRoleId())).thenReturn(role); + when(role.getId()).thenReturn(1L); + when(role.getUuid()).thenReturn("12345-abcgdkajd"); + when(role.getDescription()).thenReturn("Defualt user"); + when(role.getName()).thenReturn("User"); + when(role.getRoleType()).thenReturn(RoleType.User); + when(roleService.updateRole(role,updateRoleCmd.getRoleName(),updateRoleCmd.getRoleType(),updateRoleCmd.getRoleDescription())).thenReturn(role); + when(role.getId()).thenReturn(1L); + when(role.getDescription()).thenReturn("Description Initial"); + when(role.getName()).thenReturn("User"); + updateRoleCmd.execute(); + RoleResponse response = (RoleResponse) updateRoleCmd.getResponseObject(); + assertEquals((String)ReflectionTestUtils.getField(response, "roleName"),role.getName()); + assertEquals((String)ReflectionTestUtils.getField(response, "roleDescription"),role.getDescription()); + } +} diff --git a/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdByAdminTest.java b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdByAdminTest.java new file mode 100644 index 000000000000..d34c31ffaf20 --- /dev/null +++ b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdByAdminTest.java @@ -0,0 +1,77 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + +package org.apache.cloudstack.api.command.user.template; + +import com.cloud.exception.ResourceAllocationException; +import com.cloud.template.TemplateApiService; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.command.admin.template.CopyTemplateCmdByAdmin; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; + +/** + * Created by stack on 7/21/16. + */ +@RunWith(MockitoJUnitRunner.class) +public class CopyTemplateCmdByAdminTest{ + + @InjectMocks + private CopyTemplateCmdByAdmin copyTemplateCmdByAdmin; + + @Mock + public TemplateApiService _templateService; + + @Test + public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException { + try { + copyTemplateCmdByAdmin = new CopyTemplateCmdByAdmin(); + copyTemplateCmdByAdmin.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("API should fail when no parameters are passed."); + } + } + } + + @Test + public void testDestZoneidAndDestZoneIdListBothPresent() throws ResourceAllocationException { + try { + copyTemplateCmdByAdmin = new CopyTemplateCmdByAdmin(); + copyTemplateCmdByAdmin.destZoneId = -1L; + copyTemplateCmdByAdmin.destZoneIds = new ArrayList<>(); + copyTemplateCmdByAdmin.destZoneIds.add(-1L); + + copyTemplateCmdByAdmin.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Api should fail when both destzoneid and destzoneids are passed"); + } + } + } + + +} + diff --git a/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdTest.java b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdTest.java new file mode 100644 index 000000000000..145aaa68d83e --- /dev/null +++ b/api/test/org/apache/cloudstack/api/command/user/template/CopyTemplateCmdTest.java @@ -0,0 +1,75 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.api.command.user.template; + +import com.cloud.exception.ResourceAllocationException; +import com.cloud.template.TemplateApiService; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.ServerApiException; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; + +import java.util.ArrayList; + +/** + * Created by stack on 7/21/16. + */ +@RunWith(MockitoJUnitRunner.class) +public class CopyTemplateCmdTest{ + + @InjectMocks + private CopyTemplateCmd copyTemplateCmd; + + @Mock + public TemplateApiService _templateService; + + @Test + public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException { + try { + copyTemplateCmd = new CopyTemplateCmd(); + copyTemplateCmd.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("API should fail when no parameters are passed."); + } + } + } + + @Test + public void testDestZoneidAndDestZoneIdListBothPresent() throws ResourceAllocationException { + try { + copyTemplateCmd = new CopyTemplateCmd(); + copyTemplateCmd.destZoneId = -1L; + copyTemplateCmd.destZoneIds = new ArrayList<>(); + copyTemplateCmd.destZoneIds.add(-1L); + + copyTemplateCmd.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Api should fail when both destzoneid and destzoneids are passed"); + } + } + } + + +} + diff --git a/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdByAdminTest.java b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdByAdminTest.java new file mode 100644 index 000000000000..1ba7963b2b90 --- /dev/null +++ b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdByAdminTest.java @@ -0,0 +1,113 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + + +package org.apache.cloudstack.api.command.user.template; + +import com.cloud.exception.ResourceAllocationException; +import com.cloud.template.TemplateApiService; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.ServerApiException; +import org.apache.cloudstack.api.command.admin.template.RegisterTemplateCmdByAdmin; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import java.util.ArrayList; + +@RunWith(MockitoJUnitRunner.class) +public class RegisterTemplateCmdByAdminTest{ + + @InjectMocks + private RegisterTemplateCmdByAdmin registerTemplateCmdByAdmin; + + @Mock + public TemplateApiService _templateService; + + @Test + public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException { + try { + registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin(); + registerTemplateCmdByAdmin.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Api should fail when both zoneid and zoneids aren't passed"); + } + } + } + + @Test + public void testZoneidAndZoneIdListBothPresent() throws ResourceAllocationException { + try { + registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin(); + registerTemplateCmdByAdmin.zoneId = -1L; + registerTemplateCmdByAdmin.zoneIds = new ArrayList<>(); + registerTemplateCmdByAdmin.zoneIds.add(-1L); + + registerTemplateCmdByAdmin.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Api should fail when both zoneid and zoneids are passed"); + } + } + } + + + @Test + public void testZoneidMinusOne() throws ResourceAllocationException { + // If zoneId is passed as -1, then zone ids list should be null. + registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin(); + registerTemplateCmdByAdmin.zoneId = -1L; + + Assert.assertNull(registerTemplateCmdByAdmin.getZoneIds()); + } + + @Test + public void testZoneidListMinusOne() throws ResourceAllocationException { + // If zoneId List has only one parameter -1, then zone ids list should be null. + registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin(); + registerTemplateCmdByAdmin.zoneIds = new ArrayList<>(); + registerTemplateCmdByAdmin.zoneIds.add(-1L); + + Assert.assertNull(registerTemplateCmdByAdmin.getZoneIds()); + } + + @Test + public void testZoneidListMoreThanMinusOne() throws ResourceAllocationException { + try { + registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin(); + registerTemplateCmdByAdmin.zoneIds = new ArrayList<>(); + registerTemplateCmdByAdmin.zoneIds.add(-1L); + registerTemplateCmdByAdmin.zoneIds.add(1L); + registerTemplateCmdByAdmin.execute(); + } catch (ServerApiException e) { + if (e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Parameter zoneids cannot combine all zones (-1) option with other zones"); + } + } + } + @Test + public void testZoneidPresentZoneidListAbsent() throws ResourceAllocationException { + registerTemplateCmdByAdmin = new RegisterTemplateCmdByAdmin(); + registerTemplateCmdByAdmin.zoneIds = null; + registerTemplateCmdByAdmin.zoneId = 1L; + Assert.assertEquals((Long)1L,registerTemplateCmdByAdmin.getZoneIds().get(0)); + } +} diff --git a/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdTest.java b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdTest.java new file mode 100644 index 000000000000..f0cf6a91af2e --- /dev/null +++ b/api/test/org/apache/cloudstack/api/command/user/template/RegisterTemplateCmdTest.java @@ -0,0 +1,111 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + + + +package org.apache.cloudstack.api.command.user.template; + +import com.cloud.exception.ResourceAllocationException; +import com.cloud.template.TemplateApiService; +import org.apache.cloudstack.api.ApiErrorCode; +import org.apache.cloudstack.api.ServerApiException; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.runners.MockitoJUnitRunner; +import java.util.ArrayList; + +@RunWith(MockitoJUnitRunner.class) +public class RegisterTemplateCmdTest{ + + @InjectMocks + private RegisterTemplateCmd registerTemplateCmd; + + @Mock + public TemplateApiService _templateService; + + @Test + public void testZoneidAndZoneIdListEmpty() throws ResourceAllocationException { + try { + registerTemplateCmd = new RegisterTemplateCmd(); + registerTemplateCmd.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Api should fail when both zoneid and zoneids aren't passed"); + } + } + } + + @Test + public void testZoneidAndZoneIdListBothPresent() throws ResourceAllocationException { + try { + registerTemplateCmd = new RegisterTemplateCmd(); + registerTemplateCmd.zoneId = -1L; + registerTemplateCmd.zoneIds = new ArrayList<>(); + registerTemplateCmd.zoneIds.add(-1L); + + registerTemplateCmd.execute(); + } catch (ServerApiException e) { + if(e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Api should fail when both zoneid and zoneids are passed"); + } + } + } + + + @Test + public void testZoneidMinusOne() throws ResourceAllocationException { + // If zoneId is passed as -1, then zone ids list should be null. + registerTemplateCmd = new RegisterTemplateCmd(); + registerTemplateCmd.zoneId = -1L; + + Assert.assertNull(registerTemplateCmd.getZoneIds()); + } + + @Test + public void testZoneidListMinusOne() throws ResourceAllocationException { + // If zoneId List has only one parameter -1, then zone ids list should be null. + registerTemplateCmd = new RegisterTemplateCmd(); + registerTemplateCmd.zoneIds = new ArrayList<>(); + registerTemplateCmd.zoneIds.add(-1L); + + Assert.assertNull(registerTemplateCmd.getZoneIds()); + } + @Test + public void testZoneidListMoreThanMinusOne() throws ResourceAllocationException { + try { + registerTemplateCmd = new RegisterTemplateCmd(); + registerTemplateCmd.zoneIds = new ArrayList<>(); + registerTemplateCmd.zoneIds.add(-1L); + registerTemplateCmd.zoneIds.add(1L); + registerTemplateCmd.execute(); + } catch (ServerApiException e) { + if (e.getErrorCode() != ApiErrorCode.PARAM_ERROR) { + Assert.fail("Parameter zoneids cannot combine all zones (-1) option with other zones"); + } + } + } + @Test + public void testZoneidPresentZoneidListAbsent() throws ResourceAllocationException { + registerTemplateCmd = new RegisterTemplateCmd(); + registerTemplateCmd.zoneIds = null; + registerTemplateCmd.zoneId = 1L; + Assert.assertEquals((Long)1L,registerTemplateCmd.getZoneIds().get(0)); + } +} diff --git a/build/replace.properties b/build/replace.properties index 9e0b65c69010..3d9a45970600 100644 --- a/build/replace.properties +++ b/build/replace.properties @@ -27,4 +27,4 @@ AGENTLOG=logs/agent.log MSMNTDIR=/mnt COMPONENTS-SPEC=components.xml REMOTEHOST=localhost -COMMONLIBDIR=client/target/cloud-client-ui-4.7.0/WEB-INF/lib/ +COMMONLIBDIR=client/target/common/ diff --git a/client/WEB-INF/classes/resources/messages.properties b/client/WEB-INF/classes/resources/messages.properties deleted file mode 100644 index 327e1d9db1f8..000000000000 --- a/client/WEB-INF/classes/resources/messages.properties +++ /dev/null @@ -1,2291 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -label.add.ldap.account=Add LDAP account -label.vm.ip=VM IP Address -message.listView.subselect.multi=(Ctrl/Cmd-click) -label.use.vm.ips=Use VM IPs -label.reinstall.vm=Reinstall VM -message.reinstall.vm=NOTE: Proceed with caution. This will cause the VM to be reinstalled from the template; data on the root disk will be lost. Extra data volumes, if any, will not be touched. -label.recover.vm=Recover VM -message.recover.vm=Please confirm that you would like to recover this VM. -label.port=Port -label.remove.ldap=Remove LDAP -label.configure.ldap=Configure LDAP -label.ldap.configuration=LDAP Configuration -label.ldap.port=LDAP port -label.create.nfs.secondary.staging.store=Create NFS secondary staging store -label.volatile=Volatile -label.planner.mode=Planner mode -label.deployment.planner=Deployment planner -label.quiesce.vm=Quiesce VM -label.smb.username=SMB Username -label.smb.password=SMB Password -label.smb.domain=SMB Domain -label.hypervisors=Hypervisors -label.home=Home -label.sockets=CPU Sockets -label.root.disk.size=Root disk size (GB) -label.s3.nfs.server=S3 NFS Server -label.s3.nfs.path=S3 NFS Path -label.delete.events=Delete events -label.delete.alerts=Delete alerts -label.archive.alerts=Archive alerts -label.archive.events=Archive events -label.by.alert.type=By alert type -label.by.event.type=By event type -label.by.date.start=By date (start) -label.by.date.end=By date (end) -label.switch.type=Switch Type -label.service.state=Service State -label.egress.default.policy=Egress Default Policy -label.routing=Routing -label.hvm=HVM -label.about=About -label.app.name=CloudStack -label.about.app=About CloudStack -label.custom.disk.iops=Custom IOPS -label.disk.iops.min=Min IOPS -label.disk.iops.max=Max IOPS -label.disk.iops.total=IOPS Total -label.hypervisor.snapshot.reserve=Hypervisor Snapshot Reserve -label.secondary.ips=Secondary IPs -label.edit.secondary.ips=Edit secondary IPs -label.view.secondary.ips=View secondary IPs -message.validate.invalid.characters=Invalid characters found; please correct. -message.acquire.ip.nic=Please confirm that you would like to acquire a new secondary IP for this NIC.
NOTE: You need to manually configure the newly-acquired secondary IP inside the virtual machine. -message.select.affinity.groups=Please select any affinity groups you want this VM to belong to: -message.no.affinity.groups=You do not have any affinity groups. Please continue to the next step. -label.action.delete.nic=Remove NIC -message.action.delete.nic=Please confirm that want to remove this NIC, which will also remove the associated network from the VM. -changed.item.properties=Changed item properties -confirm.enable.s3=Please fill in the following information to enable support for S3-backed Secondary Storage -confirm.enable.swift=Please fill in the following information to enable support for Swift -error.could.not.change.your.password.because.ldap.is.enabled=Error could not change your password because LDAP is enabled. -error.could.not.enable.zone=Could not enable zone -error.installWizard.message=Something went wrong; you may go back and correct any errors -error.invalid.username.password=Invalid username or password -error.login=Your username/password does not match our records. -error.menu.select=Unable to perform action due to no items being selected. -error.mgmt.server.inaccessible=The Management Server is unaccessible. Please try again later. -error.password.not.match=The password fields do not match -error.please.specify.physical.network.tags=Network offerings is not available until you specify tags for this physical network. -error.session.expired=Your session has expired. -error.something.went.wrong.please.correct.the.following=Something went wrong; please correct the following -error.unable.to.reach.management.server=Unable to reach Management Server -error.unresolved.internet.name=Your internet name cannot be resolved. -label.extractable=Extractable -force.delete.domain.warning=Warning\: Choosing this option will cause the deletion of all child domains and all associated accounts and their resources. -force.delete=Force Delete -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.remove=Force Remove -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 state. -force.stop=Force Stop -ICMP.code=ICMP Code -ICMP.type=ICMP Type -image.directory=Image Directory -inline=Inline -instances.actions.reboot.label=Reboot instance -label.accept.project.invitation=Accept project invitation -label.account.and.security.group=Account, Security group -label.account.id=Account ID -label.account.name=Account Name -label.account.specific=Account-Specific -label.account=Account -label.accounts=Accounts -label.acquire.new.ip=Acquire New IP -label.acquire.new.secondary.ip=Acquire new secondary IP -label.action.attach.disk.processing=Attaching Disk.... -label.action.attach.disk=Attach Disk -label.action.attach.iso.processing=Attaching ISO.... -label.action.attach.iso=Attach ISO -label.action.cancel.maintenance.mode.processing=Cancelling Maintenance Mode.... -label.action.cancel.maintenance.mode=Cancel Maintenance Mode -label.action.change.password=Change Password -label.action.configure.samlauthorization=Configure SAML SSO Authorization -label.action.change.service.processing=Changing Service.... -label.action.change.service=Change Service -label.action.copy.ISO.processing=Copying ISO.... -label.action.copy.ISO=Copy ISO -label.action.copy.template.processing=Copying Template.... -label.action.copy.template=Copy Template -label.action.create.template.from.vm=Create Template from VM -label.action.create.template.from.volume=Create Template from Volume -label.action.create.template.processing=Creating Template.... -label.action.create.template=Create Template -label.action.create.vm.processing=Creating VM.... -label.action.create.vm=Create VM -label.action.create.volume.processing=Creating Volume.... -label.action.create.volume=Create Volume -label.action.delete.account.processing=Deleting account.... -label.action.delete.account=Delete account -label.action.delete.cluster.processing=Deleting Cluster.... -label.action.delete.cluster=Delete Cluster -label.action.delete.disk.offering.processing=Deleting Disk Offering.... -label.action.delete.disk.offering=Delete Disk Offering -label.action.delete.domain.processing=Deleting Domain.... -label.action.delete.domain=Delete Domain -label.action.delete.firewall.processing=Deleting Firewall.... -label.action.delete.firewall=Delete firewall rule -label.action.delete.ingress.rule.processing=Deleting Ingress Rule.... -label.action.delete.ingress.rule=Delete Ingress Rule -label.action.delete.IP.range.processing=Deleting IP Range.... -label.action.delete.IP.range=Delete IP Range -label.action.delete.ISO.processing=Deleting ISO.... -label.action.delete.ISO=Delete ISO -label.action.delete.load.balancer.processing=Deleting Load Balancer.... -label.action.delete.load.balancer=Delete load balancer rule -label.action.delete.network.processing=Deleting Network.... -label.action.delete.network=Delete Network -label.action.delete.nexusVswitch=Delete Nexus 1000v -label.action.delete.physical.network=Delete physical network -label.action.delete.pod.processing=Deleting Pod.... -label.action.delete.pod=Delete Pod -label.action.delete.primary.storage.processing=Deleting Primary Storage.... -label.action.delete.primary.storage=Delete Primary Storage -label.action.delete.secondary.storage.processing=Deleting Secondary Storage.... -label.action.delete.secondary.storage=Delete Secondary Storage -label.action.delete.security.group.processing=Deleting Security Group.... -label.action.delete.security.group=Delete Security Group -label.action.delete.service.offering.processing=Deleting Service Offering.... -label.action.delete.service.offering=Delete Service Offering -label.action.delete.snapshot.processing=Deleting Snapshot.... -label.action.delete.snapshot=Delete Snapshot -label.action.delete.system.service.offering=Delete System Service Offering -label.action.delete.template.processing=Deleting Template.... -label.action.delete.template=Delete Template -label.action.delete.user.processing=Deleting User.... -label.action.delete.user=Delete User -label.action.delete.volume.processing=Deleting Volume.... -label.action.delete.volume=Delete Volume -label.action.delete.zone.processing=Deleting Zone.... -label.action.delete.zone=Delete Zone -label.action.destroy.instance.processing=Destroying Instance.... -label.action.destroy.instance=Destroy Instance -label.action.destroy.systemvm.processing=Destroying System VM.... -label.action.destroy.systemvm=Destroy System VM -label.action.detach.disk.processing=Detaching Disk.... -label.action.detach.disk=Detach Disk -label.action.detach.iso.processing=Detaching ISO.... -label.action.detach.iso=Detach ISO -label.action.disable.account.processing=Disabling account.... -label.action.disable.account=Disable account -label.action.disable.cluster.processing=Disabling Cluster.... -label.action.disable.cluster=Disable Cluster -label.action.disable.nexusVswitch=Disable Nexus 1000v -label.action.disable.physical.network=Disable physical network -label.action.disable.pod.processing=Disabling Pod.... -label.action.disable.pod=Disable Pod -label.action.disable.static.NAT.processing=Disabling Static NAT.... -label.action.disable.static.NAT=Disable Static NAT -label.action.disable.user.processing=Disabling User.... -label.action.disable.user=Disable User -label.action.disable.zone.processing=Disabling Zone.... -label.action.disable.zone=Disable Zone -label.action.download.ISO=Download ISO -label.action.download.template=Download Template -label.action.download.volume.processing=Downloading Volume.... -label.action.download.volume=Download Volume -label.action.edit.account=Edit account -label.action.edit.disk.offering=Edit Disk Offering -label.action.edit.domain=Edit Domain -label.action.edit.global.setting=Edit Global Setting -label.action.edit.host=Edit Host -label.action.edit.instance=Edit Instance -label.action.edit.ISO=Edit ISO -label.action.edit.network.offering=Edit Network Offering -label.action.edit.network.processing=Editing Network.... -label.action.edit.network=Edit Network -label.action.edit.pod=Edit Pod -label.action.edit.primary.storage=Edit Primary Storage -label.action.edit.resource.limits=Edit Resource Limits -label.action.edit.service.offering=Edit Service Offering -label.action.edit.template=Edit Template -label.action.edit.user=Edit User -label.action.edit.zone=Edit Zone -label.action.enable.account.processing=Enabling account.... -label.action.enable.account=Enable account -label.action.enable.cluster.processing=Enabling Cluster.... -label.action.enable.cluster=Enable Cluster -label.action.enable.maintenance.mode.processing=Enabling Maintenance Mode.... -label.action.enable.maintenance.mode=Enable Maintenance Mode -label.action.enable.nexusVswitch=Enable Nexus 1000v -label.action.enable.physical.network=Enable physical network -label.action.enable.pod.processing=Enabling Pod.... -label.action.enable.pod=Enable Pod -label.action.enable.static.NAT.processing=Enabling Static NAT.... -label.action.enable.static.NAT=Enable Static NAT -label.action.enable.user.processing=Enabling User.... -label.action.enable.user=Enable User -label.action.enable.zone.processing=Enabling Zone.... -label.action.enable.zone=Enable Zone -label.action.expunge.instance=Expunge Instance -label.action.expunge.instance.processing=Expunging Instance.... -label.action.force.reconnect.processing=Reconnecting.... -label.action.force.reconnect=Force Reconnect -label.action.generate.keys.processing=Generate Keys.... -label.action.generate.keys=Generate Keys -label.action.list.nexusVswitch=List Nexus 1000v -label.action.lock.account.processing=Locking account.... -label.action.lock.account=Lock account -label.action.manage.cluster.processing=Managing Cluster.... -label.action.manage.cluster=Manage Cluster -label.action.migrate.instance.processing=Migrating Instance.... -label.action.migrate.instance=Migrate Instance -label.action.migrate.router.processing=Migrating Router.... -label.action.migrate.router=Migrate Router -label.action.migrate.systemvm.processing=Migrating System VM.... -label.action.migrate.systemvm=Migrate System VM -label.action.reboot.instance.processing=Rebooting Instance.... -label.action.reboot.instance=Reboot Instance -label.action.reboot.router.processing=Rebooting Router.... -label.action.reboot.router=Reboot Router -label.action.reboot.systemvm.processing=Rebooting System VM.... -label.action.reboot.systemvm=Reboot System VM -label.action.recurring.snapshot=Recurring Snapshots -label.action.register.iso=Register ISO -label.action.register.template=Register Template from URL -label.action.release.ip.processing=Releasing IP.... -label.action.release.ip=Release IP -label.action.remove.host.processing=Removing Host.... -label.action.remove.host=Remove Host -label.action.reset.password.processing=Resetting Password.... -label.action.reset.password=Reset Password -label.action.resize.volume.processing=Resizing Volume.... -label.action.resize.volume=Resize Volume -label.action.resource.limits=Resource limits -label.action.restore.instance.processing=Restoring Instance.... -label.action.restore.instance=Restore Instance -label.action.start.instance.processing=Starting Instance.... -label.action.start.instance=Start Instance -label.action.start.router.processing=Starting Router.... -label.action.start.router=Start Router -label.action.start.systemvm.processing=Starting System VM.... -label.action.start.systemvm=Start System VM -label.action.stop.instance.processing=Stopping Instance.... -label.action.stop.instance=Stop Instance -label.action.stop.router.processing=Stopping Router.... -label.action.stop.router=Stop Router -label.action.stop.systemvm.processing=Stopping System VM.... -label.action.stop.systemvm=Stop System VM -label.action.take.snapshot.processing=Taking Snapshot.... -label.action.take.snapshot=Take Snapshot -label.action.revert.snapshot.processing=Reverting to Snapshot... -label.action.revert.snapshot=Revert to Snapshot -label.action.unmanage.cluster.processing=Unmanaging Cluster.... -label.action.unmanage.cluster=Unmanage Cluster -label.action.update.OS.preference.processing=Updating OS Preference.... -label.action.update.OS.preference=Update OS Preference -label.action.update.resource.count.processing=Updating Resource Count.... -label.action.update.resource.count=Update Resource Count -label.action.vmsnapshot.create=Take VM Snapshot -label.action.vmsnapshot.delete=Delete VM snapshot -label.action.vmsnapshot.revert=Revert to VM snapshot -label.actions=Actions -label.activate.project=Activate Project -label.active.sessions=Active Sessions -label.add.account.to.project=Add account to project -label.add.account=Add Account -label.add.accounts.to=Add accounts to -label.add.accounts=Add accounts -label.add.ACL=Add ACL -label.add.affinity.group=Add new affinity group -label.add.BigSwitchBcf.device=Add BigSwitch BCF Controller -label.add.by.cidr=Add By CIDR -label.add.by.group=Add By Group -label.add.by=Add by -label.add.cluster=Add Cluster -label.add.compute.offering=Add compute offering -label.add.direct.iprange=Add Direct Ip Range -label.add.disk.offering=Add Disk Offering -label.add.domain=Add Domain -label.add.egress.rule=Add egress rule -label.add.F5.device=Add F5 device -label.add.firewall=Add firewall rule -label.add.guest.network=Add guest network -label.add.isolated.guest.network=Add Isolated Guest Network -label.add.host=Add Host -label.add.ingress.rule=Add Ingress Rule -label.add.intermediate.certificate=Add intermediate certificate -label.add.ip.range=Add IP Range -label.add.load.balancer=Add Load Balancer -label.add.more=Add More -label.add.netScaler.device=Add Netscaler device -label.add.network.ACL=Add network ACL -label.add.network.device=Add Network Device -label.add.network.offering=Add network offering -label.add.network=Add Network -label.add.new.F5=Add new F5 -label.add.new.gateway=Add new gateway -label.add.new.NetScaler=Add new NetScaler -label.add.new.SRX=Add new SRX -label.add.new.PA=Add new Palo Alto -label.add.new.tier=Add new tier -label.add.NiciraNvp.device=Add Nvp Controller -label.add.NuageVsp.device=Add Nuage Virtualized Services Directory (VSD) -label.add.BrocadeVcs.device=Add Brocade Vcs Switch -label.add.physical.network=Add physical network -label.add.pod=Add Pod -label.add.port.forwarding.rule=Add port forwarding rule -label.add.primary.storage=Add Primary Storage -label.add.region=Add Region -label.add.resources=Add Resources -label.add.route=Add route -label.add.rule=Add rule -label.add.secondary.storage=Add Secondary Storage -label.add.security.group=Add Security Group -label.add.service.offering=Add Service Offering -label.add.SRX.device=Add SRX device -label.add.PA.device=Add Palo Alto device -label.add.static.nat.rule=Add static NAT rule -label.add.static.route=Add static route -label.add.system.service.offering=Add System Service Offering -label.add.template=Add Template -label.add.to.group=Add to group -label.add.user=Add User -label.add.userdata=Userdata -label.add.vlan=Add VLAN -label.add.vxlan=Add VXLAN -label.add.VM.to.tier=Add VM to tier -label.add.vm=Add VM -label.add.vms.to.lb=Add VM(s) to load balancer rule -label.add.vms=Add VMs -label.add.volume=Add Volume -label.add.vpc=Add VPC -label.add.vpn.customer.gateway=Add VPN Customer Gateway -label.add.VPN.gateway=Add VPN Gateway -label.add.vpn.user=Add VPN user -label.add.zone=Add Zone -label.add=Add -label.adding.cluster=Adding Cluster -label.adding.failed=Adding Failed -label.adding.pod=Adding Pod -label.adding.processing=Adding.... -label.adding.succeeded=Adding Succeeded -label.adding.user=Adding User -label.adding.zone=Adding Zone -label.adding=Adding -label.additional.networks=Additional Networks -label.admin.accounts=Admin Accounts -label.admin=Admin -label.advanced.mode=Advanced Mode -label.advanced.search=Advance Search -label.advanced=Advanced -label.affinity.group=Affinity Group -label.affinity.groups=Affinity Groups -label.affinity=Affinity -label.agent.password=Agent Password -label.agent.port=Agent Port -label.agent.username=Agent Username -label.agree=Agree -label.alert=Alert -label.algorithm=Algorithm -label.allocated=Allocated -label.allocation.state=Allocation State -label.anti.affinity.group=Anti-affinity Group -label.anti.affinity.groups=Anti-affinity Groups -label.anti.affinity=Anti-affinity -label.api.key=API Key -label.api.version=API Version -label.apply=Apply -label.assign.to.load.balancer=Assigning instance to load balancer -label.assign=Assign -label.associated.network.id=Associated Network ID -label.associated.network=Associated Network -label.attached.iso=Attached ISO -label.author.email=Author e-mail -label.author.name=Author name -label.availability.zone=Availability Zone -label.availability=Availability -label.available.public.ips=Available Public IP Addresses -label.available=Available -label.back=Back -label.bandwidth=Bandwidth -label.basic.mode=Basic Mode -label.basic=Basic -label.bigswitch.controller.address=BigSwitch BCF Controller Address -label.bootable=Bootable -label.broadcast.domain.range=Broadcast domain range -label.broadcast.domain.type=Broadcast Domain Type -label.broadcast.uri=Broadcast URI -label.by.account=By Account -label.by.availability=By Availability -label.by.domain=By Domain -label.by.end.date=By End Date -label.by.level=By Level -label.by.pod=By Pod -label.by.role=By Role -label.by.start.date=By Start Date -label.by.state=By State -label.by.traffic.type=By Traffic Type -label.by.type.id=By Type ID -label.by.type=By Type -label.by.zone=By Zone -label.bytes.received=Bytes Received -label.bytes.sent=Bytes Sent -label.cancel=Cancel -label.capacity=Capacity -label.capacity.bytes=Capacity Bytes -label.capacity.iops=Capacity IOPS -label.certificate=Server certificate -label.change.ipaddress=Change IP address for NIC -label.change.service.offering=Change service offering -label.change.value=Change value -label.character=Character -label.md5.checksum=MD5 checksum -label.cidr.account=CIDR or Account/Security Group -label.CIDR.list=CIDR list -label.cidr.list=Source CIDR -label.CIDR.of.destination.network=CIDR of destination network -label.cidr=CIDR -label.clean.up=Clean up -label.make.redundant=Make redundant -label.clear.list=Clear list -label.close=Close -label.cloud.console=Cloud Management Console -label.cloud.managed=Cloud.com Managed -label.cluster.name=Cluster Name -label.cluster.type=Cluster Type -label.cluster=Cluster -label.clusters=Clusters -label.clvm=CLVM -label.custom.disk.offering=Custom Disk Offering -label.rbd=RBD -label.rbd.monitor=Ceph monitor -label.rbd.pool=Ceph pool -label.rbd.id=Cephx user -label.rbd.secret=Cephx secret -label.code=Code -label.community=Community -label.compute.and.storage=Compute and Storage -label.compute.offering=Compute offering -label.compute.offerings=Compute Offerings -label.compute=Compute -label.configuration=Configuration -label.configure.network.ACLs=Configure Network ACLs -label.configure.vpc=Configure VPC -label.configure=Configure -label.confirm.password=Confirm password -label.confirmation=Confirmation -label.congratulations=Congratulations\! -label.conserve.mode=Conserve mode -label.console.proxy=Console proxy -label.continue.basic.install=Continue with basic installation -label.continue=Continue -label.corrections.saved=Corrections saved -label.cpu.allocated.for.VMs=CPU Allocated for VMs -label.cpu.allocated=CPU Allocated -label.CPU.cap=CPU Cap -label.cpu.limits=CPU limits -label.cpu.mhz=CPU (in MHz) -label.cpu.utilized=CPU Utilized -label.cpu=CPU -label.create.project=Create project -label.create.ssh.key.pair=Create a SSH Key Pair -label.create.template=Create template -label.create.VPN.connection=Create VPN Connection -label.created.by.system=Created by system -label.created=Created -label.cross.zones=Cross Zones -label.custom.disk.size=Custom Disk Size -label.daily=Daily -label.data.disk.offering=Data Disk Offering -label.date=Date -label.day.of.month=Day of Month -label.day.of.week=Day of Week -label.dead.peer.detection=Dead Peer Detection -label.decline.invitation=Decline invitation -label.dedicated=Dedicated -label.default.use=Default Use -label.default.view=Default View -label.default=Default -label.delete.affinity.group=Delete Affinity Group -label.delete.BigSwitchBcf=Remove BigSwitch BCF Controller -label.delete.F5=Delete F5 -label.delete.gateway=Delete gateway -label.delete.NetScaler=Delete NetScaler -label.delete.NiciraNvp=Remove Nvp Controller -label.delete.NuageVsp=Remove Nuage VSD -label.delete.BrocadeVcs=Remove Brocade Vcs Switch -label.delete.project=Delete project -label.delete.SRX=Delete SRX -label.delete.PA=Delete Palo Alto -label.delete.VPN.connection=Delete VPN connection -label.delete.VPN.customer.gateway=Delete VPN Customer Gateway -label.delete.VPN.gateway=Delete VPN Gateway -label.delete.vpn.user=Delete VPN user -label.delete=Delete -label.deleting.failed=Deleting Failed -label.deleting.processing=Deleting.... -label.description=Description -label.destination.physical.network.id=Destination physical network ID -label.destination.zone=Destination Zone -label.destroy.router=Destroy router -label.destroy=Destroy -label.detaching.disk=Detaching Disk -label.details=Details -label.device.id=Device ID -label.devices=Devices -label.DHCP.server.type=DHCP Server Type -label.dhcp=DHCP -label.direct.ips=Shared Network IPs -label.disable.provider=Disable provider -label.disable.vpn=Disable Remote Access VPN -label.disabled=Disabled -label.disabling.vpn.access=Disabling VPN Access -label.disk.allocated=Disk Allocated -label.disk.bytes.read.rate=Disk Read Rate (BPS) -label.disk.bytes.write.rate=Disk Write Rate (BPS) -label.disk.iops.read.rate=Disk Read Rate (IOPS) -label.disk.iops.write.rate=Disk Write Rate (IOPS) -label.disk.offering=Disk Offering -label.disk.provisioningtype=Provisioning Type -label.disk.read.bytes=Disk Read (Bytes) -label.disk.read.io=Disk Read (IO) -label.disk.size.gb=Disk Size (in GB) -label.disk.size=Disk Size -label.disk.total=Disk Total -label.disk.volume=Disk Volume -label.disk.write.bytes=Disk Write (Bytes) -label.disk.write.io=Disk Write (IO) -label.display.text=Display Text -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.DNS.domain.for.guest.networks=DNS domain for Guest Networks -label.dns=DNS -label.domain.admin=Domain Admin -label.domain.id=Domain ID -label.domain.name=Domain Name -label.domain.router=Domain router -label.domain.suffix=DNS Domain Suffix (i.e., xyz.com) -label.domain=Domain -label.done=Done -label.double.quotes.are.not.allowed=Double quotes are not allowed -label.download.progress=Download Progress -label.drag.new.position=Drag to new position -label.edit.affinity.group=Edit Affinity Group -label.edit.lb.rule=Edit LB rule -label.edit.network.details=Edit network details -label.edit.project.details=Edit project details -label.edit.tags=Edit tags -label.edit.traffic.type=Edit traffic type -label.edit.vpc=Edit VPC -label.edit=Edit -label.egress.rule=Egress rule -label.egress.rules=Egress rules -label.elastic.IP=Elastic IP -label.elastic.LB=Elastic LB -label.elastic=Elastic -label.email=Email -label.enable.provider=Enable provider -label.enable.s3=Enable S3-backed Secondary Storage -label.enable.swift=Enable Swift -label.enable.vpn=Enable Remote Access VPN -label.enabling.vpn.access=Enabling VPN Access -label.enabling.vpn=Enabling VPN -label.end.IP=End IP -label.end.port=End Port -label.end.reserved.system.IP=End Reserved system IP -label.end.vlan=End VLAN -label.end.vxlan=End VXLAN -label.endpoint.or.operation=Endpoint or Operation -label.endpoint=Endpoint -label.enter.token=Enter token -label.error.code=Error Code -label.error=Error -label.ESP.encryption=ESP Encryption -label.ESP.hash=ESP Hash -label.ESP.lifetime=ESP Lifetime (second) -label.ESP.policy=ESP policy -label.esx.host=ESX/ESXi Host -label.example=Example -label.expunge=Expunge -label.external.link=External link -label.f5=F5 -label.failed=Failed -label.featured=Featured -label.fetch.latest=Fetch latest -label.fingerprint=FingerPrint -label.filterBy=Filter by -label.firewall=Firewall -label.first.name=First Name -label.format=Format -label.friday=Friday -label.full.path=Full path -label.full=Full -label.gateway=Gateway -label.general.alerts=General Alerts -label.generating.url=Generating URL -label.gluster.volume=Volume -label.go.step.2=Go to Step 2 -label.go.step.3=Go to Step 3 -label.go.step.4=Go to Step 4 -label.go.step.5=Go to Step 5 -label.group.optional=Group (Optional) -label.group=Group -label.guest.cidr=Guest CIDR -label.guest.end.ip=Guest end IP -label.guest.gateway=Guest Gateway -label.guest.ip.range=Guest IP Range -label.guest.ip=Guest IP Address -label.guest.netmask=Guest Netmask -label.guest.networks=Guest networks -label.guest.start.ip=Guest start IP -label.guest.traffic=Guest Traffic -label.guest.type=Guest Type -label.guest=Guest -label.ha.enabled=HA Enabled -label.help=Help -label.hide.ingress.rule=Hide Ingress Rule -label.hints=Hints -label.host.alerts=Hosts in Alert State -label.host.MAC=Host MAC -label.host.name=Host Name -label.host.tag=Host Tag -label.host.tags=Host Tags -label.host=Host -label.hosts=Hosts -label.hourly=Hourly -label.hypervisor.capabilities=Hypervisor capabilities -label.hypervisor.type=Hypervisor Type -label.hypervisor.version=Hypervisor version -label.hypervisor=Hypervisor -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=IKE Encryption -label.IKE.hash=IKE Hash -label.IKE.lifetime=IKE lifetime (second) -label.IKE.policy=IKE policy -label.info=Info -label.ingress.rule=Ingress Rule -label.initiated.by=Initiated By -label.installWizard.addClusterIntro.subtitle=What is a cluster? -label.installWizard.addClusterIntro.title=Let’s add a cluster -label.installWizard.addHostIntro.subtitle=What is a host? -label.installWizard.addHostIntro.title=Let’s add a host -label.installWizard.addPodIntro.subtitle=What is a pod? -label.installWizard.addPodIntro.title=Let’s add a pod -label.installWizard.addPrimaryStorageIntro.subtitle=What is primary storage? -label.installWizard.addPrimaryStorageIntro.title=Let’s add primary storage -label.installWizard.addSecondaryStorageIntro.subtitle=What is secondary storage? -label.installWizard.addSecondaryStorageIntro.title=Let’s add secondary storage -label.installWizard.addZone.title=Add zone -label.installWizard.addZoneIntro.subtitle=What is a zone? -label.installWizard.addZoneIntro.title=Let’s add a zone -label.installWizard.click.launch=Click the launch button. -label.installWizard.subtitle=This tour will aid you in setting up your CloudStack&\#8482 installation -label.installWizard.title=Hello and Welcome to CloudStack&\#8482 -label.instance.limits=Instance Limits -label.instance.name=Instance Name -label.instance=Instance -label.instances=Instances -label.intermediate.certificate=Intermediate certificate {0} -label.internal.dns.1=Internal DNS 1 -label.internal.dns.2=Internal DNS 2 -label.internal.name=Internal name -label.interval.type=Interval Type -label.introduction.to.cloudstack=Introduction to CloudStack&\#8482 -label.invalid.integer=Invalid Integer -label.invalid.number=Invalid Number -label.invitations=Invitations -label.invite.to=Invite to -label.invite=Invite -label.invited.accounts=Invited accounts -label.ip.address=IP Address -label.ip.allocations=IP Allocations -label.ip.limits=Public IP Limits -label.ip.or.fqdn=IP or FQDN -label.ip.range=IP Range -label.ip.ranges=IP Ranges -label.ip=IP -label.ipaddress=IP Address -label.ips=IPs -label.IPsec.preshared.key=IPsec Preshared-Key -label.is.default=Is Default -label.is.redundant.router=Redundant -label.is.shared=Is Shared -label.is.system=Is System -label.iscsi=iSCSI -label.iso.boot=ISO Boot -label.iso=ISO -label.isolated.networks=Isolated networks -label.isolation.method=Isolation method -label.isolation.mode=Isolation Mode -label.isolation.uri=Isolation URI -label.item.listing=Item listing -label.keep=Keep -label.key=Key -label.keyboard.type=Keyboard type -label.kvm.traffic.label=KVM traffic label -label.label=Label -label.lang.arabic=Arabic -label.lang.brportugese=Brazilian Portugese -label.lang.catalan=Catalan -label.lang.chinese=Chinese (Simplified) -label.lang.dutch=Dutch (Netherlands) -label.lang.english=English -label.lang.french=French -label.lang.german=German -label.lang.italian=Italian -label.lang.japanese=Japanese -label.lang.korean=Korean -label.lang.norwegian=Norwegian -label.lang.polish=Polish -label.lang.russian=Russian -label.lang.spanish=Spanish -label.lang.hungarian=Hungarian -label.last.disconnected=Last Disconnected -label.last.name=Last Name -label.latest.events=Latest events -label.launch.vm=Launch VM -label.launch.zone=Launch zone -label.launch=Launch -label.lb.algorithm.leastconn=Least connections -label.lb.algorithm.roundrobin=Round-robin -label.lb.algorithm.source=Source -label.LB.isolation=LB isolation -label.level=Level -label.linklocal.ip=Link Local IP Address -label.load.balancer=Load Balancer -label.load.balancing.policies=Load balancing policies -label.load.balancing=Load Balancing -label.loading=Loading -label.local.storage.enabled=Enable local storage for User VMs -label.local.storage.enabled.system.vms=Enable local storage for System VMs -label.local.storage=Local Storage -label.local=Local -label.local.file=Local file -label.login=Login -label.logout=Logout -label.saml.enable=Authorize SAML SSO -label.saml.entity=Identity Provider -label.add.LDAP.account=Add LDAP Account -label.LUN.number=LUN \# -label.lun=LUN -label.make.project.owner=Make account project owner -label.manage.resources=Manage Resources -label.management.server=Management Server -label.manage=Manage -label.managed=Managed -label.management.ips=Management IP Addresses -label.management=Management -label.max.cpus=Max. CPU cores -label.max.guest.limit=Max guest limit -label.max.memory=Max. memory (MiB) -label.max.networks=Max. networks -label.max.primary.storage=Max. primary (GiB) -label.max.public.ips=Max. public IPs -label.max.secondary.storage=Max. secondary (GiB) -label.max.snapshots=Max. snapshots -label.max.templates=Max. templates -label.max.vms=Max. user VMs -label.max.volumes=Max. volumes -label.max.vpcs=Max. VPCs -label.maximum=Maximum -label.may.continue=You may now continue. -label.memory.allocated=Memory Allocated -label.memory.limits=Memory limits (MiB) -label.memory.mb=Memory (in MB) -label.memory.total=Memory Total -label.memory.used=Memory Used -label.memory=Memory -label.menu.accounts=Accounts -label.menu.alerts=Alerts -label.menu.all.accounts=All Accounts -label.menu.all.instances=All Instances -label.menu.community.isos=Community ISOs -label.menu.community.templates=Community Templates -label.menu.configuration=Configuration -label.menu.dashboard=Dashboard -label.menu.destroyed.instances=Destroyed Instances -label.menu.disk.offerings=Disk Offerings -label.menu.domains=Domains -label.menu.events=Events -label.menu.featured.isos=Featured ISOs -label.menu.featured.templates=Featured Templates -label.menu.global.settings=Global Settings -label.menu.infrastructure=Infrastructure -label.menu.instances=Instances -label.menu.ipaddresses=IP Addresses -label.menu.isos=ISOs -label.menu.my.accounts=My Accounts -label.menu.my.instances=My Instances -label.menu.my.isos=My ISOs -label.menu.my.templates=My Templates -label.menu.network.offerings=Network Offerings -label.menu.network=Network -label.menu.physical.resources=Physical Resources -label.menu.regions=Regions -label.menu.running.instances=Running Instances -label.menu.security.groups=Security Groups -label.menu.service.offerings=Service Offerings -label.menu.snapshots=Snapshots -label.menu.stopped.instances=Stopped Instances -label.menu.storage=Storage -label.menu.system.service.offerings=System Offerings -label.menu.system.vms=System VMs -label.menu.system=System -label.menu.templates=Templates -label.menu.virtual.appliances=Virtual Appliances -label.menu.virtual.resources=Virtual Resources -label.menu.volumes=Volumes -label.menu.sshkeypair=SSH KeyPair -label.metrics=Metrics -label.metrics.allocated=Allocated -label.metrics.clusters=Clusters -label.metrics.cpu.allocated=CPU Allocation -label.metrics.cpu.max.dev=Deviation -label.metrics.cpu.total=Total -label.metrics.cpu.usage=CPU Usage -label.metrics.cpu.used.avg=Used -label.metrics.disk=Disk -label.metrics.disk.iops.total=IOPS -label.metrics.disk.read=Read -label.metrics.disk.size=Size -label.metrics.disk.storagetype=Type -label.metrics.disk.usage=Disk Usage -label.metrics.disk.used=Used -label.metrics.disk.total=Total -label.metrics.disk.allocated=Allocated -label.metrics.disk.unallocated=Unallocated -label.metrics.disk.write=Write -label.metrics.hosts=Hosts -label.metrics.memory.allocated=Mem Allocation -label.metrics.memory.max.dev=Deviation -label.metrics.memory.total=Total -label.metrics.memory.usage=Mem Usage -label.metrics.memory.used.avg=Used -label.metrics.name=Name -label.metrics.network.usage=Network Usage -label.metrics.network.read=Read -label.metrics.network.write=Write -label.metrics.num.cpu.cores=Cores -label.metrics.property=Property -label.metrics.scope=Scope -label.metrics.state=State -label.metrics.outofbandmanagementpowerstate=Power State -label.metrics.storagepool=Storage Pool -label.metrics.vm.name=VM Name -label.migrate.instance.to.host=Migrate instance to another host -label.migrate.instance.to.ps=Migrate instance to another primary storage -label.migrate.instance.to=Migrate instance to -label.migrate.router.to=Migrate Router to -label.migrate.systemvm.to=Migrate System VM to -label.migrate.to.host=Migrate to host -label.migrate.to.storage=Migrate to storage -label.migrate.volume.to.primary.storage=Migrate volume to another primary storage -label.migrate.volume=Migrate Volume -label.minimum=Minimum -label.minute.past.hour=minute(s) past the hour -label.monday=Monday -label.monthly=Monthly -label.more.templates=More Templates -label.move.down.row=Move down one row -label.move.to.bottom=Move to bottom -label.move.to.top=Move to top -label.move.up.row=Move up one row -label.my.account=My Account -label.my.network=My network -label.my.templates=My templates -label.na=N/A -label.name.optional=Name (Optional) -label.name=Name -label.nat.port.range=NAT Port Range -label.netmask=Netmask -label.netScaler=NetScaler -label.network.ACL.total=Network ACL Total -label.network.ACL=Network ACL -label.network.ACLs=Network ACLs -label.network.desc=Network Desc -label.network.device.type=Network Device Type -label.network.device=Network Device -label.network.domain.text=Network domain -label.network.domain=Network Domain -label.network.id=Network ID -label.network.label.display.for.blank.value=Use default gateway -label.network.limits=Network limits -label.network.name=Network Name -label.network.offering.display.text=Network Offering Display Text -label.network.offering.id=Network Offering ID -label.network.offering.name=Network Offering Name -label.network.offering=Network Offering -label.network.rate.megabytes=Network Rate (MB/s) -label.network.rate=Network Rate (Mb/s) -label.network.read=Network Read -label.network.service.providers=Network Service Providers -label.network.type=Network Type -label.network.write=Network Write -label.network=Network -label.networking.and.security=Networking and security -label.networks=Networks -label.new.password=New Password -label.new.project=New Project -label.new.ssh.key.pair=New SSH Key Pair -label.new.vm=New VM -label.new=New -label.next=Next -label.nexusVswitch=Nexus 1000v -label.nfs.server=NFS Server -label.nfs.storage=NFS Storage -label.nfs=NFS -label.nic.adapter.type=NIC adapter type -label.nicira.controller.address=Controller Address -label.nicira.l2gatewayserviceuuid=L2 Gateway Service Uuid -label.nicira.l3gatewayserviceuuid=L3 Gateway Service Uuid -label.nicira.transportzoneuuid=Transport Zone Uuid -label.brocade.vcs.address=Vcs Switch Address -label.nics=NICs -label.no.actions=No Available Actions -label.no.alerts=No Recent Alerts -label.no.data=No data to show -label.no.errors=No Recent Errors -label.no.isos=No available ISOs -label.no.items=No Available Items -label.no.security.groups=No Available Security Groups -label.no.thanks=No thanks -label.no=No -label.none=None -label.not.found=Not Found -label.notifications=Notifications -label.num.cpu.cores=\# of CPU Cores -label.number.of.clusters=Number of Clusters -label.number.of.hosts=Number of Hosts -label.number.of.pods=Number of Pods -label.number.of.system.vms=Number of System VMs -label.number.of.virtual.routers=Number of Virtual Routers -label.number.of.zones=Number of Zones -label.numretries=Number of Retries -label.ocfs2=OCFS2 -label.offer.ha=Offer HA -label.ok=OK -label.optional=Optional -label.order=Order -label.os.preference=OS Preference -label.os.type=OS Type -label.ovm3.vip=Master Vip IP -label.ovm3.pool=Native Pooling -label.ovm3.cluster=Native Clustering -label.ovm3.traffic.label=OVM3 traffic label -label.owned.public.ips=Owned Public IP Addresses -label.owner.account=Owner Account -label.owner.domain=Owner Domain -label.PA.log.profile=Palo Alto Log Profile -label.PA.threat.profile=Palo Alto Threat Profile -label.parent.domain=Parent Domain -label.password.enabled=Password Enabled -label.password=Password -label.path=Path -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.physical.network.ID=Physical network ID -label.physical.network=Physical Network -label.PING.CIFS.password=PING CIFS password -label.PING.CIFS.username=PING CIFS username -label.PING.dir=PING Directory -label.PING.storage.IP=PING storage IP -label.please.specify.netscaler.info=Please specify Netscaler info -label.please.wait=Please Wait -label.plugin.details=Plugin details -label.plugins=Plugins -label.pod.name=Pod name -label.pod=Pod -label.pods=Pods -label.port.forwarding.policies=Port forwarding policies -label.port.forwarding=Port Forwarding -label.port.range=Port Range -label.powerstate=Power State -label.outofbandmanagement=Out-of-band Management -label.outofbandmanagement.action.issue=Issue Out-of-band Management Power Action -label.outofbandmanagement.action=Action -label.outofbandmanagement.address=Address -label.outofbandmanagement.changepassword=Change Out-of-band Management Password -label.outofbandmanagement.configure=Configure Out-of-band Management -label.outofbandmanagement.driver=Driver -label.outofbandmanagement.disable=Disable Out-of-band Management -label.outofbandmanagement.enable=Enable Out-of-band Management -label.outofbandmanagement.password=Password -label.outofbandmanagement.reenterpassword=Re-enter Password -label.outofbandmanagement.port=Port -label.outofbandmanagement.username=Username -message.outofbandmanagement.changepassword=Change Out-of-band Management password -message.outofbandmanagement.configure=Configure Out-of-band Management -message.outofbandmanagement.disable=Disable Out-of-band Management -message.outofbandmanagement.enable=Enable Out-of-band Management -message.outofbandmanagement.issue=Issue Out-of-band Management Power Action -message.outofbandmanagement.action.maintenance=Warning host is in maintenance mode -label.PreSetup=PreSetup -label.prev=Prev -label.previous=Previous -label.primary.allocated=Primary Storage Allocated -label.primary.network=Primary Network -label.primary.storage.count=Primary Storage Pools -label.primary.storage.limits=Primary Storage limits (GiB) -label.primary.storage=Primary Storage -label.primary.used=Primary Storage Used -label.private.Gateway=Private Gateway -label.private.interface=Private Interface -label.private.ip.range=Private IP Range -label.private.ip=Private IP Address -label.private.ips=Private IP Addresses -label.private.key=Private Key -label.private.network=Private network -label.private.port=Private Port -label.private.zone=Private Zone -label.privatekey=PKCS\#8 Private Key -label.project.dashboard=Project dashboard -label.project.id=Project ID -label.project.invite=Invite to project -label.project.name=Project name -label.project.view=Project View -label.project=Project -label.projects=Projects -label.protocol=Protocol -label.provider=Provider -label.providers=Providers -label.public.interface=Public Interface -label.public.ip=Public IP Address -label.public.ips=Public IP Addresses -label.public.key=Public Key -label.public.network=Public network -label.public.port=Public Port -label.public.traffic=Public traffic -label.public.zone=Public Zone -label.public=Public -label.purpose=Purpose -label.Pxe.server.type=Pxe Server Type -label.quickview=Quickview -label.reboot=Reboot -label.recent.errors=Recent Errors -label.redundant.router.capability=Redundant router capability -label.redundant.router=Redundant Router -label.redundant.vpc=Redundant VPC -label.redundant.state=Redundant state -label.refresh=Refresh -label.region=Region -label.related=Related -label.remind.later=Remind me later -label.remove.ACL=Remove ACL -label.remove.egress.rule=Remove egress rule -label.remove.from.load.balancer=Removing instance from load balancer -label.remove.ingress.rule=Remove ingress rule -label.remove.ip.range=Remove IP range -label.remove.pf=Remove port forwarding rule -label.remove.project.account=Remove account from project -label.remove.region=Remove Region -label.remove.rule=Remove rule -label.remove.ssh.key.pair=Remove SSH Key Pair -label.remove.static.nat.rule=Remove static NAT rule -label.remove.static.route=Remove static route -label.remove.tier=Remove tier -label.remove.vm.from.lb=Remove VM from load balancer rule -label.remove.vpc=Remove VPC -label.removing.user=Removing User -label.removing=Removing -label.required=Required -label.reserved.system.gateway=Reserved system gateway -label.reserved.system.ip=Reserved System IP -label.reserved.system.netmask=Reserved system netmask -label.reset.ssh.key.pair=Reset SSH Key Pair -label.reset.ssh.key.pair.on.vm=Reset SSH Key Pair on VM -label.reset.VPN.connection=Reset VPN connection -label.resize.new.offering.id=New Offering -label.resize.new.size=New Size (GB) -label.resize.shrink.ok=Shrink OK -label.resource.limits=Resource Limits -label.resource.state=Resource state -label.resource=Resource -label.resources=Resources -label.restart.network=Restart network -label.restart.required=Restart required -label.restart.vpc=Restart VPC -message.restart.vpc.remark=Please confirm that you want to restart the VPC

Remark: making a non-redundant VPC redundant will force a clean up. The networks will not be available for a couple of minutes.

-label.restore=Restore -label.retry.interval=Retry Interval -label.review=Review -label.revoke.project.invite=Revoke invitation -label.role=Role -label.roles=Roles -label.roletype=Role Type -label.add.role=Add Role -label.edit.role=Edit Role -label.delete.role=Delete Role -message.role.ordering.fail=Reordering of rule permissions aborted as the list has changed while you were making changes. Please try again. -label.root.certificate=Root certificate -label.root.disk.controller=Root disk controller -label.root.disk.offering=Root Disk Offering -label.permission=Permission -label.rule=Rule -label.rules=Rules -label.running.vms=Running VMs -label.s3.access_key=Access Key -label.s3.bucket=Bucket -label.s3.connection_timeout=Connection Timeout -label.s3.endpoint=Endpoint -label.s3.max_error_retry=Max Error Retry -label.s3.secret_key=Secret Key -label.s3.socket_timeout=Socket Timeout -label.s3.use_https=Use HTTPS -label.saturday=Saturday -label.save.and.continue=Save and continue -label.save=Save -label.saving.processing=Saving.... -label.scope=Scope -label.search=Search -label.secondary.storage.count=Secondary Storage Pools -label.secondary.storage.limits=Secondary Storage limits (GiB) -label.secondary.storage.vm=Secondary storage VM -label.secondary.storage=Secondary Storage -label.secondary.used=Secondary Storage Used -label.secret.key=Secret Key -label.security.group.name=Security Group Name -label.security.group=Security Group -label.security.groups.enabled=Security Groups Enabled -label.security.groups=Security Groups -label.select-view=Select view -label.select.a.template=Select a template -label.select.a.zone=Select a zone -label.select.instance.to.attach.volume.to=Select instance to attach volume to -label.select.instance=Select instance -label.select.iso.or.template=Select ISO or template -label.select.offering=Select offering -label.select.project=Select Project -label.select.tier=Select Tier -label.select.vm.for.static.nat=Select VM for static NAT -label.select=Select -label.sent=Sent -label.server=Server -label.service.capabilities=Service Capabilities -label.service.offering=Service Offering -label.session.expired=Session Expired -label.set.up.zone.type=Set up zone type -label.setup.network=Set up Network -label.setup.zone=Set up Zone -label.setup=Setup -label.shared=Shared -label.SharedMountPoint=SharedMountPoint -label.show.ingress.rule=Show Ingress Rule -label.shutdown.provider=Shutdown provider -label.site.to.site.VPN=Site-to-site VPN -label.size=Size -label.skip.guide=I have used CloudStack before, skip this guide -label.snapshot.limits=Snapshot Limits -label.snapshot.name=Snapshot Name -label.snapshot.s=Snapshots -label.snapshot.schedule=Set up Recurring Snapshot -label.snapshot=Snapshot -label.snapshots=Snapshots -label.source.nat=Source NAT -label.specify.IP.ranges=Specify IP ranges -label.specify.vlan=Specify VLAN -label.specify.vxlan=Specify VXLAN -label.SR.name=SR Name-Label -label.srx=SRX -label.ssh.key.pair=SSH Key Pair -label.ssh.key.pair.details=SSH Key Pair Details -label.PA=Palo Alto -label.start.IP=Start IP -label.start.port=Start Port -label.start.reserved.system.IP=Start Reserved system IP -label.start.vlan=Start VLAN -label.start.vxlan=Start VXLAN -label.state=State -label.static.nat.enabled=Static NAT Enabled -label.static.nat.to=Static NAT to -label.static.nat.vm.details=Static NAT VM Details -label.static.nat=Static NAT -label.statistics=Statistics -label.status=Status -label.step.1.title=Step 1\: Select a Template -label.step.1=Step 1 -label.step.2.title=Step 2\: Service Offering -label.step.2=Step 2 -label.step.3.title=Step 3\: Select a Disk Offering -label.step.3=Step 3 -label.step.4.title=Step 4\: Network -label.step.4=Step 4 -label.step.5.title=Step 5\: Review -label.step.5=Step 5 -label.stickiness=Stickiness -label.sticky.cookie-name=Cookie name -label.sticky.domain=Domain -label.sticky.expire=Expires -label.sticky.holdtime=Hold time -label.sticky.indirect=Indirect -label.sticky.length=Length -label.sticky.mode=Mode -label.sticky.nocache=No cache -label.sticky.postonly=Post only -label.sticky.prefix=Prefix -label.sticky.request-learn=Request learn -label.sticky.tablesize=Table size -label.stop=Stop -label.stopped.vms=Stopped VMs -label.storage.tags=Storage Tags -label.storage.traffic=Storage Traffic -label.storage.type=Storage Type -label.qos.type=QoS Type -label.cache.mode=Write-cache Type -label.storage=Storage -label.subdomain.access=Subdomain Access -label.submit=Submit -label.submitted.by=[Submitted by\: ] -label.succeeded=Succeeded -label.sunday=Sunday -label.super.cidr.for.guest.networks=Super CIDR for Guest Networks -label.supported.services=Supported Services -label.supported.source.NAT.type=Supported Source NAT type -label.suspend.project=Suspend Project -label.system.capacity=System Capacity -label.system.offering=System Offering -label.system.service.offering=System Service Offering -label.system.vm.type=System VM Type -label.system.vm=System VM -label.system.vms=System VMs -label.system.wide.capacity=System-wide capacity -label.tagged=Tagged -label.tags=Tags -label.target.iqn=Target IQN -label.task.completed=Task completed -label.template.limits=Template Limits -label.template=Template -label.TFTP.dir=TFTP Directory -label.theme.default=Default Theme -label.theme.grey=Custom - Grey -label.theme.lightblue=Custom - Light Blue -label.thursday=Thursday -label.tier.details=Tier details -label.tier=Tier -label.time.zone=Timezone -label.time=Time -label.timeout.in.second = Timeout (seconds) -label.timeout=Timeout -label.timezone=Timezone -label.token=Token -label.total.CPU=Total CPU -label.total.cpu=Total CPU -label.total.hosts=Total Hosts -label.total.memory=Total Memory -label.total.of.ip=Total of IP Addresses -label.total.of.vm=Total of VMs -label.total.storage=Total Storage -label.total.vms=Total VMs -label.traffic.label=Traffic label -label.traffic.type=Traffic Type -label.traffic.types=Traffic Types -label.tuesday=Tuesday -label.type.id=Type ID -label.type=Type -label.unavailable=Unavailable -label.unlimited=Unlimited -label.untagged=Untagged -label.update.project.resources=Update project resources -label.update.ssl.cert= SSL Certificate -label.update.ssl= SSL Certificate -label.updating=Updating -label.upload.from.local=Upload from Local -label.upload.template.from.local=Upload Template from Local -label.upload.volume=Upload volume -label.upload.volume.from.local=Upload Volume from Local -label.upload.volume.from.url=Upload volume from URL -label.upload=Upload -label.url=URL -label.usage.interface=Usage Interface -label.use.vm.ip=Use VM IP\: -label.used=Used -label.user=User -label.username=Username -label.users=Users -label.value=Value -label.vcdcname=vCenter DC name -label.vcenter.cluster=vCenter Cluster -label.vcenter.datacenter=vCenter Datacenter -label.vcenter.datastore=vCenter Datastore -label.vcenter.host=vCenter Host -label.vcenter.password=vCenter Password -label.vcenter.username=vCenter Username -label.vcipaddress=vCenter IP Address -label.version=Version -label.view.all=View all -label.view.console=View console -label.view.more=View more -label.view=View -label.viewing=Viewing -label.virtual.appliance=Virtual Appliance -label.virtual.appliances=Virtual Appliances -label.virtual.machines=Virtual Machines -label.virtual.machine=Virtual Machine -label.virtual.network=Virtual Network -label.virtual.router=Virtual Router -label.virtual.routers=Virtual Routers -label.vlan.id=VLAN/VNI ID -label.vlan.range=VLAN/VNI Range -label.vlan=VLAN/VNI -label.vnet=VLAN/VNI -label.vnet.id=VLAN/VNI ID -label.vxlan.id=VXLAN ID -label.vxlan.range=VXLAN Range -label.vxlan=VXLAN -label.vm.add=Add Instance -label.vm.destroy=Destroy -label.vm.display.name=VM display name -label.vm.name=VM name -label.vm.reboot=Reboot -label.vm.start=Start -label.vm.state=VM state -label.vm.stop=Stop -label.VMFS.datastore=VMFS datastore -label.vmfs=VMFS -label.VMs.in.tier=VMs in tier -label.vms=VMs -label.vmsnapshot.current=isCurrent -label.vmsnapshot.memory=Snapshot memory -label.vmsnapshot.parentname=Parent -label.vmsnapshot.type=Type -label.vmsnapshot=VM Snapshots -label.vmware.traffic.label=VMware traffic label -label.volgroup=Volume Group -label.volume.limits=Volume Limits -label.volume.name=Volume Name -label.volume=Volume -label.volumes=Volumes -label.vpc.id=VPC ID -label.VPC.router.details=VPC router details -label.vpc=VPC -label.VPN.connection=VPN Connection -label.VPN.customer.gateway=VPN Customer Gateway -label.vpn.customer.gateway=VPN Customer Gateway -label.VPN.gateway=VPN Gateway -label.vpn=VPN -label.vsmctrlvlanid=Control VLAN ID -label.vsmpktvlanid=Packet VLAN ID -label.vsmstoragevlanid=Storage VLAN ID -label.vsphere.managed=vSphere Managed -label.waiting=Waiting -label.warn=Warn -label.warning=Warning -label.wednesday=Wednesday -label.weekly=Weekly -label.welcome.cloud.console=Welcome to Management Console -label.welcome=Welcome -label.what.is.cloudstack=What is CloudStack&\#8482? -label.xenserver.traffic.label=XenServer traffic label -label.yes=Yes -label.zone.details=Zone details -label.zone.id=Zone ID -label.zone.step.1.title=Step 1\: Select a Network -label.zone.step.2.title=Step 2\: Add a Zone -label.zone.step.3.title=Step 3\: Add a Pod -label.zone.step.4.title=Step 4\: Add an IP range -label.zone.type=Zone Type -label.zone.wide=Zone-Wide -label.zone=Zone -label.zones=Zones -label.zoneWizard.trafficType.guest=Guest\: Traffic between end-user virtual machines -label.zoneWizard.trafficType.management=Management\: Traffic between CloudStack\\\\'s internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs -label.zoneWizard.trafficType.public=Public\: Traffic between the internet and virtual machines in the cloud. -label.zoneWizard.trafficType.storage=Storage\: Traffic between primary and secondary storage servers, such as VM templates and snapshots -label.ldap.group.name=LDAP Group -label.password.reset.confirm=Password has been reset to -label.provider=Provider -label.resetVM=Reset VM -label.openDaylight=OpenDaylight -label.assign.instance.another=Assign Instance to Another Account -label.network.addVM=Add network to VM -label.set.default.NIC=Set default NIC -label.Xenserver.Tools.Version61plus=Original XS Version is 6.1\+ -label.supportsstrechedl2subnet=Supports Streched L2 Subnet -label.menu.vpc.offerings=VPC Offerings -label.vpc.offering=VPC Offering -label.regionlevelvpc=Region Level VPC -label.add.vpc.offering=Add VPC Offering -label.distributedrouter=Distributed Router -label.vpc.offering.details=VPC offering details -label.disable.vpc.offering=Disable VPC offering -label.enable.vpc.offering=Enable VPC offering -label.remove.vpc.offering=Remove VPC offering -label.vpc.distributedvpcrouter=Distributed VPC Router -label.vpc.supportsregionlevelvpc=Supports Region Level VPC -label.dynamically.scalable=Dynamically Scalable -label.instance.scaled.up=Instance scaled to the requested offering -label.tag.key=Tag Key -label.tag.value=Tag Value -label.ipv6.address=IPv6 IP Address -label.ipv6.gateway=IPv6 Gateway -label.ipv6.CIDR=IPv6 CIDR -label.VPC.limits=VPC limits -label.edit.region=Edit Region -label.gslb.domain.name=GSLB Domain Name -label.add.gslb=Add GSLB -label.gslb.servicetype=Service Type -label.gslb.details=GSLB details -label.gslb.delete=Delete GSLB -label.opendaylight.controller=OpenDaylight Controller -label.opendaylight.controllers=OpenDaylight Controllers -label.portable.ip.ranges=Portable IP Ranges -label.add.portable.ip.range=Add Portable IP Range -label.delete.portable.ip.range=Delete Portable IP Range -label.opendaylight.controllerdetail=OpenDaylight Controller Details -label.portable.ip.range.details=Portable IP Range details -label.portable.ips=Portable IPs -label.gslb.assigned.lb=Assigned load balancing -label.gslb.assigned.lb.more=Assign more load balancing -label.gslb.lb.rule=Load balancing rule -label.gslb.lb.details=Load balancing details -label.gslb.lb.remove=Remove load balancing from this GSLB -label.enable.autoscale=Enable Autoscale -label.disable.autoscale=Disable Autoscale -label.min.instances=Min Instances -label.max.instances=Max Instances -label.add.OpenDaylight.device=Add OpenDaylight Controller -label.show.advanced.settings=Show advanced settings -label.delete.OpenDaylight.device=Delete OpenDaylight Controller -label.polling.interval.sec=Polling Interval (in sec) -label.quiet.time.sec=Quiet Time (in sec) -label.usage.type=Usage Type -label.usage.unit=Unit -label.quota.value=Quota Value -label.quota.description=Quota Description -label.quota.configuration=Quota Configuration -label.quota.configure=Configure Quota -label.quota.remove=Remove Quota -label.quota.totalusage=Total Usage -label.quota.balance=Balance -label.quota.minbalance=Min Balance -label.quota.enforcequota=Enforce Quota -label.quota.summary=Summary -label.quota.fullsummary=All Accounts -label.quota.tariff=Tariff -label.quota.state=State -label.quota.startdate=Start Date -label.quota.enddate=End Date -label.quota.total=Total -label.quota.startquota=Start Quota -label.quota.endquota=End Quota -label.quota.type.name=Usage Type -label.quota.type.unit=Usage Unit -label.quota.usage=Quota Consumption -label.quota.add.credits=Add Credits -label.quota.email.template=Email Template -label.quota.statement=Statement -label.quota.statement.balance=Quota Balance -label.quota.statement.quota=Quota Usage -label.quota.statement.tariff=Quota Tariff -label.quota.tariff.value=Tariff Value -label.quota.tariff.edit=Edit Tariff -label.quota.tariff.effectivedate=Effective Date -label.quota.date=Date -label.quota.dates=Update Dates -label.quota.credit=Credit -label.quota.credits=Credits -label.quota.value=Quota Value -label.quota.statement.bydates=Statement -label.quota.email.subject=Subject -label.quota.email.body=Body -label.quota.email.lastupdated=Last Update -label.destroy.vm.graceperiod=Destroy VM Grace Period -label.SNMP.community=SNMP Community -label.SNMP.port=SNMP Port -label.add.ucs.manager=Add UCS Manager -label.ovm.traffic.label=OVM traffic label -label.lxc.traffic.label=LXC Traffic Label -label.hyperv.traffic.label=HyperV Traffic Label -label.resource.name=Resource Name -label.reource.id=Resource ID -label.vnmc.devices=VNMC Devices -label.add.vnmc.provider=Add VNMC provider -label.enable.vnmc.provider=Enable VNMC provider -label.add.vnmc.device=Add VNMC device -label.ciscovnmc.resource.details=CiscoVNMC resource details -label.delete.ciscovnmc.resource=Delete CiscoVNMC resource -label.enable.vnmc.device=Enable VNMC device -label.disbale.vnmc.device=Disable VNMC device -label.disable.vnmc.provider=Disable VNMC provider -label.services=Services -label.secondary.staging.store=Secondary Staging Store -label.release.account=Release from Account -label.release.account.lowercase=Release from account -label.vlan.vni.ranges=VLAN/VNI Range(s) -label.dedicated.vlan.vni.ranges=Dedicated VLAN/VNI Ranges -label.dedicate.vlan.vni.range=Dedicate VLAN/VNI Range -label.vlan.vni.range=VLAN/VNI Range -label.vlan.range.details=VLAN Range details -label.release.dedicated.vlan.range=Release dedicated VLAN range -label.broadcat.uri=Broadcast URI -label.ipv4.cidr=IPv4 CIDR -label.guest.network.details=Guest network details -label.ipv4.gateway=IPv4 Gateway -label.release.dedicated.vlan.range=Release dedicated VLAN range -label.vlan.ranges=VLAN Range(s) -label.virtual.appliance.details=Virtual applicance details -label.start.lb.vm=Start LB VM -label.stop.lb.vm=Stop LB VM -label.migrate.lb.vm=Migrate LB VM -label.vpc.virtual.router=VPC Virtual Router -label.ovs=OVS -label.gslb.service=GSLB service -label.gslb.service.public.ip=GSLB service Public IP -label.gslb.service.private.ip=GSLB service Private IP -label.baremetal.dhcp.provider=Baremetal DHCP Provider -label.add.baremetal.dhcp.device=Add Baremetal DHCP Device -label.baremetal.pxe.provider=Baremetal PXE Provider -label.baremetal.pxe.device=Add Baremetal PXE Device -label.tftp.root.directory=Tftp root directory -label.add.vmware.datacenter=Add VMware datacenter -label.remove.vmware.datacenter=Remove VMware datacenter -label.dc.name=DC Name -label.vcenter=vcenter -label.dedicate.zone=Dedicate Zone -label.zone.dedicated=Zone Dedicated -label.release.dedicated.zone=Release Dedicated Zone -label.ipv6.dns1=IPv6 DNS1 -label.ipv6.dns2=IPv6 DNS2 -label.vmware.datacenter.name=VMware datacenter Name -label.vmware.datacenter.vcenter=VMware datacenter vcenter -label.vmware.datacenter.id=VMware datacenter ID -label.system.vm.details=System VM details -label.system.vm.scaled.up=System VM Scaled Up -label.console.proxy.vm=Console Proxy VM -label.settings=Settings -label.requires.upgrade=Requires Upgrade -label.upgrade.router.newer.template=Upgrade Router to Use Newer Template -label.router.vm.scaled.up=Router VM Scaled Up -label.total.virtual.routers=Total of Virtual Routers -label.upgrade.required=Upgrade is required -label.virtual.routers.group.zone=Virtual Routers group by zone -label.total.virtual.routers.upgrade=Total of Virtual Routers that require upgrade -label.virtual.routers.group.pod=Virtual Routers group by pod -label.virtual.routers.group.cluster=Virtual Routers group by cluster -label.zone.lower=zone -label.virtual.routers.group.account=Virtual Routers group by account -label.netscaler.details=NetScaler details -label.baremetal.dhcp.devices=Baremetal DHCP Devices -label.baremetal.pxe.devices=Baremetal PXE Devices -label.addes.new.f5=Added new F5 -label.f5.details=F5 details -label.srx.details=SRX details -label.palo.alto.details=Palo Alto details -label.added.nicira.nvp.controller=Added new Nicira NVP Controller -label.nicira.nvp.details=Nicira NVP details -label.added.brocade.vcs.switch=Added new Brocade Vcs Switch -label.brocade.vcs.details=Brocade Vcs Switch details -label.added.new.bigswitch.bcf.controller=Added new BigSwitch BCF Controller -label.bigswitch.bcf.details=BigSwitch BCF details -label.bigswitch.bcf.nat=BigSwitch BCF NAT Enabled -label.dedicate=Dedicate -label.dedicate.pod=Dedicate Pod -label.pod.dedicated=Pod Dedicated -label.release.dedicated.pod=Release Dedicated Pod -label.override.public.traffic=Override Public-Traffic -label.public.traffic.vswitch.type=Public Traffic vSwitch Type -label.public.traffic.vswitch.name=Public Traffic vSwitch Name -label.override.guest.traffic=Override Guest-Traffic -label.guest.traffic.vswitch.type=Guest Traffic vSwitch Type -label.guest.traffic.vswitch.name=Guest Traffic vSwitch Name -label.cisco.nexus1000v.ip.address=Nexus 1000v IP Address -label.cisco.nexus1000v.username=Nexus 1000v Username -label.cisco.nexus1000v.password=Nexus 1000v Password -label.dedicate.cluster=Dedicate Cluster -label.release.dedicated.cluster=Release Dedicated Cluster -label.dedicate.host=Dedicate Host -label.release.dedicated.host=Release Dedicated Host -label.number.of.cpu.sockets=The Number of CPU Sockets -label.delete.ucs.manager=Delete UCS Manager -label.blades=Blades -label.chassis=Chassis -label.blade.id=Blade ID -label.associated.profile=Associated Profile -label.refresh.blades=Refresh Blades -label.instanciate.template.associate.profile.blade=Instanciate Template and Associate Profile to Blade -label.select.template=Select Template -label.profile=Profile -label.delete.profile=Delete Profile -label.disassociate.profile.blade=Disassociate Profile from Blade -label.secondary.storage.details=Secondary storage details -label.secondary.staging.store.details=Secondary Staging Store details -label.add.nfs.secondary.staging.store=Add NFS Secondary Staging Store -label.delete.secondary.staging.store=Delete Secondary Staging Store -label.ipv4.start.ip=IPv4 Start IP -label.ipv4.end.ip=IPv4 End IP -label.ipv6.start.ip=IPv6 Start IP -label.ipv6.end.ip=IPv6 End IP -label.vm.password=Password of the VM is -label.group.by.zone=Group by zone -label.group.by.pod=Group by pod -label.group.by.cluster=Group by cluster -label.group.by.account=Group by account -label.no.grouping=(no grouping) -label.create.nfs.secondary.staging.storage=Create NFS Secondary Staging Store -label.username.lower=username -label.password.lower=password -label.email.lower=email -label.firstname.lower=firstname -label.lastname.lower=lastname -label.domain.lower=domain -label.account.lower=account -label.type.lower=type -label.rule.number=Rule Number -label.action=Action -label.name.lower=name -label.ucs=UCS -label.change.affinity=Change Affinity -label.persistent=Persistent -label.broadcasturi=broadcasturi -label.network.cidr=Network CIDR -label.reserved.ip.range=Reserved IP Range -label.autoscale=AutoScale -label.health.check=Health Check -label.public.load.balancer.provider=Public Load Balancer Provider -label.add.isolated.network=Add Isolated Network -label.add.isolated.guest.network=Add Isolated Guest Network -label.vlan.only=VLAN -label.secondary.isolated.vlan.id=Secondary Isolated VLAN ID -label.ipv4.netmask=IPv4 Netmask -label.custom=Custom -label.disable.network.offering=Disable network offering -label.enable.network.offering=Enable network offering -label.remove.network.offering=Remove network offering -label.system.offering.for.router=System Offering for Router -label.mode=Mode -label.associate.public.ip=Associate Public IP -label.acl=ACL -label.user.data=User Data -label.virtual.networking=Virtual Networking -label.allow=Allow -label.deny=Deny -label.default.egress.policy=Default egress policy -label.xenserver.tools.version.61.plus=Original XS Version is 6.1\+ -label.gpu=GPU -label.vgpu.type=vGPU type -label.vgpu.video.ram=Video RAM -label.vgpu.max.resolution=Max resolution -label.vgpu.max.vgpu.per.gpu=vGPUs per GPU -label.vgpu.remaining.capacity=Remaining capacity -label.routing.host=Routing Host -label.usage.server=Usage Server -label.user.vm=User VM -label.resource.limit.exceeded=Resource Limit Exceeded -label.direct.attached.public.ip=Direct Attached Public IP -label.usage.sanity.result=Usage Sanity Result -label.select.region=Select region -label.info.upper=INFO -label.warn.upper=WARN -label.error.upper=ERROR -label.event.deleted=Event Deleted -label.add.ciscoASA1000v=Add CiscoASA1000v Resource -label.delete.ciscoASA1000v=Delete CiscoASA1000v -label.inside.port.profile=Inside Port Profile -label.archive=Archive -label.event.archived=Event Archived -label.alert.details=Alert details -label.alert.deleted=Alert Deleted -label.alert.archived=Alert Archived -label.volume.details=Volume details -label.volume.migrated=Volume migrated -label.storage.pool=Storage Pool -label.enable.host=Enable Host -label.disable.host=Disable Host -label.copying.iso=Copying ISO -label.add.internal.lb=Add Internal LB -label.internal.lb.details=Internal LB details -label.delete.internal.lb=Delete Internal LB -label.remove.vm.load.balancer=Remove VM from load balancer -label.add.acl.list=Add ACL List -label.add.list.name=ACL List Name -label.add.network.acl.list=Add Network ACL List -label.delete.acl.list=Delete ACL List -label.acl.replaced=ACL replaced -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.protocol.number=Protocol Number -label.edit.acl.rule=Edit ACL rule -label.source.ip.address=Source IP Address -label.source.port=Source Port -label.instance.port=Instance Port -label.assigned.vms=Assigned VMs -label.replace.acl=Replace ACL -label.source.nat.supported=SourceNAT Supported -label.acl.name=ACL Name -label.acl.id=ACL ID -label.passive=Passive -label.replace.acl.list=Replace ACL List -label.vswitch.name=vSwitch Name -label.vSwitch.type=vSwitch Type -label.ping.path=Ping Path -label.response.timeout.in.sec=Response Timeout (in sec) -label.health.check.interval.in.sec=Health Check Interval (in sec) -label.healthy.threshold=Healthy Threshold -label.unhealthy.threshold=Unhealthy Threshold -label.other=Other -label.vm.id=VM ID -label.vnmc=VNMC -label.scale.up.policy=SCALE UP POLICY -label.counter=Counter -label.operator=Operator -label.threshold=Threshold -label.load.balancer.type=Load Balancer Type -label.vgpu=VGPU -label.sticky.name=Sticky Name -label.stickiness.method=Stickiness method -label.gslb=GSLB -label.portable.ip=Portable IP -label.internallbvm=InternalLbVm -label.agent.state=Agent State -label.duration.in.sec=Duration (in sec) -managed.state=Managed State -message.acquire.new.ip.vpc=Please confirm that you would like to acquire a new IP for this VPC. -message.acquire.new.ip=Please confirm that you would like to acquire a new IP for this network. -message.acquire.public.ip=Please select a zone from which you want to acquire your new IP from. -message.action.cancel.maintenance.mode=Please confirm that you want to cancel this maintenance. -message.action.cancel.maintenance=Your host has been successfully canceled for maintenance. This process can take up to several minutes. -message.action.change.service.warning.for.instance=Your instance must be stopped before attempting to change its current service offering. -message.action.change.service.warning.for.router=Your router must be stopped before attempting to change its current service offering. -message.action.delete.cluster=Please confirm that you want to delete this cluster. -message.action.delete.disk.offering=Please confirm that you want to delete this disk offering. -message.action.delete.domain=Please confirm that you want to delete this domain. -message.action.delete.external.firewall=Please confirm that you would like to remove this external firewall. Warning\: If you are planning to add back the same external firewall, you must reset usage data on the device. -message.action.delete.external.load.balancer=Please confirm that you would like to remove this external load balancer. Warning\: If you are planning to add back the same external load balancer, you must reset usage data on the device. -message.action.delete.ingress.rule=Please confirm that you want to delete this ingress rule. -message.action.delete.ISO.for.all.zones=The ISO is used by all zones. Please confirm that you want to delete it from all zones. -message.action.delete.ISO=Please confirm that you want to delete this ISO. -message.action.delete.network=Please confirm that you want to delete this network. -message.action.delete.nexusVswitch=Please confirm that you want to delete this nexus 1000v -message.action.delete.physical.network=Please confirm that you want to delete this physical network -message.action.delete.pod=Please confirm that you want to delete this pod. -message.action.delete.primary.storage=Please confirm that you want to delete this primary storage. -message.action.delete.secondary.storage=Please confirm that you want to delete this secondary storage. -message.action.delete.security.group=Please confirm that you want to delete this security group. -message.action.delete.service.offering=Please confirm that you want to delete this service offering. -message.action.delete.snapshot=Please confirm that you want to delete this snapshot. -message.action.delete.system.service.offering=Please confirm that you want to delete this system service offering. -message.action.delete.template.for.all.zones=The template is used by all zones. Please confirm that you want to delete it from all zones. -message.action.delete.template=Please confirm that you want to delete this template. -message.action.delete.volume=Please confirm that you want to delete this volume. -message.action.delete.zone=Please confirm that you want to delete this zone. -message.action.destroy.instance=Please confirm that you want to destroy this instance. -message.action.destroy.systemvm=Please confirm that you want to destroy this System VM. -message.action.disable.cluster=Please confirm that you want to disable this cluster. -message.action.disable.nexusVswitch=Please confirm that you want to disable this nexus 1000v -message.action.disable.physical.network=Please confirm that you want to disable this physical network. -message.action.disable.pod=Please confirm that you want to disable this pod. -message.action.disable.static.NAT=Please confirm that you want to disable static NAT. -message.action.disable.zone=Please confirm that you want to disable this zone. -message.action.download.iso=Please confirm that you want to download this ISO. -message.action.download.template=Please confirm that you want to download this template. -message.action.enable.cluster=Please confirm that you want to enable this cluster. -message.action.enable.maintenance=Your host has been successfully prepared for maintenance. This process can take up to several minutes or longer depending on how many VMs are currently on this host. -message.action.enable.nexusVswitch=Please confirm that you want to enable this nexus 1000v -message.action.enable.physical.network=Please confirm that you want to enable this physical network. -message.action.enable.pod=Please confirm that you want to enable this pod. -message.action.enable.zone=Please confirm that you want to enable this zone. -message.action.expunge.instance=Please confirm that you want to expunge this instance. -message.action.force.reconnect=Your host has been successfully forced to reconnect. This process can take up to several minutes. -message.action.host.enable.maintenance.mode=Enabling maintenance mode will cause a live migration of all running instances on this host to any available host. -message.action.instance.reset.password=Please confirm that you want to change the ROOT password for this virtual machine. -message.action.manage.cluster=Please confirm that you want to manage the cluster. -message.action.primarystorage.enable.maintenance.mode=Warning\: placing the primary storage into maintenance mode will cause all VMs using volumes from it to be stopped. Do you want to continue? -message.action.reboot.instance=Please confirm that you want to reboot this instance. -message.action.reboot.router=All services provided by this virtual router will be interrupted. Please confirm that you want to reboot this router. -message.action.reboot.systemvm=Please confirm that you want to reboot this system VM. -message.action.release.ip=Please confirm that you want to release this IP. -message.action.remove.host=Please confirm that you want to remove this host. -message.action.reset.password.off=Your instance currently does not support this feature. -message.action.reset.password.warning=Your instance must be stopped before attempting to change its current password. -message.action.restore.instance=Please confirm that you want to restore this instance. -message.action.start.instance=Please confirm that you want to start this instance. -message.action.start.router=Please confirm that you want to start this router. -message.action.start.systemvm=Please confirm that you want to start this system VM. -message.action.stop.instance=Please confirm that you want to stop this instance. -message.action.stop.router=All services provided by this virtual router will be interrupted. Please confirm that you want to stop this router. -message.action.stop.systemvm=Please confirm that you want to stop this system VM. -message.action.take.snapshot=Please confirm that you want to take a snapshot of this volume. -message.action.revert.snapshot=Please confirm that you want to revert the owning volume to this snapshot. -message.action.unmanage.cluster=Please confirm that you want to unmanage the cluster. -message.action.vmsnapshot.delete=Please confirm that you want to delete this VM snapshot. -message.action.vmsnapshot.revert=Revert VM snapshot -message.activate.project=Are you sure you want to activate this project? -message.add.cluster.zone=Add a hypervisor managed cluster for zone -message.add.cluster=Add a hypervisor managed cluster for zone , pod -message.add.disk.offering=Please specify the following parameters to add a new disk offering -message.add.domain=Please specify the subdomain you want to create under this domain -message.add.firewall=Add a firewall to zone -message.add.guest.network=Please confirm that you would like to add a guest network -message.add.host=Please specify the following parameters to add a new host -message.add.ip.range.direct.network=Add an IP range to direct network in zone -message.add.ip.range.to.pod=

Add an IP range to pod\:

-message.add.ip.range=Add an IP range to public network in zone -message.add.load.balancer.under.ip=The load balancer rule has been added under IP\: -message.add.load.balancer=Add a load balancer to zone -message.add.network=Add a new network for zone\: -message.add.new.gateway.to.vpc=Please specify the information to add a new gateway to this VPC. -message.add.pod.during.zone.creation=Each zone must contain in one or more pods, and we will add the first pod now. A pod contains hosts and primary storage servers, which you will add in a later step. First, configure a range of reserved IP addresses for CloudStack\'s internal management traffic. The reserved IP range must be unique for each zone in the cloud. -message.add.pod=Add a new pod for zone -message.add.primary.storage=Add a new Primary Storage for zone , pod -message.add.primary=Please specify the following parameters to add a new primary storage -message.add.region=Please specify the required information to add a new region. -message.add.secondary.storage=Add a new storage for zone -message.add.service.offering=Please fill in the following data to add a new compute offering. -message.add.system.service.offering=Please fill in the following data to add a new system service offering. -message.add.template=Please enter the following data to create your new template -message.add.volume=Please fill in the following data to add a new volume. -message.add.VPN.gateway=Please confirm that you want to add a VPN Gateway -message.adding.host=Adding host -message.adding.Netscaler.device=Adding Netscaler device -message.adding.Netscaler.provider=Adding Netscaler provider -message.additional.networks.desc=Please select additional network(s) that your virtual instance will be connected to. -message.advanced.mode.desc=Choose this network model if you wish to enable VLAN support. This network model provides the most flexibility in allowing administrators to provide custom network offerings such as providing firewall, vpn, or load balancer support as well as enabling direct vs virtual networking. -message.advanced.security.group=Choose this if you wish to use security groups to provide guest VM isolation. -message.advanced.virtual=Choose this if you wish to use zone-wide VLANs to provide guest VM isolation. -message.after.enable.s3=S3-backed Secondary Storage configured. Note\: When you leave this page, you will not be able to re-configure S3 again. -message.after.enable.swift=Swift configured. Note\: When you leave this page, you will not be able to re-configure Swift again. -message.alert.state.detected=Alert state detected -message.allow.vpn.access=Please enter a username and password of the user that you want to allow VPN access. -message.apply.snapshot.policy=You have successfully updated your current snapshot policy. -message.attach.iso.confirm=Please confirm that you want to attach the ISO to this virtual instance. -message.attach.volume=Please fill in the following data to attach a new volume. If you are attaching a disk volume to a Windows based virtual machine, you will need to reboot the instance to see the attached disk. -message.basic.mode.desc=Choose this network model if you do *not* want to enable any VLAN support. All virtual instances created under this network model will be assigned an IP directly from the network and security groups are used to provide security and segregation. -message.change.ipaddress=Please confirm that you would like to change the IP address for this NIC on VM. -message.change.offering.confirm=Please confirm that you wish to change the service offering of this virtual instance. -message.change.password=Please change your password. -message.configure.all.traffic.types=You have multiple physical networks; please configure labels for each traffic type by clicking on the Edit button. -message.configuring.guest.traffic=Configuring guest traffic -message.configuring.physical.networks=Configuring physical networks -message.configuring.public.traffic=Configuring public traffic -message.configuring.storage.traffic=Configuring storage traffic -message.confirm.action.force.reconnect=Please confirm that you want to force reconnect this host. -message.confirm.delete.F5=Please confirm that you would like to delete F5 -message.confirm.delete.BigSwitchBcf=Please confirm that you would like to delete this BigSwitch BCF Controller -message.confirm.delete.BrocadeVcs=Please confirm that you would like to delete Brocade Vcs Switch -message.confirm.delete.NetScaler=Please confirm that you would like to delete NetScaler -message.confirm.delete.NuageVsp=Please confirm that you would like to delete Nuage Virtualized Services Directory -message.confirm.delete.SRX=Please confirm that you would like to delete SRX -message.confirm.delete.PA=Please confirm that you would like to delete Palo Alto -message.confirm.destroy.router=Please confirm that you would like to destroy this router -message.confirm.disable.provider=Please confirm that you would like to disable this provider -message.confirm.enable.provider=Please confirm that you would like to enable this provider -message.confirm.join.project=Please confirm you wish to join this project. -message.confirm.remove.IP.range=Please confirm that you would like to remove this IP range. -message.confirm.shutdown.provider=Please confirm that you would like to shutdown this provider -message.confirm.current.guest.CIDR.unchanged=Do you want to keep the current guest network CIDR unchanged? -message.confirm.delete.ciscoASA1000v=Please confirm you want to delete CiscoASA1000v -message.confirm.remove.selected.events=Please confirm you would like to remove the selected events -message.confirm.archive.selected.events=Please confirm you would like to archive the selected events -message.confirm.remove.event=Are you sure you want to remove this event? -message.confirm.archive.event=Please confirm that you want to archive this event. -message.confirm.remove.selected.alerts=Please confirm you would like to remove the selected alerts -message.confirm.archive.selected.alerts=Please confirm you would like to archive the selected alerts -message.confirm.delete.alert=Are you sure you want to delete this alert ? -message.confirm.archive.alert=Please confirm that you want to archive this alert. -message.confirm.migrate.volume=Do you want to migrate this volume? -message.confirm.attach.disk=Are you sure you want to attach disk? -message.confirm.create.volume=Are you sure you want to create volume? -message.confirm.enable.host=Please confirm that you want to enable the host -message.confirm.disable.host=Please confirm that you want to disable the host -message.confirm.delete.internal.lb=Please confirm you want to delete Internal LB -message.confirm.remove.load.balancer=Please confirm you want to remove VM from load balancer -message.confirm.delete.acl.list=Are you sure you want to delete this ACL list? -message.confirm.replace.acl.new.one=Do you want to replace the ACL with a new one? -message.copy.iso.confirm=Please confirm that you wish to copy your ISO to -message.copy.template=Copy template XXX from zone to -message.create.template.vm=Create VM from template -message.create.template.volume=Please specify the following information before creating a template of your disk volume\: . Creation of the template can range from several minutes to longer depending on the size of the volume. -message.create.template=Are you sure you want to create template? -message.creating.cluster=Creating cluster -message.creating.guest.network=Creating guest network -message.creating.physical.networks=Creating physical networks -message.creating.pod=Creating pod -message.creating.primary.storage=Creating primary storage -message.creating.secondary.storage=Creating secondary storage -message.creating.zone=Creating zone -message.decline.invitation=Are you sure you want to decline this project invitation? -message.dedicate.zone=Dedicating zone -message.delete.account=Please confirm that you want to delete this account. -message.delete.affinity.group=Please confirm that you would like to remove this affinity group. -message.delete.gateway=Please confirm you want to delete the gateway -message.delete.project=Are you sure you want to delete this project? -message.delete.user=Please confirm that you would like to delete this user. -message.delete.VPN.connection=Please confirm that you want to delete VPN connection -message.delete.VPN.customer.gateway=Please confirm that you want to delete this VPN Customer Gateway -message.delete.VPN.gateway=Please confirm that you want to delete this VPN Gateway -message.desc.advanced.zone=For more sophisticated network topologies. This network model provides the most flexibility in defining guest networks and providing custom network offerings such as firewall, VPN, or load balancer support. -message.desc.basic.zone=Provide a single network where each VM instance is assigned an IP directly from the network. Guest isolation can be provided through layer-3 means such as security groups (IP address source filtering). -message.desc.cluster=Each pod must contain one or more clusters, and we will add the first cluster now. A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Each cluster consists of one or more hosts and one or more primary storage servers. -message.desc.created.ssh.key.pair=Created a SSH Key Pair. -message.desc.host=Each cluster must contain at least one host (computer) for guest VMs to run on, and we will add the first host now. For a host to function in CloudStack, you must install hypervisor software on the host, assign an IP address to the host, and ensure the host is connected to the CloudStack management server.

Give the host\\'s DNS or IP address, the user name (usually root) and password, and any labels you use to categorize hosts. -message.desc.primary.storage=Each cluster must contain one or more primary storage servers, and we will add the first one now. Primary storage contains the disk volumes for all the VMs running on hosts in the cluster. Use any standards-compliant protocol that is supported by the underlying hypervisor. -message.desc.reset.ssh.key.pair=Please specify a ssh key pair that you would like to add to this VM. Please note the root password will be changed by this operation if password is enabled. -message.desc.secondary.storage=Each zone must have at least one NFS or secondary storage server, and we will add the first one now. Secondary storage stores VM templates, ISO images, and VM disk volume snapshots. This server must be available to all hosts in the zone.

Provide the IP address and exported path. -message.desc.zone=A zone is the largest organizational unit in CloudStack, and it typically corresponds to a single datacenter. Zones provide physical isolation and redundancy. A zone consists of one or more pods (each of which contains hosts and primary storage servers) and a secondary storage server which is shared by all pods in the zone. -message.detach.disk=Are you sure you want to detach this disk? -message.detach.iso.confirm=Please confirm that you want to detach the ISO from this virtual instance. -message.disable.account=Please confirm that you want to disable this account. By disabling the account, all users for this account will no longer have access to their cloud resources. All running virtual machines will be immediately shut down. -message.disable.snapshot.policy=You have successfully disabled your current snapshot policy. -message.disable.user=Please confirm that you would like to disable this user. -message.disable.vpn.access=Please confirm that you want to disable Remote Access VPN. -message.disable.vpn=Are you sure you want to disable VPN? -message.download.ISO=Please click 00000 to download ISO -message.download.template=Please click 00000 to download template -message.download.volume.confirm=Please confirm that you want to download this volume. -message.download.volume=Please click 00000 to download volume -message.edit.account=Edit ("-1" indicates no limit to the amount of resources create) -message.edit.confirm=Please confirm your changes before clicking "Save". -message.edit.limits=Please specify limits to the following resources. A "-1" indicates no limit to the amount of resources create. -message.edit.traffic.type=Please specify the traffic label you want associated with this traffic type. -message.enable.account=Please confirm that you want to enable this account. -message.enable.user=Please confirm that you would like to enable this user. -message.enable.vpn.access=VPN is currently disabled for this IP Address. Would you like to enable VPN access? -message.enable.vpn=Please confirm that you want Remote Access VPN enabled for this IP address. -message.enabled.vpn.ip.sec=Your IPSec pre-shared key is -message.enabled.vpn=Your Remote Access VPN is currently enabled and can be accessed via the IP -message.enabling.security.group.provider=Enabling Security Group provider -message.enabling.zone=Enabling zone -message.enter.token=Please enter the token that you were given in your invite e-mail. -message.generate.keys=Please confirm that you would like to generate new keys for this user. -message.guest.traffic.in.advanced.zone=Guest network traffic is communication between end-user virtual machines. Specify a range of VLAN IDs to carry guest traffic for each physical network. -message.guest.traffic.in.basic.zone=Guest network traffic is communication between end-user virtual machines. Specify a range of IP addresses that CloudStack can assign to guest VMs. Make sure this range does not overlap the reserved system IP range. -message.installWizard.click.retry=Click the button to retry launch. -message.installWizard.copy.whatIsACluster=A cluster provides a way to group hosts. The hosts in a cluster all have identical hardware, run the same hypervisor, are on the same subnet, and access the same shared storage. Virtual machine instances (VMs) can be live-migrated from one host to another within the same cluster, without interrupting service to the user. A cluster is the third-largest organizational unit within a CloudStack&\#8482; deployment. Clusters are contained within pods, and pods are contained within zones.

CloudStack&\#8482; allows multiple clusters in a cloud deployment, but for a Basic Installation, we only need one cluster. -message.installWizard.copy.whatIsAHost=A host is a single computer. Hosts provide the computing resources that run the guest virtual machines. Each host has hypervisor software installed on it to manage the guest VMs (except for bare metal hosts, which are a special case discussed in the Advanced Installation Guide). For example, a Linux KVM-enabled server, a Citrix XenServer server, and an ESXi server are hosts. In a Basic Installation, we use a single host running XenServer or KVM.

The host is the smallest organizational unit within a CloudStack&\#8482; deployment. Hosts are contained within clusters, clusters are contained within pods, and pods are contained within zones. -message.installWizard.copy.whatIsAPod=A pod often represents a single rack. Hosts in the same pod are in the same subnet.

A pod is the second-largest organizational unit within a CloudStack&\#8482; deployment. Pods are contained within zones. Each zone can contain one or more pods; in the Basic Installation, you will have just one pod in your zone. -message.installWizard.copy.whatIsAZone=A zone is the largest organizational unit within a CloudStack&\#8482; deployment. A zone typically corresponds to a single datacenter, although it is permissible to have multiple zones in a datacenter. The benefit of organizing infrastructure into zones is to provide physical isolation and redundancy. For example, each zone can have its own power supply and network uplink, and the zones can be widely separated geographically (though this is not required). -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482 is a software platform that pools computing resources to build public, private, and hybrid Infrastructure as a Service (IaaS) clouds. CloudStack&\#8482 manages the network, storage, and compute nodes that make up a cloud infrastructure. Use CloudStack&\#8482 to deploy, manage, and configure cloud computing environments.

Extending beyond individual virtual machine images running on commodity hardware, CloudStack&\#8482 provides a turnkey cloud infrastructure software stack for delivering virtual datacenters as a service - delivering all of the essential components to build, deploy, and manage multi-tier and multi-tenant cloud applications. Both open-source and Premium versions are available, with the open-source version offering nearly identical features. -message.installWizard.copy.whatIsPrimaryStorage=A CloudStack&\#8482; cloud infrastructure makes use of two types of storage\: primary storage and secondary storage. Both of these can be iSCSI or NFS servers, or localdisk.

Primary storage is associated with a cluster, and it stores the disk volumes of each guest VM for all the VMs running on hosts in that cluster. The primary storage server is typically located close to the hosts. -message.installWizard.copy.whatIsSecondaryStorage=Secondary storage is associated with a zone, and it stores the following\:
  • Templates - OS images that can be used to boot VMs and can include additional configuration information, such as installed applications
  • ISO images - OS images that can be bootable or non-bootable
  • Disk volume snapshots - saved copies of VM data which can be used for data recovery or to create new templates
-message.installWizard.now.building=Now building your cloud... -message.installWizard.tooltip.addCluster.name=A name for the cluster. This can be text of your choosing and is not used by CloudStack. -message.installWizard.tooltip.addHost.hostname=The DNS name or IP address of the host. -message.installWizard.tooltip.addHost.password=This is the password for the user named above (from your XenServer install). -message.installWizard.tooltip.addHost.username=Usually root. -message.installWizard.tooltip.addPod.name=A name for the pod -message.installWizard.tooltip.addPod.reservedSystemEndIp=This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers. -message.installWizard.tooltip.addPod.reservedSystemGateway=The gateway for the hosts in that pod. -message.installWizard.tooltip.addPod.reservedSystemNetmask=The netmask in use on the subnet the guests will use. -message.installWizard.tooltip.addPod.reservedSystemStartIp=This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers. -message.installWizard.tooltip.addPrimaryStorage.name=The name for the storage device. -message.installWizard.tooltip.addPrimaryStorage.path=(for NFS) In NFS this is the exported path from the server. Path (for SharedMountPoint). With KVM this is the path on each host that is where this primary storage is mounted. For example, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(for NFS, iSCSI, or PreSetup) The IP address or DNS name of the storage device. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=The IP address of the NFS server hosting the secondary storage -message.installWizard.tooltip.addSecondaryStorage.path=The exported path, located on the server you specified above -message.installWizard.tooltip.addZone.dns1=These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here. -message.installWizard.tooltip.addZone.dns2=These are DNS servers for use by guest VMs in the zone. These DNS servers will be accessed via the public network you will add later. The public IP addresses for the zone must have a route to the DNS server named here. -message.installWizard.tooltip.addZone.internaldns1=These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here. -message.installWizard.tooltip.addZone.internaldns2=These are DNS servers for use by system VMs in the zone. These DNS servers will be accessed via the private network interface of the System VMs. The private IP address you provide for the pods must have a route to the DNS server named here. -message.installWizard.tooltip.addZone.name=A name for the zone -message.installWizard.tooltip.configureGuestTraffic.description=A description for your network -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=The range of IP addresses that will be available for allocation to guests in this zone. If one NIC is used, these IPs should be in the same CIDR as the pod CIDR. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=The gateway that the guests should use -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=The netmask in use on the subnet that the guests should use -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=The range of IP addresses that will be available for allocation to guests in this zone. If one NIC is used, these IPs should be in the same CIDR as the pod CIDR. -message.installWizard.tooltip.configureGuestTraffic.name=A name for your network -message.instanceWizard.noTemplates=You do not have any templates available; please add a compatible template, and re-launch the instance wizard. -message.ip.address.changed=Your IP addresses may have changed; would you like to refresh the listing? Note that in this case the details pane will close. -message.iso.desc=Disc image containing data or bootable media for OS -message.join.project=You have now joined a project. Please switch to Project view to see the project. -message.launch.vm.on.private.network=Do you wish to launch your instance on your own private dedicated network? -message.launch.zone=Zone is ready to launch; please proceed to the next step. -message.lock.account=Please confirm that you want to lock this account. By locking the account, all users for this account will no longer be able to manage their cloud resources. Existing resources can still be accessed. -message.migrate.instance.confirm=Please confirm the host you wish to migrate the virtual instance to. -message.migrate.instance.to.host=Please confirm that you want to migrate instance to another host. -message.migrate.instance.to.ps=Please confirm that you want to migrate instance to another primary storage. -message.migrate.router.confirm=Please confirm the host you wish to migrate the router to\: -message.migrate.systemvm.confirm=Please confirm the host you wish to migrate the system VM to\: -message.migrate.volume=Please confirm that you want to migrate volume to another primary storage. -message.new.user=Specify the following to add a new user to the account -message.no.network.support.configuration.not.true=You do not have any zone that has security group enabled. Thus, no additional network features. Please continue to step 5. -message.no.network.support=Your selected hypervisor, vSphere, does not have any additional network features. Please continue to step 5. -message.no.projects.adminOnly=You do not have any projects.
Please ask your administrator to create a new project. -message.no.projects=You do not have any projects.
Please create a new one from the projects section. -message.number.clusters=

\# of Clusters

-message.number.hosts=

\# of Hosts

-message.number.pods=

\# of Pods

-message.number.storage=

\# of Primary Storage Volumes

-message.number.zones=

\# of Zones

-message.pending.projects.1=You have pending project invitations\: -message.pending.projects.2=To view, please go to the projects section, then select invitations from the drop-down. -message.please.add.at.lease.one.traffic.range=Please add at least one traffic range. -message.please.proceed=Please proceed to the next step. -message.please.select.a.configuration.for.your.zone=Please select a configuration for your zone. -message.please.select.a.different.public.and.management.network.before.removing=Please select a different public and management network before removing -message.please.select.networks=Please select networks for your virtual machine. -message.please.wait.while.zone.is.being.created=Please wait while your zone is being created; this may take a while... -message.project.invite.sent=Invite sent to user; they will be added to the project once they accept the invitation -message.public.traffic.in.advanced.zone=Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.

Provide at least one range of IP addresses for internet traffic. -message.public.traffic.in.basic.zone=Public traffic is generated when VMs in the cloud access the Internet or provide services to clients over the Internet. Publicly accessible IPs must be allocated for this purpose. When a instance is created, an IP from this set of Public IPs will be allocated to the instance in addition to the guest IP address. Static 1-1 NAT will be set up automatically between the public IP and the guest IP. End users can also use the CloudStack UI to acquire additional IPs to implement static NAT between their instances and the public IP. -message.redirecting.region=Redirecting to region... -message.remove.region=Are you sure you want to remove this region from this management server? -message.remove.vpc=Please confirm that you want to remove the VPC -message.remove.vpn.access=Please confirm that you want to remove VPN access from the following user. -message.reset.password.warning.notPasswordEnabled=The template of this instance was created without password enabled -message.reset.password.warning.notStopped=Your instance must be stopped before attempting to change its current password -message.reset.VPN.connection=Please confirm that you want to reset VPN connection -message.restart.mgmt.server=Please restart your management server(s) for your new settings to take effect. -message.restart.mgmt.usage.server=Please restart your management server(s) and usage server(s) for your new settings to take effect. -message.restart.network=All services provided by this network will be interrupted. Please confirm that you want to restart this network. -message.restart.vpc=Please confirm that you want to restart the VPC -message.security.group.usage=(Use Ctrl-click to select all applicable security groups) -message.select.a.zone=A zone typically corresponds to a single datacenter. Multiple zones help make the cloud more reliable by providing physical isolation and redundancy. -message.select.instance=Please select an instance. -message.select.iso=Please select an ISO for your new virtual instance. -message.select.item=Please select an item. -message.select.security.groups=Please select security group(s) for your new VM -message.select.template=Please select a template for your new virtual instance. -message.setup.physical.network.during.zone.creation.basic=When adding a basic zone, you can set up one physical network, which corresponds to a NIC on the hypervisor. The network carries several types of traffic.

You may also drag and drop other traffic types onto the physical network. -message.setup.physical.network.during.zone.creation=When adding an advanced zone, you need to set up one or more physical networks. Each network corresponds to a NIC on the hypervisor. Each physical network can carry one or more types of traffic, with certain restrictions on how they may be combined.

Drag and drop one or more traffic types onto each physical network. -message.setup.successful=Cloud setup successful\! -message.snapshot.schedule=You can set up recurring snapshot schedules by selecting from the available options below and applying your policy preference -message.specify.url=Please specify URL -message.step.1.continue=Please select a template or ISO to continue -message.step.1.desc=Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto. -message.step.2.continue=Please select a service offering to continue -message.step.3.continue=Please select a disk offering to continue -message.step.4.continue=Please select at least one network to continue -message.step.4.desc=Please select the primary network that your virtual instance will be connected to. -message.storage.traffic=Traffic between CloudStack\\'s internal resources, including any components that communicate with the Management Server, such as hosts and CloudStack system VMs. Please configure storage traffic here. -message.suspend.project=Are you sure you want to suspend this project? -message.template.desc=OS image that can be used to boot VMs -message.tooltip.dns.1=Name of a DNS server for use by VMs in the zone. The public IP addresses for the zone must have a route to this server. -message.tooltip.dns.2=A second DNS server name for use by VMs in the zone. The public IP addresses for the zone must have a route to this server. -message.tooltip.internal.dns.1=Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server. -message.tooltip.internal.dns.2=Name of a DNS server for use by CloudStack internal system VMs in the zone. The private IP address for the pods must have a route to this server. -message.tooltip.network.domain=A DNS suffix that will create a custom domain name for the network that is accessed by guest VMs. -message.tooltip.pod.name=A name for this pod. -message.tooltip.reserved.system.gateway=The gateway for the hosts in the pod. -message.tooltip.reserved.system.netmask=The network prefix that defines the pod subnet. Uses CIDR notation. -message.tooltip.zone.name=A name for the zone. -message.update.os.preference=Please choose a OS preference for this host. All virtual instances with similar preferences will be first allocated to this host before choosing another. -message.update.resource.count=Please confirm that you want to update resource counts for this account. -message.update.ssl=Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance\: -message.update.ssl.succeeded=Update SSL Certificates succeeded -message.update.ssl.failed=Failed to update SSL Certificate. -message.validate.instance.name=Instance name can not be longer than 63 characters. Only ASCII letters a~z, A~Z, digits 0~9, hyphen are allowed. Must start with a letter and end with a letter or a digit. -message.virtual.network.desc=A dedicated virtualized network for your account. The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router. -message.vm.create.template.confirm=Create Template will reboot the VM automatically. -message.vm.review.launch=Please review the following information and confirm that your virtual instance is correct before launch. -message.volume.create.template.confirm=Please confirm that you wish to create a template for this disk volume. Creation of the template can range from several minutes to longer depending on the size of the volume. -message.you.must.have.at.least.one.physical.network=You must have at least one physical network -message.zone.creation.complete.would.you.like.to.enable.this.zone=Zone creation complete. Would you like to enable this zone? -message.Zone.creation.complete=Zone creation complete -message.zone.no.network.selection=The zone you selected does not have any choices for network selection. -message.zone.step.1.desc=Please select a network model for your zone. -message.zone.step.2.desc=Please enter the following info to add a new zone -message.zone.step.3.desc=Please enter the following info to add a new pod -message.zoneWizard.enable.local.storage=WARNING\: If you enable local storage for this zone, you must do the following, depending on where you would like your system VMs to launch\:

1. If system VMs need to be launched in shared primary storage, shared primary storage needs to be added to the zone after creation. You must also start the zone in a disabled state.

2. If system VMs need to be launched in local primary storage, system.vm.use.local.storage needs to be set to true before you enable the zone.


Would you like to continue? -message.validate.fieldrequired=This field is required. -message.validate.fixfield=Please fix this field. -message.validate.email.address=Please enter a valid email address. -message.validate.URL=Please enter a valid URL. -message.validate.date=Please enter a valid date. -message.validate.date.ISO=Please enter a valid date (ISO). -message.validate.number=Please enter a valid number. -message.validate.digits=Please enter only digits. -message.validate.creditcard=Please enter a valid credit card number. -message.validate.equalto=Please enter the same value again. -message.validate.accept=Please enter a value with a valid extension. -message.validate.maxlength=Please enter no more than {0} characters. -message.validate.minlength=Please enter at least {0} characters. -message.validate.range.length=Please enter a value between {0} and {1} characters long. -message.validate.range=Please enter a value between {0} and {1}. -message.validate.max=Please enter a value less than or equal to {0}. -messgae.validate.min=Please enter a value greater than or equal to {0}. -message.creating.systemVM=Creating system VMs (this may take a while) -message.enabling.zone.dots=Enabling zone... -message.restoreVM=Do you want to restore the VM ? -message.no.host.available=No Hosts are available for Migration -message.network.addVM.desc=Please specify the network that you would like to add this VM to. A new NIC will be added for this network. -message.network.addVMNIC=Please confirm that you would like to add a new VM NIC for this network. -message.set.default.NIC=Please confirm that you would like to make this NIC the default for this VM. -message.set.default.NIC.manual=Please manually update the default NIC on the VM now. -message.instance.scaled.up.confirm=Do you really want to scale Up your instance ? -message.copy.template.confirm=Are you sure you want to copy template? -message.template.copying=Template is being copied. -message.XSTools61plus.update.failed=Failed to update Original XS Version is 6.1\+ field. Error\: -message.gslb.delete.confirm=Please confirm you want to delete this GSLB -message.portable.ip.delete.confirm=Please confirm you want to delete Portable IP Range -message.gslb.lb.remove.confirm=Please confirm you want to remove load balancing from GSLB -message.admin.guide.read=For VMware-based VMs, please read the dynamic scaling section in the admin guide before scaling. Would you like to continue?\, -message.tier.required=Tier is required -message.remove.ldap=Are you sure you want to delete the LDAP configuration? -message.action.downloading.template=Downloading template. -message.configure.ldap=Please confirm you would like to configure LDAP. -message.confirm.delete.ciscovnmc.resource=Please confirm you want to delete CiscoVNMC resource -message.confirm.add.vnmc.provider=Please confirm you would like to add the VNMC provider. -message.confirm.enable.vnmc.provider=Please confirm you would like to enable the VNMC provider. -message.confirm.disable.vnmc.provider=Please confirm you would like to disable the VNMC provider. -message.vnmc.available.list=VNMC is not available from provider list. -message.vnmc.not.available.list=VNMC is not available from provider list. -message.confirm.release.dedicate.vlan.range=Please confirm you want to release dedicated VLAN range -message.confirm.start.lb.vm=Please confirm you want to start LB VM -message.confirm.stop.lb.vm=Please confirm you want to stop LB VM -message.confirm.remove.vmware.datacenter=Please confirm you want to remove VMware datacenter -message.confirm.dedicate.zone=Do you really want to dedicate this zone to a domain/account? -message.confirm.release.dedicated.zone=Do you want to release this dedicated zone ? -message.dedicated.zone.released=Zone dedication released -message.read.admin.guide.scaling.up=Please read the dynamic scaling section in the admin guide before scaling up. -message.confirm.scale.up.system.vm=Do you really want to scale up the system VM ? -message.confirm.upgrade.router.newer.template=Please confirm that you want to upgrade router to use newer template -message.confirm.scale.up.router.vm=Do you really want to scale up the Router VM ? -message.confirm.upgrade.routers.newtemplate=Please confirm that you want to upgrade all routers in this zone to use newer template -message.confirm.upgrade.routers.pod.newtemplate=Please confirm that you want to upgrade all routers in this pod to use newer template -message.confirm.upgrade.routers.cluster.newtemplate=Please confirm that you want to upgrade all routers in this cluster to use newer template -message.confirm.upgrade.routers.account.newtemplate=Please confirm that you want to upgrade all routers in this account to use newer template -message.confirm.dedicate.pod.domain.account=Do you really want to dedicate this pod to a domain/account? -message.confirm.release.dedicated.pod=Do you want to release this dedicated pod ? -message.pod.dedication.released=Pod dedication released -message.confirm.dedicate.cluster.domain.account=Do you really want to dedicate this cluster to a domain/account? -message.cluster.dedicated=Cluster Dedicated -message.confirm.release.dedicated.cluster=Do you want to release this dedicated cluster ? -message.cluster.dedication.released=Cluster dedication released -message.confirm.dedicate.host.domain.account=Do you really want to dedicate this host to a domain/account? -message.host.dedicated=Host Dedicated -message.confirm.release.dedicated.host=Do you want to release this dedicated host ? -message.host.dedication.released=Host dedication released -message.confirm.delete.ucs.manager=Please confirm that you want to delete UCS Manager -message.confirm.refresh.blades=Please confirm that you want to refresh blades. -message.confirm.delete.secondary.staging.store=Please confirm you want to delete Secondary Staging Store. -message.select.tier=Please select a tier -message.disallowed.characters=Disallowed characters: \<\,\> -message.waiting.for.builtin.templates.to.load=Waiting for builtin templates to load... -message.systems.vms.ready=System VMs ready. -message.your.cloudstack.is.ready=Your CloudStack is ready\! -message.specifiy.tag.key.value=Please specify a tag key and value -message.enter.seperated.list.multiple.cidrs=Please enter a comma separated list of CIDRs if more than one -message.disabling.network.offering=Disabling network offering -message.confirm.enable.network.offering=Are you sure you want to enable this network offering? -message.enabling.network.offering=Enabling network offering -message.confirm.remove.network.offering=Are you sure you want to remove this network offering? -message.confirm.disable.network.offering=Are you sure you want to disable this network offering? -message.disabling.vpc.offering=Disabling VPC offering -message.confirm.enable.vpc.offering=Are you sure you want to enable this VPC offering? -message.enabling.vpc.offering=Enabling VPC offering -message.confirm.remove.vpc.offering=Are you sure you want to remove this VPC offering? -message.confirm.disable.vpc.offering=Are you sure you want to disable this VPC offering? -mode=Mode -network.rate=Network Rate -notification.reboot.instance=Reboot instance -notification.start.instance=Start instance -notification.stop.instance=Stop instance -side.by.side=Side by Side -state.Accepted=Accepted -state.Active=Active -state.Allocated=Allocated -state.Allocating=Allocating -state.BackedUp=Backed Up -state.BackingUp=Backing Up -state.Completed=Completed -state.Creating=Creating -state.Declined=Declined -state.Destroyed=Destroyed -state.detached=Detached -state.Disabled=Disabled -state.Enabled=Enabled -state.Error=Error -state.Expunging=Expunging -state.Migrating=Migrating -state.Pending=Pending -state.Ready=Ready -state.Running=Running -state.Starting=Starting -state.Stopped=Stopped -state.Stopping=Stopping -state.Suspended=Suspended -ui.listView.filters.all=All -ui.listView.filters.mine=Mine -label.na=N/A -label.added.network.offering=Added network offering -hint.type.part.storage.tag=Type in part of a storage tag -hint.type.part.host.tag=Type in part of a host tag -hint.no.storage.tags=No storage tags found -hint.no.host.tags=No host tags found -label.availabilityZone=availabilityZone -label.diskoffering=diskoffering -title.upload.volume=Upload Volume -label.format.lower=format -label.checksum=checksum -label.assign.vms=Assign VMs -label.extractable.lower=extractable -label.globo.dns=GloboDNS -label.add.globo.dns=Add GloboDNS -label.globo.dns.configuration=GloboDNS Configuration -label.region.details=Region details -label.baremetal.rack.configuration=Baremetal Rack Configuration -label.add.baremetal.rack.configuration=Add Baremetal Rack Configuration -label.delete.baremetal.rack.configuration=Delete Baremetal Rack Configuration -message.confirm.delete.baremetal.rack.configuration=Please confirm that you want to delete Baremetal Rack Configuration. -message.added.new.nuage.vsp.controller=Added new Nuage Vsp Controller -message.added.vpc.offering=Added VPC offering -label.keyboard.language=Keyboard language -label.standard.us.keyboard=Standard (US) keyboard -label.uk.keyboard=UK keyboard -label.japanese.keyboard=Japanese keyboard -label.simplified.chinese.keyboard=Simplified Chinese keyboard -label.display.name=Display Name -label.zone.name=Zone Name -label.instances=Instances -label.event=Event -label.minutes.past.hour=minutes(s) past the hour -label.time.colon=Time: -label.min.past.the.hr=min past the hr -label.timezone.colon=Timezone: -label.keep.colon=Keep: -label.every=Every -label.day=Day -label.of.month=of month -label.add.private.gateway=Add Private Gateway -label.link.domain.to.ldap=Link Domain to LDAP -message.link.domain.to.ldap=Enable autosync for this domain in LDAP -label.ldap.link.type=Type -label.account.type=Account Type -message.desc.created.ssh.key.pair=Created a SSH Key Pair. -message.please.confirm.remove.ssh.key.pair=Please confirm that you want to remove this SSH Key Pair -message.password.has.been.reset.to=Password has been reset to -message.password.of.the.vm.has.been.reset.to=Password of the VM has been reset to -message.question.are.you.sure.you.want.to.add=Are you sure you want to add -label.domain.details=Domain details -label.account.details=Account details -label.user.details=User details -label.service.offering.details=Service offering details -label.system.service.offering.details=System service offering details -label.disk.offering.details=Disk offering details -label.network.offering.details=Network offering details -label.remove.this.physical.network=Remove this physical network -label.physical.network.name=Physical network name -label.save.changes=Save changes -label.autoscale.configuration.wizard=AutoScale Configuration Wizard -label.health.check.wizard=Health Check Wizard -label.health.check.message.desc=Your load balancer will automatically perform health checks on your cloudstack instances and only route traffic to instances that pass the health check -label.health.check.configurations.options=Configuration Options: -label.health.check.advanced.options=Advanced Options: -label.add.isolated.guest.network.with.sourcenat=Add Isolated Guest Network with SourceNat -message.network.remote.access.vpn.configuration=Remote Access VPN configuration has been generated, but it failed to apply. Please check connectivity of the network element, then re-try. -label.vpc.router.details=VPC Router Details -label.edit.rule=Edit rule -label.advanced.search=Advanced Search -label.internal.lb=Internal LB -label.public.lb=Public LB -label.acl.list.rules=ACL List Rules -label.static.routes=Static Routes -label.network.details=Network Details -label.scaleup.policy=ScaleUp Policy -label.scaledown.policy=ScaleDown Policy -label.configure.sticky.policy=Configure Sticky Policy -label.please.complete.the.following.fields=Please complete the following fields -message.desc.add.new.lb.sticky.rule=Add new LB sticky rule -label.ssh.key.pairs=SSH Key Pairs -message.desc.create.ssh.key.pair=Please fill in the following data to create or register a ssh key pair.

(1) If public key is set, CloudStack will register the public key. You can use it through your private key.

(2) If public key is not set, CloudStack will create a new SSH Key pair. In this case, please copy and save the private key. CloudStack will not keep it.
-message.removed.ssh.key.pair=Removed a SSH Key Pair -message.please.select.ssh.key.pair.use.with.this.vm=Please select a ssh key pair you want this VM to use: -message.configure.firewall.rules.allow.traffic=Configure the rules to allow Traffic -message.configure.firewall.rules.block.traffic=Configure the rules to block Traffic -message.ldap.group.import=All The users from the given group name will be imported -label.vpn.force.encapsulation=Force UDP Encapsulation of ESP Packets diff --git a/client/WEB-INF/classes/resources/messages_ar.properties b/client/WEB-INF/classes/resources/messages_ar.properties deleted file mode 100644 index d1832c456a4f..000000000000 --- a/client/WEB-INF/classes/resources/messages_ar.properties +++ /dev/null @@ -1,284 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=\u062a\u063a\u064a\u0631 \u062e\u0635\u0627\u0626\u0635 \u0627\u0644\u0639\u0646\u0635\u0631 -confirm.enable.s3=\u0641\u0636\u0644\u0627 \u0642\u0645 \u0628\u062a\u0639\u0628\u0626\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u0642\u0627\u062f\u0645\u0629 \u0644\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 S3 \u0644\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629. -instances.actions.reboot.label=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c -label.accept.project.invitation=\u0642\u0628\u0648\u0644 \u062f\u0639\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.action.delete.system.service.offering=\u062d\u0630\u0641 \u0646\u0638\u0627\u0645 \u062a\u0642\u062f\u064a\u0645 \u0627\u0644\u062e\u062f\u0645\u0629 -label.action.disable.physical.network=\u062a\u0639\u0637\u064a\u0644 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629 -label.action.enable.physical.network=\u062a\u0645\u0643\u064a\u0646 \u0634\u0628\u0643\u0629 \u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629 -label.activate.project=\u062a\u0641\u0639\u064a\u0644 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.add.accounts.to=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a \u0625\u0644\u0649 -label.add.accounts=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628\u0627\u062a -label.add.account.to.project=\u0625\u0636\u0627\u0641\u0629 \u062d\u0633\u0627\u0628 \u0644\u0644\u0645\u0634\u0631\u0648\u0639 -label.add.ACL=\u0625\u0636\u0627\u0641\u0629 ACL -label.add.network.ACL=\u0625\u0636\u0627\u0641\u0629 \u0634\u0628\u0643\u0629 ACL -label.add.new.gateway=\u0623\u0636\u0641 \u0628\u0648\u0627\u0628\u0629 \u062c\u062f\u064a\u062f\u0629 -label.add.new.tier=\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629 \u062c\u062f\u064a\u062f\u0629 -label.add.port.forwarding.rule=\u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0639\u062f\u0629 \u0645\u0646\u0641\u0630 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 -label.add.route=\u0625\u0636\u0627\u0641\u0629 \u0645\u0633\u0627\u0631 -label.add.rule=\u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0639\u062f\u0629 -label.add.static.route=\u0625\u0636\u0627\u0641\u0629 \u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a -label.add.to.group=\u0625\u0636\u0627\u0641\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u062c\u0645\u0648\u0639\u0629 -label.add.VM.to.tier=\u0625\u0636\u0627\u0641\u0629 \u062c\u0647\u0627\u0632 \u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0641\u064a \u0637\u0628\u0642\u0629 -label.add.vpc=\u0625\u0636\u0627\u0641\u0629 \u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 -label.add.VPN.gateway=\u0623\u0636\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -label.allocated=\u062a\u062e\u0635\u064a\u0635 -label.apply=\u062a\u0637\u0628\u064a\u0642 -label.associated.network=\u0634\u0628\u0643\u0629 \u0645\u0631\u062a\u0628\u0637\u0629 -label.broadcast.uri=\u0628\u062b \u0627\u0644\u0631\u0627\u0628\u0637 -label.broadcat.uri=\u0628\u062b \u0627\u0644\u0631\u0627\u0628\u0637 -label.change.value=\u062a\u063a\u064a\u0631 \u0627\u0644\u0642\u064a\u0645\u0629 -label.CIDR.list=\u0642\u0627\u0626\u0645\u0629 CIDR -label.CIDR.of.destination.network=CIDR \u0627\u0644\u062e\u0627\u0635 \u0628\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u0648\u062c\u0647\u0629. -label.clean.up=\u062a\u0646\u0638\u064a\u0641 -label.clear.list=\u0645\u0633\u062d \u0627\u0644\u0642\u0627\u0626\u0645\u0629 -label.configuration=\u062a\u0631\u062a\u064a\u0628 -label.configure.network.ACLs=\u0636\u0628\u0637 \u0634\u0628\u0643\u0629 ACLs -label.configure=\u0642\u0645 \u0628\u062a\u0643\u0648\u064a\u0646 -label.configure.vpc=\u062a\u0643\u0648\u064a\u0646 VPC -label.corrections.saved=\u062a\u0645 \u062d\u0641\u0638 \u0627\u0644\u062a\u0635\u062d\u064a\u062d\u0627\u062a -label.cpu.mhz=\u0648\u062d\u062f\u0629 \u0627\u0644\u0645\u0639\u0627\u0644\u062c\u0629 \u0627\u0644\u0645\u0631\u0643\u0632\u064a\u0629 (\u0628\u0627\u0644\u0645\u064a\u063a\u0627\u0647\u064a\u0631\u062a\u0632) -label.cpu=\u0648 \u0645 \u0645 -label.create.project=\u0623\u0646\u0634\u0626 \u0645\u0634\u0631\u0648\u0639 -label.create.VPN.connection=\u0625\u0646\u0634\u0627\u0621 \u0627\u062a\u0635\u0627\u0644 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -label.dead.peer.detection=\u0643\u0634\u0641 \u0627\u0644\u0642\u0631\u064a\u0646 \u0627\u0644\u0645\u0641\u0642\u0648\u062f -label.decline.invitation=\u0631\u0641\u0636 \u0627\u0644\u062f\u0639\u0648\u0629 -label.default=\u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a -label.default.view=\u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0639\u0631\u0636 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 -label.delete.gateway=\u0627\u062d\u0630\u0641 \u0627\u0644\u0628\u0648\u0627\u0628\u0629 -label.delete.project=\u062d\u0630\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.delete.VPN.connection=\u0627\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -label.delete.VPN.customer.gateway=\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 VPN \u0627\u0644\u0645\u062e\u0635\u0635\u0629 -label.delete.VPN.gateway=\u0627\u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -label.destroy=\u0647\u062f\u0645 -label.devices=\u0627\u0644\u0623\u062c\u0647\u0632\u0629 -label.direct.ips=\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0645\u0634\u062a\u0631\u0643\u0629 IPs -label.DNS.domain.for.guest.networks=\u0645\u062c\u0627\u0644 DNS \u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0632\u0627\u0626\u0631 -label.dns=\u0646\u0638\u0627\u0645 \u062a\u0633\u0645\u064a\u0629 \u0627\u0644\u0645\u062c\u0627\u0644 DNS -label.drag.new.position=\u0627\u0633\u062d\u0628 \u0644\u0645\u0648\u0642\u0641 \u062c\u062f\u064a\u062f -label.edit.network.details=\u062a\u062d\u0631\u064a\u0631 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 -label.edit.project.details=\u0627\u0636\u0627\u0641\u0629 \u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.edit.tags=\u062a\u0639\u062f\u064a\u0644 \u0627\u0644\u0639\u0644\u0627\u0645\u0627\u062a -label.edit.vpc=\u062a\u0639\u062f\u064a\u0644 VPC -label.egress.rules=\u0642\u0648\u0627\u0639\u062f \u0627\u0644\u062e\u0631\u0648\u062c -label.elastic=\u0645\u0631\u0646 -label.enable.s3=\u062a\u0645\u0643\u064a\u0646 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u062b\u0627\u0646\u0648\u064a S3 -label.endpoint=\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064a\u0629 -label.error=\u062e\u0637\u0623 -label.ESP.lifetime=\u0639\u0645\u0631 ESP (\u062b\u0627\u0646\u064a\u0629) -label.ESP.policy=\u0633\u064a\u0627\u0633\u0629 ESP -label.failed=\u062e\u0637\u0623 -label.filterBy=\u062a\u0635\u0641\u064a\u0629 \u062d\u0633\u0628 -label.full.path=\u0645\u0633\u0627\u0631 \u0643\u0627\u0645\u0644 -label.gpu=\u0648\u0639\u0631 -label.guest.type=\u0646\u0648\u0639 \u0627\u0644\u0636\u064a\u0641 -label.IKE.lifetime=\u0639\u0645\u0631 IKE (\u062b\u0627\u0646\u064a\u0629) -label.IKE.policy=\u0633\u064a\u0627\u0633\u0629 IKE -label.instances=\u0627\u0644\u062d\u0627\u0644\u0627\u062a -label.invitations=\u062f\u0639\u0648\u0627\u062a -label.invited.accounts=\u062f\u0639\u0648\u0629 \u062d\u0633\u0627\u0628\u0627\u062a -label.invite.to=\u062f\u0639\u0648\u0629 \u0644\u0640 -label.IPsec.preshared.key=\u0645\u0641\u062a\u0627\u062d \u0623\u0645\u0646 \u0628\u0631\u0648\u062a\u0648\u0643\u0648\u0644 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u062a\u0645\u062a \u0645\u0634\u0627\u0631\u0643\u062a\u0647 \u0645\u0633\u0628\u0642\u0627 -label.isolation.uri=\u0639\u0632\u0644 \u0627\u0644\u0631\u0627\u0628\u0637 -label.keyboard.type=\u0646\u0648\u0639 \u0644\u0648\u062d\u0629 \u0627\u0644\u0645\u0641\u0627\u062a\u064a\u062d -label.lb.algorithm.leastconn=\u0623\u0642\u0644 \u0627\u0644\u0625\u062a\u0635\u0627\u0644\u0627\u062a -label.lb.algorithm.source=\u0645\u0635\u062f\u0631 -label.make.project.owner=\u062c\u0639\u0644 \u0627\u0644\u062d\u0633\u0627\u0628 \u0645\u0627\u0644\u0643 \u0644\u0644\u0645\u0634\u0631\u0648\u0639 -label.max.guest.limit=\u0627\u0644\u062d\u062f \u0627\u0644\u0623\u0642\u0635\u0627\u0621 \u0644\u0636\u064a\u0641 -label.memory.mb=\u0627\u0644\u0630\u0627\u0643\u0631\u0629 ( \u0628\u0627\u0644\u0645\u064a\u062c\u0627\u0628\u0627\u064a\u0628\u062a) -label.memory=\u0627\u0644\u0630\u0627\u0643\u0631\u0629 -label.menu.alerts=\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a -label.menu.all.accounts=\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a -label.menu.all.instances=\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0627\u0644\u0627\u062a -label.menu.community.isos=\u0627\u0644\u062a\u0636\u0627\u0645\u0646 \u0627\u0644\u062f\u0648\u0644\u064a \u0627\u0644\u0645\u062c\u062a\u0645\u0639\u064a -label.menu.community.templates=\u0642\u0648\u0627\u0644\u0628 \u0627\u0644\u0645\u062c\u062a\u0645\u0639 -label.menu.configuration=\u062a\u0631\u062a\u064a\u0628 -label.menu.dashboard=\u0644\u0648\u062d\u0629 \u0627\u0644\u0642\u064a\u0627\u062f\u0629 -label.menu.destroyed.instances=\u062d\u0627\u0644\u0627\u062a \u0627\u0644\u062a\u062f\u0645\u064a\u0631 -label.menu.disk.offerings=\u0639\u0631\u0648\u0636 \u0627\u0644\u0642\u0631\u0635 -label.menu.domains=\u0627\u0644\u0645\u062c\u0627\u0644\u0627\u062a -label.menu.events=\u0623\u062d\u062f\u0627\u062b -label.menu.featured.isos=\u0645\u0645\u064a\u0632\u0627\u062a \u0627\u0644\u062a\u0636\u0627\u0645\u0646 \u0627\u0644\u062f\u0648\u0644\u064a -label.menu.featured.templates=\u0642\u0648\u0627\u0644\u0628 \u0645\u0645\u064a\u0632\u0629 -label.menu.global.settings=\u0627\u0644\u0625\u0639\u062f\u0627\u062f\u0627\u062a \u0627\u0644\u0639\u0645\u0648\u0645\u064a\u0629 -label.menu.instances=\u0627\u0644\u062d\u0627\u0644\u0627\u062a -label.metrics.allocated=\u062a\u062e\u0635\u064a\u0635 -label.metrics.disk.allocated=\u062a\u062e\u0635\u064a\u0635 -label.metrics.scope=\u0627\u0644\u0645\u062c\u0627\u0644 -label.migrate.instance.to.host=\u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0645\u0636\u064a\u0641 \u0622\u062e\u0631 -label.migrate.instance.to.ps=\u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629 -label.migrate.to.host=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u0645\u0636\u064a\u0641 -label.migrate.to.storage=\u0627\u0644\u062a\u062d\u0648\u0644 \u0625\u0644\u0649 \u0627\u0644\u062a\u062e\u0632\u064a\u0646 -label.move.down.row=\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644 \u0628\u0635\u0641 \u0648\u0627\u062d\u062f -label.move.to.bottom=\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0633\u0641\u0644 -label.move.to.top=\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0623\u0639\u0644\u0649 -label.move.up.row=\u0627\u0644\u0627\u0646\u062a\u0642\u0627\u0644 \u0625\u0644\u0649 \u0627\u0644\u0623\u0639\u0644\u0649 \u0628\u0635\u0641 \u0648\u0627\u062d\u062f -label.my.network=\u0634\u0628\u0643\u062a\u064a -label.my.templates=\u0642\u0648\u0627\u0644\u0628\u064a -label.network.ACLs=\u0634\u0628\u0643\u0629 ACLs -label.network.ACL.total=\u0625\u062c\u0645\u0627\u0644 \u0634\u0628\u0643\u0629 ACL -label.network.ACL=\u0634\u0628\u0643\u0629 ACL -label.networks=\u0627\u0644\u0634\u0628\u0643\u0627\u062a -label.new.project=\u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f -label.new=\u062c\u062f\u064a\u062f -label.no.data=\u0644\u0627 \u064a\u0648\u062c\u062f \u0628\u064a\u0627\u0646\u0627\u062a \u0644\u0644\u0639\u0631\u0636 -label.no.thanks=\u0644\u0627\u061b \u0634\u0643\u0631\u0627\u064b -label.notifications=\u0627\u0644\u062a\u0646\u0628\u064a\u0647\u0627\u062a -label.ok=\u0645\u0648\u0627\u0641\u0642 -label.order=\u062a\u0631\u062a\u064a\u0628 -label.previous=\u0627\u0644\u0633\u0627\u0628\u0642 -label.private.Gateway=\u0645\u0646\u0641\u0630\\Gateway \u062e\u0627\u0635 -label.project.invite=\u062f\u0639\u0648\u0629 \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.project.name=\u0627\u0633\u0645 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.projects=\u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639 -label.project=\u0645\u0634\u0631\u0648\u0639 -label.project.view=\u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.quickview=\u0646\u0638\u0631\u0629 \u0633\u0631\u064a\u0639\u0629 -label.quota.fullsummary=\u062c\u0645\u064a\u0639 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a -label.reboot=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 -label.remind.later=\u0630\u0643\u0631\u0646\u064a \u0644\u0627\u062d\u0642\u0627\u064b -label.remove.ACL=\u0625\u0632\u0627\u0644\u0629 ACL -label.remove.static.route=\u0625\u0632\u0627\u0644\u0629 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 \u062b\u0627\u0628\u062a -label.remove.tier=\u0625\u0636\u0627\u0641\u0629 \u0637\u0628\u0642\u0629 -label.remove.vpc=\u0625\u0632\u0627\u0644\u0629 VPC -label.reset.VPN.connection=\u0625\u0639\u0627\u062f\u0629 \u062a\u0639\u064a\u064a\u0646 \u0627\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -label.restart.network=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 -label.restart.required=\u0645\u0637\u0644\u0648\u0628 \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u062a\u0634\u063a\u064a\u0644 -label.restart.vpc=\u0625\u0639\u062f\u0627\u0629 \u062a\u0634\u063a\u064a\u0644 VPC -label.restore=\u0625\u0633\u062a\u0639\u0627\u062f\u0629 -label.review=\u0645\u0631\u0627\u062c\u0639\u0629 -label.revoke.project.invite=\u0625\u0644\u063a\u0627\u0621 \u0627\u0644\u062f\u0639\u0648\u0629 -label.s3.access_key=\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0648\u0635\u0648\u0644 -label.s3.bucket=\u062f\u0644\u0648 -label.s3.connection_timeout=\u0645\u0647\u0644\u0629 \u0627\u0644\u0627\u062a\u0635\u0627\u0644 -label.s3.endpoint=\u0646\u0642\u0637\u0629 \u0627\u0644\u0646\u0647\u0627\u064a\u0629 -label.s3.max_error_retry=\u0623\u0642\u0635\u0649 \u062e\u0637\u0623 \u0641\u064a \u0625\u0639\u0627\u062f\u0629 \u0627\u0644\u0645\u062d\u0627\u0648\u0644\u0629 -label.s3.secret_key=\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0633\u0631\u064a -label.s3.socket_timeout=\u0645\u0647\u0644\u0629 \u0627\u0644\u0645\u0642\u0628\u0633 -label.s3.use_https=\u0627\u0633\u062a\u062e\u062f\u0645 HTTPS -label.scope=\u0627\u0644\u0645\u062c\u0627\u0644 -label.search=\u0628\u062d\u062b -label.secret.key=\u0627\u0644\u0645\u0641\u062a\u0627\u062d \u0627\u0644\u0633\u0631\u064a -label.select.a.template=\u0627\u062e\u062a\u0631 \u0642\u0627\u0644\u0628 -label.select.project=\u062d\u062f\u062f \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.select.tier=\u062d\u062f\u062f \u0637\u0628\u0642\u0629 -label.select-view=\u062d\u062f\u062f \u0637\u0631\u064a\u0642\u0629 \u0627\u0644\u0639\u0631\u0636 -label.service.capabilities=\u0642\u062f\u0631\u0627\u062a \u0627\u0644\u062e\u062f\u0645\u0629 -label.setup=\u0627\u0644\u062a\u062b\u0628\u064a\u062a -label.site.to.site.VPN=\u0645\u0648\u0642\u0639 \u0625\u0644\u0649 \u0645\u0648\u0642\u0639-\u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0627\u0644\u0638\u0627\u0647\u0631\u064a\u0629 VPN -label.specify.IP.ranges=\u062a\u062d\u062f\u064a\u062f \u0646\u0637\u0627\u0642\u0627\u062a IP -label.sticky.tablesize=\u062d\u062c\u0645 \u0627\u0644\u062c\u062f\u0648\u0644 -label.stop=\u062a\u0648\u0642\u0641 -label.super.cidr.for.guest.networks=CIDR \u0645\u0645\u062a\u0627\u0632 \u0644\u0634\u0628\u0643\u0627\u062a \u0627\u0644\u0636\u064a\u0641. -label.supported.services=\t\u0627\u0644\u062e\u062f\u0645\u0627\u062a \u0627\u0644\u0645\u062f\u0639\u0648\u0645\u0629 -label.suspend.project=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -label.tier.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0637\u0628\u0642\u0629 -label.tier=\u0637\u0628\u0642\u0629 -label.upload=\u0631\u0641\u0639 -label.view.all=\u0639\u0631\u0636 \u0627\u0644\u0643\u0644 -label.viewing=\u0639\u0631\u0636 -label.view=\u0639\u0631\u0636 -label.vm.destroy=\u0647\u062f\u0645 -label.vm.reboot=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 -label.VMs.in.tier=\u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0641\u064a \u0637\u0628\u0642\u0629 -label.vm.stop=\u062a\u0648\u0642\u0641 -label.volume.limits=\u062d\u062f\u0648\u062f \u0627\u0644\u0645\u0646\u0637\u0642\u0629 -label.vpc.id=\u0647\u0648\u064a\u0629 \u062e\u0627\u0635\u0629 \u0628\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 -label.VPC.router.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u062c\u0647\u0627\u0632 \u0627\u0644\u062a\u0648\u062c\u064a\u0647 VPC -label.vpc=\u0633\u062d\u0627\u0628\u0629 \u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u062e\u0627\u0635\u0629 VPC -label.VPN.connection=\u0625\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -label.vpn.customer.gateway=\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0644\u0644\u0639\u0645\u064a\u0644 -label.VPN.customer.gateway=\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 \u0644\u0644\u0639\u0645\u064a\u0644 -label.VPN.gateway=\u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -label.waiting=\u0642\u064a\u062f \u0627\u0644\u0625\u0646\u062a\u0638\u0627\u0631 -label.warn=\u062a\u062d\u0630\u064a\u0631 -label.wednesday=\u0627\u0644\u0623\u0631\u0628\u0639\u0627\u0621 -label.weekly=\u0625\u0633\u0628\u0648\u0639\u064a -label.welcome.cloud.console=\u0645\u0631\u062d\u0628\u0627 \u0628\u0643\u0645 \u0641\u064a \u0648\u062d\u062f\u0629 \u0627\u0644\u062a\u062d\u0643\u0645 \u0627\u0644\u0625\u0631\u0627\u062f\u064a\u0629 -label.welcome=\u0645\u0631\u062d\u0628\u0627 -label.yes=\u0646\u0639\u0645 -label.zone.details=\u062a\u0641\u0627\u0635\u064a\u0644 \u0627\u0644\u0645\u0646\u0637\u0642\u0629 -label.zone.step.1.title=\u0627\u0644\u062e\u0637\u0648\u0629 1 \\\: \u0639\u0644\u0649 .<\u0642\u0648\u064a> \u0627\u062e\u062a\u0631 \u0634\u0628\u0643\u0629 -label.zone.step.2.title=\u0627\u0644\u062e\u0637\u0648\u0629 2 \\\: <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0645\u0646\u0637\u0642\u0629 -label.zone.step.3.title=\u0627\u0644\u062e\u0637\u0648\u0629 3 \\\: \u0639\u0644\u0649 <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u062f -label.zone.step.4.title=\u0627\u0644\u062e\u0637\u0648\u0629 4 \\\: <\u0642\u0648\u064a> \u0625\u0636\u0627\u0641\u0629 \u0645\u062c\u0645\u0648\u0639\u0629 IP <\\\u0642\u0648\u064a> -label.zone.wide=\u0645\u0646\u0637\u0642\u0629 \u0648\u0627\u0633\u0639\u0629 -label.zoneWizard.trafficType.guest=\u0627\u0644\u0636\u064a\u0641 \\\: \u0627\u0644\u062d\u0631\u0643\u0629 \u0628\u064a\u0646 \u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0644\u0644\u0645\u0633\u062a\u062e\u062f\u0645 \u0627\u0644\u0646\u0647\u0627\u0626\u064a. -label.zoneWizard.trafficType.management=\u0625\u062f\u0627\u0631\u0629\\\: \u0627\u0644\u062d\u0631\u0643\u0629 \u0628\u064a\u0646 \u0627\u0644\u0645\u0648\u0627\u0631\u062f \u0627\u0644\u062f\u0627\u062e\u0644\u064a\u0629 \u0644 \u0643\u0644\u0627\u0648\u062f \u0633\u062a\u0627\u0643 \u060c \u0645\u062a\u0636\u0645\u0646\u0629 \u0623\u064a \u062c\u0632\u0621 \u064a\u062a\u0635\u0644 \u0628\u062e\u0627\u062f\u0645\\\u0633\u064a\u0631\u0641\u0631 \u0627\u0644\u0625\u062f\u0627\u0631\u0629 \u060c \u0645\u062b\u0644 \u0627\u0644\u0645\u0636\u064a\u0641\u0627\u062a \u0648 \u0623\u0646\u0638\u0645\u0629 \u0643\u0644\u0627\u0648\u062f \u0633\u062a\u0627\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629. -label.zoneWizard.trafficType.public=\u0627\u0644\u0639\u0627\u0645\u0629 \\\: \u0627\u0644\u0645\u0631\u0648\u0631 \u0628\u064a\u0646 \u0627\u0644\u0625\u0646\u062a\u0631\u0646\u062a \u0648\u0627\u0644\u0623\u062c\u0647\u0632\u0629 \u0627\u0644\u0638\u0627\u0647\u0631\u064a\u0629 \u0641\u064a \u0627\u0644\u0633\u062d\u0627\u0628\u0629. -label.zoneWizard.trafficType.storage=\u0627\u0644\u062a\u062e\u0632\u064a\u0646 \\\: \u0627\u0644\u0645\u0631\u0648\u0631 \u0628\u064a\u0646 \u0645\u0644\u0642\u0645\u0627\u062a \u0627\u0644\u062a\u062e\u0632\u064a\u0646 \u0627\u0644\u0627\u0628\u062a\u062f\u0627\u0626\u064a\u0629 \u0648\u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629\u060c \u0645\u062b\u0644 \u0642\u0648\u0627\u0644\u0628 VM \u0648\u0627\u0644\u0644\u0642\u0637\u0627\u062a -message.acquire.new.ip.vpc=\u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0641\u064a \u0627\u0644\u062d\u0635\u0648\u0644 \u0639\u0644\u0649 \u0628\u0648\u0631\u062a\u0648\u0643\u0648\u0644 \u0625\u0646\u062a\u0631\u0646\u062a \u062c\u062f\u064a\u062f \u0644\u0647\u0630\u0627 \u0627\u0644\u062d\u0627\u0633\u0648\u0628 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a. -message.action.delete.system.service.offering=\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u062e\u062f\u0645\u0629 \u0627\u0644\u0646\u0638\u0627\u0645 \u0627\u0644\u0645\u0642\u062f\u0645\u0629. -message.action.disable.physical.network=\u0641\u0636\u0644\u0627 \u060c \u0623\u0643\u0651\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0647 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629 -message.action.enable.physical.network=\u0641\u0636\u0644\u0627 \u060c \u0623\u0643\u0651\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0645\u0643\u064a\u0646 \u0647\u0630\u0647 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0641\u064a\u0632\u064a\u0627\u0626\u064a\u0629 -message.activate.project=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0641\u0639\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f -message.add.domain=\u064a\u0631\u062c\u0649 \u062a\u062d\u062f\u064a\u062f \u0627\u0644\u0645\u062c\u0627\u0644 \u0627\u0644\u0641\u0631\u0639\u064a \u0627\u0644\u0630\u064a \u062a\u0631\u064a\u062f \u0625\u0646\u0634\u0627\u0621 \u062a\u062d\u062a \u0647\u0630\u0627 \u0627\u0644\u0646\u0637\u0627\u0642 -message.add.new.gateway.to.vpc=\u0641\u0636\u0644\u0627 \u062d\u062f\u062f \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0644\u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u0627\u0628\u0629 gateway \u0644\u0647\u0630\u0647 \u0627\u0644\u0633\u062d\u0627\u0628\u0629 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u062e\u0627\u0635\u0629 VPC -message.add.system.service.offering=\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0639\u0628\u0626\u0629 \u0627\u0644\u0628\u064a\u0627\u0646\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0644\u0625\u0636\u0627\u0641\u0629 \u0646\u0638\u0627\u0645 \u062c\u062f\u064a\u062f \u0644\u0637\u0631\u062d -message.add.VPN.gateway=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0625\u0636\u0627\u0641\u0629 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN -message.after.enable.s3=\u062a\u0645 \u0625\u0639\u062f\u0627\u062f \u0627\u0644\u062a\u062e\u0632\u064a\u0646 S3 \u0644\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u062b\u0627\u0646\u0648\u064a\u0629. \u062a\u0646\u0648\u064a\u0647 \: \u0639\u0646\u062f \u0645\u063a\u0627\u062f\u0631\u062a\u0643 \u0644\u0647\u0630\u0647 \u0627\u0644\u0635\u0641\u062d\u0629 \u0644\u0646 \u064a\u0643\u0648\u0646 \u0628\u0625\u0645\u0643\u0627\u0646\u0643 \u0625\u0639\u0627\u062f\u0629 \u0636\u0628\u0637 S3 \u0645\u0631\u0629 \u0623\u062e\u0631\u0649. -message.confirm.join.project=\u0646\u0631\u062c\u0648 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0627\u0644\u0645\u0634\u0627\u0631\u0643\u0629 \u0641\u064a \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -message.decline.invitation=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0631\u0641\u0636 \u0647\u0630\u0647 \u0627\u0644\u062f\u0639\u0648\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639\u061f -message.delete.gateway=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0627\u0644\u0628\u0648\u0627\u0628\u0629 -message.delete.project=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062d\u0630\u0641 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f -message.delete.user=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062d\u0630\u0641 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 -message.delete.VPN.connection=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN -message.delete.VPN.gateway=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0628\u0648\u0627\u0628\u0629 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 -message.detach.disk=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0641\u0635\u0644 \u0647\u0630\u0627 \u0627\u0644\u0642\u0631\u0635\u061f -message.disable.user=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u0639\u0637\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 -message.enable.account=\u0627\u0644\u0631\u062c\u0627\u0621 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u062a\u0645\u0643\u064a\u0646 \u0647\u0630\u0627 \u0627\u0644\u062d\u0633\u0627\u0628. -message.enable.user=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u0641\u0639\u064a\u0644 \u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 -message.generate.keys=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u0625\u0646\u0634\u0627\u0621 \u0645\u0641\u0627\u062a\u064a\u062d \u062c\u062f\u064a\u062f\u0629 \u0644\u0647\u0630\u0627 \u0627\u0644\u0645\u0633\u062a\u062e\u062f\u0645 -message.instanceWizard.noTemplates=\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0642\u0648\u0627\u0644\u0628 \u0645\u062a\u0627\u062d\u0629\u061b \u064a\u0631\u062c\u0649 \u0625\u0636\u0627\u0641\u0629 \u0642\u0627\u0644\u0628 \u0645\u062a\u0648\u0627\u0641\u0642\u060c \u0648\u0625\u0639\u0627\u062f\u0629 \u0625\u0637\u0644\u0627\u0642 \u0627\u0644\u0645\u0639\u0627\u0644\u062c . -message.join.project=\u0644\u0642\u062f \u0627\u0646\u0636\u0645\u0645\u062a \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639. \u064a\u0631\u062c\u0649 \u0627\u0644\u062a\u0628\u062f\u064a\u0644 \u0625\u0644\u0649 \u0637\u0631\u064a\u0642\u0629 \u0639\u0631\u0636 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u0644\u0631\u0624\u064a\u0629 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 -message.migrate.instance.to.host=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0645\u0636\u064a\u0641 \u0622\u062e\u0631. -message.migrate.instance.to.ps=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0646\u0642\u0644 \u0627\u0644\u0642\u0627\u0644\u0628 \u0625\u0644\u0649 \u0627\u0644\u0630\u0627\u0643\u0631\u0629 \u0627\u0644\u0623\u0633\u0627\u0633\u064a\u0629. -message.no.projects.adminOnly=\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0645\u0634\u0627\u0631\u064a\u0639.
\u0627\u0644\u0631\u062c\u0627\u0621 \u0637\u0644\u0628 \u0645\u0646 \u0627\u0644\u0645\u0633\u0624\u0648\u0644 \u0625\u0646\u0634\u0627\u0621 \u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f. -message.no.projects=\u0644\u064a\u0633 \u0644\u062f\u064a\u0643 \u0623\u064a \u0645\u0634\u0627\u0631\u064a\u0639.
\u064a\u0631\u062c\u0649 \u0625\u0646\u0634\u0627\u0621 \u0645\u0634\u0631\u0648\u0639 \u062c\u062f\u064a\u062f \u0645\u0646 \u0642\u0633\u0645 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639. -message.pending.projects.1=\u0644\u062f\u064a\u0643 \u062f\u0639\u0648\u0627\u062a \u0645\u0634\u0631\u0648\u0639 \u0645\u0639\u0644\u0642\u0629/\: -message.pending.projects.2=\u0644\u0639\u0631\u0636\u060c \u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u0630\u0647\u0627\u0628 \u0625\u0644\u0649 \u0642\u0633\u0645 \u0627\u0644\u0645\u0634\u0627\u0631\u064a\u0639\u060c \u062b\u0645 \u062d\u062f\u062f \u062f\u0639\u0648\u0627\u062a \u0645\u0646 \u0627\u0644\u0642\u0627\u0626\u0645\u0629 \u0627\u0644\u0645\u0646\u0633\u062f\u0644\u0629. -message.please.select.networks=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0627\u0644\u0634\u0628\u0643\u0627\u062a \u0644\u062c\u0647\u0627\u0632\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a -message.project.invite.sent=\u062a\u0645 \u0625\u0631\u0633\u0627\u0644 \u0627\u0644\u062f\u0639\u0648\u0629 ; \u0633\u064a\u062a\u0645 \u0625\u0636\u0627\u0641\u062a\u0647\u0645 \u0625\u0644\u0649 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u0628\u0645\u062c\u0631\u062f \u0642\u0628\u0648\u0644 \u0627\u0644\u062f\u0639\u0648\u0629 -message.remove.vpc=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u062d\u0630\u0641 \u0627\u0644\u0640VPC -message.reset.password.warning.notPasswordEnabled=\u0627\u0644\u0642\u0627\u0644\u0628 \u0644\u0647\u0630\u0627 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u062a\u0645 \u0627\u0646\u0634\u0627\u0626\u0647 \u0645\u0646 \u062f\u0648\u0646 \u0643\u0644\u0645\u0629 \u0645\u0631\u0648\u0631 \u0645\u0645\u0643\u0646\u0629 -message.reset.password.warning.notStopped=\u064a\u062c\u0628 \u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0646\u0645\u0648\u0630\u062c \u0627\u0644\u062e\u0627\u0635 \u0628\u0643 \u0642\u0628\u0644 \u0645\u062d\u0627\u0648\u0644\u0629 \u062a\u063a\u064a\u064a\u0631 \u0643\u0644\u0645\u0629 \u0627\u0644\u0645\u0631\u0648\u0631 \u0627\u0644\u062d\u0627\u0644\u064a\u0629 -message.reset.VPN.connection=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0625\u0639\u0627\u062f\u0629-\u0636\u0628\u0637 \u0625\u062a\u0635\u0627\u0644 \u0627\u0644\u0634\u0628\u0643\u0629 \u0627\u0644\u0627\u0641\u062a\u0631\u0627\u0636\u064a\u0629 \u0627\u0644\u0634\u062e\u0635\u064a\u0629 VPN -message.restart.vpc=\u064a\u0631\u062c\u0649 \u062a\u0623\u0643\u064a\u062f \u0631\u063a\u0628\u062a\u0643 \u0641\u064a \u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0640VPN -message.select.template=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u062e\u062a\u064a\u0627\u0631 \u0642\u0627\u0644\u0628 \u0644\u0645\u062b\u0627\u0644\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0627\u0644\u062c\u062f\u064a\u062f -message.suspend.project=\u0647\u0644 \u0623\u0646\u062a \u0645\u062a\u0623\u0643\u062f \u0645\u0646 \u0623\u0646\u0643 \u062a\u0631\u064a\u062f \u0625\u064a\u0642\u0627\u0641 \u0647\u0630\u0627 \u0627\u0644\u0645\u0634\u0631\u0648\u0639 \u061f -message.update.resource.count=\u0627\u0644\u0631\u062c\u0627\u0621 \u0627\u0644\u062a\u0623\u0643\u064a\u062f \u0628\u0623\u0646\u0643 \u062a\u0631\u063a\u0628 \u0628\u062a\u062d\u062f\u064a\u062b \u0645\u0635\u0627\u062f\u0631 \u0627\u0644\u062d\u0633\u0627\u0628\u0627\u062a \u0644\u0647\u0630\u0627 \u0627\u0644\u062d\u0633\u0627\u0628 -message.vm.review.launch=\u064a\u0631\u062c\u0649 \u0645\u0631\u0627\u062c\u0639\u0629 \u0627\u0644\u0645\u0639\u0644\u0648\u0645\u0627\u062a \u0627\u0644\u062a\u0627\u0644\u064a\u0629 \u0648\u062a\u0623\u0643\u062f \u0623\u0646 \u0645\u062b\u0627\u0644\u0643 \u0627\u0644\u0625\u0641\u062a\u0631\u0627\u0636\u064a \u0635\u062d\u064a\u062d \u0642\u0628\u0644 \u0627\u0644\u0625\u0646\u0637\u0644\u0627\u0642 -notification.reboot.instance=\u0625\u0639\u0627\u062f\u0629 \u062a\u0634\u063a\u064a\u0644 \u0627\u0644\u0646\u0645\u0648\u0630\u062c -notification.start.instance=\u0628\u062f\u0621 \u0627\u0644\u0646\u0645\u0648\u0630\u062c -notification.stop.instance=\u0625\u064a\u0642\u0627\u0641 \u0627\u0644\u0646\u0645\u0648\u0630\u062c -state.Accepted=\u062a\u0645 \u0627\u0644\u0642\u0628\u0648\u0644 -state.Active=\u0646\u0634\u0637 -state.Allocated=\u062a\u062e\u0635\u064a\u0635 -state.Completed=\u062a\u0645 \u0627\u0644\u0627\u0643\u0645\u0627\u0644 -state.Creating=\u0625\u0646\u0634\u0627\u0621 -state.Declined=\u062a\u0645 \u0627\u0644\u0631\u0641\u0636 -state.Destroyed=\u062f\u0645\u0631 -state.Enabled=\u062a\u0645\u0643\u064a\u0646 -state.Error=\u062e\u0637\u0623 -state.Expunging=\u0645\u062d\u0648 -state.Pending=\u0641\u064a \u0627\u0644\u0627\u0646\u062a\u0638\u0627\u0631 -state.Ready=\u062c\u0627\u0647\u0632 -state.Stopped=\u062a\u0648\u0642\u0641 -state.Suspended=\u062a\u0645 \u0627\u0644\u0625\u064a\u0642\u0627\u0641 -ui.listView.filters.all=\u0627\u0644\u0643\u0644 diff --git a/client/WEB-INF/classes/resources/messages_ca.properties b/client/WEB-INF/classes/resources/messages_ca.properties deleted file mode 100644 index 8b17a566d52d..000000000000 --- a/client/WEB-INF/classes/resources/messages_ca.properties +++ /dev/null @@ -1,298 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -confirm.enable.swift=Si us plau ompliu la seg\u00fcent informaci\u00f3 per habilitar el suport per a Swift -error.installWizard.message=Quelcom ha fallat, vost\u00e8 pot tornar enrere i corregir els errors detalls suggerime -error.password.not.match=Els camps de contrasenya no coincideixen -inline=En l\u00ednia -label.accept.project.invitation=Accpetar invitaci\u00f3 al projecte -label.action.edit.host=Editar Host -label.action.migrate.router=Migrar router -label.action.migrate.router.processing=Migrant router... -label.action.migrate.systemvm=Migrar MV de Sistema -label.action.migrate.systemvm.processing=Migrant MV de Sistema... -label.activate.project=Activar projecte -label.add.accounts=Afegir comptes -label.add.accounts.to=Afegir comptes a -label.add.account.to.project=Afegir compte al projecte -label.add.by=Afegir per -label.add.egress.rule=Afegir regla de sortida -label.add.new.F5=Afegir nou F5 -label.add.new.NetScaler=Afegir un nou NetScaler -label.add.new.SRX=Afegir nou SRX -label.add.physical.network=Afegir xarxa f\u00edsica -label.add.rule=Afegir regla -label.add.static.nat.rule=Afegir regla de NAT est\u00e0tic -label.add.to.group=Afegir a grup -label.add.vm=Afegir MV -label.add.vms=Afegir MVs -label.add.vms.to.lb=Afegir MV(s) a la regla de balanceig de c\u00e0rrega -label.add.vpn.user=Afegir usuari VPN -label.agree=D\\'acord -label.apply=Aplicar -label.bandwidth=Ample de banda -label.broadcast.domain.range=Rang del domini de broadcast -label.capacity=Capacitat -label.change.service.offering=Canvia oferta de servei -label.change.value=Canviar valor -label.clear.list=Esborra llista -label.community=Comunitat -label.compute.and.storage=Computaci\u00f3 i Emmagatzematge -label.compute=Computaci\u00f3 -label.configuration=Configuraci\u00f3 -label.configure=Configurar -label.confirm.password=Confirmar contrasenya -label.congratulations=Enorabona\! -label.continue.basic.install=Continueu amb la instal\u00b7laci\u00f3 b\u00e0sica -label.continue=Continuar -label.corrections.saved=Correccions guardades -label.create.project=Crear projecte -label.decline.invitation=Declinar invitaci\u00f3 -label.dedicated=Dedicat -label.default=Per defecte -label.delete.F5=Esborrar F5 -label.delete.NetScaler=Esborrar NetScaler -label.delete.project=Esborrar projecte -label.delete.SRX=Esborar SRX -label.delete.vpn.user=Esborrar usuari VPN -label.destination.physical.network.id=ID de xarxa f\u00edsica de dest\u00ed -label.destination.zone=Zona de dest\u00ed -label.destroy.router=Destruir router -label.dhcp=DHCP -label.disabled=Deshabilitat -label.disable.provider=Deshabilitar prove\u00efdor -label.disable.vpn=Deshabilitar VPN -label.drag.new.position=Arrosegar a la nova posici\u00f3 -label.edit.project.details=Editar detalls del projecte -label.egress.rule=Regla de sortida -label.elastic=El\u00e0stic -label.enable.provider=Habilitar prove\u00efdor -label.enable.swift=Habilitar Swift -label.enable.vpn=Habilitar VPN -label.extractable=Es pot extreure -label.f5=F5 -label.full.path=Cam\u00ed sencer -label.guest.end.ip=Fi d\\'IP per a MV -label.guest=MV -label.guest.start.ip=Inici d\\'IP per a MV -label.guest.traffic=Tr\u00e0fic de MV -label.hints=Pistes -label.installWizard.addClusterIntro.subtitle=Que \u00e9s un cluster? -label.installWizard.addClusterIntro.title=Anem a afegir un cluster -label.installWizard.addHostIntro.subtitle=Qu\u00e8 \u00e9s un amfitri\u00f3 "host"? -label.installWizard.addHostIntro.title=Anem a afegir un amfitri\u00f3 -label.installWizard.addPodIntro.subtitle=Que \u00e9s un pod? -label.installWizard.addPodIntro.title=Anem a afegir un pod -label.installWizard.addPrimaryStorageIntro.subtitle=Qu\u00e8 \u00e9s l\\'emmagatzematge primari? -label.installWizard.addPrimaryStorageIntro.title=Anem a afegir emmagatzematge primari -label.installWizard.addSecondaryStorageIntro.subtitle=Qu\u00e8 \u00e9s el emmagatzematge secundari? -label.installWizard.addSecondaryStorageIntro.title=Anem a afegir emmagatzematge secundari -label.installWizard.addZoneIntro.subtitle=Que \u00e9s una zona? -label.installWizard.addZoneIntro.title=Anem a afegir una zona -label.installWizard.addZone.title=Afegir zona -label.installWizard.click.launch=Feu clic al bot\u00f3 d\\'inici. -label.installWizard.subtitle=Auqesta guia us ajudar\u00e0 a configurar la vostra instal\u00b7laci\u00f3 de CloudStack&\#8482 -label.installWizard.title=Hola i benvigut a CloudStack&\#8482 -label.introduction.to.cloudstack=Introducci\u00f3 a la CloudStack&\#8482 -label.invitations=Invitacions -label.invite=Convidar -label.invited.accounts=Comptes convidades -label.invite.to=Convidar a -label.ip.ranges=Rangs d\\'IPs -label.item.listing=Llista d\\'articles -label.keyboard.type=Tipus de teclat -label.key=Clau -label.launch=Iniciar -label.launch.vm=Arrencar MV -label.load.balancing=Balanceig de c\u00e0rrega -label.load.balancing.policies=Pol\u00b7l\u00edtiques de balanceig de c\u00e0rrega -label.local.storage=Emmagatzemament local -label.make.project.owner=Feu la compta propiet\u00e0ria del projecte -label.management=Administraci\u00f3 -label.manage.resources=Administrar Recursos -label.max.public.ips=Max. IP p\u00fabliques -label.max.snapshots=Max. instant\u00e0nies -label.max.templates=Max. plantilles -label.max.vms=Max. MV d\\'usuari -label.max.volumes=Max. Volums -label.may.continue=Ara pot continuar -label.menu.configuration=Configuraci\u00f3 -label.migrate.instance.to.host=Migrar inst\u00e0ncia a un altre amfitri\u00f3 "Host" -label.migrate.instance.to.ps=Migrar inst\u00e0ncia a un altra emmagatzematge primari -label.migrate.router.to=Migrar router a -label.migrate.systemvm.to=Migrar MV de sistema a\: -label.mode=Mode -label.move.down.row=Moure una fila cap a baix -label.move.to.top=Moure a dalt -label.move.up.row=Moure una fla cap a dalt -label.my.network=La meva xarxa -label.my.templates=Les meves plantilles -label.netScaler=NetScaler -label.networking.and.security=Xarxa i seguretat -label.network.rate=Velocitat de xarxa -label.networks=Xarxes -label.new=Nou -label.new.project=Nou projecte -label.new.vm=Nova MV -label.nic.adapter.type=Tipus de tarja de xarxa -label.no.data=No hi ha dades -label.no.thanks=No gr\u00e0cies -label.number.of.clusters=Nombre de cl\u00fasters -label.number.of.hosts=Nombre de Hosts -label.number.of.pods=Nombre de racks -label.number.of.zones=Nombre de zones -label.ocfs2=OCFS2 -label.order=Ordre -label.physical.network.ID=ID de xarxa f\u00edsica -label.please.specify.netscaler.info=Si us plau doneu informaci\u00f3 del NetScaler -label.pod.name=Nom de rack -label.pods=Racks -label.port.forwarding.policies=Pol\u00b7l\u00edtiques de reenviament de ports -label.previous=Anterior -label.private.network=Xarxa privada -label.project.dashboard=Quadre de comandament del projecte -label.project.id=ID de projecte -label.project.invite=Convidar al projecte -label.project.name=Nom del projecte -label.project=Projecte -label.projects=Projectes -label.providers=Prove\u00efdors -label.public.network=Xarxa p\u00fablica -label.Pxe.server.type=Tipus de servidor PXE -label.redundant.state=Estat redundant -label.remind.later=Recordeu-m\\'ho despr\u00e9s -label.remove.egress.rule=Esborrar regla de sortida -label.remove.ingress.rule=Esborrar regla d\\'entrada -label.remove.pf=Esborrar regla de reenviament de port -label.remove.rule=Esborrar regla -label.remove.static.nat.rule=Esborrar regla de NAT est\u00e0tic -label.remove.vm.from.lb=Treure VM de la regla de balanceig de c\u00e0rrega -label.removing=Esborrant -label.reserved.system.gateway=Pasarel\u00b7la reservada del sistema -label.reserved.system.netmask=M\u00e0scara reservada del sistema -label.revoke.project.invite=Revocar invitaci\u00f3 -label.root.disk.controller=Controlador de disc arrel -label.save.and.continue=Desa i continua -label.select.a.template=Sel\u00b7leccioni una plantilla -label.select.a.zone=Sel\u00b7leccioni una zona -label.select.iso.or.template=Sel\u00b7leccioni ISO o plantilla -label.select.project=Sel\u00b7leccionar projecte -label.select-view=Sel\u00b7lecioni vista -label.setup=Configuraci\u00f3 -label.shutdown.provider=Apagar prove\u00efdor -label.skip.guide=Si heu utilitzat CloudStack abans, ometi aquesta guia -label.srx=SRX -label.static.nat.enabled=NAT est\u00e0tic habilitat -label.stickiness=Tend\u00e8ncia -label.sticky.mode=Mode -label.storage.traffic=Tr\u00e0fic d\\'emmagatzemament -label.subdomain.access=Acc\u00e9s de subdomini -label.suspend.project=Suspendre projecte -label.task.completed=Tasca complerta -label.timeout=Timeout -label.total.cpu=Total de CPU -label.total.CPU=Total de CPU -label.total.hosts=Total de hosts -label.total.memory=Total de RAM -label.total.storage=Total d\\'emmagatzemament -label.traffic.types=Tipus de tr\u00e0fics -label.update.project.resources=Actualitzar recursos del projecte -label.view.all=Veure tots -label.view.console=Veure consola -label.viewing=Veient -label.view.more=Veure m\u00e9s -label.view=Veure -label.virtual.router=Router virtual -label.what.is.cloudstack=Que \u00e9s CloudStack&\#8482? -label.zone.details=Detalls de la zona -label.zones=Zones -message.acquire.new.ip=Si us plau confirmeu que voleu adquirir una nova IP per aquesta xarxa. -message.action.download.iso=Si us plau confirmeu que voleu descarregar aquesta ISO. -message.action.download.template=Si us plau confirmeu que voleu descarregar aquesta plantilla. -message.activate.project=Esteu segurs d\\'activar aquest projecte? -message.add.domain=Si us plau especifiqueu el sub-domini que voleu crear sota aquest domini -message.add.guest.network=Si us plau confirmeu que voleu afegir una xarxa per a MVs -message.after.enable.swift=Swift configurat. Nota\: Quan abandoneu aquesta p\u00e0gina, no sereu capa\u00e7os de reconfigurar Swift de nou. -message.alert.state.detected=Estat d\\'alerta detectat -message.change.password=Si us plau, canvieu la contrasenya. -message.confirm.delete.F5=Si us plau confirmeu que voleu esborrar l\\'F5 -message.confirm.delete.NetScaler=Si us plau confirmeu que voleu esborrar el NetScaler -message.confirm.delete.SRX=Si us plau confirmeu que voleu esborrar l\\'SRX -message.confirm.destroy.router=Si us plau confirmeu que voleu destruir aquest router -message.confirm.disable.provider=Si us plau confirmeu que voleu deshabilitar aquest prove\u00efdor -message.confirm.enable.provider=Si us plau confirmeu que voleu habilitar aquest prove\u00efdor -message.confirm.join.project=Si us plau confirmeu que voleu unir-vos al projecte. -message.confirm.shutdown.provider=Si us plau confirmeu que voleu apagar aquest prove\u00efdor -message.decline.invitation=Esteu segurs de declinar aquesta invitaci\u00f3 per al projecte? -message.delete.project=Esteu segurs d\\'eliminar el projecte? -message.delete.user=Si us plau confirmeu que voleu esborrar aquest usuari. -message.disable.user=Si us plao confirmeu que voleu deshabilitar aquest usuari. -message.disable.vpn=\u00bfEsteu segurs de deshabilitar la VPN? -message.edit.account=Editar ("-1" indica que no hi ha limit en la quantitat de recursos a crear) -message.enable.user=Si us plau confirmeu que voleu habilitar aquest usuari. -message.enable.vpn=Si us plau confirmeu que voleu habilitar l\\'acc\u00e9s VPN per aquesta adre\u00e7a IP -message.generate.keys=Si us plau confirmeu que voleu generar noves claus per aquest usuari. -message.installWizard.click.retry=Feu clic al bot\u00f3 per tornar a intentar l\\'inici. -message.installWizard.copy.whatIsSecondaryStorage=L\\'emmagatzemament secundari s\\'associa amb una zona, i emmagatzema el seg\u00fcent\:
  • Plantilles - Imatges de SO que es poden fer servir per arrencar MVs i poden incloure altra informaci\u00f3 de configuraci\u00f3, com ara aplicacions instal\u00b7lades
  • Imatges ISO - Imatges de SO que poden ser arrencables o no
  • Snapshots de disc - copies guardades de dades de MV que poden usar-se per recuperaci\u00f3 de dades o crear altres plantilles
-message.installWizard.tooltip.addCluster.name=Un nom per al cluster. Pot ser un text de la seva elecci\u00f3 i no utilitzat per CloudStack. -message.installWizard.tooltip.addHost.hostname=El nom DNS o adre\u00e7a de l\\'amfitri\u00f3 "host". -message.installWizard.tooltip.addHost.password=Aquesta \u00e9s la contrasenya per a l\\'usuari del d\\'amunt (des de la instal\u00b7laci\u00f3 de XenServer). -message.installWizard.tooltip.addHost.username=Normalment root -message.installWizard.tooltip.addPod.name=Un nom per al pod -message.installWizard.tooltip.addPod.reservedSystemEndIp=Aquest \u00e9s el rang IP a la xarxa privada que el CloudStack fa servir per administrar MVs per al Secondary Storage i Proxy de consoles. Aquestes IP es prenen de la mateixa sub-xarxa que els servidors de virtualitzaci\u00f3. -message.installWizard.tooltip.addPod.reservedSystemGateway=La passarel\u00b7la per als amfitrions en aquest pot. -message.installWizard.tooltip.addPod.reservedSystemNetmask=La m\u00e0scara de xarxa en \u00fas en la subxarxa dels clients a utilitzar -message.installWizard.tooltip.addPod.reservedSystemStartIp=Aquest \u00e9s el rang IP a la xarxa privada que el CloudStack fa servir per administrar MVs per al Secondary Storage i Proxy de consoles. Aquestes IP es prenen de la mateixa sub-xarxa que els servidors de virtualitzaci\u00f3. -message.installWizard.tooltip.addPrimaryStorage.name=El nom per al dispositiu d\\'emmagatzematge -message.installWizard.tooltip.addPrimaryStorage.path=(per a NFS) A NFS, aquest \u00e9s el cam\u00ed exportat des del servidor. Cam\u00ed (per SharedMountPoint). Amb KVM aquest \u00e9s el cam\u00ed a cada host on es munta el emmagatzemament primari. Per exemple, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(per NFS, iSCSI, o PreSetup) La adre\u00e7a IP o nom DNS del dispositiu d\\'emmagatzematge. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=L\\'adre\u00e7a IP del servidor NFS que allotja l\\'emmagatzematge secundari -message.installWizard.tooltip.addSecondaryStorage.path=La ruta d\\'exportaci\u00f3, que es troba en el servidor que s\\'ha especificat anteriorment -message.installWizard.tooltip.configureGuestTraffic.description=Una descripci\u00f3 de la xarxa -message.installWizard.tooltip.configureGuestTraffic.guestGateway=La passarel\u00b7la que els convidats han d\\'utilitzar -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=La m\u00e0scara de xarxa en \u00fas en la subxarxa que els clients han d\\'utilitzar -message.installWizard.tooltip.configureGuestTraffic.name=Un nom per a la teva xarxa -message.instanceWizard.noTemplates=No teniu cap plantilla disponible; si us plau afegiu una plantilla disponible i torneu a usar l\\'assistent. -message.join.project=Us heu unit a un projecte. Si us pla canvieu a vista de projecte per veure el projecte. -message.migrate.instance.to.host=Si us plau, confirmi que vol migrar la inst\u00e0ncia a un altra amfitri\u00f3 "host" -message.migrate.instance.to.ps=Si us plau, confirmi que vol migrar la inst\u00e0ncia a un altra emmagatzematge primari. -message.migrate.router.confirm=Si us plau confirmeu que voleu migrar el router a\: -message.migrate.systemvm.confirm=Si us plau confirmeu que voleu migrar la MV de sistema a\: -message.no.projects.adminOnly=No teniu cap projecte.
Si us plau demaneu a l\\'administrador que us en crei un. -message.no.projects=No teniu cap projecte.
Si us plau creeu-ne un des de la secci\u00f3 de projecte. -message.pending.projects.1=Teniu invitacions pendents. -message.pending.projects.2=Per veure, si us plau aneu a la secci\u00f3 de projectes, i sel\u00b7leccioneu invitacions al desplegable. -message.project.invite.sent=Invitaci\u00f3 enviada a l\\'usuari; ser\u00e0 afegit al projecte quan accepti l\\'invitaci\u00f3 -message.select.item=Si us plau sel\u00b7leccioneu un article -message.setup.successful=Instal\u00b7laci\u00f3 del cloud correcte\! -message.suspend.project=Esteu segurs de suspendre aquest projecte? -message.update.resource.count=Si us plau confirmeu que voleu actualitzar el comptatge de recursos per aquest compte. -mode=Mode -network.rate=Velocitat de xarxa -side.by.side=Costat a costat -state.Accepted=Acceptat -state.Active=Actiu -state.Completed=Complert -state.Creating=Creant -state.Declined=Declinat -state.Disabled=Deshabilitat -state.Enabled=Habilitat -state.Expunging=Esborrant -state.Pending=Pendent -state.Ready=Preparat -state.Starting=Arrencant -state.Suspended=Susp\u00e9s diff --git a/client/WEB-INF/classes/resources/messages_de_DE.properties b/client/WEB-INF/classes/resources/messages_de_DE.properties deleted file mode 100644 index d850ab744d81..000000000000 --- a/client/WEB-INF/classes/resources/messages_de_DE.properties +++ /dev/null @@ -1,2284 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Ge\u00e4nderte Eintragseigenschaften -confirm.enable.s3=Bitte f\u00fcgen Sie die folgenden Informationen hinzu, um die Unterst\u00fctzung f\u00fcr "S3-backed Secondary Storage" hinzuzuf\u00fcgen -confirm.enable.swift=Bitte f\u00fcgen Sie die folgenden Informationen hinzu, um die Unterst\u00fctzung f\u00fcr Swift zu erm\u00f6glichen. -error.could.not.change.your.password.because.ldap.is.enabled=Fehler\! Ihr Passwort konnte nicht ge\u00e4ndert werden, weil LDAP konfiguriert wurde. -error.could.not.enable.zone=Zone konnte nicht aktiviert werden -error.installWizard.message=Etwas ging schief; Sie k\u00f6nnen zur\u00fcckgehen um m\u00f6gliche Fehler zu beheben -error.invalid.username.password=Ung\u00fcltiger Benutzername oder ung\u00fcltiges Passwort -error.login=Ihr Benutzername / Passwort stimmt nicht mit unseren Aufzeichnungen \u00fcberein. -error.menu.select=Es ist nicht m\u00f6glich dies auszuf\u00fchren, weil nichts ausgew\u00e4hlt wurde. -error.mgmt.server.inaccessible=Der Verwaltungsserver ist nicht erreichbar. Bitte versuche Sie es sp\u00e4ter noch einmal. -error.password.not.match=Die Passwortfelder stimmen nicht \u00fcberein -error.please.specify.physical.network.tags=Netzwerk-Angebote sind nicht verf\u00fcgbar solange Sie keine Tags f\u00fcr dieses physische Netzwerk auff\u00fchren. -error.session.expired=Ihre Sitzung ist abgelaufen. -error.something.went.wrong.please.correct.the.following=Etwas ging schief; bitte korrigieren Sie folgende Angaben -error.unable.to.reach.management.server=Verwaltungsserver kann nicht erreicht werden -error.unresolved.internet.name=Ihr Internetname kann nicht aufgel\u00f6st werden. -force.delete.domain.warning=Achtung\: Diese Auswahl f\u00fchrt zu einer L\u00f6schung aller untergeordneten Domains und aller angeschlossenen Konten sowie ihrer Quellen. -force.delete=Erzwinge L\u00f6schung -force.remove=Erzwinge Entfernung -force.remove.host.warning=Achtung\: Diese Auswahl wird CloudStack zum sofortigen Anhalten der virtuellen Maschine f\u00fchren, bevor der Host vom Cluster entfernt wurde. -force.stop=Erzwinge Stopp -force.stop.instance.warning=Warnung\: Das erwzungene Stoppen dieser Instanz sollte Ihre letzte Option sein. Es kann zu Datenverlust und inkonsistentem Zustand der virtuellen Maschine f\u00fchren. -hint.no.host.tags=Keine Host-Tags gefunden -hint.no.storage.tags=Keine Speicher-Tags gefunden -hint.type.part.host.tag=Teil eines Host-Tags eintragen -hint.type.part.storage.tag=Teil eines Storage-Tags eintragen -ICMP.code=ICMP-Code -ICMP.type=ICMP-Typ -image.directory=Bildverzeichnis -inline=Inline -instances.actions.reboot.label=Instanz neu starten -label.about.app=\u00dcber CloudStack -label.about=\u00dcber -label.accept.project.invitation=Projekteinladung annehmen -label.account.and.security.group=Konto, Sicherheitsgruppe -label.account=Benutzerkonto -label.account.details=Kontodetails -label.account.id=Benutzerkonto-ID -label.account.lower=Konto -label.account.name=Benutzerkonto-Name -label.accounts=Benutzerkonten -label.account.specific=Besonderheiten des Benutzerkontos -label.account.type=Benutzerkontotyp -label.acl=ACL -label.acl.id=ACL-Kennung -label.acl.list.rules=ACL-Listenregeln -label.acl.name=ACL-Name -label.acl.replaced=ACL ersetzt -label.acquire.new.ip=Neue IP erwerben -label.acquire.new.secondary.ip=Neue sekund\u00e4re IP erwerben -label.action=Aktion -label.action.attach.disk=Festplatte hinzuf\u00fcgen -label.action.attach.disk.processing=Festplatte wird hinzugef\u00fcgt.... -label.action.attach.iso=ISO hinzuf\u00fcgen -label.action.attach.iso.processing=ISO wird hinzugef\u00fcgt.... -label.action.cancel.maintenance.mode.processing=Abbruch des Wartungsmodus -label.action.cancel.maintenance.mode=Wartungsmodus abbrechen -label.action.change.password=Passwort \u00e4ndern -label.action.change.service=Dienst \u00e4ndern -label.action.change.service.processing=Dienst wird gewechselt.... -label.action.configure.samlauthorization=SAML SSO Autorisation konfigurieren -label.action.copy.ISO=ISO kopieren -label.action.copy.ISO.processing=ISO wird kopiert.... -label.action.copy.template.processing=Vorlage wird kopiert.... -label.action.copy.template=Vorlage kopieren -label.action.create.template.from.vm=Erstelle Vorlage aus VM -label.action.create.template.from.volume=Vorlage vom Volumen erstellen -label.action.create.template.processing=Vorlage wird erstellt.... -label.action.create.template=Vorlage erstellen -label.action.create.vm=Erstelle VM -label.action.create.vm.processing=VM wird erstellt.... -label.action.create.volume.processing=Volumen wird erstellt.... -label.action.create.volume=Volumen erstellen -label.action.delete.account=Benutzerkonto l\u00f6schen -label.action.delete.account.processing=Konto wird gel\u00f6scht.... -label.action.delete.cluster=L\u00f6schen des Clusters -label.action.delete.cluster.processing=Cluster wird gel\u00f6scht.... -label.action.delete.disk.offering=Festplattenangebot l\u00f6schen -label.action.delete.disk.offering.processing=Festplattenangebot wird gel\u00f6scht.... -label.action.delete.domain=L\u00f6schen der Domain -label.action.delete.domain.processing=Dom\u00e4ne wird gel\u00f6scht.... -label.action.delete.firewall=Firewall-Regel l\u00f6schen -label.action.delete.firewall.processing=Firewall wird gel\u00f6scht.... -label.action.delete.ingress.rule.processing=Zutrittsregel wird gel\u00f6scht.... -label.action.delete.ingress.rule=Zutrittsregel l\u00f6schen -label.action.delete.IP.range=IP-Bereich l\u00f6schen -label.action.delete.IP.range.processing=IP-Bereich wird gel\u00f6scht.... -label.action.delete.ISO=ISO l\u00f6schen -label.action.delete.ISO.processing=ISO wird gel\u00f6scht.... -label.action.delete.load.balancer=Lastverteilerregel l\u00f6schen -label.action.delete.load.balancer.processing=Lastverteiler wird gel\u00f6scht.... -label.action.delete.network=L\u00f6schen des Netzwerks -label.action.delete.network.processing=Netzwerk wird gel\u00f6scht.... -label.action.delete.nexusVswitch=Nexus 1000v l\u00f6schen -label.action.delete.nic=NIC entfernen -label.action.delete.physical.network=Physikalisches Netzwerk l\u00f6schen -label.action.delete.pod=Pod l\u00f6schen -label.action.delete.pod.processing=Pod wird gel\u00f6scht.... -label.action.delete.primary.storage=Hauptspeicher l\u00f6schen -label.action.delete.primary.storage.processing=Hauptspeicher wird gel\u00f6scht.... -label.action.delete.secondary.storage.processing=Sekund\u00e4rspeicher wird gel\u00f6scht.... -label.action.delete.secondary.storage=Sekund\u00e4rspeicher l\u00f6schen -label.action.delete.security.group.processing=Sicherheitsgruppe wird gel\u00f6scht.... -label.action.delete.security.group=Sicherheitsgruppe l\u00f6schen -label.action.delete.service.offering=Dienstangebot l\u00f6schen -label.action.delete.service.offering.processing=Dienstangebot wird gel\u00f6scht.... -label.action.delete.snapshot.processing=Schnappschuss wird gel\u00f6scht.... -label.action.delete.snapshot=Schnappschuss l\u00f6schen -label.action.delete.system.service.offering=Systemdienstangebot l\u00f6schen -label.action.delete.template.processing=Vorlage wird gel\u00f6scht.... -label.action.delete.template=Vorlage l\u00f6schen -label.action.delete.user=Benutzer l\u00f6schen -label.action.delete.user.processing=Benutzer wird gel\u00f6scht.... -label.action.delete.volume.processing=Volumen wird gel\u00f6scht.... -label.action.delete.volume=Volumen l\u00f6schen -label.action.delete.zone.processing=Zone wird gel\u00f6scht.... -label.action.delete.zone=Zone l\u00f6schen -label.action.destroy.instance=Die Instanz vernichten -label.action.destroy.instance.processing=Instanz wird zerst\u00f6rt.... -label.action.destroy.systemvm.processing=System-VM wird zerst\u00f6rt.... -label.action.destroy.systemvm=System-VM vernichten -label.action.detach.disk=Festplatte losl\u00f6sen -label.action.detach.disk.processing=Festplatte wird losgel\u00f6st... -label.action.detach.iso=ISO losl\u00f6sen -label.action.detach.iso.processing=ISO wird losgel\u00f6st.... -label.action.disable.account=Benutzerkonto deaktivieren -label.action.disable.account.processing=Konto wird deaktiviert.... -label.action.disable.cluster=Deaktivieren des Clusters -label.action.disable.cluster.processing=Cluster wird deaktiviert.... -label.action.disable.nexusVswitch=Nexus 1000v deaktivieren -label.action.disable.physical.network=Physikalisches Netzwerk deaktivieren -label.action.disable.pod=Deaktiviere Pod -label.action.disable.pod.processing=Pod wird deaktiviert.... -label.action.disable.static.NAT.processing=Statische NAT wird deaktiviert.... -label.action.disable.static.NAT=Statische NAT deaktivieren -label.action.disable.user=Benutzer deaktivieren -label.action.disable.user.processing=Benutzer wird deaktiviert.... -label.action.disable.zone=Deaktivieren der Zone -label.action.disable.zone.processing=Zone wird deaktiviert.... -label.action.download.ISO=ISO herunterladen -label.action.download.template=Vorlage herunterladen -label.action.download.volume.processing=Volumen wird heruntergeladen.... -label.action.download.volume=Volumen herunterladen -label.action.edit.account=Benutzerkonto bearbeiten -label.action.edit.disk.offering=Festplattenangebot bearbeiten -label.action.edit.domain=Domain bearbeiten -label.action.edit.global.setting=Globale Einstellungen bearbeiten -label.action.edit.host=Bearbeite Host -label.action.edit.instance=Instanz bearbeiten -label.action.edit.ISO=ISO bearbeiten -label.action.edit.network=Bearbeiten des Netzwerks -label.action.edit.network.offering=Netzwerkangebot bearbeiten -label.action.edit.network.processing=Netzwerk wird bearbeitet.... -label.action.edit.pod=Bearbeiten des Pods -label.action.edit.primary.storage=Hauptspeicher bearbeiten -label.action.edit.resource.limits=Resourcenlimit bearbeiten -label.action.edit.service.offering=Dienstangebot bearbeiten -label.action.edit.template=Vorlage bearbeiten -label.action.edit.user=Benutzer bearbeiten -label.action.edit.zone=Zone bearbeiten -label.action.enable.account=Konto aktivieren -label.action.enable.account.processing=Konto wird aktiviert.... -label.action.enable.cluster=Aktivieren des Clusters -label.action.enable.cluster.processing=Cluster wird aktiviert.... -label.action.enable.maintenance.mode.processing=Aktivieren des Wartungsmodus -label.action.enable.maintenance.mode=Wartungsmodus aktivieren -label.action.enable.nexusVswitch=Nexus 1000v aktivieren -label.action.enable.physical.network=Physikalisches Netzwerk aktivieren -label.action.enable.pod=Aktiviere Pod -label.action.enable.pod.processing=Pod wird aktiviert.... -label.action.enable.static.NAT.processing=Statische NAT wird aktiviert.... -label.action.enable.static.NAT=Statische NAT aktivieren -label.action.enable.user=Nutzer aktivieren -label.action.enable.user.processing=Benutzer wird aktiviert.... -label.action.enable.zone=Aktivieren der Zone -label.action.enable.zone.processing=Zone wird aktiviert.... -label.action.expunge.instance=Instanz unwiederbringlich l\u00f6schen -label.action.expunge.instance.processing=L\u00f6sche Instanz unwiederbringlich... -label.action.force.reconnect=Erzwinge wieder verbinden -label.action.force.reconnect.processing=Wieder verbinden.... -label.action.generate.keys.processing=Generiere Schl\u00fcssel... -label.action.generate.keys=Schl\u00fcssel generieren -label.action.list.nexusVswitch=Nexus 1000v auflisten -label.action.lock.account=Konto sperren -label.action.lock.account.processing=Konto wird gesperrt.... -label.action.manage.cluster.processing=Cluster wird verwaltet.... -label.action.manage.cluster=Verwalte Cluster -label.action.migrate.instance=Eine Instanz migrieren -label.action.migrate.instance.processing=Instanz migrieren -label.action.migrate.router.processing=Router wird migriert.... -label.action.migrate.router=Router migrieren -label.action.migrate.systemvm.processing=System-VM wird migriert.... -label.action.migrate.systemvm=System-VM migrieren -label.action.reboot.instance=Instanz neu starten -label.action.reboot.instance.processing=Instanz wird neu gebootet... -label.action.reboot.router.processing=Router wird neu gebootet.... -label.action.reboot.router=Router neu starten -label.action.reboot.systemvm.processing=System-VM wird neu gebootet.... -label.action.reboot.systemvm=System-VM neu starten -label.action.recurring.snapshot=Wiederkehrende Schnappsch\u00fcsse -label.action.register.iso=ISO registrieren -label.action.register.template=Vorlage von URL registrieren -label.action.release.ip=IP losl\u00f6sen -label.action.release.ip.processing=IP wird losgel\u00f6st.... -label.action.remove.host=Host entfernen -label.action.remove.host.processing=Host wird entfernt.... -label.action.reset.password=Passwort zur\u00fccksetzen -label.action.reset.password.processing=Passwort wird zur\u00fcckgesetzt.... -label.action.resize.volume.processing=Volumengr\u00f6\u00dfe wird ge\u00e4ndert.... -label.action.resize.volume=Volumengr\u00f6\u00dfe \u00e4ndern -label.action.resource.limits=Ressourcenlimits -label.action.restore.instance=Instanz wiederherstellen -label.action.restore.instance.processing=Instanz wird wiederhergestellt.... -label.action.revert.snapshot=Auf Schnappschuss zur\u00fcckkehren -label.action.revert.snapshot.processing=Es wird auf den Schnappschuss zur\u00fcckgekehrt... -label.actions=Aktionen -label.action.start.instance=Instanz beginnen -label.action.start.instance.processing=Instanz wird gestartet.... -label.action.start.router.processing=Router wird gestartet.... -label.action.start.router=Router starten -label.action.start.systemvm.processing=System-VM wird gestartet.... -label.action.start.systemvm=System-VM starten -label.action.stop.instance=Instanz stoppen -label.action.stop.instance.processing=Instanz wird gestartet.... -label.action.stop.router.processing=Routers wird gestoppt.... -label.action.stop.router=Router stoppen -label.action.stop.systemvm.processing=System-VM wird gestoppt.... -label.action.stop.systemvm=System-VM stoppen -label.action.take.snapshot.processing=Schnappschuss wird gemacht.... -label.action.take.snapshot=Schnappschuss erstellen -label.action.unmanage.cluster.processing=Cluster wird nicht mehr verwaltet.... -label.action.unmanage.cluster=Vernachl\u00e4ssige Cluster -label.action.update.OS.preference=Betriebssystem Pr\u00e4verenz aktualisieren -label.action.update.OS.preference.processing=Betriebssystemeinstellung wird aktualisiert.... -label.action.update.resource.count.processing=Ressourcenanzahl wird aktualisiert.... -label.action.update.resource.count=Ressourcenanzahl aktualisieren -label.action.vmsnapshot.create=VM-Schnappschuss machen -label.action.vmsnapshot.delete=VM-Schnappschuss l\u00f6schen -label.action.vmsnapshot.revert=Auf VM-Schnappschuss zur\u00fcckkehren -label.activate.project=Projekt aktivieren -label.active.sessions=Aktive Sitzungen -label.add.account=Konto hinzuf\u00fcgen -label.add.accounts=Konten hinzuf\u00fcgen -label.add.accounts.to=Konten hinzuf\u00fcgen zu -label.add.account.to.project=Konto zu Projekt hinzuf\u00fcgen -label.add.ACL=ACL hinzuf\u00fcgen -label.add.acl.list=ACL-Liste hinzuf\u00fcgen -label.add.affinity.group=Neue Affinit\u00e4tsgruppe hinzuf\u00fcgen -label.add.baremetal.dhcp.device=Baremetal DHCP-Ger\u00e4t hinzuf\u00fcgen -label.add.baremetal.rack.configuration=Baremetal Rackkonfiguration hinzuf\u00fcgen -label.add.BigSwitchBcf.device=F\u00fcge BigSwitch BCF Controller hinzu -label.add.BrocadeVcs.device=Brocade Vcs Switch hinzuf\u00fcgen -label.add.by.cidr=Hinzuf\u00fcgen durch CIDR -label.add.by.group=Hinzuf\u00fcgen durch Gruppe -label.add.by=Hinzugef\u00fcgt von -label.add.ciscoASA1000v=CiscoASA1000v-Ressource hinzuf\u00fcgen -label.add.cluster=Cluster hinzuf\u00fcgen -label.add.compute.offering=Berechnungsangebot hinzuf\u00fcgen -label.add.direct.iprange=Direkten IP-Bereich hinzuf\u00fcgen -label.add.disk.offering=Festplattenangebot hinzuf\u00fcgen -label.add.domain=Domain hinzuf\u00fcgen -label.added.brocade.vcs.switch=Neuer Brocade Vcs Switch hinzugef\u00fcgt -label.added.network.offering=Netzwerkangebot hinzugef\u00fcgt -label.added.new.bigswitch.bcf.controller=Neuer BigSwitch BCF Controller hinzugef\u00fcgt -label.added.nicira.nvp.controller=Neuer Nicira NVP Controller hinzugef\u00fcgt -label.add.egress.rule=Egress-Regel hinzuf\u00fcgen -label.addes.new.f5=Neues F5 hinzugef\u00fcgt -label.add.F5.device=F5-Ger\u00e4t hinzuf\u00fcgen -label.add.firewall=Firewall-Regel hinzuf\u00fcgen -label.add.globo.dns=GloboDNS hinzuf\u00fcgen -label.add.gslb=GSLB hinzuf\u00fcgen -label.add.guest.network=Gastnetzwerk hinzuf\u00fcgen -label.add=Hinzuf\u00fcgen -label.add.host=Host hinzuf\u00fcgen -label.adding.cluster=Cluster hinzuf\u00fcgen -label.adding.failed=Hinzuf\u00fcgen fehlgeschlagen -label.adding=Hinzuf\u00fcgen -label.adding.pod=Hinzuf\u00fcgen des Pods -label.adding.processing=Hinzuf\u00fcgen.... -label.add.ingress.rule=Zutrittsregel hinzuf\u00fcgen -label.adding.succeeded=Erfolgreich hinzugef\u00fcgt -label.adding.user=Nutzer hinzuf\u00fcgen -label.adding.zone=Hinzuf\u00fcgen der Zone -label.add.intermediate.certificate=Intermediate Zertifikat hinzuf\u00fcgen -label.add.internal.lb=Interne LB hinzuf\u00fcgen -label.add.ip.range=IP-Bereich hinzuf\u00fcgen -label.add.isolated.guest.network=Isoliertes Gastnetzwerk hinzuf\u00fcgen -label.add.isolated.guest.network.with.sourcenat=Isoliertes Gastnetzwerk mit Source-NAT hinzuf\u00fcgen -label.add.isolated.network=Isoliertes Netzwerk hinzuf\u00fcgen -label.additional.networks=Zus\u00e4tzliche Netzwerke -label.add.ldap.account=LDAP-Konto hinzuf\u00fcgen -label.add.LDAP.account=LDAP-Konto hinzuf\u00fcgen -label.add.list.name=ACL-Listename -label.add.load.balancer=Lastverteiler hinzuf\u00fcgen -label.add.more=Mehr hinzuf\u00fcgen -label.add.netScaler.device=Netscaler-Ger\u00e4t hinzuf\u00fcgen -label.add.network.acl.list=Netzwerk-ACL-Liste hinzuf\u00fcgen -label.add.network.ACL=Netzwerk-ACL hinzuf\u00fcgen -label.add.network.device=Hinzuf\u00fcgen eines Netzwerkger\u00e4tes -label.add.network=Netzwerk hinzuf\u00fcgen -label.add.network.offering=Netzwerkangebot hinzuf\u00fcgen -label.add.new.F5=Neues F5 hinzuf\u00fcgen -label.add.new.gateway=Neues Gateway hinzuf\u00fcgen -label.add.new.NetScaler=Neuer NetScaler hinzuf\u00fcgen -label.add.new.PA=Neues Palo Alto hinzuf\u00fcgen -label.add.new.SRX=Neuer SRX hinzuf\u00fcgen -label.add.new.tier=Neue Ebene hinzuf\u00fcgen -label.add.nfs.secondary.staging.store=NFS Sekund\u00e4r Staging Store hinzuf\u00fcgen -label.add.NiciraNvp.device=Nvp Controller hinzuf\u00fcgen -label.add.NuageVsp.device=Nuage Virtualized Services Directory (VSD) hinzuf\u00fcgen -label.add.OpenDaylight.device=OpenDaylight Controller hinzuf\u00fcgen -label.add.PA.device=Palo Alto-Ger\u00e4t hinzuf\u00fcgen -label.add.physical.network=Physikalisches Netzwerk hinzuf\u00fcgen -label.add.pod=Pod hinzuf\u00fcgen -label.add.portable.ip.range=Portablen IP-Bereich hinzuf\u00fcgen -label.add.port.forwarding.rule=Portweiterleitungsregel hinzuf\u00fcgen -label.add.primary.storage=Hauptspeicher hinzuf\u00fcgen -label.add.private.gateway=Privaten Gateway hinzuf\u00fcgen -label.add.region=Region hinzuf\u00fcgen -label.add.resources=Ressourcen hinzuf\u00fcgen -label.add.role=Rolle hinzuf\u00fcgen -label.add.route=Route hinzuf\u00fcgen -label.add.rule=Regel hinzuf\u00fcgen -label.add.secondary.storage=Sekund\u00e4rspeicher hinzuf\u00fcgen -label.add.security.group=Sicherheitsgruppe hinzuf\u00fcgen -label.add.service.offering=Dienstangebot hinzuf\u00fcgen -label.add.SRX.device=SRX-Ger\u00e4t hinzuf\u00fcgen -label.add.static.nat.rule=Statische NAT-Regel hinzuf\u00fcgen -label.add.static.route=F\u00fcge eine statische Route hinzu -label.add.system.service.offering=Systemdienstangebot hinzuf\u00fcgen -label.add.template=Vorlage hinzuf\u00fcgen -label.add.to.group=Zu Gruppe hinzuf\u00fcgen -label.add.ucs.manager=UCS Manager hinzuf\u00fcgen -label.add.user=Benutzer hinzuf\u00fcgen -label.add.userdata=Benutzerdaten -label.add.vlan=VLAN hinzuf\u00fcgen -label.add.vms.to.lb=VM(s) zur Lastverteilerregel hinzuf\u00fcgen -label.add.vms=VMs hinzuf\u00fcgen -label.add.VM.to.tier=VM zur Ebene hinzuf\u00fcgen -label.add.vm=VM hinzuf\u00fcgen -label.add.vmware.datacenter=VMware-Rechenzentrum hinzuf\u00fcgen -label.add.vnmc.device=VNMC-Ger\u00e4t hinzuf\u00fcgen -label.add.vnmc.provider=VNMC-Anbieter hinzuf\u00fcgen -label.add.volume=Volumen hinzuf\u00fcgen -label.add.vpc.offering=VPC-Angebot hinzuf\u00fcgen -label.add.vpc=VPC hinzuf\u00fcgen -label.add.vpn.customer.gateway=VPN Customer Gateway hinzuf\u00fcgen -label.add.VPN.gateway=VPN Gateway hinzuf\u00fcgen -label.add.vpn.user=VPN-Benutzer hinzuf\u00fcgen -label.add.vxlan=VXLAN hinzuf\u00fcgen -label.add.zone=Zone hinzuf\u00fcgen -label.admin.accounts=Administratoren-Konten -label.admin=Administrator -label.advanced.mode=Erweiterter Modus -label.advanced.search=Erweiterte Suche -label.advanced=Weitergehend -label.affinity=Affinit\u00e4t -label.affinity.group=Affinit\u00e4tsgruppe -label.affinity.groups=Affinit\u00e4tsgruppen -label.agent.password=Agent-Passwort -label.agent.port=Agent-Port -label.agent.state=Agent-Status -label.agent.username=Agent-Benutzername -label.agree=Zustimmen -label.alert.archived=Alarm archiviert -label.alert.deleted=Alarm gel\u00f6scht -label.alert.details=Alarmdetails -label.alert=Warnung -label.algorithm=Algorithmus -label.allocated=Zugeteilt -label.allocation.state=Belegungszustand -label.allow=Erlauben -label.anti.affinity=Anti-Affinit\u00e4t -label.anti.affinity.group=Anti-Affinit\u00e4tsgruppe -label.anti.affinity.groups=Anti-Affinit\u00e4tsgruppen -label.api.key=API Schl\u00fcssel -label.api.version=API-Version -label.apply=Anwenden -label.app.name=CloudStack -label.archive.alerts=Alarme archivieren -label.archive=Archiv -label.archive.events=Ereignisse archivieren -label.assigned.vms=Zugewiesene VMs -label.assign.instance.another=Instanz einem anderen Benutzerkonto zuweisen -label.assign.to.load.balancer=Instanz zum Lastverteiler hinzuf\u00fcgen -label.assign.vms=VMs zuweisen -label.assign=Zuweisen -label.associated.network.id=Assozierte Netzwerk ID -label.associated.network=Zugeh\u00f6riges Netzwerk -label.associated.profile=Zugeh\u00f6riges Profil -label.associate.public.ip=\u00d6ffentliche IP assoziieren -label.attached.iso=Angeh\u00e4ngte ISO -label.author.email=Autoremail -label.author.name=Autorname -label.autoscale=Automatische Skalierung -label.autoscale.configuration.wizard=Eingabehilfe der Autoskalierungs-Konfiguration -label.availability=Verf\u00fcgbarkeit -label.availability.zone=Verf\u00fcgbare Zone -label.availabilityZone=Verf\u00fcgbarkeitszone -label.available.public.ips=Verf\u00fcgbaren \u00f6ffentlichen IP-Adressen -label.available=Verf\u00fcgbar -label.back=Zur\u00fcck -label.bandwidth=Bandbreite -label.baremetal.dhcp.devices=Baremetal DHCP-Ger\u00e4te -label.baremetal.dhcp.provider=Baremetal DHCP-Provider -label.baremetal.pxe.device=Baremetal PXE-Ger\u00e4t hinzuf\u00fcgen -label.baremetal.pxe.devices=Baremetal PXE-Ger\u00e4te -label.baremetal.pxe.provider=Baremetal PXE-Provider -label.baremetal.rack.configuration=Barematel Rackkonfiguration -label.basic=Basis -label.basic.mode=Grundmodus -label.bigswitch.bcf.details=BigSwitch BCF Details -label.bigswitch.bcf.nat=BigSwitch BCF NAT aktiviert -label.bigswitch.controller.address=Adresse des BigSwitch BCF Controllers -label.blade.id=Blade ID -label.blades=Blades -label.bootable=Bootbar -label.broadcast.domain.range=Broadcast-Domain Bereich -label.broadcast.domain.type=Broadcast Domain Typ -label.broadcast.uri=Broadcast URI -label.broadcasturi=Broadcast-URI -label.broadcat.uri=Broadcast URI -label.brocade.vcs.address=Vcs Switch Adresse -label.brocade.vcs.details=Brocade Vcs Switch Details -label.by.account=Nach Benutzerkonto -label.by.alert.type=Nach Alarmtyp -label.by.availability=Nach Verf\u00fcgbarkeit -label.by.date.end=Nach Datum (Ende) -label.by.date.start=Nach Datum (Start) -label.by.domain=Nach Domain -label.by.end.date=Nach Endedatum -label.by.event.type=Nach Ereignistyp -label.by.level=Nach Level -label.by.pod=Nach Pod -label.by.role=Nach Rolle -label.by.start.date=Nach Beginndatum -label.by.state=\u00fcber den Zustand -label.bytes.received=Empfangene Bytes -label.bytes.sent=Gesendete Bytes -label.by.traffic.type=Nach Traffic-Typ -label.by.type.id=Nach Typ ID -label.by.type=Nach Typ -label.by.zone=Nach Zone -label.cache.mode=Schreib-Cache-Typ -label.cancel=Abbrechen -label.capacity.bytes=Kapazit\u00e4ts-Bytes -label.capacity.iops=Kapazit\u00e4ts-IOPS -label.capacity=Kapazit\u00e4t -label.certificate=Serverzertifikat -label.change.affinity=Affinit\u00e4t \u00e4ndern -label.change.ipaddress=\u00c4ndern der IP Adresse f\u00fcr das NIC -label.change.service.offering=Dienstangebot \u00e4ndern -label.change.value=Wert \u00e4ndern -label.character=Buchstabe -label.chassis=Chassis -label.checksum=Pr\u00fcfsumme -label.cidr.account=CIDR oder Benutzerkonto/Sicherheitsgruppe -label.cidr=CIDR -label.CIDR.list=CIDR-Liste -label.cidr.list=Quelle CIDR -label.CIDR.of.destination.network=CIDR des Zielnetzwerks -label.cisco.nexus1000v.ip.address=Nexus 1000v-IP-Adresse -label.cisco.nexus1000v.password=Nexus 1000v-Passwort -label.cisco.nexus1000v.username=Nexus 1000v-Benutzername -label.ciscovnmc.resource.details=CiscoVNMC-Ressourcendetails -label.clean.up=Bereinigen -label.clear.list=Liste l\u00f6schen -label.close=Schliessen -label.cloud.console=Cloud Verwaltungskonsole -label.cloud.managed=Geleitet von cloud.com -label.cluster=Cluster -label.cluster.name=Clustername -label.clusters=Cluster -label.cluster.type=Cluster-Typ -label.clvm=CLVM -label.code=Code -label.community=Gemeinschaft -label.compute.and.storage=Berechnen und Speicher -label.compute=Berechnen -label.compute.offering=Berechnungsangebot -label.compute.offerings=Berechnungsangebote -label.configuration=Konfiguration -label.configure=Konfigurieren -label.configure.ldap=LDAP konfigurieren -label.configure.network.ACLs=Netzwerk-ACLs konfigurieren -label.configure.sticky.policy=Sticky-Richtlinie konfigurieren -label.configure.vpc=VPC konfigurieren -label.confirmation=Best\u00e4tigung -label.confirm.password=Passwort best\u00e4tigen -label.congratulations=Herzlichen Gl\u00fcckwunsch -label.conserve.mode=Konserven-Modus -label.console.proxy=Konsolenproxy -label.console.proxy.vm=Konsolenproxy-VM -label.continue.basic.install=Weiterfahren mit Basisinstallation -label.continue=Fortsetzen -label.copying.iso=ISO wird kopiert -label.corrections.saved=Korrekturen gespeichert -label.counter=Z\u00e4hler -label.cpu.allocated.for.VMs=CPU alloziert f\u00fcr VMs -label.cpu.allocated=Zugeteilte CPU -label.CPU.cap=CPU Obergrenze -label.cpu=CPU -label.cpu.limits=CPU-Begrenzungen -label.cpu.mhz=CPU (in MHz) -label.cpu.utilized=genutzte CPU -label.created.by.system=Vom System erstellt -label.created=Erstellt -label.create.nfs.secondary.staging.storage=NFS sekund\u00e4rer Staging Store erstellen -label.create.nfs.secondary.staging.store=NFS sekund\u00e4rer Staging Store erstellen -label.create.project=Projekt erstellen -label.create.ssh.key.pair=Erstelle ein SSH-Schl\u00fcsselpaar -label.create.template=Vorlage erstellen -label.create.VPN.connection=VPN-Verbindung erstellen -label.cross.zones=\u00fcberschneidende Zonen -label.custom=Benutzerdefiniert -label.custom.disk.iops=Benutzerspezifische IOPS -label.custom.disk.offering=Benutzerdefiniertes Festplattenangebot -label.custom.disk.size=Benutzerdefinierte Festplattengr\u00f6sse -label.daily=T\u00e4glich -label.data.disk.offering=Datenspeicherplatzangebot -label.date=Datum -label.day.of.month=Tag des Monats -label.day.of.week=Tag der Woche -label.day=Tag -label.dc.name=DC-Name -label.dead.peer.detection=Dead-Peer-Erkennung -label.decline.invitation=Einladung ablehnen -label.dedicate.cluster=Dediziere Cluster -label.dedicated=Dediziert -label.dedicate=Dedizieren -label.dedicated.vlan.vni.ranges=Dedizierte VLAN/VNI Bereiche -label.dedicate.host=Dediziere Host -label.dedicate.pod=Dediziere Pod -label.dedicate.vlan.vni.range=Dedizierter VLAN/VNI Bereich -label.dedicate.zone=Zone dedizieren -label.default.egress.policy=Standard Egress Richtlinie -label.default=Standard -label.default.use=Standardeinstellung nutzen -label.default.view=Standardansicht -label.delete.acl.list=ACL-Liste ersetzen -label.delete.affinity.group=Affinit\u00e4tsgruppe entfernen -label.delete.alerts=Alarme l\u00f6schen -label.delete.baremetal.rack.configuration=Barematel Rackkonfiguration entfernen -label.delete.BigSwitchBcf=BigSwitch BCF Controller entfernen -label.delete.BrocadeVcs=Brocade Vcs Switch l\u00f6schen -label.delete.ciscoASA1000v=CiscoASA1000v l\u00f6schen -label.delete.ciscovnmc.resource=CiscoVNMC-Ressource l\u00f6schen -label.delete.events=Ereignisse l\u00f6schen -label.delete.F5=F5 l\u00f6schen -label.delete.gateway=L\u00f6sche Gateway -label.delete.internal.lb=Interne LB l\u00f6schen -label.delete=L\u00f6schen -label.delete.NetScaler=L\u00f6sche NetScaler -label.delete.NiciraNvp=Entferne Nvp Controller -label.delete.NuageVsp=Nuage VSD entfernen -label.delete.OpenDaylight.device=OpenDaylight Controller l\u00f6schen -label.delete.PA=Palo Alto l\u00f6schen -label.delete.portable.ip.range=Portablen IP-Bereich l\u00f6schen -label.delete.profile=Profil l\u00f6schen -label.delete.project=Projekt l\u00f6schen -label.delete.role=Rolle l\u00f6schen -label.delete.secondary.staging.store=Sekund\u00e4rer Staging Store l\u00f6schen -label.delete.SRX=SRX l\u00f6schen -label.delete.ucs.manager=UCS Manager l\u00f6schen -label.delete.VPN.connection=VPN-Verbindung l\u00f6schen -label.delete.VPN.customer.gateway=VPN Customer Gateway l\u00f6schen -label.delete.VPN.gateway=VPN-Gateway l\u00f6schen -label.delete.vpn.user=VPN-Benutzer l\u00f6schen -label.deleting.failed=L\u00f6schen fehlgeschlagen -label.deleting.processing=L\u00f6sche.... -label.deny=Verweigern -label.deployment.planner=Deployment-Planer -label.description=Beschreibung -label.destination.physical.network.id=Physiche Netzwerk-ID des Zielorts -label.destination.zone=Zielzone -label.destroy.router=Router zerst\u00f6ren -label.destroy.vm.graceperiod=Gnadenfrist bis zur Zerst\u00f6rung der VM -label.destroy=Zerst\u00f6ren -label.detaching.disk=Entfernen der Festplatte -label.details=Details -label.device.id=Ger\u00e4te-ID -label.devices=Ger\u00e4te -label.dhcp=DHCP -label.DHCP.server.type=DHCP Server Type -label.direct.attached.public.ip=Direkt angeschlossene \u00f6ffentliche IP -label.direct.ips=Gemeinsame Netzwerk-IPs -label.disable.autoscale=Automatische Skalierung deaktivieren -label.disabled=Deaktiviert -label.disable.host=Host deaktivieren -label.disable.network.offering=Netzwerkangebot deaktivieren -label.disable.provider=Anbieter deaktivieren -label.disable.vnmc.provider=VNMC-Anbieter deaktivieren -label.disable.vpc.offering=VPC-Angebot deaktivieren -label.disable.vpn=Fernzugriff-VPN deaktivieren -label.disabling.vpn.access=Deaktivierung des VPN Zugangs -label.disassociate.profile.blade=Verbindung vom Profil zum Blade entfernen -label.disbale.vnmc.device=VNMC-Ger\u00e4t deaktivieren -label.disk.allocated=Zugeordnete Festplatte -label.disk.bytes.read.rate=Festplatten-Leserate (BPS) -label.disk.bytes.write.rate=Festplatten-Schreibrate (BPS) -label.disk.iops.max=Max IOPS -label.disk.iops.min=Min IOPS -label.disk.iops.read.rate=Festplatten-Leserate (IOPS) -label.disk.iops.total=Gesamte IOPS -label.disk.iops.write.rate=Festplatten-Schreibrate (IOPS) -label.disk.offering.details=Festplattenangebotdetails -label.disk.offering=Festplattenangebot -label.diskoffering=Festplattenangebot -label.disk.provisioningtype=Provisionierungstyp -label.disk.read.bytes=Festplatte Lesen (Bytes) -label.disk.read.io=Festplatte Lesen (EA) -label.disk.size=Festplattengr\u00f6\u00dfe -label.disk.size.gb=Festplattengr\u00f6\u00dfe (in GB) -label.disk.total=Gesamtzahl der Festplatten -label.disk.volume=Festplattenvolumen -label.disk.write.bytes=Festplatte Schreiben (Bytes) -label.disk.write.io=Festplatte Schreiben (EA) -label.display.name=Anzeigename -label.display.text=Anzeigetext -label.distributedrouter=Verteilter Router -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=DNS Domain f\u00fcr Gast-Netzwerke -label.domain.admin=Domain Administrator -label.domain.details=N\u00e4hrere Angaben zu Domains -label.domain=Domain -label.domain.id=Domain ID -label.domain.lower=Dom\u00e4ne -label.domain.name=Domain Name -label.domain.router=Domain Router -label.domain.suffix=DNS Domainsuffix (z.B. xzy.com) -label.done=Fertig -label.double.quotes.are.not.allowed=Anf\u00fchrungszeichen sind nicht erlaubt -label.download.progress=Download-Fortschritt -label.drag.new.position=Ziehe zu neuer Position -label.duration.in.sec=Dauer (in Sekunden) -label.dynamically.scalable=Dynamisch skalierbar -label.edit.acl.rule=ACL-Regel bearbeiten -label.edit.affinity.group=Affinit\u00e4tsgruppe bearbeiten -label.edit=Bearbeiten -label.edit.lb.rule=LB-Regel bearbeiten -label.edit.network.details=Netzwerkdetails bearbeiten -label.edit.project.details=Projektdetails bearbeiten -label.edit.region=Region bearbeiten -label.edit.role=Rolle bearbeiten -label.edit.rule=Regel bearbeiten -label.edit.secondary.ips=Sekund\u00e4re IPs bearbeiten -label.edit.tags=Schlagw\u00f6rter bearbeiten -label.edit.traffic.type=Datenverkehrstyp bearbeiten -label.edit.vpc=VPC bearbeiten -label.egress.default.policy=Egress Standard Richtlinie -label.egress.rule=Egress-Regel -label.egress.rules=Egress-Regeln -label.elastic=Elastisch -label.elastic.IP=Elastische IP Adresse -label.elastic.LB=Elastischer LB -label.email=E-Mail -label.email.lower=E-Mail-Adresse -label.enable.autoscale=Automatische Skalierung aktivieren -label.enable.host=Host aktivieren -label.enable.network.offering=Netzwerkangebot aktivieren -label.enable.provider=Anbieter aktivieren -label.enable.s3=S3-Backend Sekund\u00e4rspeicher einschalten -label.enable.swift=Swift aktivieren -label.enable.vnmc.device=VNMC-Ger\u00e4t aktivieren -label.enable.vnmc.provider=VNMC-Anbieter aktivieren -label.enable.vpc.offering=VPC-Angebot aktivieren -label.enable.vpn=Fernzugriff-VPN einschalten -label.enabling.vpn.access=Aktivieren des VPN-Zugriffs -label.enabling.vpn=VPN aktivieren -label.end.IP=End-IP -label.endpoint=Endpunkt -label.endpoint.or.operation=Endpunkt oder Bedienung -label.end.port=Beende Port -label.end.reserved.system.IP=Reservierte System-End-IP -label.end.vlan=End-VLAN -label.end.vxlan=End-VXLAN -label.enter.token=Token eingeben -label.error.code=Fehlercode -label.error=Fehler -label.error.upper=FEHLER -label.ESP.encryption=ESP-Verschl\u00fcsselung -label.ESP.hash=ESP-Pr\u00fcfsumme -label.ESP.lifetime=ESP-Lebensdauer (Sekunde) -label.ESP.policy=ESP-Richtlinie -label.esx.host=ESX / ESXi-Host -label.event.archived=Ereignis archiviert -label.event.deleted=Ereignis gel\u00f6scht -label.event=Ereignis -label.every=Jeder -label.example=Beispiel -label.expunge=Unwiederbringlich l\u00f6schen -label.external.link=Externer Link -label.extractable=Extrahierbar -label.extractable.lower=extrahierbar -label.f5.details=F5-Details -label.f5=F5 -label.failed=Fehlgeschlagen -label.featured=Empfohlen -label.fetch.latest=Neuste abrufen -label.filterBy=Filtern nach -label.fingerprint=FingerAbdruck -label.firewall=Firewall -label.firstname.lower=Vorname -label.first.name=Vorname -label.format=Format -label.format.lower=Format -label.friday=Freitag -label.full.path=Vollst\u00e4ndiger Pfad -label.full=Voll -label.gateway=Schnittstelle -label.general.alerts=Allgemeine Alarme -label.generating.url=Generieren der URL -label.globo.dns.configuration=GloboDNS-Konfiguration -label.globo.dns=GloboDNS -label.gluster.volume=Volume -label.go.step.2=Gehe zu Schritt 2 -label.go.step.3=Weiter zu Schritt 3 -label.go.step.4=Weiter mit Schritt 4 -label.go.step.5=Weiter mit Schritt 5 -label.gpu=GPU -label.group.by.account=Nach Konto gruppieren -label.group.by.cluster=Nach Cluster gruppieren -label.group.by.pod=Gruppiert nach Pod -label.group.by.zone=Nach Zone gruppieren -label.group=Gruppe -label.group.optional=Gruppe (optional) -label.gslb.assigned.lb.more=Mehr Lastverteilung zuweisen -label.gslb.assigned.lb=Zugewiesene Lastverteilung -label.gslb.delete=GSLB l\u00f6schen -label.gslb.details=GSLB-Details -label.gslb.domain.name=GSLB-Dom\u00e4nenname -label.gslb=GSLB -label.gslb.lb.details=Lastverteilungsdetails -label.gslb.lb.remove=Lastverteilung aus diesem GSLB entfernen -label.gslb.lb.rule=Lastverteilungsregel -label.gslb.service=GSLB-Dienst -label.gslb.service.private.ip=GSLB-Dienst Private IP -label.gslb.service.public.ip=GSLB-Dienst \u00d6ffentliche IP -label.gslb.servicetype=Diensttyp -label.guest.cidr=Gast CIDR -label.guest.end.ip=Gast-End-IP -label.guest=Gast -label.guest.gateway=Gast-Schnittstelle -label.guest.ip=Gast IP-Adresse -label.guest.ip.range=Gast-IP-Bereich -label.guest.netmask=Gast Netzmaske -label.guest.network.details=Gastnetzwerkdetails -label.guest.networks=Gastnetzwerke -label.guest.start.ip=Gast-Start-IP -label.guest.traffic=Gast-Datenverkehr -label.guest.traffic.vswitch.name=Gast Datenverkehr vSwitch Name -label.guest.traffic.vswitch.type=Gast Datenverkehr vSwitch Typ -label.guest.type=Gasttyp -label.ha.enabled=HA aktiviert -label.health.check.advanced.options=Erweiterte Optionen\: -label.health.check.configurations.options=Konfigurationsoptionen\: -label.health.check=Heath-Check -label.health.check.interval.in.sec=Gesundheitscheck-Interval (in Sek.) -label.health.check.message.desc=Ihr Lastverteiler wird autmatisch Heath-Checks ausf\u00fchren auf Ihren CloudStack Instanzen und nur Datenverkehr zu denjenigen Instanzen routen, welchen den Heath-Check bestehen. -label.health.check.wizard=Health-Check Eingabehilfe -label.healthy.threshold=Schwellwert gesund -label.help=Hilfe -label.hide.ingress.rule=Verstecke Regeln, die den Zutritt steuern -label.hints=Hinweise -label.home=Start -label.host.alerts=Hosts im Alarmzustand -label.host=Host -label.host.MAC=Host-MAC -label.host.name=Host Name -label.hosts=Hosts -label.host.tag=Host Tag -label.host.tags=Markierungen des Hosts -label.hourly=St\u00fcndlich -label.hvm=HVM -label.hypervisor.capabilities=Hypervisorf\u00e4higkeiten -label.hypervisor=Hypervisor -label.hypervisors=Hypervisoren -label.hypervisor.snapshot.reserve=Hypervisor Schnappschuss-Reserve -label.hypervisor.type=Hypervisor Typ -label.hypervisor.version=Hypervisor-Version -label.hyperv.traffic.label=HyperV Datenverkehrs-Bezeichnung -label.id=Identifikation -label.IKE.DH=IKE DH -label.IKE.encryption=IKE-Verschl\u00fcsselung -label.IKE.hash=IKE-Pr\u00fcfsumme -label.IKE.lifetime=IKE-Lebensdauer (Sekunde) -label.IKE.policy=IKE-Richtlinie -label.info=Info -label.info.upper=INFO -label.ingress.rule=Zutrittsregel -label.initiated.by=Initiiert durch -label.inside.port.profile=Inside Port Profil -label.installWizard.addClusterIntro.subtitle=Was ist ein Cluster? -label.installWizard.addClusterIntro.title=Cluster hinzuf\u00fcgen -label.installWizard.addHostIntro.subtitle=Was ist ein Host? -label.installWizard.addHostIntro.title=Host hinzuf\u00fcgen -label.installWizard.addPodIntro.subtitle=Was ist ein Pod? -label.installWizard.addPodIntro.title=Pod hinzuf\u00fcgen -label.installWizard.addPrimaryStorageIntro.subtitle=Was ist Prim\u00e4rspeicher? -label.installWizard.addPrimaryStorageIntro.title=Prim\u00e4rspeicher hinzuf\u00fcgen -label.installWizard.addSecondaryStorageIntro.subtitle=Was ist Sekund\u00e4rspeicher? -label.installWizard.addSecondaryStorageIntro.title=Sekund\u00e4rspeicher hinzuf\u00fcgen -label.installWizard.addZoneIntro.subtitle=Was ist eine Zone? -label.installWizard.addZoneIntro.title=Zone hinzuf\u00fcgen -label.installWizard.addZone.title=Zone hinzuf\u00fcgen -label.installWizard.click.launch=Bitte den Start-Knopf dr\u00fccken -label.installWizard.subtitle=Diese F\u00fchrung wird Ihnen beim Aufsetzen Ihrer CloudStack&\#8482 Installation behilflich sein. -label.installWizard.title=Hallo und Willkommen bei CloudStack&\#8482 -label.instance=Instanz -label.instance.limits=Instanz-Limiten -label.instance.name=Name der Instanz -label.instance.port=Instanz-Port -label.instance.scaled.up=Instanz wurde zum gew\u00fcnschten Angebot skaliert -label.instances=Instanzen -label.instanciate.template.associate.profile.blade=Vorlage instanzieren und Profil zu Blade assoziieren -label.intermediate.certificate=Intermediate Zertifikat {0} -label.internal.dns.1=Interner DNS 1 -label.internal.dns.2=Interner DNS 2 -label.internal.lb.details=Interne LB-Details -label.internal.lb=Interne LB -label.internallbvm=Interne LV VM -label.internal.name=Interner Name -label.interval.type=Interval Typ -label.introduction.to.cloudstack=Einf\u00fchrung in CloudStack&\#8482 -label.invalid.integer=Ung\u00fcltige Ganzzahl -label.invalid.number=Ung\u00fcltige Anzahl -label.invitations=Einladungen -label.invited.accounts=Eingeladene Konten -label.invite=Einladen -label.invite.to=Einladen zu -label.ip.address=IP-Adresse -label.ipaddress=IP-Adresse -label.ip.allocations=IP-Zuweisungen -label.ip=IP -label.ip.limits=\u00d6ffentliche IP-Begrenzungen -label.ip.or.fqdn=IP oder FQDN -label.ip.range=IP-Bereich -label.ip.ranges=IP-Bereiche -label.IPsec.preshared.key=IPsec Preshared-Schl\u00fcssel -label.ips=IPs -label.ipv4.cidr=IPv4 CIDR -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.ipv4.end.ip=IPv4 End-IP -label.ipv4.gateway=IPv4 Gateway -label.ipv4.netmask=IPv4-Netzmaske -label.ipv4.start.ip=IPv4 Start-IP -label.ipv6.address=IPv6-IP-Adresse -label.ipv6.CIDR=IPv6-CIDR -label.ipv6.dns1=IPv6 DNS1 -label.ipv6.dns2=IPv6 DNS2 -label.ipv6.end.ip=IPv6 End-IP -label.ipv6.gateway=IPv6-Gateway -label.ipv6.start.ip=IPv6 Start-IP -label.iscsi=iSCSI -label.is.default=Ist vorgegeben -label.iso.boot=ISO-Boot -label.iso=ISO -label.isolated.networks=Isolierte Netzwerke -label.isolation.method=Isolationsmethode -label.isolation.mode=Isolationsmodus -label.isolation.uri=Isolations-URI -label.is.redundant.router=Redundant -label.is.shared=Gemeinsam -label.is.system=Ist System -label.item.listing=Eintragsauflistung -label.japanese.keyboard=Japanische Tastatur -label.keep=Behalten -label.keep.colon=Behalten\: -label.keyboard.language=Tastatursprache -label.keyboard.type=Tastaturtyp -label.key=Schl\u00fcssel -label.kvm.traffic.label=KVM Datenverkehrs-Bezeichnung -label.label=Bezeichnung -label.lang.arabic=Arabisch -label.lang.brportugese=Brasilianisches Portugiesisch -label.lang.catalan=Katalanisch -label.lang.chinese=Chinesisch (vereinfacht) -label.lang.dutch=Niederl\u00e4ndisch -label.lang.english=Englisch -label.lang.french=Franz\u00f6sisch -label.lang.german=Deutsch -label.lang.hungarian=Ungarisch -label.lang.italian=Italienisch -label.lang.japanese=Japanisch -label.lang.korean=Koreanisch -label.lang.norwegian=Norwegisch -label.lang.polish=Polnisch -label.lang.russian=Russisch -label.lang.spanish=Spanisch -label.last.disconnected=Zuletzt getrennt -label.lastname.lower=Nachname -label.last.name=Nachname -label.latest.events=Neueste Ereignisse -label.launch=Start -label.launch.vm=VM starten -label.launch.zone=Zone starten -label.lb.algorithm.leastconn=Mindestverbindungen -label.lb.algorithm.roundrobin=Rundlauf-Verfahren -label.lb.algorithm.source=Quelle -label.LB.isolation=LB-Isolation -label.ldap.configuration=LDAP-Konfiguration -label.ldap.group.name=LDAP-Gruppe -label.ldap.link.type=Typ -label.ldap.port=LDAP-Port -label.level=Ebene -label.link.domain.to.ldap=Verbinde Domain mit LDAP -label.linklocal.ip=Link-Local IP-Adresse -label.load.balancer=Serverlastverteilung -label.load.balancer.type=Lastverteilungstyp -label.load.balancing=Lastverteilung -label.load.balancing.policies=Verteilungsrichtlinien laden -label.loading=Laden -label.local.file=Lokale Datei -label.local=Lokal -label.local.storage.enabled=Erm\u00f6gliche lokalen Speicher f\u00fcr Benutzer VMs -label.local.storage.enabled.system.vms=Aktiviere lokaler Speicher f\u00fcr die System-VMs -label.local.storage=Lokaler Speicher -label.login=Login -label.logout=Abmelden -label.lun=LUN -label.LUN.number=LUN \# -label.lxc.traffic.label=LXC Datenverkehrs-Bezeichnung -label.make.project.owner=Mache Benutzerkonto zum Projekteigent\u00fcmer -label.make.redundant=Redundant machen -label.managed=Verwaltet -label.management.ips=Verwaltung IP-Adressen -label.management.server=Verwaltungsserver -label.management=Verwaltung -label.manage.resources=Ressourcen verwalten -label.manage=Verwalten -label.max.cpus=Max. CPU-Kerne -label.max.guest.limit=Maximales Limit f\u00fcr Anzahl der G\u00e4ste -label.maximum=Maximum -label.max.instances=Max Instanzen -label.max.memory=Max. Speicher (MiB) -label.max.networks=Max. Netzwerke -label.max.primary.storage=Max. prim\u00e4rer (GiB) -label.max.public.ips=Max. \u00f6ffentliche IPs -label.max.secondary.storage=Max. sekund\u00e4rer (GiB) -label.max.snapshots=Max. Schnappsch\u00fcsse -label.max.templates=Max. Vorlagen -label.max.vms=Max. Benutzer-VMs -label.max.volumes=Max. Volumen -label.max.vpcs=Max. VPCs -label.may.continue=Sie k\u00f6nnen jetzt fortfahren -label.md5.checksum=MD5-Pr\u00fcfsumme -label.memory.allocated=zugeordneter Speicher -label.memory.limits=Speicherbegrenzungen (MiB) -label.memory.mb=Speicher (in MB) -label.memory=Speicher (in MB) -label.memory.total=Speicher insgesamt -label.memory.used=Genutzter Speicher -label.menu.accounts=Benutzerkonten -label.menu.alerts=Alarme -label.menu.all.accounts=Alle Konten -label.menu.all.instances=Alle Instanzen -label.menu.community.isos=Gemeinschaft ISOs -label.menu.community.templates=Gemeinschaft Vorlagen -label.menu.configuration=Konfiguration -label.menu.dashboard=Dashboard -label.menu.destroyed.instances=Zerst\u00f6rte Instanzen -label.menu.disk.offerings=Festplattenangebote -label.menu.domains=Domains -label.menu.events=Events -label.menu.featured.isos=Empfohlene ISOs -label.menu.featured.templates=Empfohlene Vorlagen -label.menu.global.settings=Allgemeine Einstellungen -label.menu.infrastructure=Infrastruktur -label.menu.instances=Instanzen -label.menu.ipaddresses=IP-Adressen -label.menu.isos=ISOs -label.menu.my.accounts=Meine Konten -label.menu.my.instances=Meine F\u00e4lle -label.menu.my.isos=Meine ISOs -label.menu.my.templates=Meine Vorlagen -label.menu.network=Netzwerk -label.menu.network.offerings=Netzwerkangebote -label.menu.physical.resources=Technische Ressourcen -label.menu.regions=Regionen -label.menu.running.instances=Laufende Instanzen -label.menu.security.groups=Sicherheitsgruppen -label.menu.service.offerings=Dienstangebote -label.menu.snapshots=Schnappsch\u00fcsse -label.menu.sshkeypair=SSH-Schl\u00fcsselpaar -label.menu.stopped.instances=Beendete Instanzen -label.menu.storage=Speicherung -label.menu.system.service.offerings=Systemangebote -label.menu.system=System -label.menu.system.vms=System-VMs -label.menu.templates=Vorlagen -label.menu.virtual.appliances=Virtuelle Appliances -label.menu.virtual.resources=Virtuelle Ressourcen -label.menu.volumes=Volumina -label.menu.vpc.offerings=VPC-Angebote -label.metrics.allocated=Zugeteilt -label.metrics.clusters=Cluster -label.metrics.cpu.allocated=CPU Zuteilung -label.metrics.cpu.max.dev=Abweichung -label.metrics.cpu.total=Gesamt -label.metrics.cpu.usage=CPU Benutzung -label.metrics.cpu.used.avg=Gebraucht -label.metrics.disk.allocated=Zugeteilt -label.metrics.disk=Disk -label.metrics.disk.iops.total=IOPS -label.metrics.disk.read=Lesen -label.metrics.disk.size=Gr\u00f6\u00dfe -label.metrics.disk.storagetype=Typ -label.metrics.disk.total=Gesamt -label.metrics.disk.unallocated=Unbelegt -label.metrics.disk.usage=Festplattennutzung -label.metrics.disk.used=Gebraucht -label.metrics.disk.write=Schreiben -label.metrics.hosts=Hosts -label.metrics.memory.allocated=Speicher Belegung -label.metrics.memory.max.dev=Abweichung -label.metrics.memory.total=Gesamt -label.metrics.memory.usage=Speichernutzung -label.metrics.memory.used.avg=Gebraucht -label.metrics=Metriken -label.metrics.name=Name -label.metrics.network.read=Lesen -label.metrics.network.usage=Netzwerk Nutzung -label.metrics.network.write=Schreiben -label.metrics.num.cpu.cores=Cores -label.metrics.outofbandmanagementpowerstate=Betriebszustand -label.metrics.property=Eigentum -label.metrics.scope=Geltungsbereich -label.metrics.state=Status -label.metrics.storagepool=Speicher-Pool -label.metrics.vm.name=VM Name -label.migrate.instance.to.host=Instanz auf einen anderen Host migrieren -label.migrate.instance.to=Instanz migrieren zu -label.migrate.instance.to.ps=Instanz auf einen anderen Prim\u00e4rspeicher migrieren -label.migrate.lb.vm=LB-VM migrieren -label.migrate.router.to=Router migrieren zu -label.migrate.systemvm.to=System-VM migrieren zu -label.migrate.to.host=Zu Host migrieren -label.migrate.to.storage=Zu Speicher migrieren -label.migrate.volume.to.primary.storage=Migriere ein Speichervolumen zu einem anderen Hauptspeicher -label.migrate.volume=Volumen migrieren -label.minimum=Minimum -label.min.instances=Min Instanzen -label.min.past.the.hr=min seit Std. vergangen -label.minute.past.hour=Minute(n) seit der Stunde vergangen -label.minutes.past.hour=Minute(n) seit der Stunde vergangen -label.mode=Modus -label.monday=Montag -label.monthly=Monatlich -label.more.templates=Mehr Vorlagen -label.move.down.row=Eine Zeile nach unten verschieben -label.move.to.bottom=Nach unten verschieben -label.move.to.top=Nach oben verschieben -label.move.up.row=Eine Zeile nach oben verschieben -label.my.account=Ihr Benutzerkonto -label.my.network=Mein Netzwerk -label.my.templates=Meine Vorlagen -label.name.lower=Name -label.name=Name -label.name.optional=Name (Optional) -label.na=N/V -label.nat.port.range=NAT-Portbereich -label.netmask=Netzmaske -label.netscaler.details=NetScaler-Details -label.netScaler=NetScaler -label.network.ACL=Netzwerk-ACL -label.network.ACLs=Netzwerk-ACLs -label.network.ACL.total=Netzwerk-ACL Total -label.network.addVM=Netzwerk zur VM hinzuf\u00fcgen -label.network.cidr=Netzwerk-CIDR -label.network.desc=Netzwerkbeschreibung -label.network.details=Netzwerkdetails -label.network.device=Netzwerkger\u00e4t -label.network.device.type=Netzwerkger\u00e4tetyp -label.network.domain=Netzwerk-Domain -label.network.domain.text=Netzwerkdom\u00e4ne -label.network.id=Netzwerk-ID -label.networking.and.security=Netzwerkbetrieb und Sicherheit -label.network.label.display.for.blank.value=Standard-Gateway verwenden -label.network.limits=Netzwerkbegrenzungen -label.network.name=Netzwerk Name -label.network=Netzwerk -label.network.offering.details=Netzwerkangebotdetails -label.network.offering.display.text=Netzwerkangebot-Anzeigetext -label.network.offering.id=Netzwerkangebotskennung -label.network.offering.name=Netzwerkangebotsname -label.network.offering=Netzwerkangebot -label.network.rate.megabytes=Netzwerkrate (MB/s) -label.network.rate=Netzwerk-Rate -label.network.read=Netzwerk Lesen -label.network.service.providers=Netzwerkdienstanbieter -label.networks=Netzwerke -label.network.type=Netzwerk-Typ -label.network.write=Netzwerk Schreiben -label.new=Neu -label.new.password=Neues Passwort -label.new.project=Neues Projekt -label.new.ssh.key.pair=Neues SSH-Schl\u00fcsselpaar -label.new.vm=Neue VM -label.next=Weiter -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=NFS Server -label.nfs.storage=NFS-Speicher -label.nic.adapter.type=NIC-Adaptertyp -label.nicira.controller.address=Controller-Adresse -label.nicira.l2gatewayserviceuuid=L2 Gateway Service Uuid -label.nicira.l3gatewayserviceuuid=L3 Gateway Service Uuid -label.nicira.nvp.details=Nicira NVP-Details -label.nicira.transportzoneuuid=Transportzone Uuid -label.nics=NICs -label.no.actions=Nicht verf\u00fcgbare Aktionen -label.no.alerts=Keine aktuellen Alarme -label.no.data=Keine anzuzeigenden Daten -label.no.errors=Keine neuen Fehler -label.no.grouping=(keine Gruppierung) -label.no.isos=Kein verf\u00fcgbaren ISOs -label.no.items=Keine verf\u00fcgbaren Eintr\u00e4ge -label.no=Nein -label.none=Kein -label.no.security.groups=Keine verf\u00fcgbare Sicherheitsgruppe -label.not.found=Nicht gefunden -label.no.thanks=Nein, danke -label.notifications=Benachrichtigungen -label.number.of.clusters=Anzahl der Cluster -label.number.of.cpu.sockets=Die Anzahl der CPU-Sockeln -label.number.of.hosts=Anzahl an Hosts -label.number.of.pods=Anzahl Pods -label.number.of.system.vms=Anzahl an System-VMs -label.number.of.virtual.routers=Anzahl an virtuellen Routern -label.number.of.zones=Anzahl an Zonen -label.num.cpu.cores=Anzahl an CPU-Kernen -label.numretries=Anzahl von Wiederholungen -label.ocfs2=OCFS2 -label.offer.ha=HA anbieten -label.of.month=des Monats -label.ok=OK -label.opendaylight.controllerdetail=OpenDayight Controller Details -label.opendaylight.controller=OpenDaylight Controller -label.opendaylight.controllers=OpenDaylight Controller -label.openDaylight=OpenDaylight -label.operator=Betreiber -label.optional=optional -label.order=Reihenfolge -label.os.preference=OS Pr\u00e4ferenz -label.os.type=OS Typ -label.other=Andere -label.outofbandmanagement.action=Aktion -label.outofbandmanagement.action.issue=Eine Out-of-band Verwaltungs-Strom Aktion durchf\u00fchren -label.outofbandmanagement.address=Adresse -label.outofbandmanagement.changepassword=Passwort f\u00fcr Out-of-band Verwaltung \u00e4ndern -label.outofbandmanagement.configure=Out-of-band Verwaltung konfigurieren -label.outofbandmanagement.disable=Out-of-band Verwaltung deaktivieren -label.outofbandmanagement.driver=Treiber -label.outofbandmanagement.enable=Out-of-band Verwaltung aktivieren -label.outofbandmanagement=Out-of-band Verwaltung -label.outofbandmanagement.password=Passwort -label.outofbandmanagement.port=Port -label.outofbandmanagement.reenterpassword=Passwort erneut eingeben -label.outofbandmanagement.username=Benutzername -label.override.guest.traffic=Gast-Datenverkehr \u00fcberschreiben -label.override.public.traffic=\u00d6ffentlichen Datenverkehr \u00fcberschreiben -label.ovm3.cluster=Natives Clustering -label.ovm3.pool=Natives Pooling -label.ovm3.traffic.label=OVM3 Datenverkehrs-Bezeichnung -label.ovm3.vip=Master Vip IP -label.ovm.traffic.label=OVM Datenverkehrs-Bezeichnung -label.ovs=OVS -label.owned.public.ips=Ihnen geh\u00f6rende \u00f6ffentliche IP-Adressen -label.owner.account=Eigent\u00fcmerkonto -label.owner.domain=Eigent\u00fcmerdom\u00e4ne -label.palo.alto.details=Palo Alto-Details -label.PA.log.profile=Palo Alto-Protokollprofil -label.PA=Palo Alto -label.parent.domain=\u00dcbergeordnete Dom\u00e4ne -label.passive=Passiv -label.password.enabled=Passwort aktiviert -label.password.lower=Passwort -label.password=Passwort -label.password.reset.confirm=Passwort wurde zur\u00fcckgesetzt auf -label.path=Pfad -label.PA.threat.profile=Palo Alto Threat Profil -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.permission=Berechtigung -label.persistent=Persistent -label.physical.network.ID=Physikalisches Netzwerkkennung -label.physical.network.name=Name des physischen Netzwerks -label.physical.network=Physikalisches Netzwerk -label.PING.CIFS.password=PING CIFS Passwort -label.PING.CIFS.username=PING CIFS Benutzername -label.PING.dir=PING-Verzeichnis -label.ping.path=Ping-Pfad -label.PING.storage.IP=IP des externen Speichers anpingen -label.planner.mode=Planungs Modus -label.please.complete.the.following.fields=Bitte vervollst\u00e4ndigen Sie die folgenden Felder -label.please.specify.netscaler.info=Bitte Netscaler-Info definieren -label.please.wait=Bitte warten -label.plugin.details=Plugindetails -label.plugins=Plugins -label.pod.dedicated=Pod dediziert -label.pod.name=Podname -label.pod=Pod -label.pods=Pod -label.polling.interval.sec=Abfrageintervall (in Sekunden) -label.portable.ip=Portable IP -label.portable.ip.range.details=Portable IP-Bereichsdetails -label.portable.ip.ranges=Portable IP-Bereiche -label.portable.ips=Portable IPs -label.port.forwarding.policies=Portweiterleitungsrichtlinien -label.port.forwarding=Portweiterleitung -label.port=Port -label.port.range=Portbereich -label.powerstate=Betriebszustand -label.PreSetup=Voreinstellung -label.previous=Vorherige -label.prev=Vor -label.primary.allocated=Zugewiesener Hauptspeicher -label.primary.network=Hauptnetzwerk -label.primary.storage.count=Hauptspeicher-Pools -label.primary.storage=Hauptspeicher -label.primary.storage.limits=Hauptspeicher-Limits (GiB) -label.primary.used=Genutzter Hauptspeicher -label.private.Gateway=Privater Gateway -label.private.interface=Privates Interface -label.private.ip=Private IP-Adresse -label.private.ip.range=Privater IP-Bereich -label.private.ips=Private IP-Adressen -label.privatekey=PKCS\#8 Privater Schl\u00fcssel -label.private.key=Privater Schl\u00fcssel -label.private.network=Privates Netzwerk -label.private.port=Privater Port -label.private.zone=Private Zone -label.profile=Profil -label.project.dashboard=Projekt\u00fcbersichtsseite -label.project.id=Projektkennung -label.project.invite=Zum Projekt einladen -label.project.name=Projektname -label.project=Projekt -label.projects=Projekte -label.project.view=Projektansicht -label.protocol.number=Protokollnummer -label.protocol=Protokoll -label.provider=Anbieter -label.providers=Anbieter -label.public.interface=\u00d6ffentliches Interface -label.public.ips=\u00d6ffentliche IP-Adressen -label.public.ip=\u00d6ffentliche IP-Adresse -label.public.key=\u00d6ffentlicher Schl\u00fcssel -label.public.lb=\u00d6ffentliche LB -label.public.load.balancer.provider=\u00d6ffentlicher Lastverteileranbieter -label.public.network=\u00d6ffentliches Netzwerk -label.public.port=\u00d6ffentlicher Port -label.public.traffic=\u00d6ffentlicher Datenverkehr -label.public.traffic.vswitch.name=\u00d6ffentlicher Datenverkehr vSwitch Name -label.public.traffic.vswitch.type=\u00d6ffentlicher Datenverkehr vSwitch Typ -label.public=\u00d6ffentlich -label.public.zone=\u00d6ffentliche Zone -label.purpose=Zweck -label.Pxe.server.type=PXE Server Type -label.qos.type=QoS-Typ -label.quickview=Schnellansicht -label.quiesce.vm=VM stilllegen -label.quiet.time.sec=Ruhezeit (in Sekunden) -label.quota.add.credits=Guthaben hinzuf\u00fcgen -label.quota.balance=Abgleich -label.quota.configuration=Konfiguration der Quota -label.quota.configure=Konfiguriere eine Quota -label.quota.credit=Guthaben -label.quota.credits=Guthaben -label.quota.date=Datum -label.quota.dates=Aktualisierung der Daten -label.quota.description=Beschreibung der Quota -label.quota.email.body=K\u00f6rper -label.quota.email.lastupdated=Letzte Aktualisierung -label.quota.email.subject=Thema -label.quota.email.template=Email Vorlage -label.quota.enddate=Enddatum -label.quota.endquota=Quota Ende -label.quota.enforcequota=Erzwinge eine Quota -label.quota.fullsummary=Alle Konten -label.quota.minbalance=Min Abrechnung -label.quota.remove=Eine Quota l\u00f6schen -label.quota.startdate=Startdatum -label.quota.startquota=Start Quota -label.quota.statement=Aussage -label.quota.statement.balance=Quota Abrechnung -label.quota.statement.bydates=Aussage -label.quota.statement.quota=Quota Verbrauch -label.quota.statement.tariff=Quota Tarif -label.quota.state=Status -label.quota.summary=Summe -label.quota.tariff.edit=Tarif bearbeiten -label.quota.tariff.effectivedate=Anwendungsdatum -label.quota.tariff=Tarif -label.quota.tariff.value=Tarif Wert -label.quota.total=Gesamt -label.quota.totalusage=Gesamte Nutzung -label.quota.type.name=Art der Auslastung -label.quota.type.unit=Verbrauch der Einheit -label.quota.usage=Verbrauch der Quota -label.quota.value=Wert der Quota -label.rbd.id=Cephx-Benutzer -label.rbd.monitor=Ceph-\u00dcberwachung -label.rbd.pool=Ceph-Pool -label.rbd=RBD -label.rbd.secret=Cephx-Geheimnis -label.reboot=Neustart -label.recent.errors=Aktuelle Fehler -label.recover.vm=VM wiederherstellen -label.redundant.router.capability=Redundanter Router Kapazit\u00e4t -label.redundant.router=Redundanter Router -label.redundant.state=Redundanter Status -label.redundant.vpc=Redundante VPC -label.refresh=Aktualisieren -label.refresh.blades=Blades aktualisieren -label.region.details=Regiondetails -label.regionlevelvpc=Region Level VPC -label.region=Region -label.reinstall.vm=VM neu installieren -label.related=Verwandt -label.release.account.lowercase=Vom Benutzerkonto losl\u00f6sen -label.release.account=Vom Benutzerkonto losl\u00f6sen -label.release.dedicated.cluster=Dedizierter Cluster losl\u00f6sen -label.release.dedicated.host=Dedizierter Host losl\u00f6sen -label.release.dedicated.pod=Dedizierter Pod freigeben -label.release.dedicated.vlan.range=Dedizierter VLAN/VNI Bereich losl\u00f6sen -label.release.dedicated.zone=Dedizierte Zone losl\u00f6sen -label.remind.later=Sp\u00e4ter erinnern -label.remove.ACL=ACL entfernen -label.remove.egress.rule=Egress Regel entfernen -label.remove.from.load.balancer=Instanz von Lastverteiler entfernen -label.remove.ingress.rule=Ingress Regel entfernen -label.remove.ip.range=IP-Bereich entfernen -label.remove.ldap=LDAP entfernen -label.remove.network.offering=Netzwerkangebot entfernen -label.remove.pf=Portweiterleitungsregel entfernen -label.remove.project.account=Konto aus Projekt entfernen -label.remove.region=Region entfernen -label.remove.rule=Regel entfernen -label.remove.ssh.key.pair=SSH-Schl\u00fcsselpaar entfernen -label.remove.static.nat.rule=Statische NAT-Regel entfernen -label.remove.static.route=Statische Route entfernen -label.remove.this.physical.network=Dieses physikalische Netzwerk entfernen -label.remove.tier=Ebene entfernen -label.remove.vm.from.lb=VM von Lastverteiler-Regel entfernen -label.remove.vm.load.balancer=VM aus Lastverteiler entfernen -label.remove.vmware.datacenter=VMware-Rechenzentrum entfernen -label.remove.vpc.offering=VPC-Angebot entfernen -label.remove.vpc=VPC entfernen -label.removing=am Entfernen -label.removing.user=Entfernen von Benutzern -label.reource.id=Ressourcenkennung -label.replace.acl=ACL ersetzen -label.replace.acl.list=ACL-Liste ersetzen -label.required=Erforderlich -label.requires.upgrade=Erfordert Aktualisierung -label.reserved.ip.range=Reservierter IP-Bereich -label.reserved.system.gateway=Reservierter System-Gateway -label.reserved.system.ip=Reservierte System-IP -label.reserved.system.netmask=Reservierte System-Netzmaske -label.reset.ssh.key.pair.on.vm=SSH-Schl\u00fcsselpaar auf VM zur\u00fccksetzen -label.reset.ssh.key.pair=SSH-Schl\u00fcsselpaar zur\u00fccksetzen -label.resetVM=VM zur\u00fccksetzen -label.reset.VPN.connection=VPN-Verbindung zur\u00fccksetzen -label.resize.new.offering.id=Neues Angebot -label.resize.new.size=Neue Gr\u00f6\u00dfe (GB) -label.resize.shrink.ok=Verkleinern OK -label.resource.limit.exceeded=Ressourcenbegrenzung erreicht -label.resource.limits=Ressourcenbegrenzungen -label.resource.name=Ressourcenname -label.resource=Ressource -label.resources=Ressourcen -label.resource.state=Ressourcenstatus -label.response.timeout.in.sec=Zeit\u00fcberschreitung der Antworkt (in Sek.) -label.restart.network=Netzwerk neu starten -label.restart.required=Neustart erforderlich -label.restart.vpc=VPC neu starten -label.restore=Wiederherstellen -label.retry.interval=Wiederversuchs-Interval -label.review=Nachpr\u00fcfung -label.revoke.project.invite=Einladung widerrufen -label.role=Rolle -label.roles=Rollen -label.roletype=Rollentyp -label.root.certificate=Root-Zertifikat -label.root.disk.controller=Root-Festplatten-Controller -label.root.disk.offering=Root-Festplattenangebot -label.root.disk.size=Root-Festplattengr\u00f6\u00dfe -label.router.vm.scaled.up=Router VM hochskaliert -label.routing.host=Routing Host -label.routing=Routing -label.rule.number=Regelnummer -label.rule=Regel -label.rules=Regeln -label.running.vms=Laufende VMs -label.s3.access_key=Zugriffsschl\u00fcssel -label.s3.bucket=Bucket -label.s3.connection_timeout=Verbindungszeit\u00fcberschreitung -label.s3.endpoint=Endpunkt -label.s3.max_error_retry=Maximale Fehlerwiederholungen -label.s3.nfs.path=S3 NFS-Pfad -label.s3.nfs.server=S3 NFS-Server -label.s3.secret_key=Secret Key -label.s3.socket_timeout=Socket-Zeit\u00fcberschreitung -label.s3.use_https=HTTPS verwenden -label.saml.enable=Autorisiere SAML SSO -label.saml.entity=Identit\u00e4tsanbieter -label.saturday=Samstag -label.save.and.continue=Speichern und fortsetzen -label.save.changes=\u00c4nderungen speichern -label.save=Sichern -label.saving.processing=Speichern.... -label.scaledown.policy=Herunterskalierungs-Richtlinie -label.scale.up.policy=HOCHSKALIERUNGSRICHTLINIE -label.scaleup.policy=Hochskalierungs-Richtlinie -label.scope=Geltungsbereich -label.search=Suche -label.secondary.ips=Sekund\u00e4re IPs -label.secondary.isolated.vlan.id=Sekund\u00e4re isolierte VLAN ID -label.secondary.staging.store.details=Sekund\u00e4rer Staging Store Details -label.secondary.staging.store=Sekund\u00e4rer Staging Store -label.secondary.storage.count=Sekund\u00e4respeicher-Pools -label.secondary.storage.details=Sekund\u00e4rspeicherdetails -label.secondary.storage.limits=Sekund\u00e4rspeicherbegrenzungen (GiB) -label.secondary.storage=Sekund\u00e4rspeicher -label.secondary.storage.vm=Sekund\u00e4rspeicher-VM -label.secondary.used=Genutzter Sekund\u00e4rspeicher -label.secret.key=Secret Key -label.security.group.name=Sicherheitsgruppen-Name -label.security.groups.enabled=Sicherheitsgruppe aktiviert -label.security.group=Sicherheitsgruppe -label.security.groups=Sicherheitsgruppen -label.select.a.template=Vorlage ausw\u00e4hlen -label.select=Ausw\u00e4hlen -label.select.a.zone=Zone ausw\u00e4hlen -label.select.instance=Instanz ausw\u00e4hlen -label.select.instance.to.attach.volume.to=Instanz w\u00e4hlen an welche das Volumen angef\u00fcgt wird -label.select.iso.or.template=ISO oder Vorlage ausw\u00e4hlen -label.select.offering=Angebot ausw\u00e4hlen -label.select.project=Projekt ausw\u00e4hlen -label.select.region=Region ausw\u00e4hlen -label.select.template=Vorlage ausw\u00e4hlen -label.select.tier=Ebene ausw\u00e4hlen -label.select-view=Ansicht ausw\u00e4hlen -label.select.vm.for.static.nat=VM f\u00fcr statisches NAT ausw\u00e4hlen -label.sent=Versendet -label.server=Server -label.service.capabilities=Dienstf\u00e4higkeiten -label.service.offering.details=Dienstangebotdetails -label.service.offering=Dienstangebot -label.services=Dienste -label.service.state=Dienststatus -label.session.expired=Sitzung abgelaufen -label.set.default.NIC=Standard-NIC festlegen -label.settings=Einstellungen -label.setup=Konfiguration -label.setup.network=Netzwerk einrichten -label.set.up.zone.type=Zonentyp einrichten -label.setup.zone=Zone einrichten -label.shared=Gemeinsame -label.SharedMountPoint=Geteilter Einh\u00e4ngepunkt -label.show.advanced.settings=Erweiterte Einstellungen anzeigen -label.show.ingress.rule=Zeige Regeln, die den Zutritt steuern -label.shutdown.provider=Herunterfahrungs-Anbieter -label.simplified.chinese.keyboard=Vereinfachte Chinesische Tastatur -label.site.to.site.VPN=Site-to-site VPN -label.size=Gr\u00f6\u00dfe -label.skip.guide=Ich habe CloudStack bereits vorher benutzt, diese Hilfe \u00fcberspringen -label.smb.domain=SMB-Dom\u00e4ne -label.smb.password=SMB-Passwort -label.smb.username=SMB-Benutzername -label.snapshot.limits=Schnappschuss Grenzen -label.snapshot.name=Schnappschuss Name -label.snapshot.schedule=Wiederkehrende Schnappsch\u00fcsse einrichten -label.snapshot=Schnappschuss -label.snapshot.s=Schnappsch\u00fcsse -label.snapshots=Schnappsch\u00fcsse -label.SNMP.community=SNMP Gemeinschaft -label.SNMP.port=SNMP-Port -label.sockets=CPU-Sockets -label.source.ip.address=Quell IP-Adresse -label.source.nat=Source NAT -label.source.nat.supported=SourceNAT unterst\u00fctzt -label.source.port=Port der Quelle -label.specify.IP.ranges=IP-Bereiche angeben -label.specify.vlan=VLAN angeben -label.specify.vxlan=VXLAN angeben -label.SR.name=SR Name-Bezeichnung -label.srx.details=SRX-Details -label.srx=SRX -label.ssh.key.pair.details=SSH-Schl\u00fcsselpaardetails -label.ssh.key.pair=SSH-Schl\u00fcsselpaar -label.ssh.key.pairs=SSH-Schl\u00fcsselpaare -label.standard.us.keyboard=Standard-(US)-Tastatur -label.start.IP=Start-IP -label.start.lb.vm=LB-VM starten -label.start.port=Startport -label.start.reserved.system.IP=Reservierte System-IP starten -label.start.vlan=Start VLAN -label.start.vxlan=VXLAN starten -label.state=Status -label.static.nat.enabled=Statisches NAT eingeschaltet -label.static.nat=Statische NAT -label.static.nat.to=Statisches NAT nach -label.static.nat.vm.details=Statisches NAT VM Details -label.static.routes=Statische Routen -label.statistics=Statistiken -label.status=Status -label.step.1=Schritt 1 -label.step.1.title=Schritt 1\: W\u00e4hlen Sie eine Vorlage aus -label.step.2=Schritt 2 -label.step.2.title=Schritt 2\: Dienstangebot -label.step.3=Schritt 3 -label.step.3.title=Schritt 3\: W\u00e4hlen Sie ein Festplattenangebot aus -label.step.4=Schritt 4 -label.step.4.title=Schritt 4\: Netzwerk -label.step.5=Schritt 5 -label.step.5.title=Schritt 5\: \u00dcberpr\u00fcfung -label.stickiness=Klebrigkeit -label.stickiness.method=Stickness-Methode -label.sticky.cookie-name=Cookiename -label.sticky.domain=Domain -label.sticky.expire=L\u00e4uft ab -label.sticky.holdtime=Haltezeit -label.sticky.indirect=Indirekt -label.sticky.length=L\u00e4nge -label.sticky.mode=Modus -label.sticky.name=Sticky-Name -label.sticky.nocache=Kein Cache -label.sticky.postonly=nur Post -label.sticky.prefix=Pr\u00e4fix -label.sticky.request-learn=Verlange zu lernen -label.sticky.tablesize=Tabellengr\u00f6\u00dfe -label.stop.lb.vm=LB-VM stoppen -label.stopped.vms=Gestoppte VMs -label.stop=Stopp -label.storage.pool=Speicher-Pool -label.storage=Speicherung -label.storage.tags=Datenspeicher-Markierung -label.storage.traffic=Datenspeicherverkehr -label.storage.type=Speichertyp -label.subdomain.access=Subdomain-Zugriff -label.submit=Absenden -label.submitted.by=[Eingereicht von\: ] -label.succeeded=Erfolgreich -label.sunday=Sonntag -label.super.cidr.for.guest.networks=Super CIDR f\u00fcr Gast-Netzwerke -label.supported.services=Unterst\u00fctzte Dienste -label.supported.source.NAT.type=Unterst\u00fctzter Source-NAT-Typ -label.supportsstrechedl2subnet=Unters\u00fctzt Streched L2 Subnet -label.suspend.project=Projekt suspendieren -label.switch.type=Switch Typ -label.system.capacity=Systemkapazit\u00e4t -label.system.offering.for.router=Systemangebot f\u00fcr Router -label.system.offering=Systemangebot -label.system.service.offering.details=Systemdienstangebotdetails -label.system.service.offering=Systemdienstangebot -label.system.vm.details=System-VM-Details -label.system.vm.scaled.up=System-VM hochskaliert -label.system.vms=System-VMs -label.system.vm=System-VM -label.system.vm.type=System-VM-Typ -label.system.wide.capacity=Systemweite Kapazit\u00e4t -label.tagged=Markiert -label.tag.key=Schlagwortschl\u00fcssel -label.tags=Markierungen -label.tag.value=Schlagwortwert -label.target.iqn=Ziel-IQN -label.task.completed=Aufgabe fertiggestellt -label.template.limits=Vorlagenbegrenzungen -label.template=Vorlage -label.TFTP.dir=TFTP-Verzeichnis -label.tftp.root.directory=Tftp root-Verzeichnis -label.theme.default=Motiv-Standardeinstellung -label.theme.grey=Benutzerdefiniert - Grau -label.theme.lightblue=Benutzerdefiniert - Hellblau -label.threshold=Schwellenwert -label.thursday=Donnerstag -label.tier.details=Ebenendetails -label.tier=Ebene -label.time.colon=Zeit\: -label.timeout.in.second = Zeit\u00fcberschreitung (Sekunden) -label.timeout=Zeit\u00fcberschreitung -label.time=Zeit -label.timezone.colon=Zeitzone\: -label.time.zone=Zeitzone -label.timezone=Zeitzone -label.token=Token -label.total.cpu=Gesamtanzahl CPU -label.total.CPU=Gesamtanzahl CPU -label.total.hosts=Gesamtanzahl Hosts -label.total.memory=Gesamter Speicher -label.total.of.ip=Gesamtzahl der IP-Adressen -label.total.of.vm=Gesamtanzahl VMs -label.total.storage=Gesamter Speicher -label.total.virtual.routers=Total an virtuellen Routern -label.total.virtual.routers.upgrade=Total an virtuellen Routern, welche ein Softwareupgrade ben\u00f6tigen -label.total.vms=Gesamtanzahl VMs -label.traffic.label=Datenverkehrsbezeichnung -label.traffic.type=Datenverkehrstyp -label.traffic.types=Datenverkehrstypen -label.tuesday=Dienstag -label.type.id=Typenkennung -label.type.lower=Typ -label.type=Typ -label.ucs=UCS -label.uk.keyboard=UK-Tastatur -label.unavailable=Nicht verf\u00fcgbar -label.unhealthy.threshold=Schwellwert ungesund -label.unlimited=Unbegrenzt -label.untagged=Unmarkiert -label.update.project.resources=Projektressourcen aktualisieren -label.update.ssl.cert= SSL-Zertifikat -label.update.ssl= SSL-Zertifikat -label.updating=Aktualisierungsvorgang -label.upgrade.required=Aktualisierung ist erforderlich -label.upgrade.router.newer.template=Router upgraden um neuere Vorlage zu verwenden -label.upload.from.local=Von lokal hochladen -label.upload=Hochladen -label.upload.template.from.local=Vorlage von lokal hochladen -label.upload.volume.from.local=Volumen von lokal hochladen -label.upload.volume.from.url=Volumen von URL hochladen -label.upload.volume=Volumen hochladen -label.url=URL -label.usage.interface=Auslastungsoberfl\u00e4che -label.usage.sanity.result=Usage Sanity Resultat -label.usage.server=Auslastungsserver -label.usage.type=Art der Auslastung -label.usage.unit=Einheit -label.used=Gebraucht -label.user=Benutzer -label.user.data=Benutzerdaten -label.user.details=Benutzerdetails -label.username=Benutzername -label.username.lower=Benutzername -label.users=Benutzer -label.user.vm=Benutzer-VM -label.use.vm.ips=VM-IPs verwenden -label.use.vm.ip=VM-IP verwenden\: -label.value=Wert -label.vcdcname=vCenter RZ-Name -label.vcenter.cluster=vCenter-Cluster -label.vcenter.datacenter=vCenter-Rechenzentrum -label.vcenter.datastore=vCenter-Datenspeicher -label.vcenter.host=vCenter-Host -label.vcenter.password=vCenter-Passwort -label.vcenter.username=vCenter-Benutzername -label.vcenter=vcenter -label.vcipaddress=vCenter-IP-Adresse -label.version=Version -label.vgpu.max.resolution=Maximale Aufl\u00f6sung -label.vgpu.max.vgpu.per.gpu=vGPUs pro GPU -label.vgpu.remaining.capacity=Verbleibende Kapazit\u00e4t -label.vgpu.type=vGPU-Typ -label.vgpu=VGPU -label.vgpu.video.ram=Video RAM -label.view.all=Alle ansehen -label.view=Ansicht -label.view.console=Konsole ansehen -label.viewing=Ansehen -label.view.more=Weitere ansehen -label.view.secondary.ips=Sekund\u00e4re IPs ansehen -label.virtual.appliance.details=Virtuelle Appliance Details -label.virtual.appliances=Virtuelle Appliances -label.virtual.appliance=Virtuelle Applicance -label.virtual.machines=Virtuelle Maschinen -label.virtual.machine=Virtuelle Maschine -label.virtual.networking=Virtuelle Netzwerkverbindung -label.virtual.network=Virtuelles Netzwerk -label.virtual.routers.group.account=Virtuelle Router gruppiert nach Benutzerkonto -label.virtual.routers.group.cluster=Virtuelle Router gruppiert nach Cluster -label.virtual.routers.group.pod=Virtuelle Router gruppiert nach Pod -label.virtual.routers.group.zone=Virtuelle Router gruppiert nach Zone -label.virtual.routers=Virtuelle Router -label.virtual.router=Virtueller Router -label.vlan.id=VLAN/VNI-Kennung -label.vlan.only=VLAN -label.vlan.range.details=VLAN-Bereichdetails -label.vlan.ranges=VLAN-Bereich(e) -label.vlan.range=VLAN/VNI-Bereich -label.vlan=VLAN/VNI -label.vlan.vni.ranges=VLAN/VNI-Bereich(e) -label.vlan.vni.range=VLAN/VNI-Bereich -label.vm.add=Instanz hinzuf\u00fcgen -label.vm.destroy=Zerst\u00f6ren -label.vm.display.name=VM-Anzeigename -label.VMFS.datastore=VMFS-Datenspeicher -label.vmfs=VMFS -label.vm.id=VM-Kennung -label.vm.ip=VM-IP-Adresse -label.vm.name=VM-Name -label.vm.password=Passwort der VM ist -label.vm.reboot=Neustart -label.VMs.in.tier=VMs in Ebene -label.vmsnapshot.current=istAktuell -label.vmsnapshot.memory=Schnappschussspeicher -label.vmsnapshot.parentname=\u00dcbergeordnet -label.vmsnapshot.type=Typ -label.vmsnapshot=VM-Schnappsch\u00fcsse -label.vm.start=Start -label.vm.state=VM-Status -label.vm.stop=Stopp -label.vms=VMs -label.vmware.datacenter.id=VMware-Rechenzentrumskennung -label.vmware.datacenter.name=VMware-Rechenzentrumsname -label.vmware.datacenter.vcenter=VMware Rechenzentrum-vCenter -label.vmware.traffic.label=VMware Datenverkehrs-Bezeichnung -label.vnet.id=VLAN/VNI-Kennung -label.vnet=VLAN/VNI -label.vnmc.devices=VNMC-Ger\u00e4te -label.vnmc=VNMC -label.volatile=Verg\u00e4nglich -label.volgroup=Volumengruppe -label.volume.details=Volumendetails -label.volume.limits=Volumenbegrenzungen -label.volume.migrated=Volumen migriert -label.volume.name=Volumenname -label.volumes=Volumina -label.volume=Volume -label.vpc.distributedvpcrouter=Verteilter VPC-Router -label.vpc.id=VPC-Kennung -label.VPC.limits=VPC-Begrenzungen -label.vpc.offering.details=VPC-Angebotdetails -label.vpc.offering=VPC-Angebot -label.vpc.router.details=VPC-Routerdetails -label.VPC.router.details=VPC-Routerdetails -label.vpc.supportsregionlevelvpc=Unterst\u00fctzt Region Level VPC -label.vpc.virtual.router=VPC Virtueller Router -label.vpc=VPC -label.VPN.connection=VPN-Verbindung -label.vpn.customer.gateway=VPN Customer Gateway -label.VPN.customer.gateway=VPN Customer Gateway -label.vpn.force.encapsulation=Erzwinge eine Kapselung der UDP- in ESP-Pakete -label.VPN.gateway=VPN-Gateway -label.vpn=VPN -label.vsmctrlvlanid=Steuerungs-VLAN-Kennung -label.vsmpktvlanid=Paket-VLAN-Kennung -label.vsmstoragevlanid=Speicher-VLAN-Kennung -label.vsphere.managed=vSphere verwaltet -label.vswitch.name=vSwitch-Name -label.vSwitch.type=vSwitch-Typ -label.vxlan.id=VXLAN-Kennung -label.vxlan.range=VXLAN-Bereich -label.vxlan=VXLAN -label.waiting=Warten -label.warning=Warnung -label.warn.upper=WARNEN -label.warn=Warnen -label.wednesday=Mittwoch -label.weekly=W\u00f6chentlich -label.welcome.cloud.console=Willkommen bei der Verwaltungskonsole -label.welcome=Willkommen -label.what.is.cloudstack=Was ist CloudStack&\#8482? -label.xenserver.tools.version.61.plus=Originale XS-Version ist 6.1\\+ -label.Xenserver.Tools.Version61plus=Originale XS-Version ist 6.1\\+ -label.xenserver.traffic.label=XenServer Datenverkehrs-Bezeichnung -label.yes=Ja -label.zone.dedicated=Zone dediziert -label.zone.details=Zonendetails -label.zone.id=Zone ID -label.zone.lower=Zone -label.zone.name=Zonenname -label.zone.step.1.title=Schritt 1\: W\u00e4hlen Sie ein Netzwerk aus -label.zone.step.2.title=Schritt 2\: F\u00fcgen Sie eine Zone hinzu -label.zone.step.3.title=Schritt 3\: Pod hinzuf\u00fcgen -label.zone.step.4.title=Schritt 4\: F\u00fcgen Sie einen IP-Bereich hinzu -label.zones=Zonen -label.zone.type=Zonentyp -label.zone.wide=Zonenweit -label.zoneWizard.trafficType.guest=Gast\: Datenverkehr zwischen den virtuellen Maschinen der Endbenutzer -label.zoneWizard.trafficType.management=Management\: Datenverkehr zwischen den CloudStack internen Ressourcen, inklusive aller Komponenten, die mit dem Management Server kommunizieren, wie Hosts und CloudStack System VMs -label.zoneWizard.trafficType.public=\u00d6ffentlich\: Datenverkehr zwischen dem Internet und virtuellen Maschinen in der Cloud. -label.zoneWizard.trafficType.storage=Speicherung\: Datenverkehr zwischen Haupt- und Sekund\u00e4rspeicherserver, wie VM-Vorlagen und Schnappsch\u00fcsse. -label.zone=Zone -managed.state=Verwalteter Status -message.acquire.ip.nic=Bitte best\u00e4tigen Sie, dass Sie eine neue, sekund\u00e4re IP-Adresse f\u00fcr dieses Netzwerk-Schnittstelle ben\u00f6tigen.
HINWEIS\: Sie m\u00fcssen diese neue sekund\u00e4re IP-Adresse manuell in der virtuellen Maschine hinzuf\u00fcgen. -message.acquire.new.ip=Bitte best\u00e4tigen Sie, dass sie eine neue IP Adresse f\u00fcr dieses Netzwerk haben m\u00f6chten. -message.acquire.new.ip.vpc=Bitte best\u00e4tigen Sie, dass sie eine neue IP Adresse f\u00fcr diesen VPC ben\u00f6tigen. -message.acquire.public.ip=Bitte w\u00e4hlen Sie eine Zone, von der Sie Ihre neue IP erlangen m\u00f6chten. -message.action.cancel.maintenance=Ihr Host ist erfolgreich f\u00fcr die Wartung abgebrochen. Dieser Prozess kann ein paar Minuten dauern. -message.action.cancel.maintenance.mode=Bitte best\u00e4tigen Sie, dass Sie die Wartung abbrechen m\u00f6chten. -message.action.change.service.warning.for.instance=Ihre Instanz muss zuerst unterbrochen werden, bevor Sie Ihr derzeitiges Dienstangebot \u00e4ndern k\u00f6nnen. -message.action.change.service.warning.for.router=Ihr Router muss zuerst unterbrochen werden, bevor Sie Ihr derzeitiges Dienstangebot \u00e4ndern k\u00f6nnen. -message.action.delete.cluster=Bitte best\u00e4tigen Sie, dass Sie dieses Cluster l\u00f6schen m\u00f6chten. -message.action.delete.disk.offering=Bitte best\u00e4tigen Sie, dass Sie dieses Festplattenangebot l\u00f6schen m\u00f6chten. -message.action.delete.domain=Bitte best\u00e4tigen Sie, dass Sie diese Domain l\u00f6schen m\u00f6chten. -message.action.delete.external.firewall=Bitte best\u00e4tigen Sie, dass Sie die externe Firewall entfernen m\u00f6chten. Warnung\: Wenn Sie planen dieselbe exterene Firewall wieder hinzuzuf\u00fcgen, m\u00fcssen Sie s\u00e4mtliche Nutzungsdaten auf diesem Ger\u00e4t zur\u00fccksetzen -message.action.delete.external.load.balancer=Bitte best\u00e4tigen Sie, dass Sie diesen externen Loadbalancer entfernen m\u00f6chten. Warnung\: Wenn Sie planen denselben exterenen Loadbalancer wieder hinzuzuf\u00fcgen, m\u00fcssen Sie s\u00e4mtliche Nutzungsdaten auf diesem Ger\u00e4t zur\u00fccksetzen -message.action.delete.ingress.rule=Bitte best\u00e4tigen Sie, dass Sie diese Zutrittsregel l\u00f6schen wollen. -message.action.delete.ISO=Bitte best\u00e4tigen Sie, dass Sie diese ISO l\u00f6schen m\u00f6chten. -message.action.delete.ISO.for.all.zones=Die ISO gilt f\u00fcr alle Zonen. Bitte best\u00e4tigen Sie, dass Sie diese aus allen Zonen l\u00f6schen m\u00f6chten. -message.action.delete.network=Bitte best\u00e4tigen Sie, dass Sie dieses Netzwerk l\u00f6schen m\u00f6chten. -message.action.delete.nexusVswitch=Bitte best\u00e4tigen Sie, dass Sie diesen nexus 1000v l\u00f6schen m\u00f6chten. -message.action.delete.nic=Bitte best\u00e4tigen Sie die L\u00f6schung dieser NIC, da dies auch zur L\u00f6schung des zugeh\u00f6rigen Netzwerks von der VM f\u00fchrt. -message.action.delete.physical.network=Bitte best\u00e4tigen Sie, dass Sie dieses physikalische Netzwerk l\u00f6schen m\u00f6chten -message.action.delete.pod=Bitte best\u00e4tigen Sie, dass Sie dieses pod l\u00f6schen m\u00f6chten. -message.action.delete.primary.storage=Bitte best\u00e4tigen Sie, dass Sie diese Hauptspeicher l\u00f6schen m\u00f6chten. -message.action.delete.secondary.storage=Bitte best\u00e4tigen Sie, dass Sie diesen Sekund\u00e4rspeicher l\u00f6schen m\u00f6chten. -message.action.delete.security.group=Bitte best\u00e4tigen Sie, dass Sie diese Sicherheitsgruppe l\u00f6schen m\u00f6chten. -message.action.delete.service.offering=Bitte best\u00e4tigen Sie, dass Sie dieses Dienstangebot l\u00f6schen m\u00f6chten. -message.action.delete.snapshot=Bitte best\u00e4tigen Sie, dass Sie diesen Schnappschuss l\u00f6schen m\u00f6chten. -message.action.delete.system.service.offering=Bitte best\u00e4tigen Sie, dass Sie dieses Dienstangebot des Systems l\u00f6schen m\u00f6chten -message.action.delete.template=Bitte best\u00e4tigen Sie, dass Sie diese Vorlage l\u00f6schen m\u00f6chten. -message.action.delete.template.for.all.zones=Die Vorlage wird f\u00fcr alle Zonen genutzt. Bitte best\u00e4tigen Sie, dass Sie diese f\u00fcr alle Zonen l\u00f6schen m\u00f6chten. -message.action.delete.volume=Bitte best\u00e4tigen Sie, dass Sie dieses Volumen l\u00f6schen m\u00f6chten. -message.action.delete.zone=Bitte best\u00e4tigen Sie, dass Sie diese Zone l\u00f6schen m\u00f6chten. -message.action.destroy.instance=Bitte best\u00e4tigen Sie, dass Sie diese Instanz l\u00f6schen m\u00f6chten. -message.action.destroy.systemvm=Bitte best\u00e4tigen Sie, dass Sie diese System-VM zerst\u00f6ren m\u00f6chten. -message.action.disable.cluster=Bitte best\u00e4tigen Sie, dass Sie diesen Cluster deaktivieren m\u00f6chten. -message.action.disable.nexusVswitch=Bitte best\u00e4tigen Sie, dass sie diesen nexus 1000v deaktivieren m\u00f6chten. -message.action.disable.physical.network=Bitte best\u00e4tigen Sie, dass Sie dieses physikalische Netzwerk deaktivieren m\u00f6chten. -message.action.disable.pod=Bitte best\u00e4tigen Sie, dass Sie diesen Pod deaktivieren m\u00f6chten. -message.action.disable.static.NAT=Bitte best\u00e4tigen Sie, dass Sie die statische NAT deaktivieren m\u00f6chten. -message.action.disable.zone=Bitte best\u00e4tigen Sie, dass Sie diese Zone deaktivieren m\u00f6chten. -message.action.downloading.template=Vorlage wird heruntergeladen. -message.action.download.iso=Bitte best\u00e4tigen Sie, dass Sie dieses ISO herunterladen m\u00f6chten. -message.action.download.template=Bitte best\u00e4tigen Sie, dass Sie dieses Template herunterladen m\u00f6chten. -message.action.enable.cluster=Bitte best\u00e4tigen Sie, dass Sie diesen Cluster aktivieren m\u00f6chten. -message.action.enable.maintenance=Ihr Host wurde erfolgreich f\u00fcr die Wartung vorbereitet. Dieser Prozess kann einige Minuten, oder abh\u00e4nig von der jetzigen Anzahl VMs auf diesem Host auch l\u00e4nger, in Anspruch nehmen. -message.action.enable.nexusVswitch=Bitte best\u00e4tigen Sie, dass sie diesen nexus 1000v aktivieren m\u00f6chten. -message.action.enable.physical.network=Bitte best\u00e4tigen Sie, dass Sie dieses physikalische Netzwerk aktivieren m\u00f6chten. -message.action.enable.pod=Bitte best\u00e4tigen Sie, dass Sie diesen Pod aktivieren m\u00f6chten. -message.action.enable.zone=Bitte best\u00e4tigen Sie, dass Sie diese Zone aktivieren m\u00f6chten. -message.action.expunge.instance=Bitte best\u00e4tigen Sie, dasss Sie diese Instanz unwiederbringlich l\u00f6schen m\u00f6chten. -message.action.force.reconnect=Ihr Host wurde erfolgreich gewzungen wiederzuverbinden. Dieser Prozess kann einige Minuten beanspruchen. -message.action.host.enable.maintenance.mode=Die Aktivierung des Wartungsmodus verursacht eine Livemigration aller laufenden Instanzen auf diesem Host zu einem anderen verf\u00fcgbaren Host. -message.action.instance.reset.password=Bitte best\u00e4tigen Sie, dass Sie das ROOT Passwort f\u00fcr diese virtuelle Maschine \u00e4ndern m\u00f6chten. -message.action.manage.cluster=Bitte best\u00e4tigen Sie, dass das Cluster bearbeitet werden soll. -message.action.primarystorage.enable.maintenance.mode=Warnung\: den Hauptspeicher in den Wartungsmodus zu stellen, wird alle VMs stoppen, welche noch Volumen auf demjenigen haben. M\u00f6chten Sie fortfahren? -message.action.reboot.instance=Bitte best\u00e4tigen Sie, dass Sie diese Instanz neu starten m\u00f6chten. -message.action.reboot.router=Alle angebotenen Dienste dieses Routers werden unterbrochen. Bitte best\u00e4tigen Sie, dass Sie den Router neu starten m\u00f6chten. -message.action.reboot.systemvm=Bitte best\u00e4tigen Sie, dass Sie diese System-VM neu starten m\u00f6chten. -message.action.release.ip=Bitte best\u00e4tigen Sie, dass Sie diese IP freigeben m\u00f6chten. -message.action.remove.host=Bitte best\u00e4tigen Sie, dass Sie diesen Host entfernen m\u00f6chten. -message.action.reset.password.off=Ihre Instanz untersch\u00fctzt derzeitig nicht dieses Feature. -message.action.reset.password.warning=Ihre Instanz muss zuerst unterbrochen werden, bevor Sie Ihr derzeitiges Passwort \u00e4ndern k\u00f6nnen. -message.action.restore.instance=Bitte best\u00e4tigen Sie, dass Sie diese Instanz wiederherstellen m\u00f6chten. -message.action.revert.snapshot=Bitte best\u00e4tigen Sie, dass Sie das dazugeh\u00f6rige Volumen zu diesen Schnappschuss zur\u00fccksetzten m\u00f6chten. -message.action.start.instance=Bitte best\u00e4tigen Sie, dass Sie diese Instanz starten m\u00f6chten. -message.action.start.router=Bitte best\u00e4tigen Sie, dass Sie diesen Router starten m\u00f6chten. -message.action.start.systemvm=Bitte best\u00e4tigen Sie, dass Sie diese System-VM starten m\u00f6chten. -message.action.stop.instance=Bitte best\u00e4tigen Sie, dass Sie diese Instanz anhalten m\u00f6chten. -message.action.stop.router=Alle von diesem Router angebotenen Dienste werden unterbrochen. Bitte best\u00e4tigen Sie, dass Sie diesen Router stoppen m\u00f6chten. -message.action.stop.systemvm=Bitte best\u00e4tigen Sie, dass Sie diese System-VM stoppen m\u00f6chten. -message.action.take.snapshot=Bitte best\u00e4tigen Sie, dass Sie einen Schnappschuss von diesem Volumen sichern m\u00f6chten. -message.action.unmanage.cluster=Bitte best\u00e4tigen Sie, dass Sie das Cluster vernachl\u00e4ssigen m\u00f6chten. -message.action.vmsnapshot.delete=Bitte best\u00e4tigen Sie, dass Sie diesen VM Schnappschuss l\u00f6schen wollen. -message.action.vmsnapshot.revert=VM-Schnappschuss zur\u00fccksetzen -message.activate.project=Sind Sie sicher, dass Sie dieses Projekt aktivieren wollen? -message.add.cluster=Hinzuf\u00fcgen eines vom Hypervisor verwaltender Clusters f\u00fcr Zone , Pod -message.add.cluster.zone=Ein Hypervisor verwalteter Cluster f\u00fcr Zone hinzuf\u00fcgen -message.add.disk.offering=Bitte spezifizieren Sie die folgenden Parameter, um ein neues Festplattenangebot hinzuzuf\u00fcgen. -message.add.domain=Bitte spezifizieren Sie die Subdomain, die Sie unter dieser Domain erstellen wollen. -message.added.new.nuage.vsp.controller=Neuer Nicira Vsp Controller hinzugef\u00fcgt -message.added.vpc.offering=VPC-Angebot hinzugef\u00fcgt -message.add.firewall=Eine Firewall zur Zone hinzuf\u00fcgen -message.add.guest.network=Bitte best\u00e4tigen Sie, dass Sie ein Gast-Netzwerk hinzuf\u00fcgen m\u00f6chten. -message.add.host=Bitte spezifizieren Sie die folgenden Parameter, um einen neuen Host hinzuzuf\u00fcgen. -message.adding.host=Host wird hinzugef\u00fcgt -message.adding.Netscaler.device=Hinzuf\u00fcgen eines Netscaler Ger\u00e4tes -message.adding.Netscaler.provider=Hinzuf\u00fcgen eines Netscaler Provider -message.add.ip.range.direct.network=Einen IP-Bereich zum direkten Netzwerk in Zone hinzuf\u00fcgen -message.add.ip.range=IP-Bereich zu \u00f6ffentlichem Netzwerk in Zone hinzuf\u00fcgen -message.add.ip.range.to.pod=

Einen IP-Bereich zum Pod hinzuf\u00fcgen

-message.additional.networks.desc=Bitte w\u00e4hlen Sie ein oder mehrere Netzwerke aus, an die Ihre virtuelle Instanz verbunden wird. -message.add.load.balancer=Einen Lastverteiler zur Zone hinzuf\u00fcgen -message.add.load.balancer.under.ip=Die Lasterverteiler-Regel wurde hinzugef\u00fcgt zu IP\: -message.add.network=Eine neues Netzwerk f\u00fcr Zone hinzuf\u00fcgen\: -message.add.new.gateway.to.vpc=Bitte spezifizieren Sie Informationen um ein neues Gateway f\u00fcr dieses VPC hinzuzuf\u00fcgen. -message.add.pod.during.zone.creation=Jede Zone muss mindestens einen Pod enthalten, welchen wir nun konfigurieren und hinzuf\u00fcgen. Ein Pod enth\u00e4lt Hosts und prim\u00e4ren Storage, welche in einem sp\u00e4teren Schritt hinzugef\u00fcgt werden. Zuerst konfigurieren Sie den Bereich der reservierten IP-Adressen f\u00fcr CloudStacks internen Verwaltungsdatenverkehr. Der reservierte IP-Bereich muss f\u00fcr jede Zone in der Cloud eindeutig sein. -message.add.pod=Ein neuer Pod f\u00fcr Zone hinzuf\u00fcgen -message.add.primary=Bitte spezifizieren Sie die folgenden Parameter, um einen neuen Hauptspeicher hinzuzuf\u00fcgen -message.add.primary.storage=Bitte f\u00fcgen Sie einen neuen prim\u00e4ren Speicher f\u00fcr Zone , und Pod hinzu. -message.add.region=Bitte geben Sie die ben\u00f6tigten Informationen ein um eine neue Region hinzuzuf\u00fcgen -message.add.secondary.storage=Bitte f\u00fcgen Sie einen neuen Speicher f\u00fcr die Zone hinzu. -message.add.service.offering=Bitte geben Sie die folgenden Daten ein, um ein neues Berechnungsangebot hinzuzuf\u00fcgen. -message.add.system.service.offering=Bitte geben Sie die folgenden Daten ein, um ein neues Systemdienstangebot hinzuzuf\u00fcgen. -message.add.template=Bitte geben Sie die folgende Daten ein, um Ihre neue Vorlage zu erstellen -message.add.volume=Bitte geben Sie die folgende Daten ein, um ein neues Volumen hinzuzuf\u00fcgen. -message.add.VPN.gateway=Bitte best\u00e4tigen Sie, dass sie ein VPN Gateway hinzuf\u00fcgen wollen. -message.admin.guide.read=F\u00fcr VMware basierte VMs, lesen Sie bitte den Abschnitt \u00fcber das dynamische Skalieren in dem Administrations-Leitfaden bevor Sie hochskalieren. M\u00f6chten Sie fortfahren? -message.advanced.mode.desc=W\u00e4hlen Sie dieses Netzwerkmodell aus, wenn Sie VLAN-Unterst\u00fctzung aktivieren m\u00f6chten. Dieses Netzwerkmodell bietet die gr\u00f6\u00dfte Flexibilit\u00e4t um Administratoren kundenspezifische Netzwerkangebote zu erm\u00f6glichen, wie das Anbieten von Firewall, VPN oder Lastverteilerunterst\u00fctzung wie auch aktivieren direkten gegen virtuellen Netzwerkverkehr. -message.advanced.security.group=W\u00e4hlen Sie dies, wenn Sie Sicherheits Gruppen verwenden wollen, um eine Isolation f\u00fcr Gast VMs anzubieten. -message.advanced.virtual=W\u00e4hlen Sie dies, wenn Sie Zonen-weite VLANs verwenden wollen, um eine Isolation f\u00fcr Gast VMs anzubieten. -message.after.enable.s3=S3-gest\u00fctzter zweiter Speicher konfiguriert. Hinweis\: Wenn Sie dieses Seite verlassen, k\u00f6nnen Sie S3 nicht mehr umkonfigurieren. -message.after.enable.swift=Swift ist konfiguriert. Bemerkung\: Wenn Sie diese Seite verlassen, werden Sie nicht mehr in der Lage sein Swift um zu konfigurieren. -message.alert.state.detected=Alarmstatus erkannt -message.allow.vpn.access=Bitte geben Sie einen Benutzernamen und ein Kennwort f\u00fcr den Benutzer ein, f\u00fcr den Sie VPN-Zugang m\u00f6chten. -message.apply.snapshot.policy=Sie haben Ihre derzeitige Schnappschuss Richtlinie erfolgreich aktualisiert. -message.attach.iso.confirm=Bitte best\u00e4tigen Sie, dass sie die ISO zu Ihrer virtuellen Instanz hinzuf\u00fcgen m\u00f6chten. -message.attach.volume=Bitte f\u00fcllen Sie die folgenden Daten aus um neue Volumen anzubinden. Falls Sie das Festplattenvolumen zu einer Windows-basierten virtuellen Maschine anbinden, m\u00fcssen Sie die Instanz neu starten um die angebundene Festplatte verwenden zu k\u00f6nnen. -message.basic.mode.desc=W\u00e4hlen Sie dieses Netzwerk-Modell falls Sie *keine* VLAN-Unterst\u00fctzung aktivieren m\u00f6chten. Allen virtuellen Instanzen unter diesem Netzwerk-Modell erhalten eine IP direkt von Netzwerk, Sicherheitsgruppen werden verwendet um Sicherheit und Trennung zu gew\u00e4hrleisten. -message.change.ipaddress=Bitte best\u00e4tigen Sie, dass Sie die IP Adresse f\u00fcr dieses NIC auf dieser VM \u00e4ndern m\u00f6chten. -message.change.offering.confirm=Bitte best\u00e4tigen Sie, dass Sie das Dienstangebot dieser virtuellen Instanz \u00e4ndern m\u00f6chten. -message.change.password=Bitte \u00e4ndern Sie Ihre Passwort. -message.cluster.dedicated=Cluster dediziert -message.cluster.dedication.released=Cluster-Dedizierung aufgehoben -message.configure.all.traffic.types=Sie haben mehrere physikalische Netzwerke; bitte konfigurieren Sie f\u00fcr jeden Datenverkehrstyp Bezeichnungen indem Sie auf den Bearbeiten-Knopf klicken -message.configure.firewall.rules.allow.traffic=Konfigurieren Sie die Regeln um Datenverkehr zu erlauben -message.configure.firewall.rules.block.traffic=Konfigurieren Sie die Regeln um den Datenverkehr zu blockieren -message.configure.ldap=Bitte best\u00e4tigen Sie, dass Sie LDAP konfigurieren m\u00f6chten. -message.configuring.guest.traffic=Gast-Datenverkehr wird konfiguriert -message.configuring.physical.networks=Physikalische Netzwerke werden konfiguriert -message.configuring.public.traffic=\u00d6ffentlicher Datenverkehr wird konfiguriert -message.configuring.storage.traffic=Speicherungsdatenverkehr wird konfiguriert -message.confirm.action.force.reconnect=Bitte best\u00e4tigen Sie, dass Sie f\u00fcr diesen Host das Wiederverbinden erzwingen m\u00f6chten. -message.confirm.add.vnmc.provider=Bitte best\u00e4tigen Sie, dass Sie den VNMC-Provider hinzuf\u00fcgen m\u00f6chten. -message.confirm.archive.alert=Bitte best\u00e4tigen Sie, dass Sie diesen Alarm archivieren m\u00f6chten. -message.confirm.archive.event=Bitte best\u00e4tigen Sie, dass Sie dieses Ereignis archivieren m\u00f6chten. -message.confirm.archive.selected.alerts=Bitte best\u00e4tigen Sie, dass Sie die ausgew\u00e4hlten Alarme archivieren m\u00f6chten -message.confirm.archive.selected.events=Bitte best\u00e4tigen Sie, dass Sie die ausgew\u00e4hlten Vorg\u00e4nge archivieren m\u00f6chten -message.confirm.attach.disk=Sind Sie sicher, dass Sie eine Platte hinzuf\u00fcgen m\u00f6chten? -message.confirm.create.volume=Sind Sie sicher, dass Sie ein Volumen erstellen m\u00f6chten? -message.confirm.current.guest.CIDR.unchanged=M\u00f6chten Sie den aktuellen Gastnetzwerk CIDR unver\u00e4ndert lassen? -message.confirm.dedicate.cluster.domain.account=M\u00f6chten Sie diesen Cluster wirklich f\u00fcr diese Domain / dieses Benutzerkonto dedizieren? -message.confirm.dedicate.host.domain.account=M\u00f6chten Sie diesen Host wirklich f\u00fcr diese Domain / dieses Benutzerkonto dedizieren? -message.confirm.dedicate.pod.domain.account=M\u00f6chten Sie diesen Pod wirklich f\u00fcr diese Domain / dieses Benutzerkonto dedizieren? -message.confirm.dedicate.zone=M\u00f6chten Sie diese Zone wirklich f\u00fcr diese Domain / dieses Benutzerkonto dedizieren? -message.confirm.delete.acl.list=Sind Sie sicher, dass Sie diese ACL-Liste l\u00f6schen m\u00f6chten? -message.confirm.delete.alert=Sind Sie sicher, dass Sie diesen Alarm l\u00f6schen m\u00f6chten? -message.confirm.delete.baremetal.rack.configuration=Bitte best\u00e4tigen Sie, dass sie die Baremetal Rackkonfiguration l\u00f6schen wollen. -message.confirm.delete.BigSwitchBcf=Bitte best\u00e4tigen Sie, dass Sie diesen BigSwitch BCF Controller l\u00f6schen m\u00f6chten -message.confirm.delete.BrocadeVcs=Bitte best\u00e4tigen Sie, dass Sie Brocade Vcs Switch l\u00f6schen m\u00f6chten -message.confirm.delete.ciscoASA1000v=Bitte best\u00e4tigen Sie, dass Sie CiscoASA1000v l\u00f6schen m\u00f6chten -message.confirm.delete.ciscovnmc.resource=Bitte best\u00e4tigen Sie, dass Sie die CiscoVNMC Ressource l\u00f6schen m\u00f6chten -message.confirm.delete.F5=Bitte best\u00e4tigen Sie, dass Sie F5 l\u00f6schen m\u00f6chten -message.confirm.delete.internal.lb=Bitte best\u00e4tigen Sie, dass Sie den internen Loadbalancer l\u00f6schen m\u00f6chten -message.confirm.delete.NetScaler=Bitte best\u00e4tigen Sie, dass Sie NetScaler l\u00f6schen m\u00f6chten -message.confirm.delete.NuageVsp=Bitte best\u00e4tigen Sie, dass Sie das Nuage Virtulazierte Dienste Verzeichnis l\u00f6schen m\u00f6chten -message.confirm.delete.PA=Bitte best\u00e4tigen Sie, dass Sie Palo Alto l\u00f6schen m\u00f6chten -message.confirm.delete.secondary.staging.store=Bitte best\u00e4tigen Sie, dass Sie diesen Sekund\u00e4r-Staging-Store l\u00f6schen m\u00f6chten. -message.confirm.delete.SRX=Bitte best\u00e4tigen Sie, dass Sie SRX l\u00f6schen m\u00f6chten -message.confirm.delete.ucs.manager=Bitte best\u00e4tigen Sie, dass Sie UCS-Manager l\u00f6schen m\u00f6chten -message.confirm.destroy.router=Bitte best\u00e4tigen Sie, dass Sie diesen Router zerst\u00f6ren m\u00f6chten -message.confirm.disable.host=Bitte best\u00e4tigen Sie, dass Sie den Host deaktivieren m\u00f6chten -message.confirm.disable.network.offering=Sind Sie sicher, dass Sie dieses Netzwerkangebot deaktivieren m\u00f6chten? -message.confirm.disable.provider=Bitte best\u00e4tigen Sie, dass Sie diesen Anbieter l\u00f6schen m\u00f6chten -message.confirm.disable.vnmc.provider=Bitte best\u00e4tigen Sie, dass Sie den VNMC-Provider deaktivieren m\u00f6chten. -message.confirm.disable.vpc.offering=Sind Sie sicher, dass Sie dieses VPC-Angebot deaktivieren m\u00f6chten? -message.confirm.enable.host=Bitte best\u00e4tigen Sie, dass Sie den Host aktivieren m\u00f6chten -message.confirm.enable.network.offering=Sind Sie sicher, dass Sie dieses Netzwerkangebot aktivieren m\u00f6chten? -message.confirm.enable.provider=Bitte best\u00e4tigen Sie, dass Sie diesen Anbieter hinzuf\u00fcgen m\u00f6chten -message.confirm.enable.vnmc.provider=Bitte best\u00e4tigen Sie, dass Sie den VNMC-Provider aktivieren m\u00f6chten. -message.confirm.enable.vpc.offering=Sind Sie sicher, dass Sie dieses VPC-Angebot aktivieren m\u00f6chten? -message.confirm.join.project=Bitte best\u00e4tigen Sie, dass Sie diesem Projekt beitreten m\u00f6chten. -message.confirm.migrate.volume=M\u00f6chten Sie dieses Volumen migrieren? -message.confirm.refresh.blades=Bitte best\u00e4tigen Sie, dass Sie die Blades aktuallisieren m\u00f6chten. -message.confirm.release.dedicated.cluster=M\u00f6chten Sie diesen dedizierten Cluster freigeben? -message.confirm.release.dedicated.host=M\u00f6chten Sie diesen dedizierten Host freigeben? -message.confirm.release.dedicated.pod=M\u00f6chten Sie diesen dedizierten Pod freigeben? -message.confirm.release.dedicated.zone=M\u00f6chten Sie diese dedizierte Zone freigeben? -message.confirm.release.dedicate.vlan.range=Bitte best\u00e4tigen Sie, dass Sie ein dedizierten VLAN-Bereich losl\u00f6sen m\u00f6chten -message.confirm.remove.event=Sind Sie sicher, dass Sie dieses Ereignis entfernen m\u00f6chten? -message.confirm.remove.IP.range=Bitte best\u00e4tigen Sie, dass sie diesen IP Adressbereich l\u00f6schen m\u00f6chten. -message.confirm.remove.load.balancer=Bitte best\u00e4tigen Sie, dass Sie die VM vom Lastverteiler zur\u00fcckziehen m\u00f6chten -message.confirm.remove.network.offering=Sind Sie sicher, dass Sie dieses Netzwerkangebot entfernen m\u00f6chten? -message.confirm.remove.selected.alerts=Bitte best\u00e4tigen Sie, dass Sie die ausgew\u00e4hlten Alarme entfernen m\u00f6chten -message.confirm.remove.selected.events=Bitte best\u00e4tigen Sie, dass Sie die ausgew\u00e4hlten Ereignisse entfernen m\u00f6chten -message.confirm.remove.vmware.datacenter=Bitte best\u00e4tigen Sie, dass Sie das VMware Rechenzentrum entfernen m\u00f6chten -message.confirm.remove.vpc.offering=Sind Sie sicher, dass Sie dieses VPC-Angebot entfernen m\u00f6chten? -message.confirm.replace.acl.new.one=M\u00f6chten Sie die ACL durch die neue ersetzen? -message.confirm.scale.up.router.vm=M\u00f6chten Sie die Router-VM wirklich hochskalieren? -message.confirm.scale.up.system.vm=M\u00f6chten Sie die System-VM wirklich hochskalieren? -message.confirm.shutdown.provider=Bitte best\u00e4tigen Sie, dass sie diesen Anbieter herunterfahren m\u00f6chten. -message.confirm.start.lb.vm=Bitte best\u00e4tigen Sie, dass Sie die LB VM starten m\u00f6chten -message.confirm.stop.lb.vm=Bitte best\u00e4tigen Sie, dass Sie die LB VM stoppen m\u00f6chten -message.confirm.upgrade.router.newer.template=Bitte best\u00e4tigen Sie, dass Sie den Router aktuallisieren m\u00f6chten, so dass er die neue Vorlage verwendet. -message.confirm.upgrade.routers.account.newtemplate=Bitte best\u00e4tigen Sie, dass Sie alle Router zu dieser Benutzerkonto aktuallisieren m\u00f6chten, so dass sie die neue Vorlage verwenden. -message.confirm.upgrade.routers.cluster.newtemplate=Bitte best\u00e4tigen Sie, dass Sie alle Router in diesem Cluster aktuallisieren m\u00f6chten, so dass sie die neue Vorlage verwenden. -message.confirm.upgrade.routers.newtemplate=Bitte best\u00e4tigen Sie, dass Sie alle Router in dieser Zone aktuallisieren m\u00f6chten, so dass sie die neue Vorlage verwenden. -message.confirm.upgrade.routers.pod.newtemplate=Bitte best\u00e4tigen Sie, dass Sie alle Router in diesem Pod aktuallisieren m\u00f6chten, so dass sie die neue Vorlage verwenden. -message.copy.iso.confirm=Bitte best\u00e4tigen Sie, dass Sie Ihre ISO kopieren m\u00f6chten und zwar nach -message.copy.template.confirm=Sind Sie sicher, dass Sie die Vorlage kopieren m\u00f6chten? -message.copy.template=Kopiere Vorlage XXX von Zone nach -message.create.template=Sind Sie sicher, dass Sie eine Vorlage erstellen m\u00f6chten? -message.create.template.vm=VM aus Vorlage erstellen -message.create.template.volume=Bitte definieren Sie die folgenden Informationen bevor Sie eine Vorlage f\u00fcr Ihr Festplattenvolumen erstellen\: . Das Erstellen der Vorlage kann einige Minuten oder abh\u00e4ngig von der Volumengr\u00f6\u00dfe auch l\u00e4nger dauern. -message.creating.cluster=Cluster wird erstellt -message.creating.guest.network=Gastnetzwerk wird erstellt -message.creating.physical.networks=Physikalische Netzwerke werden erstellt -message.creating.pod=Erstelle einen Pod -message.creating.primary.storage=Hauptspeicher wird erstellt -message.creating.secondary.storage=Sekund\u00e4rspeicher wird erstellt -message.creating.systemVM=Erstellung von System VMs (das kann eine Weile dauern) -message.creating.zone=Zone wird erstellt -message.decline.invitation=Sind Sie sicher, dass Sie diese Einladung zu dem Projekt ablehnen m\u00f6chten? -message.dedicated.zone.released=Zonen-Dedizierung freigegeben -message.dedicate.zone=Dediziere Zone -message.delete.account=Bitte best\u00e4tigen Sie, dass Sie dieses Benutzerkonto l\u00f6schen m\u00f6chten. -message.delete.affinity.group=Bitte best\u00e4tigen Sie, dass Sie diese Affinit\u00e4tsgruppe l\u00f6schen m\u00f6chten. -message.delete.gateway=Bitte best\u00e4tigen Sie, dass Sie dieses Gateway l\u00f6schen m\u00f6chten -message.delete.project=Sind Sie sicher, dass Sie dieses Projekt l\u00f6schen m\u00f6chten? -message.delete.user=Bitte best\u00e4tigen Sie, dass Sie diesen Benutzer l\u00f6schen m\u00f6chten. -message.delete.VPN.connection=Bitte best\u00e4tigen Sie, dass Sie die VPN-Verbindung l\u00f6schen m\u00f6chten -message.delete.VPN.customer.gateway=Bitte best\u00e4tigen Sie, dass Sie dieses Kunden VPN Gateway l\u00f6schen m\u00f6chten -message.delete.VPN.gateway=Bitte best\u00e4tigen Sie, dass Sie dieses VPN Gateway l\u00f6schen m\u00f6chten -message.desc.add.new.lb.sticky.rule=Neue Lastverteiler Sticky Regel hinzuf\u00fcgen -message.desc.advanced.zone=F\u00fcr anspruchvollere Netzwerk-Topologien. Dieses Netzwerkmodell bietet die h\u00f6chste Flexibilit\u00e4t beim Definieren der Gast-Netzwerke und beim Anbieten von ma\u00dfgeschneiderten Nerzwerk-Angeboten wie Firewall-, VPN- oder Lastverteilungsunterst\u00fctzung. -message.desc.basic.zone=Biete ein einzelnes Netzwerk an, in dem alle VM-Instanzen direkt mit IP vom Netzwerk verbunden sind. G\u00e4steisolation kann durch Layer-3 wie Sicherheitsgruppen angeboten werden (IP-Adressen Source Filtering) -message.desc.cluster=Jeder Pod muss einen oder mehrere Clusters enthalten, und wir werden jetzt den ersten Cluster hinzuf\u00fcgen. Ein Cluster bietet die M\u00f6glichkeit Hosts zu gruppieren. Die Hosts in einem Cluster haben alle identische Hardware, betreiben den selben Hypervisor, sind im selben Subnetz und greiffen auf den selben geteilten Speicher zu. Jeder Cluster besteht aus einem oder mehreren Hosts und einem oder mehreren Hauptspeicher-Server. -message.desc.created.ssh.key.pair=Erstellte ein SSH-Schl\u00fcsselpaar. -message.desc.create.ssh.key.pair=Bitte die folgenden Daten eintragen um einen SSH-Schl\u00fcsselpaar zu registrieren oder erstellen.

(1) Wenn \u00f6ffentlicher Schl\u00fcssel ausgew\u00e4hlt, registriert CloudStack einen \u00f6ffentlichen Schl\u00fcssel. Dieser kann \u00fcber den privaten Schl\u00fcssel verwendet werden.

(2) Wenn \u00f6ffentlicher Schl\u00fcssel nicht ausgew\u00e4hlt ist, erstellt CloudStack einen neuen SSH-Schl\u00fcssel. In diesem Fall bitte den privaten Schl\u00fcssel kopieren und speichern. CloudStack wird ihn nicht speichern.
-message.desc.host=Jeder Cluster muss mindestens ein Host (Computer) beinhalten damit Gast-VMs darauf laufen k\u00f6nnen und wir werden nun den ersten Host erstellen. Damit ein Host in CloudStack funktioniert, muss eine Hypervisor-Software darauf installiert, eine IP-Adressse zugewiesen sowie sichergestellt sein, dass sich der Host mit dem CloudStack Verwaltungs-Server verbinden kann .

Geben Sie bitte den DNS-Namen oder IP-Adresse, den Benutzernamen (f\u00fcr gew\u00f6hnlich root) und das Passwort sowie jegliche Labels ein, mit denen Sie den Host kategorisieren m\u00f6chten. -message.desc.primary.storage=Jeder Cluster muss einen oder mehrere Hauptspeicher-Server enthalten, und wir werden nun den ersten erfassen. Hauptspeicher enth\u00e4lt die Festplatten-Volumen aller VMs, welche auf den Hosts in dem Cluster befinden. Benutzen Sie irgend ein standardkonformes Protokoll, welches vom darunterliegenden Hypervisor unterst\u00fctzt wird. -message.desc.reset.ssh.key.pair=Bitte definieren Sie ein SSH-Schl\u00fcsselpaar welches Sie zu dieser VM hinzuf\u00fcgen m\u00f6chten. Bitte beachten Sie, dass das Root-Passwort dabei ge\u00e4ndert wird falls es aktiviert ist. -message.desc.secondary.storage=Jede Zone muss mindestens ein NFS oder Sekund\u00e4rspeicher-Server haben und wir werden nun den ersten hinzuf\u00fcgen. Sekund\u00e4rspeicher speichert VM-Vorlagen, ISO-Abbilder und VM-Festplatten-Schnappsch\u00fcsse. Dieser Server muss f\u00fcr alle Host in der Zone erreichbar sein.

Geben Sie die IP und den exportierten Pfad an. -message.desc.zone=Eine Zone ist die gr\u00f6\u00dfte organisatorische Einheit in CloudStack und entspricht typischerweise eines einzelnen Rechenzentrum. Zonen bieten physikalische Isolation und Redundanz. Eine Zone beinhaltet einen oder mehrere Pods (jeder von Ihnen beinhaltet Hosts und Hauptspeicher-Server) und ein Sekund\u00e4rspeicher-Server, welcher von allen Pods in der Zone geteilt wird. -message.detach.disk=Sind Sie sicher, dass Sie diese Festplatte losl\u00f6sen m\u00f6chten? -message.detach.iso.confirm=Bitte best\u00e4tigen Sie, dass Sie die ISO von der virtuellen Instanz trennen m\u00f6chten. -message.disable.account=Bitte best\u00e4tigen Sie, dass Sie Ihr Benutzerkonto deaktivieren m\u00f6chten. Kein Nutzer dieses Kontos wird mehr Zugriff auf die Cloud Ressourcen haben. Alle laufenden virtuellen Maschinen werden sofort abgestellt. -message.disable.snapshot.policy=Sie haben Ihre derzeitige Schnappschuss Richtlinie erfolgreich deaktiviert. -message.disable.user=Bitte best\u00e4tigen Sie, dass Sie diesen Benutzer deaktivieren m\u00f6chten. -message.disable.vpn.access=Bitte best\u00e4tigen Sie, dass Sie den VPN Zugriff deaktivieren m\u00f6chten. -message.disable.vpn=Sind Sie sicher, dass Sie das VPN deaktivieren m\u00f6chten? -message.disabling.network.offering=Netzwerkangebot wird deaktiviert -message.disabling.vpc.offering=VPC-Angebot wird deaktiviert -message.disallowed.characters=Nicht erlaubte Zeichen\: \\<\\,\\> -message.download.ISO=Bitte klicken Sie auf 00000, um das ISO herunterzuladen -message.download.template=Bitte klicken Sie auf 00000, um die Vorlage herunterzuladen -message.download.volume=Bitte klicken Sie auf 00000, um das Volumen herunterzuladen -message.download.volume.confirm=Bitte best\u00e4tigen Sie, dass Sie dieses Volumen herunterladen m\u00f6chten. -message.edit.account=Bearbeiten ("-1" bedeutet keine Begrenzung der Anzahl Ressourcen) -message.edit.confirm=Bitte best\u00e4tigen Sie Ihre \u00c4nderungen bevor Sie "Speichern" klicken. -message.edit.limits=Bitte definieren Sie Begrenzungen f\u00fcr die folgenden Ressourcen. Ein "-1" bedeutet keine Begrenzung f\u00fcr die Ressourcen-Erstellung. -message.edit.traffic.type=Bitte definieren Sie die Datenverkehrs-Bezeichnung, welche Sie mit diesem Datenverkehrs-Typ verbunden haben m\u00f6chten. -message.enable.account=Bitte best\u00e4tigen Sie, dass Sie dieses Konto aktivieren m\u00f6chten. -message.enabled.vpn=Ihr VPN Zugriff ist zurzeit aktiv und via IP k\u00f6nnen Sie darauf zugreifen -message.enabled.vpn.ip.sec=Ihr IPSec Preshared-Schl\u00fcssel ist -message.enable.user=Bitte best\u00e4tigen Sie, dass sie diesen Benutzer aktivieren m\u00f6chten. -message.enable.vpn.access=VPN ist zurzeit nicht f\u00fcr diese IP Addresse aktiviert. M\u00f6chten Sie den VPN Zugriff aktivieren? -message.enable.vpn=Bitte best\u00e4tigen Sie, dass Sie f\u00fcr diese IP-Adresse das Remote Access VPN aktivieren m\u00f6chten. -message.enabling.network.offering=Netzwerkangebot wird aktiviert -message.enabling.security.group.provider=Sicherheitsgruppenanbieter wird aktiviert -message.enabling.vpc.offering=VPC-Angebot wird aktiviert -message.enabling.zone.dots=Zone wird aktiviert... -message.enabling.zone=Zone wird aktiviert -message.enter.seperated.list.multiple.cidrs=Bitte geben Sie eine Komma separierte Liste von CIDRs ein, sofern es mehrere sind. -message.enter.token=Bitte geben Sie dasjenige Merkmal ein, welches Ihnen in Ihrem Einladungsemail mitgeteilt wurde. -message.generate.keys=Bitte best\u00e4tigen Sie, dass Sie f\u00fcr diesen Benutzer neue Schl\u00fcssel generieren m\u00f6chten. -message.gslb.delete.confirm=Bitte best\u00e4tigen Sie, dass Sie diesen GSLB l\u00f6schen m\u00f6chten. -message.gslb.lb.remove.confirm=Bitte best\u00e4tigen Sie, dass Sie die Lastverteilung vom GSLB entfernen m\u00f6chten -message.guest.traffic.in.advanced.zone=Gastnetzwerk-Datenverkehr ist die kommunikation zwischen virtuellen Maschinen des Endbenutzers. Definieren Sie einen Bereich von VLAN IDs um den Gast-Datenverkehr jedes physikalischen Netzwerks zuzustellen. -message.guest.traffic.in.basic.zone=Gastnetzwerk-Datenverkehr ist die kommunikation zwischen virtuellen Maschinen des Endbenutzers. Definieren Sie einen Bereich von IP-Adressen welche CloudStack Gast-VMs zuweisen kann. Stellen Sie sicher, dass dieser Bereich sich nicht mit dem reservierten IP-Bereich des Systems \u00fcberlappt. -message.host.dedicated=Host dediziert -message.host.dedication.released=Host-Dedizierung freigegeben -message.installWizard.click.retry=Bitte den Start Button f\u00fcr einen neuen Versuch dr\u00fccken -message.installWizard.copy.whatIsACluster=Ein Cluster bietet die M\u00f6glichkeit Hosts zu gruppieren. Die Hosts in einem Cluster haben alle identische Hardware, laufen mit dem selben Hypervisor, sind im selben Subnetz und greifen auf den selben Speicher zu. Instanzen von virtuellen Maschinen (VMs) k\u00f6nnen von einem Host zum anderen innerhalb des Clusters live-migriert werden, ohne Unterbrechung des Dienstes f\u00fcr den Endbenutzer. Ein Cluster ist die drittgr\u00f6\u00dfte organisatorische Einheit innerhalb einer CloudStack&\#8482; Installation. Cluster sind geschlossen innerhalb Pods und Pods sind geschlossen innerhalb Zonen.

CloudStack&\#8482; erlaubt mehrere Cluster in einer Cloudinstallation, aber f\u00fcr eine Basisinstallation ben\u00f6tigen wir nur ein Cluster. -message.installWizard.copy.whatIsAHost=Ein Host ist ein einzelner Computer. Hosts bieten Rechnungsressourcen f\u00fcr virtuelle Maschinen. Jeder Host hat Hypervisorsoftware installiert, welche die G\u00e4ste-VMs verwaltet (ausgenommen davon sind Bare-Metal-Hosts, welche im erweiterten Installationsanleitung als Spezialfall behandelt werden). Beispiele f\u00fcr Hosts sind ein KVM Linuxserver, ein Citrix XenServer-Server oder auch ein ESXi-Server. In der Basisinstallation verwenden wir einen einzelnen Host mit XenServer oder KVM.

Der Host ist die kleinste, organisatorische Einheit innerhalb einer CloudStack&\#8482; Installation. Hosts befinden sind innerhalb von Clustern, Cluster innerhalb Pods und Pods innerhalb von Zonen. -message.installWizard.copy.whatIsAPod=Ein Pod steht h\u00e4ufig f\u00fcr ein einzelnes Rack. Host im selben Pod sind im selben Subnetz.

Ein Pod ist die zweitgr\u00f6\u00dfte Einheit innerhalb einer CloudStack&\#8482; Installation. Pods sind geschlossen innerhalb der Zonen. Jede Zone kann eine oder mehrere Pods enthalten; in der Basisinstallation werden Sie nur ein Pod in Ihrer Zone haben. -message.installWizard.copy.whatIsAZone=Eine Zone ist die gr\u00f6\u00dfte organisatorische Einheit innerhalb einer CloudStack&\#8482; Installation. Eine Zone steht typischerweise f\u00fcr ein einzelnes Rechenzentrum, obwohl es nat\u00fcrlich erlaubt ist, mehrere Zonen in einem Rechenzentrum zu haben. Der Vorteil einer Unterteilung der Infrastruktur in Zonen besteht im Anbieten einer physikalischen Isolierung und Redundanz. Zum Beispiel kann jede Zone ihre eigene Stromversorgung und ihr eigener Netzwerk-Uplink haben und geographisch weit auseinanderliegen (obschon dies nicht zwingend ist). -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482; ist eine Software-Plattform welche Rechenressourcen zusammenfasst, um \u00f6ffentliche, private oder hybride "Infrastructure as a Service" (IaaS) Clouds zu bauen. CloudStack&\#8482; verwaltet das Netzwerk-, Speicher- und Computingknoten was eine Cloud-Infrastruktur ausmacht. Benutzen Sie CloudStack&\#8482; um Computing-Umgebungen zu erstellen, verwalten und zu konfigurieren.

Neben dem Erweitern von individuellen virtuellen Maschinenabbilder auf auf Standardhardware bietet CloudStack&\#8482; einen schl\u00fcsselfertigen Cloud Infrastruktur-Software-Stack f\u00fcr die Bereitstellung von virtueller Rechenzentren as a Service \u2013 Liefert alle wesentlichen Komponenten f\u00fcr das Bauen, Bereitstellen und Verwalten von multi-tier- und mandantenf\u00e4higen Cloud-Anwendungen. Open-Source sowie Premium-Versionen sind verf\u00fcgbar, mit nahezu identischen Features. -message.installWizard.copy.whatIsPrimaryStorage=Eine CloudStack&\#8482; Cloud-Infrastruktur verwendet zwei Arten von Speicher\: Hauptspeicher und Sekund\u00e4rspeicher. Beide k\u00f6nnen iSCSI- oder NFS-Server, oder auch lokale Festplatten sein.

Hauptspeicher ist mit einem Cluster verbunden und speichert Festplattenvolumen aller diejenigen Gast-VMs, welche auf Hosts in diesem Cluster laufen. Der Hauptspeicher-Server ist typischerweise nahe am Host gelegen. -message.installWizard.copy.whatIsSecondaryStorage=Sekund\u00e4rspeicher wird mit einer Zone verbunden und speichert alles folgende\:
  • Vorlagen - Betriebssystemabbilder welche f\u00fcr das Booten der VMs verwendet werden und zus\u00e4tzliche Konfigurationsinformationen wie installierte Applikationen beinhalten kann
  • ISO-Abbilder - Betriebssystemabbilder welche bootbar oder nicht bootbar sein k\u00f6nnen
  • Festplattenvolumen-Schnappsch\u00fcsse - gesicherte Kopien von VM-Daten, welche f\u00fcr die Datenwiederherstellung oder f\u00fcr neue Vorlagen verwenden werden k\u00f6nnen
-message.installWizard.now.building=Ihre Cloud wird erstellt... -message.installWizard.tooltip.addCluster.name=Der Name des Clusters. Der Name kann frei gew\u00e4hlt werden und wird von Cloudstack nicht genutzt. -message.installWizard.tooltip.addHost.hostname=Der DNS-Name oder die IP-Adresse des hosts -message.installWizard.tooltip.addHost.password=Dies ist das Passwort des o.a. Users (von der XenServer Installation) -message.installWizard.tooltip.addHost.username=\u00fcberlicherweise root -message.installWizard.tooltip.addPod.name=Der Name f\u00fcr den pod -message.installWizard.tooltip.addPod.reservedSystemEndIp=Dies ist der IP-Bereich im privaten Netzwerk, welches CloudStack verwendet um Sekund\u00e4rspeicher-VMs und Konsolen-Proxies zu verwalten. Diese IP-Adressen werden vom selben Subnetz genommen wie Computing-Server. -message.installWizard.tooltip.addPod.reservedSystemGateway=Das Gateways f\u00fcr die Hosts des pod -message.installWizard.tooltip.addPod.reservedSystemNetmask=Die Subnetzmaske des Gast-Netzwerks -message.installWizard.tooltip.addPod.reservedSystemStartIp=Dies ist der IP-Bereich im privaten Netzwerk, welches CloudStack verwendet um Sekund\u00e4rspeicher-VMs und Konsolen-Proxies zu verwalten. Diese IP-Adressen werden vom selben Subnetz genommen wie Computing-Server. -message.installWizard.tooltip.addPrimaryStorage.name=Der Name der Storage Devices -message.installWizard.tooltip.addPrimaryStorage.path=(f\u00fcr NFS) Bei NFS wird hier der exportierte Pfad (Shared Mount Point) angegeben. F\u00fcr KVM wird hier der Pfad angegeben, wo auf jedem Host das primary storage gemountet wurde. Z.B. "/mnt/primary" -message.installWizard.tooltip.addPrimaryStorage.server=(f\u00fcr NFS, iSCSI oder PreSetup) Die IP-Adresse oder der DNS-Name des storage devices. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=Die IP-Adresse des NFS-Servers, der den Secondary Storage bereitstellt. -message.installWizard.tooltip.addSecondaryStorage.path=Der exportierte Pfad, der auf dem o.a. Server liegt. -message.installWizard.tooltip.addZone.dns1=Dies sind die DNS Server f\u00fcr die G\u00e4ste VMs in dieser Zone. Diese DNS Server werden \u00fcber das Interface f\u00fcr das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben. -message.installWizard.tooltip.addZone.dns2=Dies sind die DNS Server f\u00fcr die G\u00e4ste VMs in dieser Zone. Diese DNS Server werden \u00fcber das Interface f\u00fcr das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben. -message.installWizard.tooltip.addZone.internaldns1=Dies sind die DNS Server f\u00fcr die System VMs in dieser Zone. Diese DNS Server werden \u00fcber das Interface f\u00fcr das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben. -message.installWizard.tooltip.addZone.internaldns2=Dies sind die DNS Server f\u00fcr die System VMs in dieser Zone. Diese DNS Server werden \u00fcber das Interface f\u00fcr das private Netzwerk der System VMs erreicht. Die private IP Adresse, die Sie angeben muss eine Route zu dem hier benannten DNS Server haben. -message.installWizard.tooltip.addZone.name=Der Name f\u00fcr die zone -message.installWizard.tooltip.configureGuestTraffic.description=Eine Beschreibung des Netzwerkes. -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=Der Bereich der IP Adressen die f\u00fcr die Verwendung durch G\u00e4ster in dieser Zone verf\u00fcgbar sind. Wenn nur ein NIC verwendet wird, sollten die IP Adressen in demselben CIDR seind wie der CIDR des Pods. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=Das gateway, welches der Gast benutzen soll. -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=Die Subnetzmaske des Gast-Netzwerks -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=Der Bereich der IP Adressen die f\u00fcr die Verwendung durch G\u00e4ster in dieser Zone verf\u00fcgbar sind. Wenn nur ein NIC verwendet wird, sollten die IP Adressen in demselben CIDR seind wie der CIDR des Pods. -message.installWizard.tooltip.configureGuestTraffic.name=Der Name f\u00fcr das Netzwerk -message.instance.scaled.up.confirm=M\u00f6chten Sie Ihre Instanz wirklich hochskalieren? -message.instanceWizard.noTemplates=Sie haben keine Vorlagen verf\u00fcgbar; bitte f\u00fcgen Sie kompatible Vorlagen hinzu, und starten Sie den Instanz-Installationsassistent neu. -message.ip.address.changed=Ihre IP Adresse kann sich ge\u00e4ndert haben; m\u00f6chten Sie die Liste aktualisieren lassen? Bitte beachten Sie, dass sich in diesem Fall die Ansicht der Details schlie\u00dfen wird. -message.iso.desc=Dieses Disk Image enth\u00e4lt Daten oder ein bootf\u00e4higes Medium f\u00fcr das Betriebssystem. -message.join.project=Sie sind jetzt einem Projekt beigetreten. Bitte wechseln Sie in die Ansicht \u00fcber die Projekte um das Projekt zu sehen. -message.launch.vm.on.private.network=W\u00fcnschen Sie Ihre Instanze in Ihren eigenen privaten dedizierten Netzwerk zu starten? -message.launch.zone=Die Zone kann gestartet werden; bitte fahren sie mit dem n\u00e4chsten Schritt fort. -message.ldap.group.import=Alle Benutzer von der gew\u00e4hlten Gruppe werden importiert. -message.link.domain.to.ldap=Autosync f\u00fcr diese Domain mit LDAP einstellen -message.listView.subselect.multi=(Strg/Cmd-Klick) -message.lock.account=Bitte best\u00e4tigen Sie, dass Sie dieses Benutzerkonto sperren m\u00f6chten. Nach dem Sperren ist es Benutzer dieses Benutzerkontos nicht mehr m\u00f6glich, ihre Cloud Ressourcen zu verwalten. Auf bestehende Ressourcen kann aber weiterhin zugegriffen werden. -message.migrate.instance.confirm=Bitte best\u00e4tigen Sie den Host auf den Sie die virtuelle Instanz migrieren wollen. -message.migrate.instance.to.host=Bitte best\u00e4tigen sie, dass die Instanz auf einen anderen Host migriert werden soll -message.migrate.instance.to.ps=Bitte best\u00e4tigen sie, dass sie die Instanz auf einen anderen prim\u00e4ren Speicher migrieren wollen. -message.migrate.router.confirm=Bitte best\u00e4tigen Sie den Host, auf welchen Sie den Router migrieren m\u00f6chten\: -message.migrate.systemvm.confirm=Bitte best\u00e4tigen Sie den Host, auf welchen Sie die System-VM migrieren m\u00f6chten\: -message.migrate.volume=Bitte best\u00e4tigen sie, dass sie dieses Volume auf einen anderen prim\u00e4ren Speicher migrieren wollen. -message.network.addVM.desc=Bitte definieren Sie das Netzwerk, zu welchen Sie die VM hinzuf\u00fcgen m\u00f6chten. Eine neue NIC wird zu diesem Netzwerk hinzugef\u00fcgt. -message.network.addVMNIC=Bitte best\u00e4tigen Sie, dass sie eine neue VM NIC zu dieses Netzwerk hinzuf\u00fcgen m\u00f6chten. -message.network.remote.access.vpn.configuration=Remote VPN-Zugang wurde generiert, konnte aber nicht angewendet werden. Bitte \u00fcberpr\u00fcfe die Verbindung zum Netzwerkelement und probiere es neu aus. -message.new.user=Spezifieren Sie das folgende um einen neuen Nutzer dem Benutzerkonto hinzuzuf\u00fcgen -message.no.affinity.groups=Sie haben keine Affinit\u00e4ts-Gruppen. Bitte fahren Sie fort zum n\u00e4chsten Schritt. -message.no.host.available=Es ist kein Host f\u00fcr eine Migration verf\u00fcgbar -message.no.network.support.configuration.not.true=Sie haben keine Zone die eine aktivierte Sicherheitsgruppe hat. Deswegen gibt es keine zus\u00e4tzlichen Netzwerk Merkmale. Bitte fahren Sie mit Schritt 5 fort. -message.no.network.support=Ihr ausgew\u00e4hlter Hypervisor vSphere hat keine zus\u00e4tzlichen Netzwerk Merkmale. Bitte fahren Sie mit Schritt 5 fort. -message.no.projects.adminOnly=Sie haben keine Projekt.
Bitte fragen Sie Ihren Administrator damit er ein neues Projekt anlegt. -message.no.projects=Sie haben keine Projekte.
Bitte erzeugen Sie ein neues aus dem Projekt Bereich. -message.number.clusters=

\# of Cluster

-message.number.hosts=

\# of Hosts

-message.number.pods=

Anzahl derPods

-message.number.storage=

\# von Hauptspeichervolumina

-message.number.zones=

\# of Zonen

-message.outofbandmanagement.action.maintenance=Warnung Host ist im Wartungsmodus -message.outofbandmanagement.changepassword=Passwort f\u00fcr Out-of-band Verwaltung \u00e4ndern -message.outofbandmanagement.configure=Out-of-band Verwaltung konfigurieren -message.outofbandmanagement.disable=Out-of-band Verwaltung deaktivieren -message.outofbandmanagement.enable=Out-of-band Verwaltung aktivieren -message.outofbandmanagement.issue=Eine Out-of-band Verwaltungs-Strom Aktion durchf\u00fchren -message.password.has.been.reset.to=Passwort wurde zur\u00fcckgesetzt auf -message.password.of.the.vm.has.been.reset.to=Passwort der VM wurde zur\u00fcckgesetzt auf -message.pending.projects.1=Sie haben ausstehende Projekteinladungen\: -message.pending.projects.2=F\u00fcr die Ansicht wechseln Sie bitte in den Projekt Bereich und w\u00e4hlen die Einladungen aus dem Drop-down-Men\u00fc -message.please.add.at.lease.one.traffic.range=Bitte f\u00fcgen Sie mindestens einen Datenverkehrsbereich hinzu. -message.please.confirm.remove.ssh.key.pair=Bitte best\u00e4tigen Sie, dass Sie dieses SSH-Schl\u00fcsselpaar entfernen m\u00f6chten -message.please.proceed=Bitte fahren Sie mit dem n\u00e4chsten Schritt fort. -message.please.select.a.configuration.for.your.zone=Bitte w\u00e4hlen Sie eine Konfiguration f\u00fcr Ihre Zone aus. -message.please.select.a.different.public.and.management.network.before.removing=Bitte w\u00e4hlen Sie ein anderes \u00f6ffentliches und Management Netzwerk bevor Sie es l\u00f6schen -message.please.select.networks=Bitte w\u00e4hlen Sie Netzwerke f\u00fcr Ihre virtuelle Maschine aus. -message.please.select.ssh.key.pair.use.with.this.vm=Bitte ein SSH Schl\u00fcsselpaar ausw\u00e4hlen, welches Sie mit dieser VM verwenden m\u00f6chten\: -message.please.wait.while.zone.is.being.created=Bitte warten Sie solange Ihre Zone erstellt wird; dies kann einige Zeit in Anspruch nehmen... -message.pod.dedication.released=Pod-Dedizierung freigegeben -message.portable.ip.delete.confirm=Bitte best\u00e4tigen Sie, dass Sie ein portablen IP-Bereich l\u00f6schen m\u00f6chten -message.project.invite.sent=Einladung an Benutzer verschickt; sie werden zum Projekt hinzugef\u00fcgt sobald sie Einladung akzeptiert haben -message.public.traffic.in.advanced.zone=\u00d6ffentlicher Datenverkehr wird verursacht, wenn VMs in der Cloud auf das Internet zugreifen. \u00d6ffentlich zugreifbare IPs m\u00fcssen f\u00fcr diesen Zweck bezogen werden. Endbenutzer k\u00f6nnen hierf\u00fcr das CloudStack UI verwenden um NAT zwischen dem Gast-Netzwerk und Ihrem \u00f6ffentlichen Netzwerk einzurichten.

Bitte geben Sie mindestens einen Bereich von IP-Adressen f\u00fcr den Internet-Datenverkehr an. -message.public.traffic.in.basic.zone=\u00d6ffentlicher Datenverkehr wird generiert, sobald VMs in der Cloud auf das Internet zugreifen oder Dienste an Kunden \u00fcber das Internet anbieten. Hierf\u00fcr m\u00fcssen \u00f6ffentliche IPs zugewiesen werden. Wenn eine Instanz erstellt wird, wird eine \u00f6ffentliche IP von diesem Satz zus\u00e4tzlich zu der G\u00e4ste- IP-Adresse zugewiesen. Statisches 1-1-Nat wird automatisch zwischen der \u00f6ffentlichen IP und der G\u00e4ste-IP einrichtet. Endbenutzer k\u00f6nnen zudem das CloudStack UI verwenden um zus\u00e4tzliche IPs zu beziehen um statisches NAT zwischen ihren Instanzen und der \u00f6ffentlichen IP zu implementieren. -message.question.are.you.sure.you.want.to.add=Sind Sie sicher, dass Sie hinzuf\u00fcgen m\u00f6chten -message.read.admin.guide.scaling.up=Bitte lesen Sie den Abschnitt \u00fcber das dynamische Skalieren in dem Administrations-Leitfaden bevor Sie hochskalieren. -message.recover.vm=Bitte best\u00e4tigen Sie, dass Sie diese VM wiederherstellen m\u00f6chten. -message.redirecting.region=Weiterleitung zu Region... -message.reinstall.vm=Hinweis\: Mit Vorsicht verwenden. Dies wird dazu f\u00fchren, dass die VM von der Vorlage neu installiert wird; Daten auf der Root-Ferstplatte werden dadruch gel\u00f6scht. Extra Daten-Volumen, falls vorhanden, bleiben jedoch unber\u00fchrt. -message.removed.ssh.key.pair=Hat ein SSH-Schl\u00fcsselpaar entfernt -message.remove.ldap=Sind Sie sicher, dass Sie die LDAP-Konfiguration l\u00f6schen m\u00f6chten? -message.remove.region=Sind Sie sicher, dass Sie diese Region vom Verwaltungsserver entfernen m\u00f6chten? -message.remove.vpc=Bitte best\u00e4tigen Sie, dass Sie das VPC l\u00f6schen m\u00f6chten -message.remove.vpn.access=Bitte best\u00e4tigen Sie, dass Sie den VPN-Zugriff vom folgenden Benutzer entfernen m\u00f6chten. -message.reset.password.warning.notPasswordEnabled=Das Template dieser Instanz wurde erstellt ohne dass ein Passwort erforderlich ist -message.reset.password.warning.notStopped=Ihre Instanz muss gestoppt werden bevor Sie versuchen k\u00f6nnen das Passwort zu \u00e4ndern -message.reset.VPN.connection=Bitte best\u00e4tigen Sie, dass Sie die VPN-Verbindung zur\u00fccksetzen m\u00f6chten -message.restart.mgmt.server=Bitte starten Sie Ihre(n) Management Server durch, damit Ihre neuen Einstellungen aktiviert werden. -message.restart.mgmt.usage.server=Bitte starten Sie Ihre(n) Management- und Usage Server durch, damit Ihre neuen Einstellungen aktiviert werden. -message.restart.network=Alle angebotenen Dienste in diesem Netzwerk werden unterbrochen. Bitte best\u00e4tigen Sie, dass Sie dieses Netzwerk neu starten m\u00f6chten. -message.restart.vpc=Bitte best\u00e4tigen Sie, dass Sie den VPC neu starten m\u00f6chten -message.restart.vpc.remark=Bitte best\u00e4tigen Sie, dass Sie die VPC neu starten m\u00f6chten

small>Hinweis\: Ein nicht-redundante VPC redundant zu machen wird eine Bereinigung erzwingen. Die Netzwerke werden dadurch einige Minuten nicht verf\u00fcgbar sein.

-message.restoreVM=M\u00f6chten Sie die VM wiederherstellen? -message.role.ordering.fail=Die Neuordnung der Regelberechtigungen wurde abgebrochen, es sind \u00c4nderungen eingetreten, w\u00e4hrend Sie an der Liste Arbeiten durchgef\u00fchrt haben. Bitte versuchen Sie es erneut. -message.security.group.usage=(Verwenden Sie Ctrl-click um alle passenden Sicherheits Gruppen auszuw\u00e4hlen) -message.select.affinity.groups=Bitte w\u00e4hlen Sie beliebige Affinit\u00e4tsgruppen, zu denen diese VM geh\u00f6ren soll\: -message.select.a.zone=Eine Zone steht typischerweise f\u00fcr ein einzelnes Rechenzentrum. Mehrere Zonen helfen dabei, die Cloud zuverl\u00e4ssiger zu machen durch physikalische Isolation und Redundanz. -message.select.instance=Bitte w\u00e4hlen Sie eine Instanz aus. -message.select.iso=Bitte w\u00e4hlen Sie ein ISO f\u00fcr Ihre neue virtuelle Instanz aus. -message.select.item=Bitte w\u00e4hlen Sie ein Element aus. -message.select.security.groups=Bitte w\u00e4hlen Sie (eine) Sicherheitsgruppe(n) f\u00fcr Ihre neue VM aus -message.select.template=Bitte w\u00e4hlen Sie eine Vorlage f\u00fcr Ihre neue virtuelle Instanz aus. -message.select.tier=Bitte Ebene ausw\u00e4hlen -message.set.default.NIC=Bitte best\u00e4tigen Sie, dass Sie f\u00fcr die VM diese NIC zur Standard-NIC m\u00f6chten. -message.set.default.NIC.manual=Bitte aktuallisieren Sie die Standard-NIC auf der VM jetzt manuell. -message.setup.physical.network.during.zone.creation.basic=Wenn Sie eine Basiszone hinzuf\u00fcgen, k\u00f6nnen Sie ein einzelnes physikalisches Netzwerk einrichten, welches einer NIC auf dem Hypervisor entspricht. Das Netzwerk behandelt mehrere Arten von Datenverkehr.

Sie k\u00f6nnen auch weitere Datenverkehrsarten zum pysikalische Netzwerk hinzuf\u00fcgen, durch Ziehen und Loslassen. -message.setup.physical.network.during.zone.creation=Wenn Sie eine erweiterte Zone hinzuf\u00fcgen, m\u00fcssen Sie ein oder mehrere physikalische Netzweke einrichten. Jedes Netzwerk entspricht einer NIC auf dem Hypervisor. Jedes physikalische Netzwerk kann eine oder mehere Arten von Datenverkehr behandeln, mit gewissen Beschr\u00e4nkungen wie diese kombiniert werden k\u00f6nnen.

Durch Ziehen und Loslassen eines oder mehreren Datenverkehrsarten auf jedes einzelne physikalische Netzwerk. -message.setup.successful=Cloud setup erfolgreich -message.snapshot.schedule=Sie k\u00f6nnen wiederkehrende Schnapschuss-Zeitpl\u00e4ne einrichten in dem Sie die untenstehenden verf\u00fcgbaren Optionen ausw\u00e4hlen und Ihren Regeleinstellungen anwenden -message.specifiy.tag.key.value=Bitte geben Sie einen Ettikettnamen und -wert an -message.specify.url=Bitte geben Sie eine URL an -message.step.1.continue=Bitte w\u00e4hlen Sie eine Vorlage oder ISO, um fortzufahren -message.step.1.desc=Bitte w\u00e4hlen Sie eine Vorlage f\u00fcr Ihre neue virtuelle Instanz aus. Sie k\u00f6nnen auch ein leeres Template ausw\u00e4hlen, von welchen aus dann ein ISO-Abbild instaliert werden kann. -message.step.2.continue=Bitte w\u00e4hlen Sie ein Dienstangebot zum Fortfahren aus -message.step.3.continue=Bitte w\u00e4hlen Sie ein Festplattenangebot zum Fortfahren aus -message.step.4.continue=Bitte w\u00e4hlen Sie mindestens ein Netzwerk, um fortzufahren -message.step.4.desc=Bitte w\u00e4hlen Sie Ihr Hauptnetzwerk zu dem Ihre virtuelle Instanz verbunden sein wird. -message.storage.traffic=Datenverkehr zwischen den CloudStack internen Ressourcen, inklusive aller Komponenten, die mit dem Verwaltugns-Server kommunizieren, wie Hosts und CloudStack System VMs. Bitte konfigurieren Sie Speicherdatenverkehr hier. -message.suspend.project=Sind Sie sicher, dass sie die Ausf\u00fchrung dieses Projektes unterbrechen m\u00f6chten? -message.systems.vms.ready=System-VMs bereit. -message.template.copying=Vorlage wird kopiert. -message.template.desc=Betriebssystem Abbild das zum starten von VMs verwendet werden kann -message.tier.required=Ebene ist zwingend -message.tooltip.dns.1=Name eines DNS Servers zur Verwendung von VMs in der Zone. Die \u00f6ffentlichen IP Adressen m\u00fcssen eine Route zu diesem Server haben. -message.tooltip.dns.2=Ein zweiter Name eines DNS Servers zur Verwendung von VMs in der Zone. Die \u00f6ffentlichen IP Adressen m\u00fcssen eine Route zu diesem Server haben. -message.tooltip.internal.dns.1=Ein Name eines DNS Servers zur Verwendung von CloudStack internen System VMs in der Zone. Die \u00f6ffentlichen IP Adressen m\u00fcssen eine Route zu diesem Server haben. -message.tooltip.internal.dns.2=Ein Name eines DNS Servers zur Verwendung von CloudStack internen System VMs in der Zone. Die \u00f6ffentlichen IP Adressen m\u00fcssen eine Route zu diesem Server haben. -message.tooltip.network.domain=Ein DNS Suffix zur Erstellung eines Kunden Domain Namens f\u00fcr das Netzwerk das von Gast VMs verwendet wird. -message.tooltip.pod.name=Ein Name f\u00fcr diesen Pod. -message.tooltip.reserved.system.gateway=Das Gateway f\u00fcr die Hosts des pods. -message.tooltip.reserved.system.netmask=Das Netzwerk Prefix welches das Pod Subnetz definiert. Es verwendet CIDR Notation. -message.tooltip.zone.name=Einen Namen f\u00fcr die Zone. -message.update.os.preference=Bitte geben Sie eine Betriebssystem-Pr\u00e4ferenz f\u00fcr diesen Host an, Alle virtuellen Instanzen mit gleichen Pr\u00e4ferenzen werden zuerst zu diesem Host zugewiesen bevor andere gew\u00e4hlt werden. -message.update.resource.count=Bitte best\u00e4tigen Sie, dass Sie die Anzahl der Ressourcen f\u00fcr dieses Benutzerkonto aktualisieren m\u00f6chten. -message.update.ssl=Bitte eine neue X.509 kompatible SSL Zertifikatskette einreichen, diese wird auf jedem Konsolenproxy und der Sekund\u00e4rspeicher-VM aktuallisiert\: -message.update.ssl.failed=Fehler beim Aktualisieren des SSL-Zertifikats. -message.update.ssl.succeeded=Aktualisierung der SSL Zertifikate erfolgreich durchgef\u00fchrt -message.validate.accept=Bitte geben Sie einen Wert mit einer g\u00fcltigen Erweiterung ein. -message.validate.creditcard=Bitte geben Sie eine g\u00fcltige Kreditkartennummer ein. -message.validate.date=Bitte geben Sie ein g\u00fcltiges Datum ein. -message.validate.date.ISO=Bitte geben Sie ein g\u00fcltiges Datum (ISO) ein. -message.validate.digits=Bitte geben Sie nur Ziffern ein. -message.validate.email.address=Bitte geben Sie eine g\u00fcltige E-Mail-Adresse ein. -message.validate.equalto=Bitte geben Sie den gleichen Wert erneut ein. -message.validate.fieldrequired=Dieses Feld wird ben\u00f6tigt -message.validate.fixfield=Bitte korrigieren Sie dieses Feld. -message.validate.instance.name=Der Name der Instanz kann nicht l\u00e4nger als 63 Zeichen sein. Nur ASCII Zeichen wie a~z, A~Z, Zahlen 0~9 und Bindestriche sind erlaubt. Er mu\u00df mit einem Buchstaben starten und mit einem Buchstaben oder einer Zahl enden. -message.validate.invalid.characters=Ung\u00fcltige Zeichen gefunden; bitte korrigieren. -message.validate.max=Bitte geben sie einen Wert kleiner oder gleich {0} ein. -message.validate.maxlength=Bitte geben Sie nicht mehr als {0} Zeichen ein. -message.validate.minlength=Bitte geben Sie mindestens {0} Zeichen ein. -message.validate.number=Bitte geben Sie eine g\u00fcltige Nummer ein. -message.validate.range=Bitte geben Sie einen Wert zwischen {0} und {1} ein. -message.validate.range.length=Bitte geben Sie einen Wert zwischen {0} und {1} Zeichen land ein. -message.validate.URL=Bitte geben Sie eine g\u00fcltige URL ein. -message.virtual.network.desc=Ein dediziert virtualisiertes Netzwerk f\u00fcr Ihr Benutzerkonto. Die Broadcast-Domain ist innerhalb eines VLANs und jeglicher \u00f6ffentliche Netzwerkzugriff wird von einem virtuellen Router geroutet. -message.vm.create.template.confirm=Das Erstellen einer Vorlage f\u00fchrt automatisch zu einem Neustart der VM. -message.vm.review.launch=Bitte \u00fcberpr\u00fcfen Sie die folgenden Informationen und best\u00e4tigen Sie, dass Ihre virtuelle Instanz korrekt ist, bevor Sie sie starten. -message.vnmc.available.list=VNMC ist nicht verf\u00fcgbar aus der Providerliste. -message.vnmc.not.available.list=VNMC ist nicht verf\u00fcgbar aus der Providerliste. -message.volume.create.template.confirm=Bitte best\u00e4tigen Sie, dass Sie eine Vorlage aus diesem Festplatten-Volumen erstellen m\u00f6chten. Das Erstellen der Vorlage kann wenige Minuten oder auch l\u00e4nger dauern abh\u00e4ngig von der Gr\u00f6\u00dfe des Volumen. -message.waiting.for.builtin.templates.to.load=Warten bis die mitgelieferten Vorlagen geladen sind... -message.XSTools61plus.update.failed=Die Aktuallisierung des Original XS Version ist 6.1\\+ Feldes ist fehlgeschlagen. Fehlermeldung\: -message.you.must.have.at.least.one.physical.network=Sie m\u00fcssen mindestens ein physikalisches Netzwerk haben -message.your.cloudstack.is.ready=Ihr CloudStack ist bereit\! -message.zone.creation.complete.would.you.like.to.enable.this.zone=Die Erstellung der Zone ist komplett. M\u00f6chten Sie diese Zone aktivieren? -message.Zone.creation.complete=Zonenerstellung abgeschlossen -message.zone.no.network.selection=Die von Ihnen gew\u00e4hlte Zone bietet keine Alternativen f\u00fcr die Auswahl eines Netzwerks. -message.zone.step.1.desc=Bitte w\u00e4hlen Sie ein Netzwerk-Modell f\u00fcr Ihre Zone. -message.zone.step.2.desc=Bitte geben Sie die folgende Information ein, um eine neue Zone hinzuzuf\u00fcgen -message.zone.step.3.desc=Bitte geben Sie die folgende Information ein, um einen neuen pod hinzuzuf\u00fcgen -message.zoneWizard.enable.local.storage=WARNUNG\: Wenn Sie den lokalen Speicher f\u00fcr diese Zone aktivieren m\u00f6chten, m\u00fcssen Sie, abh\u00e4ngig davon wo Sie Ihre System-VMs starten m\u00f6chten, wie folgt vorgehen\:

1. Wenn die System-VMs im geteilten Hauptspeicher gestartet werden sollen, muss der geteilte Hauptspeicher nach dem Erstellen zur Zone hinzugef\u00fcgt werden. Zudem muss die Zone im deaktivierten Zustand gestartet werden.

2. Wenn die System-VMs im lokalen Hauptspeicher gestartet werden sollen, muss, "system.vm.use.local.storage" auf "true" gesetzt werden bevor Sie die Zone aktivieren.


M\u00f6chten Sie weiterfahren? -messgae.validate.min=Bitte geben sie einen Wert gr\u00f6\u00dfer oder gleich {0} ein. -mode=Modus -network.rate=Netzwerk-Rate -notification.reboot.instance=Instanz neu starten -notification.start.instance=Instanz starten -notification.stop.instance=Instanz stoppen -side.by.side=Nebeneinander -state.Accepted=Angenommen -state.Active=Aktiv -state.Allocated=Zugeteilt -state.Allocating=Zugeteilt -state.BackedUp=Daten gesichert -state.BackingUp=Daten werden gesichert -state.Completed=Fertiggestellt -state.Creating=Erstellung -state.Declined=Abgelehnt -state.Destroyed=Zerst\u00f6rt -state.detached=Losgel\u00f6st -state.Disabled=Deaktiviert -state.Enabled=Aktiviert -state.Error=Fehler -state.Expunging=Unwiederbringlich gel\u00f6scht -state.Migrating=Migration -state.Pending=Ausstehend -state.Ready=Bereit -state.Running=L\u00e4uft -state.Starting=Startet -state.Stopped=Gestoppt -state.Stopping=Stoppt -state.Suspended=Suspendiert -title.upload.volume=Volumen hochladen -ui.listView.filters.all=Alle -ui.listView.filters.mine=Meine diff --git a/client/WEB-INF/classes/resources/messages_es.properties b/client/WEB-INF/classes/resources/messages_es.properties deleted file mode 100644 index bcb8ed50ae19..000000000000 --- a/client/WEB-INF/classes/resources/messages_es.properties +++ /dev/null @@ -1,2284 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Propiedades del elemento cambiados -confirm.enable.s3=Por favor, complete la siguiente informaci\u00f3n para habilitar el soporte del Almacenamiento Secundario sobre S3 -confirm.enable.swift=Por favor, complete la siguiente informaci\u00f3n para habilitar el soporte para Swift -error.could.not.change.your.password.because.ldap.is.enabled=Error, no se puede cambiar la contrase\u00f1a porque LDAP esta activado -error.could.not.enable.zone=No se pudo accionar la zona -error.installWizard.message=Algo salio mal, debes ir para atr\u00e1s y corregir los errores. -error.invalid.username.password=Usuario o contrase\u00f1a invalido -error.login=Su nombre de usuario / contrase\u00f1a no coinciden con nuestros registros. -error.menu.select=Imposible ejecutar la acci\u00f3n, ya que no hay elementos seleccionados. -error.mgmt.server.inaccessible=El Servidor de Gesti\u00f3n es inaccesible. Por favor, int\u00e9ntelo de nuevo m\u00e1s tarde. -error.password.not.match=Los campos de contrase\u00f1a no coinciden -error.please.specify.physical.network.tags=Las Ofertas de Red no est\u00e1n disponibles hasta que se especifique los tags para esta red f\u00edsica. -error.session.expired=Su sesi\u00f3n ha caducado. -error.something.went.wrong.please.correct.the.following=Algo sali\u00f3 mal, pro favor corrija lo siguiente -error.unable.to.reach.management.server=No podemos conectar con el Management Server -error.unresolved.internet.name=El nombre de Internet no se puede resolver. -force.delete.domain.warning=Advertencia\: Si elige esta opci\u00f3n, la supresi\u00f3n de todos los dominios secundarios y todas las cuentas asociadas y sus recursos. -force.delete=Forzar el borrado -force.remove=Forzar el retiro -force.remove.host.warning=Advertencia\: Si elige esta opci\u00f3n, CloudStack para detener la fuerza todas las m\u00e1quinas virtuales en ejecuci\u00f3n antes de retirar este host del cl\u00faster. -force.stop=Forzar la detenci\u00f3n -force.stop.instance.warning=Advertencia\: Forzar la dertenci\u00f3n de esta instancia deber\u00ed\u00ada ser su \u00faltima opci\u00f3n. Puede conducir a la p\u00e9rdida de datos, as\u00ed\u00ad como un comportamiento incoherente del Estado de la m\u00e1quina virtual. -hint.no.host.tags=No se encontraron las etiquetas de servidor -hint.no.storage.tags=No se encontraron las etiquetas de almacenamiento -hint.type.part.host.tag=El tipo esta en parte de la etiqueta de servidor -hint.type.part.storage.tag=El tipo est\u00e1 en parte de la etiqueta de almacenamiento -ICMP.code=C\u00f3digo ICMP -ICMP.type=Tipo ICMP -image.directory=Directorio de im\u00e1genes -inline=alineado -instances.actions.reboot.label=Reiniciar Instancia -label.about=Acerca de -label.about.app=Acerca de CloudStack -label.accept.project.invitation=Aceptar invitaci\u00f3n al proyecto -label.account.and.security.group=Cuenta, Grupo de seguridad -label.account=Cuenta -label.account.details=Detalles de la Cuenta -label.account.id=ID de la cuenta -label.account.lower=cuenta -label.account.name=Nombre de cuenta -label.accounts=Cuentas -label.account.specific=espec\u00edficas de la cuenta -label.account.type=Tipo de Cuenta -label.acl=ACL -label.acl.id=ID de ACL -label.acl.list.rules=Lista de Reglas ACL -label.acl.name=Nombre de ACL -label.acl.replaced=ACL reemplazada -label.acquire.new.ip=Adquirir nueva IP -label.acquire.new.secondary.ip=Adquirir nuevo IP secundario -label.action=Acci\u00f3n -label.action.attach.disk=Conecte el disco -label.action.attach.disk.processing=Conectando el disco.... -label.action.attach.iso=Conectar ISO -label.action.attach.iso.processing=Conectando el ISO.... -label.action.cancel.maintenance.mode=Cancelar el modo de mantenimiento -label.action.cancel.maintenance.mode.processing=Cancelando el modo de mantenimiento.... -label.action.change.password=Cambiar la contrase\u00f1a -label.action.change.service=Cambiar el Servicio -label.action.change.service.processing=Cambiando el servicio.... -label.action.configure.samlauthorization=Configurar Autorizaci\u00f3n SAML SSO -label.action.copy.ISO=Copiar ISO -label.action.copy.ISO.processing=Copiando ISO.... -label.action.copy.template=Copiear la plantilla -label.action.copy.template.processing=Copiando Plantilla.... -label.action.create.template=Crear plantilla -label.action.create.template.from.vm=Crear plantilla de VM -label.action.create.template.from.volume=Crear plantilla de volumen -label.action.create.template.processing=Creaci\u00f3n de plantillas .... -label.action.create.vm=Crear VM -label.action.create.vm.processing=Creaci\u00f3n de m\u00e1quina virtual .... -label.action.create.volume=Crear volumen -label.action.create.volume.processing=Crear volumen .... -label.action.delete.account=Eliminar cuenta -label.action.delete.account.processing=Eliminar cuentas .... -label.action.delete.cluster=Borrar Grupo -label.action.delete.cluster.processing=Borrar Grupo .... -label.action.delete.disk.offering=Borrar disco Ofrenda -label.action.delete.disk.offering.processing=Borrar disco ofrece .... -label.action.delete.domain=Eliminar de dominio -label.action.delete.domain.processing=Eliminaci\u00f3n de dominio .... -label.action.delete.firewall=Eliminar servidor de seguridad -label.action.delete.firewall.processing=Eliminaci\u00f3n de firewall .... -label.action.delete.ingress.rule=Borrar ingreso Regla -label.action.delete.ingress.rule.processing=Eliminaci\u00f3n de ingreso regla .... -label.action.delete.IP.range=Eliminar Rango de IP -label.action.delete.IP.range.processing=Eliminar Rango de IP .... -label.action.delete.ISO=Eliminar ISO -label.action.delete.ISO.processing=Eliminaci\u00f3n de la norma ISO .... -label.action.delete.load.balancer=Eliminar equilibrador de carga -label.action.delete.load.balancer.processing=Eliminaci\u00f3n del equilibrador de carga .... -label.action.delete.network=Eliminar Red -label.action.delete.network.processing=Eliminaci\u00f3n de red .... -label.action.delete.nexusVswitch=Eliminar Nexus 1000v -label.action.delete.nic=Quitar NIC -label.action.delete.physical.network=Eliminar red f\u00edsica -label.action.delete.pod=Eliminar Pod -label.action.delete.pod.processing=Eliminar Pod .... -label.action.delete.primary.storage=Almacenamiento primario Eliminar -label.action.delete.primary.storage.processing=Eliminaci\u00f3n de almacenamiento primaria .... -label.action.delete.secondary.storage.processing=Eliminaci\u00f3n de almacenamiento secundario .... -label.action.delete.secondary.storage=secundaria almacenamiento Eliminar -label.action.delete.security.group=Borrar Grupo de Seguridad -label.action.delete.security.group.processing=Eliminar grupo de seguridad .... -label.action.delete.service.offering=Eliminar Oferta de Servicio -label.action.delete.service.offering.processing=Eliminaci\u00f3n de Oferta de Servicio .... -label.action.delete.snapshot=Eliminar instant\u00e1nea -label.action.delete.snapshot.processing=Eliminar instant\u00e1nea .... -label.action.delete.system.service.offering=Eliminar Oferta de Servicio de Sistema -label.action.delete.template=Eliminar plantilla -label.action.delete.template.processing=Eliminar plantilla .... -label.action.delete.user=Eliminar usuario -label.action.delete.user.processing=Eliminar usuario .... -label.action.delete.volume=Eliminar volumen -label.action.delete.volume.processing=Eliminar volumen .... -label.action.delete.zone=Eliminar Zona -label.action.delete.zone.processing=Eliminaci\u00f3n de la Zona .... -label.action.destroy.instance=Destruye Instancia -label.action.destroy.instance.processing=Destrucci\u00f3n Instancia .... -label.action.destroy.systemvm=destruir el sistema VM -label.action.destroy.systemvm.processing=Destrucci\u00f3n del sistema VM .... -label.action.detach.disk.processing=Extracci\u00f3n disco .... -label.action.detach.disk=Separar disco -label.action.detach.iso.processing=Extracci\u00f3n ISO .... -label.action.detach.iso=Separar ISO -label.action.disable.account=Desactivar cuenta -label.action.disable.account.processing=Deshabilitar cuenta .... -label.action.disable.cluster=Deshabilitar cl\u00faster -label.action.disable.cluster.processing=Desactivaci\u00f3n de Cluster Server .... -label.action.disable.nexusVswitch=Deshabilitar Nexus 1000v -label.action.disable.physical.network=Desactivar la red f\u00edsica -label.action.disable.pod=Deshabilitar Pod -label.action.disable.pod.processing=Deshabilitar Pod .... -label.action.disable.static.NAT=Deshabilitar NAT est\u00e1tica -label.action.disable.static.NAT.processing=Deshabilitar NAT est\u00e1tica .... -label.action.disable.user=Deshabilitar usuario -label.action.disable.user.processing=Desactivaci\u00f3n de usuario .... -label.action.disable.zone=Deshabilitar la zona -label.action.disable.zone.processing=Desactivaci\u00f3n de la zona .... -label.action.download.ISO=ISO Descargar -label.action.download.template=Descargar plantilla -label.action.download.volume=Descargar Volumen -label.action.download.volume.processing=Volumen Descargar .... -label.action.edit.account=Editar cuenta -label.action.edit.disk.offering=Editar disco Ofrenda -label.action.edit.domain=Editar Dominio -label.action.edit.global.setting=Editar Mundial Marco -label.action.edit.host=edici\u00f3n Anfitri\u00f3n -label.action.edit.instance=Editar Instancia -label.action.edit.ISO=Editar ISO -label.action.edit.network=Edici\u00f3n de redes -label.action.edit.network.offering=Editar Red ofrece -label.action.edit.network.processing=Editando Red.... -label.action.edit.pod=Editar Pod -label.action.edit.primary.storage=Editar Almacenamiento primario -label.action.edit.resource.limits=Editar l\u00edmites de recursos -label.action.edit.service.offering=Editar Oferta de Servicio -label.action.edit.template=Editar plantilla -label.action.edit.user=Editar usuario -label.action.edit.zone=Edici\u00f3n Zona -label.action.enable.account=Habilitar cuenta -label.action.enable.account.processing=cuenta de Habilitaci\u00f3n .... -label.action.enable.cluster=Habilitar cl\u00faster -label.action.enable.cluster.processing=Habilitar cl\u00faster .... -label.action.enable.maintenance.mode=Activar el modo de mantenimiento -label.action.enable.maintenance.mode.processing=Habilitaci\u00f3n del modo de mantenimiento .... -label.action.enable.nexusVswitch=Habilitar Nexus 1000v -label.action.enable.physical.network=Habilitar red f\u00edsica -label.action.enable.pod=Habilitar Pod -label.action.enable.pod.processing=Habilitaci\u00f3n Pod .... -label.action.enable.static.NAT=Habilitar NAT est\u00e1tica -label.action.enable.static.NAT.processing=Habilitar NAT est\u00e1tica .... -label.action.enable.user.processing=Habilitaci\u00f3n del usuario .... -label.action.enable.user=usuario Activar -label.action.enable.zone=Habilitar la zona -label.action.enable.zone.processing=Habilitaci\u00f3n de zona .... -label.action.expunge.instance=Borrar Instancia -label.action.expunge.instance.processing=Borrando Instancia.... -label.action.force.reconnect=Fuerza Vuelva a conectar -label.action.force.reconnect.processing=Reconectando .... -label.action.generate.keys=Generar Claves -label.action.generate.keys.processing=Generar claves .... -label.action.list.nexusVswitch=Listar Nexus 1000v -label.action.lock.account=Bloqueo de cuenta -label.action.lock.account.processing=Bloqueo de cuenta .... -label.action.manage.cluster=gestionar racimo -label.action.manage.cluster.processing=La gesti\u00f3n de cl\u00fasteres .... -label.action.migrate.instance=Migrar Instancia -label.action.migrate.instance.processing=Migrar Instancia .... -label.action.migrate.router=migrar Router -label.action.migrate.router.processing=Migraci\u00f3n router .... -label.action.migrate.systemvm=Migrar del sistema VM -label.action.migrate.systemvm.processing=La migraci\u00f3n de VM del sistema .... -label.action.reboot.instance.processing=Reiniciar Instancia .... -label.action.reboot.instance=Reiniciar Instancia -label.action.reboot.router.processing=Reiniciar router .... -label.action.reboot.router=Reiniciar router -label.action.reboot.systemvm.processing=reinicio del sistema VM .... -label.action.reboot.systemvm=Reiniciar sistema VM -label.action.recurring.snapshot=recurrente instant\u00e1neas -label.action.register.iso=Registrar ISO -label.action.register.template=Registrar plantilla desde una URL -label.action.release.ip=estreno IP -label.action.release.ip.processing=Liberar IP .... -label.action.remove.host.processing=Extracci\u00f3n de host .... -label.action.remove.host=Quitar host -label.action.reset.password.processing=Restablecimiento de la contrase\u00f1a .... -label.action.reset.password=Restablecer contrase\u00f1a -label.action.resize.volume=Cambiar el tama\u00f1o del Volumen -label.action.resize.volume.processing=Cambiar el tama\u00f1o del Volumen.... -label.action.resource.limits=Recursos l\u00edmites -label.action.restore.instance.processing=Restaurar Instancia .... -label.action.restore.instance=Restaurar Instancia -label.action.revert.snapshot.processing=Volviendo a Snapshot... -label.action.revert.snapshot=Revertir a Snapshot -label.actions=Acciones -label.action.start.instance=Iniciar Instancia -label.action.start.instance.processing=A partir Instancia .... -label.action.start.router=inicio del router -label.action.start.router.processing=A partir del router .... -label.action.start.systemvm=Inicio del sistema VM -label.action.start.systemvm.processing=A partir del sistema VM .... -label.action.stop.instance=Detener Instancia -label.action.stop.instance.processing=Detener Instancia .... -label.action.stop.router=Detener router -label.action.stop.router.processing=Detener router .... -label.action.stop.systemvm=parada del sistema VM -label.action.stop.systemvm.processing=Detener sistema VM .... -label.action.take.snapshot.processing=Tomar instant\u00e1neas .... -label.action.take.snapshot=Tomar instant\u00e1nea -label.action.unmanage.cluster.processing=Unmanaging Grupo .... -label.action.unmanage.cluster=Unmanage racimo -label.action.update.OS.preference=Actualizar OS Preferencia -label.action.update.OS.preference.processing=Actualizaci\u00f3n de sistema operativo preferencia .... -label.action.update.resource.count=Actualizaci\u00f3n de recursos Conde -label.action.update.resource.count.processing=Actualizaci\u00f3n de Conde de recursos .... -label.action.vmsnapshot.create=Tomar instant\u00e1nea de VM -label.action.vmsnapshot.delete=Borrar Instantanea de VM -label.action.vmsnapshot.revert=Volver VM a la instantanea -label.activate.project=Activar Proyecto -label.active.sessions=Sesiones activas -label.add.account=A\u00f1adir cuenta -label.add.accounts=Agregar cuentas -label.add.accounts.to=Agregar cuentas a -label.add.account.to.project=Agregar cuenta al projecto -label.add.ACL=Agregar ACL -label.add.acl.list=Agregar Lista ACL -label.add.affinity.group=Agregar un nuevo grupo de afinidad -label.add=Agregar -label.add.baremetal.dhcp.device=Agregar dispositivo Baremetal de DHCP -label.add.baremetal.rack.configuration=Agregar Configuraci\u00f3n del Rack Baremetal -label.add.BigSwitchBcf.device=Agregar Controlador BigSwitch BCF -label.add.BrocadeVcs.device=Agregar Switch Brocade Vcs -label.add.by=A\u00f1adir por -label.add.by.cidr=A\u00f1adir Por CIDR -label.add.by.group=A\u00f1adir Por el Grupo de -label.add.ciscoASA1000v=Agregar un Recurso CiscoASA1000v -label.add.cluster=A\u00f1adir Grupo -label.add.compute.offering=Agregar oferta de computo -label.add.direct.iprange=A\u00f1adir Direct IP Gama -label.add.disk.offering=A\u00f1adir disco Ofrenda -label.add.domain=Agregar dominio -label.added.brocade.vcs.switch=Nuevo Switch VCS Brocade agregado -label.added.network.offering=Oferta de Red agregada -label.added.new.bigswitch.bcf.controller=Nuevo Controlador BigSwitch BCF agregado -label.added.nicira.nvp.controller=Nuevo Controlador Nicira NVP agregado -label.add.egress.rule=Agregar regla de salida -label.addes.new.f5=Agregar nuevo F5 -label.add.F5.device=Agregar dispositivo F5 -label.add.firewall=Agregar Servidor de seguridad -label.add.globo.dns=Agregar GloboDNS -label.add.gslb=Agregar GSLB -label.add.guest.network=Agregar red de invitado -label.add.host=Agregar host -label.adding=Agregar -label.adding.cluster=Adici\u00f3n de cl\u00faster -label.adding.failed=No se pudo agregar -label.adding.pod=Agregar Pod -label.adding.processing=A\u00f1adir .... -label.add.ingress.rule=A\u00f1adir regla del ingreso -label.adding.succeeded=Agregar Sucesor -label.adding.user=Agregar usuario -label.adding.zone=Agregar la zona -label.add.intermediate.certificate=Agregar certificado de entidad intermedia -label.add.internal.lb=Agregar LB Interno -label.add.ip.range=A\u00f1adir Rango de IP -label.add.isolated.guest.network=Agregar red Aislado para Guest -label.add.isolated.guest.network.with.sourcenat=Agregar Red Aislada para Guest con SourceNat -label.add.isolated.network=Agregar Red Aislada -label.additional.networks=Redes adicional -label.add.ldap.account=Agregar cuenta LDAP -label.add.LDAP.account=Agregar Cuenta LDAP -label.add.list.name=Nombre de la Lista ACL -label.add.load.balancer=A\u00f1adir equilibrador de carga -label.add.more=A\u00f1adir m\u00e1s -label.add.netScaler.device=Agregar dispositivo Netscaler -label.add.network.ACL=Agregar ACL de Red -label.add.network.acl.list=Agregar Lista ACL de Red -label.add.network=Agregar sitios de red -label.add.network.device=A\u00f1adir dispositivo de red -label.add.network.offering=Agregar oferta de red -label.add.new.F5=Agregar un nuevo F5 -label.add.new.gateway=Agregar nuevo gateway -label.add.new.NetScaler=Agregar un nuevo NetScaler -label.add.new.PA=Agregar un nuevo Palo Alto -label.add.new.SRX=Agregar nuevo SRX -label.add.new.tier=Agregar un nuevo tier -label.add.nfs.secondary.staging.store=Agregar un Almacenamiento Secundario Temporario NFS -label.add.NiciraNvp.device=Agregar Controlador Nvp -label.add.NuageVsp.device=Agregar Nuage Virtualized Services Directory (VSD) -label.add.OpenDaylight.device=Agregar el Controlador OpenDaylight -label.add.PA.device=Agregar dispositivo Palo Alto -label.add.physical.network=Agregar red f\u00edsica -label.add.pod=A\u00f1adir Pod -label.add.portable.ip.range=Agregar un Rango IP Port\u00e1til -label.add.port.forwarding.rule=Agregar regla port forwarding -label.add.primary.storage=A\u00f1adir Almacenamiento primario -label.add.private.gateway=Agregar Gateway Privado -label.add.region=Agregar Regi\u00f3n -label.add.resources=Agregar Recursos -label.add.role=Agregar Rol -label.add.route=Agregar ruta -label.add.rule=Agregar regla -label.add.secondary.storage=A\u00f1adir secundaria almacenamiento -label.add.security.group=Agregar grupo de seguridad -label.add.service.offering=A\u00f1adir Servicio de Oferta -label.add.SRX.device=Agregar dispositivo SRX -label.add.static.nat.rule=Agregar regla NAT est\u00e1tica -label.add.static.route=Agregar ruta est\u00e1tica -label.add.system.service.offering=Agregar Oferta de Servicio del Sistema -label.add.template=A\u00f1adir plantilla -label.add.to.group=Agregar al grupo -label.add.ucs.manager=Agregar UCS Manager -label.add.user=Agregar usuario -label.add.userdata=Datos de Usuario -label.add.vlan=A\u00f1adir VLAN -label.add.vm=Agregar VM -label.add.vms=Agregar VMs -label.add.vms.to.lb=Agregar VM(s) a el balanceador de carga -label.add.VM.to.tier=Agregar VM al tier -label.add.vmware.datacenter=Agregar Datacenter VMware -label.add.vnmc.device=Agregar dispositivo VNMC -label.add.vnmc.provider=Agregar proveedor VNMC -label.add.volume=A\u00f1adir volumen -label.add.vpc=Agregar VPC -label.add.vpc.offering=Agregar Ofertas de VPC -label.add.vpn.customer.gateway=Agregar VPN para Acceso del Cliente -label.add.VPN.gateway=Agregar Gateway VPN -label.add.vpn.user=Agregar usuario VPN -label.add.vxlan=A\u00f1adir VXLAN -label.add.zone=A\u00f1adir Zona -label.admin.accounts=Administrador de Cuentas -label.admin=Admin -label.advanced=Avanzado -label.advanced.mode=Modo avanzado -label.advanced.search=B\u00fasqueda Avanzada -label.affinity=Afinidad -label.affinity.group=Grupo de Afinidad -label.affinity.groups=Grupos de Afinidades -label.agent.password=Password de Agente -label.agent.port=Puerto del Agente -label.agent.state=Estado del Agente -label.agent.username=Usuario de Agente -label.agree=De-acuerdo -label.alert=Alerta -label.alert.archived=Alerta Archivada -label.alert.deleted=Alerta Borrada -label.alert.details=Detalles de la Alerta -label.algorithm=Algoritmo -label.allocated=Asignados -label.allocation.state=Estado de la Asignaci\u00f3n -label.allow=Permitir -label.anti.affinity=Anti-afinidad -label.anti.affinity.group=Grupo de Anti-Afinidad -label.anti.affinity.groups=Grupos de Anti-Afinidad -label.api.key=clave de API -label.api.version=Versi\u00f3n de API -label.apply=Aplicar -label.app.name=CloudStack -label.archive.alerts=Archivar alertas -label.archive=Archivar -label.archive.events=Archivar sucesos -label.assign=Asignar -label.assigned.vms=VMs Asignadas -label.assign.instance.another=Asignar la instancias a otra Cuenta -label.assign.to.load.balancer=instancia de Asignaci\u00f3n de equilibrador de carga -label.assign.vms=Asignar VMs -label.associated.network.id=ID de red asociados -label.associated.network=Red Asociada -label.associated.profile=Perfil Asociado -label.associate.public.ip=Asociar IP P\u00fablica -label.attached.iso=adjunta ISO -label.author.email=e-mail del Autor -label.author.name=Nombre del Autor -label.autoscale.configuration.wizard=Asistente de configuraci\u00f3n de Escalado Autom\u00e1tico -label.autoscale=Escalado Autom\u00e1tico -label.availability=Disponibilidad -label.availability.zone=Disponibilidad de la zona -label.availabilityZone=zonaDeDisponibilidad -label.available=Disponible -label.available.public.ips=Disponible direcciones IP p\u00fablicas -label.back=Volver -label.bandwidth=Ancho de banda -label.baremetal.dhcp.devices=Dispositivo Baremetal para DHCP -label.baremetal.dhcp.provider=Proveedor Baremetal de DHCP -label.baremetal.pxe.device=Agregar Proveedor PXE para Baremetal -label.baremetal.pxe.devices=Dispositivo Baremetal para PXE -label.baremetal.pxe.provider=Proveedor PXE para Baremetal -label.baremetal.rack.configuration=Configuraci\u00f3n del Rack Baremetal -label.basic=B\u00e1sica -label.basic.mode=Modo b\u00e1sico -label.bigswitch.bcf.details=Detalles del Controlador BigSwitch BCF -label.bigswitch.bcf.nat=BigSwitch BCF con NAT habilitado -label.bigswitch.controller.address=Direcci\u00f3n del Controlador BigSwitch BCF -label.blade.id=ID de Hoja -label.blades=Hojas -label.bootable=arranque -label.broadcast.domain.range=Rango del dominio de Broadcast -label.broadcast.domain.type=Tipo de dominio de difusi\u00f3n -label.broadcasturi=broadcasturi -label.broadcast.uri=URI de Broadcast -label.broadcat.uri=URI de Broadcast -label.brocade.vcs.address=Direcci\u00f3n del Switch VCS -label.brocade.vcs.details=Detalles del Switch VCS Brocade -label.by.account=Por Cuenta -label.by.alert.type=Por tipo de alerta -label.by.availability=Por Disponibilidad -label.by.date.end=Por fecha (finalizaci\u00f3n) -label.by.date.start=Por fecha (inicio) -label.by.domain=Por dominio -label.by.end.date=Por Fecha de finalizaci\u00f3n -label.by.event.type=Por tipo de suceso -label.by.level=por Nivel -label.by.pod=Por Pod -label.by.role=por funci\u00f3n -label.by.start.date=Por Fecha de inicio -label.by.state=Por Estado -label.bytes.received=Bytes recibidos -label.bytes.sent=Bytes enviados -label.by.traffic.type=Por tipo de tr\u00e1fico -label.by.type.id=Por tipo de identificaci\u00f3n -label.by.type=Por tipo -label.by.zone=Por Zona -label.cache.mode=Tipo de cache de escritura -label.cancel=Cancelar -label.capacity.bytes=Capacidad en Bytes -label.capacity=Capacidad -label.capacity.iops=Capacidad en IOPS -label.certificate=Certificado -label.change.affinity=Cambiar Afinidad -label.change.ipaddress=Cambiar la direcci\u00f3n IP de la NIC -label.change.service.offering=Cambiar oferta de servicio -label.change.value=Cambiar valor -label.character=Personaje -label.chassis=Chasis -label.checksum=checksum -label.cidr.account=CIDR o de cuenta / Grupo de Seguridad -label.cidr=CIDR -label.cidr.list=fuente CIDR -label.CIDR.list=Lista CIDR -label.CIDR.of.destination.network=CIDR de la red destino -label.cisco.nexus1000v.ip.address=Direcci\u00f3n IP del Nexus 1000v -label.cisco.nexus1000v.password=Contrase\u00f1a del Nexus 1000v -label.cisco.nexus1000v.username=Usuario del Nexus 1000v -label.ciscovnmc.resource.details=Detalle de recursos CiscoVNMC -label.clean.up=Limpiar -label.clear.list=Limpiar lista -label.close=Cerrar -label.cloud.console=Cloud Management Console -label.cloud.managed=Cloud.com Gestionado -label.cluster=Grupo -label.cluster.name=Nombre del Cluster -label.clusters=Cluster -label.cluster.type=Tipo de Cluster Server -label.clvm=CLVM -label.code=C\u00f3digo -label.community=Comunidad -label.compute.and.storage=Computo y Almacenamiento -label.compute=Computo -label.compute.offering=Oferta de Computo -label.compute.offerings=Ofertas de Computo -label.configuration=Configuraci\u00f3n -label.configure=Configurar -label.configure.ldap=Configurar LDAP -label.configure.network.ACLs=Configurar ACLs de la Red -label.configure.sticky.policy=Configurar pol\u00edtica de Sticky -label.configure.vpc=Configurar VPC -label.confirmation=Confirmation -label.confirm.password=Confirmar password -label.congratulations=Felicitaciones \! -label.conserve.mode=Conservar modo -label.console.proxy=Consola proxy -label.console.proxy.vm=Console Proxy VM -label.continue.basic.install=Continuar con la instalaci\u00f3n b\u00e1sica -label.continue=Continuar -label.copying.iso=Copiando ISO -label.corrections.saved=Correcciones guardadas -label.counter=Contador -label.cpu.allocated=CPU asignado -label.cpu.allocated.for.VMs=CPU asignado para m\u00e1quinas virtuales -label.CPU.cap=CPU Cap -label.cpu=CPU -label.cpu.limits=L\u00edmites de CPU -label.cpu.mhz=CPU (En MHz) -label.cpu.utilized=CPU Utilizado -label.created.by.system=Creado por el sistema -label.created=creaci\u00f3n -label.create.nfs.secondary.staging.storage=Crear un Almacenamiento Secundario Temporario NFS -label.create.nfs.secondary.staging.store=Crear un NFS secundario para almacenamiento temporal -label.create.project=Crear proyecto -label.create.ssh.key.pair=Crear un par de claves SSH -label.create.template=Crear template -label.create.VPN.connection=Crear Conexi\u00f3n VPN -label.cross.zones=Cruz Zonas -label.custom=A Medida -label.custom.disk.iops=IOPS personalizadas -label.custom.disk.offering=Oferta de Disco Personalizada -label.custom.disk.size=Personal Disk Size -label.daily=diario -label.data.disk.offering=Datos Disco Offering -label.date=Fecha -label.day=D\u00eda -label.day.of.month=D\u00eda del mes -label.day.of.week=d\u00eda de la semana -label.dc.name=Nombre del DC -label.dead.peer.detection=Detecci\u00f3n de Dead Peer -label.decline.invitation=Declinar invitaci\u00f3n -label.dedicate.cluster=Dedicar el Cluster -label.dedicated=Dedicado -label.dedicate=Dedicar -label.dedicated.vlan.vni.ranges=Rangos VLAN/VNI Dedicados -label.dedicate.host=Servidor Dedicado -label.dedicate.pod=Pod Dedicado -label.dedicate.vlan.vni.range=Dedicar Rango VLAN/VNI -label.dedicate.zone=Zona Dedicada -label.default.egress.policy=Pol\u00edtica de salida por defecto -label.default=Por Defecto -label.default.use=Usar por defecto -label.default.view=Vista Por Defecto -label.delete.acl.list=Borrar Lista ACL -label.delete.affinity.group=Borrar Grupo de Afinidad -label.delete.alerts=Eliminar alertas -label.delete.baremetal.rack.configuration=Borrar Configuraci\u00f3n del Rack Baremetal -label.delete.BigSwitchBcf=Remover Controlador BigSwitch BCF -label.delete.BrocadeVcs=Remover Switch Brocade Vcs -label.delete.ciscoASA1000v=Borrar CiscoASA1000v -label.delete.ciscovnmc.resource=Borrar recurso CiscoVNMC -label.delete=Eliminar -label.delete.events=Eliminar sucesos -label.delete.F5=Borrar F5 -label.delete.gateway=borrar gateway -label.delete.internal.lb=Borrar LB Interno -label.delete.NetScaler=Borrar NetScaler -label.delete.NiciraNvp=Remover Controlado Nvp -label.delete.NuageVsp=Remover Nuage VSD -label.delete.OpenDaylight.device=Borrar el Controlador OpenDaylight -label.delete.PA=Borrar Palo Alto -label.delete.portable.ip.range=Borrar Rango IP Port\u00e1til -label.delete.profile=Borrar Perfil -label.delete.project=Eliminar proyecto -label.delete.role=Borrar Rol -label.delete.secondary.staging.store=Borrar Almacenamiento Secundario Temporario -label.delete.SRX=Borrar SRX -label.delete.ucs.manager=Borrar UCS Manager -label.delete.VPN.connection=eliminar conexi\u00f3n VPN -label.delete.VPN.customer.gateway=Borrar VPN para Acceso del Cliente -label.delete.VPN.gateway=eliminar Gateway VPN -label.delete.vpn.user=Eliminar usuario VPN -label.deleting.failed=No se pudo eliminar -label.deleting.processing=Eliminar .... -label.deny=Denegar -label.deployment.planner=Modo deployment -label.description=Descripci\u00f3n -label.destination.physical.network.id=ID de la red f\u00edsica destino -label.destination.zone=Zona de destino -label.destroy=Destroy -label.destroy.router=Destruir router -label.destroy.vm.graceperiod=Per\u00edodo de Gracia para Destruir una VM -label.detaching.disk=Extracci\u00f3n del disco -label.details=Detalles -label.device.id=ID de dispositivo -label.devices=Dispositivos -label.dhcp=DHCP -label.DHCP.server.type=Tipo de servidor DHCP -label.direct.attached.public.ip=IP P\u00fablica Conectada en forma Directa -label.direct.ips=IPs de la Red Compartida -label.disable.autoscale=Deshabilitar Escalado Autom\u00e1tico -label.disabled=personas de movilidad reducida -label.disable.host=Deshabitar Servidor -label.disable.network.offering=Deshabitar oferta de red -label.disable.provider=Deshabilitar proveedor -label.disable.vnmc.provider=Deshabitar proveedor VNMC -label.disable.vpc.offering=Deshabitar oferta VPC -label.disable.vpn=Deshabilitar VPN -label.disabling.vpn.access=Desactivaci\u00f3n de VPN de acceso -label.disassociate.profile.blade=Remover asociaci\u00f3n entre Perfil y Blade -label.disbale.vnmc.device=Deshabitar dispositivo VNMC -label.disk.allocated=disco asignado -label.disk.bytes.read.rate=Lectura de Disco (BPS) -label.disk.bytes.write.rate=Escritura a Disco (BPS) -label.disk.iops.max=IOPS m\u00e1ximas -label.disk.iops.min=IOPS m\u00ednimas -label.disk.iops.read.rate=Lectura de Disco (IOPS) -label.disk.iops.total=Total de IOPS -label.disk.iops.write.rate=Escritura de Disco (IOPS) -label.disk.offering.details=Detalles de oferta de disco -label.disk.offering=disco Ofrenda -label.diskoffering=oferta de disco -label.disk.provisioningtype=Tipo de Aprovisionamiento -label.disk.read.bytes=Lecturas del Disco (Bytes) -label.disk.read.io=Lectura de Disco (IO) -label.disk.size.gb=tama\u00f1o de disco (en GB) -label.disk.size=tama\u00f1o de disco -label.disk.total=disco Total -label.disk.volume=volumen de disco -label.disk.write.bytes=Escritura a Discos (Bytes) -label.disk.write.io=Escritura a Disco (IO) -label.display.name=Nombre a Mostrar -label.display.text=visualizaci\u00f3n de texto -label.distributedrouter=Router Distribuido -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=Dominio DNS para las Redes Guest -label.domain.admin=Administrador de dominio -label.domain.details=Detalles del Dominio -label.domain=dominio -label.domain.id=ID de dominio -label.domain.lower=dominio -label.domain.name=Nombre de dominio -label.domain.router=Router de Dominio -label.domain.suffix=DNS sufijo de dominio (es decir, xyz.com) -label.done=Listo -label.double.quotes.are.not.allowed=comillas dobles no se permite -label.download.progress=Progreso de la descarga -label.drag.new.position=Arrastrar a una nueva ubicaci\u00f3n -label.duration.in.sec=Duraci\u00f3n (en seg) -label.dynamically.scalable=Escalable Dinamicamente -label.edit.acl.rule=Editar regla ACL -label.edit.affinity.group=Editar Grupo de Afinidad -label.edit=Editar -label.edit.lb.rule=Edite regla LB -label.edit.network.details=Editar detalles de red -label.edit.project.details=Editar detalles de proyecto -label.edit.region=Editar Regi\u00f3n -label.edit.role=Editar Rol -label.edit.rule=Editar regla -label.edit.secondary.ips=Editar IPs secundarios -label.edit.tags=Editar etiquetas -label.edit.traffic.type=Edite el tipo de trafico -label.edit.vpc=Editar VPC -label.egress.default.policy=Directiva de salida predeterminada -label.egress.rule=Regla de salida -label.egress.rules=Reglas de salida -label.elastic=El\u00e1stico -label.elastic.IP=IP El\u00e1stica -label.elastic.LB=LB El\u00e1stico -label.email=correo electr\u00f3nico -label.email.lower=email -label.enable.autoscale=Habilitar Escalado Autom\u00e1tico -label.enable.host=Habilitar Servidor -label.enable.network.offering=Habilitar oferta de red -label.enable.provider=Habilitar proveedor -label.enable.s3=Habilitar Almacenamiento Secundario sobre S3 -label.enable.swift=Habilitar Swift -label.enable.vnmc.device=Habilitar dispositivo VNMC -label.enable.vnmc.provider=Habilitar proveedor VNMC -label.enable.vpc.offering=Habilitar oferta VPC -label.enable.vpn=Habilitar VPN -label.enabling.vpn.access=Habilitaci\u00f3n de Acceso VPN -label.enabling.vpn=Habilitaci\u00f3n VPN -label.end.IP=IP Final -label.endpoint=Endpoint -label.endpoint.or.operation=punto final o de Operaci\u00f3n -label.end.port=Puerto final -label.end.reserved.system.IP=\u00daltima IP de sistema Reservada -label.end.vlan=VLAN Final -label.end.vxlan=VXLAN Final -label.enter.token=Ingrese token -label.error.code=C\u00f3digo de error -label.error=Error -label.error.upper=ERROR -label.ESP.encryption=Encriptaci\u00f3n ESP -label.ESP.hash=Hash -label.ESP.lifetime=Tiempo de vida ESP (en segundos) -label.ESP.policy=Pol\u00edtica ESP -label.esx.host=ESX / ESXi anfitri\u00f3n -label.event.archived=Evento Archivado -label.event.deleted=Evento Borrado -label.event=Evento -label.every=Cada -label.example=Ejemplo -label.expunge=Purgar -label.external.link=Enlace externo -label.extractable=extra\u00edble -label.extractable.lower=extraible -label.f5.details=Detalles F5 -label.f5=F5 -label.failed=Error -label.featured=destacados -label.fetch.latest=Obtener el actual -label.filterBy=Filtrar por -label.fingerprint=Huella Digital -label.firewall=Servidor de seguridad -label.firstname.lower=nombre -label.first.name=Nombre -label.format=Formato -label.format.lower=formato -label.friday=Viernes -label.full=completo -label.full.path=Path completo -label.gateway=puerta de enlace -label.general.alerts=General de Alertas -label.generating.url=Generar URL -label.globo.dns.configuration=Configuraci\u00f3n de GloboDNS -label.globo.dns=GloboDNS -label.gluster.volume=Volumen -label.go.step.2=Ir al paso 2 -label.go.step.3=Ir al paso 3 -label.go.step.4=Ir al paso 4 -label.go.step.5=Ir al paso 5 -label.gpu=CPU -label.group.by.account=Agrupar por cuenta -label.group.by.cluster=Agrupar por cluster -label.group.by.pod=Agrupar por pod -label.group.by.zone=Agrupar por zona -label.group=Grupo -label.group.optional=Grupo (Opcional) -label.gslb.assigned.lb=Load balancing asignados -label.gslb.assigned.lb.more=Asignar m\u00e1s Load balancing -label.gslb.delete=Borrar el GSLB -label.gslb.details=Detalles del GSLB -label.gslb.domain.name=Nombre de Dominio GSLB -label.gslb=GSLB -label.gslb.lb.details=Detalles del load balancing -label.gslb.lb.remove=Remover el load balancing de este GSLB -label.gslb.lb.rule=Regla de Load balancing -label.gslb.service.private.ip=IP Privada del Servicio GSLB -label.gslb.service.public.ip=IP P\u00fablica del Servicio GSLB -label.gslb.service=Servicio GSLB -label.gslb.servicetype=Tipo de Servicio -label.guest.cidr=Habitaci\u00f3n CIDR -label.guest.end.ip=IP final del Guest -label.guest.gateway=Habitaci\u00f3n Gateway -label.guest=Guest -label.guest.ip=Habitaci\u00f3n direcci\u00f3n IP -label.guest.ip.range=Habitaci\u00f3n Rango de IP -label.guest.netmask=Habitaci\u00f3n m\u00e1scara de red -label.guest.network.details=Detalles de las redes Guest -label.guest.networks=Redes de invitado -label.guest.start.ip=IP inicial del Guest -label.guest.traffic=Tr\u00e1fico del Guest -label.guest.traffic.vswitch.name=Nombre del vSwitch para Tr\u00e1fico Guest -label.guest.traffic.vswitch.type=Tipo de vSwitch para Tr\u00e1fico Guest -label.guest.type=Tipo de Guest -label.ha.enabled=HA Activado -label.health.check.advanced.options=Opciones Avanzadas\: -label.health.check.configurations.options=Opciones de Configuraci\u00f3n\: -label.health.check.interval.in.sec=Intervalo de Health Check (en seg) -label.health.check.message.desc=Tu load balancer automaticamente har\u00e1 health checks en tus instancias cloudstack y solo pasar\u00e1 el tr\u00e1fico a las instancias que lo cumplan. -label.health.check=Verificaci\u00f3n de Salud -label.health.check.wizard=Wizard para Health Check -label.healthy.threshold=Barrera de Salud -label.help=Ayuda -label.hide.ingress.rule=Ocultar el art\u00edculo ingreso -label.hints=Sugerencias -label.home=Inicio -label.host.alerts=Servidores en Estado de Alerta -label.host=Ej\u00e9rcitos -label.host.MAC=MAC del Host -label.host.name=nombre de host -label.hosts=Ej\u00e9rcitos -label.host.tag=Etiqueta del Servidor -label.host.tags=Etiquetas de Host -label.hourly=por hora -label.hvm=HVM -label.hypervisor.capabilities=Capacidades del Hipervisor -label.hypervisor=Hypervisor -label.hypervisors=Hipervisores -label.hypervisor.snapshot.reserve=Reserva de instant\u00e1neas de hipervisores -label.hypervisor.type=Tipo Hypervisor -label.hypervisor.version=Versi\u00f3n del Hipervisor -label.hyperv.traffic.label=Etiqueta de tr\u00e1fico HyperV -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=Encriptaci\u00f3n IKE -label.IKE.hash=Hash IKE -label.IKE.lifetime=IKE lifetime (segundos) -label.IKE.policy=Pol\u00edtica IKE -label.info=Informaci\u00f3n -label.info.upper=INFO -label.ingress.rule=ingreso Regla -label.initiated.by=Iniciado por -label.inside.port.profile=Dentro del Perfil de Puerto -label.installWizard.addClusterIntro.subtitle=\u00bfQu\u00e9 es un cluster? -label.installWizard.addClusterIntro.title=Agreguemos un cl\u00faster -label.installWizard.addHostIntro.subtitle=\u00bfQu\u00e9 es un servidor? -label.installWizard.addHostIntro.title=Agreguemos un servidor -label.installWizard.addPodIntro.subtitle=\u00bfQue es un Pod? -label.installWizard.addPodIntro.title=Agreguemos un Pod -label.installWizard.addPrimaryStorageIntro.subtitle=\u00bfQu\u00e9 es el almacenamiento primario? -label.installWizard.addPrimaryStorageIntro.title=Agreguemos almacenamiento primario -label.installWizard.addSecondaryStorageIntro.subtitle=Que es almacenamiento secundario? -label.installWizard.addSecondaryStorageIntro.title=A\u00f1adir almacenamiento secundario -label.installWizard.addZoneIntro.subtitle=\u00bfQu\u00e9 es una zona? -label.installWizard.addZoneIntro.title=Agreguemos una zona -label.installWizard.addZone.title=Agregar zona -label.installWizard.click.launch=Click en el bot\u00f3n de lanzar. -label.installWizard.subtitle=Esta gu\u00eda te ayudar\u00e1 a configurar la instalaci\u00f3n de CloudStack&\#848 -label.installWizard.title=Hola y Bienvenido a CloudStack&\#8482 -label.instance=Instancia -label.instance.limits=Instancia L\u00edmites -label.instance.name=Nombre de instancia -label.instance.port=Puerto de Instancia -label.instance.scaled.up=Instancia escalada a lo requerido en la oferta -label.instances=Instancias -label.instanciate.template.associate.profile.blade=Instanciar Plantilla y asociar al Perfil del Blade -label.intermediate.certificate=Entidad de Certificaci\u00f3n Intermedia {0} -label.internal.dns.1=DNS interno una -label.internal.dns.2=DNS interno 2 -label.internal.lb.details=Detalles del LB Interno -label.internal.lb=LB interno -label.internallbvm=LbVmInterna -label.internal.name=Nombre interno -label.interval.type=Tipo de intervalo -label.introduction.to.cloudstack=Introducci\u00f3n a CloudStack&\#8482 -label.invalid.integer=entero no v\u00e1lido -label.invalid.number=N\u00famero no v\u00e1lido -label.invitations=Invitaciones -label.invited.accounts=Cuentas de invitado -label.invite=Invitar -label.invite.to=Invitar a . -label.ip.address=Direcci\u00f3n IP -label.ipaddress=Direcci\u00f3n IP -label.ip.allocations=IP asignaciones -label.ip=IP -label.ip.limits=IP p\u00fablica L\u00edmites -label.ip.or.fqdn=IP o FQDN -label.ip.range=Rango de IP -label.ip.ranges=Rangos de IP -label.IPsec.preshared.key=IPsec Preshared-Key -label.ips=IP -label.ipv4.cidr=IPv4 CIDR -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.ipv4.end.ip=IP Final IPv4 -label.ipv4.gateway=Gateway IPv4 -label.ipv4.netmask=Netmask IPv4 -label.ipv4.start.ip=IP Inicial IPv4 -label.ipv6.address=Direcci\u00f3n IP IPv6 -label.ipv6.CIDR=IPv6 CIDR -label.ipv6.dns1=IPv6 DNS1 -label.ipv6.dns2=IPv6 DNS2 -label.ipv6.end.ip=IP Final IPv6 -label.ipv6.gateway=Gateway IPv6 -label.ipv6.start.ip=IP Inicial IPv6 -label.iscsi=iSCSI -label.is.default=Es por defecto -label.iso.boot=ISO de arranque -label.iso=ISO -label.isolated.networks=Redes Aisladas -label.isolation.method=M\u00e9todo de aislamiento -label.isolation.mode=modo de aislamiento -label.isolation.uri=URI de aislamiento -label.is.redundant.router=redundante -label.is.shared=es compartido -label.is.system=es el Sistema -label.item.listing=Listando art\u00edculos -label.japanese.keyboard=Teclado Japones -label.keep.colon=Conservar\: -label.keep=Mantener -label.keyboard.language=Lenguaje del Teclado -label.keyboard.type=Tipo de teclado -label.key=Llave -label.kvm.traffic.label=Etiqueta de tr\u00e1fico KVM -label.label=Etiqueta -label.lang.arabic=\u00c1rabe -label.lang.brportugese=Portugues de Brasil -label.lang.catalan=Catal\u00e1n -label.lang.chinese=Chino (simplificado) -label.lang.dutch=Holandes -label.lang.english=Ingl\u00e9s -label.lang.french=Frances -label.lang.german=Aleman -label.lang.hungarian=Hungaro -label.lang.italian=Italiano -label.lang.japanese=japon\u00e9s -label.lang.korean=Coreano -label.lang.norwegian=Noruego -label.lang.polish=Polaco -label.lang.russian=Ruso -label.lang.spanish=Espa\u00f1ol -label.last.disconnected=\u00daltima Desconectado -label.last.name=Apellido -label.lastname.lower=apellido -label.latest.events=\u00daltimos eventos -label.launch=Lanzar -label.launch.vm=Lanzar maquina virtual -label.launch.zone=Lanzar zona -label.lb.algorithm.leastconn=Menor cantidad de conexiones -label.lb.algorithm.roundrobin=Round-robin -label.lb.algorithm.source=Fuente -label.LB.isolation=Aislamiento de LB -label.ldap.configuration=Configuraci\u00f3n de LADP -label.ldap.group.name=Grupo LDAP -label.ldap.link.type=Tipo -label.ldap.port=Puerto de LDAP -label.level=Nivel -label.link.domain.to.ldap=Enlazar Dominio a LDAP -label.linklocal.ip=Direcci\u00f3n IP del Link Local -label.load.balancer=equilibrador de carga -label.load.balancer.type=Tipo de Load Balancer -label.load.balancing=Balanceador de Carga -label.load.balancing.policies=Pol\u00edticas del balanceador de carga -label.loading=Carga -label.local.file=Archivo local -label.local=local -label.local.storage=Almacenamiento Local -label.local.storage.enabled=Habilitar almacenamiento local para VMs de Usuarios -label.local.storage.enabled.system.vms=Habilitar almacenamiento local para VMs de Sistema -label.login=Login -label.logout=Cerrar sesi\u00f3n -label.lun=LUN -label.LUN.number=LUN \# -label.lxc.traffic.label=Etiqueta de tr\u00e1fico LXC -label.make.project.owner=Convertir la cuenta en due\u00f1a del proyecto -label.make.redundant=Hacer redundante -label.manage=Administrar -label.managed=Gestionado -label.management.ips=Direcci\u00f3n IP de Management -label.management=Management -label.management.server=Management Server -label.manage.resources=Administrar los Recursos -label.max.cpus=CPU cores M\u00e1x. -label.max.guest.limit=L\u00edmite Guest M\u00e1x. -label.maximum=m\u00e1ximo -label.max.instances=Instancias M\u00e1ximas -label.max.memory=Memoria M\u00e1x. (MiB) -label.max.networks=Redes M\u00e1x. -label.max.primary.storage=Primario M\u00e1x. (GiB) -label.max.public.ips=IPs p\u00fablicas M\u00e1x. -label.max.secondary.storage=Secundario M\u00e1x. (GiB) -label.max.snapshots=Instant\u00e1neas M\u00e1x. -label.max.templates=Plantillas M\u00e1ximos -label.max.vms=VMs de usuario M\u00e1x. -label.max.volumes=Maxima cantidad de Volumes -label.max.vpcs=VPCs M\u00e1x. -label.may.continue=Ahora puede continuar. -label.md5.checksum=suma de verificaci\u00f3n MD5 -label.memory.allocated=memoria asignada -label.memory.limits=L\u00edmite de Memoria (MiB) -label.memory.mb=Memoria (En MB) -label.memory=memoria (en MB) -label.memory.total=Total de memoria -label.memory.used=memoria usada -label.menu.accounts=Cuentas -label.menu.alerts=Alertas -label.menu.all.accounts=Todas las cuentas -label.menu.all.instances=todas las instancias -label.menu.community.isos=Comunidad ISOs -label.menu.community.templates=plantillas de la comunidad -label.menu.configuration=Configuraci\u00f3n -label.menu.dashboard=Interfaz -label.menu.destroyed.instances=Destruir instancias -label.menu.disk.offerings=disco ofertas -label.menu.domains=dominio -label.menu.events=Eventos -label.menu.featured.isos=destacados ISO -label.menu.featured.templates=destacados plantillas -label.menu.global.settings=Configuraci\u00f3n global -label.menu.infrastructure=Infraestructura -label.menu.instances=Instancias -label.menu.ipaddresses=Direcciones IP -label.menu.isos=ISO -label.menu.my.accounts=Mis cuentas -label.menu.my.instances=Mi instancias -label.menu.my.isos=Mi ISOs -label.menu.my.templates=Mis plantillas -label.menu.network.offerings=Red de ofertas -label.menu.network=Red -label.menu.physical.resources=Recursos F\u00edsicos -label.menu.regions=Regiones -label.menu.running.instances=Ejecuci\u00f3n de instancias -label.menu.security.groups=Grupos de seguridad -label.menu.service.offerings=Ofertas de Servicios -label.menu.snapshots=instant\u00e1neas -label.menu.sshkeypair=Par de Claves SSH -label.menu.stopped.instances=Detenido instancias -label.menu.storage=Almacenamiento -label.menu.system.service.offerings=Ofertas de Sistema -label.menu.system=Sistema -label.menu.system.vms=Sistema de m\u00e1quinas virtuales -label.menu.templates=plantillas -label.menu.virtual.appliances=Virtual Appliances -label.menu.virtual.resources=Virtual de Recursos -label.menu.volumes=Vol\u00famenes -label.menu.vpc.offerings=Ofertas de VPC -label.metrics.allocated=Asignados -label.metrics.clusters=Cluster -label.metrics.cpu.allocated=Asignaci\u00f3n de CPU -label.metrics.cpu.max.dev=Desviaci\u00f3n -label.metrics.cpu.total=Total -label.metrics.cpu.usage=Uso de CPU -label.metrics.cpu.used.avg=Usado -label.metrics.disk.allocated=Asignados -label.metrics.disk=Disco -label.metrics.disk.iops.total=IOPS -label.metrics.disk.read=Lectura -label.metrics.disk.size=Tama\u00f1o -label.metrics.disk.storagetype=Tipo -label.metrics.disk.total=Total -label.metrics.disk.unallocated=Sin asignar -label.metrics.disk.usage=Uso del Disco -label.metrics.disk.used=Usado -label.metrics.disk.write=Escritura -label.metrics.hosts=Ej\u00e9rcitos -label.metrics.memory.allocated=Asignaci\u00f3n de Memoria -label.metrics.memory.max.dev=Desviaci\u00f3n -label.metrics.memory.total=Total -label.metrics.memory.usage=Uso de Memoria -label.metrics.memory.used.avg=Usado -label.metrics=M\u00e9tricas -label.metrics.name=Nombre -label.metrics.network.read=Lectura -label.metrics.network.usage=Uso de la Red -label.metrics.network.write=Escritura -label.metrics.num.cpu.cores=Cores -label.metrics.outofbandmanagementpowerstate=Estado de la Alimentaci\u00f3n -label.metrics.property=Propiedad -label.metrics.scope=Alcance -label.metrics.state=Estado -label.metrics.storagepool=Pool de Almacenamiento -label.metrics.vm.name=Nombre de la VM -label.migrate.instance.to.host=Migrar instancia a otro host. -label.migrate.instance.to=Migraci\u00f3n de ejemplo para -label.migrate.instance.to.ps=Migrar instancia a otro primary storage. -label.migrate.lb.vm=Migrar LB VM -label.migrate.router.to=Router para migrar -label.migrate.systemvm.to=Migrar m\u00e1quina virtual del sistema para -label.migrate.to.host=Migrar a host -label.migrate.to.storage=Migrar a almacenamiento -label.migrate.volume=Migrar Volumen -label.migrate.volume.to.primary.storage=Migrar volumen a otro almacenamiento primario -label.minimum=M\u00ednimo -label.min.instances=Instancias M\u00ednimas -label.min.past.the.hr=minuto(s) despu\u00e9s de la hora -label.minute.past.hour=minuto(s) despu\u00e9s de la hora -label.minutes.past.hour=minuto(s) despu\u00e9s de la hora -label.mode=modo -label.monday=lunes -label.monthly=mensual -label.more.templates=plantillas \= M\u00e1s -label.move.down.row=Mover abajo una fila -label.move.to.bottom=Mover al fondo -label.move.to.top=Mover al principio -label.move.up.row=Mover una fila arriba -label.my.account=Mi Cuenta -label.my.network=Mi red -label.my.templates=Mis plantillas -label.name.lower=Nombre -label.name=Nombre -label.name.optional=Nombre (Opcional) -label.na=N/A -label.nat.port.range=Rango puertos NAT -label.netmask=m\u00e1scara de red -label.netscaler.details=Detalles del NetScaler -label.netScaler=NetScaler -label.network.ACL=ACL de Red -label.network.ACLs=ACLs de Red -label.network.ACL.total=ACL Total de la Red -label.network.addVM=Agregar red a VM -label.network.cidr=CIDR de Red -label.network.desc=Red de Desc -label.network.details=Detalles de la Red -label.network.device=De dispositivos de red -label.network.device.type=Tipo de red de dispositivos -label.network.domain=red de dominio -label.network.domain.text=Dominio de Red -label.network.id=ID de red -label.networking.and.security=Redes y Seguridad -label.network.label.display.for.blank.value=Usar default gateway -label.network.limits=L\u00edmites de la Red -label.network.name=Nombre de red -label.network.offering.details=Detalles de la oferta de red -label.network.offering.display.text=Red ofrece visualizaci\u00f3n de texto -label.network.offering.id=Red ofrece ID -label.network.offering.name=Red ofrece Nombre -label.network.offering=Red ofrece -label.network.rate.megabytes=Tr\u00e1fico de Red (MB/s) -label.network.rate=Tasa de Red -label.network.read=Leer de la red -label.network=Red -label.network.service.providers=Proveedores de Servicios de Red -label.networks=Redes -label.network.type=Tipo de red -label.network.write=Escribir en la red -label.new=Nuevo -label.new.password=Nueva contrase\u00f1a -label.new.project=Nuevo Proyecto -label.new.ssh.key.pair=Nuevo Par de Claves SSH -label.new.vm=Nueva maquina virtual -label.next=Siguiente -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=servidor NFS -label.nfs.storage=NFS Almacenamiento -label.nic.adapter.type=Tipo de adaptador NIC -label.nicira.controller.address=Direcci\u00f3n de Controladora -label.nicira.l2gatewayserviceuuid=UUID del Servicio L2 Gateway -label.nicira.l3gatewayserviceuuid=UUID del Servicio L3 Gateway -label.nicira.nvp.details=Detalles del NVP Nicira -label.nicira.transportzoneuuid=UUID de la Zona de Transporte -label.nics=NIC -label.no.actions=No Acciones disponibles -label.no.alerts=No alertas recientes -label.no.data=No hay informaci\u00f3n que mostrar -label.no.errors=No recientes errores -label.no.grouping=(sin agrupar) -label.no.isos=No ISOs disponibles -label.no.items=No art\u00edculos disponibles -label.none=Ninguno -label.no=No -label.no.security.groups=No hay grupos disponibles de Seguridad -label.not.found=No se ha encontrado -label.no.thanks=No, gracias -label.notifications=Notificaciones -label.number.of.clusters=N\u00famero de Clusters -label.number.of.cpu.sockets=Cantidad de Sockets de CPU -label.number.of.hosts=N\u00famero de Hosts -label.number.of.pods=N\u00famero de Pods -label.number.of.system.vms=N\u00famero de VM\\'s del Systema -label.number.of.virtual.routers=N\u00famero de Routers Virtuales -label.number.of.zones=N\u00famero de Zonas -label.num.cpu.cores=n\u00famero de n\u00facleos de CPU -label.numretries=N\u00famero de reintentos -label.ocfs2=OCFS2 -label.offer.ha=Oferta HA -label.of.month=de mes -label.ok=Aceptar -label.opendaylight.controller=Controlador OpenDaylight -label.opendaylight.controllerdetail=Detalles del Controlador OpenDaylight -label.opendaylight.controllers=Controlador OpenDaylight -label.openDaylight=OpenDaylight -label.operator=Operador -label.optional=Opcional -label.order=Ordenar -label.os.preference=OS Preferencia -label.os.type=tipo de Sistema Operativo -label.other=Otro -label.outofbandmanagement.action=Acci\u00f3n -label.outofbandmanagement.action.issue=Enviar Acci\u00f3n de Gesti\u00f3n de Alimentac\u00edon Fuera-de-Banda -label.outofbandmanagement.address=Direcci\u00f3n -label.outofbandmanagement.changepassword=Cambiar la contrase\u00f1a de la gesti\u00f3n Out-of-band -label.outofbandmanagement.configure=Configurar Gesti\u00f3n Out-of-band -label.outofbandmanagement.disable=Deshabilitar Gesti\u00f3n Out-of-band -label.outofbandmanagement.driver=Driver -label.outofbandmanagement.enable=Habilitar Gesti\u00f3n Out-of-band -label.outofbandmanagement=Gesti\u00f3n Out-of-band -label.outofbandmanagement.password=Contrase\u00f1a -label.outofbandmanagement.port=Puerto -label.outofbandmanagement.reenterpassword=Reingresar contrase\u00f1a -label.outofbandmanagement.username=Nombre de usuario -label.override.guest.traffic=Sobreescribir Tr\u00e1fico Guest -label.override.public.traffic=Sobreescribir Tr\u00e1fico Public -label.ovm3.cluster=Cluster Nativo -label.ovm3.pool=Pooling Nativo -label.ovm3.traffic.label=Etiqueta de tr\u00e1fico OVM3 -label.ovm3.vip=IP del VIP Master -label.ovm.traffic.label=Etiqueta de tr\u00e1fico OVM -label.ovs=OVS -label.owned.public.ips=propiedad p\u00fablica Direcciones IP -label.owner.account=titular de la cuenta -label.owner.domain=Due\u00f1o del Dominio -label.palo.alto.details=Detalles de Palo Alto -label.PA.log.profile=Perfil de Palo Alto Log -label.PA=Palo Alto -label.parent.domain=Padres de dominio -label.passive=Pasivo -label.password=Contrase\u00f1a -label.password.enabled=Contrase\u00f1a Activado -label.password.lower=contrase\u00f1a -label.password.reset.confirm=La Contrase\u00f1a se ha cambiado a -label.PA.threat.profile=Perf\u00edl de Amenazas Palo Alto -label.path=Ruta -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.permission=Autorizaciones -label.persistent=Persistente -label.physical.network.ID=ID de red f\u00edsica -label.physical.network.name=Nombre de red f\u00edsica -label.physical.network=Red F\u00edsica -label.PING.CIFS.password=PING CIFS contrase\u00f1a -label.PING.CIFS.username=PING CIFS nombre de usuario -label.PING.dir=PING Directorio -label.ping.path=Camino de Ping -label.PING.storage.IP=PING almacenamiento IP -label.planner.mode=Modo planificaci\u00f3n -label.please.complete.the.following.fields=Por favor complete los siguientes campos -label.please.specify.netscaler.info=Por favor especifique la informaci\u00f3n del Netscaler -label.please.wait=Por favor espere -label.plugin.details=Detalles del Plugin -label.plugins=Plugins -label.pod.dedicated=Pod Dedicado -label.pod.name=Nombre del Pod -label.pod=Pod -label.pods=Pod -label.polling.interval.sec=Intervalo de Pooling (en seg) -label.portable.ip=IP Port\u00e1til -label.portable.ip.range.details=Detalles del Rango de IP port\u00e1til -label.portable.ip.ranges=Rangos de IP port\u00e1tiles -label.portable.ips=IPs Port\u00e1tiles -label.port.forwarding.policies=Pol\u00edticas de Port forwarding -label.port.forwarding=Port Forwarding -label.port=Puerto -label.port.range=rango de puertos -label.powerstate=Estado de la Alimentaci\u00f3n -label.PreSetup=PreSetup -label.prev=Anterior -label.previous=Previo -label.primary.allocated=primaria asignado de almacenamiento -label.primary.network=Red Primaria -label.primary.storage=Almacenamiento Primario -label.primary.storage.count=Pool Almacenamiento Primario -label.primary.storage.limits=L\u00edmite del Almacenamiento Primario (GiB) -label.primary.used=Primaria Almacenado -label.private.Gateway=Gateway Privado -label.private.interface=Interfaz privada -label.private.ip=direcci\u00f3n IP privada -label.private.ip.range=IP privada Gama -label.private.ips=direcciones IP privadas -label.private.key=Clave Privada -label.privatekey=PKCS\#8 la clave privada -label.private.network=Red privada -label.private.port=Puerto privado -label.private.zone=Zona Privada -label.profile=Perfil -label.project.dashboard=Tablero del Proyecto -label.project.id=ID proyecto -label.project.invite=Invitar al proyecto -label.project.name=Nombre del Proyecto -label.project=proyecto -label.projects=proyectos -label.project.view=Vista de Proyecto -label.protocol.number=N\u00famero de Protocolo -label.protocol=Protocolo -label.provider=Proveedor -label.providers=Proveedores -label.public.interface=interfaz p\u00fablica -label.public.ip=direcci\u00f3n IP p\u00fablica -label.public.ips=direcciones IP p\u00fablicas -label.public.key=Clave P\u00fablica -label.public.lb=LB P\u00fablico -label.public.load.balancer.provider=Proveedor de Load Balancer P\u00fablico -label.public.network=Red P\u00fablica -label.public.port=Puerto P\u00fablico -label.public=P\u00fablica -label.public.traffic=Tr\u00e1fico p\u00fablico -label.public.traffic.vswitch.name=Nombre de vSwitch para Tr\u00e1fico Public -label.public.traffic.vswitch.type=Tipo de vSwitch para Tr\u00e1fico Public -label.public.zone=Zona P\u00fablica -label.purpose=Prop\u00f3sito -label.Pxe.server.type=Tipo de servidor Pxe -label.qos.type=Tipo de QoS -label.quickview=Vista R\u00e1pida -label.quiesce.vm=Colocar en estado consistente a la VM -label.quiet.time.sec=Tiempo en Silencio (en seg) -label.quota.add.credits=Agregar Cr\u00e9ditos -label.quota.balance=Balance -label.quota.configuration=Configuraci\u00f3n de Quota -label.quota.configure=Configurar Quota -label.quota.credit=Cr\u00e9dito -label.quota.credits=Cr\u00e9ditos -label.quota.date=Fecha -label.quota.dates=Modificar Fechas -label.quota.description=Descripci\u00f3n de Quota -label.quota.email.body=Cuerpo -label.quota.email.lastupdated=\u00daltima Modificaci\u00f3n -label.quota.email.subject=Tema -label.quota.email.template=Plantilla de E-Mail -label.quota.enddate=Fecha de F\u00edn -label.quota.endquota=Quota Final -label.quota.enforcequota=Forzar Quota -label.quota.fullsummary=Todas las cuentas -label.quota.minbalance=Balance M\u00ednimo -label.quota.remove=Remover Quota -label.quota.startdate=Fecha de Inicio -label.quota.startquota=Quota Inicial -label.quota.state=Estado -label.quota.statement.balance=Balance de Quota -label.quota.statement.bydates=Declaraci\u00f3n -label.quota.statement=Declaraci\u00f3n -label.quota.statement.quota=Uso de la Quota -label.quota.statement.tariff=Tarifa de la Quota -label.quota.summary=Resumen -label.quota.tariff.edit=Editar la Tarifa -label.quota.tariff.effectivedate=Fecha Efectiva -label.quota.tariff=Tarifa -label.quota.tariff.value=Valor Tarifario -label.quota.total=Total -label.quota.totalusage=Uso Totalizado -label.quota.type.name=Tipo de Uso -label.quota.type.unit=Unidad de Uso -label.quota.usage=Consumo de Quota -label.quota.value=Valor de Quota -label.rbd.id=Usuario Cephx -label.rbd.monitor=Monitor CEPH -label.rbd.pool=Pool CEPH -label.rbd=RBD -label.rbd.secret=Secreto Cephx -label.reboot=Reiniciar -label.recent.errors=recientes errores -label.recover.vm=Recuperar la VM -label.redundant.router.capability=Capacidades del router redundante -label.redundant.router=enrutador redundante -label.redundant.state=Estado redundante -label.redundant.vpc=VPC redundante -label.refresh=Actualizar -label.refresh.blades=Refrescar Blade -label.region.details=Detalles de la Regi\u00f3n -label.regionlevelvpc=VPC a Nivel de Regi\u00f3n -label.region=Regi\u00f3n -label.reinstall.vm=Reinstalar la VM -label.related=relacionados -label.release.account=Liberar de la Cuenta -label.release.account.lowercase=Liberar de la cuenta -label.release.dedicated.cluster=Liberar Cluster Dedicado -label.release.dedicated.host=Liberar Servidor Dedicado -label.release.dedicated.pod=Liberar Pod Dedicado -label.release.dedicated.vlan.range=Liberar rango VLAN dedicado -label.release.dedicated.zone=Liberar Zona Dedicada -label.remind.later=Recordar mas tarde -label.remove.ACL=Remover ACL -label.remove.egress.rule=Eliminar regla de salida -label.remove.from.load.balancer=ejemplo Eliminaci\u00f3n de equilibrador de carga -label.remove.ingress.rule=Eliminar regla de entrada -label.remove.ip.range=Remover rango IP -label.remove.ldap=Quitar LDAP -label.remove.network.offering=Remover oferta de red -label.remove.pf=Remover regla de port forwarding -label.remove.project.account=Remover cuenta del proyecto -label.remove.region=Remover Regi\u00f3n -label.remove.rule=Remover regla -label.remove.ssh.key.pair=Remover Par de Claves SSH -label.remove.static.nat.rule=Remover regla NAT est\u00e1tica -label.remove.static.route=Remover ruta est\u00e1tica -label.remove.this.physical.network=Remover esta red f\u00edsica -label.remove.tier=Remover tier -label.remove.vm.from.lb=Remover VM de la regla de load balancer -label.remove.vm.load.balancer=Remover VM del load balancer -label.remove.vmware.datacenter=Remover Datacenter VMware -label.remove.vpc.offering=Remover oferta VPC -label.remove.vpc=Remover VPC -label.removing=Borrando. -label.removing.user=Eliminar usuario -label.reource.id=ID del Recurso -label.replace.acl.list=Reemplazar Lista ACL -label.replace.acl=Reemplazar ACL -label.required=Requerido -label.requires.upgrade=Requiere Actualizaci\u00f3n -label.reserved.ip.range=Rango IP Reservado -label.reserved.system.gateway=System gateway reservado -label.reserved.system.ip=Reservados sistema de PI -label.reserved.system.netmask=M\u00e1scara de red reservada para el sistema -label.reset.ssh.key.pair.on.vm=Resetear el Par de Claves SSH en la VM -label.reset.ssh.key.pair=Resetear el Par de Claves SSH -label.resetVM=Resetear VM -label.reset.VPN.connection=Resetear la conexi\u00f3n VPN -label.resize.new.offering.id=Nueva Oferta -label.resize.new.size=Nuevo Tama\u00f1o (GB) -label.resize.shrink.ok=Se redujo satisfactoriamente -label.resource.limit.exceeded=L\u00edmite de Recursos Excedido -label.resource.limits=L\u00edmites de Recursos -label.resource.name=Nombre del Recurso -label.resource=Recursos -label.resources=Recursos -label.resource.state=Estado del recurso -label.response.timeout.in.sec=Timeout de Respuesta (en seg) -label.restart.network=Reiniciar red -label.restart.required=Reiniciado requerido -label.restart.vpc=Reiniciar VPC -label.restore=Restaurar -label.retry.interval=Intervalo de Repetici\u00f3n -label.review=Revisar -label.revoke.project.invite=Cancelar Invitaci\u00f3n -label.role=Papel -label.roles=Roles -label.roletype=Tipo de Rol -label.root.certificate=Certificado Ra\u00edz -label.root.disk.controller=Controladora de disco ROOT -label.root.disk.offering=Root Disco Offering -label.root.disk.size=Tama\u00f1o del disco Root (GB) -label.router.vm.scaled.up=Router VM Escaladas -label.routing=Enrutamiento -label.routing.host=Servidor de Routeo -label.rule.number=N\u00famero de Regla -label.rule=Regla -label.rules=Reglas -label.running.vms=Ejecuci\u00f3n de m\u00e1quinas virtuales -label.s3.access_key=Llave de Acceso -label.s3.bucket=Bucket -label.s3.connection_timeout=Tiempo de conexi\u00f3n agotado -label.s3.endpoint=Endpoint -label.s3.max_error_retry=Repeticiones M\u00e1ximas ante Errores -label.s3.nfs.path=Ruta NFS S3 -label.s3.nfs.server=Servidor NFS S3 -label.s3.secret_key=clave secreta -label.s3.socket_timeout=Timeout del Socket -label.s3.use_https=Use HTTPS -label.saml.enable=Autorizar SAML SSO -label.saml.entity=Proveedor de Identidad -label.saturday=s\u00e1bado -label.save.and.continue=Guardar y continuar -label.save.changes=Grabar cambios -label.save=Guardar -label.saving.processing=ahorro .... -label.scaledown.policy=Pol\u00edtica de descenso -label.scale.up.policy=POLITICA DE ESCALADO -label.scaleup.policy=Pol\u00edtica de Escalado -label.scope=Alcance -label.search=Buscar -label.secondary.ips=IPs secundarios -label.secondary.isolated.vlan.id=VLAN ID de Secundaria Aislada -label.secondary.staging.store=Almacenamiento Secundario Temporario -label.secondary.staging.store.details=Detalles del Almacenamiento Secundario Temporario -label.secondary.storage=Almacenamiento secundario -label.secondary.storage.count=Pools del Almacenamiento Secundario -label.secondary.storage.details=Detalles del Almacenamiento Secundario -label.secondary.storage.limits=L\u00edmite del Almacenamiento Secundario (GiB) -label.secondary.storage.vm=VM de almacenamiento secundario -label.secondary.used=Secundaria Almacenado -label.secret.key=clave secreta -label.security.group=Grupo de Seguridad -label.security.group.name=Nombre de grupo de seguridad -label.security.groups.enabled=Los grupos de seguridad habilitado -label.security.groups=Grupos de seguridad -label.select.a.template=Seleccione un template -label.select.a.zone=Seleccione una zona. -label.select.instance=Seleccione instancia -label.select.instance.to.attach.volume.to=Elija la instancia para conectar el volumen -label.select.iso.or.template=Seleccione una ISO o template -label.select.offering=Elija oferta -label.select.project=Elegir Proyecto -label.select.region=Elegir Regi\u00f3n -label.select=Seleccione -label.select.template=Elegir Plantilla -label.select.tier=Elija Tier -label.select-view=Seleccione vista -label.select.vm.for.static.nat=Seleccione VM para NAT est\u00e1tica -label.sent=Enviados -label.server=Servidor -label.service.capabilities=Capacidades del Servicio -label.service.offering.details=Detalles de la oferta de servicio -label.service.offering=Oferta de Servicio -label.services=Servicios -label.service.state=Estado del servicio -label.session.expired=Session Caducado -label.set.default.NIC=Definir NIC por defecto -label.settings=Setos -label.setup=Configuraci\u00f3n -label.setup.network=Configurar Red -label.setup.zone=Configurar Zona -label.set.up.zone.type=Definir tipo de zona -label.shared=compartidas -label.SharedMountPoint=SharedMountPoint -label.show.advanced.settings=Mostrar setos avanzados -label.show.ingress.rule=Mostrar la regla del ingreso -label.shutdown.provider=Apagar proveedor -label.simplified.chinese.keyboard=Teclado Chino Simplificado -label.site.to.site.VPN=VPN Site-to-site -label.size=Tama\u00f1o -label.skip.guide=He utilizado CloudStack anteriormente, saltar esta gu\u00eda -label.smb.domain=Dominio SMB -label.smb.password=Contrase\u00f1a SMB -label.smb.username=Nombre de usuario SMB -label.snapshot=Instant\u00e1nea -label.snapshot.limits=instant\u00e1neas L\u00edmites -label.snapshot.name=Nombre de instant\u00e1neas -label.snapshot.schedule=Configurar Instant\u00e1neas Recurrentes -label.snapshot.s=instant\u00e1neas -label.snapshots=instant\u00e1neas -label.SNMP.community=SNMP Community -label.SNMP.port=SNMP Port -label.sockets=Sockets -label.source.ip.address=Direcci\u00f3n IP Origen -label.source.nat=NAT Fuente -label.source.nat.supported=SourceNAT Soportado -label.source.port=Puerto Origen -label.specify.IP.ranges=Especificar rangos de IP -label.specify.vlan=Especifique VLAN -label.specify.vxlan=Especifique VXLAN -label.SR.name=SR Nombre de etiqueta -label.srx.details=Detalles de SRX -label.srx=SRX -label.ssh.key.pair.details=Detalles del Par de Claves SSH -label.ssh.key.pair=Par de Claves SSH -label.ssh.key.pairs=Par de Claves SSH -label.standard.us.keyboard=Teclado Standard (US) -label.start.IP=IP inicial -label.start.lb.vm=Arrancar VM LB -label.start.port=Iniciar Puerto -label.start.reserved.system.IP=IP inicial reservada para el sistema -label.start.vlan=VLAN inicial -label.start.vxlan=VXLAN inicial -label.state=Estado -label.static.nat.enabled=NAT est\u00e1tica habilitada -label.static.nat=NAT est\u00e1tica -label.static.nat.to=est\u00e1tico NAT para -label.static.nat.vm.details=Detalles del NAT est\u00e1tico de la VM -label.static.routes=Rutas Est\u00e1ticas -label.statistics=Estad\u00edsticas -label.status=Estado -label.step.1=Paso 1 -label.step.1.title=Paso 1\: Seleccione una plantilla -label.step.2=Paso 2 -label.step.2.title=Paso 2\: Oferta de Servicio -label.step.3=Paso 3 -label.step.3.title=Paso 3\: Seleccione un disco Ofrenda -label.step.4=Paso 4 -label.step.4.title=Paso 4\: Red -label.step.5=Paso 5 -label.step.5.title=Paso 5\: Revisi\u00f3n -label.stickiness.method=M\u00e9todo de Stickiness -label.stickiness=Stickiness -label.sticky.cookie-name=Nombre de Cookie -label.sticky.domain=dominio -label.sticky.expire=Expira -label.sticky.holdtime=Tiempo de Retenci\u00f3n -label.sticky.indirect=Indirecto -label.sticky.length=Longitud -label.sticky.mode=modo -label.sticky.name=Nombre Pegajoso -label.sticky.nocache=No Cache -label.sticky.postonly=Solo Post -label.sticky.prefix=Prefijo -label.sticky.request-learn=Solicitar aprendizaje -label.sticky.tablesize=Tama\u00f1o de tabla -label.stop=Detener -label.stop.lb.vm=Parar LB VM -label.stopped.vms=Detenido m\u00e1quinas virtuales -label.storage=Almacenamiento -label.storage.pool=Pool de Almacenamiento -label.storage.tags=Etiquetas de almacenamiento -label.storage.traffic=Tr\u00e1fico de Almacenamiento -label.storage.type=Tipo de almacenamiento -label.subdomain.access=Acceso al Subdominio -label.submit=Enviar -label.submitted.by=[Enviado por\: ] -label.succeeded=Sucesor -label.sunday=domingo -label.super.cidr.for.guest.networks=Super CIDR para las Redes Guest -label.supported.services=Servicios Soportados -label.supported.source.NAT.type=Tipo de Source NAT soportado -label.supportsstrechedl2subnet=Soporte de Subredes Streched L2 -label.suspend.project=Suspender Proyecto -label.switch.type=Cambiar el tipo -label.system.capacity=Capacidad de todo el sistema -label.system.offering.for.router=Oferta de Sistema para Router -label.system.offering=Oferta de Sistema -label.system.service.offering.details=Detalles de la oferta de servicio del sistema -label.system.service.offering=Oferta de Servicio de Sistema -label.system.vm.details=Detalles de la VM de Sistema -label.system.vm.scaled.up=VM de Sistema Escaladas -label.system.vm=Sistema de VM -label.system.vms=Sistema de m\u00e1quinas virtuales -label.system.vm.type=Tipo de sistema VM -label.system.wide.capacity=Capacidad total del sistema -label.tagged=etiqueta -label.tag.key=Clave de Etiqueta -label.tags=Etiquetas -label.tag.value=Valor de Etiqueta -label.target.iqn=Objetivo IQN -label.task.completed=Tarea finalizada. -label.template.limits=Plantilla L\u00edmites -label.template=plantilla -label.TFTP.dir=Directorio de TFTP -label.tftp.root.directory=Directorio ra\u00edz de TFTP -label.theme.default=Tema Por Defecto -label.theme.grey=Personal - Gris -label.theme.lightblue=Personal - Azul -label.threshold=Barrera -label.thursday=Jueves -label.tier.details=Detalles del Tier -label.tier=Tier -label.time.colon=Hora\: -label.timeout.in.second = Timeout (segundos) -label.timeout=Tiempo de espera -label.time=Tiempo -label.timezone.colon=Zona Horaria\: -label.time.zone=Zona horaria -label.timezone=Zona horaria -label.token=Token -label.total.cpu=Total CPU -label.total.CPU=Total CPU -label.total.hosts=Total de Hosts -label.total.memory=Memoria Total -label.total.of.ip=Direcciones IP totales -label.total.of.vm=Total de m\u00e1quinas virtuales -label.total.storage=Almacenamiento Total -label.total.virtual.routers.upgrade=Virtual Routers que requieren actualizaci\u00f3n -label.total.virtual.routers=Virtual Routers Totales -label.total.vms=Total de m\u00e1quinas virtuales -label.traffic.label=Etiqueta de trafico -label.traffic.types=Tipo de Tr\u00e1ficos -label.traffic.type=Tipo de Tr\u00e1fico -label.tuesday=martes -label.type.id=Tipo de identificaci\u00f3n -label.type.lower=tipo -label.type=Tipo -label.ucs=UCS -label.uk.keyboard=Teclado UK -label.unavailable=no disponible -label.unhealthy.threshold=Fuera del Umbral Saludable -label.unlimited=Unlimited -label.untagged=sin etiquetar -label.update.project.resources=Actualizar recurso del proyecto -label.update.ssl.cert= Certificado SSL -label.update.ssl= Certificado SSL -label.updating=Actualizar -label.upgrade.required=La Actualizaci\u00f3n es necesaria -label.upgrade.router.newer.template=Actualizar Router para usar una Plantilla m\u00e1s Nueva -label.upload.from.local=Subir desde Local -label.upload=Subir -label.upload.template.from.local=Subir Plantilla desde Local -label.upload.volume.from.local=Subir un Volumen desde Local -label.upload.volume.from.url=Subir un Volumen desde URL -label.upload.volume=Subir volumen -label.url=URL -label.usage.interface=Interfaz de uso -label.usage.sanity.result=Resultado del Uso Sanitizado -label.usage.server=Servidor de Uso -label.usage.type=Tipo de Uso -label.usage.unit=Unidad -label.used=Usado -label.user.data=Datos de Usuario -label.user.details=Detalles del Usuario -label.username.lower=usuario -label.username=Nombre de usuario -label.users=usuario -label.user=Usuario -label.user.vm=VM de Usuario -label.use.vm.ips=Usar las IP de la VM -label.use.vm.ip=Usar VM IP\: -label.value=Valor -label.vcdcname=nombre -label.vcenter.cluster=vCenter cl\u00faster -label.vcenter.datacenter=vCenter de centros de datos -label.vcenter.datastore=vCenter almac\u00e9n de datos -label.vcenter.host=vCenter anfitri\u00f3n -label.vcenter.password=vCenter Contrase\u00f1a -label.vcenter.username=vCenter Nombre de usuario -label.vcenter=vcenter -label.vcipaddress=Direcci\u00f3n IP de vCenter -label.version=Versi\u00f3n -label.vgpu.max.resolution=Resoluci\u00f3n M\u00e1xima -label.vgpu.max.vgpu.per.gpu=vGPU por GPU -label.vgpu.remaining.capacity=Capacidad remanente -label.vgpu.type=Tipo de vGPU -label.vgpu=VGPU -label.vgpu.video.ram=Video RAM -label.view.all=Ver todo -label.view.console=Ver consola -label.viewing=Mirando -label.view.more=Ver mas -label.view.secondary.ips=Ver las IP secundarias -label.view=Ver -label.virtual.appliance.details=Detalles del Virtual appliance -label.virtual.appliances=Virtual Appliances -label.virtual.appliance=Virtual Appliance -label.virtual.machine=M\u00e1quinas virtuales -label.virtual.machines=Maquinas virtuales -label.virtual.networking=Red Virtual -label.virtual.network=Red Virtual -label.virtual.routers.group.account=Routers Virtuales agrupados por cuenta -label.virtual.routers.group.cluster=Agrupar Virtual Routers por cl\u00faster -label.virtual.routers.group.pod=Routers Virtuales agrupados por pod -label.virtual.routers.group.zone=Router Virtuales agrupados por zona -label.virtual.routers=Routers Virtuales -label.virtual.router=Virtual Router -label.vlan.id=ID de VLAN -label.vlan.only=VLAN -label.vlan.range.details=Detalle de Rango VLAN -label.vlan.ranges=Rango(s) de VLAN -label.vlan.range=VLAN Gama -label.vlan=VLAN -label.vlan.vni.ranges=Rango(s) VLAN/VNI -label.vlan.vni.range=VLAN Gama -label.vm.add=A\u00f1adir Instancia -label.vm.destroy=Destroy -label.vm.display.name=Nombra a mostrar de la VM -label.VMFS.datastore=VMFS de datos tienda -label.vmfs=VMFS -label.vm.id=ID de VM -label.vm.ip=Direcci\u00f3n IP de la VM -label.vm.name=Nombre VM -label.vm.password=La Contrase\u00f1a de la VM es -label.vm.reboot=Reiniciar -label.VMs.in.tier=VMs en el tier -label.vmsnapshot.current=esLaActual -label.vmsnapshot=Instant\u00e1neas de VM -label.vmsnapshot.memory=Instant\u00e1nea de la memoria -label.vmsnapshot.parentname=Padre -label.vmsnapshot.type=Tipo -label.vm.start=Inicio -label.vm.state=Estado de VM\\'s -label.vm.stop=Detener -label.vms=VM -label.vmware.datacenter.id=VMware datacenter ID -label.vmware.datacenter.name=Nombre del VMware datacenter -label.vmware.datacenter.vcenter=VMware datacenter vcenter -label.vmware.traffic.label=Etiquetas de tr\u00e1fico para VMware -label.vnet.id=ID de VLAN -label.vnet=VLAN -label.vnmc.devices=Dispositivo VNMC -label.vnmc=ID de VM -label.volatile=Vol\u00e1til -label.volgroup=Volume Group -label.volume.details=Detalles del Volumen -label.volume.limits=l\u00edmites de volumen -label.volume.migrated=Volumen migrado -label.volume.name=Nombre de Volumen -label.volumes=Vol\u00famenes -label.volume=Volumen -label.vpc.distributedvpcrouter=Router Distribuido VPC -label.vpc.id=ID VPC -label.VPC.limits=L\u00edmites de VPC -label.vpc.offering.details=Detalles de las ofertas de VPC -label.vpc.offering=Oferta de VPC -label.vpc.router.details=Detalles del Router VPC -label.VPC.router.details=Detalles del router VPC -label.vpc.supportsregionlevelvpc=Soporte de VPC a Nivel de Regi\u00f3n -label.vpc.virtual.router=Router Virtual VPC -label.vpc=VPC -label.VPN.connection=Conexi\u00f3n VPN -label.vpn.customer.gateway=Gateway VPN del Cliente -label.VPN.customer.gateway=Gateway VPN del Cliente -label.vpn.force.encapsulation=Forzar la encapsulaci\u00f3n UDP de los paquetes ESP -label.VPN.gateway=Gateway VPN -label.vpn=VPN -label.vsmctrlvlanid=Control VLAN ID -label.vsmpktvlanid=Packet VLAN ID -label.vsmstoragevlanid=VLAN ID del Almacenamiento -label.vsphere.managed=Gestionado \= vSphere -label.vswitch.name=Nombre del vSwitch -label.vSwitch.type=Tipo de vSwitch -label.vxlan.id=ID de VXLAN -label.vxlan.range=VXLAN Gama -label.vxlan=VXLAN -label.waiting=Esperando -label.warn=Advertir -label.warning=Advertencia -label.warn.upper=WARN -label.wednesday=mi\u00e9rcoles -label.weekly=Semanal -label.welcome=Bienvenido -label.welcome.cloud.console=Bienvenido a la consola de administraci\u00f3n -label.what.is.cloudstack=Que es CloudStack&\#8482? -label.xenserver.tools.version.61.plus=Versi\u00f3n Original XS es 6.1\\+ -label.Xenserver.Tools.Version61plus=Versi\u00f3n Original XS es 6.1\\+ -label.xenserver.traffic.label=Etiqueta de tr\u00e1fico para XenServer -label.yes=S\u00ed -label.zone.dedicated=Zona Dedicada -label.zone.details=Detalles de Zona -label.zone.id=Zona de identificaci\u00f3n -label.zone.lower=Zona -label.zone.name=Nombre de la Zona -label.zone.step.1.title=Paso 1\: Seleccione una red -label.zone.step.2.title=Paso 2\: A\u00f1adir una zona -label.zone.step.3.title=Paso 3\: A\u00f1adir una vaina -label.zone.step.4.title=Paso 4\: A\u00f1adir un rango de IP -label.zones=Zona -label.zone.type=Tipo de Zona -label.zone.wide=Zona para todo el -label.zoneWizard.trafficType.guest=Guest\: Tr\u00e1fico entre las m\u00e1quinas virtuales del usuario final -label.zoneWizard.trafficType.management=Management\: Tr\u00e1fico entre los recursos internos de CloudStack\\\\'s, incluyendo cualquier componente que se comunique con el Management Server, tales como hosts y las VMs de systema de CloudStack -label.zoneWizard.trafficType.public=Public\: Tr\u00e1fico entre la internet y las m\u00e1quinas virtuales en el cloud. -label.zoneWizard.trafficType.storage=Almacenamiento\: Tr\u00e1fico entre los servidores de almacenamiento primario y secundario, tales como plantillas de VM e instant\u00e1neas -label.zone=Zona -managed.state=Estado logr\u00f3 -message.acquire.ip.nic=Por favor confirme que desea adquirir una IP secundaria nueva para esta NIC.
NOTA\: Las direcciones IP secundarios adquiridas deben ser configuradas manualmente desde la m\u00e1quina virtual. -message.acquire.new.ip=Por favor confirme que usted quiere adquirir una nueva IP para esta red -message.acquire.new.ip.vpc=Por favor confirme que usted desea adquirir una nueva IP para este VPC. -message.acquire.public.ip=Por favor seleccione una zona de la que desea adquirir su nueva IP. -message.action.cancel.maintenance.mode=Por favor, confirme que desea cancelar el mantenimiento -message.action.cancel.maintenance=Su acogida ha sido cancelado con \u00e9xito para el mantenimiento. Este proceso puede tardar hasta varios minutos. -message.action.change.service.warning.for.instance=Su instancia debe estar apagada antes de intentar el cambio de la oferta de servicio activa. -message.action.change.service.warning.for.router=Su router debe estar apagado antes de intentar el cambio de la oferta de servicio activa. -message.action.delete.cluster=Por favor, confirme que desea eliminar del cl\u00faster -message.action.delete.disk.offering=Por favor, confirme que desea eliminar ofreciendo disco -message.action.delete.domain=Por favor, confirme que desea eliminar de dominio -message.action.delete.external.firewall=Por favor, confirme que desea quitar este servidor de seguridad externo. Advertencia\: Si usted est\u00e1 planeando volver a agregar el servidor de seguridad externo mismo, debe restablecer los datos de uso en el dispositivo. -message.action.delete.external.load.balancer=Por favor, confirme que desea eliminar este equilibrador de carga externa. Advertencia\: Si usted est\u00e1 planeando volver a agregar la misma equilibrador de carga externo, debe restablecer los datos de uso en el dispositivo. -message.action.delete.ingress.rule=Por favor, confirme que desea eliminar la regla de ingreso -message.action.delete.ISO.for.all.zones=La ISO es utilizado por todas las zonas. Por favor, confirme que desea eliminar de todas las zonas. -message.action.delete.ISO=Por favor, confirme que desea eliminar la norma ISO -message.action.delete.network=Por favor, confirme que desea eliminar de la red -message.action.delete.nexusVswitch=Porfavor confirme que usted quiere eliminar el Nexus 1000v -message.action.delete.nic=Por favor, confirme que desea remover esta NIC, lo que har\u00e1 que sea removida la red de esta VM. -message.action.delete.physical.network=Por favor confirme que desea borrar esta red f\u00edsica -message.action.delete.pod=Por favor, confirme que desea eliminar de la vaina -message.action.delete.primary.storage=Por favor, confirme que desea eliminar el almacenamiento primario -message.action.delete.secondary.storage=Por favor, confirme que desea eliminar de almacenamiento secundario -message.action.delete.security.group=Por favor, confirme que desea eliminar el grupo de seguridad -message.action.delete.service.offering=Por favor, confirme que desea eliminar oferta de servicios -message.action.delete.snapshot=Por favor, confirme que desea eliminar instant\u00e1neas -message.action.delete.system.service.offering=Por favor confirme que desea borrar esta oferta de servicio. -message.action.delete.template.for.all.zones=La plantilla es utilizada por todas las zonas. Por favor, confirme que desea eliminar de todas las zonas. -message.action.delete.template=Por favor, confirme que desea eliminar la plantilla -message.action.delete.volume=Por favor, confirme que desea eliminar el volumen -message.action.delete.zone=Por favor, confirme que desea eliminar la zona -message.action.destroy.instance=Por favor, confirme que desea destruir ejemplo -message.action.destroy.systemvm=Por favor, confirme que desea destruir la m\u00e1quina virtual del sistema. -message.action.disable.cluster=Por favor, confirme que desea desactivar este grupo. -message.action.disable.nexusVswitch=Por favor confirme que usted quiere deshabilitar este nexus 1000v -message.action.disable.physical.network=Por favor confirmar que usted quiere deshabilitar esta red f\u00edsica -message.action.disable.pod=Por favor, confirme que desea desactivar esta vaina. -message.action.disable.static.NAT=Por favor, confirme que desea desactivar NAT est\u00e1tica -message.action.disable.zone=Por favor, confirme que desea desactivar esta zona. -message.action.downloading.template=Descargando plantilla. -message.action.download.iso=Por favor confirme que usted quiere descargar esta ISO -message.action.download.template=Por favor confirme que usted quiere descargar este template -message.action.enable.cluster=Por favor, confirme que desea habilitar este grupo. -message.action.enable.maintenance=Su acogida ha sido preparado con \u00e9xito para el mantenimiento. Este proceso puede tardar hasta varios minutos o m\u00e1s dependiendo de c\u00f3mo las m\u00e1quinas virtuales se encuentran actualmente en este servidor. -message.action.enable.nexusVswitch=por favor confirme que usted quiere habilitar este nexus 1000v -message.action.enable.physical.network=Por favor confirmar que usted quiere habilitar esta red f\u00edsica -message.action.enable.pod=Por favor, confirme que desea habilitar esta vaina. -message.action.enable.zone=Por favor, confirme que desea habilitar esta zona. -message.action.expunge.instance=Por favor confirme que desea purgar esta instancia. -message.action.force.reconnect=Por favor, confirme que desea forzar una reconexi\u00f3n para el anfitri\u00f3n -message.action.host.enable.maintenance.mode=mode \= mantenimiento de Habilitaci\u00f3n provocar\u00e1 una migraci\u00f3n en vivo de todas las instancias que se ejecutan en el sistema para cualquier m\u00e1quina disponible. -message.action.instance.reset.password=Por favor, confirmar que desea cambiar la contrase\u00f1a de ROOT para esta VM -message.action.manage.cluster=Por favor, confirme que desea para administrar el cl\u00faster. -message.action.primarystorage.enable.maintenance.mode=Advertencia\: colocar el almacenamiento principal en modo de mantenimiento har\u00e1 que todas las m\u00e1quinas virtuales utilizando vol\u00famenes de que sea detenido. \u00bfDesea continuar? -message.action.reboot.instance=Por favor, confirme que desea reiniciar el ejemplo -message.action.reboot.router=Todos los servicios provistos por este router virtual ser\u00e1n interrumpidos. Por favor confirmar que desea reiniciarlo. -message.action.reboot.systemvm=Por favor, confirme que desea reiniciar el sistema VM -message.action.release.ip=Por favor, confirme que desea liberar IP -message.action.remove.host=Por favor confirme que desea borrar este servidor. -message.action.reset.password.off=Su ejemplo en la actualidad no es compatible con esta funci\u00f3n. -message.action.reset.password.warning=Su ejemplo debe ser detenido antes de intentar cambiar su contrase\u00f1a actual. -message.action.restore.instance=Por favor, confirme que desea restaurar ejemplo -message.action.revert.snapshot=Por favor confirme que desea revertir el volumen elegido a esta instant\u00e1nea. -message.action.start.instance=Por favor, confirme que desea iniciar la instancia -message.action.start.router=Por favor, confirme que desea iniciar router -message.action.start.systemvm=Por favor, confirme que desea iniciar el sistema VM -message.action.stop.instance=Por favor, confirme que desea detener la instancia -message.action.stop.router=Todos los servicios provistos por este router virtual ser\u00e1n interrumpidos. Por favor confirmar que desea apagarlo. -message.action.stop.systemvm=Por favor, confirme que desea detener sistema VM -message.action.take.snapshot=Por favor, confirme que desea tomar instant\u00e1neas -message.action.unmanage.cluster=Por favor, confirme que desea unmanage del cl\u00faster. -message.action.vmsnapshot.delete=Por favor confirme que desea borrar la instant\u00e1nea de esta VM. -message.action.vmsnapshot.revert=Revertir instant\u00e1nea de VM -message.activate.project=Usted esta seguro que quiere activar este proyecto? -message.add.cluster=A\u00f1adir un hipervisor administradas por cl\u00faster de zona , la consola de -message.add.cluster.zone=A\u00f1adir un hipervisor administradas por cl\u00faster de zona -message.add.disk.offering=Por favor, especifique los par\u00e1metros siguientes para agregar un nuevo disco que ofrece -message.add.domain=por favor especifique el subdominio que usted quiere crear bajo este dominio -message.added.new.nuage.vsp.controller=Nuevo Controlador Nuage Vsp agregado -message.added.vpc.offering=Oferta VPC agregada -message.add.firewall=A\u00f1adir un servidor de seguridad a la zona -message.add.guest.network=Por favor confirme que desea agregar una red de guest -message.add.host=Por favor, especifique los par\u00e1metros siguientes para agregar un nuevo host -message.adding.host=Agregando un servidor -message.adding.Netscaler.device=Agregando un dispositivo NetScaler -message.adding.Netscaler.provider=Agregando un proveedor NetScaler -message.add.ip.range=A\u00f1adir un rango de IP a la red p\u00fablica en la zona -message.add.ip.range.direct.network=A\u00f1adir un rango de IP para dirigir red en la zona -message.add.ip.range.to.pod=

A\u00f1adir un rango de IP de la vaina\:

-message.additional.networks.desc=Por favor seleccione de red adicionales (s) que la instancia virtual estar\u00e1 conectado. -message.add.load.balancer=A\u00f1adir un equilibrador de carga a la zona -message.add.load.balancer.under.ip=La regla de load balancer ha sido agregada bajo la IP\: -message.add.network=Agregar una nueva red para la zona\: -message.add.new.gateway.to.vpc=Por favor especifique la informaci\u00f3n necesaria para agregar un nuevo gateway a este VPC. -message.add.pod=Agregar una vaina nueva zona -message.add.pod.during.zone.creation=Cada zona debe contener uno o m\u00e1s pods, y estaremos agregando el primero ahora. Un pod contiene servidores y servidores de almacenamiento primario, los cuales se agregaran en un paso posterior. Primero, configure un rango de direcciones IP reservadas para el tr\u00e1fico interno de management utilizado por CloudStack\\\\'s. El rango de IP reservado debe ser \u00fanico para cada zona en el cloud. -message.add.primary=Por favor, especifique los par\u00e1metros siguientes para agregar un nuevo almacenamiento primario -message.add.primary.storage=Agregar una nueva almacenamiento primario para zona , la consola de -message.add.region=Por favor cargue la informaci\u00f3n requerida para agregar una nueva regi\u00f3n. -message.add.secondary.storage=A\u00f1adir un nuevo almacenamiento de zona -message.add.service.offering=Por favor, rellene los siguientes datos para agregar una nueva oferta de servicio. -message.add.system.service.offering=Por favor complete los siguientes datos para agregar un nueva oferta de servicio. -message.add.template=Por favor ingrese los siguientes datos para crear la nueva plantilla -message.add.volume=Por favor, rellene los siguientes datos para agregar un nuevo volumen. -message.add.VPN.gateway=Por favor confirme que usted quiere agregar un VPN Gateway -message.admin.guide.read=Para VM basadas en VMware, lea por favor el cap\u00edtulo de escalado din\u00e1mico en la gu\u00eda de administraci\u00f3n.\u00bfDesea continuar? -message.advanced.mode.desc=Seleccione este modelo de red si desea habilitar soporte VLAN. Este modelo de red proporciona la m\u00e1xima flexibilidad al permitir a los administradores proporcionar ofertas personalizadas de la red como el suministro de firewall, VPN, o el apoyo equilibrador de carga, as\u00ed como permitir vs directa de redes virtuales. -message.advanced.security.group=Elija esta opci\u00f3n si desea utilizar grupos de seguridad para proporcionar resultados de aislamiento VM. -message.advanced.virtual=Elija esta opci\u00f3n si desea utilizar VLAN toda la zona para proporcionar el aislamiento VM invitado. -message.after.enable.s3=Almacenamiento Secundario sobre S3 configurado. Nota\: Cuando salga de esta p\u00e1gina, no podr\u00e1 volver a reconfigurar S3 nuevamente. -message.after.enable.swift=Swift configurado. Nota\: Cuando salga de esta p\u00e1gina, no podr\u00e1 volver a reconfigurar Swift nuevamente. -message.alert.state.detected=Estado de Alerta detectado -message.allow.vpn.access=Por favor, introduzca un nombre de usuario y la contrase\u00f1a del usuario que desea permitir el acceso de VPN. -message.apply.snapshot.policy=Ha actualizado su pol\u00edtica instant\u00e1nea actual. -message.attach.iso.confirm=Por favor, confirme que desea conectar el ISO a la instancia virtual -message.attach.volume=Por favor, rellene los siguientes datos para fijar un nuevo volumen. Si est\u00e1 colocando un volumen de disco a una m\u00e1quina virtual de Windows basado, usted tendr\u00e1 que reiniciar la instancia para ver el disco adjunto. -message.basic.mode.desc=Seleccione este modelo de red si lo haces * no * desea habilitar cualquier soporte VLAN. Todas las instancias virtuales creados en virtud de este modelo de red se le asignar\u00e1 una direcci\u00f3n IP directamente desde la red y grupos de seguridad se utilizan para proporcionar la seguridad y la segregaci\u00f3n. -message.change.ipaddress=Por favor confirme que desea cambiar la direcci\u00f3n IP de esta NIC en la VM. -message.change.offering.confirm=Por favor, confirme que desea cambiar la oferta de servicio de la instancia virtual. -message.change.password=Por favor cambie la contrase\u00f1a. -message.cluster.dedicated=Cl\u00faster Dedicado -message.cluster.dedication.released=El Cl\u00faster dedicado liberado -message.configure.all.traffic.types=Tiene multiples redes f\u00edsicas, por favor configure las etiquetas para cada tipo de tr\u00e1fico haciendo click en el bot\u00f3n de Editar. -message.configure.firewall.rules.allow.traffic=Configurar las reglas para permitir Tr\u00e1fico -message.configure.firewall.rules.block.traffic=Configurar las reglas para bloquear Tr\u00e1fico -message.configure.ldap=Por favor confirme que desea configurar LDAP. -message.configuring.guest.traffic=Configurando el tr\u00e1fico de guest -message.configuring.physical.networks=Configurando las redes f\u00edsicas -message.configuring.public.traffic=Configurando el tr\u00e1fico public -message.configuring.storage.traffic=Configurando el tr\u00e1fico de almacenamiento -message.confirm.action.force.reconnect=Por favor confirme que desea forzar la reconexi\u00f3n de este servidor -message.confirm.add.vnmc.provider=Por favor confirme que desea agregar el proveedor VNMC. -message.confirm.archive.alert=Por favor confirme que desea archivar esta alerta. -message.confirm.archive.event=Por favor confirme que desea archivar este evento. -message.confirm.archive.selected.alerts=Por favor confirme que desea archivar las alertas seleccionadas -message.confirm.archive.selected.events=Por favor confirme que desea archivar los eventos seleccionados -message.confirm.attach.disk=\u00bf Est\u00e1 seguro que desea conectar el disco? -message.confirm.create.volume=\u00bfEst\u00e1 seguro que desea crear un volumen? -message.confirm.current.guest.CIDR.unchanged=\u00bfDesea mantener el CIDR de la red guest actual sin cambios? -message.confirm.dedicate.cluster.domain.account=\u00bfRealmente desea dedicar este cluster al dominio/cuenta? -message.confirm.dedicate.host.domain.account=\u00bfDesea dedicar este hosts a un dominio/cuenta? -message.confirm.dedicate.pod.domain.account=\u00bfDesea dedicar este por a un dominio/cuenta? -message.confirm.dedicate.zone=\u00bfRealmente quiere dedicar esta zona a un domino/cuenta? -message.confirm.delete.acl.list=\u00bfEsta seguro que desea borrar esta lista de ACL? -message.confirm.delete.alert=\u00bfEst\u00e1 seguro que desea borrar esta alerta? -message.confirm.delete.baremetal.rack.configuration=Por favor confirme que desea borrar la configuraci\u00f3n del Rack Baremetal. -message.confirm.delete.BigSwitchBcf=Por favo confirme que desa borrar este Controlador BigSwitch BCF -message.confirm.delete.BrocadeVcs=Por favo confirme que desa borrar este Switch Brocade Vcs -message.confirm.delete.ciscoASA1000v=Por favor confirme que desea borrar CiscoASA1000v -message.confirm.delete.ciscovnmc.resource=Por favor confirme que desea borrar el recurso CiscoVNMC -message.confirm.delete.F5=Por favor confirme que ud quiere eliminar el F5 -message.confirm.delete.internal.lb=Por favor confirme que desea borrar este LB Interno -message.confirm.delete.NetScaler=Por favo confirme que desa borrar este NetScaler -message.confirm.delete.NuageVsp=Por favo confirme que desa borrar este Nuage Virtualized Services Directory -message.confirm.delete.PA=Por favor confirme que desa borrar este Palo Alto -message.confirm.delete.secondary.staging.store=Por favor confirme que desea borrar el Almacenamiento Secundario Temporal. -message.confirm.delete.SRX=Por favor confirme que desa borrar este SRX -message.confirm.delete.ucs.manager=Por favor confirme que desea borrar el UCS Manager -message.confirm.destroy.router=Por favor confirme que desa borrar este router -message.confirm.disable.host=Por favor confirme que desea deshabitar este servidor -message.confirm.disable.network.offering=\u00bfEsta seguro que desea deshabilitar esta oferta de red? -message.confirm.disable.provider=Por favor confirme que desea deshabitar este proveedor -message.confirm.disable.vnmc.provider=Por favor confirme que desea deshabitar el proveedor VNMC. -message.confirm.disable.vpc.offering=\u00bfEsta seguro que desea deshabitar esta oferta de VPC? -message.confirm.enable.host=Por favor confirme que desea habilitar este servidor -message.confirm.enable.network.offering=\u00bfEsta seguro que desea habilitar esta oferta de red? -message.confirm.enable.provider=Por favor confirme que desea habilitar este proveedor -message.confirm.enable.vnmc.provider=Por favor confirme que desea habilitar el proveedor VNMC. -message.confirm.enable.vpc.offering=\u00bfEsta seguro que desea habilitar esta oferta de VPC? -message.confirm.join.project=por favor confirme que usted desea unirse a este proyecto. -message.confirm.migrate.volume=\u00bfQuiere migrar este volumen? -message.confirm.refresh.blades=Por favor confirme que desea refrescar los blades. -message.confirm.release.dedicated.cluster=\u00bf Desea liberar este cl\u00faster dedicado? -message.confirm.release.dedicated.host=\u00bfDesea liberar este servidor dedicado? -message.confirm.release.dedicated.pod=\u00bfDesea liberar el uso dedicado del pod? -message.confirm.release.dedicated.zone=\u00bfDesea liberar esta zona dedicada? -message.confirm.release.dedicate.vlan.range=Por favor confirme que desea liberar este rango dedicado de VLAN -message.confirm.remove.event=\u00bfEst\u00e1 seguro que desea remover este evento? -message.confirm.remove.IP.range=Por favor confirme que desea remover este rango IP. -message.confirm.remove.load.balancer=Por favor confirme que desea remover esta VM del load balancer -message.confirm.remove.network.offering=\u00bfEsta seguro que desea remover esta oferta de red? -message.confirm.remove.selected.alerts=Por favor confirme que desea remover las alertas seleccionadas -message.confirm.remove.selected.events=Por favor confirme que desea borrar los eventos seleccionados -message.confirm.remove.vmware.datacenter=Por favor confirme que desea remover el datacenter VMware -message.confirm.remove.vpc.offering=\u00bfEsta seguro que desea remover esta oferta de VPC? -message.confirm.replace.acl.new.one=\u00bfDesea reemplazar este ACL con uno nuevo? -message.confirm.scale.up.router.vm=\u00bfDesea escalar la VM utilizada como Router? -message.confirm.scale.up.system.vm=\u00bfDesea escalar esta VM de sistema? -message.confirm.shutdown.provider=Por favor confirme que desea apagar ester proveedor -message.confirm.start.lb.vm=Por favor confirme que desea iniciar esta VM de LB -message.confirm.stop.lb.vm=Por favor confirme que desea parar esta VM de LB -message.confirm.upgrade.router.newer.template=Por favor confirme que desea actualizar el router con una plantilla nueva -message.confirm.upgrade.routers.account.newtemplate=Por favor confirme que desea actualizar todos los routers de esta cuenta con una plantilla nueva -message.confirm.upgrade.routers.cluster.newtemplate=Por favor confirme que desea actualizar todos los routers de este cluster con una plantilla nueva -message.confirm.upgrade.routers.newtemplate=Por favor confirme que desea actualizar todos los routers de esta zona con una plantilla nueva -message.confirm.upgrade.routers.pod.newtemplate=Por favor confirme que desea actualizar todos los routers de este pod con una plantilla nueva -message.copy.iso.confirm=Por favor, confirme que desea copiar el ISO a -message.copy.template.confirm=\u00bfDesea copiar esta plantilla? -message.copy.template=Copia plantilla XXX de la zona -message.create.template=Esta seguro que quiere crear un template? -message.create.template.vm=Crear VM de la plantilla -message.create.template.volume=Por favor, especifique la siguiente informaci\u00f3n antes de crear una plantilla de su volumen de disco\: . Creaci\u00f3n de la plantilla puede oscilar entre varios minutos m\u00e1s, dependiendo del tama\u00f1o del volumen. -message.creating.cluster=Creando cluster -message.creating.guest.network=Creando red guest -message.creating.physical.networks=Creando redes f\u00edsicas -message.creating.pod=Creando pod -message.creating.primary.storage=Creando almacenamiento primario -message.creating.secondary.storage=Creando almacenamiento secundario -message.creating.systemVM=Creando VM de sistema (esto puede demorar bastante) -message.creating.zone=Creando zona -message.decline.invitation=\u00bfEst\u00e1 segura que desea rechazar esta invitaci\u00f3n al proyecto? -message.dedicated.zone.released=Dedicaci\u00f3n de zona liberada -message.dedicate.zone=Dedicando zona -message.delete.account=Por favor, confirme que desea eliminar esta cuenta. -message.delete.affinity.group=Por favor confirme que desea remover este grupo de afinidad. -message.delete.gateway=Por favor confirme que usted quiere eliminar este gateway -message.delete.project=Esta seguro que quiere eliminar este proyecto? -message.delete.user=Por favor confirme que usted quiere eliminar este usuario -message.delete.VPN.connection=Por favor confirme que usted quiere eliminar la conexi\u00f3n VPN -message.delete.VPN.customer.gateway=Por favor confirme que desea borrar esta VPN Customer Gateway -message.delete.VPN.gateway=Por favor confirme que usted quiere eliminar este VPN Gateway -message.desc.add.new.lb.sticky.rule=Agregar nueva regla Sticky al LB -message.desc.advanced.zone=Para topologia de redes m\u00e1s sofisticadas. Este modelo de red provee la mayor flexibilidad al definir la redes guest y proveyendo ofertas de redes personalizadas tales como firewall, VPN, o soporte de load balancer. -message.desc.basic.zone=Provee una red \u00fanica donde cada instancia de VM es asignada una IP directamente desde la red. El aislamiento de Guest puede proveerse por medio de layer-3 tales como los security groups (filtrado de direcciones IP por origen). -message.desc.cluster=Cada por debe contener uno o m\u00e1s clusters, ahora agregaremos el primero. Un cluster contiene un grupo de servidores. Los servidores en el cluster tiene el mismo hardware, ejecutan el mismo hipervisors, est\u00e1n en la misma subred, y utilizan el mismo almacenamiento compartido. Cada cluster consiste en uno o m\u00e1s servidores y uno o m\u00e1s servidores de almacenamiento primario. -message.desc.created.ssh.key.pair=Par de Claves SSH creadas. -message.desc.create.ssh.key.pair=Por favor completar los siguientes datos para crear o registrar un par de claves ssh.

1. Si la clave p\u00fablica esta definida, CloudStack la registrar\u00e1. Uds puede usarla por medio de la clave privada.

2. Si la clave p\u00fablica no esta definida, CloudStack crear\u00e1 un nuevo Par de Claves SSH. En este caso, por favor copie y grab\u00e9 la clave privada. CloudStack no la almacenar\u00e1.
-message.desc.host=Cada cluster debe contener por lo menos un host (servidor) para que la VMs Guest ejecuten all\u00ed, y se agregara el primero ahora. Para que un host funcione en CloudStack, se debe instalar el software del hypervisor, asignarle una IP al host en la red de Management y asegurarse que se conecte al servidores de management de CloudStack.

Indicar el nombre DNS del host o su direcci\u00f3n IP, el nombre del usuario (usualmente root), su contrase\u00f1a y las etiquetas necesarias para catalogar los hosts. -message.desc.primary.storage=Cada cl\u00faster debe contener uno o m\u00e1s servidores primarios de almacenamiento, y ahora se agregara el primero. El almacenamiento primario contiene los volumenes de disco para todas las VMSs ejecutandose en los hosts del cl\u00faster. Utilice cualquier protocolo standard que soporte el hipervisor. -message.desc.reset.ssh.key.pair=Pro favor especifique el par de claves ssh que desea agregar a esta VM. Tenga en cuenta que la clave de root ser\u00e1 cambiada al realizar esta operaci\u00f3n si la opci\u00f3n de contrase\u00f1a esta habilitada. -message.desc.secondary.storage=Cada zona debe tener al menos un servidor de NFS secundario, y se agregar\u00e1 el primero ahora. El almacenamiento secundario guarda las plantillas de VM, las im\u00e1genes ISO, y las instantaneas de volumentes. Este server debe estar disponible a todos los hosts de la zona.

Complete con la direcci\u00f3n IP y el PATH exportado -message.desc.zone=Una zona es la unidad organizacional m\u00e1s grande en CloudStack, y t\u00edpicamente se corresponde con un datacenter en particular. Las Zonas proveen aislaci\u00f3n f\u00edsica y redundancia. Una zona consiste de uno o m\u00e1s pode (cada uno conteniendo servidores y almacenamiento primario), junto con el almacenamiento secundario que es compartido entre todos los pods en la zona -message.detach.disk=\u00bf Est\u00e1 seguro que desea desconectar este disco? -message.detach.iso.confirm=Por favor, confirme que desea quitar el ISO de la instancia virtual -message.disable.account=Por favor confirmar que desea deshabitar esta cuenta. Al hacerlo, todos los usuarios pertenecientes a ella dejaran de tener acceso a los recursos de cloud. Todas las m\u00e1quinas virtuales en ejecuci\u00f3n ser\u00e1n apagadas en forma inmediata. -message.disable.snapshot.policy=Ha desactivado su pol\u00edtica instant\u00e1nea actual. -message.disable.user=Por favor confirme que usted quiere deshabilitar este usuario -message.disable.vpn.access=Por favor, confirme que desea desactivar VPN de acceso. -message.disable.vpn=Esta seguro que usted quiere deshabilitar la VPN? -message.disabling.network.offering=Deshabilitar oferta de red -message.disabling.vpc.offering=Deshabilitando oferta VPC -message.disallowed.characters=Caracteres no permitidos\: \\<\\,\\> -message.download.ISO=Por favor haga click 00000para descargar el ISO -message.download.template=Por favor haga click 00000para descargar la plantilla -message.download.volume.confirm=Por favor confirme que desea descargar este volumen. -message.download.volume=Por favor, haga clic 00000 para bajar el volumen -message.edit.account=Editar ("-1" indica que no hay limite a la cantidad de recursos creados) -message.edit.confirm=Por favor confirme sus cambios antes de pulsar en "Grabar". -message.edit.limits=Por favor, especifique los l\u00edmites de los recursos siguientes. A "-1" indica que no hay l\u00edmite a la cantidad de los recursos de crear. -message.edit.traffic.type=Por favor indique la etiqueta de tr\u00e1fico que desea asociar con este tipo de tr\u00e1fico. -message.enable.account=Por favor, confirme que desea habilitar esta cuenta. -message.enabled.vpn.ip.sec=La clave pre-compartida IPSec es -message.enabled.vpn=Su acceso a la VPN est\u00e1 habilitado y se puede acceder a trav\u00e9s de la IP -message.enable.user=Por favor confirme que usted quiere habilitar este usuario -message.enable.vpn.access=VPN \= est\u00e1 desactivado para esta direcci\u00f3n IP. \u00bfTe gustar\u00eda que permitan el acceso VPN? -message.enable.vpn=VPN de acceso actualmente no est\u00e1 habilitado. Por favor, haga clic aqu\u00ed para habilitar VPN. -message.enabling.network.offering=Habilitar oferta de red -message.enabling.security.group.provider=Habilitando el proveedor de Security Group -message.enabling.vpc.offering=Habilitando oferta VPC -message.enabling.zone.dots=Habilitando zona... -message.enabling.zone=Habilitando zona -message.enter.seperated.list.multiple.cidrs=Por favor ingrese una lista separada por comas de los CIDRs si son m\u00e1s de uno -message.enter.token=Por favor ingrese el token que recibi\u00f3 en la invitaci\u00f3n por e-mail. -message.generate.keys=Por favor confirme que usted quiere generar nueva llave para este usuario. -message.gslb.delete.confirm=Por favor confirme que desea borrar este GSLB -message.gslb.lb.remove.confirm=Por favor confirme que desea remover el load balanc\u00edn GSLB -message.guest.traffic.in.advanced.zone=El tr\u00e1fico de red Guest se refiere a la comunicaci\u00f3n entre las m\u00e1quinas virtuales del usuario final. Especifique un rango de VLAN IDs para transportar este tr\u00e1fico en cada red f\u00edsica. -message.guest.traffic.in.basic.zone=El tr\u00e1fico de las redes Guest es el generado entre las m\u00e1quina virtuales del usuario final.Especifique un rango de direcciones IP para que CloudStack pueda asignar a las VMs guest. Asegures\u00e9 que este rango no se solape con el rango IP reservado para el sistema. -message.host.dedicated=Servidor Dedicado -message.host.dedication.released=Dedicaci\u00f3n de Servidor liberada -message.installWizard.click.retry=Haz click en el bot\u00f3n para re-intentar el lanzamiento de la instancia. -message.installWizard.copy.whatIsACluster=Un cluster provee una forma de agrupar los servidores. Todos los servidores que componen el cluster tienen un hardware id\u00e9ntico, ejecutan el mismo hipervisor, est\u00e1n en la misma subred y utilizan el mismo almacenamiento compartido. Las instancias de las VMs pueden migrarse en caliente desde un servidor a otro dentro del mismo cluster, sin interrupci\u00f3n del servicio del usuario. Un cluster es la tercera forma organizacional en una instalaci\u00f3n de CloudStack&\#8482; . Los ilustres est\u00e1n contenidos dentro de los podes, los podes estar contenidos en las zonas.

CloudStack&\#8482; permite m\u00faltiple clusters en una instalaci\u00f3n de cloud, pero para realizar una instalaci\u00f3n b\u00e1sica, solo necesitamos uno. -message.installWizard.copy.whatIsAHost=Un servidor es una sola computadora. Los Servidores proveen los recursos de computo necesarios para ejecutar las m\u00e1quinas virtuales. Cada servidor tiene un hipervisor instalado para gestionar las VMs guest (excepto en los servidores baremetal, los cuales son un caso especial que se explaya en la Gu\u00eda de Administraci\u00f3n Avanzada). Por ejemplo, un servidor Linux con KVM habilitado, un servidor con Citrix XenServer o un servidor con ESXi. En una instalaci\u00f3n Basica, usaremos un solo servidor ejecutando XenServer o KVM.

El servidor es la m\u00ednima unidad organizacional de CloudStack&\#8482; .Los servidores est\u00e1n contenidos dentro de los ilustres, los ilustres en los pods, y estos \u00faltimos en las zonas. -message.installWizard.copy.whatIsAPod=Un pod representa generalmente un solo rock. Los servidores en el mismo por estar en la misma subred.

El por es la segunda agrupaci\u00f3n organizacional dentro de CloudStack&\#8482; .Los Pods est\u00e1n contenidos dentro de la zona. Cada zona puede contener uno m\u00e1s pods. En la instalaci\u00f3n B\u00e1sica, solo se necesita tener un por en la zona. -message.installWizard.copy.whatIsAZone=Una zona es la unidad organizacional m\u00e1s grande dentro de una instalaci\u00f3n de CloudStack&\#8482;. Una zona tipicamente se corresponde a un solo datacenter, sin embargo esta permitido contar con varias zonas dentro del mismo datacenter. El beneficio de organizar la infraestructura en zonas es que provee aislaci\u00f3n f\u00edsica y redundancia. Por ejemplo, cada zona puede tener su propia fuente de alimentaci\u00f3n y lo mismo con su salida de red, ademas de poder estar separadas geograficamente en grandes distancias (lo cual no es obligatorio). -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482 es una plataforma de software que aglutina recursos computo para poder crear coludas de infraestructuras como Servicio (IaaS), tanto p\u00fablicas como privadas.

CloudStack&\#8482 gestiona la red, el almacenamiento y los nodos de computo que conforma la infraestructura de cloud. Se puede usar CloudStack&\#8482 para desplegar, gestionar y configurar ambientes de cloud computan.

Extendiendose m\u00e1s all\u00e1 del manejo individual de m\u00e1quinas virtuales en hardware comotidizado, CloudStack&\#8482 provee una soluci\u00f3n llave en mano de un software de infraestructura de red para ofrecer datacenter virtuales como servicio, proveyendo todos los componentes esenciales para construir, desplegar y gestionar aplicaciones cloud multi-tier y multi-tenant. Se ofrecen dos versiones, la open source y la Premium, brindando la primera caracter\u00edsticas casi id\u00e9nticas. -message.installWizard.copy.whatIsPrimaryStorage=La infraestrucutra cloud de CloudStack&\#8482 hace uso de dos tipos de almacenamiento, el primario y el secundario. Ambos pueden ser iSCSI, NFS o discos locales.

El Almacenamiento Primario se asocia a un cluster, y almacena los vol\u00famenes de discos de cada VM para todas las VMs en los servidores del cluster. El almacenamiento primario es t\u00edpicamente alojado cerca de los servidores. -message.installWizard.copy.whatIsSecondaryStorage=El almacenamiento secundario est\u00e1 asociado a una zona, y almacena lo siguiente\:
  • Plantillas - im\u00e1genes del sistema operativo que se pueden utilizar para arrancar VMs, pueden incluir informaci\u00f3n de configuraci\u00f3n adicional, como las aplicaciones instaladas
  • Im\u00e1genes ISO - im\u00e1genes del Sistema Operativo que pueden ser boteables o no boteables
  • Disco instant\u00e1neas de vol\u00famenes - copias de datos guardadas de VM que se pueden utilizar para la recuperaci\u00f3n de datos o para crear nuevas plantillas
-message.installWizard.now.building=Ahora construyendo su nube... -message.installWizard.tooltip.addCluster.name=Nombre del Cluster. Puede ser alfanum\u00e9rico .Este no es usado por CloudStack -message.installWizard.tooltip.addHost.hostname=El nombre DNS o direcci\u00f3n IP del host -message.installWizard.tooltip.addHost.password=Este es el password para el nombre de usuario mencionado anteriormente (Desde su Instalaci\u00f3n XenServer) -message.installWizard.tooltip.addHost.username=Generalmente root -message.installWizard.tooltip.addPod.name=Nombre del POD -message.installWizard.tooltip.addPod.reservedSystemEndIp=Este es el rango de direcciones IP en la red privada que la CloudStack utiliza para administrar las VMs del Almacenamiento Secundario y consola Proxy. Estas direcciones IP se han tomado de la misma subred que los servidores inform\u00e1ticos. -message.installWizard.tooltip.addPod.reservedSystemGateway=El gateway ,puerta de enlace, para los host en ese pod. -message.installWizard.tooltip.addPod.reservedSystemNetmask=La m\u00e1scara de red en uso en la subred de los hu\u00e9spedes ser\u00e1. -message.installWizard.tooltip.addPod.reservedSystemStartIp=Este es el rango de direcciones IP en la red privada que la CloudStack utiliza para administrar las VMs del Almacenamiento Secundario y consola Proxy. Estas direcciones IP se han tomado de la misma subred que los servidores inform\u00e1ticos. -message.installWizard.tooltip.addPrimaryStorage.name=\ Nombre para el storage -message.installWizard.tooltip.addPrimaryStorage.path=(para NFS) En NFS este es el directorio exportado desde el servidor. Directorio (por SharedMountPoint). Con KVM este es el directorio de cada host en donde se monta el almacenamiento primario. Por ejemplo, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(para NFS, iSCSI, o PreSetup) La direcci\u00f3n IP o el nombre DNS del dispositivo de almacenamiento. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=Direcci\u00f3n IP del servidor NFS que contiene el secondary storage -message.installWizard.tooltip.addSecondaryStorage.path=El path exportado, ubicado en el servidor especificado anteriormente -message.installWizard.tooltip.addZone.dns1=Estos son servidores de DNS para ser usados por las VMs guest en la zona. Estos servidores DNS ser\u00e1n accesos por la red public que agregar\u00e1 posteriormente. La IP publica para la zona deber poder acceder a los servidores DNS nombrados aqu\u00ed. -message.installWizard.tooltip.addZone.dns2=Estos son servidores de DNS para ser usados por las VMs guest en la zona. Estos servidores DNS ser\u00e1n accesos por la red public que agregar\u00e1 posteriormente. La IP publica para la zona deber poder acceder a los servidores DNS nombrados aqu\u00ed. -message.installWizard.tooltip.addZone.internaldns1=Estos son servidores DNS para ser usados por las VMs de sistema en la zona. Estos servidores DNS deben ser accesible de la interface de red privada de las VMs de Sistema. La direcci\u00f3n IP que proveas para los pods deben llegar a los servidores DNS nombrados aqu\u00ed. -message.installWizard.tooltip.addZone.internaldns2=Estos son servidores DNS para ser usados por las VMs de sistema en la zona. Estos servidores DNS deben ser accesible de la interface de red privada de las VMs de Sistema. La direcci\u00f3n IP que proveas para los pods deben llegar a los servidores DNS nombrados aqu\u00ed. -message.installWizard.tooltip.addZone.name=Nombre de la zona. -message.installWizard.tooltip.configureGuestTraffic.description=Una breve descripci\u00f3n para su red. -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=El rango de direcciones IP que estar\u00e1 disponible para los guest en esta zona. Si se utiliza una sola NIC, estas IPs estar\u00e1n en el mismo CIDR del pod. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=El gatway, puerta de enlace, que las maquinas guest deben usar. -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=La m\u00e1scara de red en uso en la subred que los clientes deben utilizar -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=El rango de direcciones IP que estar\u00e1 disponible para los guest en esta zona. Si se utiliza una sola NIC, estas IPs estar\u00e1n en el mismo CIDR del pod. -message.installWizard.tooltip.configureGuestTraffic.name=Nombre de su RED -message.instance.scaled.up.confirm=\u00bfRealmente desea escalar la instancia? -message.instanceWizard.noTemplates=No tienes plantillas disponibles, por favor agregue una plantilla compatible y reinicio el asistente de creaci\u00f3n de instancias. -message.ip.address.changed=Su direcci\u00f3n IP pudo haber cambiado. Le gustar\u00eda actualizar el listado? Tenga en cuenta que en este caso el panel de detalles se cerrar\u00e1. -message.iso.desc=Disco con la imagen contenedora de los datos o los medios bootables para el SO -message.join.project=Ahora estas unido al proyecto. Por favor cambiar a la Vista de Proyecto para verlo. -message.launch.vm.on.private.network=\u00bfDesea lanzar su instancias en tu red privada dedicada? -message.launch.zone=La Zona esta lista para ser lanzada, por favor prosiga al pr\u00f3ximo paso. -message.ldap.group.import=Todos los usuarios del grupo dado ser\u00e1n importados -message.link.domain.to.ldap=Habilitar autosync para este dominio en LDAP -message.listView.subselect.multi=(Ctrl/Cmd-click) -message.lock.account=Por favor, confirme que desea bloquear esta cuenta. Al bloquear la cuenta, todos los usuarios de esta cuenta ya no ser\u00e1 capaz de gestionar sus recursos de la nube. Los recursos existentes todav\u00eda se puede acceder. -message.migrate.instance.confirm=Por favor, confirme el anfitri\u00f3n desea migrar la instancia virtual. -message.migrate.instance.to.host=Por favor, confirmar que desea mover la instancia a otro host. -message.migrate.instance.to.ps=Por favor, confirmar que desea mover la instancia a otro primary storage. -message.migrate.router.confirm=Por favor, confirme el hu\u00e9sped que desea migrar el router\: -message.migrate.systemvm.confirm=Por favor, confirme el hu\u00e9sped que desea migrar la m\u00e1quina virtual de sistema\: -message.migrate.volume=Por favor confirme que usted quiere migrar el volumen a otro almacenamiento primario -message.network.addVM.desc=Por favor indique la red que desea agregar a esta VM. Una NIC nueva se agregar\u00e1 en esta red. -message.network.addVMNIC=Por favor confirme que desea agregar una nueva NIC a la VM para esta red. -message.network.remote.access.vpn.configuration=Se ha creado la configuraci\u00f3n de acceso remoto por VPN, pero fall\u00f3 su aplicaci\u00f3n. Por favor verifique la conectividad de todos los elementos de red y vuelva a intentarlo. -message.new.user=Especifique lo siguiente para agregar un nuevo usuario a la cuenta -message.no.affinity.groups=No hay ning\u00fan grupo de afinidad. Por favor continue con el paso siguiente. -message.no.host.available=No hay disponibles Hosts para la Migraci\u00f3n -message.no.network.support.configuration.not.true=Usted no tiene ninguna zona que ha permitido a grupo de seguridad. Por lo tanto, no hay funciones de red adicionales. Por favor, contin\u00fae con el paso 5. -message.no.network.support=El hipervisor seleccionado, vSphere, no tiene funciones de red adicionales. Por favor, contin\u00fae con el paso 5. -message.no.projects.adminOnly=No tienes ning\u00fan proyecto.
Por favor dile a tu administrador que cree uno nuevo. -message.no.projects=No tienes ning\u00fan proyecto.
Pro favor crear uno nuevo desde la secci\u00f3n de Proyectos. -message.number.clusters=

\# de Grupos

-message.number.hosts=

\# de Anfitri\u00f3n

-message.number.pods=

\# de Las vainas

-message.number.storage=

\# de Almacenamiento primario

-message.number.zones=

\# de Zonas

-message.outofbandmanagement.action.maintenance=Atenci\u00f3n, el Servidor est\u00e1 en modo mantenimiento -message.outofbandmanagement.changepassword=Cambiar contrase\u00f1a de Gesti\u00f3n Out-of-band -message.outofbandmanagement.configure=Configurar Gesti\u00f3n Out-of-band -message.outofbandmanagement.disable=Deshabilitar gesti\u00f3n Out-of-band -message.outofbandmanagement.enable=Habilitar gesti\u00f3n Out-of-band -message.outofbandmanagement.issue=Enviar Acci\u00f3n de Gesti\u00f3n de Alimentac\u00edon Fuera-de-Banda -message.password.has.been.reset.to=La Contrase\u00f1a se ha cambiado a -message.password.of.the.vm.has.been.reset.to=La Contrase\u00f1a se ha cambiado a -message.pending.projects.1=Tiene invitaciones a proyectos pendientes\: -message.pending.projects.2=Para visualizar, por favor acceda al secci\u00f3n de proyectos y seleccione la invitaci\u00f3n desde la lista desplegable. -message.please.add.at.lease.one.traffic.range=Por favor agregue al menos un rango de tr\u00e1fico. -message.please.confirm.remove.ssh.key.pair=Por favor confirme que usted quiere eliminar el Par de Claves SSH -message.please.proceed=Por favor proceda a el siguiente paso. -message.please.select.a.configuration.for.your.zone=Por favor elija una configuraci\u00f3n para su zona. -message.please.select.a.different.public.and.management.network.before.removing=Por favor elija una red public y de management diferente antes de remover -message.please.select.networks=Por favor seleccione la red para su maquina virtual. -message.please.select.ssh.key.pair.use.with.this.vm=Por favor elija el par de claves ssh que desea usar en esta VM\: -message.please.wait.while.zone.is.being.created=Por favor espere un momento la zona esta siendo creada, puede llegar a demorar unos minutos... -message.pod.dedication.released=Dedicaci\u00f3n de Pod liberada -message.portable.ip.delete.confirm=Por favor confirme que desea borrar el Rango IP Port\u00e1til -message.project.invite.sent=Invitaci\u00f3n enviada al usuario, se agregar\u00e1 al proyecto solo cuando acepte la invitaci\u00f3n. -message.public.traffic.in.advanced.zone=El tr\u00e1fico p\u00fablico se genera cuando las VMs del Cloud acceden a recursos sobre Internet. Para ello se deben asignar direcciones IP p\u00fablicas. Los usuarios pueden usar la interfaz de CloudStack para adquirir estas IPs e implementar NAT entre su red de guest y su red p\u00fablica.

Debe proveer por lo menos un rango de direcciones IP para el tr\u00e1fico de Internet. -message.public.traffic.in.basic.zone=El tr\u00e1fico p\u00fablico es generado cuando las VMs en el cloud acceden a Internet o proveen servicios a clientes sobre Internet. Direcciones IPs accesible p\u00fablicamente deben ser asignadas para este cometido. Cuando una instancia es creada, una IP de este conjunto de IPs Publicas es asignada a la instancia ademas de la direcci\u00f3n IP en la red guest. NAT est\u00e1tico 1-1 ser\u00e1 configurado en forma autom\u00e1tica entre la IP p\u00fablica y la IP guest. Los usuarios tambi\u00e9n pueden utilizar la interfaz de CLoudStack para adquirir IPs adicionales para implementar NAT est\u00e1tico entre las instancias y la IP p\u00fablica. -message.question.are.you.sure.you.want.to.add=Est\u00e1 seguro que quiere agregar -message.read.admin.guide.scaling.up=Por favor les la secci\u00f3n de escalado din\u00e1mico en la gu\u00eda de administraci\u00f3n antes de escalarlo. -message.recover.vm=Confirme que quiere recuperar esta VM. -message.redirecting.region=Redirigiendo a la regi\u00f3n... -message.reinstall.vm=NOTA\: Proceda con precauci\u00f3n. Esta acci\u00f3n har\u00e1 que la VM se vuelva a instalar usando la plantilla. Los datos en el disco de base se perder\u00e1n. Los vol\u00famenes de datos adicionales no se modificar\u00e1n. -message.removed.ssh.key.pair=Se removi\u00f3 un Par de Claves SSH -message.remove.ldap=\u00bfQuiere borrar la configuraci\u00f3n LDAP? -message.remove.region=\u00bfEsta seguro que desea remover esta regi\u00f3n del servidor de management? -message.remove.vpc=Por favor confirme que usted quiere eliminar el VPC -message.remove.vpn.access=Por favor, confirme que desea eliminar el acceso VPN desde el siguiente usuario -message.reset.password.warning.notPasswordEnabled=El Template de esta instancia fue creado sin gesti\u00f3n de contrase\u00f1a habilitada -message.reset.password.warning.notStopped=Su instancia debe ser detenida antes de intentar cambiar la contrase\u00f1a actual. -message.reset.VPN.connection=Por favor confirme que desea respetar la conexi\u00f3n de la VPN -message.restart.mgmt.server=Por favor, reinicie el servidor de administraci\u00f3n (s) para la nueva configuraci\u00f3n surta efecto. -message.restart.mgmt.usage.server=Por favor reinicie sus servidores de management y de usare, para que los nuevos seteos se hagan efectivos. -message.restart.network=Todos los servicios provistos por esta red ser\u00e1n interrumpidos. Por favor confirme que desea reiniciar esta red. -message.restart.vpc=Por favor confirme que usted quiere reiniciar el VPC -message.restart.vpc.remark=Por favor confirme que desea reiniciar el VPC

Atenci\u00f3n\: creando un VPC sin redundancia forzara la limpieza. Todas las redes dejaran de estar disponibles por unos minutos.

-message.restoreVM=\u00bfDesea recuperar la VM? -message.role.ordering.fail=Reordenaci\u00f3n de permisos de reglas abortada ya que la lista ha cambiado mientras realizaba los cambios. Por favor, intente de nuevo. -message.security.group.usage=(Uso pulse Ctrl para seleccionar todos los grupos de seguridad se aplica) -message.select.affinity.groups=Por favor elija los grupos de afinidad a los que desea unir la VM\: -message.select.a.zone=Una zona normalmente se corresponde con un solo datacenter. M\u00faltiples zonas pueden ayudar a aumentar la disponibilidad del cloud al proveer aislaci\u00f3n f\u00edsica y redundancia. -message.select.instance=Por favor seleccione una instancia -message.select.iso=Por favor seleccione un ISO para su nueva instancia virtual -message.select.item=Por favor, seleccionar un item . -message.select.security.groups=Por favor elija los security group(s) para su nueva VM -message.select.template=Por favor seleccione un template para su nueva instancia virtual -message.select.tier=Por favo elija un Tier -message.set.default.NIC.manual=Por favor actualice manualmente la NIC por defecto en la VM. -message.set.default.NIC=Por favor que desea que esta NIC sea la por defecto en esta VM. -message.setup.physical.network.during.zone.creation.basic=Cuando se esta agregando un zona b\u00e1sica, puedes sesear un red f\u00edsica que se corresponda a una NIC del hipervisor. La red transporta varios tipos de tr\u00e1fico.

Puedes tambi\u00e9n arrastrar y soltar otro tipo de tr\u00e1ficos en la interfaz f\u00edsica. -message.setup.physical.network.during.zone.creation=Cuando se esta agregando una zona avanzada, se necesita setear una o m\u00e1s redes f\u00edsicas. Cada red se corresponder\u00e1 con una NIC del hipervisor. Cada red f\u00edsica puede transportar uno o m\u00e1s tipos de tr\u00e1fico, con ciertas restricciones en como ellos se combinan.

Arrastre y suelte uno o m\u00e1s tipos de tr\u00e1fico sobre cada red f\u00edsica. -message.setup.successful=La configuraci\u00f3n de la cloud finalizo satisfactoriamente. -message.snapshot.schedule=Puedes definir cronogramas de instant\u00e2neas recurrentes al seleccionar las opciones disponibles debajo y aplicando las pol\u00edticas deseadas -message.specifiy.tag.key.value=Por favor especifique una etiqueta con clave y valor -message.specify.url=Por favor especifique la URL -message.step.1.continue=Por favor seleccione una plantilla o ISO para continuar -message.step.1.desc=Por favor seleccione una plantilla para la instancia virtual. Tambi\u00e9n puede optar por seleccionar una plantilla en blanco desde el que puede ser una imagen ISO instalado en. -message.step.2.continue=Por favor seleccione una oferta de servicio para continuar -message.step.3.continue=Por favor seleccione una oferta en disco para continuar -message.step.4.continue=Por favor seleccione al menos una red social para continuar -message.step.4.desc=Por favor, seleccione la red primaria que la instancia virtual estar\u00e1 conectado. -message.storage.traffic=Tr\u00e1fico entre los recursos internos de CloudStack\\\\'s, incluyendo cualquier componente que se comunique con el Management Server, tales como hosts y las VMs de systema de CloudStack -message.suspend.project=\u00bfEst\u00e1 seguro que desea suspender este proyecto? -message.systems.vms.ready=VM de Sistema lista. -message.template.copying=La Plantilla esta siendo copiada. -message.template.desc=La imagen de OS que puede usarse para iniciar una VM -message.tier.required=El Tier es obligatorio. -message.tooltip.dns.1=Nombre del servidor DNS que ser\u00e1 usado por las VMs en la zona. Las direcciones IP p\u00fablicas de la zona deber\u00e1n llegar a este servidor. -message.tooltip.dns.2=El nombre del segundo servidor DNS para ser usado por las VMs en esta zona. La direcci\u00f3n IP p\u00fablica para esta zona debe ser accesible desde el servidor. -message.tooltip.internal.dns.1=Nombre del servidor DNS que ser\u00e1 usado por las VMs internas de sistema de CloudStack en la zona. Las direcciones IP p\u00fablicas de la zona deber\u00e1n llegar a este servidor. -message.tooltip.internal.dns.2=Nombre del servidor DNS que ser\u00e1 usado por las VMs internas de sistema de CloudStack en la zona. Las direcciones IP p\u00fablicas de la zona deber\u00e1n llegar a este servidor. -message.tooltip.network.domain=Un subfijo DNS que crear\u00e1 un nombre de dominio personalizado para la red que es acceso da por las VMs guest. -message.tooltip.pod.name=Un nombre para este pod. -message.tooltip.reserved.system.gateway=El gateway para los hosts en el pod. -message.tooltip.reserved.system.netmask=El prefijo de red que define la subred del pod. Use notaci\u00f3n CIDR. -message.tooltip.zone.name=Un nombre para la zona. -message.update.os.preference=Por favor seleccione un sistema operativo de preferencia para este equipo. Todas las instancias virtuales con preferencias similares ser\u00e1n los primeros asignados a este equipo antes de elegir otro. -message.update.resource.count=Por favor confirme que usted quiere actualizar los conteos para esta cuenta -message.update.ssl.failed=Fallo la actualizaci\u00f3n del Certficado SSL. -message.update.ssl=Por favor, env\u00ede una nueva X.509 compatible con certificado SSL que se actualizar\u00e1 a cada instancia virtual de la consola del servidor proxy\: -message.update.ssl.succeeded=Actualizaci\u00f3n del Certificado SSL exitosa -message.validate.accept=Por favor ingrese un valor con extensi\u00f3n v\u00e1lida. -message.validate.creditcard=Por favor ingrese un n\u00famero de tarjeta de cr\u00e9dito v\u00e1lido. -message.validate.date.ISO=Por favor ingrese una fecha (ISO) v\u00e1lida. -message.validate.date=Por favor ingrese una fecha v\u00e1lida. -message.validate.digits=Por favor ingrese solo n\u00fameros. -message.validate.email.address=Por favor ingrese i+un email v\u00e1lido. -message.validate.equalto=Por favor ingrese el mismo valor nuevamente. -message.validate.fieldrequired=Este campo es obligatorio. -message.validate.fixfield=Por favor corrija este campo. -message.validate.instance.name=El nombre de la instancia no puede ser m\u00e1s largo que 63 caracteres. Solo se permiten letras ASCII tales como a~z, A~Z, n\u00fameros 0~9, los guiones est\u00e1n permitidos. Deben empezar con una letra y finalizar con una letra o un n\u00famero. -message.validate.invalid.characters=Se han hallado caracteres no v\u00e1lidos. Por favor, corr\u00edjalos. -message.validate.maxlength=Por favor ingrese no m\u00e1s que {0} caracteres. -message.validate.max=Por favor ingrese un valor menor o igual que {0}. -message.validate.minlength=Por favor ingrese al menos {0} caracteres. -message.validate.number=Por favor ingrese un n\u00famero v\u00e1lido. -message.validate.range.length=Por favor ingrese un valor entre {0} y {1} caracteres de longitud. -message.validate.range=Por favor ingrese un valor entre {0} y {1}. -message.validate.URL=Por favor ingrese una URL v\u00e1lida. -message.virtual.network.desc=Una red dedicada virtualizados para su cuenta. El dominio de difusi\u00f3n est\u00e1 contenida dentro de una VLAN y todos los acceso a la red p\u00fablica se encamina a cabo por un router virtual. -message.vm.create.template.confirm=Crear plantilla de la m\u00e1quina virtual se reiniciar\u00e1 autom\u00e1ticamente. -message.vm.review.launch=Por favor verifique la siguiente informaci\u00f3n es correcta y confirme antes de lanzarla. -message.vnmc.available.list=VNMC no esta disponible en esta lista de proveedores. -message.vnmc.not.available.list=VNMC no esta disponible en esta lista de proveedores. -message.volume.create.template.confirm=Por favor, confirme que desea crear una plantilla para este volumen de disco. Creaci\u00f3n de la plantilla puede oscilar entre varios minutos m\u00e1s, dependiendo del tama\u00f1o del volumen. -message.waiting.for.builtin.templates.to.load=Esperando por las plantillas incorporadas para cargar... -message.XSTools61plus.update.failed=La actualizaci\u00f3n fall\u00f3, la versi\u00f3n original de XS es 6.1\\+. Error\: -message.you.must.have.at.least.one.physical.network=Debes tener por lo menos una red f\u00edsica -message.your.cloudstack.is.ready=Tu CloudStack esta listo\! -message.Zone.creation.complete=Creci\u00f3n de la zona completada -message.zone.creation.complete.would.you.like.to.enable.this.zone=Creci\u00f3n de la zona completada.\u00bfDesea habilitarla? -message.zone.no.network.selection=La zona elegida no tiene ninguna red para seleccionar. -message.zone.step.1.desc=Por favor seleccione un modelo de red para su zona. -message.zone.step.2.desc=Por favor ingrese la siguiente informaci\u00f3n para agregar una nueva zona -message.zone.step.3.desc=Por favor ingrese la siguiente informaci\u00f3n para agregar un nuevo por -message.zoneWizard.enable.local.storage=PRECAUCI\u00d3N\: Si habilita el almacenamiento local para esta zona, debe hacer lo siguiente dependiendo de donde se quieran iniciar las VMs de sistema\:

1. Si las VMs de sistema deben ser iniciadas sobre el almacenamiento primario compartido, este debe agregarse a la zona despu\u00e9s de creada. Tambi\u00e9n puedes iniciar la zona en estado dshabilitado.

2. Si la VM de sistema necesita ser iniciada en el almacenamiento primario local, el par\u00e1metro system.vm.use.local.storage debe ser puesto en true antes de habilitar la zona.


\u00bfDesea continuar? -messgae.validate.min=Por favor ingrese un valor mayor o igual que {0}. -mode=modo -network.rate=Tasa de Red -notification.reboot.instance=Reiniciar Instancia -notification.start.instance=Iniciar Instancia -notification.stop.instance=Detener Instancia -side.by.side=Juntos -state.Accepted=Aceptado -state.Active=Activo -state.Allocated=Asignados -state.Allocating=Asignando -state.BackedUp=Respaldado -state.BackingUp=Realizando Backup -state.Completed=Completado -state.Creating=Creando -state.Declined=Declinado -state.Destroyed=Destruidas -state.detached=Desconectado -state.Disabled=personas de movilidad reducida -state.Enabled=Habilitado -state.Error=Error -state.Expunging=Purgando -state.Migrating=Migrando -state.Pending=pendiente -state.Ready=Listo -state.Running=Ejecutando -state.Starting=Iniciando -state.Stopped=Detenidas -state.Stopping=Parando -state.Suspended=Suspendido -title.upload.volume=Subir Volumen -ui.listView.filters.all=Todas -ui.listView.filters.mine=Mias diff --git a/client/WEB-INF/classes/resources/messages_fr_FR.properties b/client/WEB-INF/classes/resources/messages_fr_FR.properties deleted file mode 100644 index 32b5f350b22b..000000000000 --- a/client/WEB-INF/classes/resources/messages_fr_FR.properties +++ /dev/null @@ -1,2284 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Propri\u00e9t\u00e9s de l\\'\u00e9l\u00e9ment modifi\u00e9es -confirm.enable.s3=Remplir les informations suivantes pour activer le support de stockage secondaire S3 -confirm.enable.swift=Remplir les informations suivantes pour activer Swift -error.could.not.change.your.password.because.ldap.is.enabled=Erreur\: impossible de changer votre mot de passe car le mode LDAP est activ\u00e9. -error.could.not.enable.zone=Impossible d\\'activer la zone -error.installWizard.message=Une erreur s\\'est produite ; vous pouvez retourner en arri\u00e8re et corriger les erreurs -error.invalid.username.password=Identifiant ou mot de passe invalide -error.login=Votre identifiant / mot de passe ne correspond pas \u00e0 nos enregistrements. -error.menu.select=\u00c9chec de l\\'action car il n\\'y a aucun \u00e9l\u00e9ment s\u00e9lectionn\u00e9. -error.mgmt.server.inaccessible=Le serveur de gestion est inaccessible. Veuillez essayer plus tard. -error.password.not.match=Les champs mot de passe ne correspondent pas -error.please.specify.physical.network.tags=L\\'offre de r\u00e9seau ne sera pas disponible tant que des libell\u00e9s n\\'auront pas \u00e9t\u00e9 renseign\u00e9s pour ce r\u00e9seau physique. -error.session.expired=Votre session a expir\u00e9e. -error.something.went.wrong.please.correct.the.following=Quelque chose s\\'est mal pass\u00e9e ; veuillez corriger le point suivant -error.unable.to.reach.management.server=Impossible d\\'attendre le serveur de gestion -error.unresolved.internet.name=Votre nom Internet ne peut pas \u00eatre r\u00e9solu. -force.delete.domain.warning=Attention \: Choisir cette option entra\u00eenera la suppression de tous les domaines issus et l\\'ensemble des comptes associ\u00e9s, ainsi que de leur ressources -force.delete=Forcer la suppression -force.remove.host.warning=Attention \: Choisir cette option entra\u00eenera CloudStack \u00e0 forcer l\\'arr\u00eat de l\\'ensemble des machines virtuelles avant d\\'enlever cet h\u00f4te du cluster -force.remove=Suppression forc\u00e9e -force.stop=Forcer l\\'arr\u00eat -force.stop.instance.warning=Attention \: un arr\u00eat forc\u00e9 sur cette instance est la dernier option. Cela peut engendrer des pertes de donn\u00e9es et/ou un comportement inconsistant de votre instance. -hint.no.host.tags=Aucun libell\u00e9 d\\'h\u00f4te trouv\u00e9 -hint.no.storage.tags=Aucune libell\u00e9 de stockage trouv\u00e9 -hint.type.part.host.tag=Saisir le cadre d\\'un libell\u00e9 d\\'h\u00f4te -hint.type.part.storage.tag=Saisir le cadre d\\'un libell\u00e9 de stockage -ICMP.code=Code ICMP -ICMP.type=Type ICMP -image.directory=R\u00e9pertoire d\\'images -inline=Align\u00e9 -instances.actions.reboot.label=Red\u00e9marrer l\\'instance -label.about.app=A propos de CloudStack -label.about=A propos de -label.accept.project.invitation=Accepter l\\'invitation au projet -label.account.and.security.group=Compte, groupe de s\u00e9curit\u00e9 -label.account=Compte -label.account.details=D\u00e9tails compte -label.account.id=ID de compte -label.account.lower=compte -label.account.name=Nom de compte -label.accounts=Comptes -label.account.specific=Sp\u00e9cifique au compte -label.account.type=Type Compte -label.acl=ACL -label.acl.id=ID ACL -label.acl.list.rules=Liste r\u00e8gles ACL -label.acl.name=Nom ACL -label.acl.replaced=ACL remplac\u00e9e -label.acquire.new.ip=Acqu\u00e9rir nouvelle adr. IP -label.acquire.new.secondary.ip=Acqu\u00e9rir nouvelle IP secondaire -label.action=Action -label.action.attach.disk.processing=Rattachement du disque... -label.action.attach.disk=Rattacher disque -label.action.attach.iso.processing=Rattachement de l\\'image ISO... -label.action.attach.iso=Rattacher image ISO -label.action.cancel.maintenance.mode=Annuler mode maintenance -label.action.cancel.maintenance.mode.processing=Annulation du mode maintenance... -label.action.change.password=Changer le mot de passe -label.action.change.service=Changer Service -label.action.change.service.processing=Changement service... -label.action.configure.samlauthorization=Configurer Autorisation SAML SSO -label.action.copy.ISO=Copier une image ISO -label.action.copy.ISO.processing=Copie ISO... -label.action.copy.template=Copier mod\u00e8le -label.action.copy.template.processing=Copie mod\u00e8le... -label.action.create.template=Cr\u00e9er un mod\u00e8le -label.action.create.template.from.vm=Cr\u00e9er un mod\u00e8le depuis la VM -label.action.create.template.from.volume=Cr\u00e9er un mod\u00e8le depuis le volume -label.action.create.template.processing=Cr\u00e9ation du Mod\u00e8le... -label.action.create.vm=Cr\u00e9er une VM -label.action.create.vm.processing=Cr\u00e9ation de la VM... -label.action.create.volume=Cr\u00e9er un Volume -label.action.create.volume.processing=Cr\u00e9ation du Volume... -label.action.delete.account.processing=Suppression du compte... -label.action.delete.account=Supprimer un compte -label.action.delete.cluster.processing=Suppression du Cluster... -label.action.delete.cluster=Supprimer le Cluster -label.action.delete.disk.offering.processing=Suppression de l\\'offre de disque... -label.action.delete.disk.offering=Supprimer Offre de Disque -label.action.delete.domain.processing=Suppression du domaine... -label.action.delete.domain=Supprimer le domaine -label.action.delete.firewall.processing=Suppression du Pare-feu... -label.action.delete.firewall=Supprimer la r\u00e8gle de pare-feu -label.action.delete.ingress.rule.processing=Suppression de la r\u00e8gle d\\'entr\u00e9e.. -label.action.delete.ingress.rule=Supprimer la r\u00e8gle d\\'entr\u00e9e -label.action.delete.IP.range.processing=Suppression de la plage IP... -label.action.delete.IP.range=Supprimer la plage IP -label.action.delete.ISO.processing=Suppression de l\\'image ISO... -label.action.delete.ISO=Supprimer l\\'image ISO -label.action.delete.load.balancer.processing=Suppression du r\u00e9partiteur de charge... -label.action.delete.load.balancer=Supprimer la r\u00e8gle de r\u00e9partition de charge -label.action.delete.network.processing=Suppression du r\u00e9seau... -label.action.delete.network=Supprimer le r\u00e9seau -label.action.delete.nexusVswitch=Supprimer le Nexus 1000v -label.action.delete.nic=Supprimer carte NIC -label.action.delete.physical.network=Supprimer le r\u00e9seau physique -label.action.delete.pod.processing=Suppression du pod... -label.action.delete.pod=Supprimer le Pod -label.action.delete.primary.storage.processing=Suppression du stockage primaire... -label.action.delete.primary.storage=Supprimer le stockage primaire -label.action.delete.secondary.storage.processing=Suppression du stockage secondaire... -label.action.delete.secondary.storage=Supprimer le stockage secondaire -label.action.delete.security.group.processing=Suppression du groupe de s\u00e9curit\u00e9 -label.action.delete.security.group=Supprimer le groupe de s\u00e9curit\u00e9 -label.action.delete.service.offering.processing=Suppression de l\\'offre de service... -label.action.delete.service.offering=Supprimer Offre Service -label.action.delete.snapshot.processing=Suppression de l\\'instantan\u00e9... -label.action.delete.snapshot=Supprimer l\\'instantan\u00e9 -label.action.delete.system.service.offering=Supprimer Offre de Service Syst\u00e8me -label.action.delete.template.processing=Suppression du mod\u00e8le... -label.action.delete.template=Supprimer le mod\u00e8le -label.action.delete.user.processing=Suppression de l\\'utilisateur... -label.action.delete.user=Supprimer l\\'utilisateur -label.action.delete.volume.processing=Suppression du volume... -label.action.delete.volume=Supprimer le volume -label.action.delete.zone.processing=Suppression de la zone... -label.action.delete.zone=Supprimer la zone -label.action.destroy.instance.processing=Suppression de l\\'instance... -label.action.destroy.instance=Supprimer l\\'instance -label.action.destroy.systemvm.processing=Suppression de la VM Syst\u00e8me... -label.action.destroy.systemvm=Supprimer VM Syst\u00e8me -label.action.detach.disk=D\u00e9tacher le disque -label.action.detach.disk.processing=D\u00e9tachement du disque... -label.action.detach.iso=D\u00e9tacher l\\'image ISO -label.action.detach.iso.processing=D\u00e9tachement de l\\'image ISO... -label.action.disable.account=D\u00e9sactiver le compte -label.action.disable.account.processing=D\u00e9sactivation du compte... -label.action.disable.cluster=D\u00e9sactiver le cluster -label.action.disable.cluster.processing=D\u00e9sactivation du cluster... -label.action.disable.nexusVswitch=D\u00e9sactiver le Nexus 1000v -label.action.disable.physical.network=D\u00e9sactiver le r\u00e9seau physique -label.action.disable.pod=D\u00e9sactiver le Pod -label.action.disable.pod.processing=D\u00e9sactivation du Pod... -label.action.disable.static.NAT=D\u00e9sactiver le NAT Statique -label.action.disable.static.NAT.processing=D\u00e9sactivation du NAT Statique... -label.action.disable.user=D\u00e9sactiver l\\'utilisateur -label.action.disable.user.processing=D\u00e9sactivation de l\\'utilisateur... -label.action.disable.zone=D\u00e9sactivation de la zone -label.action.disable.zone.processing=D\u00e9sactivation de la zone... -label.action.download.ISO=T\u00e9l\u00e9charger une image ISO -label.action.download.template=T\u00e9l\u00e9charger un mod\u00e8le -label.action.download.volume.processing=T\u00e9l\u00e9chargement du volume... -label.action.download.volume=T\u00e9l\u00e9charger un volume -label.action.edit.account=Modifier le Compte -label.action.edit.disk.offering=Modifier Offre Disque -label.action.edit.domain=Modifier le domaine -label.action.edit.global.setting=Modifier la configuration globale -label.action.edit.host=Modifier l\\'h\u00f4te -label.action.edit.instance=Modifier l\\'instance -label.action.edit.ISO=Modifier l\\'image ISO -label.action.edit.network=Modifier le r\u00e9seau -label.action.edit.network.offering=Modifier Offre R\u00e9seau -label.action.edit.network.processing=Modification du R\u00e9seau... -label.action.edit.pod=Modifier le pod -label.action.edit.primary.storage=Modifier le stockage primaire -label.action.edit.resource.limits=Modifier les limites de ressources -label.action.edit.service.offering=Modifier Offre Service -label.action.edit.template=Modifier le mod\u00e8le -label.action.edit.user=Modifier l\\'utilisateur -label.action.edit.zone=Modifier la zone -label.action.enable.account=Activer le compte -label.action.enable.account.processing=Activation du compte... -label.action.enable.cluster=Activer le cluster -label.action.enable.cluster.processing=Activation du cluster... -label.action.enable.maintenance.mode=Activer le mode maintenance -label.action.enable.maintenance.mode.processing=Activation du mode maintenance... -label.action.enable.nexusVswitch=Activer le Nexus 1000v -label.action.enable.physical.network=Activer le r\u00e9seau physique -label.action.enable.pod=Activer le Pod -label.action.enable.pod.processing=Activation du Pod... -label.action.enable.static.NAT=Activer le NAT Statique -label.action.enable.static.NAT.processing=Activation du NAT Statique... -label.action.enable.user=Activer l\\'utilisateur -label.action.enable.user.processing=Activation de l\\'utilisateur... -label.action.enable.zone=Activer la zone -label.action.enable.zone.processing=Activation de la zone... -label.action.expunge.instance.processing=Purge de l\\'Instance... -label.action.expunge.instance=Purger Instance -label.action.force.reconnect=Forcer la reconnexion -label.action.force.reconnect.processing=Reconnexion en cours... -label.action.generate.keys=G\u00e9n\u00e9rer les cl\u00e9s -label.action.generate.keys.processing=G\u00e9n\u00e9ration des cl\u00e9s... -label.action.list.nexusVswitch=Liste des Nexus 1000v -label.action.lock.account.processing=Verrouillage du compte... -label.action.lock.account=Verrouiller le compte -label.action.manage.cluster=G\u00e9rer le Cluster -label.action.manage.cluster.processing=Gestion du cluster... -label.action.migrate.instance=Migrer l\\'instance -label.action.migrate.instance.processing=Migration de l\\'instance... -label.action.migrate.router=Migration routeur -label.action.migrate.router.processing=Migration routeur en cours... -label.action.migrate.systemvm=Migrer VM Syst\u00e8me -label.action.migrate.systemvm.processing=Migration VM syst\u00e8me en cours ... -label.action.reboot.instance.processing=Red\u00e9marrage de l\\'instance... -label.action.reboot.instance=Red\u00e9marrer l\\'instance -label.action.reboot.router.processing=Red\u00e9marrage du routeur... -label.action.reboot.router=Red\u00e9marrer le routeur -label.action.reboot.systemvm.processing=Red\u00e9marrage de la VM Syst\u00e8me... -label.action.reboot.systemvm=Red\u00e9marrer VM Syst\u00e8me -label.action.recurring.snapshot=Instantan\u00e9s r\u00e9currents -label.action.register.iso=Enregistrer ISO -label.action.register.template=Enregistrer mod\u00e8le depuis une URL -label.action.release.ip=Lib\u00e9rer l\\'adresse IP -label.action.release.ip.processing=Lib\u00e9ration de l\\'adresse IP... -label.action.remove.host.processing=Suppression de l\\'h\u00f4te... -label.action.remove.host=Supprimer l\\'h\u00f4te -label.action.reset.password.processing=R\u00e9-initialisation du mot de passe... -label.action.reset.password=R\u00e9-initialiser le mot de passe -label.action.resize.volume.processing=Redimensionnement en cours... -label.action.resize.volume=Redimensionner Volume -label.action.resource.limits=Limites de ressources -label.action.restore.instance.processing=Restauration de l\\'instance... -label.action.restore.instance=Restaurer l\\'instance -label.action.revert.snapshot.processing=Retour \u00e0 l\\'instantan\u00e9... -label.action.revert.snapshot=R\u00e9tablir Instantan\u00e9 -label.actions=Actions -label.action.start.instance=D\u00e9marrer l\\'instance -label.action.start.instance.processing=D\u00e9marrage de l\\'instance... -label.action.start.router=D\u00e9marrer le routeur -label.action.start.router.processing=D\u00e9marrage du routeur... -label.action.start.systemvm=D\u00e9marrer la VM syst\u00e8me -label.action.start.systemvm.processing=D\u00e9marrage de la VM syst\u00e8me... -label.action.stop.instance=Arr\u00eater l\\'Instance -label.action.stop.instance.processing=Arr\u00eat de l\\'Instance... -label.action.stop.router=Arr\u00eater le routeur -label.action.stop.router.processing=Arr\u00eat du routeur... -label.action.stop.systemvm=Arr\u00eater VM Syst\u00e8me -label.action.stop.systemvm.processing=Arr\u00eat de la VM syst\u00e8me... -label.action.take.snapshot=Prendre un instantan\u00e9 -label.action.take.snapshot.processing=Prise de l\\'instantan\u00e9... -label.action.unmanage.cluster=Ne plus g\u00e9rer le Cluster -label.action.unmanage.cluster.processing=Arr\u00eat de la gestion du Cluster -label.action.update.OS.preference=Mettre \u00e0 jour les pr\u00e9f\u00e9rences d\\'OS -label.action.update.OS.preference.processing=Mise \u00e0 jour des pr\u00e9f\u00e9rences d\\'OS... -label.action.update.resource.count=Mettre \u00e0 jour le compteur des ressources -label.action.update.resource.count.processing=Mise \u00e0 jour du compteur... -label.action.vmsnapshot.create=Prendre un instantan\u00e9 VM -label.action.vmsnapshot.delete=Supprimer l\\'instantan\u00e9 VM -label.action.vmsnapshot.revert=R\u00e9tablir Instantan\u00e9 VM -label.activate.project=Activer projet -label.active.sessions=Sessions actives -label.add.account=Ajouter un compte -label.add.accounts=Ajouter des comptes -label.add.accounts.to=Ajouter des comptes sur -label.add.account.to.project=Ajouter un compte au projet -label.add.ACL=Ajouter r\u00e8gle ACL -label.add.acl.list=Ajouter Liste ACL -label.add.affinity.group=Ajouter nouveau groupe d\\'affinit\u00e9 -label.add=Ajouter -label.add.baremetal.dhcp.device=Ajouter un DHCP Baremetal -label.add.baremetal.rack.configuration=Ajouter Configuration Rack Baremetal -label.add.BigSwitchBcf.device=Ajouter un contr\u00f4leur BigSwitch BCF -label.add.BrocadeVcs.device=Ajouter Switch Brocade Vcs -label.add.by=Ajout\u00e9 par -label.add.by.cidr=Ajouter par CIDR -label.add.by.group=Ajouter par groupe -label.add.ciscoASA1000v=Ajouter ressource CiscoASA1000v -label.add.cluster=Ajouter un cluster -label.add.compute.offering=Ajouter Offre Calcul -label.add.direct.iprange=Ajouter une plage d\\'adresse IP directe -label.add.disk.offering=Ajouter Offre Disque -label.add.domain=Ajouter un domaine -label.added.brocade.vcs.switch=Ajout d\\'un nouveau switch Brocade Vcs -label.added.network.offering=Offre de service ajout\u00e9e -label.added.new.bigswitch.bcf.controller=Ajout du nouveau contr\u00f4leur BigSwitch BCF -label.added.nicira.nvp.controller=Ajout d\\'un nouveau contr\u00f4leur Nicira NVP -label.add.egress.rule=Ajouter la r\u00e8gle sortante -label.addes.new.f5=Ajout d\\'un nouveau F5 -label.add.F5.device=Ajouter un F5 -label.add.firewall=Ajouter une r\u00e8gle de pare-feu -label.add.globo.dns=Ajouter GloboDNS -label.add.gslb=Ajouter GSLB -label.add.guest.network=Ajouter un r\u00e9seau d\\'invit\u00e9 -label.add.host=Ajouter un h\u00f4te -label.adding=Ajout -label.adding.cluster=Ajout du Cluster -label.adding.failed=\u00c9chec de l\\'ajout -label.adding.pod=Ajout du Pod -label.adding.processing=Ajout... -label.add.ingress.rule=Ajouter une r\u00e8gle d\\'entr\u00e9e -label.adding.succeeded=Ajout r\u00e9ussi -label.adding.user=Ajout de l\\'utilisateur -label.adding.zone=Ajout de la zone -label.add.intermediate.certificate=Ajouter certificat interm\u00e9diaire -label.add.internal.lb=Ajouter LB interne -label.add.ip.range=Ajouter une plage IP -label.add.isolated.guest.network=Ajouter un r\u00e9seau d\\'invit\u00e9 isol\u00e9 -label.add.isolated.guest.network.with.sourcenat=Ajouter un r\u00e9seau d\\'invit\u00e9 isol\u00e9 avec SourceNat -label.add.isolated.network=Ajouter un r\u00e9seau isol\u00e9 -label.additional.networks=R\u00e9seaux additionnels -label.add.LDAP.account=Ajouter Compte LDAP -label.add.ldap.account=Ajouter un compte LDAP -label.add.list.name=Nom Liste ACL -label.add.load.balancer=Ajouter un r\u00e9partiteur de charge -label.add.more=Ajouter plus -label.add.netScaler.device=Ajouter un Netscaler -label.add.network.ACL=Ajouter une r\u00e8gle d\\'acc\u00e8s r\u00e9seau ACL -label.add.network.acl.list=Ajouter Liste ACL r\u00e9seau -label.add.network=Ajouter un r\u00e9seau -label.add.network.device=Ajouter un \u00e9quipement r\u00e9seau -label.add.network.offering=Ajouter Offre R\u00e9seau -label.add.new.F5=Ajouter un F5 -label.add.new.gateway=Ajouter une nouvelle passerelle -label.add.new.NetScaler=Ajouter un Netscaler -label.add.new.PA=Ajouter nouveau Palo Alto -label.add.new.SRX=Ajouter un SRX -label.add.new.tier=Ajouter un nouveau tiers -label.add.nfs.secondary.staging.store=Ajouter un Stockage Secondaire Interm\u00e9diaire NFS -label.add.NiciraNvp.device=Ajouter un contr\u00f4leur Nvp -label.add.NuageVsp.device=Ajouter Nuage Virtualized Services Directory (VSD) -label.add.OpenDaylight.device=Ajouter contr\u00f4leur OpenDaylight -label.add.PA.device=Ajouter p\u00e9riph\u00e9rique Palo Alto -label.add.physical.network=Ajouter un r\u00e9seau physique -label.add.pod=Ajouter un pod -label.add.portable.ip.range=Ajouter Plage IP portable -label.add.port.forwarding.rule=Ajouter une r\u00e8gle de transfert de port -label.add.primary.storage=Ajouter un stockage primaire -label.add.private.gateway=Ajouter Passerelle Priv\u00e9e -label.add.region=Ajouter R\u00e9gion -label.add.resources=Ajouter ressources -label.add.role=Ajouter R\u00f4le -label.add.route=Ajouter route -label.add.rule=Ajouter r\u00e8gle -label.add.secondary.storage=Ajouter un stockage secondaire -label.add.security.group=Ajouter un groupe de s\u00e9curit\u00e9 -label.add.service.offering=Ajouter Offre Service -label.add.SRX.device=Ajouter un SRX -label.add.static.nat.rule=Ajouter une r\u00e8gle de NAT statique -label.add.static.route=Ajouter une route statique -label.add.system.service.offering=Ajouter Offre Service Syst\u00e8me -label.add.template=Ajouter un mod\u00e8le -label.add.to.group=Ajouter au groupe -label.add.ucs.manager=Ajouter Gestionnaire UCS -label.add.user=Ajouter un utilisateur -label.add.userdata=Donn\u00e9es Utilisateur -label.add.vlan=Ajouter un VLAN -label.add.vm=Ajouter VM -label.add.vms=Ajouter VMs -label.add.vms.to.lb=Ajouter une/des VM(s) \u00e0 la r\u00e8gle de r\u00e9partition de charge -label.add.VM.to.tier=Ajouter une machine virtuelle au tiers -label.add.vmware.datacenter=Ajouter un datacenter VMware -label.add.vnmc.device=Ajouter un VNMC -label.add.vnmc.provider=Ajouter fournisseur VNMC -label.add.volume=Ajouter un volume -label.add.vpc=Ajouter un VPC -label.add.vpc.offering=Ajouter Offre VPC -label.add.vpn.customer.gateway=Ajouter une passerelle VPN cliente -label.add.VPN.gateway=Ajouter une passerelle VPN -label.add.vpn.user=Ajouter un utilisateur VPN -label.add.vxlan=Ajouter un VXLAN -label.add.zone=Ajouter une zone -label.admin.accounts=Comptes Administrateur -label.admin=Administrateur -label.advanced=Avanc\u00e9 -label.advanced.mode=Mode avanc\u00e9 -label.advanced.search=Recherche avanc\u00e9e -label.affinity=Affinit\u00e9 -label.affinity.group=Groupe d\\'Affinit\u00e9 -label.affinity.groups=Groupes d\\'Affinit\u00e9 -label.agent.password=Mot de passe Agent -label.agent.port=Port Agent -label.agent.state=Statut Agent -label.agent.username=Identifiant Agent -label.agree=Accepter -label.alert=Alerte -label.alert.archived=Alerte archiv\u00e9e -label.alert.deleted=Alerte supprim\u00e9e -label.alert.details=D\u00e9tails Alerte -label.algorithm=Algorithme -label.allocated=Allou\u00e9 -label.allocation.state=\u00c9tat -label.allow=Autoriser -label.anti.affinity=Anti-affinit\u00e9 -label.anti.affinity.group=Groupe d\\'Anti-affinit\u00e9 -label.anti.affinity.groups=Groupes d\\'Anti-affinit\u00e9 -label.api.key=Cl\u00e9 d\\'API -label.api.version=Version d\\'API -label.apply=Appliquer -label.app.name=CloudStack -label.archive.alerts=Archiver alertes -label.archive=Archiver -label.archive.events=Archiver \u00e9v\u00e9nements -label.assign=Assigner -label.assigned.vms=VMs Assign\u00e9es -label.assign.instance.another=Assigner l\\'instance \u00e0 un autre compte -label.assign.to.load.balancer=Assigner l\\'instance au r\u00e9partiteur de charge -label.assign.vms=Assigner VMs -label.associated.network.id=ID du r\u00e9seau associ\u00e9 -label.associated.network=R\u00e9seau associ\u00e9 -label.associated.profile=Profil associ\u00e9 -label.associate.public.ip=Associer IP Publique -label.attached.iso=Image ISO attach\u00e9e -label.author.email=Email auteur -label.author.name=Nom auteur -label.autoscale=AutoScale -label.autoscale.configuration.wizard=Assistant de configuration AutoScale -label.availability=Disponibilit\u00e9 -label.availabilityZone=availabilityZone -label.availability.zone=Zone de disponibilit\u00e9 -label.available=Disponible -label.available.public.ips=Adresses IP publiques disponibles -label.back=Retour -label.bandwidth=Bande passante -label.baremetal.dhcp.devices=\u00c9quipements DHCP Baremetal -label.baremetal.dhcp.provider=Fournisseur DHCP Baremetal -label.baremetal.pxe.device=Ajouter un PXE Baremetal -label.baremetal.pxe.devices=\u00c9quipements PXE Baremetal -label.baremetal.pxe.provider=Fournisseur PXE Baremetal -label.baremetal.rack.configuration=Configuration Rack Baremetal -label.basic=Basique -label.basic.mode=Mode basique -label.bigswitch.bcf.details=D\u00e9tails BigSwitch BCF -label.bigswitch.bcf.nat=NAT activ\u00e9 BigSwitch BCF -label.bigswitch.controller.address=Adresse du contr\u00f4leur BigSwitch Vns -label.blade.id=ID Lame -label.blades=Lames -label.bootable=Amor\u00e7able -label.broadcast.domain.range=Plage du domaine multi-diffusion -label.broadcast.domain.type=Type de domaine de multi-diffusion -label.broadcasturi=broadcasturi -label.broadcast.uri=URI multi-diffusion -label.broadcat.uri=URI multi-diffusion -label.brocade.vcs.address=Adress Vcs Switch -label.brocade.vcs.details=D\u00e9tails Switch Brocade Vcs -label.by.account=Par compte -label.by.alert.type=Par type d\\'alerte -label.by.availability=Par disponibilit\u00e9 -label.by.date.end=Par date (fin) -label.by.date.start=Par date (d\u00e9but) -label.by.domain=Par domaine -label.by.end.date=Par date de fin -label.by.event.type=Par type d\\'\u00e9v\u00e9nement -label.by.level=Par niveau -label.by.pod=Par Pod -label.by.role=Par r\u00f4le -label.by.start.date=Par date de d\u00e9but -label.by.state=Par \u00e9tat -label.bytes.received=Octets re\u00e7us -label.bytes.sent=Octets envoy\u00e9s -label.by.traffic.type=Par type de trafic -label.by.type.id=Par type d\\'ID -label.by.type=Par type -label.by.zone=Par zone -label.cache.mode=Type Write-cache -label.cancel=Annuler -label.capacity.bytes=Capacit\u00e9 Octets -label.capacity=Capacit\u00e9 -label.capacity.iops=Capacit\u00e9 IOPS -label.certificate=Certificat -label.change.affinity=Changer Affinit\u00e9 -label.change.ipaddress=Changer adresse IP pour NIC -label.change.service.offering=Modifier Offre Service -label.change.value=Modifier la valeur -label.character=Caract\u00e8re -label.chassis=Ch\u00e2ssis -label.checksum=checksum -label.cidr.account=CIDR ou Compte/Groupe de s\u00e9curit\u00e9 -label.cidr=CIDR -label.cidr.list=CIDR Source -label.CIDR.list=Liste CIDR -label.CIDR.of.destination.network=CIDR du r\u00e9seau de destination -label.cisco.nexus1000v.ip.address=Adresse IP Nexus 1000v -label.cisco.nexus1000v.password=Mot de passe Nexus 1000v -label.cisco.nexus1000v.username=Identifiant Nexus 1000v -label.ciscovnmc.resource.details=D\u00e9tails ressource CiscoVNMC -label.clean.up=Nettoyage -label.clear.list=Purger la liste -label.close=Fermer -label.cloud.console=Console d\\'Administration du Cloud -label.cloud.managed=G\u00e9r\u00e9 par Cloud.com -label.cluster=Cluster -label.cluster.name=Nom du cluster -label.clusters=Clusters -label.cluster.type=Type de Cluster -label.clvm=CLVM -label.code=Code -label.community=Communaut\u00e9 -label.compute.and.storage=Calcul et Stockage -label.compute.offering=Offre de calcul -label.compute.offerings=Offres de Calcul -label.compute=Processeur -label.configuration=Configuration -label.configure=Configurer -label.configure.ldap=Configurer LDAP -label.configure.network.ACLs=Configurer les r\u00e8gles d\\'acc\u00e8s r\u00e9seau ACL -label.configure.sticky.policy=Configurer Strat\u00e9gie Sticky -label.configure.vpc=Configurer le VPC -label.confirmation=Confirmation -label.confirm.password=Confirmer le mot de passe -label.congratulations=F\u00e9licitations \! -label.conserve.mode=Conserver le mode -label.console.proxy=Console proxy -label.console.proxy.vm=VM Console Proxy -label.continue.basic.install=Continuer avec l\\'installation basique -label.continue=Continuer -label.copying.iso=Copie ISO -label.corrections.saved=Modifications enregistr\u00e9es -label.counter=Compteur -label.cpu.allocated=CPU allou\u00e9e -label.cpu.allocated.for.VMs=CPU allou\u00e9e aux VMs -label.CPU.cap=Limitation CPU -label.cpu=CPU -label.cpu.limits=Limites CPU -label.cpu.mhz=CPU (en MHz) -label.cpu.utilized=CPU utilis\u00e9e -label.created.by.system=Cr\u00e9\u00e9 par le syst\u00e8me -label.created=Cr\u00e9\u00e9 -label.create.nfs.secondary.staging.storage=Cr\u00e9er le Stockage Secondaire Interm\u00e9diaire NFS -label.create.nfs.secondary.staging.store=Cr\u00e9er le stockage secondaire interm\u00e9diaire NFS -label.create.project=Cr\u00e9er un projet -label.create.ssh.key.pair=Cr\u00e9er une bi-cl\u00e9 SSH -label.create.template=Cr\u00e9er un mod\u00e8le -label.create.VPN.connection=Cr\u00e9er une connexion VPN -label.cross.zones=Multi Zones -label.custom.disk.iops=IOPS personnalis\u00e9 -label.custom.disk.offering=Offre de disque personnalis\u00e9e -label.custom.disk.size=Personalisable -label.custom=Personnalis\u00e9 -label.daily=Quotidien -label.data.disk.offering=Offre de disque de donn\u00e9es -label.date=Date -label.day=Jour -label.day.of.month=Jour du mois -label.day.of.week=Jour de la semaine -label.dc.name=Nom DC -label.dead.peer.detection=D\u00e9tection de pair mort -label.decline.invitation=Refuser l\\'invitation -label.dedicate.cluster=D\u00e9dier Cluster -label.dedicated=D\u00e9di\u00e9 -label.dedicate=D\u00e9dier -label.dedicated.vlan.vni.ranges=Plages VLAN/VNI d\u00e9di\u00e9es -label.dedicate.host=D\u00e9dier H\u00f4te -label.dedicate.pod=D\u00e9dier Pod -label.dedicate.vlan.vni.range=Plage VLAN/VNI d\u00e9di\u00e9e -label.dedicate.zone=D\u00e9dier Zone -label.default.egress.policy=Politique Egress par d\u00e9faut -label.default=Par d\u00e9faut -label.default.use=Utilisation par d\u00e9faut -label.default.view=Vue par d\u00e9faut -label.delete.acl.list=Supprimer Liste ACL -label.delete.affinity.group=Supprimer le groupe d\\'affinit\u00e9 -label.delete.alerts=Supprimer alertes -label.delete.baremetal.rack.configuration=Supprimer Configuration Rack Baremetal -label.delete.BigSwitchBcf=Supprimer contr\u00f4leur BigSwitch BCF -label.delete.BrocadeVcs=Supprimer Brocade Vcs Switch -label.delete.ciscoASA1000v=Supprimer CiscoASA1000v -label.delete.ciscovnmc.resource=Supprimer ressource CiscoVNMC -label.delete.events=Supprimer \u00e9v\u00e9nements -label.delete.F5=Supprimer F5 -label.delete.gateway=Supprimer la passerelle -label.delete.internal.lb=Supprimer LB interne -label.delete.NetScaler=Supprimer Netscaler -label.delete.NiciraNvp=Supprimer un contr\u00f4leur Nvp -label.delete.NuageVsp=Supprimer Nuage VSD -label.delete.OpenDaylight.device=Supprimer contr\u00f4leur OpenDaylight -label.delete.PA=Supprimer Palo Alto -label.delete.portable.ip.range=Supprimer Plage IP portable -label.delete.profile=Supprimer Profil -label.delete.project=Supprimer projet -label.delete.role=Supprimer R\u00f4le -label.delete.secondary.staging.store=Supprimer Stockage Secondaire Interm\u00e9diaire -label.delete.SRX=Supprimer SRX -label.delete=Supprimer -label.delete.ucs.manager=Supprimer Gestionnaire UCS -label.delete.VPN.connection=Supprimer la connexion VPN -label.delete.VPN.customer.gateway=Supprimer la passerelle VPN client -label.delete.VPN.gateway=Supprimer la passerelle VPN -label.delete.vpn.user=Supprimer l\\'utilisateur VPN -label.deleting.failed=Suppression \u00e9chou\u00e9e -label.deleting.processing=Suppression... -label.deny=Interdire -label.deployment.planner=Planning d\u00e9ploiement -label.description=Description -label.destination.physical.network.id=Identifiant du r\u00e9seau physique de destination -label.destination.zone=Zone de destination -label.destroy=D\u00e9truire -label.destroy.router=Supprimer le routeur -label.destroy.vm.graceperiod=D\u00e9truire P\u00e9riode de gr\u00e2ce VM -label.detaching.disk=D\u00e9tacher le disque -label.details=D\u00e9tails -label.device.id=ID du p\u00e9riph\u00e9rique -label.devices=Machines -label.dhcp=DHCP -label.DHCP.server.type=Serveur DHCP -label.direct.attached.public.ip=IP publique attach\u00e9e directement -label.direct.ips=Adresses IP du r\u00e9seau partag\u00e9 -label.disable.autoscale=D\u00e9sactiver Autoscale -label.disabled=D\u00e9sactiv\u00e9 -label.disable.host=D\u00e9sactiver H\u00f4te -label.disable.network.offering=D\u00e9sactiver Offre de r\u00e9seau -label.disable.provider=D\u00e9sactiver ce fournisseur -label.disable.vnmc.provider=D\u00e9sactiver fournisseur VNMC -label.disable.vpc.offering=D\u00e9sactiver offre VPC -label.disable.vpn=D\u00e9sactiver le VPN -label.disabling.vpn.access=D\u00e9sactiver l\\'acc\u00e8s VPN -label.disassociate.profile.blade=D\u00e9-associer le Profil de la Lame -label.disbale.vnmc.device=D\u00e9sactiver VNMC -label.disk.allocated=Disque Allou\u00e9 -label.disk.bytes.read.rate=D\u00e9bit lecture disque (BPS) -label.disk.bytes.write.rate=D\u00e9bit \u00e9criture disque (BPS) -label.disk.iops.max=IOPS maximum -label.disk.iops.min=IOPS minimum -label.disk.iops.read.rate=D\u00e9bit lecture disque (IOPS) -label.disk.iops.total=IOPS Total -label.disk.iops.write.rate=D\u00e9bit \u00e9criture disque (IOPS) -label.disk.offering.details=D\u00e9tails offre de disque -label.diskoffering=diskoffering -label.disk.offering=Offre de Disque -label.disk.provisioningtype=Type de provisionnement -label.disk.read.bytes=Lecture Disque (Octets) -label.disk.read.io=Lecture Disque (IO) -label.disk.size=Capacit\u00e9 disque -label.disk.size.gb=Capacit\u00e9 disque (Go) -label.disk.total=Espace disque total -label.disk.volume=Volume disque -label.disk.write.bytes=\u00c9criture Disque (Octets) -label.disk.write.io=\u00c9criture Disque (IO) -label.display.name=Nom d\\'affichage -label.display.text=Texte affich\u00e9 -label.distributedrouter=Routeur Distribu\u00e9 -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=Domaine DNS pour les r\u00e9seaux invit\u00e9s -label.domain.admin=Administrateur du domaine -label.domain.details=D\u00e9tails domaine -label.domain=Domaine -label.domain.id=ID du domaine -label.domain.lower=domaine -label.domain.name=Nom de domaine -label.domain.router=Routeur du domaine -label.domain.suffix=Suffixe de domaine DNS (i.e., xyz.com) -label.done=Termin\u00e9 -label.double.quotes.are.not.allowed=Les guillemets ne sont pas autoris\u00e9es -label.download.progress=Progression du t\u00e9l\u00e9chargement -label.drag.new.position=D\u00e9placer sur une autre position -label.duration.in.sec=Dur\u00e9e (en sec) -label.dynamically.scalable=Dimensionnement dynamique -label.edit.acl.rule=Modifier r\u00e8gle ACL -label.edit.affinity.group=Modifier le groupe d\\'affinit\u00e9 -label.edit.lb.rule=Modifier la r\u00e8gle LB -label.edit=Modifier -label.edit.network.details=Modifier les param\u00e8tres r\u00e9seau -label.edit.project.details=Modifier les d\u00e9tails du projet -label.edit.region=\u00c9diter R\u00e9gion -label.edit.role=\u00c9diter R\u00f4le -label.edit.rule=Modifier r\u00e8gle -label.edit.secondary.ips=\u00c9diter IPs secondaires -label.edit.tags=Modifier les balises -label.edit.traffic.type=Modifier le type de trafic -label.edit.vpc=Modifier le VPC -label.egress.default.policy=Politique par d\u00e9faut Egress -label.egress.rule=R\u00e8gle sortante -label.egress.rules=R\u00e8gles de sortie -label.elastic.IP=IP extensible -label.elastic.LB=R\u00e9partition de charge extensible -label.elastic=\u00c9lastique -label.email=Email -label.email.lower=email -label.enable.autoscale=Activer Autoscale -label.enable.host=Activer H\u00f4te -label.enable.network.offering=Activer Offre de r\u00e9seau -label.enable.provider=Activer le fournisseur -label.enable.s3=Activer le stockage secondaire de type S3 -label.enable.swift=Activer Swift -label.enable.vnmc.device=Activer VNMC -label.enable.vnmc.provider=Activer fournisseur VNMC -label.enable.vpc.offering=Activer offre VPC -label.enable.vpn=Activer VPN -label.enabling.vpn.access=Activation de l\\'acc\u00e8s VPN -label.enabling.vpn=Activation du VPN -label.end.IP=IP fin plage -label.endpoint.or.operation=Terminaison ou Op\u00e9ration -label.endpoint=Terminaison -label.end.port=Port de fin -label.end.reserved.system.IP=Adresse IP de fin r\u00e9serv\u00e9e Syst\u00e8me -label.end.vlan=Fin VLAN -label.end.vxlan=Fin VXLAN -label.enter.token=Entrez le jeton unique -label.error.code=Code d\\'erreur -label.error=Erreur -label.error.upper=ERROR -label.ESP.encryption=Chiffrement ESP -label.ESP.hash=Empreinte ESP -label.ESP.lifetime=Dur\u00e9e de vie ESP (secondes) -label.ESP.policy=Mode ESP -label.esx.host=H\u00f4te ESX/ESXi -label.event.archived=\u00c9v\u00e9nement archiv\u00e9 -label.event.deleted=\u00c9v\u00e9nement supprim\u00e9 -label.event=\u00c9v\u00e9nement -label.every=Tous -label.example=Exemple -label.expunge=Purger -label.external.link=Lien externe -label.extractable.lower=T\u00e9l\u00e9chargeable -label.extractable=T\u00e9l\u00e9chargeable -label.f5.details=D\u00e9tails F5 -label.f5=F5 -label.failed=\u00c9chou\u00e9 -label.featured=Sponsoris\u00e9 -label.fetch.latest=Rafra\u00eechir -label.filterBy=Filtre -label.fingerprint=Empreinte -label.firewall=Pare-feu -label.firstname.lower=pr\u00e9nom -label.first.name=Pr\u00e9nom -label.format=Format -label.format.lower=format -label.friday=Vendredi -label.full=Complet -label.full.path=Chemin complet -label.gateway=Passerelle -label.general.alerts=Alertes g\u00e9n\u00e9rales -label.generating.url=G\u00e9n\u00e9ration de l\\'URL -label.globo.dns.configuration=Configuration GloboDNS -label.globo.dns=GloboDNS -label.gluster.volume=Volume -label.go.step.2=Aller \u00e0 l\\'\u00e9tape 2 -label.go.step.3=Aller \u00e0 l\\'\u00e9tape 3 -label.go.step.4=Aller \u00e0 l\\'\u00e9tape 4 -label.go.step.5=Aller \u00e0 l\\'\u00e9tape 5 -label.gpu=GPU -label.group.by.account=Regrouper par compte -label.group.by.cluster=Regrouper par cluster -label.group.by.pod=Regrouper par pod -label.group.by.zone=Regrouper par zone -label.group=Groupe -label.group.optional=Groupe (optionnel) -label.gslb.assigned.lb.more=Assigner plus de r\u00e9partition de charge -label.gslb.assigned.lb=R\u00e9partition de charge assign\u00e9e -label.gslb.delete=Supprimer GSLB -label.gslb.details=D\u00e9tails GSLB -label.gslb.domain.name=Nom de domaine GSLB -label.gslb=GSLB -label.gslb.lb.details=D\u00e9tails r\u00e9partition de charge -label.gslb.lb.remove=Supprimer r\u00e9partition de charge depuis ce GSLB -label.gslb.lb.rule=R\u00e8gle de r\u00e9partition de charge -label.gslb.service.private.ip=IP priv\u00e9e service GSLB -label.gslb.service.public.ip=IP publique service GSLB -label.gslb.service=Service GSLB -label.gslb.servicetype=Type service -label.guest.cidr=CIDR invit\u00e9 -label.guest.end.ip=Adresse IP de fin pour les invit\u00e9s -label.guest.gateway=Passerelle pour les invit\u00e9s -label.guest=Invit\u00e9 -label.guest.ip=Adresse IP des invit\u00e9s -label.guest.ip.range=Plage d\\'adresses IP des invit\u00e9s -label.guest.netmask=Masque de r\u00e9seau des invit\u00e9s -label.guest.network.details=D\u00e9tails r\u00e9seau invit\u00e9 -label.guest.networks=R\u00e9seaux d\\'invit\u00e9 -label.guest.start.ip=Adresse IP de d\u00e9but pour les invit\u00e9s -label.guest.traffic=Trafic invit\u00e9 -label.guest.traffic.vswitch.name=Nom Trafic Invit\u00e9 vSwitch -label.guest.traffic.vswitch.type=Type Trafic Invit\u00e9 vSwitch -label.guest.type=Type d\\'invit\u00e9 -label.ha.enabled=Haute disponibilit\u00e9 activ\u00e9e -label.health.check.advanced.options=Options avanc\u00e9es \: -label.health.check.configurations.options=Options de configuration \: -label.health.check.interval.in.sec=Fr\u00e9quence de v\u00e9rification d\\'\u00e9tat (sec) -label.health.check.message.desc=Votre r\u00e9partiteur de charge va automatiquement effectuer des v\u00e9rifications d\\'\u00e9tat sur vos instances CloudStack et router seulement le trafic vers les instances ayant pass\u00e9es les v\u00e9rifications avec succ\u00e8s -label.health.check=V\u00e9rification statut -label.health.check.wizard=Assistant V\u00e9rification Sant\u00e9 -label.healthy.threshold=Seuil d\\'\u00e9tat -label.help=Aide -label.hide.ingress.rule=Cacher la r\u00e8gle d\\'entr\u00e9e -label.hints=Astuces -label.home=Accueil -label.host.alerts=H\u00f4tes en \u00e9tat d\\'Alerte -label.host=H\u00f4te -label.host.MAC=Adresse MAC h\u00f4te -label.host.name=Nom d\\'h\u00f4te -label.hosts=H\u00f4tes -label.host.tag=Etiquette h\u00f4te -label.host.tags=\u00c9tiquettes d\\'h\u00f4te -label.hourly=Chaque heure -label.hvm=HVM -label.hypervisor.capabilities=Fonctions hyperviseur -label.hypervisor=Hyperviseur -label.hypervisors=Hyperviseurs -label.hypervisor.snapshot.reserve=R\u00e9serve d\\'instantan\u00e9e de l\\'Hyperviseur -label.hypervisor.type=Type d\\'hyperviseur -label.hypervisor.version=Version hyperviseur -label.hyperv.traffic.label=Libell\u00e9 trafic HyperV -label.id=ID -label.IKE.DH=DH IKE -label.IKE.encryption=Chiffrement IKE -label.IKE.hash=Empreinte IKE -label.IKE.lifetime=Dur\u00e9e de vie IKE (secondes) -label.IKE.policy=Mode IKE -label.info=Information -label.info.upper=INFO -label.ingress.rule=R\u00e8gle d\\'entr\u00e9e -label.initiated.by=Initi\u00e9 par -label.inside.port.profile=Profil Port entrant -label.installWizard.addClusterIntro.subtitle=Qu\\'est ce qu\\'un cluster ? -label.installWizard.addClusterIntro.title=Ajoutons un cluster -label.installWizard.addHostIntro.subtitle=Qu\\'est ce qu\\'un h\u00f4te ? -label.installWizard.addHostIntro.title=Ajoutons un h\u00f4te -label.installWizard.addPodIntro.subtitle=Qu\\'est ce qu\\'un pod ? -label.installWizard.addPodIntro.title=Ajoutons un pod -label.installWizard.addPrimaryStorageIntro.subtitle=Qu\\'est ce que le stockage primaire ? -label.installWizard.addPrimaryStorageIntro.title=Ajoutons du stockage primaire -label.installWizard.addSecondaryStorageIntro.subtitle=Qu\\'est ce que le stockage secondaire ? -label.installWizard.addSecondaryStorageIntro.title=Ajoutons du stockage secondaire -label.installWizard.addZoneIntro.subtitle=Qu\\'est ce qu\\'une zone ? -label.installWizard.addZoneIntro.title=Ajoutons une zone -label.installWizard.addZone.title=Ajouter une zone -label.installWizard.click.launch=Appuyer sur le bouton d\u00e9marrer. -label.installWizard.subtitle=Ce tutoriel vous aidera \u00e0 configurer votre installation CloudStack&\#8482; -label.installWizard.title=Bonjour et bienvenue dans CloudStack&\#8482; -label.instance=Instance -label.instance.limits=Limites des instances -label.instance.name=Nom de l\\'instance -label.instance.port=Port Instance -label.instance.scaled.up=Instance agrandie -label.instances=Instances -label.instanciate.template.associate.profile.blade=Instancier Mod\u00e8le et Profil associ\u00e9 \u00e0 la Lame -label.intermediate.certificate=Certificat interm\u00e9diaire {0} -label.internal.dns.1=DNS interne 1 -label.internal.dns.2=DNS interne 2 -label.internal.lb.details=D\u00e9tails du LB interne -label.internal.lb=R\u00e9partiteur interne -label.internallbvm=InternalLbVm -label.internal.name=Nom interne -label.interval.type=Type d\\'intervalle -label.introduction.to.cloudstack=Introduction \u00e0 CloudStack&\#8482; -label.invalid.integer=Nombre entier invalide -label.invalid.number=Nombre invalide -label.invitations=Invitations -label.invited.accounts=Comptes invit\u00e9s -label.invite=Inviter -label.invite.to=Inviter sur -label.ip.address=Adresse IP -label.ipaddress=Adresse IP -label.ip.allocations=Allocations de IPs -label.ip=IP -label.ip.limits=Limite de IPs publiques -label.ip.or.fqdn=IP ou FQDN -label.ip.range=Plage IP -label.ip.ranges=Plages IP -label.ips=Adresse IP -label.IPsec.preshared.key=Cl\u00e9 partag\u00e9e IPsec -label.ipv4.cidr=CIDR IPv4 -label.ipv4.dns1=DNS1 IPv4 -label.ipv4.dns2=DNS2 IPv4 -label.ipv4.end.ip=IP fin IPv4 -label.ipv4.gateway=Passerelle IPv4 -label.ipv4.netmask=Masque de r\u00e9seau IPv4 -label.ipv4.start.ip=IP d\u00e9but IPv4 -label.ipv6.address=Adresse IPv6 -label.ipv6.CIDR=CIDR IPv6 -label.ipv6.dns1=DNS1 IPv6 -label.ipv6.dns2=DNS2 IPv6 -label.ipv6.end.ip=IP fin IPv6 -label.ipv6.gateway=Passerelle IPv6 -label.ipv6.start.ip=IP d\u00e9but IPv6 -label.iscsi=iSCSI -label.is.default=Est par d\u00e9faut -label.iso.boot=D\u00e9marrage par ISO -label.iso=ISO -label.isolated.networks=R\u00e9seaux isol\u00e9s -label.isolation.method=Isolation -label.isolation.mode=Mode d\\'isolation -label.isolation.uri=URI d\\'isolation -label.is.redundant.router=Redondant -label.is.shared=Est partag\u00e9 -label.is.system=Est Syst\u00e8me -label.item.listing=Liste des \u00e9l\u00e9ments -label.japanese.keyboard=Clavier japonais -label.keep.colon=Conserver \: -label.keep=Conserver -label.keyboard.language=Langage clavier -label.keyboard.type=Type de clavier -label.key=Clef -label.kvm.traffic.label=Libell\u00e9 trafic KVM -label.label=Libell\u00e9 -label.lang.arabic=Arabe -label.lang.brportugese=Portuguais Br\u00e9sil -label.lang.catalan=Catalan -label.lang.chinese=Chinois (simplifi\u00e9) -label.lang.dutch=N\u00e9erlandais -label.lang.english=Anglais -label.lang.french=Fran\u00e7ais -label.lang.german=Allemand -label.lang.hungarian=Hongrois -label.lang.italian=Italien -label.lang.japanese=Japonais -label.lang.korean=Cor\u00e9en -label.lang.norwegian=Norv\u00e9gien -label.lang.polish=Polonais -label.lang.russian=Russe -label.lang.spanish=Espagnol -label.last.disconnected=Derni\u00e8re D\u00e9connexion -label.lastname.lower=nom -label.last.name=Nom -label.latest.events=Derniers \u00e9v\u00e9nements -label.launch=D\u00e9marrer -label.launch.vm=D\u00e9marrer VM -label.launch.zone=D\u00e9marrer la zone -label.lb.algorithm.leastconn=Le moins de connexions -label.lb.algorithm.roundrobin=Cyclique -label.lb.algorithm.source=Origine -label.LB.isolation=R\u00e9partition de charge isol\u00e9e -label.ldap.configuration=Configuration LDAP -label.ldap.group.name=Groupe LDAP -label.ldap.link.type=Type -label.ldap.port=Port LDAP -label.level=Niveau -label.link.domain.to.ldap=Lien Domaine vers LDAP -label.linklocal.ip=Adresse IP lien local -label.load.balancer=R\u00e9partiteur de charge -label.load.balancer.type=Type R\u00e9partiteur de charge -label.load.balancing.policies=R\u00e8gles de r\u00e9partition de charge -label.load.balancing=R\u00e9partition de charge -label.loading=Chargement en cours -label.local.file=Fichier local -label.local=Local -label.local.storage.enabled=Activer le stockage local pour les VMs Utilisateurs -label.local.storage.enabled.system.vms=Activer le stockage local pour les VMs Syst\u00e8mes -label.local.storage=Stockage local -label.login=Connexion -label.logout=D\u00e9connexion -label.lun=LUN -label.LUN.number=N\u00b0 LUN -label.lxc.traffic.label=Libell\u00e9 trafic LXC -label.make.project.owner=Devenir propri\u00e9taire du projet -label.make.redundant=Rendre redondant -label.managed=G\u00e9r\u00e9 -label.manage=G\u00e9r\u00e9 -label.management=Administration -label.management.ips=Adresses IP de gestion -label.management.server=Serveur de gestion -label.manage.resources=G\u00e9rer les ressources -label.max.cpus=Nombre coeurs CPU max. -label.max.guest.limit=Nombre maximum d\\'invit\u00e9s -label.maximum=Maximum -label.max.instances=Instance Max. -label.max.memory=M\u00e9moire max. (Mo) -label.max.networks=R\u00e9seaux Max. -label.max.primary.storage=Principal max. (Go) -label.max.public.ips=Max. IP publiques -label.max.secondary.storage=Secondaire max. (Go) -label.max.snapshots=Max instantan\u00e9es -label.max.templates=Max. mod\u00e8les -label.max.vms=Max. VMs utilisateur -label.max.volumes=Max. volumes -label.max.vpcs=Max. VPCs -label.may.continue=Vous pouvez continuer. -label.md5.checksum=Empreinte MD5 -label.memory.allocated=M\u00e9moire allou\u00e9e -label.memory.limits=Limites m\u00e9moire (Mo) -label.memory.mb=M\u00e9moire (en MB) -label.memory=M\u00e9moire (en Mo) -label.memory.total=M\u00e9moire totale -label.memory.used=M\u00e9moire utilis\u00e9e -label.menu.accounts=Comptes -label.menu.alerts=Alertes -label.menu.all.accounts=Tous les comptes -label.menu.all.instances=Toutes les instances -label.menu.community.isos=ISO de la communaut\u00e9 -label.menu.community.templates=Mod\u00e8les de la communaut\u00e9 -label.menu.configuration=Configuration -label.menu.dashboard=Tableau de bord -label.menu.destroyed.instances=Instances d\u00e9truites -label.menu.disk.offerings=Offres de Disque -label.menu.domains=Domaines -label.menu.events=\u00c9v\u00e9nements -label.menu.featured.isos=ISOs Sponsoris\u00e9es -label.menu.featured.templates=Mod\u00e8les sponsoris\u00e9s -label.menu.global.settings=Param\u00e8tres globaux -label.menu.infrastructure=Infrastructure -label.menu.instances=Instances -label.menu.ipaddresses=Adresses IP -label.menu.isos=ISOs -label.menu.my.accounts=Mes comptes -label.menu.my.instances=Mes instances -label.menu.my.isos=Mes ISOs -label.menu.my.templates=Mes mod\u00e8les -label.menu.network.offerings=Offres de R\u00e9seau -label.menu.network=R\u00e9seau -label.menu.physical.resources=Ressources physiques -label.menu.regions=R\u00e9gions -label.menu.running.instances=Instances actives -label.menu.security.groups=Groupes de s\u00e9curit\u00e9 -label.menu.service.offerings=Offres de Service -label.menu.snapshots=Instantan\u00e9s -label.menu.sshkeypair=Bi-cl\u00e9 SSH -label.menu.stopped.instances=Instances Arr\u00eat\u00e9es -label.menu.storage=Stockage -label.menu.system.service.offerings=Offres de Syst\u00e8me -label.menu.system=Syst\u00e8me -label.menu.system.vms=\ VMs Syst\u00e8mes -label.menu.templates=Mod\u00e8les -label.menu.virtual.appliances=Appliances Virtuelles -label.menu.virtual.resources=Ressources Virtuelles -label.menu.volumes=Volumes -label.menu.vpc.offerings=Offres de VPC -label.metrics.allocated=Allou\u00e9 -label.metrics.clusters=Clusters -label.metrics.cpu.allocated=Allocation CPU -label.metrics.cpu.max.dev=\u00c9cart -label.metrics.cpu.total=Total -label.metrics.cpu.usage=Util. CPU -label.metrics.cpu.used.avg=Utilis\u00e9 -label.metrics.disk.allocated=Allou\u00e9 -label.metrics.disk=Disque -label.metrics.disk.iops.total=IOPS -label.metrics.disk.read=Lecture -label.metrics.disk.size=Capacit\u00e9 -label.metrics.disk.storagetype=Type -label.metrics.disk.total=Total -label.metrics.disk.unallocated=Non allou\u00e9 -label.metrics.disk.usage=Util. Disque -label.metrics.disk.used=Utilis\u00e9 -label.metrics.disk.write=\u00c9criture -label.metrics.hosts=H\u00f4tes -label.metrics.memory.allocated=Allocation M\u00e9m. -label.metrics.memory.max.dev=\u00c9cart -label.metrics.memory.total=Total -label.metrics.memory.usage=Util. M\u00e9m. -label.metrics.memory.used.avg=Utilis\u00e9 -label.metrics=M\u00e9triques -label.metrics.name=Nom -label.metrics.network.read=Lecture -label.metrics.network.usage=Util. R\u00e9seau -label.metrics.network.write=\u00c9criture -label.metrics.num.cpu.cores=Cores -label.metrics.outofbandmanagementpowerstate=Status Alimentation -label.metrics.property=Propri\u00e9t\u00e9 -label.metrics.scope=Port\u00e9e -label.metrics.state=\u00c9tat -label.metrics.storagepool=Pool de stockage -label.metrics.vm.name=Nom VM -label.migrate.instance.to.host=Migration de l\\'instance sur un autre h\u00f4te -label.migrate.instance.to=Migrer l\\'instance vers -label.migrate.instance.to.ps=Migration de l\\'instance sur un autre stockage primaire -label.migrate.lb.vm=Migrer LB VM -label.migrate.router.to=Migrer le routeur vers -label.migrate.systemvm.to=Migrer la VM syst\u00e8me vers -label.migrate.to.host=Migrer vers un h\u00f4te -label.migrate.to.storage=Migrer vers un stockage -label.migrate.volume.to.primary.storage=Migration du volume vers un autre stockage primaire -label.migrate.volume=Volume Migr\u00e9 -label.minimum=Minimum -label.min.instances=Instances Min. -label.min.past.the.hr=min ap. l\\'heure -label.minute.past.hour=minute(s) apr\u00e8s l\\'heure -label.minutes.past.hour=minute(s) apr\u00e8s l\\'heure -label.mode=Mode -label.monday=Lundi -label.monthly=Mensuel -label.more.templates=Plus de mod\u00e8les -label.move.down.row=Descendre d\\'un niveau -label.move.to.bottom=D\u00e9placer en bas -label.move.to.top=Placer au dessus -label.move.up.row=Monter d\\'un niveau -label.my.account=Mon compte -label.my.network=Mon r\u00e9seau -label.my.templates=Mes mod\u00e8les -label.name.lower=name -label.name=Nom -label.name.optional=Nom (optionnel) -label.na=N/A -label.nat.port.range=Plage de port NAT -label.netmask=Masque de r\u00e9seau -label.netscaler.details=D\u00e9tails NetScaler -label.netScaler=NetScaler -label.network.ACL=R\u00e8gles d\\'acc\u00e8s r\u00e9seau ACL -label.network.ACLs=R\u00e8gles d\\'acc\u00e8s r\u00e9seau -label.network.ACL.total=Total R\u00e8gles d\\'acc\u00e8s r\u00e9seau -label.network.addVM=Ajouter r\u00e9seau \u00e0 la VM -label.network.cidr=CIDR r\u00e9seau -label.network.desc=Description r\u00e9seau -label.network.details=D\u00e9tails r\u00e9seau -label.network.device.type=Type d\\'\u00e9quipement r\u00e9seau -label.network.device=\u00c9quipement R\u00e9seau -label.network.domain=Nom de domaine -label.network.domain.text=Domaine r\u00e9seau -label.network.id=ID r\u00e9seau -label.networking.and.security=R\u00e9seau et s\u00e9curit\u00e9 -label.network.label.display.for.blank.value=Utiliser la passerelle par d\u00e9faut -label.network.limits=Limites r\u00e9seau -label.network.name=Nom du r\u00e9seau -label.network.offering.details=D\u00e9tails offre de r\u00e9seau -label.network.offering.display.text=Texte affich\u00e9 Offre R\u00e9seau -label.network.offering.id=ID Offre R\u00e9seau -label.network.offering.name=Nom Offre R\u00e9seau -label.network.offering=Offre de R\u00e9seau -label.network.rate=D\u00e9bit R\u00e9seau -label.network.rate.megabytes=D\u00e9bit r\u00e9seau (Mo/s) -label.network.read=Lecture r\u00e9seau -label.network=R\u00e9seau -label.network.service.providers=Fournisseurs de service r\u00e9seau -label.networks=R\u00e9seaux -label.network.type=Type de r\u00e9seau -label.network.write=\u00c9criture r\u00e9seau -label.new=Nouveau -label.new.password=Nouveau mot de passe -label.new.project=Nouveau projet -label.new.ssh.key.pair=Nouvelle bi-cl\u00e9 SSH -label.new.vm=Nouvelle VM -label.next=Suivant -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=Serveur NFS -label.nfs.storage=Stockage NFS -label.nic.adapter.type=Type de carte r\u00e9seau -label.nicira.controller.address=Adresse du contr\u00f4leur -label.nicira.l2gatewayserviceuuid=Uuid du service passerelle L2 -label.nicira.l3gatewayserviceuuid=Uuid du service passerelle L3 -label.nicira.nvp.details=D\u00e9tails Nicira NVP -label.nicira.transportzoneuuid=Uuid de la Zone Transport -label.nics=Cartes NIC -label.no.actions=Aucune action disponible -label.no.alerts=Aucune alerte r\u00e9cente -label.no.data=Aucune donn\u00e9e -label.no.errors=Aucune erreur r\u00e9cente -label.no.grouping=(pas de groupement) -label.no.isos=Aucun ISOs disponible -label.no.items=Aucun \u00e9l\u00e9ment disponible -label.none=Aucun -label.no=Non -label.no.security.groups=Aucun groupe de s\u00e9curit\u00e9 disponible -label.not.found=Introuvable -label.no.thanks=Non merci -label.notifications=Messages -label.number.of.clusters=Nombre de clusters -label.number.of.cpu.sockets=Le nombre de sockets CPU -label.number.of.hosts=Nombre d\\'H\u00f4tes -label.number.of.pods=Nombre de Pods -label.number.of.system.vms=Nombre de VM Syst\u00e8me -label.number.of.virtual.routers=Nombre de routeurs virtuels -label.number.of.zones=Nombre de zones -label.num.cpu.cores=Nombre de c\u0153urs -label.numretries=Nombre de tentatives -label.ocfs2=OCFS2 -label.offer.ha=Offrir la haute disponibilit\u00e9 -label.of.month=du mois -label.ok=OK -label.opendaylight.controller=Contr\u00f4leur OpenDaylight -label.opendaylight.controllerdetail=D\u00e9tails Contr\u00f4leur OpenDaylight -label.opendaylight.controllers=Contr\u00f4leurs OpenDaylight -label.openDaylight=OpenDaylight -label.operator=Op\u00e9rateur -label.optional=Facultatif -label.order=Ordre -label.os.preference=Pr\u00e9f\u00e9rence OS -label.os.type=Type du OS -label.other=Autre -label.outofbandmanagement.action=Action -label.outofbandmanagement.action.issue=Probl\u00e8me dans l\\'allumage via la gestion du flux administration -label.outofbandmanagement.address=Adresse -label.outofbandmanagement.changepassword=Modifier le mot de passe du flux d\\'administration -label.outofbandmanagement.configure=Configurer la gestion du flux d\\'administration -label.outofbandmanagement.disable=D\u00e9sactiver la gestion du flux d\\'administration -label.outofbandmanagement.driver=Pilote -label.outofbandmanagement.enable=Activer la gestion du flux d\\'administration -label.outofbandmanagement=Gestion flux administration -label.outofbandmanagement.password=Mot de passe -label.outofbandmanagement.port=Port -label.outofbandmanagement.reenterpassword=Re-saisir Mot de passe -label.outofbandmanagement.username=Identifiant -label.override.guest.traffic=Remplacer Trafic-invit\u00e9 -label.override.public.traffic=Remplacer Trafic-public -label.ovm3.cluster=Cluster natif -label.ovm3.pool=Pool natif -label.ovm3.traffic.label=Libell\u00e9 trafic OVM3 -label.ovm3.vip=IP Ma\u00eetre Vip -label.ovm.traffic.label=Libell\u00e9 trafic OVM -label.ovs=OVS -label.owned.public.ips=Adresses IP Publiques d\u00e9tenues -label.owner.account=Propri\u00e9taire -label.owner.domain=Propri\u00e9taire -label.palo.alto.details=D\u00e9tails Palo Alto -label.PA.log.profile=Profil Journal Palo Alto -label.PA=Palo Alto -label.parent.domain=Parent du Domaine -label.passive=Passif -label.password.enabled=Mot de passe activ\u00e9 -label.password.lower=mot de passe -label.password=Mot de passe -label.password.reset.confirm=Le mot de passe a \u00e9t\u00e9 r\u00e9-initialiser en -label.path=Chemin -label.PA.threat.profile=Profil menace Palo Alto -label.perfect.forward.secrecy=Confidentialit\u00e9 persistante -label.permission=Autorisation -label.persistent=Persistant -label.physical.network.ID=Identifiant du r\u00e9seau physique -label.physical.network.name=Nom r\u00e9seau physique -label.physical.network=R\u00e9seau physique -label.PING.CIFS.password=Mot de passe CIFS PING -label.PING.CIFS.username=Identifiant CIFS PING -label.PING.dir=R\u00e9pertoire PING -label.ping.path=Chemin Ping -label.PING.storage.IP=IP stockage PING -label.planner.mode=Mode planification -label.please.complete.the.following.fields=Veuillez remplir les champs suivants -label.please.specify.netscaler.info=Renseigner les informations sur le Netscaler -label.please.wait=Patientez s\\'il vous plait -label.plugin.details=D\u00e9tails extension -label.plugins=Extensions -label.pod.dedicated=Pod D\u00e9di\u00e9 -label.pod.name=Nom du pod -label.pod=Pod -label.pods=Pods -label.polling.interval.sec=Intervalle d\\'appel (en sec) -label.portable.ip=IP Portable -label.portable.ip.range.details=D\u00e9tails Plages IP portables -label.portable.ip.ranges=Plages IP portables -label.portable.ips=IPs portables -label.port.forwarding.policies=R\u00e8gles de transfert de port -label.port.forwarding=Redirection de port -label.port=Port -label.port.range=Plage de ports -label.powerstate=Status Alimentation -label.PreSetup=PreSetup -label.previous=Retour -label.prev=Pr\u00e9c\u00e9dent -label.primary.allocated=Stockage primaire allou\u00e9 -label.primary.network=R\u00e9seau principal -label.primary.storage.count=Groupes de stockage primaire -label.primary.storage.limits=Limites stockage primaire (Go) -label.primary.storage=Stockages primaires -label.primary.used=Stockage primaire utilis\u00e9 -label.private.Gateway=Passerelle priv\u00e9e -label.private.interface=Interface priv\u00e9e -label.private.ip=Adresse IP Priv\u00e9e -label.private.ip.range=Plage d\\'adresses IP Priv\u00e9es -label.private.ips=Adresses IP Priv\u00e9es -label.private.key=Cl\u00e9 priv\u00e9e -label.privatekey=Cl\u00e9 priv\u00e9e PKCS\#8 -label.private.network=R\u00e9seau priv\u00e9 -label.private.port=Port priv\u00e9 -label.private.zone=Zone Priv\u00e9e -label.profile=Profil -label.project.dashboard=Tableau de bord projet -label.project.id=ID projet -label.project.invite=Inviter sur le projet -label.project.name=Nom du projet -label.project=Projet -label.projects=Projets -label.project.view=Vue projet -label.protocol.number=Num\u00e9ro Protocole -label.protocol=Protocole -label.provider=Fournisseur -label.providers=Fournisseurs -label.public.interface=Interface publique -label.public.ip=Adresse IP publique -label.public.ips=Adresses IP publiques -label.public.key=Cl\u00e9 publique -label.public.lb=R\u00e9partiteur public -label.public.load.balancer.provider=Fournisseur r\u00e9partition de charge public -label.public.network=R\u00e9seau public -label.public.port=Port public -label.public=Publique -label.public.traffic=Trafic public -label.public.traffic.vswitch.name=Nom Trafic Public vSwitch -label.public.traffic.vswitch.type=Type Trafic Public vSwitch -label.public.zone=Zone publique -label.purpose=R\u00f4le -label.Pxe.server.type=Serveur PXE -label.qos.type=Type de QoS -label.quickview=Aper\u00e7u -label.quiesce.vm=Mettre en veille VM -label.quiet.time.sec=Quiet Time (en sec) -label.quota.add.credits=Ajouter Cr\u00e9dits -label.quota.balance=Balance -label.quota.configuration=Configuration Quota -label.quota.configure=Configurer Quota -label.quota.credit=Cr\u00e9dit -label.quota.credits=Cr\u00e9dits -label.quota.date=Date -label.quota.dates=Mettre \u00e0 jour Dates -label.quota.description=Description Quota -label.quota.email.body=Corps de message -label.quota.email.lastupdated=Derni\u00e8re mise \u00e0 jour -label.quota.email.subject=Sujet -label.quota.email.template=Mod\u00e8le d\\'email -label.quota.enddate=Date fin -label.quota.endquota=Fin Quota -label.quota.enforcequota=Forcer Quota -label.quota.fullsummary=Tous les comptes -label.quota.minbalance=Balance Min. -label.quota.remove=Supprimer Quota -label.quota.startdate=Date d\u00e9but -label.quota.startquota=D\u00e9but Quota -label.quota.statement.balance=Balance Quota -label.quota.statement.bydates=Relev\u00e9 -label.quota.statement.quota=Utilisation Quota -label.quota.statement=Relev\u00e9 -label.quota.statement.tariff=Tarif Quota -label.quota.state=\u00c9tat -label.quota.summary=R\u00e9capitulatif -label.quota.tariff.edit=Modifier Tarif -label.quota.tariff.effectivedate=Date d\\'effet -label.quota.tariff=Tarif -label.quota.tariff.value=Valeur Tarif -label.quota.total=Total -label.quota.totalusage=Usage Total -label.quota.type.name=Type Usage -label.quota.type.unit=Unit\u00e9 d\\'usage -label.quota.usage=Consommation Quota -label.quota.value=Valeur Quota -label.rbd.id=Utilisateur Cephx -label.rbd.monitor=Superviseur Ceph -label.rbd.pool=Pool Ceph -label.rbd=RBD -label.rbd.secret=Secret Cephx -label.reboot=Red\u00e9marrer -label.recent.errors=Erreurs r\u00e9centes -label.recover.vm=Restaurer VM -label.redundant.router.capability=Router redondant -label.redundant.router=Routeur redondant -label.redundant.state=\u00c9tat de la redondance -label.redundant.vpc=VPC Redondant -label.refresh=Actualiser -label.refresh.blades=Rafra\u00eechir Lames -label.region.details=D\u00e9tails R\u00e9gion -label.regionlevelvpc=VPC niveau r\u00e9gion -label.region=R\u00e9gion -label.reinstall.vm=R\u00e9-installer VM -label.related=Connexes -label.release.account=Lib\u00e9rer compte -label.release.account.lowercase=lib\u00e9rer compte -label.release.dedicated.cluster=Lib\u00e9ration du cluster d\u00e9die -label.release.dedicated.host=Lib\u00e9ration de l\\'h\u00f4te d\u00e9di\u00e9 -label.release.dedicated.pod=Lib\u00e9ration du pod d\u00e9di\u00e9 -label.release.dedicated.vlan.range=Lib\u00e9rer plage VLAN d\u00e9di\u00e9e -label.release.dedicated.zone=Lib\u00e9rer la zone d\u00e9di\u00e9e -label.remind.later=Rappeler moi plus tard -label.remove.ACL=Supprimer une r\u00e8gle ACL -label.remove.egress.rule=Supprimer la r\u00e8gle sortante -label.remove.from.load.balancer=Supprimer l\\'instance du r\u00e9partiteur de charge -label.remove.ingress.rule=Supprimer la r\u00e8gle entrante -label.remove.ip.range=Supprimer la plage IP -label.remove.ldap=Supprimer LDAP -label.remove.network.offering=Supprimer Offre de r\u00e9seau -label.remove.pf=Supprimer la r\u00e8gle de transfert de port -label.remove.project.account=Supprimer le compte projet -label.remove.region=Supprimer r\u00e9gion -label.remove.rule=Supprimer la r\u00e8gle -label.remove.ssh.key.pair=Supprimer bi-cl\u00e9 SSH -label.remove.static.nat.rule=Supprimer le NAT statique -label.remove.static.route=Supprimer une route statique -label.remove.this.physical.network=Supprimer ce r\u00e9seau physique -label.remove.tier=Supprimer le tiers -label.remove.vm.from.lb=Supprimer la VM de la r\u00e8gle de r\u00e9partition de charge -label.remove.vm.load.balancer=Supprimer VM du r\u00e9partiteur de charge -label.remove.vmware.datacenter=Supprimer un datacenter VMware -label.remove.vpc.offering=Supprimer offre VPC -label.remove.vpc=Supprimer le VPC -label.removing=Suppression -label.removing.user=Retrait de l\\'utilisateur -label.reource.id=ID Ressource -label.replace.acl.list=Remplacer Liste ACL -label.replace.acl=Remplacer ACL -label.required=Requis -label.requires.upgrade=Mise \u00e0 jour n\u00e9cessaire -label.reserved.ip.range=Plage IP r\u00e9serv\u00e9e -label.reserved.system.gateway=Passerelle r\u00e9serv\u00e9e Syst\u00e8me -label.reserved.system.ip=Adresse IP Syst\u00e8me r\u00e9serv\u00e9e -label.reserved.system.netmask=Masque de sous-r\u00e9seau r\u00e9serv\u00e9 Syst\u00e8me -label.reset.ssh.key.pair.on.vm=R\u00e9-initialiser bi-cl\u00e9 sur la VM -label.reset.ssh.key.pair=R\u00e9-initialiser bi-cl\u00e9 SSH -label.resetVM=R\u00e9-initialiser VM -label.reset.VPN.connection=R\u00e9-initialiser la connexion VPN -label.resize.new.offering.id=Nouvelle Offre -label.resize.new.size=Nouvelle Taille (Go) -label.resize.shrink.ok=R\u00e9duction OK -label.resource.limit.exceeded=Limite ressource d\u00e9pass\u00e9e -label.resource.limits=Limite des ressources -label.resource.name=Nom Ressource -label.resource=Ressource -label.resources=Ressources -label.resource.state=\u00c9tat des ressources -label.response.timeout.in.sec=D\u00e9lai d\\'attente de r\u00e9ponse (sec) -label.restart.network=Red\u00e9marrage du r\u00e9seau -label.restart.required=Red\u00e9marrage n\u00e9cessaire -label.restart.vpc=Red\u00e9marrer le VPC -label.restore=Restaurer -label.retry.interval=Interval du nouvel essai -label.review=Revoir -label.revoke.project.invite=R\u00e9voquer l\\'invitation -label.role=R\u00f4le -label.roles=R\u00f4les -label.roletype=Type R\u00f4le -label.root.certificate=Certificat racine -label.root.disk.controller=Contr\u00f4leur de disque racine -label.root.disk.offering=Offre de disque racine -label.root.disk.size=Taille du disque principal (en Go) -label.router.vm.scaled.up=VM Routeur agrandi -label.routing.host=H\u00f4te de routage -label.routing=Routage -label.rule.number=Num\u00e9ro r\u00e8gle -label.rule=R\u00e8gle -label.rules=R\u00e8gles -label.running.vms=VMs actives -label.s3.access_key=Cl\u00e9 d\\'Acc\u00e8s -label.s3.bucket=Seau -label.s3.connection_timeout=D\u00e9lai d\\'expiration de connexion -label.s3.endpoint=Terminaison -label.s3.max_error_retry=Nombre d\\'essai en erreur max. -label.s3.nfs.path=Chemin NFS S3 -label.s3.nfs.server=Serveur NFS S3 -label.s3.secret_key=Cl\u00e9 priv\u00e9e -label.s3.socket_timeout=D\u00e9lai d\\'expiration de la socket -label.s3.use_https=Utiliser HTTPS -label.saml.enable=Autoriser SAML SSO -label.saml.entity=Fournisseur d\\'identit\u00e9 -label.saturday=Samedi -label.save.and.continue=Enregistrer et continuer -label.save.changes=Sauver changements -label.save=Sauvegarder -label.saving.processing=Sauvegarde en cours... -label.scaledown.policy=Strat\u00e9gie ScaleDown -label.scale.up.policy=POLITIQUE D\\'AGRANDISSEMENT -label.scaleup.policy=Strat\u00e9gie ScaleUp -label.scope=Port\u00e9e -label.search=Rechercher -label.secondary.ips=IPs secondaires -label.secondary.isolated.vlan.id=VLAN ID isol\u00e9 secondaire -label.secondary.staging.store.details=D\u00e9tails Stockage Secondaire Interm\u00e9diaire -label.secondary.staging.store=Stockage Secondaire Interm\u00e9diaire -label.secondary.storage.count=Groupes de stockage secondaire -label.secondary.storage.details=D\u00e9tails Stockage Secondaire -label.secondary.storage.limits=Limites stockage secondaire (Go) -label.secondary.storage=Stockages secondaires -label.secondary.storage.vm=VM stockage secondaire -label.secondary.used=Stockage secondaire utilis\u00e9 -label.secret.key=Cl\u00e9 priv\u00e9e -label.security.group=Groupe de s\u00e9curit\u00e9 -label.security.group.name=Nom du groupe de s\u00e9curit\u00e9 -label.security.groups.enabled=Groupes de s\u00e9curit\u00e9 Activ\u00e9s -label.security.groups=Groupes de s\u00e9curit\u00e9 -label.select.a.template=S\u00e9lectionner un mod\u00e8le -label.select.a.zone=S\u00e9lectionner une zone -label.select.instance=S\u00e9lectionner une instance -label.select.instance.to.attach.volume.to=S\u00e9lectionner l\\'instance \u00e0 laquelle rattacher ce volume -label.select.iso.or.template=S\u00e9lectionner un ISO ou un mod\u00e8le -label.select.offering=S\u00e9lectionner une offre -label.select.project=S\u00e9lectionner un projet -label.select.region=S\u00e9lectionner r\u00e9gion -label.select=S\u00e9lectionner -label.select.template=S\u00e9lectionner Mod\u00e8le -label.select.tier=S\u00e9lectionner le tiers -label.select-view=S\u00e9lectionner la vue -label.select.vm.for.static.nat=S\u00e9lectionner une VM pour le NAT statique -label.sent=Envoy\u00e9 -label.server=Serveur -label.service.capabilities=Fonctions disponibles -label.service.offering.details=D\u00e9tails offre de service -label.service.offering=Offre de Service -label.services=Services -label.service.state=\u00c9tat du service -label.session.expired=Session expir\u00e9e -label.set.default.NIC=D\u00e9finir NIC par d\u00e9faut -label.settings=Param\u00e8tres -label.setup=Configuration -label.setup.network=Configurer R\u00e9seau -label.setup.zone=Configurer Zone -label.set.up.zone.type=Configurer le type de zone -label.shared=En partage -label.SharedMountPoint=Point de montage partag\u00e9 -label.show.advanced.settings=Voir param\u00e8tres avanc\u00e9s -label.show.ingress.rule=Montrer la r\u00e8gle d\\'entr\u00e9e -label.shutdown.provider=\u00c9teindre ce fournisseur -label.simplified.chinese.keyboard=Clavier chinois simplifi\u00e9 -label.site.to.site.VPN=VPN Site-\u00e0-Site -label.size=Capacit\u00e9 -label.skip.guide=J\\'ai d\u00e9j\u00e0 utilis\u00e9 CloudStack avant, passer ce tutoriel -label.smb.domain=Domaine SMB -label.smb.password=Mot de passe SMB -label.smb.username=Identifiant SMB -label.snapshot=Instantan\u00e9 -label.snapshot.limits=Limites d\\'instantan\u00e9s -label.snapshot.name=Nom Instantan\u00e9 -label.snapshot.schedule=Configurer un instantan\u00e9 r\u00e9current -label.snapshot.s=Instantan\u00e9s -label.snapshots=Instantan\u00e9s -label.SNMP.community=Communaut\u00e9 SNMP -label.SNMP.port=Port SNMP -label.sockets=Sockets CPU -label.source.ip.address=Adresse IP source -label.source.nat=NAT Source -label.source.nat.supported=Source NAT support\u00e9 -label.source.port=Port Source -label.specify.IP.ranges=Sp\u00e9cifier des plages IP -label.specify.vlan=Pr\u00e9ciser le VLAN -label.specify.vxlan=Pr\u00e9ciser le VXLAN -label.SR.name=Nom du point de montage -label.srx.details=D\u00e9tails SRX -label.srx=SRX -label.ssh.key.pair=Bi-cl\u00e9 SSH -label.ssh.key.pair.details=D\u00e9tails bi-cl\u00e9 SSH -label.ssh.key.pairs=Bi-cl\u00e9s SSH -label.standard.us.keyboard=Clavier standard (US) -label.start.IP=IP d\u00e9but plage -label.start.lb.vm=D\u00e9marrer LB VM -label.start.port=Port de d\u00e9but -label.start.reserved.system.IP=Adresse IP de d\u00e9but r\u00e9serv\u00e9e Syst\u00e8me -label.start.vlan=D\u00e9but VLAN -label.start.vxlan=D\u00e9but VXLAN -label.state=\u00c9tat -label.static.nat.enabled=NAT statique activ\u00e9 -label.static.nat=NAT Statique -label.static.nat.to=NAT Statique vers -label.static.nat.vm.details=D\u00e9tails des NAT statique VM -label.static.routes=Routes statiques -label.statistics=Statistiques -label.status=Statut -label.step.1.title=\u00c9tape 1 \: S\u00e9lectionnez un mod\u00e8le -label.step.1=\u00c9tape 1 -label.step.2.title=\u00c9tape 2 \: Offre de Service -label.step.2=\u00c9tape 2 -label.step.3.title=\u00c9tape 3 \: S\u00e9lectionnez une offre de service -label.step.3=\u00c9tape 3 -label.step.4.title=\u00c9tape 4 \: R\u00e9seau -label.step.4=\u00c9tape 4 -label.step.5.title=\u00c9tape 5 \: V\u00e9rification -label.step.5=\u00c9tape 5 -label.stickiness=Fid\u00e9lit\u00e9 -label.stickiness.method=M\u00e9thode de fid\u00e9lit\u00e9 -label.sticky.cookie-name=Nom du cookie -label.sticky.domain=Domaine -label.sticky.expire=Expiration -label.sticky.holdtime=Temps de pause -label.sticky.indirect=Indirect -label.sticky.length=Longueur -label.sticky.mode=Mode -label.sticky.name=Nom de fid\u00e9lit\u00e9 -label.sticky.nocache=Pas de cache -label.sticky.postonly=Apr\u00e8s seulement -label.sticky.prefix=Pr\u00e9fixe -label.sticky.request-learn=Apprendre la requ\u00eate -label.sticky.tablesize=Dimension tableau -label.stop=Arr\u00eater -label.stop.lb.vm=Arr\u00eater LB VM -label.stopped.vms=VMs arr\u00eat\u00e9es -label.storage.pool=Pool de stockage -label.storage=Stockage -label.storage.tags=\u00c9tiquettes de stockage -label.storage.traffic=Trafic stockage -label.storage.type=Type de stockage -label.subdomain.access=Acc\u00e8s sous-domaine -label.submit=Envoyer -label.submitted.by=[Soumis par \: ] -label.succeeded=R\u00e9ussi -label.sunday=Dimanche -label.super.cidr.for.guest.networks=Super CIDR pour les r\u00e9seaux invit\u00e9s -label.supported.services=Services support\u00e9s -label.supported.source.NAT.type=Type de NAT support\u00e9 -label.supportsstrechedl2subnet=Sous-r\u00e9seau Streched L2 support\u00e9 -label.suspend.project=Suspendre projet -label.switch.type=Type commutateur -label.system.capacity=Capacit\u00e9 syst\u00e8me -label.system.offering.for.router=Offre de Syst\u00e8me pour Routeur -label.system.offering=Offre de Syst\u00e8me -label.system.service.offering.details=D\u00e9tails offre de service syst\u00e8me -label.system.service.offering=Offre de Service Syst\u00e8me -label.system.vm.details=D\u00e9tails VM Syst\u00e8me -label.system.vm.scaled.up=VM Syst\u00e8me agrandie -label.system.vms=\ VMs Syst\u00e8mes -label.system.vm.type=Type de VM syst\u00e8me -label.system.vm=VM Syst\u00e8me -label.system.wide.capacity=Capacit\u00e9 globale -label.tagged=\u00c9tiquet\u00e9 -label.tag.key=Cl\u00e9 Tag -label.tags=\u00c9tiquette -label.tag.value=Valeur Tag -label.target.iqn=Cible IQN -label.task.completed=T\u00e2che termin\u00e9e -label.template.limits=Limites de mod\u00e8le -label.template=Mod\u00e8le -label.TFTP.dir=R\u00e9pertoire TFTP -label.tftp.root.directory=R\u00e9pertoire racine TFTP -label.theme.default=Th\u00e8me par d\u00e9faut -label.theme.grey=Personnalis\u00e9 - Gris -label.theme.lightblue=Personnalis\u00e9 - Bleu clair -label.threshold=Seuil -label.thursday=Jeudi -label.tier.details=D\u00e9tails du tiers -label.tier=Tiers -label.time.colon=Heure \: -label.timeout=D\u00e9lai d\\'expiration -label.timeout.in.second = Timeout (secondes) -label.time=Temps -label.timezone.colon=Fuseau horaire \: -label.time.zone=Fuseau horaire -label.timezone=Fuseau horaire -label.token=Jeton unique -label.total.cpu=Capacit\u00e9 totale en CPU -label.total.CPU=Capacit\u00e9 totale en CPU -label.total.hosts=Total H\u00f4tes -label.total.memory=Total m\u00e9moire -label.total.of.ip=Total adresses IP -label.total.of.vm=Total VMs -label.total.storage=Total stockage -label.total.virtual.routers=Total des Routeurs virtuels -label.total.virtual.routers.upgrade=Total des routeurs virtuels avec mise \u00e0 niveau n\u00e9cessaire -label.total.vms=Nombre total de VMs -label.traffic.label=Libell\u00e9 trafic -label.traffic.types=Types de trafic -label.traffic.type=Type Trafic -label.tuesday=Mardi -label.type.id=ID du Type -label.type.lower=type -label.type=Type -label.ucs=UCS -label.uk.keyboard=Clavier UK -label.unavailable=Indisponible -label.unhealthy.threshold=Seuil non tol\u00e9r\u00e9 -label.unlimited=Illimit\u00e9 -label.untagged=Non Tagg\u00e9 -label.update.project.resources=Mettre \u00e0 jour les ressources du projet -label.update.ssl.cert= Certificat SSL -label.update.ssl= Certificat SSL -label.updating=Mise \u00e0 jour -label.upgrade.required=Une mise \u00e0 jour est n\u00e9cessaire -label.upgrade.router.newer.template=Mette \u00e0 jour le routeur pour utiliser le mod\u00e8le le plus r\u00e9cent -label.upload.from.local=T\u00e9l\u00e9verser depuis Local -label.upload.template.from.local=T\u00e9l\u00e9verser Mod\u00e8le depuis Local -label.upload=T\u00e9l\u00e9verser -label.upload.volume.from.local=T\u00e9l\u00e9verser Volume depuis Local -label.upload.volume.from.url=T\u00e9l\u00e9verser volume depuis URL -label.upload.volume=T\u00e9l\u00e9verser un volume -label.url=URL -label.usage.interface=Interface Utilisation -label.usage.sanity.result=R\u00e9sultat de sant\u00e9 Usage -label.usage.server=Serveur d\\'Usage -label.usage.type=Type Usage -label.usage.unit=Unit\u00e9 -label.used=Utilis\u00e9 -label.user.data=Donn\u00e9es utilisateur -label.user.details=D\u00e9tails utilisateur -label.username=Identifiant -label.username.lower=identifiant -label.users=Utilisateurs -label.user=Utilisateur -label.user.vm=Utilisateur VM -label.use.vm.ips=Utiliser IP VMs -label.use.vm.ip=Utiliser IP VM \: -label.value=Valeur -label.vcdcname=Nom du DC vCenter -label.vcenter.cluster=Cluster vCenter -label.vcenter.datacenter=Datacenter vCenter -label.vcenter.datastore=Datastore vCenter -label.vcenter.host=H\u00f4te vCenter -label.vcenter.password=Mot de passe vCenter -label.vcenter.username=Identifiant vCenter -label.vcenter=vcenter -label.vcipaddress=Adresse IP vCenter -label.version=Version -label.vgpu.max.resolution=R\u00e9solution Max. -label.vgpu.max.vgpu.per.gpu=vGPUs par GPU -label.vgpu.remaining.capacity=Capacit\u00e9 restante -label.vgpu.type=vGPU type -label.vgpu=VGPU -label.vgpu.video.ram=M\u00e9moire Vid\u00e9o -label.view.all=Voir tout -label.view.console=Voir la console -label.viewing=Consultation en cours -label.view.more=Voir plus -label.view.secondary.ips=Voir IPs secondaires -label.view=Voir -label.virtual.appliance=Appliance Virtuelle -label.virtual.appliance.details=D\u00e9tails Appliance Virtuelle -label.virtual.appliances=Appliances Virtuelles -label.virtual.machine=Machine Virtuelle -label.virtual.machines=Machines virtuelles -label.virtual.networking=Mise en r\u00e9seau virtuelle -label.virtual.network=R\u00e9seau virtuel -label.virtual.router=Routeur Virtuel -label.virtual.routers.group.account=Routeurs virtuels group\u00e9s par compte -label.virtual.routers.group.cluster=Routeurs virtuels group\u00e9s par cluster -label.virtual.routers.group.pod=Routeurs virtuels group\u00e9s par pod -label.virtual.routers.group.zone=Routeurs virtuels group\u00e9s par zone -label.virtual.routers=Routeurs virtuels -label.vlan.id=ID VLAN/VNI -label.vlan.only=VLAN -label.vlan.range.details=D\u00e9tails plage VLAN -label.vlan.range=Plage du VLAN -label.vlan.ranges=Plage(s) VLAN -label.vlan=VLAN/VNI -label.vlan.vni.range=Plage du VLAN -label.vlan.vni.ranges=Plage(s) VLAN/VNI -label.vm.add=Ajouter une instance -label.vm.destroy=D\u00e9truire -label.vm.display.name=Nom commun VM -label.VMFS.datastore=Magasin de donn\u00e9es VMFS -label.vmfs=VMFS -label.vm.id=ID VM -label.vm.ip=Adresse IP VM -label.vm.name=Nom VM -label.vm.password=Le mot de passe de cette VM est -label.vm.reboot=Red\u00e9marrer -label.VMs.in.tier=Machines virtuelles dans le tiers -label.vmsnapshot.current=estCourant -label.vmsnapshot=Instantan\u00e9s VM -label.vmsnapshot.memory=M\u00e9more instantan\u00e9 -label.vmsnapshot.parentname=Parent -label.vmsnapshot.type=Type -label.vm.start=D\u00e9marrer -label.vm.state=\u00c9tat VM -label.vm.stop=Arr\u00eater -label.vms=VMs -label.vmware.datacenter.id=ID datacenter VMware -label.vmware.datacenter.name=Nom datacenter VMware -label.vmware.datacenter.vcenter=vcenter datacenter VMware -label.vmware.traffic.label=Libell\u00e9 trafic VMware -label.vnet.id=ID VLAN/VNI -label.vnet=VLAN/VNI -label.vnmc.devices=\u00c9quipement VNMC -label.vnmc=VNMC -label.volatile=Volatile -label.volgroup=Groupe de Volume -label.volume.details=D\u00e9tails du volume -label.volume.limits=Limites des volumes -label.volume.migrated=Volume migr\u00e9 -label.volume.name=Nom du volume -label.volumes=Volumes -label.volume=Volume -label.vpc.distributedvpcrouter=Routeur VPC Distribu\u00e9 -label.vpc.id=ID VPC -label.VPC.limits=Limites VPC -label.vpc.offering.details=D\u00e9tails offre VPC -label.vpc.offering=Offre de VPC -label.vpc.router.details=D\u00e9tails Routeur VPC -label.VPC.router.details=D\u00e9tails routeur VPC -label.vpc.supportsregionlevelvpc=VPC niveau R\u00e9gion support\u00e9 -label.vpc.virtual.router=Routeur virtuel VPC -label.vpc=VPC -label.VPN.connection=Connexion VPN -label.vpn.customer.gateway=Passerelle VPN client -label.VPN.customer.gateway=Passerelle VPN client -label.vpn.force.encapsulation=Force l\\'encapsulation UDP des paquets ESP -label.VPN.gateway=Passerelle VPN -label.vpn=VPN -label.vsmctrlvlanid=\ ID VLAN Contr\u00f4le -label.vsmpktvlanid=ID VLAN Paquet -label.vsmstoragevlanid=VLAN ID Stockage -label.vsphere.managed=G\u00e9r\u00e9e par vSphere -label.vswitch.name=Nom vSwitch -label.vSwitch.type=Type vSwitch -label.vxlan.id=VXLAN ID -label.vxlan.range=Plage du VXLAN -label.vxlan=VXLAN -label.waiting=En attente -label.warn=Avertissement -label.warning=Avertissement -label.warn.upper=WARN -label.wednesday=Mercredi -label.weekly=Hebdomadaire -label.welcome=Bienvenue -label.welcome.cloud.console=Bienvenue dans la Console d\\'Administration -label.what.is.cloudstack=Qu\\'est-ce-que CloudStack&\#8482; ? -label.xenserver.tools.version.61.plus=XenServer Tools Version 6.1\\+ -label.Xenserver.Tools.Version61plus=XenServer Tools Version 6.1\\+ -label.xenserver.traffic.label=Libell\u00e9 trafic XenServer -label.yes=Oui -label.zone.dedicated=Zone d\u00e9di\u00e9e -label.zone.details=D\u00e9tails de la zone -label.zone.id=ID de la zone -label.zone.lower=zone -label.zone.name=Nom de la zone -label.zone.step.1.title=\u00c9tape 1 \: S\u00e9lectionnez un r\u00e9seau -label.zone.step.2.title=\u00c9tape 2 \: Ajoutez une zone -label.zone.step.3.title=\u00c9tape 3 \: Ajoutez un Pod -label.zone.step.4.title=\u00c9tape 4 \: Ajoutez une plage d\\'adresses IP -label.zones=Zones -label.zone.type=Type de zone -label.zone.wide=Transverse \u00e0 la zone -label.zoneWizard.trafficType.guest=Invit\u00e9 \: Trafic entre les machines virtuelles utilisateurs -label.zoneWizard.trafficType.management=Administration \: Trafic entre les ressources internes de CloudStack, incluant tous les composants qui communiquent avec le serveur d\\'administration, tels que les h\u00f4tes et les machines virtuelles Syst\u00e8mes CloudStack -label.zoneWizard.trafficType.public=Public \: Trafic entre Internet et les machines virtuelles dans le nuage -label.zoneWizard.trafficType.storage=Stockage \: Trafic entre les serveurs de stockages principaux et secondaires, tel que le transfert de machines virtuelles mod\u00e8les et des instantan\u00e9s de disques -label.zone=Zone -managed.state=\u00c9tat de la gestion -message.acquire.ip.nic=Confirmez que vous souhaitez acqu\u00e9rir une nouvelle IP secondaire pour cette carte NIC.
N.B. Vous devez configurer manuellement la nouvelle IP secondaire dans la machine virtuelle. -message.acquire.new.ip=Confirmer l\\'acquisition d\\'une nouvelle adresse IP pour ce r\u00e9seau. -message.acquire.new.ip.vpc=Veuillez confirmer que vous voulez une nouvelle adresse IP pour ce VPC -message.acquire.public.ip=S\u00e9lectionnez la zone dans laquelle vous voulez acqu\u00e9rir votre nouvelle adresse IP. -message.action.cancel.maintenance.mode=Confirmer l\\'annulation de cette maintenance. -message.action.cancel.maintenance=Votre h\u00f4te a quitt\u00e9 la maintenance. Ce processus peut prendre jusqu\\'\u00e0 plusieurs minutes. -message.action.change.service.warning.for.instance=Votre instance doit \u00eatre arr\u00eat\u00e9e avant d\\'essayer de changer son offre de service. -message.action.change.service.warning.for.router=Votre routeur doit \u00eatre arr\u00eat\u00e9 avant d\\'essayer de changer son offre de service. -message.action.delete.cluster=\u00cates-vous s\u00fbr que vous voulez supprimer ce cluster. -message.action.delete.disk.offering=Supprimer cette offre de disque ? -message.action.delete.domain=\u00cates-vous s\u00fbr que vous voulez supprimer ce domaine. -message.action.delete.external.firewall=Supprimer ce pare-feu externe ? Attention \: Si vous pr\u00e9voyez de rajouter le m\u00eame pare-feu externe de nouveau, vous devez r\u00e9-initialiser les donn\u00e9es d\\'utilisation sur l\\'appareil. -message.action.delete.external.load.balancer=Supprimer ce r\u00e9partiteur de charge externe ? Attention \: Si vous pensez ajouter le m\u00eame r\u00e9partiteur de charge plus tard, vous devez remettre \u00e0 z\u00e9ro les statistiques d\\'utilisation de cet \u00e9quipement. -message.action.delete.ingress.rule=Supprimer cette r\u00e8gle de flux entrant ? -message.action.delete.ISO.for.all.zones=L\\'ISO est utilis\u00e9 par toutes les zones. S\\'il vous pla\u00eet confirmer que vous voulez le supprimer de toutes les zones. -message.action.delete.ISO=Supprimer cet ISO ? -message.action.delete.network=\u00cates-vous s\u00fbr que vous voulez supprimer ce r\u00e9seau. -message.action.delete.nexusVswitch=Confirmer la suppession de ce Nexus 1000v -message.action.delete.nic=Veuillez confirmer que vous souhaitez supprimer cette carte NIC, ce qui supprimera \u00e9galement le r\u00e9seau associ\u00e9 sur la machine virtuelle. -message.action.delete.physical.network=Confirmer la suppression du r\u00e9seau physique -message.action.delete.pod=Supprimer ce pod ? -message.action.delete.primary.storage=\u00cates-vous s\u00fbr que vous voulez supprimer ce stockage primaire. -message.action.delete.secondary.storage=Supprimer ce stockage secondaire ? -message.action.delete.security.group=Supprimer ce groupe de s\u00e9curit\u00e9 ? -message.action.delete.service.offering=Supprimer cette offre de service ? -message.action.delete.snapshot=Supprimer cet instantan\u00e9 ? -message.action.delete.system.service.offering=\u00cates-vous s\u00fbr que vous voulez supprimer l\\'offre syst\u00e8me. -message.action.delete.template.for.all.zones=Ce mod\u00e8le est utilis\u00e9 par toutes les zones. Supprimer de toutes les zones ? -message.action.delete.template=Supprimer ce mod\u00e8le ? -message.action.delete.volume=Supprimer ce volume ? -message.action.delete.zone=Supprimer cette zone ? -message.action.destroy.instance=Supprimer cette instance ? -message.action.destroy.systemvm=Supprimer cette VM Syst\u00e8me ? -message.action.disable.cluster=D\u00e9sactiver ce cluster ? -message.action.disable.nexusVswitch=Confirmer la d\u00e9sactivation de ce Nexus 1000v -message.action.disable.physical.network=Confirmer l\\'activation de ce r\u00e9seau physique. -message.action.disable.pod=D\u00e9sactiver ce pod ? -message.action.disable.static.NAT=D\u00e9sactiver le NAT statique ? -message.action.disable.zone=D\u00e9sactiver cette zone ? -message.action.downloading.template=T\u00e9l\u00e9chargement mod\u00e8le. -message.action.download.iso=Confirmer le t\u00e9l\u00e9chargement de cet ISO -message.action.download.template=Confirmer le t\u00e9l\u00e9chargement de ce mod\u00e8le -message.action.enable.cluster=Activer ce cluster ? -message.action.enable.maintenance=Votre h\u00f4te a \u00e9t\u00e9 mis en mode maintenance avec succ\u00e8s. Ce processus peut durer plusieurs minutes ou plus, suivant le nombre de VMs actives sur cet h\u00f4te. -message.action.enable.nexusVswitch=Confirmer l\\'activation de ce Nexus 1000v -message.action.enable.physical.network=Confirmer l\\'activation de ce r\u00e9seau physique. -message.action.enable.pod=Activer ce pod ? -message.action.enable.zone=Activer cette zone ? -message.action.expunge.instance=Confirmez que vous souhaitez effacer cette instance. -message.action.force.reconnect=Votre h\u00f4te a \u00e9t\u00e9 forc\u00e9e \u00e0 se reconnecter avec succ\u00e8s. Ce processus peut prendre jusqu\\'\u00e0 plusieurs minutes. -message.action.host.enable.maintenance.mode=Activer le mode maintenance va causer la migration \u00e0 chaud de l\\'ensemble des instances de cet h\u00f4te sur les autres h\u00f4tes disponibles. -message.action.instance.reset.password=Confirmer le changement du mot de passe ROOT pour cette machine virtuelle. -message.action.manage.cluster=G\u00e9rer le cluster ? -message.action.primarystorage.enable.maintenance.mode=Attention \: placer ce stockage primaire en mode maintenance va provoquer l\\'arr\u00eat de l\\'ensemble des VMs utilisant des volumes sur ce stockage. Souhaitez-vous continuer ? -message.action.reboot.instance=Red\u00e9marrer cette instance ? -message.action.reboot.router=Tous les services fournit par ce routeur virtuel vont \u00eatre interrompus. Confirmer le r\u00e9-amor\u00e7age de ce routeur. -message.action.reboot.systemvm=Red\u00e9marrer cette VM Syst\u00e8me ? -message.action.release.ip=Lib\u00e9rer cette adresse IP ? -message.action.remove.host=\u00cates-vous s\u00fbr que vous voulez supprimer cet h\u00f4te. -message.action.reset.password.off=Votre instance ne supporte pas pour le moment cette fonctionnalit\u00e9. -message.action.reset.password.warning=Votre instance doit \u00eatre arr\u00eat\u00e9e avant d\\'essayer de changer son mot de passe. -message.action.restore.instance=Restaurer cette instance ? -message.action.revert.snapshot=Confirmez que vous souhaitez r\u00e9tablir ce volume pour cet instantan\u00e9 -message.action.start.instance=D\u00e9marrer cette instance ? -message.action.start.router=D\u00e9marrer ce routeur ? -message.action.start.systemvm=Red\u00e9marrer cette VM syst\u00e8me ? -message.action.stop.instance=Arr\u00eater cette instance ? -message.action.stop.router=Tous les services fournit par ce routeur virtuel vont \u00eatre interrompus. Confirmer l\\'arr\u00eat de ce routeur. -message.action.stop.systemvm=Arr\u00eater cette VM ? -message.action.take.snapshot=Confirmer la prise d\\'un instantan\u00e9 pour ce volume. -message.action.unmanage.cluster=Confirmez que vous ne voulez plus g\u00e9rer le cluster -message.action.vmsnapshot.delete=Confirmez que vous souhaitez supprimer cet instantan\u00e9 VM. -message.action.vmsnapshot.revert=R\u00e9tablir l\\'instantan\u00e9 VM -message.activate.project=Voulez-vous activer ce projet ? -message.add.cluster=Ajouter un cluster d\\'hyperviseurs g\u00e9r\u00e9 pour cette zone , pod -message.add.cluster.zone=Ajouter un cluster d\\'hyperviseurs g\u00e9r\u00e9 pour cette zone -message.add.disk.offering=Renseignez les param\u00e8tres suivants pour ajouter un offre de service de disques -message.add.domain=Sp\u00e9cifier le sous domaine que vous souhaitez cr\u00e9er sous ce domaine -message.added.new.nuage.vsp.controller=Ajout d\\'un nouveau contr\u00f4leur Nuage Vsp -message.added.vpc.offering=Offre de VPC ajout\u00e9e -message.add.firewall=Ajouter un pare-feu \u00e0 cette zone -message.add.guest.network=Confirmer l\\'ajout du r\u00e9seau invit\u00e9 -message.add.host=Renseignez les param\u00e8tres suivants pour ajouter une h\u00f4te -message.adding.host=Ajout un h\u00f4te -message.adding.Netscaler.device=Ajouter un Netscaler -message.adding.Netscaler.provider=Ajouter un fournisseur Netscaler -message.add.ip.range=Ajouter une plage IP pour le r\u00e9seau publique dans la zone -message.add.ip.range.direct.network=Ajouter une plage IP au r\u00e9seau direct dans la zone -message.add.ip.range.to.pod=

Ajouter une plage IP pour le pod\:

-message.additional.networks.desc=S\u00e9lectionnez le(s) r\u00e9seau(x) additionnel(s) au(x)quel(s) sera connect\u00e9e votre instance. -message.add.load.balancer=Ajouter un r\u00e9partiteur de charge \u00e0 la zone -message.add.load.balancer.under.ip=La r\u00e8gle de r\u00e9partition de charge \u00e9t\u00e9 ajout\u00e9e sous l\\'adresse IP \: -message.add.network=Ajouter un nouveau r\u00e9seau \u00e0 la zone\: -message.add.new.gateway.to.vpc=Renseigner les informations suivantes pour ajouter une nouvelle passerelle pour ce VPC -message.add.pod=Ajouter un nouveau pod \u00e0 la zone -message.add.pod.during.zone.creation=Chaque zone doit contenir un ou plusieurs pods, et le premier pod sera ajout\u00e9 maintenant. Une pod contient les h\u00f4tes et les serveurs de stockage primaire, qui seront ajout\u00e9s dans une \u00e9tape ult\u00e9rieure. Configurer une plage d\\'adresses IP r\u00e9serv\u00e9es pour le trafic de gestion interne de CloudStack. La plage d\\'IP r\u00e9serv\u00e9e doit \u00eatre unique pour chaque zone dans le nuage. -message.add.primary=Renseignez les param\u00e8tres suivants pour ajouter un stockage primaire -message.add.primary.storage=Ajouter un nouveau stockage primaire \u00e0 la zone , pod -message.add.region=Renseigner les informations suivantes pour ajouter une nouvelle r\u00e9gion. -message.add.secondary.storage=Ajouter un nouveau stockage pour la zone -message.add.service.offering=Renseigner les informations suivantes pour ajouter une nouvelle offre de service de calcul. -message.add.system.service.offering=Ajouter les informations suivantes pour cr\u00e9er une nouvelle offre de syst\u00e8me. -message.add.template=Renseignez les informations suivantes pour cr\u00e9er votre nouveau mod\u00e8le -message.add.volume=Renseignez les informations suivantes pour ajouter un nouveau volume -message.add.VPN.gateway=Confirmer l\\'ajout d\\'une passerelle VPN -message.admin.guide.read=Pour les VMs VMware, veuillez lire le paragraphe "dynamic scaling" dans le guide d\\'administration avant d\\'op\u00e9rer un dimensionnement. Voulez-vous continuer ?\\, -message.advanced.mode.desc=Choisissez ce mod\u00e8le de r\u00e9seau si vous souhaitez b\u00e9n\u00e9ficier du support des VLANs. Ce mode de r\u00e9seau donne le plus de flexibilit\u00e9 aux administrateurs pour fournir des offres de service r\u00e9seau personnalis\u00e9es comme fournir des pare-feux, VPN, r\u00e9partiteurs de charge ou \u00e9galement activer des r\u00e9seaux virtuels ou directs. -message.advanced.security.group=Choisissez ceci si vous souhaitez utiliser les groupes de s\u00e9curit\u00e9 pour fournir l\\'isolation des VMs invit\u00e9es. -message.advanced.virtual=Choisissez ceci si vous souhaitez utiliser des VLANs pour fournir l\\'isolation des VMs invit\u00e9es. -message.after.enable.s3=Le stockage secondaire S3 est configur\u00e9. Note \: Quand vous quitterez cette page, vous ne pourrez plus re-configurer le support S3. -message.after.enable.swift=Swift configur\u00e9. Remarque \: une fois que vous quitterez cette page, il ne sera plus possible de re-configurer Swift \u00e0 nouveau. -message.alert.state.detected=\u00c9tat d\\'alerte d\u00e9tect\u00e9 -message.allow.vpn.access=Entrez un identifiant et un mot de passe pour l\\'utilisateur que vous souhaitez autoriser \u00e0 utiliser l\\'acc\u00e8s VPN. -message.apply.snapshot.policy=Vous avez mis \u00e0 jour votre politique d\\'instantan\u00e9s avec succ\u00e8s. -message.attach.iso.confirm=Attacher l\\'image ISO \u00e0 cette instance ? -message.attach.volume=Renseignez les donn\u00e9es suivantes pour attacher un nouveau volume. Si vous attachez un volume disque \u00e0 une machine virtuelle sous Windows, vous aurez besoin de red\u00e9marrer l\\'instance pour voir le nouveau disque. -message.basic.mode.desc=Choisissez ce mod\u00e8le de r\u00e9seau si vous *ne voulez pas* activer le support des VLANs. Toutes les instances cr\u00e9\u00e9es avec ce mod\u00e8le de r\u00e9seau se verront assigner une adresse IP et les groupes de s\u00e9curit\u00e9 seront utilis\u00e9s pour fournir l\\'isolation entre les VMs. -message.change.ipaddress=Confirmer que vous souhaitez changer l\\'adresse IP pour cette NIC sur la VM. -message.change.offering.confirm=Changer l\\'offre de service de cette instance ? -message.change.password=Merci de modifier votre mot de passe. -message.cluster.dedicated=Cluster d\u00e9di\u00e9e -message.cluster.dedication.released=Lib\u00e9ration de cluster d\u00e9di\u00e9 -message.configure.all.traffic.types=Vous avez de multiples r\u00e9seaux physiques ; veuillez configurer les libell\u00e9s pour chaque type de trafic en cliquant sur le bouton Modifier. -message.configure.firewall.rules.allow.traffic=Configurer les r\u00e8gles autorisant le trafic -message.configure.firewall.rules.block.traffic=Configurer les r\u00e8gles bloquant le trafic -message.configure.ldap=Confirmer la configuration LDAP -message.configuring.guest.traffic=Configuration du r\u00e9seau VM -message.configuring.physical.networks=Configuration des r\u00e9seaux physiques -message.configuring.public.traffic=Configuration du r\u00e9seau public -message.configuring.storage.traffic=Configuration du r\u00e9seau de stockage -message.confirm.action.force.reconnect=Confirmer la re-connexion forc\u00e9e de cet h\u00f4te. -message.confirm.add.vnmc.provider=Confirmer l\\'ajout du fournisseur VNMC. -message.confirm.archive.alert=Confirmer la suppression de cette alerte. -message.confirm.archive.event=Confirmer l\\'archivage de cet \u00e9v\u00e9nement. -message.confirm.archive.selected.alerts=Confirmer l\\'archivage des alertes s\u00e9lectionn\u00e9es -message.confirm.archive.selected.events=Confirmez l\\'archivage des \u00e9v\u00e9nements s\u00e9lectionn\u00e9s -message.confirm.attach.disk=Confirmer le rattachement de ce disque ? -message.confirm.create.volume=Confirmer la cr\u00e9ation de ce volume ? -message.confirm.current.guest.CIDR.unchanged=Voulez-vous garder l\\'actuel r\u00e9seau d\\'invit\u00e9 CIDR inchang\u00e9 ? -message.confirm.dedicate.cluster.domain.account=D\u00e9dier ce cluster \u00e0 un domaine/compte ? -message.confirm.dedicate.host.domain.account=D\u00e9dier cet h\u00f4te \u00e0 un domaine/compte ? -message.confirm.dedicate.pod.domain.account=D\u00e9dier ce pod \u00e0 un domaine/compte ? -message.confirm.dedicate.zone=\u00cates-vous s\u00fbr de d\u00e9dier cette zone \u00e0 un domaine/compte ? -message.confirm.delete.acl.list=Confirmer la suppression de cette liste ACL ? -message.confirm.delete.alert=Confirmer la suppression de cette alerte ? -message.confirm.delete.baremetal.rack.configuration=Confirmer que vous voulez supprimer cette configuration Rack Baremetal -message.confirm.delete.BigSwitchBcf=Confirmer que vous voulez supprimer ce contr\u00f4leur BigSwitch BCF -message.confirm.delete.BrocadeVcs=Confirmer la suppression du switch Brocade Vcs -message.confirm.delete.ciscoASA1000v=Confirmez la suppression du CiscoASA1000v -message.confirm.delete.ciscovnmc.resource=Confirmer la suppression de la ressource CiscoVNMC -message.confirm.delete.F5=Confirmer la suppression du F5 -message.confirm.delete.internal.lb=Confirmer la suppression de ce LB interne. -message.confirm.delete.NetScaler=Confirmer la suppression du Netscaler -message.confirm.delete.NuageVsp=Confirmer la suppression du Nuage Virtualized Services Directory -message.confirm.delete.PA=Confirmer la suppression du Palo Alto -message.confirm.delete.secondary.staging.store=Confirmer que vous voulez supprimer le Stockage Secondaire Interm\u00e9diaire. -message.confirm.delete.SRX=Confirmer la suppression du SRX -message.confirm.delete.ucs.manager=Confirmez que vous voulez supprimer le gestionnaire UCS -message.confirm.destroy.router=\u00cates-vous s\u00fbr que vous voulez supprimer ce routeur -message.confirm.disable.host=Confirmer la d\u00e9s-activation de cet h\u00f4te. -message.confirm.disable.network.offering=Voulez-vous d\u00e9sactiver cette offre r\u00e9seau ? -message.confirm.disable.provider=Confirmer la d\u00e9sactivation de ce fournisseur -message.confirm.disable.vnmc.provider=Confirmer la d\u00e9sactivation du fournisseur VNMC. -message.confirm.disable.vpc.offering=Voulez-vous d\u00e9sactiver cette offre VPC ? -message.confirm.enable.host=Confirmer l\\'activation de cet h\u00f4te. -message.confirm.enable.network.offering=Voulez-vous activer cette offre r\u00e9seau ? -message.confirm.enable.provider=Confirmer l\\'activation de ce fournisseur -message.confirm.enable.vnmc.provider=Confirmer l\\'activation du fournisseur VNMC. -message.confirm.enable.vpc.offering=Voulez-vous activer cette offre VPC ? -message.confirm.join.project=Rejoindre ce projet ? -message.confirm.migrate.volume=Confirmer la migration de ce volume ? -message.confirm.refresh.blades=Confirmer que vous voulez rafra\u00eechr les lames. -message.confirm.release.dedicated.cluster=Lib\u00e9rer ce cluster d\u00e9di\u00e9 ? -message.confirm.release.dedicated.host=Lib\u00e9rer cet h\u00f4te d\u00e9di\u00e9e ? -message.confirm.release.dedicated.pod=Lib\u00e9rer ce pod d\u00e9di\u00e9 ? -message.confirm.release.dedicated.zone=Lib\u00e9rer cette zone d\u00e9di\u00e9e ? -message.confirm.release.dedicate.vlan.range=Confirmez que vous souhaitez lib\u00e9rer cette plage VLAN d\u00e9di\u00e9e. -message.confirm.remove.event=Voulez-vous supprimer cet \u00e9v\u00e9nement ? -message.confirm.remove.IP.range=\u00cates-vous s\u00fbr que vous voulez supprimer cette plage d\\'adresses IP -message.confirm.remove.load.balancer=Confirmer la suppression de cette VM du r\u00e9partiteur de charge ? -message.confirm.remove.network.offering=Voulez-vous supprimer cette offre r\u00e9seau ? -message.confirm.remove.selected.alerts=Confirmer la suppression des alertes s\u00e9lectionn\u00e9es -message.confirm.remove.selected.events=Confirmez la suppression des \u00e9v\u00e9nements s\u00e9lectionn\u00e9s -message.confirm.remove.vmware.datacenter=Veuillez confirmer que vous voulez supprimer le datacenter VMware -message.confirm.remove.vpc.offering=Voulez-vous supprimer cette offre VPC ? -message.confirm.replace.acl.new.one=Voulez-vous remplacer l\\'ACL par cette nouvelle ? -message.confirm.scale.up.router.vm=Agrandir la VM Routeur ? -message.confirm.scale.up.system.vm=Agrandir la VM Syst\u00e8me ? -message.confirm.shutdown.provider=Confirmer l\\'arr\u00eat de ce fournisseur -message.confirm.start.lb.vm=Confirmez que vous souhaitez d\u00e9marrer ce LB VM. -message.confirm.stop.lb.vm=Confirmez que vous souhaitez arr\u00eater ce LB VM. -message.confirm.upgrade.router.newer.template=Confirmez que vous souhaitez mettre \u00e0 jour le routeur avec un mod\u00e8le plus r\u00e9cent. -message.confirm.upgrade.routers.account.newtemplate=Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans ce compte avec un mod\u00e8le plus r\u00e9cent. -message.confirm.upgrade.routers.cluster.newtemplate=Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans ce cluster avec un mod\u00e8le plus r\u00e9cent. -message.confirm.upgrade.routers.newtemplate=Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans cette zone avec un mod\u00e8le plus r\u00e9cent. -message.confirm.upgrade.routers.pod.newtemplate=Confirmez que vous souhaitez mettre \u00e0 jour tous les routeurs dans ce pod avec un mod\u00e8le plus r\u00e9cent. -message.copy.iso.confirm=Copier votre image ISO vers -message.copy.template.confirm=Voulez-vous copier le mod\u00e8le ? -message.copy.template=Copier le mod\u00e8le XXX de la zone vers -message.create.template.vm=Cr\u00e9er la VM depuis le mod\u00e8le -message.create.template.volume=Renseignez les informations suivantes avec de cr\u00e9er un mod\u00e8le \u00e0 partir de votre volume de disque\:. La cr\u00e9ation du mod\u00e8le peut prendre plusieurs minutes suivant la taille du volume. -message.create.template=Voulez-vous cr\u00e9er un mod\u00e8le ? -message.creating.cluster=Cr\u00e9ation du cluster -message.creating.guest.network=Cr\u00e9ation du r\u00e9seau pour les invit\u00e9s -message.creating.physical.networks=Cr\u00e9ation des r\u00e9seaux physiques -message.creating.pod=Cr\u00e9ation d\\'un pod -message.creating.primary.storage=Cr\u00e9ation du stockage primaire -message.creating.secondary.storage=Cr\u00e9ation du stockage secondaire -message.creating.systemVM=Cr\u00e9ation des VMs Syst\u00e8mes (peut prendre du temps)... -message.creating.zone=Cr\u00e9ation de la zone -message.decline.invitation=Voulez-vous refuser cette invitation au projet ? -message.dedicated.zone.released=Lib\u00e9ration de zone d\u00e9di\u00e9e -message.dedicate.zone=Zone d\u00e9di\u00e9e -message.delete.account=Supprimer ce compte ? -message.delete.affinity.group=Confirmer la supression de ce groupe d\\'affinit\u00e9. -message.delete.gateway=\u00cates-vous s\u00fbr que vous voulez supprimer cette passerelle -message.delete.project=Voulez-vous supprimer ce projet ? -message.delete.user=\u00cates-vous s\u00fbr que vous voulez supprimer cet utilisateur. -message.delete.VPN.connection=\u00cates-vous s\u00fbr que vous voulez supprimer la connexion VPN -message.delete.VPN.customer.gateway=\u00cates-vous s\u00fbr que vous voulez supprimer cette passerelle VPN client -message.delete.VPN.gateway=\u00cates-vous s\u00fbr que vous voulez supprimer cette passerelle VPN -message.desc.add.new.lb.sticky.rule=Ajouter nouvelle r\u00e8gle LB sticky -message.desc.advanced.zone=Pour des topologies de r\u00e9seau plus sophistiqu\u00e9es. Ce mod\u00e8le de r\u00e9seau permet plus de flexibilit\u00e9 dans la d\u00e9finition des r\u00e9seaux d\\'invit\u00e9s et propose des offres personnalis\u00e9es telles que le support de pare-feu, VPN ou d\\'\u00e9quilibrage de charge. -message.desc.basic.zone=Fournit un r\u00e9seau unique o\u00f9 chaque instance de machine virtuelle se voit attribuer une adresse IP directement depuis le r\u00e9seau. L\\'isolation des invit\u00e9s peut \u00eatre assur\u00e9 au niveau de la couche r\u00e9seau-3 tels que les groupes de s\u00e9curit\u00e9 (filtrage d\\'adresse IP source). -message.desc.cluster=Chaque pod doit contenir un ou plusieurs clusters, et le premier cluster sera ajout\u00e9 tout de suite. Un cluster est un regroupement pour h\u00f4tes. Les h\u00f4tes d\\'un cluster ont tous un mat\u00e9riel identique, ex\u00e9cutent le m\u00eame hyperviseur, sont dans le m\u00eame sous-r\u00e9seau, et acc\u00e8dent au m\u00eame stockage partag\u00e9. Chaque cluster comprend une ou plusieurs h\u00f4tes et un ou plusieurs serveurs de stockage primaire. -message.desc.created.ssh.key.pair=Bi-cl\u00e9 SSH cr\u00e9\u00e9e -message.desc.create.ssh.key.pair=Veuillez remplir les champs suivants pour cr\u00e9er ou enregistrer une bi-cl\u00e9 SSH.

(1) Si la cl\u00e9 publique est d\u00e9finie, CloudStack va enregistrer cette cl\u00e9. Vous pouvez ensuite l\\'utiliser avec sa cl\u00e9 priv\u00e9e.

(2) Si la cl\u00e9 publique n\\'est pas d\u00e9finie, CloudStack va cr\u00e9er une nouvelle bi-cl\u00e9 SSH. Dans ce cas, veuillez copier et sauvegarder la cl\u00e9 priv\u00e9e. CloudStack ne va pas la conserver.
-message.desc.host=Chaque cluster doit contenir au moins un h\u00f4te (machine) pour ex\u00e9ctuer des machines virtuelles invit\u00e9es, et le premier h\u00f4te sera ajout\u00e9e maintenant. Pour un h\u00f4te fonctionnant dans CloudStack, vous devez installer un logiciel hyperviseur sur l\\'h\u00f4te, attribuer une adresse IP \u00e0 l\\'h\u00f4te, et s\\'assurer que l\\'h\u00f4te est connect\u00e9 au serveur d\\'administration CloudStack.

Indiquer le nom de l\\'h\u00f4te ou son adresse IP, l\\'identifiant de connexion (g\u00e9n\u00e9ralement root) et le mot de passe ainsi que toutes les \u00e9tiquettes permettant de classer les h\u00f4tes. -message.desc.primary.storage=Chaque cluster doit contenir un ou plusieurs serveurs de stockage primaire, et le premier sera ajout\u00e9 tout de suite. Le stockage principal contient les volumes de disque pour les machines virtuelles s\\'ex\u00e9cutant sur les h\u00f4tes dans le cluster. Utiliser les protocoles standards pris en charge par l\\'hyperviseur sous-jacent. -message.desc.reset.ssh.key.pair=Veuillez sp\u00e9cifier une bi-cl\u00e9 SSH que vous souhaitez ajouter \u00e0 cette VM. Noter que le mot de passe root sera chang\u00e9 durant cette op\u00e9ration si l\\'option mot de passe est activ\u00e9e. -message.desc.secondary.storage=Chaque zone doit avoir au moins un serveur NFS ou un serveur de stockage secondaire, et sera ajout\u00e9 en premier tout de suite. Le stockage secondaire entrepose les mod\u00e8les de machines virtuelles, les images ISO et les images disques des volumes des machines virtuelles. Ce serveur doit \u00eatre accessible pour toutes les machines h\u00f4tes dans la zone.

Saisir l\\'adresse IP et le chemin d\\'export. -message.desc.zone=Une zone est la plus grande unit\u00e9 organisationnelle dans CloudStack, et correspond typiquement \u00e0 un centre de donn\u00e9es. Les zones fournissent un isolement physique et de la redondance. Une zone est constitu\u00e9e d\\'un ou plusieurs pods (dont chacun contient les h\u00f4tes et les serveurs de stockage primaire) et un serveur de stockage secondaire qui est partag\u00e9e par tous les pods dans la zone. -message.detach.disk=Voulez-vous d\u00e9tacher ce disque ? -message.detach.iso.confirm=D\u00e9tacher l\\'image ISO de cette instance ? -message.disable.account=Veuillez confirmer que vous voulez d\u00e9sactiver ce compte. En d\u00e9sactivant le compte, tous les utilisateurs pour ce compte n\\'auront plus acc\u00e8s \u00e0 leurs ressources sur le cloud. Toutes les machines virtuelles vont \u00eatre arr\u00eat\u00e9es imm\u00e9diatement. -message.disable.snapshot.policy=Vous avez d\u00e9sactiv\u00e9 votre politique d\\'instantan\u00e9 avec succ\u00e8s. -message.disable.user=Confirmer la d\u00e9sactivation de cet utilisateur. -message.disable.vpn.access=D\u00e9sactiver l\\'acc\u00e8s VPN ? -message.disable.vpn=Voulez-vous d\u00e9sactiver le VPN ? -message.disabling.network.offering=D\u00e9sactivation de l\\'offre r\u00e9seau -message.disabling.vpc.offering=D\u00e9sactivation de l\\'offre VPC -message.disallowed.characters=Caract\u00e8res non autoris\u00e9s \: \\<\\,\\> -message.download.ISO=Cliquer 00000 pour t\u00e9l\u00e9charger une image ISO -message.download.template=Cliquer sur 00000 pour t\u00e9l\u00e9charger le mod\u00e8le -message.download.volume=Cliquer sur 00000 pour t\u00e9l\u00e9charger le volume -message.download.volume.confirm=Veuillez confirmer que vous voulez t\u00e9l\u00e9charger ce volume. -message.edit.account=Modifier ("-1" signifie pas de limite de ressources) -message.edit.confirm=V\u00e9rifier vos changements avant de cliquer sur "Enregistrer". -message.edit.limits=Renseignez les limites pour les ressources suivantes. "-1" indique qu\\'il n\\'y a pas de limites pour la cr\u00e9ation de ressources. -message.edit.traffic.type=Sp\u00e9cifier le libell\u00e9 de trafic associ\u00e9 avec ce type de trafic. -message.enable.account=Activer ce compte ? -message.enabled.vpn.ip.sec=Votre cl\u00e9 partag\u00e9e IPSec est -message.enabled.vpn=Votre acc\u00e8s VPN est activ\u00e9 et peut \u00eatre acc\u00e9d\u00e9 par l\\'IP -message.enable.user=Confirmer l\\'activation de cet utilisateur. -message.enable.vpn.access=Le VPN est d\u00e9sactiv\u00e9 pour cette adresse IP. Voulez vous activer l\\'acc\u00e8s VPN ? -message.enable.vpn=Confirmer l\\'activation de l\\'acc\u00e8s VPN pour cette adresse IP. -message.enabling.network.offering=Activation de l\\'offre r\u00e9seau -message.enabling.security.group.provider=Activation du fournisseur de groupe de s\u00e9curit\u00e9 -message.enabling.vpc.offering=Activation de l\\'offre VPC -message.enabling.zone=Activation de la zone -message.enabling.zone.dots=Activation de la zone... -message.enter.seperated.list.multiple.cidrs=Veuillez entrer une liste de CIDRs s\u00e9par\u00e9s par des virgules si plusieurs -message.enter.token=Entrer le jeton unique re\u00e7u dans le message d\\'invitation. -message.generate.keys=Confirmer la g\u00e9n\u00e9ration de nouvelles clefs pour cet utilisateur. -message.gslb.delete.confirm=Confirmer la suppression de ce GSLB -message.gslb.lb.remove.confirm=Enlever la r\u00e9partition de charge du GSLB ? -message.guest.traffic.in.advanced.zone=Le trafic r\u00e9seau d\\'invit\u00e9 est la communication entre les machines virtuelles utilisateur. Sp\u00e9cifier une plage d\\'identifiant VLAN pour le trafic des invit\u00e9s pour chaque r\u00e9seau physique. -message.guest.traffic.in.basic.zone=Le trafic r\u00e9seau d\\'invit\u00e9 est la communication entre les machines virtuelles utilisateur. Sp\u00e9cifier une plage d\\'adresses IP que CloudStack peut assigner aux machines virtuelles Invit\u00e9. S\\'assurer que cette plage n\\'empi\u00e8te pas sur la plage r\u00e9serv\u00e9e aux adresses IP Syst\u00e8me. -message.host.dedicated=H\u00f4te d\u00e9di\u00e9e -message.host.dedication.released=Lib\u00e9ration de l\\'h\u00f4te d\u00e9di\u00e9 -message.installWizard.click.retry=Appuyer sur le bouton pour essayer \u00e0 nouveau le d\u00e9marrage. -message.installWizard.copy.whatIsACluster=Un cluster permet de grouper les h\u00f4tes. Les h\u00f4tes d\\'un cluster ont un mat\u00e9riel identique, ex\u00e9cutent le m\u00eame hyperviseur, sont sur le m\u00eame sous-r\u00e9seau, et acc\u00e8dent au m\u00eame stockage partag\u00e9. Les instances de machines virtuelles (VM) peuvent \u00eatre migr\u00e9es \u00e0 chaud d\\'un h\u00f4te \u00e0 un autre au sein du m\u00eame groupe, sans interrompre les services utilisateur. Un cluster est la trois \u00e8me plus large unit\u00e9 organisationnelle dans un d\u00e9ploiement CloudStack&\#8482;. Les clusters sont contenus dans les pods et les pods sont contenus dans les zones.

CloudStack&\#8482; permet d\\'avoir plusieurs clusters dans un d\u00e9ploiement en nuage, mais pour une installation basique, il n\\'y a qu\\'un seul cluster. -message.installWizard.copy.whatIsAHost=Un h\u00f4te est une machine. Les h\u00f4tes fournissent les ressources informatiques qui ex\u00e9cutent les machines virtuelles invit\u00e9es. Chaque h\u00f4te a un logiciel hyperviseur install\u00e9 pour g\u00e9rer les machines virtuelles invit\u00e9es (sauf pour les h\u00f4tes de type \\'bare-metal\\', qui sont un cas particulier d\u00e9taill\u00e9 dans le Guide d\\'installation avanc\u00e9e). Par exemple, un serveur Linux avec KVM, un serveur Citrix XenServer, et un serveur ESXi sont des h\u00f4tes. Dans une installation basique, un seul h\u00f4te ex\u00e9cutant XenServer ou KVM est utilis\u00e9.

L\\'h\u00f4te est la plus petite unit\u00e9 organisation au sein d\\'un d\u00e9ploiement CloudStack&\#8482;. Les h\u00f4tes sont contenus dans les clusters, les clusters sont contenus dans les pods et les pods sont contenus dans les zones. -message.installWizard.copy.whatIsAPod=Un pod repr\u00e9sente souvent un seul rack. Les h\u00f4tes dans le m\u00eame pod sont dans le m\u00eame sous-r\u00e9seau.
Un pod est la deuxi\u00e8me plus grande unit\u00e9 organisationnelle au sein d\\'un d\u00e9ploiement CloudStack&\#8482;. Les pods sont contenus dans les zones. Chaque zone peut contenir un ou plusieurs pods ; dans l\\'Installation Basique, vous aurez juste un pod dans votre zone. -message.installWizard.copy.whatIsAZone=Une zone est la plus grande unit\u00e9 organisationnelle au sein d\\'un d\u00e9ploiement CloudStack&\#8482;. Une zone correspond typiquement \u00e0 un centre de donn\u00e9es, mais il est permis d\\'avoir plusieurs zones dans un centre de donn\u00e9es. L\\'avantage d\\'organiser une infrastructure en zones est de fournir une isolation physique et de la redondance. Par exemple, chaque zone peut avoir sa propre alimentation et de liaison avec le r\u00e9seau, et les zones peuvent \u00eatre tr\u00e8s \u00e9loign\u00e9es g\u00e9ographiquement (m\u00eame si ce n\\'est pas une obligation). -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482; est une plate-forme logicielle de pools de ressources informatiques pour construire des infrastructures publiques, priv\u00e9es et hybrides en tant que services (IaaS) dans les nuages. CloudStack&\#8482; g\u00e8re le r\u00e9seau, le stockage et les noeuds de calcul qui composent une infrastructure dans les nuages. Utilisez CloudStack&\#8482; pour d\u00e9ployer, g\u00e9rer et configurer les environnements d\\'informatiques dans les nuages.

S\\'\u00e9tendant au-del\u00e0 des machines virtuelles individuelles fonctionnant sur du mat\u00e9riel standard, CloudStack&\#8482; offre une solution d\\'informatique en nuage cl\u00e9 en main pour fournir des centres de donn\u00e9es virtuels comme service - fournissant tous les composants essentiels pour construire, d\u00e9ployer et g\u00e9rer des applications \\'cloud\\' multi-niveaux et multi-locataire. Les versions libre et Premium sont disponibles, la version Libre offrant des caract\u00e9ristiques presque identiques. -message.installWizard.copy.whatIsPrimaryStorage=Une infrastructure CloudStack&\#8482; utilise deux types de stockage \: stockage primaire et stockage secondaire. Les deux peuvent \u00eatre des serveurs iSCSI ou NFS, ou sur disque local.

Le stockage principal est associ\u00e9 \u00e0 un cluster, et stocke les volumes disques de chaque machine virtuelle pour toutes les VMs s\\'ex\u00e9cutant sur les h\u00f4tes dans le cluster. Le serveur de stockage primaire est typiquement proche des h\u00f4tes. -message.installWizard.copy.whatIsSecondaryStorage=Le stockage secondaire est associ\u00e9 \u00e0 une zone, et il stocke les \u00e9l\u00e9ments suivants\:
  • Mod\u00e8les - images de syst\u00e8mes d\\'exploitation qui peuvent \u00eatre utilis\u00e9es pour d\u00e9marrer les machines virtuelles et peuvent inclure des informations de configuration suppl\u00e9mentaires, telles que les applications pr\u00e9-install\u00e9es
  • Images ISO - images de syst\u00e8me d\\'exploitation ou d\\'installation d\\'OS qui peuvent \u00eatre amor\u00e7able ou non-amor\u00e7able
  • Images de volume disque - capture des donn\u00e9es de machines virtuelles qui peuvent \u00eatre utilis\u00e9es pour la r\u00e9cup\u00e9ration des donn\u00e9es ou cr\u00e9er des mod\u00e8les
-message.installWizard.now.building=Construction de votre Cloud en cours -message.installWizard.tooltip.addCluster.name=Un nom pour le cluster. Ce choix est libre et n\\'est pas utilis\u00e9 par CloudStack. -message.installWizard.tooltip.addHost.hostname=Le nom DNS ou adresse IP du serveur. -message.installWizard.tooltip.addHost.password=Le mot de passe pour l\\'utilisateur indiqu\u00e9 pr\u00e9c\u00e9demment (issu de l\\'installation XenServer). -message.installWizard.tooltip.addHost.username=Habituellement root. -message.installWizard.tooltip.addPod.name=Nom pour le pod -message.installWizard.tooltip.addPod.reservedSystemEndIp=Ceci est la plage d\\'adresses IP dans le r\u00e9seau priv\u00e9 que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le m\u00eame sous-r\u00e9seau que les serveurs h\u00f4tes. -message.installWizard.tooltip.addPod.reservedSystemGateway=Passerelle pour les serveurs dans ce pod -message.installWizard.tooltip.addPod.reservedSystemNetmask=Le masque r\u00e9seau que les instances utiliseront sur le r\u00e9seau -message.installWizard.tooltip.addPod.reservedSystemStartIp=Ceci est la plage d\\'adresses IP dans le r\u00e9seau priv\u00e9 que CloudStack utilise la gestion des VMs du stockage secondaire et les VMs Console Proxy. Ces adresses IP sont prises dans le m\u00eame sous-r\u00e9seau que les serveurs h\u00f4tes. -message.installWizard.tooltip.addPrimaryStorage.name=Nom pour ce stockage -message.installWizard.tooltip.addPrimaryStorage.path=(pour NFS) Dans NFS, c\\'est le chemin d\\'export depuis le serveur. Le chemin (pour SharedMountPoint). Avec KVM, c\\'est le chemin sur chaque h\u00f4te o\u00f9 ce stockage primaire est mont\u00e9. Par exemple, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(pour NFS, iSCSI ou PreSetup) Adresse IP ou nom DNS du stockage -message.installWizard.tooltip.addSecondaryStorage.nfsServer=Adresse IP du serveur NFS supportant le stockage secondaire -message.installWizard.tooltip.addSecondaryStorage.path=Le chemin export\u00e9, situ\u00e9 sur le serveur sp\u00e9cifi\u00e9 pr\u00e9c\u00e9demment -message.installWizard.tooltip.addZone.dns1=Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici. -message.installWizard.tooltip.addZone.dns2=Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici. -message.installWizard.tooltip.addZone.internaldns1=Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici. -message.installWizard.tooltip.addZone.internaldns2=Ces serveurs DNS sont utilis\u00e9s par les machines virtuelles Invit\u00e9es dans la zone. Ces serveurs DNS seront accessibles par le r\u00e9seau public, ce dernier sera ajout\u00e9 plus tard. Les adresses IP publiques pour la zone doivent avoir une route vers les serveurs DNS indiqu\u00e9s ici. -message.installWizard.tooltip.addZone.name=Nom pour la zone -message.installWizard.tooltip.configureGuestTraffic.description=Description pour ce r\u00e9seau -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=La plage d\\'adresses IP qui sera disponible en allocation pour les machines invit\u00e9es dans cette zone. Si une carte r\u00e9seau est utilis\u00e9e, ces adresses IP peuvent \u00eatre dans le m\u00eame CIDR que le CIDR du pod. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=La passerelle que les instances invit\u00e9es doivent utiliser -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=Le masque r\u00e9seau que les instances devrait utiliser sur le r\u00e9seau -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=La plage d\\'adresses IP qui sera disponible en allocation pour les machines invit\u00e9es dans cette zone. Si une carte r\u00e9seau est utilis\u00e9e, ces adresses IP peuvent \u00eatre dans le m\u00eame CIDR que le CIDR du pod. -message.installWizard.tooltip.configureGuestTraffic.name=Nom pour ce r\u00e9seau -message.instance.scaled.up.confirm=\u00cates-vous s\u00fbr de vouloir agrandir votre instance ? -message.instanceWizard.noTemplates=Vous n\\'avez pas de image disponible ; Ajouter un mod\u00e8le compatible puis relancer l\\'assistant de cr\u00e9ation d\\'instance. -message.ip.address.changed=Vos adresses IP ont peut \u00eatre chang\u00e9es ; Voulez vous rafra\u00eechir la liste ? Dans ce cas, le panneau de d\u00e9tail se fermera. -message.iso.desc=Image disque contenant des donn\u00e9es ou un support amor\u00e7able pour OS -message.join.project=Vous avez rejoint un projet. S\u00e9lectionnez la vue Projet pour le voir. -message.launch.vm.on.private.network=Souhaitez vous d\u00e9marrer cette instance sur votre propre r\u00e9seau priv\u00e9 ? -message.launch.zone=La zone est pr\u00eate \u00e0 d\u00e9marrer ; passer \u00e0 l\\'\u00e9tape suivante. -message.ldap.group.import=Tous les utilisateurs du groupe indiqu\u00e9 seront import\u00e9s -message.link.domain.to.ldap=Activer autosync pour ce domaine dans le LDAP -message.listView.subselect.multi=(Ctrl/Cmd-clic) -message.lock.account=Verrouiller ce compte ? En le verrouillant, les utilisateurs de ce compte ne seront plus capables de g\u00e9rer leurs ressources. Les ressources existantes resteront toutefois accessibles. -message.migrate.instance.confirm=Confirmez l\\'h\u00f4te vers lequel vous souhaitez migrer cette instance -message.migrate.instance.to.host=Confirmer la migration de l\\'instance vers un autre h\u00f4te -message.migrate.instance.to.ps=Confirmer la migration de l\\'instance vers un autre stockage primaire -message.migrate.router.confirm=Confirmer la migration du routeur vers \: -message.migrate.systemvm.confirm=Confirmer la migration de la VM syst\u00e8me vers \: -message.migrate.volume=Confirmer la migration du volume vers un autre stockage primaire. -message.network.addVM.desc=Veuillez sp\u00e9cifier le r\u00e9seau que vous souhaitez ajouter \u00e0 cette VM. Une nouvelle interface NIC sera ajout\u00e9e pour ce r\u00e9seau. -message.network.addVMNIC=Confirmer l\\'ajout d\\'une nouvelle NIC VM pour ce r\u00e9seau. -message.network.remote.access.vpn.configuration=La configuration VPN Acc\u00e9s Distant a \u00e9t\u00e9 g\u00e9n\u00e9r\u00e9e mais elle n\\'a pas pu \u00eatre appliqu\u00e9e. Veuillez v\u00e9rifier la connectivit\u00e9 des \u00e9l\u00e9ments r\u00e9seau, et r\u00e9-essayez. -message.new.user=Renseigner les informations suivantes pour ajouter un nouveau compte utilisateur -message.no.affinity.groups=Vous n\\'avez pas de groupes d\\'affinit\u00e9. Continuer vers la prochaine \u00e9tape. -message.no.host.available=Aucun h\u00f4te n\\'est disponible pour la migration -message.no.network.support.configuration.not.true=Il n\\'y a pas de zone avec la fonction groupe de s\u00e9curit\u00e9 active. D\u00e8s lors, pas de fonction r\u00e9seau suppl\u00e9mentaires disponibles. Continuer \u00e0 l\\'\u00e9tape 5. -message.no.network.support=S\u00e9lectionnez l\\'hyperviseur. vSphere, n\\'a pas de fonctionnalit\u00e9s suppl\u00e9mentaires pour le r\u00e9seau. Continuez \u00e0 l\\'\u00e9tape 5. -message.no.projects.adminOnly=Vous n\\'avez pas de projet.
Contacter votre administrateur pour ajouter un projet. -message.no.projects=Vous n\\'avez pas de projet.
Vous pouvez en cr\u00e9er un depuis la section projets. -message.number.clusters=

\# de Clusters

-message.number.hosts=

\# d\\' H\u00f4tes

-message.number.pods=

\# de Pods

-message.number.storage=

\# de Volumes de Stockage Primaire

-message.number.zones=

\# de Zones

-message.outofbandmanagement.action.maintenance=L\\'h\u00f4te en avertissement est en mode maintenance -message.outofbandmanagement.changepassword=Modifier le mot de passe du flux d\\'administration -message.outofbandmanagement.configure=Configurer la gestion du flux d\\'administration -message.outofbandmanagement.disable=D\u00e9sactiver la gestion du flux d\\'administration -message.outofbandmanagement.enable=Activer la gestion du flux d\\'administration -message.outofbandmanagement.issue=Probl\u00e8me dans l\\'allumage via la gestion du flux administration. -message.password.has.been.reset.to=Le mot de passe a \u00e9t\u00e9 r\u00e9-initialiser en -message.password.of.the.vm.has.been.reset.to=Le mot de passe de la VM a \u00e9t\u00e9 r\u00e9-initialis\u00e9 en -message.pending.projects.1=Vous avez des invitations projet en attente \: -message.pending.projects.2=Pour les visualiser, aller dans la section projets, puis s\u00e9lectionner invitation dans la liste d\u00e9roulante. -message.please.add.at.lease.one.traffic.range=Ajouter au moins une plage r\u00e9seau -message.please.confirm.remove.ssh.key.pair=Confirmer la suppression de cette bi-cl\u00e9 SSH -message.please.proceed=Continuer vers la prochaine \u00e9tape. -message.please.select.a.configuration.for.your.zone=S\u00e9lectionner une configuration pour la zone. -message.please.select.a.different.public.and.management.network.before.removing=S\u00e9lectionner un r\u00e9seau public et d\\'administration diff\u00e9rent avant de supprimer -message.please.select.networks=S\u00e9lectionner les r\u00e9seaux pour votre machine virtuelle. -message.please.select.ssh.key.pair.use.with.this.vm=Veuillez s\u00e9lectionner la bi-cl\u00e9 SSH que vous souhaitez utiliser avec cette VM \: -message.please.wait.while.zone.is.being.created=Patienter pendant la cr\u00e9ation de la zone, cela peut prendre du temps... -message.pod.dedication.released=Lib\u00e9ration du pod d\u00e9di\u00e9 -message.portable.ip.delete.confirm=Supprimer la plage IP portable ? -message.project.invite.sent=Invitation envoy\u00e9e ; les utilisateurs seront ajout\u00e9s apr\u00e8s acceptation de l\\'invitation -message.public.traffic.in.advanced.zone=Le trafic public est g\u00e9n\u00e9r\u00e9 lorsque les machines virtuelles dans le nuage acc\u00e8dent \u00e0 Internet. Des adresses IP publiquement accessibles doivent \u00eatre pr\u00e9vues \u00e0 cet effet. Les utilisateurs peuvent utiliser l\\'interface d\\'administration de CloudStack pour acqu\u00e9rir ces adresses IP qui impl\u00e9menteront une translation d\\'adresse NAT entre le r\u00e9seau d\\'invit\u00e9 et le r\u00e9seau public.

Fournir au moins une plage d\\'adresses IP pour le trafic Internet. -message.public.traffic.in.basic.zone=Le trafic public est g\u00e9n\u00e9r\u00e9 lorsque les machines virtuelles dans le nuage acc\u00e8dent \u00e0 Internet ou fournissent des services \u00e0 des utilisateurs sur Internet. Des adresses IP publiquement accessibles doivent \u00eatre pr\u00e9vus \u00e0 cet effet. Quand une instance est cr\u00e9\u00e9e, une adresse IP publique depuis un ensemble d\\'adresses IP publiques sera allou\u00e9e \u00e0 l\\'instance, en plus de l\\'adresse IP de l\\'invit\u00e9. La translation d\\'adresses statique NAT 1-1 sera mises en place automatiquement entre l\\'adresse IP publique et l\\'adresse IP de l\\'invit\u00e9. Les utilisateurs peuvent \u00e9galement utiliser l\\'interface d\\'administration CloudStack pour acqu\u00e9rir des adresses IP suppl\u00e9mentaires pour ajouter une translation d\\'adresse statique NAT entre leurs instances et le r\u00e9seau d\\'adresses IP publiques. -message.question.are.you.sure.you.want.to.add=\u00cates-vous certain de vouloir ajouter -message.read.admin.guide.scaling.up=Veuillez lire le paragraphe "dynamic scaling" dans le guide d\\'administration avant d\\'op\u00e9rer un dimensionnement dynamique. -message.recover.vm=Confirmer la restauration de cette VM. -message.redirecting.region=Redirection vers r\u00e9gion... -message.reinstall.vm=NOTE\: Proc\u00e9dez avec prudence. Cela entra\u00eenera la r\u00e9-installation de la VM \u00e0 partir du mod\u00e8le; les donn\u00e9es sur le disque ROOT seront perdues. Les volumes de donn\u00e9es suppl\u00e9mentaires, le cas \u00e9ch\u00e9ant, ne seront pas touch\u00e9s. -message.removed.ssh.key.pair=Bi-cl\u00e9 SSH supprim\u00e9e -message.remove.ldap=Voulez-vous supprimer la configuration LDAP ? -message.remove.region=Voulez-vous supprimer cette r\u00e9gion depuis ce serveur d\\'administration ? -message.remove.vpc=Confirmer la suppression du VPC -message.remove.vpn.access=Supprimer l\\'acc\u00e8s VPN de cet utilisateur ? -message.reset.password.warning.notPasswordEnabled=Le mod\u00e8le de cette instance a \u00e9t\u00e9 cr\u00e9\u00e9 sans la gestion de mot de passe -message.reset.password.warning.notStopped=Votre instance doit \u00eatre arr\u00eat\u00e9e avant de changer son mot de passe -message.reset.VPN.connection=Confirmer le r\u00e9-initialisation de la connexion VPN -message.restart.mgmt.server=Red\u00e9marrez votre(vos) serveur(s) de management pour appliquer les nouveaux param\u00e8tres. -message.restart.mgmt.usage.server=Red\u00e9marrer le ou les serveur(s) de gestion et le ou les serveur(s) de consommation pour que les nouveaux param\u00e8tres soient pris en compte. -message.restart.network=Tous les services fournit par ce routeur virtuel vont \u00eatre interrompus. Confirmer le red\u00e9marrage de ce routeur. -message.restart.vpc=Confirmer le red\u00e9marrage du VPC -message.restart.vpc.remark=Veuillez confirmer que vous voulez red\u00e9marrer le VPC

Note \: transformer un VPC non-redondant en VPC redondant va forcer un nettoyage du routeur. Le r\u00e9seau associ\u00e9 ne sera pas disponible durant quelques minutes.

-message.restoreVM=Voulez-vous restaurer la VM ? -message.role.ordering.fail=La r\u00e9organisation des r\u00e8gles d\\'autorisations a \u00e9t\u00e9 abandonn\u00e9e car la liste a chang\u00e9 pendant que vous apportez des modifications. Veuillez r\u00e9essayer. -message.security.group.usage=(Utilisez Ctrl-clic pour s\u00e9lectionner les groupes de s\u00e9curit\u00e9 vis\u00e9s) -message.select.affinity.groups=S\u00e9lectionner les groupes d\\'affinit\u00e9 qui appartiendront \u00e0 cette machine virtuelle \: -message.select.a.zone=Une zone correspond typiquement \u00e0 un seul centre de donn\u00e9es. Des zones multiples peuvent permettre de rendre votre cloud plus fiable en apportant une isolation physique et de la redondance. -message.select.instance=S\u00e9lectionner une instance. -message.select.iso=S\u00e9lectionner un ISO pour votre nouvelle instance virtuelle. -message.select.item=Merci de s\u00e9lectionner un \u00e9l\u00e9ment. -message.select.security.groups=Merci de s\u00e9lectionner un(des) groupe(s) de s\u00e9curit\u00e9 pour la nouvelle VM -message.select.template=S\u00e9lectionner un mod\u00e8le pour votre nouvelle instance virtuelle. -message.select.tier=Veuillez selectionner un tiers -message.set.default.NIC=Confirmer la mise par d\u00e9faut de cette NIC pour cette VM. -message.set.default.NIC.manual=Veuillez mettre \u00e0 jour manuellement la NIC par d\u00e9faut sur la VM maintenant. -message.setup.physical.network.during.zone.creation.basic=Quand vous ajoutez une zone basique, vous pouvez param\u00e9trer un seul r\u00e9seau physique, correspondant \u00e0 une carte r\u00e9seau sur l\\'hyperviseur. Ce r\u00e9seau comportera plusieurs types de trafic.

Vous pouvez \u00e9galement glisser et d\u00e9poser d\\'autres types de trafic sur le r\u00e9seau physique. -message.setup.physical.network.during.zone.creation=Lorsque vous ajoutez une zone avanc\u00e9e, vous avez besoin de d\u00e9finir un ou plusieurs r\u00e9seaux physiques. Chaque r\u00e9seau correspond \u00e0 une carte r\u00e9seau sur l\\'hyperviseur. Chaque r\u00e9seau physique peut supporter un ou plusieurs types de trafic, avec certaines restrictions sur la fa\u00e7on dont ils peuvent \u00eatre combin\u00e9s.

Glisser et d\u00e9poser un ou plusieurs types de trafic sur chaque r\u00e9seau physique. -message.setup.successful=Installation du Cloud r\u00e9ussie \! -message.snapshot.schedule=Vous pouvez configurer des plannings d\\'instantan\u00e9s r\u00e9currents en s\u00e9lectionnant les options disponibles ci-dessous et en appliquant votre politique pr\u00e9f\u00e9r\u00e9e. -message.specifiy.tag.key.value=Sp\u00e9cifier une cl\u00e9 et valeur de tag -message.specify.url=Renseigner l\\'URL -message.step.1.continue=S\u00e9lectionnez un mod\u00e8le ou une image ISO pour continuer -message.step.1.desc=S\u00e9lectionnez un mod\u00e8le pour votre nouvelle instance virtuelle. Vous pouvez \u00e9galement choisir un mod\u00e8le vierge sur lequel une image ISO pourra \u00eatre install\u00e9e. -message.step.2.continue=S\u00e9lectionnez une offre de service pour continuer -message.step.3.continue=S\u00e9lectionnez un offre de service de disque pour continuer -message.step.4.continue=S\u00e9lectionnez au moins un r\u00e9seau pour continuer -message.step.4.desc=S\u00e9lectionnez le r\u00e9seau principal auquel votre instance va \u00eatre connect\u00e9. -message.storage.traffic=Trafic entre les ressources internes de CloudStack, incluant tous les composants qui communiquent avec le serveur d\\'administration, tels que les h\u00f4tes et les machines virtuelles Syst\u00e8mes CloudStack. Veuillez configurer le trafic de stockage ici. -message.suspend.project=Voulez-vous suspendre ce projet ? -message.systems.vms.ready=VMs Syst\u00e8mes pr\u00eats. -message.template.copying=Le mod\u00e8le est copi\u00e9. -message.template.desc=Image OS pouvant \u00eatre utilis\u00e9e pour d\u00e9marrer une VM -message.tier.required=Le tiers est obligatoire -message.tooltip.dns.1=Nom d\\'un serveur DNS utilis\u00e9 par les VM de la zone. Les adresses IP publiques de cette zone doivent avoir une route vers ce serveur. -message.tooltip.dns.2=Nom d\\'un serveur DNS secondaire utilis\u00e9 par les VM de la zone. Les adresses IP publiques de cette zone doivent avoir une route vers ce serveur. -message.tooltip.internal.dns.1=Nom d\\'un serveur DNS que CloudStack peut utiliser pour les VM syst\u00e8me dans cette zone. Les adresses IP priv\u00e9es des pods doivent avoir une route vers ce serveur. -message.tooltip.internal.dns.2=Nom d\\'un serveur DNS que CloudStack peut utiliser pour les VM syst\u00e8me dans cette zone. Les adresses IP priv\u00e9es des pods doivent avoir une route vers ce serveur. -message.tooltip.network.domain=Suffixe DNS qui cr\u00e9era un nom de domaine personnalis\u00e9 pour les r\u00e9seau accessible par les VM invit\u00e9es. -message.tooltip.pod.name=Nom pour ce pod. -message.tooltip.reserved.system.gateway=La passerelle pour les h\u00f4tes du pod. -message.tooltip.reserved.system.netmask=Le pr\u00e9fixe r\u00e9seau utilis\u00e9 par le sous-r\u00e9seau du pod. Au format CIDR. -message.tooltip.zone.name=Nom pour cette zone. -message.update.os.preference=Choisissez votre OS pr\u00e9f\u00e9r\u00e9 pour cet h\u00f4te. Toutes les instances avec des pr\u00e9f\u00e9rences similaires seront d\\'abord allou\u00e9es \u00e0 cet h\u00f4te avant d\\'en choisir un autre. -message.update.resource.count=Confirmer la mise \u00e0 jour des ressources pour ce compte. -message.update.ssl.failed=\u00c9chec dans la mise \u00e0 jour du certificat SSL -message.update.ssl=Soumettez un nouveau certificat SSL compatible X.509 qui sera mis \u00e0 jour sur chaque VM console proxy et VM sockage secondaire \: -message.update.ssl.succeeded=Mise \u00e0 jour r\u00e9ussie des certificats SSL -message.validate.accept=Veuillez entrer une valeur avec une extension valide. -message.validate.creditcard=Veuillez entrer un num\u00e9ro de carte de cr\u00e9dit valide. -message.validate.date.ISO=Veuillez entrer une date (ISO) valide. -message.validate.date=Veuillez entrer une date valide. -message.validate.digits=Veuillez entrer uniquement des chiffres. -message.validate.email.address=Veuillez entrer une adresse email valide. -message.validate.equalto=Veuillez entrer de nouveau la m\u00eame valeur. -message.validate.fieldrequired=Ce champ est obligatoire. -message.validate.fixfield=Veuillez corriger ce champ. -message.validate.instance.name=Le nom de l\\'instance ne peut d\u00e9passer 63 caract\u00e8res. Seuls les lettres de a \u00e0 z, les chiffres de 0 \u00e0 9 et les tirets sont accept\u00e9s. Le nom doit commencer par une lettre et se terminer par une lettre ou un chiffre. -message.validate.invalid.characters=Caract\u00e8res invalides trouv\u00e9s ; veuillez corriger. -message.validate.maxlength=Veuillez entrer uniquement {0} caract\u00e8res. -message.validate.max=Veuillez entrer une valeur inf\u00e9rieure ou \u00e9gale \u00e0 {0}. -message.validate.minlength=Veuillez entrer au moins {0} caract\u00e8res. -message.validate.number=Veuillez entrer un nombre valide. -message.validate.range.length=Veuillez entrer une valeur de {0} \u00e0 {1} caract\u00e8res. -message.validate.range=Veuillez entrer une valeur de {0} \u00e0 {1}. -message.validate.URL=Veuillez entrer une URL valide. -message.virtual.network.desc=Un r\u00e9seau virtuel d\u00e9di\u00e9 pour votre compte. Ce domaine de multi-diffusion est contenu dans un VLAN et l\\'ensemble des r\u00e9seaux d\\'acc\u00e8s publique sont rout\u00e9s par un routeur virtuel. -message.vm.create.template.confirm=Cr\u00e9er un mod\u00e8le va red\u00e9marrer la VM automatiquement -message.vm.review.launch=Merci de v\u00e9rifier les informations suivantes et de confirmer que votre instance virtuelle est correcte avant de la d\u00e9marrer. -message.vnmc.available.list=VNMC n\\'est pas disponible dans la liste des fournisseurs. -message.vnmc.not.available.list=VNMC n\\'est pas disponible dans la liste des fournisseurs. -message.volume.create.template.confirm=Cr\u00e9er un mod\u00e8le pour ce disque ? La cr\u00e9ation peut prendre plusieurs minutes, voir plus, selon la taille du volume. -message.waiting.for.builtin.templates.to.load=Attendre le chargement des mod\u00e8les pr\u00e9-construit... -message.XSTools61plus.update.failed=\u00c9chec de mise \u00e0 jour champ XenServer Tools Version 6.1\\+. Erreur \: -message.you.must.have.at.least.one.physical.network=Vous devez avoir au moins un r\u00e9seau physique -message.your.cloudstack.is.ready=Votre CloudStack est pr\u00eat \! -message.Zone.creation.complete=Cr\u00e9ation de la zone termin\u00e9e -message.zone.creation.complete.would.you.like.to.enable.this.zone=Cr\u00e9ation de la zone termin\u00e9e. Voulez-vous l\\'activer ? -message.zone.no.network.selection=La zone s\u00e9lectionn\u00e9e ne propose pas le r\u00e9seau choisi -message.zone.step.1.desc=S\u00e9lectionnez un mod\u00e8le de r\u00e9seau pour votre zone. -message.zone.step.2.desc=Renseigner les informations suivantes pour ajouter une nouvelle zone -message.zone.step.3.desc=Renseigner les informations suivantes pour ajouter un nouveau pod -message.zoneWizard.enable.local.storage=ATTENTION \: si vous activez le stockage local pour cette zone, vous devez effectuer les op\u00e9rations suivantes, selon l\\'endroit o\u00f9 vous souhaitez lancer vos machines virtuelles Syst\u00e8mes \:

1. Si les machines virtuelles Syst\u00e8mes doivent \u00eatre lanc\u00e9es depuis le stockage primaire, ce dernier doit \u00eatre ajout\u00e9 \u00e0 la zone apr\u00e8s la cr\u00e9ation. Vous devez \u00e9galement d\u00e9marrer la zone dans un \u00e9tat d\u00e9sactiv\u00e9.

2. Si les machines virtuelles Syst\u00e8mes doivent \u00eatre lanc\u00e9es depuis le stockage local, le param\u00e8tre system.vm.use.local.storage doit \u00eatre d\u00e9fini \u00e0 \\'true\\' avant d\\'activer la zone.


Voulez-vous continuer ? -messgae.validate.min=Veuillez entrer une valeur sup\u00e9rieure ou \u00e9gale \u00e0 {0}. -mode=Mode -network.rate=D\u00e9bit R\u00e9seau -notification.reboot.instance=Red\u00e9marrer l\\'instance -notification.start.instance=D\u00e9marrer l\\'instance -notification.stop.instance=Stopper l\\'instance -side.by.side=C\u00f4te \u00e0 c\u00f4te -state.Accepted=Accept\u00e9 -state.Active=Actif -state.Allocated=Allou\u00e9 -state.Allocating=Allocation en cours -state.BackedUp=Sauvegard\u00e9 -state.BackingUp=Sauvegarde en cours -state.Completed=Termin\u00e9 -state.Creating=Cr\u00e9ation en cours -state.Declined=Refus\u00e9 -state.Destroyed=Supprim\u00e9e -state.detached=D\u00e9tach\u00e9 -state.Disabled=D\u00e9sactiv\u00e9 -state.Enabled=Actifs -state.Error=Erreur -state.Expunging=Purge en cours -state.Migrating=Migration en cours -state.Pending=En attente -state.Ready=Pr\u00eat -state.Running=D\u00e9marr\u00e9e -state.Starting=D\u00e9marrage en cours -state.Stopped=Arr\u00eat\u00e9e -state.Stopping=Arr\u00eat en cours -state.Suspended=Suspendu -title.upload.volume=T\u00e9l\u00e9verser Volume -ui.listView.filters.all=Tous -ui.listView.filters.mine=Les miennes diff --git a/client/WEB-INF/classes/resources/messages_hu.properties b/client/WEB-INF/classes/resources/messages_hu.properties deleted file mode 100644 index 7497b8faf6ec..000000000000 --- a/client/WEB-INF/classes/resources/messages_hu.properties +++ /dev/null @@ -1,2193 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Az elem tulajdons\u00e1gai megv\u00e1ltoztak -confirm.enable.s3=T\u00f6ltsd ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat az S3 m\u00e1sodlagos t\u00e1r bekapcsol\u00e1s\u00e1hoz\! -confirm.enable.swift=T\u00f6ltsd ki a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat a Swift t\u00e1mogat\u00e1s bekapcsol\u00e1s\u00e1hoz\! -error.could.not.change.your.password.because.ldap.is.enabled=Nem siker\u00fclt megv\u00e1ltoztatni a jelszavadat, mert az LDAP be van kapcsolva. -error.could.not.enable.zone=A z\u00f3na enged\u00e9lyez\u00e9se sikertelen -error.installWizard.message=Valami nem siker\u00fclt, visszamehetsz kijav\u00edtani a hib\u00e1kat. -error.invalid.username.password=\u00c9rv\u00e9nytelen felhaszn\u00e1l\u00f3n\u00e9v vagy jelsz\u00f3 -error.login=A felhaszn\u00e1l\u00f3n\u00e9v/jelsz\u00f3 p\u00e1r nem \u00e9rv\u00e9nyes. -error.menu.select=A m\u0171velet nem hajthat\u00f3 v\u00e9gre, mert nincsenek kiv\u00e1lasztott elemek. -error.mgmt.server.inaccessible=A vez\u00e9rl\u0151 szerver nem \u00e9rhet\u0151 el. Pr\u00f3b\u00e1ld \u00fajra k\u00e9s\u0151bb\! -error.password.not.match=A jelszavak nem egyeznek. -error.please.specify.physical.network.tags=A h\u00e1l\u00f3zati aj\u00e1nlatok nem \u00e9rhet\u0151ek el addig, am\u00edg meg nem adsz c\u00edmk\u00e9ket a fizikai h\u00e1l\u00f3tathoz. -error.session.expired=A munkamenet lej\u00e1rt. -error.something.went.wrong.please.correct.the.following=Valami nem j\u00f3\! Jav\u00edtsd a k\u00f6vetkez\u0151ket\: -error.unable.to.reach.management.server=A vez\u00e9rl\u0151 szerver nem el\u00e9rhet\u0151 -error.unresolved.internet.name=Az internet neved nem oldhat\u00f3 fel. -force.delete.domain.warning=Figyelmeztet\u00e9s\: Ha ezt v\u00e1lasztod, t\u00f6rl\u0151dni fog minden al\u00e1rendelt dom\u00e9n \u00e9s minden kapcsol\u00f3d\u00f3 sz\u00e1mla \u00e9s a hozz\u00e1juk tartoz\u00f3 er\u0151forr\u00e1sok. -force.delete=T\u00f6rl\u00e9s kik\u00e9nyszer\u00edt\u00e9se -force.remove=Elt\u00e1vol\u00edt\u00e1s kik\u00e9nyszer\u00edt\u00e9se -force.remove.host.warning=Figyelmeztet\u00e9s\: Ha ezt az opci\u00f3t v\u00e1lasztod, a CloudStack minden virtu\u00e1lis g\u00e9pet le\u00e1ll\u00edt miel\u0151tt elt\u00e1vol\u00edtja a kiszolg\u00e1l\u00f3t a f\u00fcrtb\u0151l. -force.stop.instance.warning=Figyelmeztet\u00e9s\: A p\u00e9ld\u00e1ny er\u0151szakos le\u00e1ll\u00edt\u00e1sa az utols\u00f3 lehet\u0151s\u00e9g. Ez adatveszt\u00e9shez \u00e9s a virtu\u00e1lis g\u00e9p inkonzisztens viselked\u00e9s\u00e9hez vezethet. -force.stop=Le\u00e1ll\u00e1s kik\u00e9nyszer\u00edt\u00e9se -hint.no.host.tags=Nincsenek kiszolg\u00e1l\u00f3 c\u00edmk\u00e9k -hint.no.storage.tags=Nincsenek t\u00e1r c\u00edmk\u00e9k -hint.type.part.host.tag=\u00cdrd be egy kiszolg\u00e1l\u00f3 c\u00edmke r\u00e9sz\u00e9t -hint.type.part.storage.tag=\u00cdrd be egy t\u00e1r c\u00edmke r\u00e9sz\u00e9t -ICMP.code=ICMP k\u00f3d -ICMP.type=ICMP t\u00edpus -image.directory=Image K\u00f6nyvt\u00e1r -inline=Inline -instances.actions.reboot.label=P\u00e9ld\u00e1ny \u00fajraind\u00edt\u00e1sa -label.about.app=A CloudStack-r\u0151l -label.about=N\u00e9vjegy -label.accept.project.invitation=Project-megh\u00edv\u00f3 elfogad\u00e1sa -label.account.and.security.group=Sz\u00e1mla, biztons\u00e1gi csoport -label.account.details=Sz\u00e1mla r\u00e9szletei -label.account.id=Sz\u00e1mla azonos\u00edt\u00f3 -label.account.lower=sz\u00e1mla -label.account.name=Sz\u00e1mla n\u00e9v -label.account.specific=Sz\u00e1mla-specifikus -label.accounts=Sz\u00e1ml\u00e1k -label.account=Sz\u00e1mla -label.account.type=Sz\u00e1mla t\u00edpus -label.acl=ACL -label.acl.id=ACL ID -label.acl.name=ACL n\u00e9v -label.acl.replaced=ACL lehelyettes\u00edtve -label.acquire.new.ip=\u00daj IP c\u00edm beszerz\u00e9se -label.acquire.new.secondary.ip=\u00daj m\u00e1sodlagos IP c\u00edm beszerz\u00e9se -label.action.attach.disk=Merevlemez csatlakoztat\u00e1sa -label.action.attach.disk.processing=Merevlemez csatlakoztat\u00e1sa... -label.action.attach.iso=ISO csatlakoztat\u00e1sa -label.action.attach.iso.processing=ISO csatlakoztat\u00e1sa... -label.action.cancel.maintenance.mode=Karbantart\u00e1si m\u00f3d megszak\u00edt\u00e1sa -label.action.cancel.maintenance.mode.processing=Karbantart\u00e1si m\u00f3d megszak\u00edt\u00e1sa... -label.action.change.password=Jelsz\u00f3 csere -label.action.change.service.processing=Szolg\u00e1ltat\u00e1s v\u00e1ltoztat\u00e1sa... -label.action.change.service=Szolg\u00e1ltat\u00e1s v\u00e1ltoztat\u00e1sa -label.action.copy.ISO=ISO m\u00e1sol\u00e1sa -label.action.copy.ISO.processing=ISO m\u00e1sol\u00e1sa... -label.action.copy.template.processing=Sablon m\u00e1sol\u00e1sa... -label.action.copy.template=Sablon m\u00e1sol\u00e1sa -label.action.create.template.from.vm=Sablon l\u00e9trehoz\u00e1sa VM-b\u0151l -label.action.create.template.from.volume=Sablon l\u00e9trehoz\u00e1sa k\u00f6tetb\u0151l -label.action.create.template.processing=Sablon l\u00e9trehoz\u00e1sa... -label.action.create.template=Sablon l\u00e9trehoz\u00e1sa -label.action.create.vm.processing=VM l\u00e9trehoz\u00e1sa... -label.action.create.vm=VM l\u00e9trehoz\u00e1sa -label.action.create.volume=K\u00f6tet l\u00e9trehoz\u00e1sa -label.action.create.volume.processing=K\u00f6tet l\u00e9trehoz\u00e1sa.... -label.action.delete.account.processing=Sz\u00e1mla t\u00f6rl\u00e9se... -label.action.delete.account=Sz\u00e1mla t\u00f6rl\u00e9se -label.action.delete.cluster=F\u00fcrt t\u00f6rl\u00e9se -label.action.delete.cluster.processing=F\u00fcrt t\u00f6rl\u00e9se... -label.action.delete.disk.offering.processing=T\u00e1r aj\u00e1nlat t\u00f6rl\u00e9se... -label.action.delete.disk.offering=T\u00e1r aj\u00e1nlat t\u00f6rl\u00e9se -label.action.delete.domain=Dom\u00e9n t\u00f6rl\u00e9se -label.action.delete.domain.processing=Dom\u00e9n t\u00f6rl\u00e9se... -label.action.delete.firewall.processing=T\u0171zfal t\u00f6rl\u00e9se... -label.action.delete.firewall=T\u0171zfal szab\u00e1ly t\u00f6rl\u00e9se -label.action.delete.ingress.rule=Ingress szab\u00e1ly t\u00f6rl\u00e9se -label.action.delete.ingress.rule.processing=Ingress szab\u00e1ly t\u00f6rl\u00e9se... -label.action.delete.IP.range=IP c\u00edmtartom\u00e1ny t\u00f6rl\u00e9se -label.action.delete.IP.range.processing=IP c\u00edmtartom\u00e1ny t\u00f6rl\u00e9se... -label.action.delete.ISO=ISO t\u00f6rl\u00e9se -label.action.delete.ISO.processing=ISO t\u00f6rl\u00e9se... -label.action.delete.load.balancer.processing=Terhel\u00e9seloszt\u00f3 t\u00f6rl\u00e9se... -label.action.delete.load.balancer=Terhel\u00e9seloszt\u00f3 szab\u00e1ly t\u00f6rl\u00e9se -label.action.delete.network=H\u00e1l\u00f3zat t\u00f6rl\u00e9se -label.action.delete.network.processing=H\u00e1l\u00f3zat t\u00f6rl\u00e9se... -label.action.delete.nexusVswitch=Nexus 1000v t\u00f6rl\u00e9se -label.action.delete.nic=NIC elt\u00e1vol\u00edt\u00e1sa -label.action.delete.physical.network=Fizikai h\u00e1l\u00f3zat t\u00f6rl\u00e9se -label.action.delete.pod=Pod t\u00f6rl\u00e9se -label.action.delete.pod.processing=Pod t\u00f6rl\u00e9se... -label.action.delete.primary.storage=Els\u0151dleges t\u00e1r t\u00f6rl\u00e9se -label.action.delete.primary.storage.processing=Els\u0151dleges t\u00e1r t\u00f6rl\u00e9se... -label.action.delete.secondary.storage=M\u00e1sodlagos t\u00e1r t\u00f6rl\u00e9se -label.action.delete.secondary.storage.processing=M\u00e1sodlagos t\u00e1r t\u00f6rl\u00e9se... -label.action.delete.security.group=Biztons\u00e1gi csoport t\u00f6rl\u00e9se -label.action.delete.security.group.processing=Biztons\u00e1gi csoport t\u00f6rl\u00e9se... -label.action.delete.service.offering.processing=Szolg\u00e1ltat\u00e1s aj\u00e1nlat t\u00f6rl\u00e9se... -label.action.delete.service.offering=Szolg\u00e1ltat\u00e1s aj\u00e1nlat t\u00f6rl\u00e9se -label.action.delete.snapshot=Pillanatfelv\u00e9tel t\u00f6rl\u00e9se -label.action.delete.snapshot.processing=Pillanatfelv\u00e9tel t\u00f6rl\u00e9se... -label.action.delete.system.service.offering=Rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat t\u00f6rl\u00e9se -label.action.delete.template.processing=Sablon t\u00f6rl\u00e9se... -label.action.delete.template=Sablon t\u00f6rl\u00e9se -label.action.delete.user=Felhaszn\u00e1l\u00f3 t\u00f6rl\u00e9se -label.action.delete.user.processing=Felhaszn\u00e1l\u00f3 t\u00f6rl\u00e9se... -label.action.delete.volume=K\u00f6tet t\u00f6rl\u00e9se -label.action.delete.volume.processing=K\u00f6tet t\u00f6rl\u00e9se... -label.action.delete.zone.processing=Z\u00f3na t\u00f6rl\u00e9se... -label.action.delete.zone=Z\u00f3na t\u00f6rl\u00e9se -label.action.destroy.instance.processing=P\u00e9ld\u00e1ny elpuszt\u00edt\u00e1sa... -label.action.destroy.instance=P\u00e9ld\u00e1ny elpuszt\u00edt\u00e1sa -label.action.destroy.systemvm.processing=Rendszer VM elpuszt\u00edt\u00e1sa... -label.action.destroy.systemvm=Rendszer VM elpuszt\u00edt\u00e1sa -label.action.detach.disk=Merevlemez lev\u00e1laszt\u00e1sa -label.action.detach.disk.processing=Merevlemez lev\u00e1laszt\u00e1sa... -label.action.detach.iso=ISO lev\u00e1laszt\u00e1sa -label.action.detach.iso.processing=ISO lev\u00e1laszt\u00e1sa... -label.action.disable.account.processing=Sz\u00e1mla kikapcsol\u00e1sa... -label.action.disable.account=Sz\u00e1mla kikapcsol\u00e1sa -label.action.disable.cluster=F\u00fcrt kikapcsol\u00e1sa -label.action.disable.cluster.processing=F\u00fcrt kikapcsol\u00e1sa... -label.action.disable.nexusVswitch=Nexus 1000v kikapcsol\u00e1sa -label.action.disable.physical.network=Fizikikai h\u00e1l\u00f3zat kikapcsol\u00e1sa -label.action.disable.pod=Pod kikapcsol\u00e1sa -label.action.disable.pod.processing=Pod kikapcsol\u00e1sa... -label.action.disable.static.NAT.processing=Statikus NAT kikapcsol\u00e1sa... -label.action.disable.static.NAT=Statikus NAT kikapcsol\u00e1sa -label.action.disable.user=Felhaszn\u00e1l\u00f3 kikapcsol\u00e1sa -label.action.disable.user.processing=Felhaszn\u00e1l\u00f3 kikapcsol\u00e1sa... -label.action.disable.zone.processing=Z\u00f3na kikapcsol\u00e1sa... -label.action.disable.zone=Z\u00f3na kikapcsol\u00e1sa -label.action.download.ISO=ISO let\u00f6lt\u00e9se -label.action.download.template=Sablon let\u00f6lt\u00e9se -label.action.download.volume=K\u00f6tet let\u00f6lt\u00e9se -label.action.download.volume.processing=K\u00f6tet let\u00f6lt\u00e9se... -label.action.edit.account=Sz\u00e1mla enged\u00e9lyez\u00e9se -label.action.edit.disk.offering=Merevlemez aj\u00e1nlat szerkeszt\u00e9se -label.action.edit.domain=Dom\u00e9n szerkeszt\u00e9se -label.action.edit.global.setting=Glob\u00e1lis be\u00e1ll\u00edt\u00e1s szerkeszt\u00e9se -label.action.edit.host=Kiszolg\u00e1l\u00f3 szerkeszt\u00e9se -label.action.edit.instance=P\u00e9ld\u00e1ny szerkeszt\u00e9se -label.action.edit.ISO=ISO szerkeszt\u00e9se -label.action.edit.network=H\u00e1l\u00f3zat szerkeszt\u00e9se -label.action.edit.network.offering=H\u00e1l\u00f3zat aj\u00e1nlat szerkeszt\u00e9se -label.action.edit.network.processing=H\u00e1l\u00f3zat szerkeszt\u00e9se... -label.action.edit.pod=Pod szerkeszt\u00e9se -label.action.edit.primary.storage=Els\u0151dleges t\u00e1r szerkeszt\u00e9se -label.action.edit.resource.limits=Er\u0151forr\u00e1s korl\u00e1tok szerkeszt\u00e9se -label.action.edit.service.offering=Szolg\u00e1ltat\u00e1s aj\u00e1nlat szerkeszt\u00e9se -label.action.edit.template=Sablon szerkeszt\u00e9se -label.action.edit.user=Felhaszn\u00e1l\u00f3 szerkeszt\u00e9se -label.action.edit.zone=Z\u00f3na szerkeszt\u00e9se -label.action.enable.account.processing=Sz\u00e1mla szerkeszt\u00e9se... -label.action.enable.account=Sz\u00e1mla enged\u00e9lyez\u00e9se -label.action.enable.cluster=F\u00fcrt enged\u00e9lyez\u00e9se -label.action.enable.cluster.processing=F\u00fcrt enged\u00e9lyez\u00e9se... -label.action.enable.maintenance.mode=Karbantart\u00e1si \u00fczemm\u00f3d enged\u00e9lyez\u00e9se -label.action.enable.maintenance.mode.processing=Karbantart\u00e1si \u00fczemm\u00f3d enged\u00e9lyez\u00e9se... -label.action.enable.nexusVswitch=Nexus 1000v bekapcsol\u00e1sa -label.action.enable.physical.network=Fizikai h\u00e1l\u00f3zat bekapcsol\u00e1sa -label.action.enable.pod=Pod bekapcsol\u00e1sa -label.action.enable.pod.processing=Pod bekapcsol\u00e1sa... -label.action.enable.static.NAT.processing=Statikus NAT bekapcsol\u00e1sa... -label.action.enable.static.NAT=Statikus NAT bekapcsol\u00e1sa -label.action.enable.user=Felhaszn\u00e1l\u00f3 bekapcsol\u00e1sa -label.action.enable.user.processing=Felhaszn\u00e1l\u00f3 bekapcsol\u00e1sa... -label.action.enable.zone.processing=Z\u00f3na bekapcsol\u00e1sa.... -label.action.enable.zone=Z\u00f3na bekapcsol\u00e1sa -label.action.expunge.instance.processing=P\u00e9ld\u00e1ny t\u00f6rl\u00e9se... -label.action.expunge.instance=P\u00e9ld\u00e1ny t\u00f6rl\u00e9se -label.action.force.reconnect.processing=\u00dajrakapcsol\u00f3d\u00e1s... -label.action.force.reconnect=\u00dajracsatlakoz\u00e1s kik\u00e9nyszer\u00edt\u00e9se -label.action.generate.keys=Kulcsgener\u00e1l\u00e1s -label.action.generate.keys.processing=Kulcsgener\u00e1l\u00e1s.... -label.action.list.nexusVswitch=Nexus 1000v lista -label.action.lock.account.processing=Sz\u00e1mla z\u00e1r\u00e1sa... -label.action.lock.account=Sz\u00e1mla z\u00e1r\u00e1sa -label.action.manage.cluster=F\u00fcrt vez\u00e9rl\u00e9se -label.action.manage.cluster.processing=F\u00fcrt vez\u00e9rl\u00e9se... -label.action.migrate.instance.processing=P\u00e9ld\u00e1ny mozgat\u00e1sa... -label.action.migrate.instance=P\u00e9ld\u00e1ny k\u00f6lt\u00f6ztet\u00e9se -label.action.migrate.router.processing=Router mozgat\u00e1sa... -label.action.migrate.router=Router k\u00f6lt\u00f6ztet\u00e9se -label.action.migrate.systemvm.processing=Rendszer VM mozgat\u00e1sa... -label.action.migrate.systemvm=Rendszer VM k\u00f6lt\u00f6ztet\u00e9se -label.action=M\u0171velet -label.action.reboot.instance.processing=P\u00e9ld\u00e1ny \u00fajraind\u00edt\u00e1sa -label.action.reboot.instance=P\u00e9ld\u00e1ny \u00fajraind\u00edt\u00e1sa -label.action.reboot.router.processing=Router \u00fajraind\u00edt\u00e1sa... -label.action.reboot.router=Router \u00fajraind\u00edt\u00e1sa -label.action.reboot.systemvm.processing=Rendszer VM \u00fajraind\u00edt\u00e1sa -label.action.reboot.systemvm=Rendszer VM \u00fajraind\u00edt\u00e1sa -label.action.recurring.snapshot=Ism\u00e9tl\u0151d\u0151 pillanatfelv\u00e9telek -label.action.register.iso=ISO regisztr\u00e1ci\u00f3ja -label.action.register.template=Sablon regisztr\u00e1ci\u00f3ja URL-r\u0151l -label.action.release.ip=IP c\u00edm elenged\u00e9se -label.action.release.ip.processing=IP c\u00edm elenged\u00e9se -label.action.remove.host=Kiszolg\u00e1l\u00f3 elt\u00e1vol\u00edt\u00e1sa -label.action.remove.host.processing=Kiszolg\u00e1l\u00f3 elt\u00e1vol\u00edt\u00e1sa... -label.action.reset.password=Jelsz\u00f3 \u00fajrabe\u00e1ll\u00edt\u00e1sa -label.action.reset.password.processing=Jelsz\u00f3 \u00fajrabe\u00e1ll\u00edt\u00e1sa... -label.action.resize.volume=K\u00f6tet \u00e1tm\u00e9retez\u00e9se -label.action.resize.volume.processing=K\u00f6tet \u00e1tm\u00e9retez\u00e9se -label.action.resource.limits=Er\u0151forr\u00e1s korl\u00e1tok -label.action.restore.instance.processing=P\u00e9ld\u00e1ny helyre\u00e1ll\u00edt\u00e1sa... -label.action.restore.instance=P\u00e9ld\u00e1ny helyre\u00e1ll\u00edt\u00e1sa -label.action.revert.snapshot.processing=Vissza\u00e1ll\u00e1s pillanatfelv\u00e9telre... -label.action.revert.snapshot=Vissza\u00e1ll\u00e1s pillanatfelv\u00e9telre -label.actions=M\u0171veletek -label.action.start.instance.processing=P\u00e9ld\u00e1ny ind\u00edt\u00e1sa... -label.action.start.instance=P\u00e9ld\u00e1ny ind\u00edt\u00e1sa -label.action.start.router.processing=Router le\u00e1ll\u00edt\u00e1sa... -label.action.start.router=Router ind\u00edt\u00e1sa -label.action.start.systemvm.processing=Rendszer VM ind\u00edt\u00e1sa -label.action.start.systemvm=Rendszer VM ind\u00edt\u00e1sa -label.action.stop.instance.processing=P\u00e9ld\u00e1ny le\u00e1ll\u00edt\u00e1sa... -label.action.stop.instance=P\u00e9ld\u00e1ny le\u00e1ll\u00edt\u00e1sa -label.action.stop.router.processing=Router le\u00e1ll\u00edt\u00e1sa... -label.action.stop.router=Router le\u00e1ll\u00edt\u00e1sa -label.action.stop.systemvm.processing=Rendszer VM le\u00e1ll\u00edt\u00e1sa... -label.action.stop.systemvm=Rendszer VM le\u00e1ll\u00edt\u00e1sa -label.action.take.snapshot=Pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se -label.action.take.snapshot.processing=Pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se... -label.action.unmanage.cluster=F\u00fcrt vez\u00e9rl\u00e9s le\u00e1ll\u00edt\u00e1sa -label.action.unmanage.cluster.processing=F\u00fcrt vez\u00e9rl\u00e9s le\u00e1ll\u00edt\u00e1sa... -label.action.update.OS.preference=OS preferencia m\u00f3dos\u00edt\u00e1sa -label.action.update.OS.preference.processing=OS preferencia m\u00f3dos\u00edt\u00e1sa... -label.action.update.resource.count=Er\u0151forr\u00e1s sz\u00e1m m\u00f3dos\u00edt\u00e1sa -label.action.update.resource.count.processing=Er\u0151forr\u00e1s sz\u00e1m m\u00f3dos\u00edt\u00e1sa... -label.action.vmsnapshot.create=VM pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se -label.action.vmsnapshot.delete=VM pillanatfelv\u00e9tel k\u00e9sz\u00edt\u00e9se -label.action.vmsnapshot.revert=Vissza\u00e1ll\u00e1s VM pillanatfelv\u00e9telre -label.activate.project=Projekt aktiv\u00e1l\u00e1sa -label.active.sessions=Akt\u00edv munkamenetek -label.add.accounts=Sz\u00e1ml\u00e1k felv\u00e9tele -label.add.accounts.to=Sz\u00e1mla felv\u00e9tele\: -label.add.account=Sz\u00e1mla felv\u00e9tele -label.add.account.to.project=Sz\u00e1mla felv\u00e9tele a projekthez -label.add.ACL=ACL felv\u00e9tele -label.add.acl.list=ACL lista felv\u00e9tele -label.add.affinity.group=\u00daj affin\u00edt\u00e1si csoport felv\u00e9tele -label.add.baremetal.dhcp.device=Baremetal DHCP eszk\u00f6z felv\u00e9tele -label.add.baremetal.rack.configuration=Baremetal rack konfigur\u00e1ci\u00f3 felv\u00e9tele -label.add.BigSwitchBcf.device=BigSwitch BCF vez\u00e9rl\u0151 felv\u00e9tele -label.add.BrocadeVcs.device=Brocade Vcs Switch felv\u00e9tele -label.add.by=Add by -label.add.by.cidr=Add By CIDR -label.add.by.group=Add By Group -label.add.ciscoASA1000v=CiscoASA1000v er\u0151forr\u00e1s felv\u00e9tele -label.add.cluster=F\u00fcrt felv\u00e9tele -label.add.compute.offering=CPU aj\u00e1nlat felv\u00e9tele -label.add.direct.iprange=IP tartom\u00e1ny felv\u00e9tele -label.add.disk.offering=Merevlemez aj\u00e1nlat felv\u00e9tele -label.add.domain=Dom\u00e9n felv\u00e9tele -label.added.brocade.vcs.switch=Added new Brocade Vcs Switch -label.added.network.offering=H\u00e1l\u00f3zat aj\u00e1nlat felv\u00e9ve -label.added.new.bigswitch.bcf.controller=BigSwitch BCF vez\u00e9rl\u0151 felv\u00e9ve -label.added.nicira.nvp.controller=Added new Nicira NVP Controller -label.add.egress.rule=Kimen\u0151 szab\u00e1ly felv\u00e9tele -label.addes.new.f5=\u00daj F5 felv\u00e9tele -label.add.F5.device=F5 eszk\u00f6z felv\u00e9tele -label.add=Felv\u00e9tel -label.add.firewall=T\u0171zfal szab\u00e1ly felv\u00e9tele -label.add.globo.dns=GloboDNS felv\u00e9tele -label.add.gslb=GSLB felv\u00e9tele -label.add.guest.network=Vend\u00e9g h\u00e1l\u00f3zat felv\u00e9tele -label.add.host=Kiszolg\u00e1l\u00f3 felv\u00e9tele -label.adding.cluster=F\u00fcrt felv\u00e9tele -label.adding.failed=Hiba a felv\u00e9tel sor\u00e1n -label.adding=Felv\u00e9tel -label.adding.pod=Pod felv\u00e9tele -label.adding.processing=Felv\u00e9tel... -label.add.ingress.rule=Ingress szab\u00e1ly felv\u00e9tele -label.adding.succeeded=Sikeres felv\u00e9tel -label.adding.user=Felhaszn\u00e1l\u00f3 felv\u00e9tele -label.adding.zone=Z\u00f3na felv\u00e9tele -label.add.intermediate.certificate=K\u00f6zb\u00fcls\u0151 tan\u00fas\u00edtv\u00e1ny felv\u00e9tele -label.add.internal.lb=Bels\u0151 LB felv\u00e9tele -label.add.ip.range=IP c\u00edmtartom\u00e1ny felv\u00e9tele -label.add.isolated.guest.network=Izol\u00e1lt vend\u00e9g h\u00e1l\u00f3zat felv\u00e9tele -label.add.isolated.network=Izol\u00e1lt h\u00e1l\u00f3zat felv\u00e9tele -label.additional.networks=Tov\u00e1bbi h\u00e1l\u00f3zatok -label.add.ldap.account=LDAP hozz\u00e1f\u00e9r\u00e9s felv\u00e9tele -label.add.LDAP.account=LDAP sz\u00e1mla felv\u00e9tele -label.add.list.name=ACL lista n\u00e9v -label.add.load.balancer=Terhel\u00e9seloszt\u00f3 felv\u00e9tele -label.add.more=Tov\u00e1bbi felv\u00e9tele -label.add.netScaler.device=Netscaler eszk\u00f6z felv\u00e9tele -label.add.network.ACL=H\u00e1l\u00f3zati ACL felv\u00e9tele -label.add.network.acl.list=H\u00e1l\u00f3zati ACL lista felv\u00e9tele -label.add.network.device=Add Network Device -label.add.network=H\u00e1l\u00f3zat felv\u00e9tele -label.add.network.offering=H\u00e1l\u00f3zati aj\u00e1nlat felv\u00e9tele -label.add.new.F5=\u00daj F5 felv\u00e9tele -label.add.new.gateway=\u00daj \u00e1tj\u00e1r\u00f3 felv\u00e9tele -label.add.new.NetScaler=\u00daj NetScaler felv\u00e9tele -label.add.new.PA=\u00daj Palo Alto felv\u00e9tele -label.add.new.SRX=\u00daj SRX felv\u00e9tele -label.add.new.tier=\u00daj r\u00e9teg felv\u00e9tele -label.add.nfs.secondary.staging.store=Add NFS Secondary Staging Store -label.add.NiciraNvp.device=Nvp Controller felv\u00e9tele -label.add.NuageVsp.device=Nuage Virtualized Services Directory (VSD) felv\u00e9tele -label.add.OpenDaylight.device=OpenDaylight Controller hozz\u00e1ad\u00e1sa -label.add.PA.device=Palo Alto eszk\u00f6z felv\u00e9tele -label.add.physical.network=Fizikai h\u00e1l\u00f3zat felv\u00e9tele -label.add.pod=Pod felv\u00e9tele -label.add.portable.ip.range=Portolhat\u00f3 IP tartom\u00e1ny felv\u00e9tele -label.add.port.forwarding.rule=Port tov\u00e1bb\u00edt\u00f3 szab\u00e1ly felv\u00e9tele -label.add.primary.storage=Els\u0151dleges t\u00e1r felv\u00e9tele -label.add.private.gateway=Priv\u00e1t \u00e1tj\u00e1r\u00f3 felv\u00e9tele -label.add.region=R\u00e9gi\u00f3 felv\u00e9tele -label.add.resources=Er\u0151forr\u00e1sok felv\u00e9tele -label.add.route=\u00datvonal felv\u00e9tele -label.add.rule=Szab\u00e1ly felv\u00e9tele -label.add.secondary.storage=M\u00e1sodlagos t\u00e1r felv\u00e9tele -label.add.security.group=Biztons\u00e1gi csoport felv\u00e9tele -label.add.service.offering=Szolg\u00e1ltat\u00e1s aj\u00e1nlat felv\u00e9tele -label.add.SRX.device=SRX szk\u00f6z felv\u00e9tele -label.add.static.nat.rule=Statikus NAT szab\u00e1ly felv\u00e9tele -label.add.static.route=Statikus \u00fatvonal felv\u00e9tele -label.add.system.service.offering=Add System Service Offering -label.add.template=Sablon felv\u00e9tele -label.add.to.group=Felv\u00e9tel a csoportba -label.add.ucs.manager=UCS Manager felv\u00e9tele -label.add.userdata=Felhaszn\u00e1l\u00f3 adat -label.add.user=Felhaszn\u00e1l\u00f3 felv\u00e9tele -label.add.vlan=VLAN felv\u00e9tele -label.add.vms.to.lb=VM(ek) felv\u00e9tele a terhel\u00e9seloszt\u00f3 szab\u00e1lyba -label.add.vms=VM-ek felv\u00e9tele -label.add.VM.to.tier=VM felv\u00e9tele r\u00e9tegbe -label.add.vm=VM felv\u00e9tele -label.add.vmware.datacenter=VMware adatk\u00f6zpont felv\u00e9tele -label.add.vnmc.device=VNMC eszk\u00f6z felv\u00e9tele -label.add.vnmc.provider=VNMC szolg\u00e1ltat\u00f3 felv\u00e9tele -label.add.volume=K\u00f6tet felv\u00e9tele -label.add.vpc.offering=VPC aj\u00e1nlat felv\u00e9tele -label.add.vpc=VPC felv\u00e9tele -label.add.vpn.customer.gateway=VPN \u00fcgyf\u00e9lkapu felv\u00e9tele -label.add.VPN.gateway=VPN \u00e1tj\u00e1r\u00f3 felv\u00e9tele -label.add.vpn.user=VPN felhaszn\u00e1l\u00f3 felv\u00e9tele -label.add.vxlan=VXLAN felv\u00e9tele -label.add.zone=Z\u00f3na felv\u00e9tele -label.admin.accounts=Adminisztr\u00e1tor hozz\u00e1f\u00e9r\u00e9sek -label.admin=Adminisztr\u00e1tor -label.advanced=Halad\u00f3 -label.advanced.mode=Halad\u00f3 m\u00f3d -label.advanced.search=Halad\u00f3 keres\u00e9s -label.affinity=Affin\u00edt\u00e1s -label.affinity.group=Affin\u00edt\u00e1si csoport -label.affinity.groups=Affin\u00edt\u00e1si csoportok -label.agent.password=\u00dcgyn\u00f6k jelsz\u00f3 -label.agent.port=\u00dcgyn\u00f6k port -label.agent.state=\u00dcgyn\u00f6k \u00e1llapot -label.agent.username=\u00dcgyn\u00f6k felhaszn\u00e1l\u00f3n\u00e9v -label.agree=Elfogadom -label.alert.archived=Riaszt\u00e1s archiv\u00e1lva -label.alert.deleted=Riaszt\u00e1s t\u00f6r\u00f6lve -label.alert.details=Riaszt\u00e1s r\u00e9szletei -label.alert=Riaszt\u00e1s -label.algorithm=Algoritmus -label.allocated=Lek\u00f6t\u00f6ve -label.allocation.state=Lefoglal\u00e1s \u00e1llapota -label.allow=Enged\u00e9lyez -label.anti.affinity=Anti-affin\u00edt\u00e1s -label.anti.affinity.group=Anti-affin\u00edt\u00e1s csoport -label.anti.affinity.groups=Anti-affin\u00edt\u00e1s csoportok -label.api.key=API kulcs -label.api.version=API verzi\u00f3 -label.apply=Alkalmaz -label.app.name=CloudStack -label.archive.alerts=Riaszt\u00e1sok archiv\u00e1l\u00e1sa -label.archive=Archive -label.archive.events=Esem\u00e9nyek archiv\u00e1l\u00e1sa -label.assigned.vms=Hozz\u00e1rendelt VM-ek -label.assign=Hozz\u00e1rendel\u00e9s -label.assign.instance.another=P\u00e9ld\u00e1ny hozz\u00e1rendel\u00e9se m\u00e1sik sz\u00e1ml\u00e1hoz -label.assign.to.load.balancer=P\u00e9ld\u00e1ny hozz\u00e1rendel\u00e9se terhel\u00e9seloszt\u00f3hoz -label.assign.vms=VM-ek hozz\u00e1rendel\u00e9se -label.associated.network.id=Kapcsolt h\u00e1l\u00f3zat ID -label.associated.network=Kapcsolt h\u00e1l\u00f3zat -label.associated.profile=Kapacsolt profil -label.associate.public.ip=Publikus IP c\u00edm hozz\u00e1rendel\u00e9se -label.attached.iso=Kapcsolt ISO -label.author.email=Szerz\u0151 e-mail -label.author.name=Szerz\u0151 n\u00e9v -label.autoscale=AutoScale -label.autoscale.configuration.wizard=AutoScale konfigur\u00e1ci\u00f3 var\u00e1zsl\u00f3 -label.availability=El\u00e9rhet\u0151s\u00e9g -label.availability.zone=El\u00e9rhet\u0151s\u00e9gi z\u00f3na -label.availabilityZone=El\u00e9rhet\u0151s\u00e9gi z\u00f3na -label.available=El\u00e9rhet\u0151 -label.available.public.ips=El\u00e9rhet\u0151 publikus PI c\u00edmek -label.back=Vissza -label.bandwidth=S\u00e1vsz\u00e9less\u00e9g -label.baremetal.dhcp.devices=Baremetal DHCP eszk\u00f6z\u00f6k -label.baremetal.dhcp.provider=Baremetal DHCP szolg\u00e1ltat\u00f3 -label.baremetal.pxe.device=Baremetal PXE eszk\u00f6z felv\u00e9tele -label.baremetal.pxe.devices=Baremetal PXE eszk\u00f6z\u00f6k -label.baremetal.pxe.provider=Baremetal PXE szolg\u00e1ltat\u00f3 -label.baremetal.rack.configuration=Baremetal rack konfigur\u00e1ci\u00f3 -label.basic=Alap -label.basic.mode=Alap m\u00f3d -label.bigswitch.bcf.details=BigSwitch BCF r\u00e9szletek -label.bigswitch.bcf.nat=BigSwitch BCF NAT bekapcsolva -label.bigswitch.controller.address=BigSwitch BCF vez\u00e9rl\u0151 c\u00edm -label.blade.id=Blade ID -label.blades=Blade-k -label.bootable=Ind\u00edthat\u00f3 -label.broadcast.domain.range=Broadcast domain range -label.broadcast.domain.type=Broadcast Domain Type -label.broadcast.uri=Broadcast URI -label.broadcasturi=broadcasturi -label.broadcat.uri=Broadcast URI -label.brocade.vcs.address=Vcs Switch c\u00edm -label.brocade.vcs.details=Brocade Vcs Switch r\u00e9szletek -label.by.account=By Account -label.by.alert.type=Riaszt\u00e1s t\u00edpus szerint -label.by.availability=By Availability -label.by.date.end=D\u00e1tum szerint (v\u00e9g) -label.by.date.start=D\u00e1tum szerint (kezd\u0151) -label.by.domain=By Domain -label.by.end.date=By End Date -label.by.event.type=Esem\u00e9ny t\u00edpus szerint -label.by.level=By Level -label.by.pod=By Pod -label.by.role=By Role -label.by.start.date=By Start Date -label.by.state=By State -label.bytes.received=Fogadott byte-ok -label.bytes.sent=K\u00fcld\u00f6tt byte-ok -label.by.traffic.type=By Traffic Type -label.by.type=By Type -label.by.type.id=By Type ID -label.by.zone=By Zone -label.cache.mode=Write-cache Type -label.cancel=Megszak\u00edt\u00e1s -label.capacity.bytes=Byte kapac\u00edt\u00e1s -label.capacity.iops=IOPS kapac\u00edt\u00e1s -label.capacity=Kapac\u00edt\u00e1s -label.certificate=Server certificate -label.change.affinity=Affin\u00edt\u00e1s v\u00e1ltoztat\u00e1sa -label.change.service.offering=Change service offering -label.change.value=\u00c9rt\u00e9k v\u00e1ltoztat\u00e1sa -label.character=Karakter -label.chassis=H\u00e1z -label.checksum=ellen\u00f6rz\u0151 \u00f6sszeg -label.cidr.account=CIDR vagy sz\u00e1mla/biztons\u00e1gi csoport -label.cidr=CIDR -label.CIDR.list=CIDR lista -label.cidr.list=Forr\u00e1s CIDR -label.CIDR.of.destination.network=A c\u00e9l h\u00e1l\u00f3zat CIDR -label.cisco.nexus1000v.ip.address=Nexus 1000v IP c\u00edm -label.cisco.nexus1000v.password=Nexus 1000v jelsz\u00f3 -label.cisco.nexus1000v.username=Nexus 1000v felhaszn\u00e1l\u00f3n\u00e9v -label.ciscovnmc.resource.details=CiscoVNMC er\u0151forr\u00e1s r\u00e9szletek -label.clean.up=Takar\u00edt\u00e1s -label.clear.list=Lista t\u00f6rl\u00e9se -label.close=Bez\u00e1r\u00e1s -label.cloud.console=Cloud Management Console -label.cloud.managed=Cloud.com Managed -label.cluster=F\u00fcrt -label.cluster.name=F\u00fcrt n\u00e9v -label.clusters=F\u00fcrt -label.cluster.type=F\u00fcrt t\u00edpus -label.clvm=CLVM -label.code=K\u00f3d -label.community=K\u00f6z\u00f6ss\u00e9g -label.compute.and.storage=Sz\u00e1m\u00edt\u00e1s \u00e9s t\u00e1r -label.compute.offering=CPU aj\u00e1nlat -label.compute.offerings=Sz\u00e1m\u00edt\u00e1si aj\u00e1nlatok -label.compute=Sz\u00e1m\u00edt\u00e1s -label.configuration=Konfigur\u00e1ci\u00f3 -label.configure=Konfigur\u00e1ci\u00f3 -label.configure.ldap=LDAP konfigur\u00e1ci\u00f3ja -label.configure.network.ACLs=H\u00e1l\u00f3zati ACL-ek konfigur\u00e1ci\u00f3ja -label.configure.vpc=VPC konfigur\u00e1ci\u00f3ja -label.confirmation=Meger\u0151s\u00edt\u00e9s -label.confirm.password=Jelsz\u00f3 meger\u0151s\u00edt\u00e9s -label.congratulations=Gratul\u00e1ci\u00f3\! -label.conserve.mode=Conserve mode -label.console.proxy=Konzol proxy -label.console.proxy.vm=Konzol Proxy VM -label.continue.basic.install=Folytat\u00e1s alaptelep\u00edt\u00e9ssel -label.continue=Tov\u00e1bb -label.copying.iso=ISO m\u00e1sol\u00e1sa -label.corrections.saved=Jav\u00edt\u00e1sok mentve -label.counter=Sz\u00e1ml\u00e1l\u00f3 -label.cpu.allocated=CPU allok\u00e1lva -label.cpu.allocated.for.VMs=CPU lefoglalva a VM-ek r\u00e9sz\u00e9re -label.CPU.cap=CPU Cap -label.cpu=CPU -label.cpu.limits=CPU korl\u00e1tok -label.cpu.mhz=CPU (MHz) -label.cpu.utilized=CPU haszn\u00e1lat -label.created.by.system=Created by system -label.created=L\u00e9trehoz\u00e1s d\u00e1tuma -label.create.nfs.secondary.staging.storage=Create NFS Secondary Staging Store -label.create.nfs.secondary.staging.store=NFS m\u00e1sodlagos t\u00e1r l\u00e9trehoz\u00e1sa -label.create.project=Projekt l\u00e9trehoz\u00e1sa -label.create.ssh.key.pair=SSH kulcsp\u00e1r l\u00e9trehoz\u00e1sa -label.create.template=Sablon l\u00e9trehoz\u00e1sa -label.create.VPN.connection=VPN kapcsolat l\u00e9trehoz\u00e1sa -label.cross.zones=Cross Zones -label.custom.disk.iops=Egyedi IOPS -label.custom.disk.offering=Egyedi t\u00e1r aj\u00e1nlat -label.custom.disk.size=Egyedi merevlemez m\u00e9ret -label.custom=Egyedi -label.daily=Napi -label.data.disk.offering=Adat merevlemez aj\u00e1nlat -label.date=D\u00e1tum -label.day=Nap -label.day.of.month=H\u00f3nap napja -label.day.of.week=H\u00e9t napja -label.dc.name=DC n\u00e9v -label.dead.peer.detection=Dead Peer Detection -label.decline.invitation=Megh\u00edv\u00f3 elutas\u00edt\u00e1sa -label.dedicate.cluster=F\u00fcrt dedik\u00e1l\u00e1sa -label.dedicated=Dedik\u00e1lt -label.dedicate=Dedik\u00e1l\u00e1s -label.dedicated.vlan.vni.ranges=Dedik\u00e1lt VLAN/VNI tartom\u00e1nyok -label.dedicate.host=Kiszolg\u00e1l\u00f3 dedik\u00e1l\u00e1sa -label.dedicate.pod=Pod dedik\u00e1l\u00e1sa -label.dedicate.vlan.vni.range=Dedik\u00e1lt VLAN/VNI tartom\u00e1ny -label.dedicate.zone=Dedik\u00e1lt z\u00f3na -label.default=Alap\u00e9rtelmezett -label.default.egress.policy=Default egress policy -label.default.use=Alap\u00e9rtelmezett haszn\u00e1lat -label.default.view=Alap\u00e9rtelmezett n\u00e9zet -label.delete.acl.list=ACL lista t\u00f6rl\u00e9se -label.delete.affinity.group=Affin\u00edt\u00e1si csoport t\u00f6rl\u00e9se -label.delete.alerts=T\u00f6rl\u00e9s riaszt\u00e1sok -label.delete.baremetal.rack.configuration=Baremetal rack konfigur\u00e1ci\u00f3 t\u00f6rl\u00e9se -label.delete.BigSwitchBcf=BigSwitch BCF vez\u00e9rl\u0151 elt\u00e1vol\u00edt\u00e1sa -label.delete.BrocadeVcs=Brocade Vcs Switch t\u00f6rl\u00e9se -label.delete.ciscoASA1000v=CiscoASA1000v t\u00f6rl\u00e9se -label.delete.ciscovnmc.resource=CiscoVNMC er\u0151forr\u00e1s t\u00f6rl\u00e9se -label.delete.events=T\u00f6rl\u00e9s esem\u00e9nyek -label.delete.F5=F5 t\u00f6rl\u00e9se -label.delete.gateway=\u00c1tj\u00e1r\u00f3 t\u00f6rl\u00e9se -label.delete.internal.lb=Bels\u0151 LB t\u00f6rl\u00e9se -label.delete.NetScaler=NetScaler t\u00f6rl\u00e9se -label.delete.NiciraNvp=Nvp vez\u00e9rl\u0151 t\u00f6rl\u00e9se -label.delete.NuageVsp=Nuage VSD t\u00f6rl\u00e9se -label.delete.OpenDaylight.device=OpenDaylight Controller t\u00f6rl\u00e9se -label.delete.PA=Palo Alto t\u00f6rl\u00e9se -label.delete.portable.ip.range=Hordozhat\u00f3 IP tartom\u00e1ny t\u00f6rl\u00e9se -label.delete.profile=Profil t\u00f6rl\u00e9se -label.delete.project=Projekt t\u00f6rl\u00e9se -label.delete.secondary.staging.store=Delete Secondary Staging Store -label.delete.SRX=SRX t\u00f6rl\u00e9se -label.delete=T\u00f6rl\u00e9s -label.delete.ucs.manager=UCS Manager t\u00f6rl\u00e9se -label.delete.VPN.connection=VPN kapcsolat t\u00f6rl\u00e9se -label.delete.VPN.customer.gateway=VPN \u00fcgyf\u00e9l kapu t\u00f6rl\u00e9se -label.delete.VPN.gateway=VPN kapu t\u00f6rl\u00e9se -label.delete.vpn.user=VPN felhaszn\u00e1l\u00f3 t\u00f6rl\u00e9se -label.deleting.failed=T\u00f6rl\u00e9s sikertelen -label.deleting.processing=T\u00f6rl\u00e9s... -label.deny=Megtilt -label.deployment.planner=Felhaszn\u00e1l\u00e1s tervez\u0151 -label.description=Le\u00edr\u00e1s -label.destination.physical.network.id=C\u00e9l fizikai h\u00e1l\u00f3zat ID -label.destination.zone=C\u00e9l z\u00f3na -label.destroy=Elpuszt\u00edt -label.destroy.router=Router elpuszt\u00edt\u00e1sa -label.destroy.vm.graceperiod=VM elpuszt\u00edt\u00e1s t\u00fcrelmi id\u0151 -label.detaching.disk=Merevlemez lev\u00e1laszt\u00e1sa -label.details=R\u00e9szletek -label.device.id=Eszk\u00f6z ID -label.devices=Eszk\u00f6z\u00f6k -label.dhcp=DHCP -label.DHCP.server.type=DHCP kiszolg\u00e1l\u00f3 t\u00edpus -label.direct.attached.public.ip=Direct Attached Public IP -label.direct.ips=Osztott h\u00e1l\u00f3zati IP c\u00edmek -label.disable.autoscale=Automatikus sk\u00e1l\u00e1z\u00e1s kikapcsol\u00e1sa -label.disabled=Kikapcsolt -label.disable.host=Kiszolg\u00e1l\u00f3 kikapcsol\u00e1sa -label.disable.network.offering=H\u00e1l\u00f3zati aj\u00e1nlat kikapcsol\u00e1sa -label.disable.provider=Szolg\u00e1ltat\u00f3 kikapcsol\u00e1sa -label.disable.vnmc.provider=VNMC szolg\u00e1ltat\u00f3 kikapcsol\u00e1sa -label.disable.vpc.offering=VPC aj\u00e1nlat kikapcsol\u00e1sa -label.disable.vpn=T\u00e1voli VPN hozz\u00e1f\u00e9r\u00e9s kikapcsol\u00e1sa -label.disabling.vpn.access=VPN hozz\u00e1f\u00e9r\u00e9s kikapcsol\u00e1sa -label.disassociate.profile.blade=Profil elv\u00e1laszt\u00e1sa a blade-t\u0151l -label.disbale.vnmc.device=VNMC eszk\u00f6sz kikapcsol\u00e1sa -label.disk.allocated=Merevlemez lefoglalva -label.disk.bytes.read.rate=Olvas\u00e1si r\u00e1ta (BPS) -label.disk.bytes.write.rate=\u00cdr\u00e1si r\u00e1ta (BPS) -label.disk.iops.max=IOPS maximum -label.disk.iops.min=IOPS minimum -label.disk.iops.read.rate=Olvas\u00e1si r\u00e1ta (IOPS) -label.disk.iops.total=IOPS \u00f6sszesen -label.disk.iops.write.rate=\u00cdr\u00e1si r\u00e1ta (IOPS) -label.disk.offering.details=Merevlemez aj\u00e1nlat r\u00e9szletei -label.disk.offering=Merevlemez aj\u00e1nlat -label.disk.provisioningtype=L\u00e9trehoz\u00e1s t\u00edpusa -label.disk.read.bytes=Merevlemez olvas\u00e1s (Byte) -label.disk.read.io=Merevlemez \u00edr\u00e1s (IO) -label.disk.size.gb=Merevlemez m\u00e9ret (GB) -label.disk.size=Merevlemez m\u00e9ret -label.disk.total=Merevlemez \u00f6sszes -label.disk.volume=Merevlemez k\u00f6tet -label.disk.write.bytes=Merevlemez \u00edr\u00e1s (byte) -label.disk.write.io=Merevlemez \u00edr\u00e1s (IO) -label.display.name=Megjelen\u00edtend\u0151 n\u00e9v -label.display.text=Megjelen\u00edtend\u0151 sz\u00f6veg -label.distributedrouter=Elosztott router -label.dns.1=1. DNS -label.dns.2=2. DNS -label.dns=DNS -label.DNS.domain.for.guest.networks=Vend\u00e9g h\u00e1l\u00f3zatok DNS tartom\u00e1nya -label.domain.admin=Tartom\u00e1ny adminisztr\u00e1tor -label.domain=Dom\u00e9n -label.domain.id=Tartom\u00e1ny ID -label.domain.lower=domain -label.domain.name=Tartom\u00e1ny n\u00e9v -label.domain.router=Domain router -label.domain.suffix=DNS dom\u00e9n v\u00e9gz\u0151d\u00e9s (pl. xyz.com) -label.done=K\u00e9sz -label.double.quotes.are.not.allowed=A kett\u0151s id\u00e9z\u0151jel nem enged\u00e9lyezett -label.download.progress=Let\u00f6lt\u00e9s folyamat -label.drag.new.position=\u00daj helyre h\u00faz\u00e1s -label.duration.in.sec=Id\u0151tartam (mp) -label.dynamically.scalable=Dinakikusan sk\u00e1l\u00e1zhat\u00f3 -label.edit.acl.rule=ACL szab\u00e1ly szerkeszt\u00e9se -label.edit.affinity.group=Affin\u00edt\u00e1si csoport szerkeszt\u00e9se -label.edit.lb.rule=LB szab\u00e1ly m\u00f3dos\u00edt\u00e1sa -label.edit.network.details=H\u00e1l\u00f3zat r\u00e9szleteinek szerkeszt\u00e9se -label.edit.project.details=Projekt r\u00e9szletek szerkeszt\u00e9se -label.edit.region=R\u00e9gi\u00f3 szerkeszt\u00e9se -label.edit.rule=Szab\u00e1ly m\u00f3dos\u00edt\u00e1sa -label.edit.secondary.ips=M\u00e1sodlagos IP c\u00edmek m\u00f3dos\u00edt\u00e1sa -label.edit=Szerkeszt\u00e9s -label.edit.tags=Cimk\u00e9k szerkeszt\u00e9se -label.edit.traffic.type=Forgalom t\u00edpus szerkeszt\u00e9se -label.edit.vpc=VPC szerkeszt\u00e9se -label.egress.default.policy=Alap\u00e9rtelmezett egress szab\u00e1lyzat -label.egress.rule=Egress szab\u00e1ly -label.egress.rules=Egress szab\u00e1lyok -label.elastic=Elasztikus -label.elastic.IP=Elasztikus IP -label.elastic.LB=Elasztikus LB -label.email=Email -label.email.lower=email -label.enable.autoscale=Automatikus sk\u00e1l\u00e1z\u00e1s bekapcsol\u00e1sa -label.enable.host=Kiszolg\u00e1l\u00f3 bekapcsol\u00e1sa -label.enable.network.offering=H\u00e1l\u00f3zati aj\u00e1nlat bekapcsol\u00e1sa -label.enable.provider=Szolg\u00e1ltat\u00f3 bekapcsol\u00e1sa -label.enable.s3=S3-alap\u00fa m\u00e1sodlagos t\u00e1r bekapcsol\u00e1sa -label.enable.swift=Swift enged\u00e9lyez\u00e9se -label.enable.vnmc.device=VNMC eszk\u00f6z bekapcsol\u00e1sa -label.enable.vnmc.provider=VNMC szolg\u00e1ltat\u00f3 bekapcsol\u00e1sa -label.enable.vpc.offering=VPC aj\u00e1nlat bekapcsol\u00e1sa -label.enable.vpn=Enable Remote Access VPN -label.enabling.vpn.access=VPN hozz\u00e1f\u00e9r\u00e9s enged\u00e9lyez\u00e9se -label.enabling.vpn=VPN enged\u00e9lyez\u00e9se -label.end.IP=Utols\u00f3 IP -label.endpoint.or.operation=V\u00e9gpont vagy m\u0171velet -label.endpoint=V\u00e9gpont -label.end.port=Utols\u00f3 Port -label.end.reserved.system.IP=Utols\u00f3 elk\u00fcl\u00f6n\u00edtett rendszer IP -label.end.vlan=Utols\u00f3 VLAN -label.end.vxlan=Utols\u00f3 VXLAN -label.enter.token=Add meg a token-t\! -label.error.code=Hibak\u00f3d -label.error=Hiba -label.error.upper=ERROR -label.ESP.encryption=ESP titkos\u00edt\u00e1s -label.ESP.hash=ESP Hash -label.ESP.lifetime=ESP \u00e9lettartam (mp) -label.ESP.policy=ESP szab\u00e1lyzat -label.esx.host=ESX/ESXi kiszolg\u00e1l\u00f3 -label.event.archived=Esem\u00e9ny archiv\u00e1lva -label.event.deleted=Esem\u00e9ny t\u00f6r\u00f6lve -label.event=Esem\u00e9ny -label.every=Minden -label.example=P\u00e9lda -label.expunge=T\u00f6rl\u00e9s -label.external.link=K\u00fcls\u0151 hivatkoz\u00e1s -label.extractable=Kicsomagolhat\u00f3 -label.extractable.lower=kicsomagolhat\u00f3 -label.f5.details=F5 r\u00e9szletek -label.f5=F5 -label.failed=Hiba -label.featured=Kiemelt -label.fetch.latest=Legfrissebb let\u00f6lt\u00e9se -label.filterBy=Sz\u0171r\u00e9s -label.fingerprint=\u00dajlenyomat -label.firewall=T\u0171zfal -label.first.name=Keresztn\u00e9v -label.firstname.lower=keresztn\u00e9v -label.format=Form\u00e1tum -label.format.lower=form\u00e1tum -label.friday=P\u00e9ntek -label.full.path=Teljes el\u00e9r\u00e9si \u00fatvonal -label.full=Teljes -label.gateway=\u00c1tj\u00e1r\u00f3 -label.general.alerts=\u00c1ltal\u00e1nos riaszt\u00e1sok -label.generating.url=URL gener\u00e1l\u00e1sa -label.globo.dns.configuration=GloboDNS konfigur\u00e1ci\u00f3 -label.globo.dns=GloboDNS -label.gluster.volume=K\u00f6tet -label.go.step.2=2. l\u00e9p\u00e9sre -label.go.step.3=3. l\u00e9p\u00e9sre -label.go.step.4=4. l\u00e9p\u00e9sre -label.go.step.5=5. l\u00e9psre -label.gpu=CPU -label.group.by.account=Sz\u00e1ml\u00e1nk\u00e9nt csoportos\u00edtva -label.group.by.cluster=F\u00fcrt\u00f6nk\u00e9nt csoportos\u00edtva -label.group.by.pod=Pod-onk\u00e9nt csoportos\u00edtva -label.group.by.zone=Z\u00f3n\u00e1nk\u00e9nt csoportos\u00edtva -label.group=Csoport -label.group.optional=Csoport (opcion\u00e1lis) -label.gslb.assigned.lb=Hozz\u00e1rendelt terhel\u00e9seloszt\u00e1s -label.gslb.assigned.lb.more=T\u00f6bb terhel\u00e9seloszt\u00e1s hozz\u00e1rendel\u00e9se -label.gslb.delete=GSLB t\u00f6rl\u00e9se -label.gslb.details=GSLB r\u00e9szletek -label.gslb.domain.name=GSLB dom\u00e9n n\u00e9v -label.gslb=GSLB -label.gslb.lb.details=Terhel\u00e9seloszt\u00f3 r\u00e9szletek -label.gslb.lb.remove=Terhel\u00e9seloszt\u00e1s t\u00f6rl\u00e9se ebb\u0151l a GSLB-b\u0151l -label.gslb.lb.rule=Terhel\u00e9seloszt\u00f3 szab\u00e1ly -label.gslb.service=GSLB szolg\u00e1ltat\u00e1s -label.gslb.service.private.ip=GSLB szolg\u00e1ltat\u00e1s priv\u00e1t IP -label.gslb.service.public.ip=GSLB szolg\u00e1ltat\u00e1s publikus IP -label.gslb.servicetype=Szolg\u00e1ltat\u00e1s t\u00edpus -label.guest.cidr=Vend\u00e9g CIDR -label.guest.end.ip=Utols\u00f3 veng\u00e9g IP -label.guest.gateway=Vend\u00e9g \u00e1tj\u00e1r\u00f3 -label.guest.ip.range=Vend\u00e9g IP tartom\u00e1ny -label.guest.ip=Vend\u00e9g IP c\u00edm -label.guest.netmask=Vend\u00e9g h\u00e1l\u00f3zati maszk -label.guest.network.details=Vend\u00e9g h\u00e1l\u00f3zat r\u00e9szletek -label.guest.networks=Vend\u00e9g h\u00e1l\u00f3zatok -label.guest.start.ip=Kezd\u0151 vend\u00e9g IP -label.guest.traffic=Vend\u00e9g forgalom -label.guest.traffic.vswitch.name=Vend\u00e9g forgalom vSwitch n\u00e9v -label.guest.traffic.vswitch.type=Vend\u00e9g forgalom vSwitch t\u00edpus -label.guest.type=Vend\u00e9g t\u00edpus -label.guest=Vend\u00e9g -label.ha.enabled=HA bekapcsolva -label.health.check.advanced.options=Halad\u00f3 be\u00e1ll\u00edt\u00e1sok\: -label.health.check.configurations.options=Beall\u00edt\u00e1sok\: -label.health.check=Ellen\u0151rz\u00e9s -label.health.check.interval.in.sec=Ellen\u0151rz\u00e9s id\u0151k\u00f6z (mp) -label.health.check.message.desc=A terhel\u00e9seloszt\u00f3d aut\u00f3matikusan fog elen\u0151rz\u00e9seket v\u00e9grehajtani a cloudstack p\u00e9ld\u00e1nyokon \u00e9s a forgalmat a m\u0171k\u00f6d\u0151 p\u00e9ld\u00e1nyokhoz \u00edr\u00e1ny\u00edtja -label.healthy.threshold=Eg\u00e9szs\u00e9ges k\u00fcsz\u00f6b -label.help=Seg\u00edts\u00e9g -label.hide.ingress.rule=Ingress szab\u00e1ly rejt\u00e9se -label.hints=Tippek -label.home=Kezd\u0151lap -label.host=Kiszolg\u00e1l\u00f3 -label.host.MAC=Kiszolg\u00e1l\u00f3 MAC -label.host.name=Kiszolg\u00e1l\u00f3 n\u00e9v -label.hosts=Kiszolg\u00e1l\u00f3k -label.host.tag=Kiszolg\u00e1l\u00f3 c\u00edmke -label.host.tags=Kiszolg\u00e1l\u00f3 c\u00edmk\u00e9k -label.hourly=\u00d3r\u00e1nk\u00e9nt -label.hvm=HVM -label.hypervisor.capabilities=Hipervizor k\u00e9pess\u00e9gek -label.hypervisor=Hipervizor -label.hypervisors=Hipervizorok -label.hypervisor.snapshot.reserve=Hipervizor Snapshot Reserve -label.hypervisor.type=Hipervizor t\u00edpus -label.hypervisor.version=Hipervizor verzi\u00f3 -label.hyperv.traffic.label=HyperV Traffic Label -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=IKE titkos\u00edt\u00e1s -label.IKE.hash=IKE Hash -label.IKE.lifetime=IKE \u00e9lettartam (mp) -label.IKE.policy=IKE szab\u00e1lyzat -label.info=Inf\u00f3 -label.info.upper=INFO -label.ingress.rule=Ingress szab\u00e1ly -label.initiated.by=Kezdem\u00e9nyez\u0151 -label.inside.port.profile=Inside Port Profile -label.installWizard.addClusterIntro.subtitle=Mi a f\u00fcrt? -label.installWizard.addClusterIntro.title=Csin\u00e1ljunk egy f\u00fcrt\u00f6t\! -label.installWizard.addHostIntro.subtitle=Mi a kiszolg\u00e1l\u00f3? -label.installWizard.addHostIntro.title=Regisztr\u00e1ljunk egy kiszolg\u00e1l\u00f3t\! -label.installWizard.addPodIntro.subtitle=Mi a pod? -label.installWizard.addPodIntro.title=Csin\u00e1ljunk egy pod-ot\! -label.installWizard.addPrimaryStorageIntro.subtitle=Mi az els\u0151dleges t\u00e1r? -label.installWizard.addPrimaryStorageIntro.title=Hozzuk l\u00e9tre az els\u0151dleges t\u00e1rol\u00f3t\! -label.installWizard.addSecondaryStorageIntro.subtitle=Mi a m\u00e1sodlagos t\u00e1r? -label.installWizard.addSecondaryStorageIntro.title=Hozzuk l\u00e9tre a m\u00e1sodlagos t\u00e1rol\u00f3t\! -label.installWizard.addZoneIntro.subtitle=Mi a z\u00f3na? -label.installWizard.addZoneIntro.title=Hozzunk l\u00e9tre egy z\u00f3n\u00e1t\! -label.installWizard.addZone.title=Z\u00f3na l\u00e9troz\u00e1sa -label.installWizard.click.launch=Kattints az ind\u00edt\u00e1s gombra\! -label.installWizard.subtitle=Ez a p\u00e1rbesz\u00e9dablak seg\u00edt konfigur\u00e1lni a CloudStack&\#8482 rendszered -label.installWizard.title=\u00dcdv\u00f6z\u00f6l a CloudStack&\#8482 -label.instance.limits=P\u00e9ld\u00e1ny korl\u00e1tok -label.instance.name=P\u00e9ld\u00e1ny n\u00e9v -label.instance.port=P\u00e9ld\u00e1ny port -label.instance=P\u00e9ld\u00e1ny -label.instance.scaled.up=P\u00e9ld\u00e1ny \u00e1tm\u00e9retezve a k\u00e9rt aj\u00e1nlathoz -label.instances=P\u00e9ld\u00e1nyok -label.instanciate.template.associate.profile.blade=Instanciate Template and Associate Profile to Blade -label.intermediate.certificate=K\u00f6zb\u00fcls\u0151 tan\u00fas\u00edtv\u00e1ny {0} -label.internal.dns.1=1. bels\u0151 DNS -label.internal.dns.2=2. bels\u0151 DNS -label.internal.lb=Bels\u0151 LB -label.internal.lb.details=Bels\u0151 LB r\u00e9szletek -label.internallbvm=InternalLbVm -label.internal.name=Bels\u0151 n\u00e9v -label.interval.type=Id\u0151k\u00f6z t\u00edpus -label.introduction.to.cloudstack=Bemutatkozik a CloudStack&\#8482 -label.invalid.integer=\u00c9rv\u00e9nytelen eg\u00e9sz sz\u00e1m -label.invalid.number=\u00c9rv\u00e9nytelen sz\u00e1m -label.invitations=Megh\u00edv\u00f3k -label.invited.accounts=Megh\u00edvottak -label.invite=Meghiv\u00e1s -label.invite.to=Megh\u00edv\u00e1s\: -label.ip.address=IP c\u00edm -label.ipaddress=IP c\u00edm -label.ip.allocations=IP c\u00edmfoglal\u00e1sok -label.ip=IP -label.ip.limits=Publikus IP korl\u00e1tok -label.ip.or.fqdn=IP vagy FQDN -label.ip.range=IP tartom\u00e1ny -label.ip.ranges=IP tartom\u00e1nyok -label.IPsec.preshared.key=IPsec Preshared-Key -label.ips=IP c\u00edmek -label.ipv4.cidr=IPv4 CIDR -label.ipv4.dns1=IPv4 1. DNS -label.ipv4.dns2=IPv4 2. DNS -label.ipv4.end.ip=IPv4 utols\u00f3 IP -label.ipv4.gateway=IPv4 \u00e1tj\u00e1r\u00f3 -label.ipv4.netmask=IPv4 h\u00e1l\u00f3zati maszk -label.ipv4.start.ip=IPv4 kezd\u0151 IP -label.ipv6.address=IPv6 IP c\u00edm -label.ipv6.CIDR=IPv6 CIDR -label.ipv6.dns1=IPv6 1. DNS -label.ipv6.dns2=IPv6 2. DNS -label.ipv6.end.ip=IPv6 utols\u00f3 IP -label.ipv6.gateway=IPv6 \u00e1tj\u00e1r\u00f3 -label.ipv6.start.ip=IPv6 kezd\u0151 IP -label.iscsi=iSCSI -label.is.default=Alap\u00e9rtelmezett -label.iso.boot=ISO Boot -label.iso=ISO -label.isolated.networks=Izol\u00e1lt h\u00e1l\u00f3zatok -label.isolation.method=Izol\u00e1ci\u00f3 m\u00f3dszer -label.isolation.mode=Izol\u00e1ci\u00f3 m\u00f3d -label.isolation.uri=Izol\u00e1ci\u00f3 URI -label.is.redundant.router=Redund\u00e1ns -label.is.shared=Osztott -label.is.system=Rendszer -label.item.listing=Lista -label.japanese.keyboard=Jap\u00e1n billenty\u0171zet -label.keep.colon=Megtart\: -label.keep=Megtart\u00e1s -label.keyboard.language=Billenty\u0171zet kioszt\u00e1s -label.keyboard.type=Billenty\u0171zet t\u00edpus -label.key=Kulcs -label.kvm.traffic.label=KVM traffic label -label.label=C\u00edmke -label.lang.arabic=Arab -label.lang.brportugese=Brazil-portug\u00e1l -label.lang.catalan=Katal\u00e1n -label.lang.chinese=K\u00ednai (egyszer\u0171s\u00edtett) -label.lang.dutch=Holland (Hollandia) -label.lang.english=Angol -label.lang.french=Francia -label.lang.german=N\u00e9met -label.lang.hungarian=Magyar -label.lang.italian=Olasz -label.lang.japanese=Jap\u00e1n -label.lang.korean=K\u00f3reai -label.lang.norwegian=Norv\u00e9g -label.lang.polish=Lengyel -label.lang.russian=Orosz -label.lang.spanish=Spanyol -label.last.disconnected=Utolj\u00e1ra lecsatlakozott -label.last.name=Csal\u00e1dn\u00e9v -label.lastname.lower=csal\u00e1dn\u00e9v -label.latest.events=Utols\u00f3 esem\u00e9nyek -label.launch=Ind\u00edt\u00e1s -label.launch.vm=VM ind\u00edt\u00e1sa -label.launch.zone=Z\u00f3na ind\u00edt\u00e1sa -label.lb.algorithm.leastconn=Legkevesebb kapcsolat -label.lb.algorithm.roundrobin=K\u00f6rbe forg\u00f3 -label.lb.algorithm.source=Forr\u00e1s -label.LB.isolation=Terhel\u00e9seloszt\u00f3 izol\u00e1ci\u00f3 -label.ldap.configuration=LDAP konfigur\u00e1ci\u00f3 -label.ldap.group.name=LDAP csoport -label.ldap.link.type=T\u00edpus -label.ldap.port=LDAP port -label.level=Szint -label.linklocal.ip=Link Local IP Address -label.load.balancer=Terhel\u00e9seloszt\u00f3 -label.load.balancer.type=Terhel\u00e9seloszt\u00f3 t\u00edpus -label.load.balancing.policies=Terhel\u00e9seloszt\u00f3 szab\u00e1lyok -label.load.balancing=Terhel\u00e9seloszt\u00e1s -label.loading=Bet\u00f6lt\u00e9s -label.local.file=Helyi file -label.local=Helyi -label.local.storage.enabled=Helyi t\u00e1r bekapcsol\u00e1sa felhaszn\u00e1l\u00f3i VM-ek r\u00e9sz\u00e9re -label.local.storage.enabled.system.vms=Helyi t\u00e1r bekapcsol\u00e1sa a rendszer VM sz\u00e1m\u00e1ra -label.local.storage=Helyi t\u00e1r -label.login=Bejelentkez\u00e9s -label.logout=Kijelentkez\u00e9s -label.lun=LUN -label.LUN.number=LUN \# -label.lxc.traffic.label=LXC Traffic Label -label.make.project.owner=Sz\u00e1mla projekt-tulajdonoss\u00e1 t\u00e9tele -label.make.redundant=Redund\u00e1nss\u00e1 t\u00e9tel -label.managed=Vez\u00e9relt -label.management.ips=Vez\u00e9rl\u0151 IP c\u00edm -label.management.server=Vez\u00e9rl\u0151 szerver -label.management=Vez\u00e9rl\u00e9s -label.manage.resources=Er\u0151forr\u00e1sok vez\u00e9rl\u00e9se -label.manage=Vez\u00e9rl\u00e9s -label.max.cpus=CPU magok max. -label.max.guest.limit=Max guest limit -label.maximum=Maximum -label.max.instances=P\u00e9ld\u00e1nyok maxim\u00e1lis sz\u00e1ma -label.max.memory=Max. mem\u00f3ria (MB) -label.max.networks=Max. h\u00e1l\u00f3zatok -label.max.primary.storage=Max. els\u0151dleges (GiB) -label.max.public.ips=Publikus IP c\u00edmek max. -label.max.secondary.storage=Max. m\u00e1sodlagos (GiB) -label.max.snapshots=Pillanatfelv\u00e9telek max. -label.max.templates=Sablonok max. -label.max.vms=Felhaszn\u00e1l\u00f3i VMek max. -label.max.volumes=K\u00f6tetek max. -label.max.vpcs=VPC-k max. -label.may.continue=Most folytathatod -label.md5.checksum=MD5 ellen\u00f6rz\u0151\u00f6sszeg -label.memory.allocated=Allok\u00e1lt mem\u00f3ria -label.memory.limits=Mem\u00f3ria korl\u00e1tok (MiB) -label.memory.mb=Mem\u00f3ria (MB) -label.memory=Mem\u00f3ria -label.memory.total=Tejes mem\u00f3ria -label.memory.used=Haszn\u00e1lt mem\u00f3ria -label.menu.accounts=Sz\u00e1ml\u00e1k -label.menu.alerts=Riaszt\u00e1sok -label.menu.all.accounts=Minden sz\u00e1mla -label.menu.all.instances=Minden p\u00e9ld\u00e1ny -label.menu.community.isos=K\u00f6z\u00f6ss\u00e9gi ISO-k -label.menu.community.templates=K\u00f6z\u00f6ss\u00e9gi sablonok -label.menu.configuration=Konfigur\u00e1ci\u00f3 -label.menu.dashboard=M\u0171szert\u00e1bla -label.menu.destroyed.instances=Elpuszt\u00edtott p\u00e9ld\u00e1nyok -label.menu.disk.offerings=Merevlemez aj\u00e1nlatok -label.menu.domains=Dom\u00e9nek -label.menu.events=Esem\u00e9nyek -label.menu.featured.isos=Kiemelt ISO-k -label.menu.featured.templates=Kiemelt sablonok -label.menu.global.settings=Glob\u00e1lis be\u00e1ll\u00edt\u00e1sok -label.menu.infrastructure=Infrastrukt\u00fara -label.menu.instances=P\u00e9ld\u00e1nyok -label.menu.ipaddresses=IP c\u00edm -label.menu.isos=ISO-k -label.menu.my.accounts=Saj\u00e1t sz\u00e1ml\u00e1k -label.menu.my.instances=Saj\u00e1t p\u00e9ld\u00e1nyok -label.menu.my.isos=Saj\u00e1t ISO-k -label.menu.my.templates=Saj\u00e1t sablonok -label.menu.network=H\u00e1l\u00f3zatok -label.menu.network.offerings=H\u00e1l\u00f3zati aj\u00e1nlatok -label.menu.physical.resources=Fizikai er\u0151forr\u00e1sok -label.menu.regions=R\u00e9gi\u00f3k -label.menu.running.instances=Fut\u00f3 p\u00e9ld\u00e1nyok -label.menu.security.groups=Biztons\u00e1gi csoportok -label.menu.service.offerings=Szolg\u00e1ltat\u00e1s aj\u00e1nlatok -label.menu.snapshots=Pillanatfelv\u00e9telek -label.menu.sshkeypair=SSH kulcsp\u00e1r -label.menu.stopped.instances=Le\u00e1ll\u00edtott p\u00e9ld\u00e1nyok -label.menu.storage=T\u00e1r -label.menu.system=Rendszer -label.menu.system.service.offerings=Rendszer aj\u00e1nlatok -label.menu.system.vms=Rendszer VM-ek -label.menu.templates=Sablonok -label.menu.virtual.appliances=Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9kek -label.menu.virtual.resources=Virtu\u00e1lis er\u0151forr\u00e1sok -label.menu.volumes=K\u00f6tetek -label.menu.vpc.offerings=VPC aj\u00e1nlatok -label.metrics.allocated=Lek\u00f6t\u00f6ve -label.metrics.clusters=F\u00fcrt -label.metrics.cpu.allocated=CPU foglal\u00e1s -label.metrics.cpu.total=\u00d6sszes -label.metrics.cpu.usage=CPU haszn\u00e1lat -label.metrics.cpu.used.avg=Haszn\u00e1lt -label.metrics.disk.allocated=Lek\u00f6t\u00f6ve -label.metrics.disk.iops.total=IOPS -label.metrics.disk=Merevlemez -label.metrics.disk.read=Olvas\u00e1s -label.metrics.disk.size=M\u00e9ret -label.metrics.disk.storagetype=T\u00edpus -label.metrics.disk.total=\u00d6sszes -label.metrics.disk.unallocated=Lefoglalatlan -label.metrics.disk.used=Haszn\u00e1lt -label.metrics.disk.write=\u00cdr\u00e1s -label.metrics.hosts=Kiszolg\u00e1l\u00f3k -label.metrics.memory.allocated=Mem\u00f3ria foglal\u00e1s -label.metrics.memory.total=\u00d6sszes -label.metrics.memory.usage=Mem\u00f3ria haszn\u00e1lat -label.metrics.memory.used.avg=Haszn\u00e1lt -label.metrics.name=N\u00e9v -label.metrics.network.read=Olvas\u00e1s -label.metrics.network.usage=H\u00e1l\u00f3zat haszn\u00e1lat -label.metrics.network.write=\u00cdr\u00e1s -label.metrics.scope=Hat\u00e1ly -label.metrics.state=\u00c1llapot -label.metrics.storagepool=Storage Pool -label.metrics.vm.name=VM n\u00e9v -label.migrate.instance.to.host=P\u00e9ld\u00e1ny mozgat\u00e1sa m\u00e1sik kiszolg\u00e1l\u00f3ra -label.migrate.instance.to.ps=P\u00e9ld\u00e1ny mozgat\u00e1sa m\u00e1sik els\u0151dleges t\u00e1rra -label.migrate.instance.to=P\u00e9ld\u00e1ny mozgat\u00e1sa\: -label.migrate.lb.vm=Terhel\u00e9seloszt\u00f3 VM mozgat\u00e1sa -label.migrate.router.to=Router mozgat\u00e1sa\: -label.migrate.systemvm.to=Rendszer Vm mozgat\u00e1sa\: -label.migrate.to.host=Mozgat\u00e1s kiszolg\u00e1l\u00f3ra -label.migrate.to.storage=Mozgat\u00e1s t\u00e1rra -label.migrate.volume=K\u00f6tet mozgat\u00e1sa -label.migrate.volume.to.primary.storage=K\u00f6tet mozgat\u00e1sa m\u00e1sik els\u0151dleges t\u00e1rra -label.minimum=Minimum -label.min.instances=P\u00e9ld\u00e1nyok minim\u00e1lis sz\u00e1ma -label.min.past.the.hr=percben -label.minute.past.hour=Perc -label.minutes.past.hour=percben az eg\u00e9sz \u00f3ra ut\u00e1n -label.mode=M\u00f3d -label.monday=H\u00e9tf\u0151 -label.monthly=Havi -label.more.templates=Tov\u00e1bbi sablonok -label.move.down.row=Egy sorral lejjebb -label.move.to.bottom=Alj\u00e1ra -label.move.to.top=Tetej\u00e9re -label.move.up.row=Egy sorral feljebb -label.my.account=Saj\u00e1t sz\u00e1ml\u00e1m -label.my.network=Saj\u00e1t h\u00e1l\u00f3zat -label.my.templates=Saj\u00e1t sablonok -label.name.lower=N\u00e9v -label.name=N\u00e9v -label.name.optional=N\u00e9v (opcion\u00e1lis) -label.na=Nem \u00e9rtelmezett -label.nat.port.range=NAT port tartom\u00e1ny -label.netmask=H\u00e1l\u00f3zati maszk -label.netscaler.details=NetScaler r\u00e9szletek -label.netScaler=NetScaler -label.network.ACL=H\u00e1l\u00f3zati ACL -label.network.ACLs=H\u00e1l\u00f3zati ACL-ek -label.network.ACL.total=H\u00e1l\u00f3zati ACL \u00f6sszesen -label.network.addVM=H\u00e1l\u00f3zat felv\u00e9tele a VM-hez -label.network.cidr=H\u00e1l\u00f3zat CIDR -label.network.desc=H\u00e1l\u00f3zat le\u00edr\u00e1s -label.network.details=H\u00e1l\u00f3zat r\u00e9szletei -label.network.device=H\u00e1l\u00f3zati eszk\u00f6z -label.network.device.type=H\u00e1l\u00f3zati eszk\u00f6z t\u00edpus -label.network.domain=Network Domain -label.network.domain.text=Network domain -label.network=H\u00e1l\u00f3zatok -label.network.id=H\u00e1l\u00f3zat ID -label.networking.and.security=H\u00e1l\u00f3zat \u00e9s biztons\u00e1g -label.network.label.display.for.blank.value=Alap\u00e9rtelmezett \u00e1tj\u00e1r\u00f3 haszn\u00e1lata -label.network.limits=H\u00e1l\u00f3zat korl\u00e1tok -label.network.name=H\u00e1l\u00f3zat n\u00e9v -label.network.offering.details=H\u00e1l\u00f3zat aj\u00e1nlat r\u00e9szletei -label.network.offering.display.text=H\u00e1l\u00f3zat aj\u00e1nlat megjelen\u00edtend\u0151 sz\u00f6veg -label.network.offering=H\u00e1l\u00f3zat aj\u00e1nlat -label.network.offering.id=H\u00e1l\u00f3zat aj\u00e1nlat ID -label.network.offering.name=H\u00e1l\u00f3zat aj\u00e1nlat neve -label.network.rate=H\u00e1l\u00f3zati r\u00e1ta (Mb/mp) -label.network.rate.megabytes=H\u00e1l\u00f3zati r\u00e1ta (MB/mp) -label.network.read=H\u00e1l\u00f3zat olvas\u00e1s -label.network.service.providers=H\u00e1l\u00f3zat szolg\u00e1ltat\u00f3k -label.networks=H\u00e1l\u00f3zatok -label.network.type=H\u00e1l\u00f3zat t\u00edpus -label.network.write=H\u00e1l\u00f3zat \u00edr\u00e1s -label.new.password=\u00daj jelsz\u00f3 -label.new.project=\u00daj projekt -label.new.ssh.key.pair=\u00daj SSH kulcsp\u00e1r -label.new=\u00daj -label.new.vm=\u00daj VM -label.next=K\u00f6vetkez\u0151 -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=NFS kiszolg\u00e1l\u00f3 -label.nfs.storage=NFS t\u00e1r -label.nic.adapter.type=NIC adapter t\u00edpus -label.nicira.controller.address=Vez\u00e9rl\u0151 c\u00edm -label.nicira.l3gatewayserviceuuid=L3 Gateway Service Uuid -label.nicira.nvp.details=Nicira NVP r\u00e9szletek -label.nicira.transportzoneuuid=Transport Zone Uuid -label.nics=NIC-ek -label.no.actions=Nincs el\u00e9rhet\u0151 m\u0171velet -label.no.alerts=Nem voltak riaszt\u00e1sok a k\u00f6zelm\u00faltban -label.no.data=Nincs megjelen\u00edtend\u0151 adat -label.no.errors=Nem voltak hib\u00e1k a k\u00f6zelm\u00faltban -label.no.grouping=(nincs csoportos\u00edt\u00e1s) -label.no.isos=Nincsenek el\u00e9rhet\u0151 ISO-k -label.no.items=Nincsenek el\u00e9rhet\u0151 elemek -label.no=Nem -label.none=Nincs -label.no.security.groups=Nincs el\u00e9rhet\u0151 biztons\u00e1gi csoport -label.not.found=Nem tal\u00e1lhat\u00f3 -label.no.thanks=Nem, k\u00f6szi\! -label.notifications=\u00c9rtes\u00edt\u00e9sek -label.number.of.clusters=F\u00fcrt\u00f6k sz\u00e1ma -label.number.of.cpu.sockets=CPU-aljzatok sz\u00e1ma -label.number.of.hosts=Kiszolg\u00e1l\u00f3k sz\u00e1ma -label.number.of.pods=Pod-ok sz\u00e1ma\: -label.number.of.system.vms=Rendszer VM-ek sz\u00e1ma -label.number.of.virtual.routers=Virtu\u00e1lis routerek sz\u00e1ma -label.number.of.zones=Z\u00f3n\u00e1k sz\u00e1ma -label.num.cpu.cores=CPU magok sz\u00e1ma -label.numretries=\u00dajrapr\u00f3b\u00e1lkoz\u00e1sok sz\u00e1ma -label.ocfs2=OCFS2 -label.offer.ha=Offer HA -label.of.month=h\u00f3nap -label.ok=Rendben -label.opendaylight.controllerdetail=OpenDaylight vez\u00e9rl\u0151 r\u00e9szletek -label.opendaylight.controller=OpenDaylight vez\u00e9rl\u0151 -label.opendaylight.controllers=OpenDaylight vez\u00e9rl\u0151k -label.openDaylight=OpenDaylight -label.operator=Oper\u00e1tor -label.optional=Opcion\u00e1lis -label.order=Sorrend -label.os.preference=OS preferencia -label.os.type=OS t\u00edpus -label.other=M\u00e1s -label.outofbandmanagement.action=M\u0171velet -label.outofbandmanagement.password=Jelsz\u00f3 -label.outofbandmanagement.port=Port -label.outofbandmanagement.username=Felhaszn\u00e1l\u00f3n\u00e9v -label.override.guest.traffic=Vend\u00e9g forgalom fel\u00fclb\u00edr\u00e1l\u00e1sa -label.override.public.traffic=Publikus forgalom fel\u00fclb\u00edr\u00e1l\u00e1sa -label.ovm3.cluster=Nat\u00edv f\u00fcrt\u00f6z\u00e9s -label.ovm.traffic.label=OVM traffic label -label.ovs=OVS -label.owned.public.ips=Birtokolt publikus IP c\u00edmek -label.owner.account=Tulajdonos sz\u00e1mla -label.owner.domain=Owner Domain -label.palo.alto.details=Palo Alto r\u00e9szletek -label.PA.log.profile=Palo Alto log profil -label.PA=Palo Alto -label.parent.domain=Sz\u00fcl\u0151 dom\u00e9n -label.passive=Passz\u00edv -label.password.enabled=Jelsz\u00f3 bekapcsolva -label.password=Jelsz\u00f3 -label.password.lower=jelsz\u00f3 -label.password.reset.confirm=A jelsz\u00f3 \u00fajrabe\u00e1ll\u00edtva\: -label.PA.threat.profile=Palo Alto fenyeget\u00e9s profil -label.path=\u00datvonal -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.persistent=Perzisztens -label.physical.network=Fizikai h\u00e1l\u00f3zat -label.physical.network.ID=Fizikai h\u00e1l\u00f3zat ID -label.physical.network.name=A fizikai h\u00e1l\u00f3zat neve -label.PING.CIFS.password=PING CIFS jelsz\u00f3 -label.PING.CIFS.username=PING CIFS felhaszn\u00e1l\u00f3 -label.PING.dir=PING Directory -label.ping.path=Ping \u00fatvonal -label.PING.storage.IP=PING t\u00e1r IP -label.planner.mode=Tervez\u0151 m\u00f3d -label.please.complete.the.following.fields=K\u00e9rlek t\u00f6ltsd ki ki a k\u00f6vetkez\u0151 mez\u0151ket -label.please.specify.netscaler.info=Please specify Netscaler info -label.please.wait=K\u00e9rlek v\u00e1rj\! -label.plugin.details=Plugin r\u00e9szletek -label.plugins=Plugin-ek -label.pod.dedicated=Pod dedik\u00e1lva -label.pod.name=Pod n\u00e9v -label.pod=Pod -label.pods=Pod-ok -label.polling.interval.sec=Lek\u00e9rdez\u00e9s id\u0151k\u00f6ze (mp) -label.portable.ip=Mozgathat\u00f3 IP -label.portable.ip.range.details=Hordozhat\u00f3 IP tartom\u00e1ny r\u00e9szletek -label.portable.ip.ranges=Hordozhat\u00f3 IP tartom\u00e1nyok -label.portable.ips=Hordozhat\u00f3 IP c\u00edmek -label.port.forwarding.policies=Port forwarding policies -label.port.forwarding=Port tov\u00e1bb\u00edt\u00e1s -label.port=Port -label.port.range=Port tartom\u00e1ny -label.PreSetup=PreSetup -label.prev=El\u0151z\u0151 -label.previous=El\u0151z\u0151 -label.primary.allocated=Els\u0151dleges t\u00e1r elk\u00fcl\u00f6n\u00edtve -label.primary.network=Els\u0151dleges h\u00e1l\u00f3zat -label.primary.storage.count=Primary Storage Pools -label.primary.storage=Els\u0151dleges t\u00e1r -label.primary.storage.limits=Els\u0151dleges t\u00e1r korl\u00e1tok (GiB) -label.primary.used=Haszn\u00e1lt els\u0151dleges t\u00e1r -label.private.Gateway=Priv\u00e1t \u00e1tj\u00e1r\u00f3 -label.private.interface=Private Interface -label.private.ip=Priv\u00e1t IP c\u00edm -label.private.ip.range=Priv\u00e1t IP tartom\u00e1ny -label.private.ips=Priv\u00e1t IP c\u00edmek -label.privatekey=PKCS\#8 priv\u00e1t kulcs -label.private.key=Priv\u00e1t kulcs -label.private.network=Priv\u00e1t h\u00e1l\u00f3zat -label.private.port=Priv\u00e1t port -label.private.zone=Priv\u00e1t z\u00f3na -label.profile=Profil -label.project.dashboard=Projekt m\u0171szerfal -label.project.id=Projekt ID -label.project.invite=Megh\u00edv\u00e1s a projektbe -label.project.name=Projekt n\u00e9v -label.project=Projekt -label.projects=Projektek -label.project.view=Projekt n\u00e9zet -label.protocol.number=Protokoll sz\u00e1m -label.protocol=Protokol -label.providers=Szolg\u00e1ltat\u00f3k -label.provider=Szolg\u00e1ltat\u00f3 -label.public.interface=Public Interface -label.public.ip=Publikus IP c\u00edm -label.public.ips=Publikus IP c\u00edmek -label.public.key=Publikus kulcs -label.public.lb=Publikus LB -label.public.load.balancer.provider=Publikus terhel\u00e9seloszt\u00f3 szolg\u00e1ltat\u00f3 -label.public.network=Publikus h\u00e1l\u00f3zat -label.public.port=Publikus port -label.public=Publikus -label.public.traffic=Publikus forgalom -label.public.traffic.vswitch.name=Publikus forgalom vSwitch n\u00e9v -label.public.traffic.vswitch.type=Publikus forgalom vSwitch t\u00edpus -label.public.zone=Publikus z\u00f3na -label.purpose=Rendeltet\u00e9s -label.Pxe.server.type=Pxe szerver t\u00edpus -label.qos.type=QoS t\u00edpus -label.quickview=Gyorsn\u00e9zet -label.quiesce.vm=VM felf\u00fcggeszt\u00e9se -label.quiet.time.sec=V\u00e1rakoz\u00e1s (mp) -label.quota.date=D\u00e1tum -label.quota.enddate=V\u00e9g d\u00e1tum -label.quota.fullsummary=Minden sz\u00e1mla -label.quota.startdate=Kezd\u0151 d\u00e1tum -label.quota.state=\u00c1llapot -label.quota.total=\u00d6sszes -label.rbd.id=Cephx felhaszn\u00e1l\u00f3 -label.rbd.monitor=Ceph monitor -label.rbd.pool=Ceph pool -label.rbd=RBD -label.rbd.secret=Cephx secret -label.reboot=\u00dajraind\u00edt\u00e1s -label.recent.errors=Legut\u00f3bbi hib\u00e1k -label.recover.vm=VM helyre\u00e1ll\u00edt\u00e1sa -label.redundant.router.capability=Redund\u00e1ns router k\u00e9pess\u00e9g -label.redundant.router=Redund\u00e1ns router -label.redundant.state=Redund\u00e1ns \u00e1llapot -label.redundant.vpc=Redund\u00e1ns VPC -label.refresh.blades=Blade-k friss\u00edt\u00e9se -label.refresh=Frissit\u00e9s -label.region.details=R\u00e9gi\u00f3 r\u00e9szletek -label.regionlevelvpc=R\u00e9gi\u00f3 szint\u0171 VPC -label.region=R\u00e9gi\u00f3 -label.reinstall.vm=VM \u00fajratelep\u00edt\u00e9se -label.related=Kapcsol\u00f3d\u00f3 -label.release.account.lowercase=Release from account -label.release.account=Release from Account -label.release.dedicated.cluster=Dedik\u00e1lt f\u00fcrt elenged\u00e9se -label.release.dedicated.host=Dedik\u00e1lt kiszolg\u00e1l\u00f3 elenged\u00e9se -label.release.dedicated.pod=Dedik\u00e1lt pod elenged\u00e9se -label.release.dedicated.vlan.range=Dedik\u00e1lt VLAN tartom\u00e1ny elenged\u00e9se -label.release.dedicated.zone=Dedik\u00e1lt z\u00f3na elenged\u00e9se -label.remind.later=Eml\u00e9keztess k\u00e9s\u0151bb\! -label.remove.ACL=ACL elt\u00e1vol\u00edt\u00e1sa -label.remove.egress.rule=Egress szab\u00e1ly t\u00f6rl\u00e9se -label.remove.from.load.balancer=P\u00e9ld\u00e1ny elt\u00e1vol\u00edt\u00e1sa terhel\u00e9seloszt\u00f3b\u00f3l -label.remove.ingress.rule=Ingress szab\u00e1ly t\u00f6rl\u00e9se -label.remove.ip.range=IP tartom\u00e1ny elt\u00e1vol\u00edt\u00e1sa -label.remove.ldap=LDAP elt\u00e1vol\u00edt\u00e1sa -label.remove.network.offering=H\u00e1l\u00f3zati aj\u00e1nlat elt\u00e1vol\u00edt\u00e1sa -label.remove.pf=Port tov\u00e1bb\u00edt\u00f3 szab\u00e1ly elt\u00e1vol\u00edt\u00e1sa -label.remove.project.account=Sz\u00e1mla elt\u00e1vol\u00edt\u00e1sa a projektb\u0151l -label.remove.region=R\u00e9gi\u00f3 elt\u00e1vol\u00edt\u00e1sa -label.remove.rule=Szab\u00e1ly elt\u00e1vol\u00edt\u00e1sa -label.remove.ssh.key.pair=SSH kulcsp\u00e1r elt\u00e1vol\u00edt\u00e1sa -label.remove.static.nat.rule=Statikus NAT szab\u00e1ly elt\u00e1vol\u00edt\u00e1sa -label.remove.static.route=Remove static route -label.remove.this.physical.network=A fizikai h\u00e1l\u00f3zat elt\u00e1vol\u00edt\u00e1sa -label.remove.tier=R\u00e9teg elt\u00e1vol\u00edt\u00e1sa -label.remove.vm.from.lb=VM elt\u00e1vol\u00edt\u00e1sa terhel\u00e9seloszt\u00f3 szab\u00e1lyb\u00f3l -label.remove.vm.load.balancer=VM elt\u00e1vol\u00edt\u00e1sa a terhel\u00e9seloszt\u00f3b\u00f3l -label.remove.vmware.datacenter=VMware adatk\u00f6zpont elt\u00e1vol\u00edt\u00e1sa -label.remove.vpc.offering=VPC aj\u00e1nlat t\u00f6rl\u00e9se -label.remove.vpc=VPC elt\u00e1vol\u00edt\u00e1sa -label.removing=T\u00f6rl\u00e9s -label.removing.user=Felhaszn\u00e1l\u00f3 elt\u00e1vol\u00edt\u00e1sa -label.reource.id=Er\u0151forr\u00e1s ID -label.replace.acl=ACL csere -label.replace.acl.list=ACL lista cser\u00e9je -label.required=Sz\u00fcks\u00e9ges -label.requires.upgrade=Friss\u00edt\u00e9st ig\u00e9nyel -label.reserved.ip.range=Elk\u00fcl\u00f6n\u00edtett IP c\u00edmtartom\u00e1ny -label.reserved.system.gateway=Reserved system gateway -label.reserved.system.ip=Elk\u00fcl\u00f6n\u00edtett rendszer IP -label.reserved.system.netmask=Elk\u00fcl\u00f6n\u00edtett rendszer h\u00e1l\u00f3zati maszk -label.reset.ssh.key.pair.on.vm=SSH kulcsp\u00e1r \u00fajrabe\u00e1ll\u00edt\u00e1sa a VM-en -label.reset.ssh.key.pair=SSH kulcsp\u00e1r \u00fajrabe\u00e1ll\u00edt\u00e1sa -label.resetVM=VM \u00fajraind\u00edt\u00e1sa -label.reset.VPN.connection=VPN kapcsolat \u00fajraind\u00edt\u00e1sa -label.resize.new.offering.id=\u00daj aj\u00e1nlat -label.resize.new.size=\u00daj m\u00e9ret (GB) -label.resize.shrink.ok=Cs\u00f6kkent\u00e9s OK -label.resource=Er\u0151forr\u00e1s -label.resource.limit.exceeded=Er\u0151forr\u00e1s-korl\u00e1t t\u00fall\u00e9p\u00e9s -label.resource.limits=Er\u0151forr\u00e1s korl\u00e1tok -label.resource.name=Er\u0151forr\u00e1s n\u00e9v -label.resources=Er\u0151forr\u00e1sok -label.resource.state=Er\u0151forr\u00e1s \u00e1llapot -label.response.timeout.in.sec=V\u00e1lasz id\u0151t\u00fall\u00e9p\u00e9s (mp) -label.restart.network=H\u00e1l\u00f3zat \u00fajraind\u00edt\u00e1sa -label.restart.required=\u00dajraind\u00edt\u00e1s sz\u00fcks\u00e9ges -label.restart.vpc=VPC \u00fajraind\u00edt\u00e1sa -label.restore=Helyre\u00e1ll\u00edt\u00e1s -label.retry.interval=\u00dajraprob\u00e1lkoz\u00e1s id\u0151k\u00f6z -label.review=Ellen\u0151rz\u00e9s -label.revoke.project.invite=Megh\u00edv\u00f3 visszavon\u00e1sa -label.role=Szerep -label.root.certificate=F\u0151tan\u00fas\u00edtv\u00e1ny -label.root.disk.controller=Root disk controller -label.root.disk.offering=Root Disk Offering -label.router.vm.scaled.up=Router VM Scaled Up -label.routing.host=Routing kiszolg\u00e1l\u00f3 -label.routing=\u00datvonalv\u00e1laszt\u00e1s -label.rule.number=Szab\u00e1ly sz\u00e1m -label.rules=Szab\u00e1lyok -label.running.vms=Fut\u00f3 VM-ek -label.s3.access_key=Hozz\u00e1f\u00e9r\u00e9si kulcs -label.s3.bucket=Kos\u00e1r -label.s3.connection_timeout=Kapcsol\u00f3d\u00e1si id\u0151t\u00fall\u00e9p\u00e9s -label.s3.endpoint=V\u00e9gpont -label.s3.max_error_retry=\u00dajrapr\u00f3b\u00e1lkoz\u00e1s max. -label.s3.nfs.path=S3 NFS \u00fatvonal -label.s3.nfs.server=S3 NFS kiszolg\u00e1l\u00f3 -label.s3.secret_key=Titkos kulcs -label.s3.socket_timeout=Kapcsolat id\u0151t\u00fall\u00e9p\u00e9s -label.s3.use_https=HTTPS haszn\u00e1lata -label.saturday=Szombat -label.save.and.continue=Ment\u00e9s \u00e9s folytat\u00e1s -label.save.changes=V\u00e1ltoz\u00e1sok ment\u00e9se -label.save=Ment\u00e9s -label.saving.processing=Ment\u00e9s... -label.scaledown.policy=ScaleDown szab\u00e1lyzat -label.scale.up.policy=SCALE UP POLICY -label.scaleup.policy=ScaleUp szab\u00e1lyzat -label.scope=Hat\u00e1ly -label.search=Keres\u00e9s -label.secondary.ips=M\u00e1sodlagos IP c\u00edmek -label.secondary.isolated.vlan.id=M\u00e1sodlagos izol\u00e1lt VLAN ID -label.secondary.staging.store.details=Secondary Staging Store details -label.secondary.staging.store=Secondary Staging Store -label.secondary.storage.count=Secondary Storage Pools -label.secondary.storage.details=M\u00e1sodlagos t\u00e1r r\u00e9szletek -label.secondary.storage.limits=Secondary Storage limits (GiB) -label.secondary.storage=M\u00e1sodlagos t\u00e1r -label.secondary.storage.vm=Secondary storage VM -label.secondary.used=Haszn\u00e1lt m\u00e1sodlagos t\u00e1r -label.secret.key=Titkos kulcs -label.security.group=Biztons\u00e1gi csoport -label.security.group.name=Biztons\u00e1gi csoport n\u00e9v -label.security.groups=Biztons\u00e1gi csoportok -label.security.groups.enabled=Biztons\u00e1gi csoportok bekapcsolva -label.select.a.template=V\u00e1lassz egy sablont\! -label.select.a.zone=V\u00e1lassz egy z\u00f3n\u00e1t\! -label.select.instance.to.attach.volume.to=V\u00e1laszd ki a p\u00e9ld\u00e1nyt, amelyikhez a k\u00f6tetet csatlakoztatni szeretn\u00e9d\! -label.select.instance=V\u00e1laszd ki a p\u00e9d\u00e1nyt\! -label.select.iso.or.template=V\u00e1lassz ISO-t vagy sablont\! -label.select=Kiv\u00e1laszt\u00e1s -label.select.offering=V\u00e1lassz aj\u00e1nlatot\! -label.select.project=V\u00e1lassz projektet\! -label.select.region=R\u00e9gi\u00f3 kiv\u00e1laszt\u00e1sa -label.select.template=Sablon kiv\u00e1laszt\u00e1sa -label.select.tier=V\u00e1lassz r\u00e9teget\! -label.select-view=N\u00e9zet -label.select.vm.for.static.nat=V\u00e1lassz VM-et a statikus NAT-hoz -label.sent=Elk\u00fcld\u00f6tt -label.server=Szerver -label.service.capabilities=Szolg\u00e1ltat\u00e1s k\u00e9pess\u00e9gek -label.service.offering.details=Szolg\u00e1ltat\u00e1s aj\u00e1nlat r\u00e9szletei -label.service.offering=Szolg\u00e1ltat\u00e1s aj\u00e1nlat -label.services=Szolg\u00e1ltat\u00e1sok -label.service.state=Szolg\u00e1ltat\u00e1s \u00e1llapot -label.session.expired=A munkamenet lej\u00e1rt -label.set.default.NIC=Alap\u00e9rtelmezett NIC be\u00e1ll\u00edt\u00e1sa -label.settings=Be\u00e1ll\u00edt\u00e1sok -label.setup=Be\u00e1ll\u00edt\u00e1sok -label.setup.network=H\u00e1l\u00f3zat be\u00e1ll\u00edt\u00e1sa -label.set.up.zone.type=Z\u00f3na-t\u00edpus be\u00e1ll\u00edt\u00e1sa -label.setup.zone=Z\u00f3na be\u00e1ll\u00edt\u00e1sa -label.SharedMountPoint=SharedMountPoint -label.shared=Osztott -label.show.advanced.settings=Halad\u00f3 szint\u0171 be\u00e1ll\u00edt\u00e1sok -label.show.ingress.rule=Ingress szab\u00e1ly megjelen\u00edt\u00e9se -label.shutdown.provider=Szolg\u00e1ltat\u00f3 le\u00e1ll\u00edt\u00e1sa -label.simplified.chinese.keyboard=Egyszer\u0171s\u00edtett k\u00ednai billenty\u0171zet -label.site.to.site.VPN=Site-to-site VPN -label.size=M\u00e9ret -label.skip.guide=Haszn\u00e1ltam m\u00e1r a CloudStack-et, kihagyom ezt az \u00fatmutat\u00f3t -label.smb.domain=SMB dom\u00e9n -label.smb.password=SMB jelsz\u00f3 -label.smb.username=SMB felhaszn\u00e1l\u00f3n\u00e9v -label.snapshot.limits=Pillanatfelv\u00e9tel korl\u00e1tok -label.snapshot.name=Pillanatfelv\u00e9tel n\u00e9v -label.snapshot=Pillanatfelv\u00e9tel -label.snapshot.schedule=Ism\u00e9tl\u0151d\u0151 pillanatfelv\u00e9tel be\u00e1ll\u00edt\u00e1sa -label.snapshot.s=Pillanatfelv\u00e9telek -label.snapshots=Pillanatfelv\u00e9telek -label.SNMP.community=SNMP Community -label.SNMP.port=SNMP Port -label.sockets=CPU aljzatok -label.source.ip.address=Forr\u00e1s IP c\u00edm -label.source.nat=Forr\u00e1s NAT -label.source.nat.supported=SourceNAT Supported -label.source.port=Forr\u00e1s port -label.specify.IP.ranges=Add meg az IP tartom\u00e1nyokat\! -label.specify.vlan=VLAN megad\u00e1sa -label.specify.vxlan=VXLAN megad\u00e1sa -label.SR.name=SR Name-Label -label.srx.details=SRX r\u00e9szletek -label.srx=SRX -label.ssh.key.pair.details=SSH kucsp\u00e1r r\u00e9szletei -label.ssh.key.pair=SSH kulcsp\u00e1r -label.ssh.key.pairs=SSH kulcsp\u00e1rok -label.standard.us.keyboard=Amerikai (USA) szabv\u00e1nyos billenty\u0171zet -label.start.IP=Kezd\u0151 IP -label.start.lb.vm=Terhel\u00e9seloszt\u00f3 VM ind\u00edt\u00e1sa -label.start.port=Kezd\u0151 port -label.start.reserved.system.IP=Kezd\u0151 elk\u00fcl\u00f6n\u00edtett rendszer IP -label.start.vlan=Els\u0151 VLAN -label.start.vxlan=Els\u0151 VXLAN -label.state=\u00c1llapot -label.static.nat.enabled=Statikus NAT bekapcsolva -label.static.nat=Statikus NAT -label.static.nat.to=Statikus NAT c\u00e9lpont -label.static.nat.vm.details=Static NAT VM Details -label.static.routes=Statikus \u00fatvonalak -label.statistics=Statisztika -label.status=\u00c1llapot -label.step.1=1. l\u00e9p\u00e9s -label.step.1.title=1. l\u00e9p\u00e9s\: Sablon kiv\u00e1laszt\u00e1sa -label.step.2=2. l\u00e9p\u00e9s -label.step.2.title=2. l\u00e9p\u00e9s\: Szolg\u00e1ltat\u00e1s aj\u00e1nlat -label.step.3=3. l\u00e9p\u00e9s -label.step.3.title=3. l\u00e9p\u00e9s\: Merevlemez aj\u00e1nlat v\u00e1laszt\u00e1sa -label.step.4=4. l\u00e9p\u00e9s -label.step.4.title=4. l\u00e9p\u00e9s\: H\u00e1l\u00f3zat -label.step.5=5. l\u00e9p\u00e9s -label.step.5.title=5. l\u00e9p\u00e9s\: Ellen\u0151rz\u00e9s -label.stickiness.method=Stickiness method -label.stickiness=Stickiness -label.sticky.cookie-name=Cookie n\u00e9v -label.sticky.domain=Dom\u00e9n -label.sticky.expire=Lej\u00e1rat -label.sticky.holdtime=Hold time -label.sticky.indirect=Indirekt -label.sticky.length=Hossz -label.sticky.mode=M\u00f3d -label.sticky.name=Sticky Name -label.sticky.nocache=Nincs gyors\u00edt\u00f3t\u00e1r -label.sticky.postonly=Post only -label.sticky.prefix=El\u0151tag -label.sticky.request-learn=Request learn -label.sticky.tablesize=T\u00e1bla m\u00e9ret -label.stop.lb.vm=Terhel\u00e9seloszt\u00f3 VM le\u00e1ll\u00edt\u00e1sa -label.stopped.vms=Le\u00e1ll\u00edtott VM-ek -label.stop=\u00c1lj -label.storage.pool=Storage Pool -label.storage.tags=T\u00e1r c\u00edmk\u00e9k -label.storage.traffic=T\u00e1r forgalom -label.storage=T\u00e1r -label.storage.type=T\u00e1r t\u00edpus -label.subdomain.access=Subdomain Access -label.submit=Elk\u00fcld\u00e9s -label.submitted.by=[Bek\u00fcld\u0151\: ] -label.succeeded=Siker\u00fclt -label.sunday=Vas\u00e1rnap -label.super.cidr.for.guest.networks=Super CIDR for Guest Networks -label.supported.services=T\u00e1mogatott szolg\u00e1ltat\u00e1sok -label.supported.source.NAT.type=T\u00e1mogatott forr\u00e1s NAT t\u00edpus -label.supportsstrechedl2subnet=Supports Streched L2 Subnet -label.suspend.project=Projekt felf\u00fcggeszt\u00e9se -label.switch.type=Switch t\u00edpus -label.system.capacity=Rendszer kapac\u00edt\u00e1s -label.system.offering.for.router=Rendszer aj\u00e1nlat router-re -label.system.offering=Rendszer aj\u00e1nlat -label.system.service.offering.details=Rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat r\u00e9szletei -label.system.service.offering=Rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat -label.system.vm.details=Rendszer VM r\u00e9szletek -label.system.vm=Rendszer VM -label.system.vm.scaled.up=Rendszer VM felm\u00e9retezve -label.system.vms=Rendszer VM-ek -label.system.vm.type=Rendszer VM t\u00edpus -label.system.wide.capacity=Rendszer-szint\u0171 kapac\u00edt\u00e1s -label.tagged=Cimk\u00e9zve -label.tag.key=C\u00edmke kulcs -label.tags=Cimk\u00e9k -label.tag.value=C\u00edmke \u00e9rt\u00e9k -label.target.iqn=C\u00e9l IQN -label.task.completed=Feladat v\u00e9grehajtva -label.template.limits=Sablon korl\u00e1tok -label.template=Sablon -label.TFTP.dir=TFTP k\u00f6nyvt\u00e1r -label.tftp.root.directory=Tftp root directory -label.theme.default=Alap\u00e9rtelmezett t\u00e9ma -label.theme.grey=Egyedi - sz\u00fcrke -label.theme.lightblue=Egyedi - vil\u00e1gosk\u00e9k -label.threshold=K\u00fcsz\u00f6b\u00e9rt\u00e9k -label.thursday=Cs\u00fct\u00f6rt\u00f6k -label.tier.details=R\u00e9teg r\u00e9szletei -label.tier=R\u00e9teg -label.time.colon=Id\u0151\: -label.time=Id\u0151 -label.timeout=Id\u0151t\u00fall\u00e9p\u00e9s -label.timeout.in.second = Id\u0151t\u00fall\u00e9p\u00e9s (mp) -label.timezone.colon=Id\u0151z\u00f3na -label.time.zone=Id\u0151z\u00f3na -label.timezone=Id\u0151z\u00f3na -label.token=Token -label.total.cpu=\u00d6sszes CPU -label.total.CPU=\u00d6sszes CPU -label.total.hosts=\u00d6sszes kiszolg\u00e1l\u00f3 -label.total.memory=Mem\u00f3ria \u00f6sszesen -label.total.of.ip=IP c\u00edmek \u00f6sszesen -label.total.of.vm=\u00d6sszes VM -label.total.storage=\u00d6sszes t\u00e1r -label.total.virtual.routers=Total of Virtual Routers -label.total.virtual.routers.upgrade=Total of Virtual Routers that require upgrade -label.total.vms=\u00d6sszes VM -label.traffic.label=Forgalom c\u00edmke -label.traffic.type=Forgalom t\u00edpus -label.traffic.types=Forgalom t\u00edpusok -label.tuesday=Kedd -label.type.id=T\u00edpus ID -label.type.lower=t\u00edpus -label.type=T\u00edpus -label.ucs=UCS -label.uk.keyboard=UK billenty\u0171zet -label.unavailable=Nem el\u00e9rhet\u0151 -label.unhealthy.threshold=Nem eg\u00e9szs\u00e9ges k\u00fcsz\u00f6b -label.unlimited=Korl\u00e1tlan -label.untagged=Cimk\u00e9zetlen -label.update.project.resources=Update project resources -label.update.ssl.cert= SSL tan\u00fastv\u00e1ny -label.update.ssl= SSL tan\u00fastv\u00e1ny -label.updating=Updating -label.upgrade.required=Frissit\u00e9sre van sz\u00fcks\u00e9g -label.upgrade.router.newer.template=Upgrade Router to Use Newer Template -label.upload=Felt\u00f6lt\u00e9s -label.upload.from.local=Felt\u00f6lt\u00e9s -label.upload.template.from.local=Sablon felt\u00f6lt\u00e9se -label.upload.volume.from.local=K\u00f6tet felt\u00f6lt\u00e9se -label.upload.volume.from.url=K\u00f6tet felt\u00f6lt\u00e9se URL-r\u0151l -label.upload.volume=K\u00f6tet felt\u00f6lt\u00e9se -label.url=URL -label.usage.interface=Usage Interface -label.usage.sanity.result=Usage Sanity Result -label.usage.server=Usage Server -label.used=Haszn\u00e1lt -label.user.data=Felhaszn\u00e1l\u00f3i adat -label.user.details=Felhaszn\u00e1l\u00f3 adatai -label.user=Felhaszn\u00e1l\u00f3 -label.username=Felhaszn\u00e1l\u00f3n\u00e9v -label.username.lower=felhaszn\u00e1l\u00f3n\u00e9v -label.users=Felhaszn\u00e1l\u00f3k -label.user.vm=Felhaszn\u00e1l\u00f3i VM -label.use.vm.ips=VM IP c\u00edmek haszn\u00e1lata -label.use.vm.ip=VM IP c\u00edm haszn\u00e1lata\: -label.value=\u00c9rt\u00e9k -label.vcdcname=vCenter DC n\u00e9v -label.vcenter.cluster=vCenter f\u00fcrt -label.vcenter.datacenter=vCenter adatk\u00f6zpont -label.vcenter.datastore=vCenter t\u00e1r -label.vcenter.host=vCenter kiszolg\u00e1l\u00f3k -label.vcenter.password=vCenter jelsz\u00f3 -label.vcenter.username=vCenter felhaszn\u00e1l\u00f3n\u00e9v -label.vcenter=vcenter -label.vcipaddress=vCenter IP c\u00edm -label.version=Verzi\u00f3 -label.vgpu.max.resolution=Max k\u00e9pm\u00e9ret -label.vgpu.max.vgpu.per.gpu=vGPU-k GPU-nk\u00e9nt -label.vgpu.remaining.capacity=Megmarad\u00f3 kapac\u00edt\u00e1s -label.vgpu.type=vGPU t\u00edpus -label.vgpu=VGPU -label.vgpu.video.ram=Video RAM -label.view.all=\u00d6sszes megtekint\u00e9se -label.view.console=Konzol megtekint\u00e9se -label.viewing=Megtekint\u00e9s -label.view.more=Tov\u00e1bbiak megtekint\u00e9se -label.view=N\u00e9zet -label.view.secondary.ips=M\u00e1sodlagos IP c\u00edmek megtekint\u00e9se -label.virtual.appliance.details=Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9k r\u00e9szletei -label.virtual.appliances=Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9kek -label.virtual.appliance=Virtu\u00e1lis k\u00e9sz\u00fcl\u00e9k -label.virtual.machines=Virtu\u00e1lis g\u00e9pek -label.virtual.machine=Virtu\u00e1lis g\u00e9p -label.virtual.networking=Virtu\u00e1lis h\u00e1l\u00f3zat -label.virtual.network=Virtu\u00e1lis h\u00e1l\u00f3zat -label.virtual.routers.group.account=Virtu\u00e1lis routerek sz\u00e1ml\u00e1nk\u00e9nt -label.virtual.routers.group.cluster=Virtual Routers group by cluster -label.virtual.routers.group.pod=Virtual Routers group by pod -label.virtual.routers.group.zone=Virtu\u00e1lis routerek z\u00f3n\u00e1nk\u00e9nt csoportos\u00edtva -label.virtual.routers=Virtu\u00e1lis routerek -label.virtual.router=Virtu\u00e1lis router -label.vlan.id=VLAN/VNI ID -label.vlan.only=VLAN -label.vlan.range.details=VLAN tartom\u00e1ny r\u00e9szletei -label.vlan.ranges=VLAN tartom\u00e1ny(ok) -label.vlan.range=VLAN/VNI tartom\u00e1ny -label.vlan=VLAN/VNI -label.vlan.vni.ranges=VLAN/VNI tartom\u00e1ny(ok) -label.vlan.vni.range=VLAN/VNI tartom\u00e1ny -label.vm.add=P\u00e9ld\u00e1ny felv\u00e9tele -label.vm.destroy=Elpuszt\u00edt -label.vm.display.name=VM megjelen\u00edtend\u0151 n\u00e9v -label.VMFS.datastore=VMFS adatt\u00e1r -label.vmfs=VMFS -label.vm.id=VM ID -label.vm.ip=VM IP c\u00edm -label.vm.name=VM n\u00e9v -label.vm.password=A VM jelszava -label.vm.reboot=\u00dajraind\u00edt\u00e1s -label.VMs.in.tier=R\u00e9teg VM-ei -label.vmsnapshot.current=Jelnlegi -label.vmsnapshot.memory=Pillanatfelv\u00e9tel mem\u00f3ria -label.vmsnapshot.parentname=Sz\u00fcl\u0151 -label.vmsnapshot.type=T\u00edpus -label.vmsnapshot=VM pillanatfelv\u00e9telek -label.vm.start=Ind\u00edt\u00e1s -label.vm.state=VM \u00e1llapot -label.vm.stop=\u00c1lj -label.vms=VM-ek -label.vmware.datacenter.id=VMware adatk\u00f6zpont ID -label.vmware.datacenter.name=VMware adatk\u00f6zpont n\u00e9v -label.vmware.datacenter.vcenter=VMware datacenter vcenter -label.vmware.traffic.label=VMware traffic label -label.vnet.id=VLAN/VNI ID -label.vnet=VLAN/VNI -label.vnmc.devices=VNMC eszk\u00f6z\u00f6k -label.vnmc=VNMC -label.volatile=Ill\u00e9kony -label.volgroup=K\u00f6tet csoport -label.volume.details=K\u00f6tet r\u00e9szletek -label.volume=K\u00f6tet -label.volume.limits=K\u00f6teg korl\u00e1tok -label.volume.migrated=K\u00f6tet \u00e1tk\u00f6lt\u00f6ztetve -label.volume.name=K\u00f6tet n\u00e9v -label.volumes=K\u00f6tetek -label.vpc.distributedvpcrouter=Elosztott VPC Router -label.vpc.id=VPC ID -label.VPC.limits=VPC korl\u00e1tok -label.vpc.offering.details=VPC aj\u00e1nlat r\u00e9szletei -label.vpc.offering=VPC aj\u00e1nlat -label.VPC.router.details=VPC router r\u00e9szletek -label.vpc.supportsregionlevelvpc=R\u00e9gi\u00f3-szint\u0171 VPC-t t\u00e1mogat -label.vpc.virtual.router=VPC virtu\u00e1lis router -label.vpc=VPC -label.VPN.connection=VPN kapcsolat -label.vpn.customer.gateway=VPN \u00fcgyf\u00e9lkapu -label.VPN.customer.gateway=VPN \u00fcgyf\u00e9lkapu -label.VPN.gateway=VPN \u00e1tj\u00e1r\u00f3 -label.vpn=VPN -label.vsmctrlvlanid=Vez\u00e9rl\u0151 VLAN ID -label.vsmpktvlanid=Csomag VLAN ID -label.vsmstoragevlanid=T\u00e1r VLAN ID -label.vsphere.managed=vSphere Managed -label.vswitch.name=vSwitch n\u00e9v -label.vSwitch.type=vSwitch t\u00edpus -label.vxlan.id=VXLAN ID -label.vxlan.range=VXLAN tartom\u00e1ny -label.vxlan=VXLAN -label.waiting=V\u00e1rakoz\u00e1s -label.warn=Figyelmeztet\u00e9s -label.warning=Figyelmeztet\u00e9s -label.warn.upper=WARN -label.wednesday=Szerda -label.weekly=Heti -label.welcome.cloud.console=\u00dcdv\u00f6z\u00f6l a vez\u00e9rl\u0151konzol\! -label.welcome=\u00dcdv\u00f6z\u00f6llek\! -label.what.is.cloudstack=Mi a CloudStack&\#8482? -label.xenserver.tools.version.61.plus=Original XS Version is 6.1\\+ -label.Xenserver.Tools.Version61plus=Original XS Version is 6.1\\+ -label.xenserver.traffic.label=XenServer traffic label -label.yes=Igen -label.zone.dedicated=A z\u00f3na dedik\u00e1lva -label.zone.details=Z\u00f3na r\u00e9szletei -label.zone.id=Z\u00f3na ID -label.zone.lower=z\u00f3na -label.zone.name=Z\u00f3na n\u00e9v -label.zone.step.1.title=1. l\u00e9p\u00e9s\: H\u00e1l\u00f3zat kiv\u00e1laszt\u00e1sa -label.zone.step.2.title=2. l\u00e9p\u00e9s\: Z\u00f3na felv\u00e9tele -label.zone.step.3.title=3. l\u00e9p\u00e9s\: Pod felv\u00e9tele -label.zone.step.4.title=4. l\u00e9p\u00e9s\: IP c\u00edmtartom\u00e1ny felv\u00e9tele -label.zones=Z\u00f3n\u00e1k -label.zone.type=Z\u00f3na t\u00edpus -label.zone.wide=Eg\u00e9sz z\u00f3n\u00e1ra kiterjed\u0151 -label.zoneWizard.trafficType.guest=Vend\u00e9g\: forgalom v\u00e9gfelhaszn\u00e1l\u00f3i virtu\u00e1lis g\u00e9pek k\u00f6z\u00f6tt -label.zoneWizard.trafficType.management=Vez\u00e9rl\u00e9s\: forgalom a CloudStack felh\u0151 er\u0151forr\u00e1sai k\u00f6z\u00f6tt, bele\u00e9rtve azokat a komponenseket, amelyek a vez\u00e9rl\u0151 szerverrel kommunik\u00e1lnak, mint a kiszolg\u00e1l\u00f3k \u00e9s a rendszer VM-ek -label.zoneWizard.trafficType.public=Publikus\: forgalom az internet \u00e9s a felh\u0151 virtu\u00e1lis g\u00e9pei k\u00f6z\u00f6tt -label.zoneWizard.trafficType.storage=T\u00e1r\: forgalom az els\u0151dleges \u00e9s m\u00e1sodlagos t\u00e1r szerverek k\u00f6z\u00f6tt, p\u00e9ld\u00e1ul VM sablonok \u00e9s pillanatfelv\u00e9telek -label.zone=Z\u00f3na -managed.state=Managed State -message.acquire.ip.nic=Er\u0151s\u00edtsd meg, hogy \u00faj m\u00e1sodlagos IP c\u00edmet k\u00e9rsz ehhez a NIC-hez\!
Megjegyz\u00e9s\: manu\u00e1lisan kell be\u00e1ll\u00edtanod a frissen beszerzett m\u00e1sodlagos IP c\u00edmet a virtu\u00e1lis g\u00e9pben. -message.acquire.new.ip=Er\u0151s\u00edtsd meg, hogy \u00faj IP c\u00edmet k\u00e9rsz ennek a h\u00e1l\u00f3zatnak\! -message.acquire.new.ip.vpc=Er\u0151s\u00edtsd meg, hogy \u00faj IP c\u00edmet k\u00e9rsz ennek a VPC-nek\! -message.acquire.public.ip=V\u00e1lassz ki egy z\u00f3n\u00e1t, amelyikb\u0151l az \u00faj IP c\u00edmet k\u00e9rni akarod\! -message.action.cancel.maintenance=A kiszolg\u00e1l\u00f3 karbantart\u00e1s\u00e1t sikeresen megszak\u00edtottad. Ez a folyamat t\u00f6bb percet vehet ig\u00e9nybe. -message.action.cancel.maintenance.mode=Er\u0151s\u00edtsd meg, hogy meg akarod szak\u00edtani ezt a karbantart\u00e1st\! -message.action.change.service.warning.for.instance=A p\u00e9ld\u00e1nyt le kell \u00e1ll\u00edtani, miel\u0151tt a jelenlegi szolg\u00e1ltat\u00e1si aj\u00e1nlatait megpr\u00f3b\u00e1lod megv\u00e1ltoztatni. -message.action.change.service.warning.for.router=A routert le kell \u00e1ll\u00edtani miel\u00f6tt a jelenlegi szolg\u00e1ltat\u00e1si aj\u00e1nlatait megpr\u00f3b\u00e1lod megv\u00e1ltoztatni. -message.action.delete.cluster=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a f\u00fcrt\u00f6t\! -message.action.delete.disk.offering=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a merevlemez aj\u00e1nlatot\! -message.action.delete.domain=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a dom\u00e9nt\! -message.action.delete.external.firewall=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a k\u00fcls\u0151 t\u0171zfalat\! Figyelmeztet\u00e9s\: Ha azt tervezed, hogy ugyanazt a k\u00fcls\u0151 t\u0171zfalat regisztr\u00e1lod \u00fajra, az eszk\u00f6z\u00f6n t\u00f6r\u00f6ln\u00f6d kell a haszn\u00e1lati adatokat. -message.action.delete.external.load.balancer=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a k\u00fcls\u0151 terhel\u00e9seloszt\u00f3t\! Figyelmeztet\u00e9s\: Ha azt tervezed, hogy ugyanazt a k\u00fcls\u0151 terhel\u00e9seloszt\u00f3t regisztr\u00e1lod \u00fajra, az eszk\u00f6z\u00f6n t\u00f6r\u00f6ln\u00f6d kell a haszn\u00e1lati adatokat. -message.action.delete.ingress.rule=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az ingress szab\u00e1lyt\! -message.action.delete.ISO=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az ISO-t\! -message.action.delete.ISO.for.all.zones=Az ISO-t minden z\u00f3na haszn\u00e1lja. Er\u0151s\u00edtsd meg, hogy minden z\u00f3n\u00e1b\u00f3l t\u00f6r\u00f6lni akarod\! -message.action.delete.network=Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6r\u00f6lni ezt a h\u00e1l\u00f3zatot\! -message.action.delete.nexusVswitch=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a nexus 1000v-t\! -message.action.delete.nic=Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a NIC-t\! A hozz\u00e1 kapcsolt h\u00e1l\u00f3zat is t\u00f6rl\u0151dik a VM-b\u0151l. -message.action.delete.physical.network=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a fizikai h\u00e1l\u00f3zatot\! -message.action.delete.pod=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a pod-ot\! -message.action.delete.primary.storage=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az els\u0151dleges t\u00e1rat\! -message.action.delete.secondary.storage=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a m\u00e1sodlagos t\u00e1rat\! -message.action.delete.security.group=K\u00e9rlek er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a biztons\u00e1gi csoportot\! -message.action.delete.service.offering=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a szolg\u00e1ltat\u00e1s aj\u00e1nlatot\! -message.action.delete.snapshot=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a pillanatfelv\u00e9telt\! -message.action.delete.system.service.offering=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlatot\! -message.action.delete.template=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a sablont\! -message.action.delete.template.for.all.zones=Ezt a sablont minden z\u00f3na haszn\u00e1lja. Er\u0151s\u00edtsd meg, hogy minden z\u00f3n\u00e1b\u00f3l t\u00f6r\u00f6lni szeretn\u00e9d\! -message.action.delete.volume=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a k\u00f6tetet\! -message.action.delete.zone=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a z\u00f3n\u00e1t\! -message.action.destroy.instance=Er\u0151s\u00edtsd meg, hogy el akarod puszt\u00edtani ezt a p\u00e9ld\u00e1nyt\! -message.action.destroy.systemvm=Er\u0151s\u00edtsd meg, hogy el akarod puszt\u00edtani ezt a rendszer VM-et\! -message.action.disable.cluster=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a f\u00fcrt\u00f6t\! -message.action.disable.nexusVswitch=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a nexus 1000v-t\! -message.action.disable.physical.network=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a fizikai h\u00e1l\u00f3zatot\! -message.action.disable.pod=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a pod-ot\! -message.action.disable.static.NAT=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a statikus NAT-ot\! -message.action.disable.zone=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a z\u00f3n\u00e1t\! -message.action.downloading.template=Sablon let\u00f6lt\u00e9se -message.action.download.iso=Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6lteni ezt az ISO-t\! -message.action.download.template=Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6lteni ezt a sablont\! -message.action.enable.cluster=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a f\u00fcrt\u00f6t\! -message.action.enable.maintenance=A kiszolg\u00e1l\u00f3 sikeresen felk\u00e9sz\u00fclt a karbantart\u00e1sra. Ez a m\u0171velet t\u00f6bb percet is ig\u00e9nybe vehet att\u00f3l f\u00fcgg\u0151en, mennyi VM fut rajta jelenleg. -message.action.enable.nexusVswitch=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a nexus 1000v-t\! -message.action.enable.physical.network=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a fizikai h\u00e1l\u00f3zatot. -message.action.enable.pod=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a pod-ot\! -message.action.enable.zone=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a z\u00f3n\u00e1t\! -message.action.expunge.instance=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a p\u00e9ld\u00e1nyt\! -message.action.force.reconnect=A kiszolg\u00e1l\u00f3 \u00fajrakapcsol\u00f3d\u00e1s\u00e1t siker\u00fclt kik\u00e9nyszer\u00edteni. Ez a folyamat t\u00f6bb percet veet ig\u00e9nybe. -message.action.host.enable.maintenance.mode=A karbantart\u00e1s elind\u00edt\u00e1sa az \u00f6sszes a kiszolg\u00e1l\u00f3n fut\u00f3 p\u00e9ld\u00e1ny m\u00e1s kiszolg\u00e1l\u00f3ra k\u00f6lt\u00f6ztet\u00e9s\u00e9t ind\u00edtja el. -message.action.instance.reset.password=Er\u0151s\u00edtsd meg, hogy meg akarod v\u00e1ltoztatni a virtu\u00e1lis g\u00e9p ROOT jelszav\u00e1t\! -message.action.manage.cluster=Er\u0151s\u00edtsd meg, hogy vez\u00e9relni akarod ezt a f\u00fcrt\u00f6t\! -message.action.primarystorage.enable.maintenance.mode=Figyelmeztet\u00e9s\: az els\u0151dleges t\u00e1r karbantart\u00e1si m\u00f3dba helyez\u00e9se minden azt haszn\u00e1l\u00f3 VM-et le\u00e1ll\u00edt. Akarod folytatni? -message.action.reboot.instance=Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani ezt a p\u00e9ld\u00e1nyt\! -message.action.reboot.router=Minden a router \u00e1ltal ny\u00fajtott szolg\u00e1ltat\u00e1s megszakad. Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a routert\! -message.action.reboot.systemvm=Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani ezt a rendszer VM-et\! -message.action.release.ip=Er\u0151s\u00edtsd meg, hogy el akarod engedni ezt az IP c\u00edmet\! -message.action.remove.host=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a kiszolg\u00e1l\u00f3t\! -message.action.reset.password.off=A p\u00e9ld\u00e1ny nem t\u00e1mogatja ezt a lehet\u0151s\u00e9get. -message.action.reset.password.warning=A p\u00e9ld\u00e1nyt le kell \u00e1ll\u00edtanod, miel\u00f6tt megpr\u00f3b\u00e1ln\u00e1d lecser\u00e9lni a jelszav\u00e1t. -message.action.restore.instance=Er\u0151s\u00edtsd meg, hogy helyre akarod \u00e1ll\u00edtani ezt a p\u00e9ld\u00e1nyt\! -message.action.revert.snapshot=Er\u0151s\u00edtsd meg, hogy vissza akarod \u00e1ll\u00edtani a k\u00f6tetet erre a pillanatfelv\u00e9tlere\! -message.action.start.instance=Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani ezt a p\u00e9ld\u00e1nyt\! -message.action.start.router=Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani ezt a routert\! -message.action.start.systemvm=Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani ezt a rendszer VM-et\! -message.action.stop.instance=Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a p\u00e9ld\u00e1nyt\! -message.action.stop.router=Minden ezzel a routerrel kapcsolatos szolg\u00e1ltat\u00e1s megszakad. Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a routert\! -message.action.stop.systemvm=Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a rendszer VM-et\! -message.action.take.snapshot=Er\u0151s\u00edtsd meg, hogy pillanatfelv\u00e9telt k\u00e9rsz err\u0151l a k\u00f6tetr\u0151l\! -message.action.unmanage.cluster=Er\u0151s\u00edtsd meg, hogy megszak\u00edtod a f\u00fcrt vez\u00e9rl\u00e9s\u00e9t\! -message.action.vmsnapshot.delete=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a VM pillanatfelv\u00e9telt\! -message.action.vmsnapshot.revert=Revert VM snapshot -message.activate.project=Biztosan aktiv\u00e1lni szeretn\u00e9d ezt a projektet? -message.add.cluster=Add a hypervisor managed cluster for zone , pod -message.add.cluster.zone=Add a hypervisor managed cluster for zone -message.add.disk.offering=Add meg a k\u00f6vetkez\u0151 param\u00e9tereket az \u00faj merevlemez aj\u00e1nlat felv\u00e9tel\u00e9hez -message.add.domain=Please specify the subdomain you want to create under this domain -message.added.new.nuage.vsp.controller=\u00daj Nicira Vsp vez\u00e9rl\u0151 felv\u00e9ve -message.added.vpc.offering=VPC aj\u00e1nlat felv\u00e9ve -message.add.firewall=T\u0171zfal felv\u00e9tele a z\u00f3n\u00e1ba -message.add.guest.network=Er\u0151s\u00edtsd meg, hogy vend\u00e9g h\u00e1l\u00f3zatot szeretn\u00e9l felvenni\! -message.add.host=Add meg a k\u00f6vetkez\u0151 adatokat az \u00faj kiszolg\u00e1l\u00f3 felv\u00e9tel\u00e9hez -message.adding.host=Kiszolg\u00e1l\u00f3 felv\u00e9tele -message.adding.Netscaler.device=Netscaler eszk\u00f6z felv\u00e9tele -message.adding.Netscaler.provider=Netscaler szolg\u00e1ltat\u00f3 felv\u00e9tele -message.add.ip.range.direct.network=Add an IP range to direct network in zone -message.add.ip.range=IP tartom\u00e1ny felv\u00e9tele a z\u00f3na publikus h\u00e1l\u00f3zat\u00e1hoz -message.add.ip.range.to.pod=

IP tartom\u00e1ny felv\u00e9tele a pod-hoz

-message.additional.networks.desc=V\u00e1laszd ki a tov\u00e1bbi h\u00e1l\u00f3zatokat, amelyhez a p\u00e9ld\u00e1ny csatlakozni fog\! -message.add.load.balancer=Terhel\u00e9seloszt\u00f3 felv\u00e9tele a z\u00f3n\u00e1ba -message.add.load.balancer.under.ip=The load balancer rule has been added under IP\: -message.add.network=H\u00e1l\u00f3zat felv\u00e9tele a z\u00f3n\u00e1ban -message.add.new.gateway.to.vpc=Please specify the information to add a new gateway to this VPC. -message.add.pod.during.zone.creation=Minden z\u00f3n\u00e1nak egy vagy t\u00f6bb pod-ot kell tartalmaznia. Vegy\u00fck fel az els\u0151 pod-ot\! A pod tartalmaz kiszolg\u00e1l\u00f3kat \u00e9s els\u0151dleges t\u00e1r szervereket, amelyeket a k\u00f6vetkez\u0151 l\u00e9p\u00e9sekben vesz\u00fcnk majd fel. El\u0151sz\u00f6r \u00e1ll\u00edts be egy elk\u00fcl\u00f6n\u00edtett IP c\u00edmtartom\u00e1nyt a CloudStack bels\u0151 forgalm\u00e1nak. A c\u00edmtartom\u00e1nynak egyedinek kell lennie a felh\u0151ben. -message.add.pod=\u00daj pod felv\u00e9tele a z\u00f3n\u00e1ban -message.add.primary=Please specify the following parameters to add a new primary storage -message.add.primary.storage=\u00daj els\u0151dleges t\u00e1r felv\u00e9tele a z\u00f3n\u00e1ban a pod-hoz -message.add.region=Add meg az inform\u00e1ci\u00f3kat az \u00faj r\u00e9gi\u00f3 felv\u00e9tel\u00e9hez\! -message.add.secondary.storage=\u00daj t\u00e1r felv\u00e9tele a z\u00f3n\u00e1hoz -message.add.service.offering=T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat \u00faj sz\u00e1m\u00edt\u00e1si aj\u00e1nlat felv\u00e9tel\u00e9hez -message.add.system.service.offering=T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat \u00faj rendszer szolg\u00e1ltat\u00e1s aj\u00e1nlat felv\u00e9tel\u00e9hez -message.add.template=Add meg a k\u00f6vetkez\u0151 adatokat \u00faj sablon l\u00e9trehoz\u00e1s\u00e1hoz -message.add.volume=T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat \u00faj k\u00f6tet l\u00e9trehoz\u00e1s\u00e1hoz -message.add.VPN.gateway=Er\u0151s\u00edtsd meg, hogy \u00faj VPN \u00e1tj\u00e1r\u00f3t akarsz felvenni\! -message.admin.guide.read=VMware-alap\u00fa VM-ek eset\u00e9ben k\u00e9rlek olvasd el a dinakikus sk\u00e1l\u00e1z\u00e1sr\u00f3l sz\u00f3l\u00f3 fejezetet\! Szeretn\u00e9d folytatni?\\, -message.advanced.mode.desc=Akkor v\u00e1laszd ezt a h\u00e1l\u00f3zat modellt, ha szeretn\u00e9d haszn\u00e1lni a VLAN t\u00e1mogat\u00e1st. Ez a h\u00e1l\u00f3zat modell biztos\u00edtja a legnagyobb rugalmass\u00e1got \u00e9s lehet\u0151v\u00e9 teszi, hogy a rendszergazd\u00e1k olyan aj\u00e1nlatokat biztos\u00edtsanak, mint a t\u0171zfalak, VPN vagy terhel\u00e9seloszt\u00f3k valamint a direkt \u00e9s virtu\u00e1lis h\u00e1l\u00f3zatok. -message.advanced.security.group=V\u00e1laszd ezt, ha biztons\u00e1gi csoportokat akarsz haszn\u00e1lni a vend\u00e9g VM izol\u00e1ci\u00f3hoz\! -message.advanced.virtual=V\u00e1laszd ezt, ha z\u00f3na-szint\u0171 VLAN-okat szeretn\u00e9l haszn\u00e1lni a vend\u00e9g VM-ek izol\u00e1ci\u00f3j\u00e1ra\! -message.after.enable.s3=Az S3-alap\u00fa m\u00e1sodlagos t\u00e1r konfigur\u00e1ci\u00f3ja k\u00e9sz. Megjegyz\u00e9s\: miut\u00e1n elhagytad ezt az oldalt, nem tudod majd az S3-at ism\u00e9t konfigur\u00e1lni. -message.after.enable.swift=A Swift konfigur\u00e1ci\u00f3ja k\u00e9sz. Megjegyz\u00e9s\: miut\u00e1n elhagytad ezt az oldalt, nem tudod majd \u00fajrakonfigur\u00e1lni a Swift-et\! -message.alert.state.detected=Alert state detected -message.allow.vpn.access=Add meg a VPN felhaszn\u00e1l\u00f3 nev\u00e9t \u00e9s jelszav\u00e1t -message.apply.snapshot.policy=Sikeresen m\u00f3dos\u00edtottad a jelenlegi pillanatfelv\u00e9tel szab\u00e1lyzatodat\! -message.attach.iso.confirm=Er\u0151s\u00edtsd meg, hogy az ISO-t ehhez a virtu\u00e1lis g\u00e9phez akarod csatolni\! -message.attach.volume=T\u00f6ltsd ki a k\u00f6vetkez\u0151 adatokat a k\u00f6tet csatlakoztat\u00e1s\u00e1hoz\! Ha Windows-alap\u00fa virtu\u00e1lis g\u00e9phez csatlakoztatsz merevlemezt, akkor \u00fajra kell ind\u00edtanod a p\u00e9ld\u00e1nyt ahhoz, hogy l\u00e1sd a merevlemezt. -message.basic.mode.desc=Akkor v\u00e1laszd ezt a h\u00e1l\u00f3zati modellt, ha *nem* akarsz VLAN t\u00e1mogat\u00e1st bekapcsolni. Ezen a h\u00e1l\u00f3zaton minden p\u00e9ld\u00e1ny k\u00f6zvetlen\u00fcl a h\u00e1l\u00f3zatt\u00f3l kap IP c\u00edmet \u00e9s a biztons\u00e1gi csoportok szolg\u00e1ltatnak biztons\u00e1got \u00e9s szegreg\u00e1ci\u00f3t. -message.change.offering.confirm=Please confirm that you wish to change the service offering of this virtual instance. -message.change.password=V\u00e1ltoztass jelsz\u00f3t\! -message.cluster.dedicated=F\u00fcrt dedik\u00e1lva -message.cluster.dedication.released=F\u00fcrt dedik\u00e1l\u00e1s elengedve -message.configure.all.traffic.types=T\u00f6bb fizikai h\u00e1l\u00f3zatod van. Kattints a \\'Szerkeszt\u00e9s\\' gombra \u00e9s \u00e1ll\u00edts be c\u00edmk\u00e9ket minden egyes forgalom t\u00edpushoz\! -message.configure.firewall.rules.allow.traffic=Hat\u00e1rozz meg szab\u00e1lyokat forgalom enged\u00e9lyez\u00e9s\u00e9hez -message.configure.firewall.rules.block.traffic=Hat\u00e1rozz meg szab\u00e1lyokat forgalom sz\u0171r\u00e9s\u00e9hez -message.configure.ldap=Er\u0151s\u00edtsd meg, hogy szeretn\u00e9l LDAP-t konfigur\u00e1lni\! -message.configuring.guest.traffic=Vend\u00e9g forgalom konfigur\u00e1l\u00e1sa -message.configuring.physical.networks=Fizikai h\u00e1l\u00f3zatok konfigur\u00e1l\u00e1sa -message.configuring.public.traffic=Publikus forgalom konfigur\u00e1l\u00e1sa -message.configuring.storage.traffic=T\u00e1r forgalom konfigur\u00e1l\u00e1sa -message.confirm.action.force.reconnect=Er\u0151s\u00edtsd meg, hogy \u00fajrakapcsol\u00f3dni akarsz a kiszolg\u00e1l\u00f3hoz\! -message.confirm.add.vnmc.provider=Er\u0151s\u00edtsd meg, hogy fel szeretn\u00e9d venni a VNMC szolg\u00e1ltat\u00f3t. -message.confirm.archive.alert=Er\u0151s\u00edtsd meg, hogy archiv\u00e1lni akarod ezt a riaszt\u00e1st\! -message.confirm.archive.event=Er\u0151s\u00edtsd meg, hogy archiv\u00e1lni szeretn\u00e9d az esem\u00e9nyt\! -message.confirm.archive.selected.alerts=Er\u0151s\u00edtsd meg, hogy le akarod archiv\u00e1lni a kiv\u00e1lasztott riaszt\u00e1sokat\! -message.confirm.archive.selected.events=Er\u0151s\u00edtsd meg, hogy archiv\u00e1lni szeretn\u00e9d a kiv\u00e1lasztott esem\u00e9nyeket\! -message.confirm.attach.disk=Biztosan csatolni szeretn\u00e9d a merevlemezt? -message.confirm.create.volume=Biztosan szeretn\u00e9l k\u00f6tetet l\u00e9trehozni? -message.confirm.current.guest.CIDR.unchanged=V\u00e1ltozatlanul akarod hagyni a vend\u00e9g h\u00e1l\u00f3zat CIDR-j\u00e9t? -message.confirm.dedicate.cluster.domain.account=T\u00e9nyleg dedik\u00e1lni akarod ezt a f\u00fcrt\u00f6t egy dom\u00e9nnek/sz\u00e1ml\u00e1nak? -message.confirm.dedicate.host.domain.account=T\u00e9nyleg dedik\u00e1lni akarod ezt a kiszolg\u00e1l\u00f3t egy dom\u00e9nnek vagy sz\u00e1ml\u00e1nak? -message.confirm.dedicate.pod.domain.account=T\u00e9nyleg dedik\u00e1lni szeretn\u00e9d ezt a pod-ot egy dom\u00e9nnek/sz\u00e1ml\u00e1nak? -message.confirm.dedicate.zone=Biztosan dedik\u00e1lni akarod ezt a z\u00f3n\u00e1t egy dom\u00e9nhoz/sz\u00e1ml\u00e1hoz? -message.confirm.delete.acl.list=Biztosan t\u00f6r\u00f6lni akarod ezt a ACL list\u00e1t? -message.confirm.delete.alert=Biztosan t\u00f6r\u00f6lni akarod ezt a riaszt\u00e1st? -message.confirm.delete.baremetal.rack.configuration=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a Baremetal rack konfigur\u00e1ci\u00f3t\! -message.confirm.delete.BigSwitchBcf=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt a BigSwitch BCF vez\u00e9rl\u0151t\! -message.confirm.delete.BrocadeVcs=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a Brocade Vcs Switch-et -message.confirm.delete.ciscoASA1000v=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a CiscoASA1000v-t -message.confirm.delete.ciscovnmc.resource=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a CiscoVNMC er\u0151forr\u00e1st\! -message.confirm.delete.F5=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d az F5-\u00f6t -message.confirm.delete.internal.lb=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a bels\u0151 LB-t\! -message.confirm.delete.NetScaler=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a NetScaler-t -message.confirm.delete.NuageVsp=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a Muage Virtualized Services Directory-t -message.confirm.delete.PA=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a Palo Alto-t -message.confirm.delete.secondary.staging.store=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a m\u00e1sodlagos t\u00e1rat\! -message.confirm.delete.SRX=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a SRX-et -message.confirm.delete.ucs.manager=Please confirm that you want to delete UCS Manager -message.confirm.destroy.router=Er\u0151s\u00edtsd meg, hogy el akarod puszt\u00edtani ezt a routert -message.confirm.disable.host=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a kiszolg\u00e1l\u00f3t -message.confirm.disable.network.offering=Biztos vagy abban, hogy ki akarod kapcsolni ezt a h\u00e1l\u00f3zat aj\u00e1nlatot? -message.confirm.disable.provider=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni ezt a szolg\u00e1ltat\u00f3t -message.confirm.disable.vnmc.provider=Er\u0151s\u00edtsd meg, hogy ki szeretn\u00e9d kapcsolni a VNMC szolg\u00e1ltat\u00f3t\! -message.confirm.disable.vpc.offering=Biztos vagy abban, hogy ki akarod kapcsolni ezt a VPC aj\u00e1nlatot? -message.confirm.enable.host=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni a kiszolg\u00e1l\u00f3t -message.confirm.enable.network.offering=Biztos vagy abban, hogy be akarod kapcsolni ezt a h\u00e1l\u00f3zati aj\u00e1nlatot? -message.confirm.enable.provider=Er\u0151s\u00edtsd meg, hogy be szeretn\u00e9d kapcsolni ezt a szolg\u00e1ltat\u00f3t -message.confirm.enable.vnmc.provider=Er\u0151s\u00edtsd meg, hogy be szeretn\u00e9d kapcsolni a VNMC szolg\u00e1ltat\u00f3t\! -message.confirm.enable.vpc.offering=Biztos vagy abban, hogy be akarod kapcsolni ezt a VPC aj\u00e1nlatot? -message.confirm.join.project=Er\u0151s\u00edtsd meg, hogy csatlakozni szeretn\u00e9l a projekthez -message.confirm.migrate.volume=El akarod k\u00f6lt\u00f6ztetni ezt a k\u00f6tetet? -message.confirm.refresh.blades=Please confirm that you want to refresh blades. -message.confirm.release.dedicated.cluster=El akarod engedni ezt a dedik\u00e1lt f\u00fcrt\u00f6t? -message.confirm.release.dedicated.host=El akarod engedni ezt a dedik\u00e1lt kiszolg\u00e1l\u00f3t? -message.confirm.release.dedicated.pod=El akarod engedni ezt a dedik\u00e1lt pod-ot? -message.confirm.release.dedicated.zone=El akarod engedni ezt a dedik\u00e1lt z\u00f3n\u00e1t? -message.confirm.release.dedicate.vlan.range=Er\u0151s\u00edtsd meg, hogy elengeded a dedik\u00e1lt VLAN tartom\u00e1nyt\! -message.confirm.remove.event=Biztosan t\u00f6r\u00f6lni szeretn\u00e9d ezt az esem\u00e9nyt? -message.confirm.remove.IP.range=Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani ezt az IP tartom\u00e1nyt -message.confirm.remove.load.balancer=Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a VM-et a terhel\u00e9seloszt\u00f3r\u00f3l\! -message.confirm.remove.network.offering=Biztos vagy abban, hogy t\u00f6r\u00f6lni akarod ezt a h\u00e1l\u00f3zati aj\u00e1nlatot? -message.confirm.remove.selected.alerts=Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a kiv\u00e1lasztott riaszt\u00e1sokat\! -message.confirm.remove.selected.events=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d a kiv\u00e1lasztott esem\u00e9nyeket -message.confirm.remove.vmware.datacenter=Er\u0151s\u00edtsd meg, hogy el akarod t\u00e1vol\u00edtani a VMware adatk\u00f6zpontot\! -message.confirm.remove.vpc.offering=Biztos vagy abban, hogy t\u00f6r\u00f6lni akarod ezt a VPC aj\u00e1nlatot? -message.confirm.replace.acl.new.one=Le akarod cser\u00e9lni ez ACL list\u00e1t egy \u00fajjal? -message.confirm.scale.up.router.vm=Biztosan fel akarod m\u00e9retezni a router VM-et? -message.confirm.scale.up.system.vm=Biztosan fel akarod m\u00e9retezni a rendszer VM-et? -message.confirm.shutdown.provider=Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani ezt a szolg\u00e1ltat\u00f3t -message.confirm.start.lb.vm=Er\u0151s\u00edtsd meg, hogy el akarod ind\u00edtani az LB VM-et\! -message.confirm.stop.lb.vm=Er\u0151s\u00edtsd meg, hogy le akarod \u00e1ll\u00edtani az LB VM-et\! -message.confirm.upgrade.router.newer.template=Er\u0151s\u00edtsd meg, hogy a routert \u00faj sablonnal akarod friss\u00edteni\! -message.confirm.upgrade.routers.account.newtemplate=Er\u0151s\u00edtsd meg, hogy minden a sz\u00e1mla minden router\u00e9t friss\u00edteni akarod az \u00faj sablonnal\! -message.confirm.upgrade.routers.cluster.newtemplate=Er\u0151s\u00edtsd meg, hogy minden a f\u00fcrt minden router\u00e9t friss\u00edteni akarod az \u00faj sablonnal\! -message.confirm.upgrade.routers.newtemplate=Er\u0151s\u00edtsd meg, hogy a z\u00f3na minden router\u00e9t friss\u00edteni akarod \u00faj sablonnal\! -message.confirm.upgrade.routers.pod.newtemplate=Er\u0151s\u00edtsd meg, hogy a pod minden router\u00e9t friss\u00edteni akarod \u00faj sablonnal\! -message.copy.iso.confirm=Er\u0151s\u00edtsd meg, hogy az ISO-t m\u00e1solni akarod\: -message.copy.template=A XXX sablon m\u00e1sol\u00e1sa a z\u00f3n\u00e1b\u00f3l a -message.copy.template.confirm=Biztos vagy benne, hogy le akarod m\u00e1solni a sablont? -message.create.template=Biztosan szeretn\u00e9l sablont l\u00e9trehozni? -message.create.template.vm=VM l\u00e9rehoz\u00e1sa sablonb\u00f3l -message.create.template.volume=Please specify the following information before creating a template of your disk volume\: . Creation of the template can range from several minutes to longer depending on the size of the volume. -message.creating.cluster=F\u00fcrt l\u00e9trehoz\u00e1sa -message.creating.guest.network=Vend\u00e9g h\u00e1l\u00f3zat l\u00e9trehoz\u00e1sa -message.creating.physical.networks=Fizikai h\u00e1l\u00f3zat l\u00e9trehoz\u00e1sa -message.creating.pod=Pod l\u00e9trehoz\u00e1sa -message.creating.primary.storage=Els\u0151dleges t\u00e1r l\u00e9trehoz\u00e1sa -message.creating.secondary.storage=M\u00e1sodlagos t\u00e1r l\u00e9trehoz\u00e1sa -message.creating.systemVM=A rendszer VM-ek l\u00e9trehoz\u00e1sa folyamatban (ez eltarthat egy darabig) -message.creating.zone=Z\u00f3na l\u00e9trehoz\u00e1sa -message.decline.invitation=Biztosan el akarod utas\u00edtani ezt a projekt megh\u00edv\u00e1st? -message.dedicated.zone.released=Z\u00f3na elengedve -message.dedicate.zone=Z\u00f3na dedik\u00e1l\u00e1sa -message.delete.account=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt a sz\u00e1ml\u00e1t\! -message.delete.affinity.group=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt az affin\u00edt\u00e1s csoportot -message.delete.gateway=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az \u00e1tj\u00e1r\u00f3t -message.delete.project=Biztosan t\u00f6r\u00f6lni akarod ezt a projektet? -message.delete.user=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni szeretn\u00e9d ezt a felhaszn\u00e1l\u00f3t\! -message.delete.VPN.connection=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a VPN kapcsolatot -message.delete.VPN.customer.gateway=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a VPN \u00fcgyf\u00e9lkaput\! -message.delete.VPN.gateway=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt a VPN \u00e1tj\u00e1r\u00f3t\! -message.desc.advanced.zone=\u00d6sszetettebb h\u00e1l\u00f3zati topol\u00f3gi\u00e1khoz. Ez a h\u00e1l\u00f3zat modell biztos\u00edtja a legnagyobb rugalmass\u00e1got a vend\u00e9g h\u00e1l\u00f3zatok fel\u00e9p\u00edt\u00e9s\u00e9ben \u00e9s olyan h\u00e1l\u00f3zati aj\u00e1nlatokat tesz lehet\u0151v\u00e9, mint a t\u0171zfalak, VPN vagy terhel\u00e9seloszt\u00f3k. -message.desc.basic.zone=Adj meg egy h\u00e1l\u00f3zatot, amelyen minden egyes VM p\u00e9ld\u00e1ny k\u00f6zvetlen\u00fcl a h\u00e1l\u00f3zatt\u00f3l kap IP c\u00edmet. A vend\u00e9g rendszerek izol\u00e1ci\u00f3j\u00e1t 3. r\u00e9teg-b\u00e9li megold\u00e1sokkal, mint p\u00e9ld\u00e1ul biztons\u00e1gi csoportokkal (IP c\u00edm filterez\u00e9s) oldhat\u00f3 meg. -message.desc.cluster=Minden pod-nak tartalmaznia kell egy vagy t\u00f6bb f\u00fcrt\u00f6t \u00e9s most l\u00e9trehozzuk az els\u0151 f\u00fcrt\u00f6t. A f\u00fcrt csoportos\u00edtja a kiszolg\u00e1l\u00f3kat. Egy f\u00fcrtben tal\u00e1lhat\u00f3 kiszolg\u00e1l\u00f3k ugyanolyan hardverrel rendelkeznek, ugyanolyan hipervizort futtatnak \u00e9s ugyanahhoz az els\u0151dleges t\u00e1rol\u00f3hoz f\u00e9rnek hozz\u00e1. Minden f\u00fcrt egy vagy t\u00f6bb kiszolg\u00e1l\u00f3t \u00e9s els\u0151dleges t\u00e1r szervert tartalmaz. -message.desc.created.ssh.key.pair=Az SSH kulcsp\u00e1r l\u00e9trej\u00f6tt. -message.desc.create.ssh.key.pair=Add meg a k\u00f6vetkez\u0151 adatokat az ssh kulcs bejegyz\u00e9s\u00e9hez\!

(1) Ha publikus kulcsot adsz meg, a CloudStack elt\u00e1rolja \u00e9s a priv\u00e1t kulcsoddal haszn\u00e1lhatod.

(2) Ha nem adsz meg publikus kulcsot, a CloudStack k\u00e9sz\u00edt neked egyet. M\u00e1sold le \u00e9s mentsd el a priv\u00e1t kulcsot, a CloudStack nem tartja meg.
-message.desc.host=Minden f\u00fcrtnek legal\u00e1bb egy kiszolg\u00e1l\u00f3t kell tartalmaznia, amelyen a VM-ek futhatnak. Most vegy\u00fck fel az els\u0151 kiszolg\u00e1l\u00f3t\! Hogy a kiszolg\u00e1l\u00f3 m\u0171k\u00f6dhessen, hipervizor szoftvert kell r\u00e1 telep\u00edteni, IP c\u00edmet rendelni hozz\u00e1 \u00e9s biztos\u00edtani a kapcsolatot a CloudStack vez\u00e9rl\u0151 szerverrel.

Add meg a kiszolg\u00e1l\u00f3 DNS vagy IP c\u00edm\u00e9t, a felhaszn\u00e1l\u00f3 nev\u00e9t (\u00e1ltal\u00e1ban root) \u00e9s jelszav\u00e1t, valamint a kiszolg\u00e1l\u00f3 kategoriz\u00e1l\u00e1s\u00e1ra szolg\u00e1l\u00f3 c\u00edmk\u00e9ket. -message.desc.primary.storage=Minden f\u00fcrt tartalmaz egy vagy t\u00f6bb els\u0151dleges t\u00e1r szervert \u00e9s most l\u00e9trehozzuk az els\u0151t. Az els\u0151dleges t\u00e1r tartalmazza a f\u00fcrt kiszolg\u00e1l\u00f3in fut\u00f3 \u00f6sszes VM virtu\u00e1lis merevlemezeit. -message.desc.reset.ssh.key.pair=Adj meg egy ssh kulcsp\u00e1rt, amelyet fel szeretn\u00e9l venni ehhez a VM-hez\! A root jelsz\u00f3 megv\u00e1ltozik, ha a jelsz\u00f3 enged\u00e9lyezett. -message.desc.secondary.storage=Minden z\u00f3n\u00e1nak rendelkeznie kell legal\u00e1bb egy NFS vagy m\u00e1sodlagos t\u00e1r szervert \u00e9s most l\u00e9trehozzuk az els\u0151t. A m\u00e1sodlagos t\u00e1r t\u00e1rolja a VM sablonok, ISO f\u00e1jlok \u00e9s pillanatfelv\u00e9telek adatait. Ennek a szervernek minden kiszolg\u00e1l\u00f3 sz\u00e1m\u00e1ra hozz\u00e1f\u00e9rhet\u0151nek kell lennie.

Add meg az IP c\u00edmet \u00e9s az \u00fatvonalat\! -message.desc.zone=A z\u00f3na a CloudStack legnagyobb egys\u00e9ge \u00e9s \u00e1ltal\u00e1ban egy adatk\u00f6zpontnak felel meg. A z\u00f3n\u00e1k fizikai izol\u00e1ci\u00f3t adnak. Egy z\u00f3na egy vagy t\u00f6bb pod-b\u00f3l \u00e1ll (amelyek kiszolg\u00e1l\u00f3kat \u00e9s els\u0151dleges t\u00e1rol\u00f3kat tartalmaznak) \u00e9s egy m\u00e1sodlagos t\u00e1rb\u00f3l, amelyet az \u00f6sszes pod haszn\u00e1l. -message.detach.disk=Biztosan la akarod v\u00e1lasztani a merevlemezt? -message.detach.iso.confirm=Er\u0151s\u00edtsd meg, hogy le akarod v\u00e1lasztani az ISO-t a virtu\u00e1lis g\u00e9pr\u0151l\! -message.disable.account=Er\u0151s\u00edtsd meg, hogy ki szeretn\u00e9d kapcsolni ezt a sz\u00e1ml\u00e1t. A sz\u00e1mla kikapcsol\u00e1s\u00e1val a sz\u00e1mla felhaszn\u00e1l\u00f3inak hozz\u00e1f\u00e9r\u00e9se az er\u0151forr\u00e1sokhoz megsz\u00fcnik. Minden fut\u00f3 virtu\u00e1lis g\u00e9p azonnal le lesz \u00e1ll\u00edtva. -message.disable.snapshot.policy=Sikeresen kikapcsoltad a jelenlegi pillanatfelv\u00e9tel szab\u00e1lyt. -message.disable.user=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a felhaszn\u00e1l\u00f3t\! -message.disable.vpn.access=Er\u0151s\u00edtsd meg, hogy ki akarod kapcsolni a t\u00e1voli VPN hozz\u00e1f\u00e9r\u00e9st\! -message.disable.vpn=Biztosan ki akarod kapcsolni a VPN-t? -message.disabling.network.offering=H\u00e1l\u00f3zat aj\u00e1nlat kikapcsol\u00e1sa -message.disabling.vpc.offering=VPC aj\u00e1nlat kikapcsol\u00e1sa -message.disallowed.characters=Nem enged\u00e9lyezett karakterek\: \\<\\,\\> -message.download.ISO=Az ISO let\u00f6lt\u00e9s\u00e9hez kattints 00000 -message.download.template=A sablon let\u00f6lt\u00e9s\u00e9hez kattints 00000 -message.download.volume=A k\u00f6tet let\u00f6lt\u00e9s\u00e9hez kattints href\="\#">00000 -message.download.volume.confirm=Er\u0151s\u00edtsd meg, hogy le akarod t\u00f6lteni ezt a k\u00f6tetet\! -message.edit.account=Szerkeszt\u00e9s ("-1" jelzi az er\u0151forr\u00e1s haszn\u00e1lat\u00e1nak korl\u00e1tlans\u00e1g\u00e1t) -message.edit.confirm=K\u00e9rlek er\u0151s\u00edtsd meg a v\u00e1ltoztat\u00e1sokat miel\u00f6tt elmented\! -message.edit.limits=Hat\u00e1rozz meg korl\u00e1tokat a k\u00f6vetkez\u0151 er\u0151forr\u00e1sokhoz\! A "-1" jelzi a korl\u00e1tlanan felhaszn\u00e1l\u00e1st. -message.edit.traffic.type=Please specify the traffic label you want associated with this traffic type. -message.enable.account=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a sz\u00e1ml\u00e1t\! -message.enabled.vpn=A t\u00e1voli hozz\u00e1f\u00e9r\u00e9s\u0171 VPN jelenleg be van kapcsolva \u00e9s hozz\u00e1f\u00e9rhet\u0151 az IP c\u00edmmel -message.enabled.vpn.ip.sec=Your IPSec pre-shared key is -message.enable.user=Er\u0151s\u00edtsd meg, hogy be akarod kapcsolni ezt a felhaszn\u00e1l\u00f3t\! -message.enable.vpn.access=A VPN jelenleg ki van kapcsolva erre az IP c\u00edmre. Szeretn\u00e9d bekapcsolni a VPN hozz\u00e1f\u00e9r\u00e9st? -message.enable.vpn=Er\u0151s\u00edtsd meg, hogy be szeretn\u00e9d kapcsolni a t\u00e1voli hozz\u00e1f\u00e9r\u00e9s\u0171 VPN-t ehhez az IP c\u00edmhez\! -message.enabling.network.offering=H\u00e1l\u00f3zat aj\u00e1nlat bekapcsol\u00e1sa -message.enabling.security.group.provider=Biztons\u00e1gi csoport szolg\u00e1ltat\u00f3 bekapcsol\u00e1sa -message.enabling.vpc.offering=VPC aj\u00e1nlat bekapcsol\u00e1sa -message.enabling.zone.dots=Z\u00f3na enged\u00e9lyez\u00e9se... -message.enabling.zone=Z\u00f3na bekapcsol\u00e1sa -message.enter.seperated.list.multiple.cidrs=Add meg a CIDR list\u00e1t vessz\u0151kkel elv\u00e1laszva, ha egyn\u00e9l t\u00f6b van\! -message.enter.token=Add meg a token-t, amit a megh\u00edv\u00f3ban kapt\u00e1l\! -message.generate.keys=Er\u0151s\u00edtsd meg, hogy \u00faj kulcsokat szeretn\u00e9l gener\u00e1lni a felhaszn\u00e1l\u00f3nak\! -message.gslb.delete.confirm=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a GSLB-t\! -message.gslb.lb.remove.confirm=Please confirm you want to remove load balancing from GSLB -message.guest.traffic.in.advanced.zone=A vend\u00e9g h\u00e1l\u00f3zat forgalom kommunik\u00e1ci\u00f3 v\u00e9gfelhaszn\u00e1l\u00f3i virtu\u00e1lis g\u00e9pek k\u00f6z\u00f6tt. Hat\u00e1rozz meg egy VLAN ID tartom\u00e1nyt a vend\u00e9g h\u00e1l\u00f3zatok forgalm\u00e1nak minden fizikai h\u00e1l\u00f3zathoz\! -message.guest.traffic.in.basic.zone=A vend\u00e9g h\u00e1l\u00f3zat forgalma kommunik\u00f3ci\u00f3 v\u00e9gfelhaszn\u00e1l\u00f3i virtu\u00e1lis g\u00e9pek k\u00f6z\u00f6tt. Hat\u00e1rozz meg egy IP c\u00edmtartom\u00e1nyt, amelyb\u0151l a CloudStack a virtu\u00e1lis g\u00e9pekhez rendelhet c\u00edmet. Gy\u0151z\u0151dj meg r\u00f3la, hogy ez a tartom\u00e1ny nincs \u00e1tfed\u00e9sben az elk\u00fcl\u00f6n\u00edtett rendszer IP tartom\u00e1nnyal\! -message.host.dedicated=Dedik\u00e1lt kiszolg\u00e1l\u00f3 -message.host.dedication.released=Kiszolg\u00e1l\u00f3 elengedve -message.installWizard.click.retry=Kattints az ind\u00edt\u00e1s gombra az ism\u00e9tl\u00e9shez. -message.installWizard.copy.whatIsACluster=A f\u00fcrt kiszolg\u00e1l\u00f3k csoportja. A f\u00fcrt kiszolg\u00e1l\u00f3i egyforma hardverrel rendelkeznek, ugyanazt a hi\u0151erv\u00edzort haszn\u00e1lj\u00e1k, ugyanazon az alh\u00e1l\u00f3zaton tal\u00e1lhat\u00f3ak \u00e9s hozz\u00e1f\u00e9rnek ugyanahhoz az osztott t\u00e1rhoz. A virtu\u00e1lis g\u00e9pek egy f\u00fcrt\u00f6n bel\u00fcl \u00e1tk\u00f6lt\u00f6ztethet\u0151 m\u00e1sik kiszolg\u00e1l\u00f3ra ann\u00e9lk\u00fcl, hogy annak m\u0171k\u00f6d\u00e9s\u00e9t megszak\u00edtan\u00e1nk. A f\u00fcrt a CloudStack&\#8482; harmadik legnagyobb egys\u00e9ge. A f\u00fcrt\u00f6k pod-okba, a pod-ok z\u00f3n\u00e1kba rendez\u0151dnek.

A CloudStack&\#8482; lehet\u0151v\u00e9 teszi, hogy t\u00f6bb f\u00fcrt\u00f6t haszn\u00e1lj, de egy alap telep\u00edt\u00e9sben csak egy f\u00fcrtre van sz\u00fcks\u00e9g. -message.installWizard.copy.whatIsAHost=A kiszolg\u00e1l\u00f3 egy sz\u00e1m\u00edt\u00f3g\u00e9p. A kiszolg\u00e1l\u00f3k biztos\u00edtj\u00e1k a sz\u00e1m\u00edt\u00e1si er\u0151forr\u00e1sokat, amelyeket a virtu\u00e1lis g\u00e9pek felhaszn\u00e1lnak. Minden kiszolg\u00e1l\u00f3 rendelkezik hipervizor szoftverrel, amely a vend\u00e9g VM-eket futtatja (kiv\u00e9tel a bare-metal kiszolg\u00e1l\u00f3k). P\u00e9ld\u00e1ul egy Linux KVM szerver, Citrix XenServer vagy egy ESXi szerver. Az alaptelep\u00edt\u00e9sben csak egy KVM-et vagy XenServer-t futtat\u00f3 kiszolg\u00e1l\u00f3t haszn\u00e1lunk.

A kiszolg\u00e1l\u00f3 a CloudStack&\#8482; telep\u00edt\u00e9s legkissebb egys\u00e9ge. A kiszolg\u00e1l\u00f3k f\u00fcrt\u00f6kbe, a f\u00fcrt\u00f6k pod-okba, a pod-ok z\u00f3n\u00e1kba rendez\u0151dnek. -message.installWizard.copy.whatIsAPod=A pod-ra gyakran egy rack-szekr\u00e9nyt jelent. Az egy pod-ban tal\u00e1lhat\u00f3 kiszolg\u00e1l\u00f3k egy alh\u00e1l\u00f3zaton vannak.

A pod a CloudStack&\#8482; telep\u00edt\u00e9s m\u00e1sodik legnagyobb egys\u00e9ge. A pod-ok z\u00f3n\u00e1kat alkotnak. Minden z\u00f3na tartalmazhat egy vagy t\u00f6bb pod-ot. Az alaptelep\u00edt\u00e9sben csak egy pod-ra van sz\u00fcks\u00e9g\u00fcnk. -message.installWizard.copy.whatIsAZone=A z\u00f3na a CloudStack&\#8482; telep\u00edt\u00e9s legnagyobb egys\u00e9ge. Egy z\u00f3na \u00e1ltal\u00e1ban egy adatk\u00f6zpontnak felel meg, b\u00e1r megengedhet\u0151 egy adatk\u00f6zponton bel\u00fcl t\u00f6bb z\u00f3na l\u00e9trehoz\u00e1sa. Az er\u0151forr\u00e1sok z\u00f3n\u00e1kra val\u00f3 oszt\u00e1s\u00e1nak c\u00e9lja a redundancia \u00e9s a fizikai izol\u00e1ci\u00f3. P\u00e9ld\u00e1ul minden z\u00f3n\u00e1nak lehet saj\u00e1t \u00e1ramell\u00e1t\u00e1sa \u00e9s h\u00e1l\u00f3zati kapcsolata, valamint a z\u00f3n\u00e1k f\u00f6ldrajzilag egym\u00e1st\u00f3l t\u00e1vol helyezkedhetnek el (b\u00e1r ez nem felt\u00e9tlen\u00fcl sz\u00fcks\u00e9ges). -message.installWizard.copy.whatIsCloudStack=A CloudStack&\#8482 egy szoftver, amely sz\u00e1m\u00edt\u00e1si er\u0151forr\u00e1sokat fel\u00fcgyel \u00e9s alkalmas publikus, priv\u00e1t, vagy hibrid infrastrukt\u00fara szolg\u00e1ltat\u00e1s (IaaS) felh\u0151k \u00e9p\u00edt\u00e9s\u00e9re. A CloudStack&\#8482 ir\u00e1ny\u00edtja a h\u00e1l\u00f3zatokat, az adatt\u00e1rol\u00f3kat \u00e9s kiszolg\u00e1l\u00f3kat, amelyek a felh\u0151 infrastrukt\u00far\u00e1t alkotj\u00e1k.

A k\u00fcl\u00f6n\u00e1ll\u00f3 virtu\u00e1lis g\u00e9peken t\u00fal a CloudStack&\#8482 teljes felh\u0151 insfrastrukt\u00far\u00e1t szolg\u00e1ltat. Ny\u00edlt forr\u00e1sk\u00f3d\u00fa \u00e9s pr\u00e9mium verzi\u00f3k egyar\u00e1nt el\u00e9rhet\u0151ek, a ny\u00edlt forr\u00e1sk\u00f3d\u00fa verzi\u00f3k k\u00f6zel azonos k\u00e9pess\u00e9gekkel rendelkeznek. -message.installWizard.copy.whatIsPrimaryStorage=A CloudStack&\#8482; infrastrukt\u00fara k\u00e9t f\u00e9le afatt\u00e1rol\u00f3t haszn\u00e1l\: els\u0151dleges \u00e9s m\u00e1sodlagos t\u00e1rat. Mindkett\u0151 lehet ezek k\u00f6z\u00fcl iSCIS, NFS vagy helyi merevlemez.

Az els\u0151dleges t\u00e1r egy f\u00fcrth\u00f6z kapcsol\u00f3dik \u00e9s a f\u00fcrt\u00f6n fut\u00f3 virtu\u00e1lis g\u00e9pek virtu\u00e1lis merevlemezeit t\u00e1rolja. Az els\u0151dleges t\u00e1r tipikusan a kiszolg\u00e1l\u00f3khoz k\u00f6zel tal\u00e1lhat\u00f3. -message.installWizard.copy.whatIsSecondaryStorage=A m\u00e1sodlagos t\u00e1r egyz\u00f3n\u00e1hoz tartozik \u00e9s a k\u00f6vetkez\u0151ket tartalmazza\:
  • Sablonok - Telep\u00edtett oper\u00e1ci\u00f3s rendszerek, amelyek a VM-ek l\u00e9trehoz\u00e1s\u00e1ra haszn\u00e1lhat\u00f3 \u00e9s tartalmazhat egy\u00e9b konfigur\u00e1ci\u00f3s inform\u00e1ci\u00f3kat, mint pl telep\u00edtett alkalmaz\u00e1sok.
  • ISO f\u00e1jlok - OS images that can be bootable or non-bootable
  • Disk volume snapshots - saved copies of VM data which can be used for data recovery or to create new templates
-message.installWizard.now.building=A felh\u0151d most \u00e9p\u00fcl... -message.installWizard.tooltip.addCluster.name=A f\u00fcrt neve. Ez tetsz\u0151leges \u00e1ltalad v\u00e1lasztott sz\u00f6veg lehet. -message.installWizard.tooltip.addHost.hostname=A kiszolg\u00e1l\u00f3 IP c\u00edme vagy DNS neve. -message.installWizard.tooltip.addHost.password=A fenti felhaszn\u00e1l\u00f3 jelszava. -message.installWizard.tooltip.addHost.username=\u00c1ltal\u00e1ban root. -message.installWizard.tooltip.addPod.name=A pod neve -message.installWizard.tooltip.addPod.reservedSystemEndIp=This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers. -message.installWizard.tooltip.addPod.reservedSystemGateway=\u00c1tj\u00e1r\u00f3 a pod kiszolg\u00e1l\u00f3inak. -message.installWizard.tooltip.addPod.reservedSystemNetmask=A h\u00e1l\u00f3zati maszk, amit a vend\u00e9g oper\u00e1ci\u00f3s rendszerek haszn\u00e1lnak majd. -message.installWizard.tooltip.addPod.reservedSystemStartIp=This is the IP range in the private network that the CloudStack uses to manage Secondary Storage VMs and Console Proxy VMs. These IP addresses are taken from the same subnet as computing servers. -message.installWizard.tooltip.addPrimaryStorage.name=A t\u00e1r eszk\u00f6z neve. -message.installWizard.tooltip.addPrimaryStorage.path=(NFS eset\u00e9ben) In NFS this is the exported path from the server. Path (for SharedMountPoint). With KVM this is the path on each host that is where this primary storage is mounted. For example, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(NFS, iSCSI vagy PreSetup eset\u00e9ben) A t\u00e1reszk\u00f6z IP vagy DNS c\u00edme. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=A m\u00e1sodlagos t\u00e1rat kiszolg\u00e1l\u00f3 NFS szerver IP c\u00edme -message.installWizard.tooltip.addSecondaryStorage.path=A fenti szerveren kiexport\u00e1lt \u00fatvonal -message.installWizard.tooltip.addZone.dns1=Ezeket a DNS szervereket a z\u00f3na vend\u00e9g VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket publikus h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni, amelyet k\u00e9s\u0151bb veszel fel. A z\u00f3na publikus IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez. -message.installWizard.tooltip.addZone.dns2=Ezeket a DNS szervereket a z\u00f3na vend\u00e9g VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket publikus h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni, amelyet k\u00e9s\u0151bb veszel fel. A z\u00f3na publikus IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez. -message.installWizard.tooltip.addZone.internaldns1=Ezeket a DNS szervereket a z\u00f3na rendszer VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket priv\u00e1t h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni. A z\u00f3na priv\u00e1t IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez. -message.installWizard.tooltip.addZone.internaldns2=Ezeket a DNS szervereket a z\u00f3na rendszer VM-ei haszn\u00e1lj\u00e1k. A DNS szervereket priv\u00e1t h\u00e1l\u00f3zaton fogj\u00e1k el\u00e9rni. A z\u00f3na priv\u00e1t IP c\u00edmeinek hozz\u00e1 kell tudni f\u00e9rnie az itt megnevezett DNS szerverhez. -message.installWizard.tooltip.addZone.name=A z\u00f3na neve -message.installWizard.tooltip.configureGuestTraffic.description=A h\u00e1l\u00f3zat le\u00edr\u00e1sa -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=The range of IP addresses that will be available for allocation to guests in this zone. If one NIC is used, these IPs should be in the same CIDR as the pod CIDR. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=A h\u00e1l\u00f3zati \u00e1tj\u00e1r\u00f3, amelyet a vend\u00e9g rendszerek haszn\u00e1lhatnak -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=A veng\u00e9g rendszerek h\u00e1l\u00f3zat\u00e1nak maszkja -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=The range of IP addresses that will be available for allocation to guests in this zone. If one NIC is used, these IPs should be in the same CIDR as the pod CIDR. -message.installWizard.tooltip.configureGuestTraffic.name=A h\u00e1l\u00f3zat neve -message.instance.scaled.up.confirm=T\u00e9nyleg nagyobbra akarod m\u00e9retezni a p\u00e9ld\u00e1nyt? -message.instanceWizard.noTemplates=You do not have any templates available; please add a compatible template, and re-launch the instance wizard. -message.ip.address.changed=Az IP c\u00edmid megv\u00e1ltzhattak, szeretn\u00e9d friss\u00edteni a list\u00e1t? Ebben az esetben a r\u00e9szletek f\u00fcl be fog z\u00e1rulni. -message.iso.desc=A merevlemez k\u00e9p, amely az ind\u00edthat\u00f3 oper\u00e1ci\u00f3s rendszert tartalmazza -message.join.project=Csatlakozt\u00e1l egy projekthez. V\u00e1lts a projekt n\u00e9zetre\! -message.launch.vm.on.private.network=Szeretn\u00e9d a saj\u00e1t dedik\u00e1lt h\u00e1l\u00f3zatodon ind\u00edtani a p\u00e9ld\u00e1nyt? -message.launch.zone=A z\u00f3na k\u00e9szen \u00e1ll az ind\u00edt\u00e1sra, folytasd a k\u00f6vetkez\u0151 l\u00e9p\u00e9ssel -message.listView.subselect.multi=(Ctrl/Cmd-kattint\u00e1s) -message.lock.account=Er\u0151s\u00edtsd meg, hogy z\u00e1rolni akarod ezt a sz\u00e1ml\u00e1t. A sz\u00e1mla z\u00e1rol\u00e1s\u00e1val a sz\u00e1mla felhaszn\u00e1l\u00f3i nem lesznek k\u00e9pesek a felh\u0151 er\u0151forr\u00e1saikat vez\u00e9relni. A l\u00e9tez\u0151 er\u0151forr\u00e1sok tov\u00e1bbra is hozz\u00e1f\u00e9rhet\u0151ek lesznek. -message.migrate.instance.confirm=Er\u0151s\u00edtsd meg a kiszolg\u00e1l\u00f3 v\u00e1laszt\u00e1st, ahova a virtu\u00e1lis g\u00e9pet mozgatn\u00e1d\! -message.migrate.instance.to.host=Er\u0151s\u00edtsd meg, hogy m\u00e1sik kiszolg\u00e1l\u00f3ra akarod mozgatni a p\u00e9ld\u00e1nyt\! -message.migrate.instance.to.ps=Er\u0151s\u00edtsd meg, hogy a p\u00e9ld\u00e1nyt m\u00e1sik els\u0151dleges t\u00e1rra szeretn\u00e9d mozgatni\! -message.migrate.router.confirm=Er\u0151s\u00edtsd meg, hogy a routert mozgatni szeretn\u00e9d a k\u00f6vetkez\u0151 c\u00e9lpontra\: -message.migrate.systemvm.confirm=Er\u0151s\u00edtsd meg, hogy a rendszer VM-et a k\u00f6vetkez\u0151 c\u00e9lpontra szeretn\u00e9d mozgatni\: -message.migrate.volume=Er\u0151s\u00edtsd meg, hogy m\u00e1sik els\u0151dleges t\u00e1rra akarod mozgatni a k\u00f6tetet -message.network.addVM.desc=Please specify the network that you would like to add this VM to. A new NIC will be added for this network. -message.network.addVMNIC=Er\u0151s\u00edtsd meg, hogy szeretn\u00e9l egy \u00faj VM NIC-et ehhez a h\u00e1l\u00f3zathoz\! -message.new.user=A k\u00f6vetkez\u0151ket adja meg \u00faj sz\u00e1mla l\u00e9trehoz\u00e1s\u00e1hoz -message.no.affinity.groups=Nincsenek affin\u00edt\u00e1si csoportaid. K\u00e9rlek folytasd a k\u00f6vetkez\u0151 l\u00e9p\u00e9ssel\! -message.no.host.available=Nincs el\u00e9rhet\u0151 kiszolg\u00e1l\u00f3 az \u00e1tk\u00f6lt\u00f6ztet\u00e9shez -message.no.network.support=A kiv\u00e1lasztott hipervizor, a vSphere nem t\u00e1mogat semmilyen tov\u00e1bbi h\u00e1l\u00f3zat be\u00e1ll\u00edt\u00e1st. Folytasd az 5. l\u00e9p\u00e9ssel\! -message.no.network.support.configuration.not.true=Nincs olyan z\u00f3n\u00e1d, amelyben a biztons\u00e1gi csoportok be lenne kapcsolva, \u00edgy a tov\u00e1bbi h\u00e1l\u00f3zati lehet\u0151s\u00e9gek nem \u00e9rhet\u0151ek el. Folytasd az 5. l\u00e9p\u00e9ssel\! -message.no.projects.adminOnly=Nincsenek projekteid.
K\u00e9rd meg az adminisztr\u00e1tort, hogy hozzon l\u00e9tre neked egyet\! -message.no.projects=Nincsenek projekteid.
A Projektek szekci\u00f3ban tudsz \u00fajat csin\u00e1lni. -message.number.clusters=

F\u00fcrt\u00f6k sz\u00e1ma

-message.number.hosts=

Kiszolg\u00e1l\u00f3k sz\u00e1ma

-message.number.pods=

Pods-ok sz\u00e1ma

-message.number.storage=

Els\u0151dleges t\u00e1r k\u00f6teteksz\u00e1ma

-message.number.zones=

Z\u00f3n\u00e1k sz\u00e1ma

-message.password.has.been.reset.to=A jelsz\u00f3 \u00fajrabe\u00e1ll\u00edtva\: -message.password.of.the.vm.has.been.reset.to=A VM jelszava \u00fajrabe\u00e1ll\u00edtva\: -message.pending.projects.1=Projekt megh\u00edv\u00f3k v\u00e1rnak r\u00e1d\: -message.pending.projects.2=A megtekint\u00e9shez menj a projektek szekci\u00f3hoz \u00e9s v\u00e1laszd a megh\u00edv\u00f3kat a leg\u00f6rd\u00fcl\u0151 men\u00fcb\u0151l\! -message.please.add.at.lease.one.traffic.range=Adj meg legal\u00e1bb egy forgalom tartom\u00e1nyt\! -message.please.confirm.remove.ssh.key.pair=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod ezt az SSH kulcsp\u00e1rt\! -message.please.proceed=Menj tov\u00e1bb a k\u00f6vetkez\u0151 l\u00e9p\u00e9shez\! -message.please.select.a.configuration.for.your.zone=V\u00e1lassz konfigur\u00e1ci\u00f3t a z\u00f3n\u00e1dnak\! -message.please.select.a.different.public.and.management.network.before.removing=Please select a different public and management network before removing -message.please.select.networks=V\u00e1lassz h\u00e1l\u00f3zatokat a virtu\u00e1lis g\u00e9pedhez\! -message.please.select.ssh.key.pair.use.with.this.vm=V\u00e1lassz ki egy SSH kulcsp\u00e1rt, amelyet ezzel a VM-mel haszn\u00e1lni szeretn\u00e9l\! -message.please.wait.while.zone.is.being.created=K\u00e9rlek v\u00e1rj, am\u00edg a z\u00f3n\u00e1d l\u00e9trej\u00f6n. Ez eltarthat egy ideig... -message.pod.dedication.released=Pod dedik\u00e1ci\u00f3 elengedve -message.portable.ip.delete.confirm=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a hordozhat\u00f3 IP tartom\u00e1nyt\! -message.project.invite.sent=Megh\u00edv\u00f3 elk\u00fcldve a felhaszn\u00e1l\u00f3nak. A felhaszn\u00e1l\u00f3 akkor ker\u00fcl a projektbe, amikor elfogadja a megh\u00edv\u00f3t. -message.public.traffic.in.advanced.zone=Public traffic is generated when VMs in the cloud access the internet. Publicly-accessible IPs must be allocated for this purpose. End users can use the CloudStack UI to acquire these IPs to implement NAT between their guest network and their public network.

Provide at least one range of IP addresses for internet traffic. -message.public.traffic.in.basic.zone=A publikus forgalom akkor keletkezik, amikor a felh\u0151 virtu\u00e1lis g\u00e9pei hozz\u00e1f\u00e9rnek az internethez vagy az interneten szolg\u00e1ltat\u00e1sokat biztos\u00edtanak. Publikusan el\u00e9rhet\u0151 IP c\u00edmeket kell erre a c\u00e9lra elk\u00fcl\u00f6n\u00edteni. Amikor l\u00e9trej\u00f6n egy p\u00e9ld\u00e1ny, ezekb\u0151l a publikus IP c\u00edmekb\u0151l kap egyet a p\u00e9ld\u00e1ny a vend\u00e9g IP c\u00edmen k\u00edv\u00fcl. Statikus 1-1 NAT lesz be\u00e1ll\u0167va a publikus \u00e9s a vend\u00e9g IP c\u00edmek k\u00f6z\u00f6tt. V\u00e9gfelhaszn\u00e1l\u00f3k haszn\u00e1lhatj\u00e1k a CloudStack fel\u00fcletet is \u00faj IP c\u00edmek beszerz\u00e9s\u00e9hez \u00e9s statikus NAT be\u00e1ll\u00edt\u00e1s\u00e1hoz. -message.read.admin.guide.scaling.up=Olvasd el az adminisztr\u00e1torok \u00fatmutat\u00f3j\u00e1ban a dinamikus m\u00e9retez\u00e9sre vonatkoz\u00f3 r\u00e9szt miel\u0151tt folytatod\! -message.recover.vm=Er\u0151s\u00edtsd meg, hogy helyre akarod \u00e1ll\u00edtani a VM-et. -message.redirecting.region=\u00c1tir\u00e1ny\u00edt\u00e1s r\u00e9gi\u00f3ba... -message.reinstall.vm=Figyelmeztet\u00e9s\: \u00d3vatosan\! Ha folytatod, a VM \u00fajra lesz telep\u00edtve a sablon alapj\u00e1n, a f\u0151 lemez\u00e9n tal\u00e1lhat\u00f3 adat elveszik. Amennyiben vannak tov\u00e1bbi merevlemezek, azok \u00e9rintetlenek maradnak. -message.removed.ssh.key.pair=SSH kulcsp\u00e1r elt\u00e1vol\u00edtva -message.remove.ldap=Biztosan t\u00f6r\u00f6lni akarod az LDAP konfigur\u00e1ci\u00f3t? -message.remove.region=Biztosan t\u00f6r\u00f6lni akarod ezt a r\u00e9gi\u00f3t err\u0151l a vez\u00e9rl\u0151 szerverr\u0151l? -message.remove.vpc=Er\u0151s\u00edtsd meg, hoy el akarod t\u00e1vol\u00edtani ezt a VPC-t\! -message.remove.vpn.access=Er\u0151s\u00edtsd meg, hogy t\u00f6r\u00f6lni akarod a k\u00f6vetkez\u0151 felhaszn\u00e1l\u00f3 VPN hozz\u00e1f\u00e9r\u00e9s\u00e9t\! -message.reset.password.warning.notPasswordEnabled=A p\u00e9ld\u00e1ny sablonja jelsz\u00f3 bekapcsol\u00e1sa n\u00e9lk\u00fcl lett l\u00e9trehozva -message.reset.password.warning.notStopped=A p\u00e9ld\u00e1nyt le kell \u00e1ll\u00edtanod, miel\u0151tt megpr\u00f3b\u00e1ln\u00e1l jelsz\u00f3t be\u00e1ll\u00edtani. -message.reset.VPN.connection=Er\u0151s\u00edtsd meg, hogy alaphelyzetbe akarod \u00e1ll\u00edtani a VPN kapcsolatot\! -message.restart.mgmt.server=Ind\u00edtsd \u00fajra a vez\u00e9rl\u0151 szervert (szervereket) ahhoz, hogy az \u00faj be\u00e1ll\u00edt\u00e1s hat\u00e1lyba l\u00e9pjen\! -message.restart.mgmt.usage.server=Please restart your management server(s) and usage server(s) for your new settings to take effect. -message.restart.network=Megszakad minden szolg\u00e1ltat\u00e1s, amit a h\u00e1l\u00f3zat biztos\u00edt. Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a h\u00e1l\u00f3zatot\! -message.restart.vpc=Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a VPC-t\! -message.restart.vpc.remark=Er\u0151s\u00edtsd meg, hogy \u00fajra akarod ind\u00edtani a VPC-t\!

Megjegyz\u00e9s\: egy nem redund\u00e1ns VPC redund\u00e1nss\u00e1 t\u00e9tele takar\u00edt\u00e1st tesz sz\u00fcks\u00e9gess\u00e9. A h\u00e1l\u00f3zatok nem lesznek el\u00e9rhet\u0151ek egy p\u00e1r percig..

-message.restoreVM=Helyre akarod \u00e1ll\u00edtani a VM-et? -message.security.group.usage=(A Ctrl-kattint\u00e1s haszn\u00e1lat\u00e1val tudod az \u00f6sszes alkalmazhat\u00f3 biztons\u00e1gi csoportot kiv\u00e1lasztani) -message.select.affinity.groups=V\u00e1lasszd ki azokat az affinit\u00e1si csoportokat, amelyekhez a VM tartozzon\: -message.select.a.zone=Egy z\u00f3na tipikusan egy adatk\u00f6zpontnak felel meg. T\u00f6bb z\u00f3na seg\u00edthet a felh\u0151t megb\u00edzhat\u00f3bb\u00e1 tenni fizikai izol\u00e1ci\u00f3val \u00e9s redundanci\u00e1val. -message.select.instance=V\u00e1lassz egy p\u00e9ld\u00e1nyt\! -message.select.iso=V\u00e1lassz egy ISO-t az \u00faj virtu\u00e1lis p\u00e9ld\u00e1nynak\! -message.select.item=V\u00e1lassz egy elemet\! -message.select.security.groups=V\u00e1lassz biztons\u00e1gi csoportokat az \u00faj VM-hez\! -message.select.template=V\u00e1lassz egy sablont az \u00faj virtu\u00e1lis p\u00e9ld\u00e1nynak\! -message.select.tier=V\u00e1lassz egy r\u00e9teget\! -message.set.default.NIC=Er\u0151s\u00edtsd meg, hogy alap\u00e9rtelmezett\u00e9 szeretn\u00e9d tenni ezt a NIC-et a VM-ben\! -message.set.default.NIC.manual=Most manu\u00e1lisan m\u00f3dos\u00edtsd apal\u00e9rtelmezett NIC-et a VM-ben\! -message.setup.physical.network.during.zone.creation.basic=Alap z\u00f3na l\u00e9trehoz\u00e1sakor egy fizikai h\u00e1l\u00f3zatot hozhatsz l\u00e9tre amely hiperv\u00edzor h\u00e1l\u00f3zati k\u00e1rty\u00e1j\u00e1nak felel meg.

M\u00e1s forgalom-t\u00edpusokat is r\u00e1h\u00fazhatsz a fizikai h\u00e1l\u00f3zatra. -message.setup.physical.network.during.zone.creation=Halad\u00f3 z\u00f3na l\u00e9trehoz\u00e1sakor egy vagy t\u00f6bb fizikai h\u00e1l\u00f3zatot kell konfigur\u00e1lnod. Minden h\u00e1l\u00f3zat egy h\u00e1l\u00f3zati k\u00e1rty\u00e1nak felel meg a hiperv\u00edzoron. Minden fizikai h\u00e1l\u00f3zat egy vagy t\u00f6bb t\u00edpus\u00fa forgalmat bonyol\u00edthat, bizonyos megk\u00f6t\u00e9sekkel arra, hogy azokat hogyan lehet kombin\u00e1lni.

H\u00fazz egy vagy t\u00f6bb forgalom t\u00edpust minden fizikai h\u00e1l\u00f3zatra. -message.setup.successful=A felh\u0151 be\u00e1ll\u00edt\u00e1sa sikeres\! -message.specifiy.tag.key.value=Please specify a tag key and value -message.specify.url=K\u00e9rlek adj meg egy URL-t\! -message.step.1.continue=V\u00e1lassz egy sablont vagy ISO-t a folytat\u00e1shoz -message.step.1.desc=Please select a template for your new virtual instance. You can also choose to select a blank template from which an ISO image can be installed onto. -message.step.2.continue=V\u00e1lassz egy aj\u00e1nlatot a folytat\u00e1shoz\! -message.step.3.continue=V\u00e1lassz egy merevlemez aj\u00e1nlatot a folytat\u00e1shoz\! -message.step.4.continue=V\u00e1lassz legal\u00e1bb egy h\u00e1l\u00f3zatot a folytat\u00e1shoz\! -message.step.4.desc=Please select the primary network that your virtual instance will be connected to. -message.storage.traffic=Forgalom a CloudStack felh\u0151 er\u0151forr\u00e1sai k\u00f6z\u00f6tt, bele\u00e9rtve azokat a komponenseket, amelyek a vez\u00e9rl\u0151 szerverrel kommunik\u00e1lnak, mint a kiszolg\u00e1l\u00f3k \u00e9s a rendszer VM-ek. \u00c1ll\u00edtsd be a t\u00e1r forgalmat itt\! -message.suspend.project=Biztosan fel akarod f\u00fcggeszteni ezt a projektet? -message.systems.vms.ready=A rendszer VM-ek elk\u00e9sz\u00fcltek. -message.template.copying=A sablon m\u00e1sol\u00e1s alatt \u00e1ll. -message.template.desc=Oper\u00e1ci\u00f3s rendszer k\u00e9p, amelyet a virtu\u00e1lis g\u00e9pek el tudnak ind\u00edtani -message.tier.required=A r\u00e9teg k\u00f6telez\u0151. -message.tooltip.dns.1=Name of a DNS server for use by VMs in the zone. The public IP addresses for the zone must have a route to this server. -message.tooltip.dns.2=A second DNS server name for use by VMs in the zone. The public IP addresses for the zone must have a route to this server. -message.tooltip.internal.dns.1=Egy DNS szerver neve, a z\u00f3na bels\u0151 rendszer VM-einek kiszolg\u00e1l\u00e1s\u00e1ra. A pod-ok priv\u00e1t IP c\u00edmeinek sz\u00fcks\u00e9ge van egy \u00fatvonalhoz ehhez a c\u00edmhez. -message.tooltip.internal.dns.2=Egy DNS szerver neve, a z\u00f3na bels\u0151 rendszer VM-einek kiszolg\u00e1l\u00e1s\u00e1ra. A pod-ok priv\u00e1t IP c\u00edmeinek sz\u00fcks\u00e9ge van egy \u00fatvonalhoz ehhez a c\u00edmhez. -message.tooltip.network.domain=A DNS suffix that will create a custom domain name for the network that is accessed by guest VMs. -message.tooltip.pod.name=N\u00e9v a pod-nak -message.tooltip.reserved.system.gateway=Az \u00e1tj\u00e1r\u00f3 a pod kiszolg\u00e1l\u00f3i sz\u00e1m\u00e1ra -message.tooltip.reserved.system.netmask=The network prefix that defines the pod subnet. Uses CIDR notation. -message.tooltip.zone.name=N\u00e9v a z\u00f3n\u00e1nak. -message.update.os.preference=Hat\u00e1rozz meg egy OS preferenci\u00e1t a kiszolg\u00e1l\u00f3hoz. Minden p\u00e9ld\u00e1ny, aminek hasonl\u00f3 preferenci\u00e1i vannak el\u0151sz\u00f6r ezen a kiszolg\u00e1l\u00f3n indul el. -message.update.resource.count=Er\u0151s\u00edtsd meg, hogy m\u00f3dos\u00edtani akarod a sz\u00e1mla er\u0151forr\u00e1sainak sz\u00e1m\u00e1t\! -message.update.ssl.failed=Nem siker\u00fclt az SSL tan\u00fas\u00edtv\u00e1nyt m\u00f3dos\u00edtani -message.update.ssl=Please submit a new X.509 compliant SSL certificate chain to be updated to each console proxy and secondary storage virtual instance\: -message.update.ssl.succeeded=Az SSL tan\u00fas\u00edtv\u00e1nyok m\u00f3dos\u00edt\u00e1sa sikeres -message.validate.accept=Please enter a value with a valid extension. -message.validate.creditcard=Adj meg egy \u00e9rv\u00e9nyes bankk\u00e1rtyasz\u00e1mot\! -message.validate.date=Adj meg egy \u00e9rv\u00e9nyes d\u00e1tumot\! -message.validate.date.ISO=Adj meg egy \u00e9rv\u00e9nyes (ISO) d\u00e1tumot\! -message.validate.digits=Csak sz\u00e1mjegyeket \u00edrj\! -message.validate.email.address=Adj meg egy \u00e9rv\u00e9nyes e-mail c\u00edmet\! -message.validate.equalto=\u00cdrd be ugyanazt az \u00e9rt\u00e9ket \u00fajra\! -message.validate.fieldrequired=Ez a mez\u0151 k\u00f6telez\u0151. -message.validate.fixfield=Jav\u00edtsd ki ez a mez\u0151t\! -message.validate.instance.name=A p\u00e9ld\u00e1ny neve nem lehet hosszabb 63 karaktern\u00e9l. Csak ASCII karakterek a-z \u00e9s A-Z, sz\u00e1mok 0-9 \u00e9s k\u00f6t\u0151jelek enged\u00e9lyezettek. Bet\u0171vel kell kezd\u0151dnie \u00e9s bet\u0171vel vagy sz\u00e1mmal kell v\u00e9gz\u0151dnie[ -message.validate.invalid.characters=\u00c9rv\u00e9nytelen karakter; k\u00e9rlek jav\u00edtsd\! -message.validate.max=Adj meg egy \u00e9rt\u00e9ket, ami legfeljebb {0}\! -message.validate.maxlength=Legfeljebb {0} karaktert adj meg\! -message.validate.minlength=Legal\u00e1bb {0} karaktert adj meg\! -message.validate.number=Adj meg egy \u00e9rv\u00e9nyes sz\u00e1mot\! -message.validate.range=Adj meg egy \u00e9rt\u00e9ket {0} \u00e9s {1} k\u00f6z\u00f6tt\! -message.validate.range.length=Adj meg egy {0} \u00e9s {1} k\u00f6z\u00f6tti hossz\u00fas\u00e1g\u00fa \u00e9rt\u00e9ket\! -message.validate.URL=Adj meg egy \u00e9rv\u00e9nyes URL-t\! -message.virtual.network.desc=A dedicated virtualized network for your account. The broadcast domain is contained within a VLAN and all public network access is routed out by a virtual router. -message.vm.create.template.confirm=Sablon l\u00e9trehoz\u00e1sa automatikusan \u00fajraind\u00edtja a VM-et\! -message.vm.review.launch=Please review the following information and confirm that your virtual instance is correct before launch. -message.vnmc.available.list=VNMC nem el\u00e9rhet\u0151 a szolg\u00e1ltat\u00f3 list\u00e1r\u00f3l. -message.vnmc.not.available.list=VNMC nem el\u00e9rhet\u0151 a szolg\u00e1ltat\u00f3 list\u00e1r\u00f3l. -message.volume.create.template.confirm=Please confirm that you wish to create a template for this disk volume. Creation of the template can range from several minutes to longer depending on the size of the volume. -message.waiting.for.builtin.templates.to.load=V\u00e1rakoz\u00e1s a be\u00e9p\u00edtett sablonk bet\u00f6lt\u00e9s\u00e9re... -message.XSTools61plus.update.failed=Failed to update Original XS Version is 6.1\\+ field. Error\: -message.you.must.have.at.least.one.physical.network=Sz\u00fcks\u00e9ged van legal\u00e1bb egy fizikai h\u00e1l\u00f3zatra. -message.your.cloudstack.is.ready=A CloudStack k\u00e9szen \u00e1ll\! -message.Zone.creation.complete=A z\u00f3na l\u00e9trehoz\u00e1sa befejez\u0151d\u00f6tt -message.zone.creation.complete.would.you.like.to.enable.this.zone=A z\u00f3na l\u00e9trehoz\u00e1sa befejez\u0151d\u00f6tt. Szeretn\u00e9d bekapcsolni a z\u00f3n\u00e1t? -message.zone.no.network.selection=A kiv\u00e1lasztott z\u00f3n\u00e1ban nem v\u00e1laszthat\u00f3 ki h\u00e1l\u00f3zat. -message.zone.step.1.desc=V\u00e1lassz h\u00e1l\u00f3zat modellt a z\u00f3n\u00e1dnak\! -message.zone.step.2.desc=Add meg a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat az \u00faj z\u00f3n\u00e1hoz -message.zone.step.3.desc=Add meg a k\u00f6vetkez\u0151 inform\u00e1ci\u00f3kat az \u00faj pod-hoz -message.zoneWizard.enable.local.storage=Figyelmeztet\u00e9s\: Ha bekapcsolod a helyi t\u00e1rat ebben a z\u00f3n\u00e1ban, akkor a k\u00f6vetkez\u0151t kell tenned att\u00f3l f\u00fcgg\u0151en, hogy hol szeretn\u00e9d elind\u00edtani a rendszer VM-eket\:

1. Ha a rendszer VM-eknek osztott els\u0151dleges t\u00e1ron kell futnia, akkor egy elosztott t\u00e1rat kell l\u00e9trehoznod a z\u00f3na l\u00e9trej\u00f6tte ut\u00e1n. A z\u00f3n\u00e1t kikapcsolt \u00e1llapotban kell elind\u00edtanod.

2. Ha a rendszer VM-eknek helyi els\u0151dleges t\u00e1ron kell futni, akkor a system.vm.use.local.storage \u00e9rt\u00e9k\u00e9t true-ra kell \u00e1ll\u00edtani miel\u00f6tt a z\u00f3n\u00e1t bekapcsolod.


Szeretn\u00e9d folytatni? -messgae.validate.min=Adj meg egy \u00e9rt\u00e9ket, ami legal\u00e1bb {0}\! -mode=M\u00f3d -network.rate=H\u00e1l\u00f3zati r\u00e1ta -notification.reboot.instance=P\u00e9ld\u00e1ny \u00fajraind\u00edt\u00e1sa -notification.start.instance=P\u00e9ld\u00e1ny ind\u00edt\u00e1sa -notification.stop.instance=P\u00e9ld\u00e1ny le\u00e1ll\u00edt\u00e1sa -side.by.side=Egym\u00e1s mellett -state.Accepted=Elfogadva -state.Active=Akt\u00edv -state.Allocated=Lek\u00f6t\u00f6ve -state.Allocating=Lek\u00f6t\u00e9s folyamatban -state.BackedUp=Lementve -state.BackingUp=Ment\u00e9s folyamatban -state.Completed=K\u00e9sz -state.Creating=K\u00e9sz\u00fcl -state.Declined=Elromlott -state.Destroyed=T\u00f6r\u00f6lt -state.detached=Lecsatolt -state.Disabled=Kikapcsolt -state.Enabled=Enged\u00e9lyezett -state.Error=Hiba -state.Expunging=T\u00f6rl\u00e9s alatt -state.Migrating=\u00c1thelyez\u00e9s alatt -state.Pending=F\u00fcgg -state.Ready=K\u00e9szen \u00e1ll -state.Running=Fut -state.Starting=Indul -state.Stopped=Le\u00e1ll\u00edtva -state.Stopping=Le\u00e1ll\u00e1s folyamatban -state.Suspended=Felf\u00fcggesztett -title.upload.volume=K\u00f6tet felt\u00f6lt\u00e9se -ui.listView.filters.all=Mind -ui.listView.filters.mine=Saj\u00e1t diff --git a/client/WEB-INF/classes/resources/messages_it_IT.properties b/client/WEB-INF/classes/resources/messages_it_IT.properties deleted file mode 100644 index 6fd390fc833e..000000000000 --- a/client/WEB-INF/classes/resources/messages_it_IT.properties +++ /dev/null @@ -1,1002 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Elementi delle propriet\u00e0 modificati -confirm.enable.s3=Si prega di inserire i valori richiesti per abilitare il supporto per il Secondary Storage di tipo S3 -confirm.enable.swift=Si prega di inserire i valori richiesti per abilitare il supporto per Swift -error.could.not.change.your.password.because.ldap.is.enabled=Errore non \u00e8 possibile cambiare la tua password perch\u00e8 LDAP \u00e8 abilitato. -error.could.not.enable.zone=Impossibile abilitare la zona -error.installWizard.message=E\\' stato rilevato un errore\: tornare agli step precedenti e correggere gli errori -error.invalid.username.password=Username o Password non valida -error.login=Le credenziali fornite per username/password non corrispondono a quelle nei nostri sistemi. -error.menu.select=Impossibile effettuare operazioni senza aver selezionato alcun elemento. -error.mgmt.server.inaccessible=Impossibile accedere al Management Server. Si prega di riprovare pi\u00f9 tardi. -error.password.not.match=I campi password non corrispondono -error.please.specify.physical.network.tags=Le offerte di rete non sono disponibili se non si specificano tag per questa rete fisica. -error.session.expired=La sessione \u00e8 scaduta. -error.something.went.wrong.please.correct.the.following=E\\' stato rilevato un errore; si prega di correggere quanto indicato di seguito -error.unable.to.reach.management.server=Impossibile raggiungere il Management Server -error.unresolved.internet.name=Il tuo nome internet non pu\u00f2 essere risolto. -force.delete.domain.warning=Attenzione\: La scelta di questa opzione provocher\u00e0 la rimozione di tutti i sotto domini e agli account associati e alle loro risorse. -force.delete=Forza la Cancellazione -force.remove=Forza la Rimozione -force.remove.host.warning=Attenzione\: La scelta di questa opzione provocher\u00e0 l\\'arresto forzato di tutte le virtual machine da parte di CloudStack prima di rimuovere questo host dal cluster. -force.stop=Forza l\\'Arresto -force.stop.instance.warning=Attenzione\: Forzare un arresto su questa instanza dovrebbe essere l\\'ultima opzione. C\\'\u00e8 il rischio di perdita di dati e di un comportamento inconsistente dello stato della virtual machine. -ICMP.code=Codice ICMP -ICMP.type=Tipo ICMP -image.directory=Directory Immagine -inline=Inline -instances.actions.reboot.label=Riavviare una instanza -label.about=About -label.about.app=About CloudStack -label.accept.project.invitation=Accettare un invito ad un progetto -label.account=Account -label.account.and.security.group=Account, Security group -label.account.id=ID dell\\'Account -label.account.name=Nome Account -label.account.specific=Specifico dell\\'Account -label.accounts=Utenti -label.acquire.new.ip=Acquisizione nuovo indirizzo IP -label.acquire.new.secondary.ip=Acquisizione nuovo IP secondario -label.action.attach.disk=Collegamento di un Disco -label.action.attach.disk.processing=Collegamento Disco in corso... -label.action.attach.iso=Collegamento di una immagine ISO -label.action.attach.iso.processing=Collegamento immagine ISO in corso... -label.action.cancel.maintenance.mode=Annullamento dello stato di Maintenance Mode -label.action.cancel.maintenance.mode.processing=Cancellazione dello stato Maintenance Mode in corso... -label.action.change.password=Modifica della Password -label.action.change.service=Modificare Servizio -label.action.change.service.processing=Modifica del Servizio in corso... -label.action.copy.ISO=Copia della immagine ISO -label.action.copy.ISO.processing=Copia immagine ISO in corso... -label.action.copy.template=Copia di un Template -label.action.copy.template.processing=Copia di un Template in corso... -label.action.create.template=Creazione Template -label.action.create.template.from.vm=Creazione Template da una VM -label.action.create.template.from.volume=Creazione Template da un Volume -label.action.create.template.processing=Creazione Template in corso... -label.action.create.vm=Creazione VM -label.action.create.vm.processing=Creazione VM in corso... -label.action.create.volume=Creazione Volume -label.action.create.volume.processing=Creazione Volume in corso... -label.action.delete.account=Cancellazione account -label.action.delete.account.processing=Cancellazione account in corso.... -label.action.delete.cluster=Cancellazione Cluster -label.action.delete.cluster.processing=Cancellazione Cluster in corso.... -label.action.delete.disk.offering=Cancellazione Offerta Disco -label.action.delete.disk.offering.processing=Cancellazione Offerta Disco in corso.... -label.action.delete.domain=Cancellazione Dominio -label.action.delete.domain.processing=Cancellazione Dominio in corso.... -label.action.delete.firewall=Cancellazione regola firewall -label.action.delete.firewall.processing=Cancellazione Firewall in corso.... -label.action.delete.ingress.rule=Cancella Regola in Ingresso -label.action.delete.ingress.rule.processing=Cancellazione della Regola in Ingresso in corso... -label.action.delete.IP.range=Cancellazione intervallo indirizzi IP -label.action.delete.IP.range.processing=Cancellazione intervallo indirizzi IP in corso.... -label.action.delete.ISO=Cancellazione immagine ISO -label.action.delete.ISO.processing=Cancellazione immagine ISO in corso.... -label.action.delete.load.balancer=Cancellazione regola load balancer -label.action.delete.load.balancer.processing=Cancellazione Load Balancer in corso.... -label.action.delete.network=Cancellazione Rete -label.action.delete.network.processing=Cancellazione Rete in corso.... -label.action.delete.nexusVswitch=Cancellare Nexus 1000v -label.action.delete.nic=Rimuovi NIC -label.action.delete.physical.network=Cancellazione di una rete fisica -label.action.delete.pod=Cancellazione Pod -label.action.delete.pod.processing=Cancellazione Pod in corso.... -label.action.delete.primary.storage=Cancellazione Storage Primario -label.action.delete.primary.storage.processing=Cancellazione Storage Primario in corso.... -label.action.delete.secondary.storage=Cancellazione Storage Secondario -label.action.delete.secondary.storage.processing=Cancellazione Storage Secondario in corso.... -label.action.delete.security.group=Cancellazione Security Group -label.action.delete.security.group.processing=Cancellazione Security Group in corso.... -label.action.delete.service.offering=Cancellazione Offerta di Servizio -label.action.delete.service.offering.processing=Cancellazione Offerta di Servizio in corso.... -label.action.delete.snapshot=Cancellazione Snapshot -label.action.delete.snapshot.processing=Cancellazione Snapshot in corso.... -label.action.delete.system.service.offering=Cancellare Offerta di Servizio di Sistema -label.action.delete.template=Cancellazione Template -label.action.delete.template.processing=Cancellazione Template in corso.... -label.action.delete.user=Cancellazione Utente -label.action.delete.user.processing=Cancellazione Utente in corso.... -label.action.delete.volume=Cancellazione Volume -label.action.delete.volume.processing=Cancellazione Volume in corso.... -label.action.delete.zone=Cancellazione Zona -label.action.delete.zone.processing=Cancellazione Zona in corso.... -label.action.destroy.instance.processing=Rimozione Instanza in corso.... -label.action.destroy.instance=Rimozione instanza -label.action.destroy.systemvm.processing=Rimozione VM di Sistema in corso.... -label.action.destroy.systemvm=Rimozione VM di sistema -label.action.detach.disk.processing=Scollegamento Disco in corso.... -label.action.detach.disk=Scollegamento di un Disco -label.action.detach.iso.processing=Scollegamento immagine ISO in corso.... -label.action.detach.iso=Scollegamento immagine ISO -label.action.disable.account=Disabilitazione account -label.action.disable.account.processing=Disabilitazione account in corso.... -label.action.disable.cluster=Disabilitazione Cluster -label.action.disable.cluster.processing=Disabilitazione Cluster in corso.... -label.action.disable.nexusVswitch=Disabilitare Nexus 1000v -label.action.disable.physical.network=Disabilitare la rete fisica -label.action.disable.pod=Disabilitazione Pod -label.action.disable.pod.processing=Disabilitazione Pod in corso.... -label.action.disable.static.NAT=Disabilitazione NAT Statico -label.action.disable.static.NAT.processing=Disabilitazione NAT Statico in corso.... -label.action.disable.user=Disabilitazione Utente -label.action.disable.user.processing=Disabilitazione Utente in corso.... -label.action.disable.zone=Disabilitazione Zona -label.action.disable.zone.processing=Disabilitazione Zona in corso.... -label.action.download.ISO=Download immagine ISO -label.action.download.template=Download Template -label.action.download.volume=Download Volume -label.action.download.volume.processing=Download Volume in corso.... -label.action.edit.account=Modifica account -label.action.edit.disk.offering=Modifica Offerta Disco -label.action.edit.domain=Modifica Dominio -label.action.edit.global.setting=Modifica Impostazioni Globali -label.action.edit.host=Modifica Host -label.action.edit.instance=Modifica Instanza -label.action.edit.ISO=Modifica immagine ISO -label.action.edit.network=Modifica Rete -label.action.edit.network.offering=Modifica Offerta di Rete -label.action.edit.network.processing=Modifica Rete in corso.... -label.action.edit.pod=Modifica Pod -label.action.edit.primary.storage=Modifica Storage Primario -label.action.edit.resource.limits=Modifica Limiti delle Risorse -label.action.edit.service.offering=Modifica Offerta di Servizio -label.action.edit.template=Modifica Template -label.action.edit.user=Modifica Utente -label.action.edit.zone=Modifica Zona -label.action.enable.account=Abilitazione account -label.action.enable.account.processing=Abilitazione account in corso.... -label.action.enable.cluster=Abilitazione Cluster -label.action.enable.cluster.processing=Abilitazione Cluster in corso.... -label.action.enable.maintenance.mode=Abilitazione dello stato Maintenance Mode -label.action.enable.maintenance.mode.processing=Abilitazione dello stato Maintenance Mode in corso.... -label.action.enable.nexusVswitch=Abilitare Nexus 1000v -label.action.enable.physical.network=Abilitare la rete fisica -label.action.enable.pod=Abilitazione Pod -label.action.enable.pod.processing=Abilitazione Pod in corso.... -label.action.enable.static.NAT=Abilitazione NAT Statico -label.action.enable.static.NAT.processing=Abilitazione NAT Statico in corso.... -label.action.enable.user=Abilitazione Utente -label.action.enable.user.processing=Abilitazione Utente in corso.... -label.action.enable.zone=Abilitazione Zona -label.action.enable.zone.processing=Abilitazione Zona in corso.... -label.action.expunge.instance=Cancellare l\\'Istanza -label.action.expunge.instance.processing=Cancellazione dell\\'Istanza in corso... -label.action.force.reconnect=Forza la Riconnessione -label.action.force.reconnect.processing=Riconnessione in corso.... -label.action.generate.keys=Generazione Chiavi -label.action.generate.keys.processing=Generazione Chiavi in corso.... -label.action.list.nexusVswitch=Elencare Nexus 1000v -label.action.lock.account=Blocco di un account -label.action.lock.account.processing=Blocco account in corso.... -label.action.manage.cluster=Gestione Cluster -label.action.manage.cluster.processing=Gestione Cluster in corso.... -label.action.migrate.instance=Migrazione Instanza -label.action.migrate.instance.processing=Migrazione Instanza in corso.... -label.action.migrate.router=Migrazione Router -label.action.migrate.router.processing=Migrazione Router... -label.action.migrate.systemvm=Migrazione VM di Systema -label.action.migrate.systemvm.processing=Migrazione VM di Sistema in corso.... -label.action.reboot.instance.processing=Riavvio Instanza in corso.... -label.action.reboot.instance=Riavvio Instanza -label.action.reboot.router.processing=Riavvio Router in corso.... -label.action.reboot.router=Riavvio Router -label.action.reboot.systemvm.processing=Riavvio VM di Sistema in corso.... -label.action.reboot.systemvm=Riavvio VM di Sistema -label.action.recurring.snapshot=Snapshot Ricorrenti -label.action.register.iso=Registrare una ISO -label.action.register.template=Registra un Template da URL -label.action.release.ip.processing=Rilascio indirizzo IP in corso.... -label.action.release.ip=Rilascio indirizzo IP -label.action.remove.host.processing=Rimozione Host in corso.... -label.action.remove.host=Rimozione Host -label.action.reset.password.processing=Reset della Password in corso.... -label.action.reset.password=Reset Password -label.action.resize.volume.processing=Ridimensionamento Volume in corso.... -label.action.resize.volume=Ridimensionamento Volume -label.action.resource.limits=Limiti delle Risorse -label.action.restore.instance.processing=Restore dell\\'Instanza in corso.... -label.action.restore.instance=Restore Instanza -label.action.revert.snapshot.processing=Ripristino dello Snapshot in corso... -label.action.revert.snapshot=Ripristinare lo Snapshot -label.actions=Azioni -label.action.start.instance=Avvio Instanza -label.action.start.instance.processing=Avvio Instanza in corso.... -label.action.start.router=Avvio Router -label.action.start.router.processing=Avvio Router in corso.... -label.action.start.systemvm=Avvio VM di Sistema -label.action.start.systemvm.processing=Avvio VM di Sistema in corso.... -label.action.stop.instance=Arresto Instanza -label.action.stop.instance.processing=Arresto Instanza in corso.... -label.action.stop.router=Arresto Router -label.action.stop.router.processing=Arresto Router in corso.... -label.action.stop.systemvm=Arresto VM di Sistema -label.action.stop.systemvm.processing=Arresto VM di Sistema in corso.... -label.action.take.snapshot=Cattura uno Snapshot -label.action.take.snapshot.processing=Esecuzione di Snapshot in corso.... -label.action.update.OS.preference=Aggiornamento Preferenze OS -label.action.update.OS.preference.processing=Aggiornamento preferenze OS in corso.... -label.action.update.resource.count=Aggiornare il conteggio delle Risorse -label.action.update.resource.count.processing=Aggiornamento del conteggio delle Risorse in corso... -label.action.vmsnapshot.create=Cattura uno Snapshot della VM -label.action.vmsnapshot.delete=Cancella lo Snapshot della VM -label.action.vmsnapshot.revert=Ripristinare lo snapshot della VM -label.activate.project=Attivare il Progetto -label.active.sessions=Sessioni Attive -label.add.account=Aggiungi un Account -label.add.accounts=Aggiungere utenti -label.add.accounts.to=Aggiungere utenti a -label.add.account.to.project=Aggiungere account al progetto -label.add.ACL=Aggiungere ACL -label.add.affinity.group=Aggiungere un nuovo gruppo di affinit\u00e0 -label.add.BigSwitchBcf.device=Aggiungere Controller BigSwitch BCF -label.add.BrocadeVcs.device=Aggiungere Switch Brocade Vcs -label.add.by.cidr=Aggiungere da CIDR -label.add.cluster=Aggiunta Cluster -label.add.compute.offering=Aggiungere una offerta computazionale -label.add.disk.offering=Aggiungere Offerta Disco -label.add.domain=Aggiunta Dominio -label.add.egress.rule=Aggiungere una regola d\\'uscita -label.add.F5.device=Aggiungere device F5 -label.add.firewall=Aggiunta regola firewall -label.add.guest.network=Aggiungere una rete guest -label.add.host=Aggiunta Host -label.adding=Aggiunta -label.adding.cluster=Aggiunta del Cluster -label.adding.failed=Aggiunta Fallita -label.adding.pod=Aggiuta del Pod -label.adding.processing=Aggiunta in corso... -label.adding.succeeded=Aggiunta avvenuta -label.adding.user=Aggiunta dell\\'Utente -label.adding.zone=Aggiunta della Zona -label.add.intermediate.certificate=Aggiungere un certificato intermedio -label.add.ip.range=Aggiungere un IP Range -label.additional.networks=Network Aggiuntivi -label.add.ldap.account=Aggiungi un account LDAP -label.add.load.balancer=Aggiungere un Load Balancer -label.add.netScaler.device=Aggiungere device Netscaler -label.add.network.ACL=Aggiungere le ACL di rete -label.add.network=Aggiungere una Rete -label.add.network.device=Aggiungere un Dispositivo di Rete -label.add.network.offering=Aggiungere offerta di rete -label.add.new.F5=Aggiungere nuovo F5 -label.add.new.gateway=Aggiungere un nuovo gateway -label.add.new.NetScaler=Aggiungere nuovo NetScaler -label.add.new.PA=Aggiungere un nuovo Palo Alto -label.add.new.SRX=Aggiungere nuovo SRX -label.add.new.tier=Aggiungere un nuovo livello -label.add.NiciraNvp.device=Aggiungere Controller Nvp -label.add.PA.device=Aggiungere un device Palo Alto -label.add.physical.network=Aggiungere rete fisica -label.add.pod=Aggiungere un Pod -label.add.port.forwarding.rule=Aggiungere una regola di port forwarding -label.add.primary.storage=Aggiungere uno Storage Primario -label.add.region=Aggiungere una Regione -label.add.resources=Aggiungere Risorse -label.add.route=Aggiungere una rotta -label.add.rule=Aggiungere regola -label.add.secondary.storage=Aggiungere uno Storage Secondario -label.add.security.group=Aggiungere un Gruppo di Sicurezza -label.add.service.offering=Aggiungere un\\'Offerta di Servizio -label.add.SRX.device=Aggiungere device SRX -label.add.static.nat.rule=Aggiungere regola di NAT statico -label.add.static.route=Aggiungere una rotta statica -label.add.system.service.offering=Aggiungere Offerte di Servizio di Sistema -label.add.template=Aggiungere un Template -label.add.to.group=Aggiungere al gruppo -label.add.user=Aggiungere un Utente -label.add.vlan=Aggiungere una VLAN -label.add.vm=Aggiungere VM -label.add.vms=Aggiunvere VM -label.add.vms.to.lb=Aggiungere VM a regola di bilanciamento di carico -label.add.VM.to.tier=Aggiungere una VM al livello -label.add.volume=Aggiungere un Volume -label.add.vpc=Aggiungere VPC -label.add.vpn.customer.gateway=Aggiungere Gateway VPN del Cliente -label.add.VPN.gateway=Aggiungere un Gateway VPN -label.add.vpn.user=Aggiungere utente VPN -label.add.vxlan=Aggiungere una VXLAN -label.add.zone=Aggiungere una Zona -label.admin.accounts=Account Amministrativi -label.admin=Amministratore -label.advanced=Avanzato -label.advanced.mode=Modalit\u00e0 Avanzata -label.advanced.search=Ricerca Avanzata -label.affinity=Affinit\u00e0 -label.affinity.group=Gruppo di Affinit\u00e0 -label.affinity.groups=Gruppi di Affinit\u00e0 -label.agent.password=Password per l\\'Agent -label.agent.username=Username per l\\'Agent -label.alert=Allarme -label.algorithm=Algoritmo -label.allocated=Allocato -label.anti.affinity=Anti-affinit\u00e0 -label.api.key=Chiave API -label.api.version=Versione API -label.apply=Applicare -label.app.name=CloudStack -label.archive.alerts=Archivia allarmi -label.archive.events=Archivia eventi -label.associated.network=Rete Associata -label.attached.iso=ISO Collegata -label.available=Disponibile -label.available.public.ips=Indirizzi IP Pubblici Disponibili -label.back=Indietro -label.bandwidth=Capacit\u00e0 della banda (Bandwidth) -label.basic=Basic -label.basic.mode=Modalit\u00e0 Base -label.bigswitch.controller.address=Indirizzo Controller BigSwitch BCF -label.bootable=Avviabile -label.broadcast.uri=URI di Broadcast -label.broadcat.uri=URI di Broadcast -label.by.alert.type=Per tipo di allarme -label.by.date.end=Per data (fino a) -label.by.date.start=Per data (da) -label.by.event.type=Per tipo di evento -label.bytes.received=Byte Ricevuti -label.bytes.sent=Byte Inviati -label.cancel=Annulla -label.capacity.bytes=Capacit\u00e0 Byte -label.capacity=Capacit\u00e0 -label.capacity.iops=Capacit\u00e0 IOPS -label.certificate=Certificato -label.change.service.offering=Modificare offerta di servizio -label.change.value=Modifica il valore -label.character=Carattere -label.cidr=CIDR -label.CIDR.list=Lista CIDR -label.CIDR.of.destination.network=Valore CIDR della rete di destinazione -label.clear.list=Pulizia dell\\'elenco -label.close=Chiudi -label.cloud.console=Console di Gestione Cloud -label.cluster=Cluster -label.cluster.name=Nome del Cluster -label.clusters=Cluster -label.cluster.type=Tipo di Cluster -label.clvm=CLVM -label.code=Codice -label.community=Community -label.compute.and.storage=Computazione e Storage -label.compute=Computazionale -label.compute.offering=Offerta computazionale -label.configuration=Configurazione -label.configure=Configurare -label.configure.ldap=Configura LDAP -label.configure.network.ACLs=Configurare le ACL di rete -label.configure.vpc=Configurare VPC -label.confirmation=Conferma -label.confirm.password=Confermare la password -label.congratulations=Congratulazioni\! -label.console.proxy=Proxy di Console -label.continue.basic.install=Proseguire con l\\'installazione di base -label.continue=Continuare -label.corrections.saved=Salvataggio correzioni effettuato -label.cpu.allocated=CPU Allocate -label.cpu.allocated.for.VMs=CPU Allocate per VM -label.CPU.cap=Limite CPU -label.cpu=CPU -label.cpu.limits=Limiti CPU -label.cpu.mhz=CPU (in MHz) -label.cpu.utilized=CPU Utilizzata -label.created.by.system=Creato dal sistema -label.created=Creato -label.create.project=Creare un progetto -label.create.template=Creare un template -label.create.VPN.connection=Creare una Connessione VPN -label.custom.disk.size=Dimensione Disco Personalizzata -label.daily=Quotidiano -label.date=Data -label.day.of.month=Giorno del Mese -label.day.of.week=Giorno della Settimana -label.decline.invitation=Declinare un invito -label.dedicated=Dedicato -label.default=Default -label.default.view=Vista di default -label.delete.affinity.group=Cancellare Gruppo di Affinit\u00e0 -label.delete.alerts=Cancella allarmi -label.delete.BigSwitchBcf=Rimuovere Controller BigSwitch BCF -label.delete=Cancellare -label.delete.events=Cancella eventi -label.delete.F5=Rimozione F5 -label.delete.gateway=Rimuovere il gateway -label.delete.NetScaler=Rimozione NetScaler -label.delete.NiciraNvp=Rimuovere Controller Nvp -label.delete.PA=Cancellare Palo Alto -label.delete.project=Cancellare progetto -label.delete.SRX=Rimozione SRX -label.delete.VPN.connection=cancellare la connessione VPN -label.delete.VPN.customer.gateway=cancellare il Gateway VPN del Cliente -label.delete.VPN.gateway=cancellare un Gateway VPN -label.delete.vpn.user=Cancellare utente VPN -label.deleting.failed=Cancellazione Fallita -label.deleting.processing=Cancellazione in corso... -label.description=Descrizione -label.destination.physical.network.id=ID della rete fisica di destinazione -label.destination.zone=Zona di destinazione -label.destroy=Distruggere -label.destroy.router=Distruggere il router -label.detaching.disk=Scollegamento Disco -label.details=Dettagli -label.device.id=ID Dispositivo -label.devices=Device -label.dhcp=DHCP -label.DHCP.server.type=Tipo di DHCP Server -label.direct.ips=Indirizzi IP di Rete condivisi -label.disabled=Disabilitato -label.disable.provider=Disabilitare il provider -label.disable.vpn=Disabilitare VPN -label.disabling.vpn.access=Disabilitare VPN -label.disk.iops.max=Max IOPS -label.disk.iops.min=Min IOPS -label.disk.iops.total=IOPS Totali -label.disk.offering=Offerta Disco -label.disk.provisioningtype=Tipo di Provisioning -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=Dominio DNS per Reti Guest -label.domain.admin=Amministratore di Dominio -label.domain=Dominio -label.domain.id=ID del Dominio -label.domain.name=Nome del Dominio -label.domain.router=Router di Dominio -label.domain.suffix=Suffisso DNS (es. xyz.com) -label.done=Fatto -label.double.quotes.are.not.allowed=Doppi apici non consentiti -label.download.progress=Avanzamento del Download -label.drag.new.position=Trascina nella nuova posizione -label.edit.lb.rule=Modifica regola LB -label.edit=Modifica -label.edit.network.details=Modificare le impostazioni di rete -label.edit.project.details=Modificare i dettagli del progetto -label.edit.secondary.ips=Modifica IP Secondari -label.edit.tags=Modifica dei tag -label.edit.traffic.type=Modifica del tipo di traffico -label.edit.vpc=Modificare VPC -label.egress.default.policy=Egress Default Policy -label.egress.rule=Regola d\\'uscita -label.egress.rules=Regole d\\'uscita -label.email=Email -label.enable.provider=Abilitare il provider -label.enable.s3=Abilitare il Secondary Storage di tipo S3 -label.enable.swift=Abilitare Swift -label.enable.vpn=Abilitare VPN -label.enabling.vpn=Abilitazione della VPN -label.enabling.vpn.access=Abilitazione dell\\'Accesso VPN -label.end.IP=Indirizzo IP finale -label.endpoint=Dispositivo -label.end.reserved.system.IP=Indirizzo IP finale riservato di sistema -label.enter.token=Inserire il token -label.error=Errore -label.ESP.encryption=Encryption di ESP -label.ESP.hash=Hash di ESP -label.ESP.policy=Policy di ESP -label.example=Esempio -label.external.link=Link Esterno -label.extractable=Estraibile -label.f5=F5 -label.failed=Errore -label.firewall=Firewall -label.first.name=Nome -label.format=Formato -label.friday=Venerd\u00ec -label.full=Completo -label.full.path=Path completo -label.gpu=CPU -label.guest.end.ip=Indirizzo IP guest finale -label.guest=Guest -label.guest.networks=Reti guest -label.guest.start.ip=Indirizzo IP guest iniziale -label.guest.traffic=Traffico della rete Guest -label.guest.type=Tipo di Guest -label.hints=Suggerimenti -label.home=Home -label.host.MAC=MAC del sistema host -label.hvm=HVM -label.hypervisor.capabilities=Funzionalit\u00e0 del Hypervisor -label.hypervisor=Hypervisor -label.hypervisors=Hypervisor -label.hypervisor.version=Versione hypervisor -label.id=ID -label.IKE.DH=DH di IKE -label.IKE.encryption=Encryption di IKE -label.IKE.hash=Hash di IKE -label.IKE.policy=Policy di IKE -label.installWizard.addClusterIntro.subtitle=Che cosa \u00e8 un cluster? -label.installWizard.addClusterIntro.title=Let’s aggiungere un cluster -label.installWizard.addHostIntro.subtitle=Che cosa \u00e8 un host? -label.installWizard.addHostIntro.title=Let’s aggiungere un host -label.installWizard.addPodIntro.subtitle=Che cosa \u00e8 un pod? -label.installWizard.addPodIntro.title=Let’s aggiungere un pod -label.installWizard.addPrimaryStorageIntro.subtitle=Che cosa \u00e8 un primary storage? -label.installWizard.addPrimaryStorageIntro.title=Let’s aggiungere primary storage -label.installWizard.addSecondaryStorageIntro.subtitle=Che cosa \u00e8 un secondary storage? -label.installWizard.addSecondaryStorageIntro.title=Let’s aggiungere secondary storage -label.installWizard.addZoneIntro.subtitle=Che cosa \u00e8 una zona? -label.installWizard.addZoneIntro.title=Let’s aggiungere una zone -label.installWizard.addZone.title=Aggiungere una zona -label.installWizard.click.launch=Fare click sul pulsante di avvio. -label.installWizard.subtitle=Questa guida fornisce supporto nelle attivit\u00e0 di configurazione di una installazione CloudStack&\#8482 -label.installWizard.title=Ciao e Benvenuti nel mondo di CloudStack&\#8482 -label.instance=Istanza -label.instance.limits=Limiti dell\\'Istanza -label.instance.name=Nome dell\\'Istanza -label.instances=Istanze -label.internal.dns.1=DNS 1 Interno -label.internal.dns.2=DNS2 Interno -label.internal.name=Nome Interno -label.introduction.to.cloudstack=Introduzione a CloudStack&\#8482 -label.invitations=Inviti -label.invited.accounts=Utenti invitati -label.invite=Invito -label.invite.to=Invito a -label.ip.address=Indirizzo IP -label.ipaddress=Indirizzo IP -label.ip=Indirizzo IP -label.ip.or.fqdn=IP o FQDN -label.ip.ranges=Intervalli di indirizzi IP -label.IPsec.preshared.key=Preshared-Key di IPsec -label.ips=Indirizzi IP -label.is.default=E\\' Default -label.isolated.networks=Reti isolate -label.isolation.method=Metodo di isolamento -label.isolation.mode=Modalit\u00e0 di Isolamento -label.isolation.uri=URI di isolamento -label.is.shared=E\\' Condiviso -label.keyboard.type=Tipo di tastiera -label.key=Key -label.kvm.traffic.label=Etichetta del traffico via KVM -label.label=Label -label.lang.arabic=Arabo -label.lang.english=Inglese -label.latest.events=Ultimi eventi -label.launch=Avvio -label.launch.vm=Avviare una VM -label.lb.algorithm.roundrobin=Round-robin -label.lb.algorithm.source=Sorgente -label.LB.isolation=Isolamento di LB -label.ldap.configuration=Configurazione LDAP -label.ldap.port=Porta LDAP -label.level=Livello -label.load.balancing=Bilanciamento di Carico -label.load.balancing.policies=Politiche di Bilanciamento di Carico -label.local.storage=Storage locale -label.LUN.number=LUN \# -label.make.redundant=Rendi ridondante -label.management=Gestione -label.management.ips=Indirizzo IP di Management -label.manage.resources=Gestione Risorse -label.max.guest.limit=Limite max di guest -label.max.networks=Numero Max di reti -label.max.public.ips=Numero max di indirizzi IP pubblici -label.max.snapshots=Numero max di snapshot -label.max.templates=Numero max di template -label.max.vms=Numero max di VM utente -label.max.volumes=Numero max di volumi -label.max.vpcs=Numero max di VPC -label.may.continue=E\\' ora possibile continuare. -label.md5.checksum=Checksum MD5 -label.memory.mb=Memoria (in MB) -label.menu.accounts=Utenti -label.menu.configuration=Configurazione -label.menu.infrastructure=Infrastruttura -label.menu.instances=Istanze -label.menu.system.service.offerings=Offerte di Sistema -label.menu.templates=Template -label.metrics.allocated=Allocato -label.metrics.clusters=Cluster -label.metrics.disk.allocated=Allocato -label.migrate.instance.to.host=Migrare instance verso un altro host -label.migrate.instance.to.ps=Migrare instance verso un altro primary storage -label.migrate.to.host=Migrare verso un host -label.migrate.to.storage=Migrare verso uno storage -label.migrate.volume.to.primary.storage=Migrare un volume verso un altro primary storage -label.mode=Modalit\u00e0 -label.move.down.row=Sposta gi\u00f9 di una riga -label.move.to.bottom=Sposta gi\u00f9 alla fine -label.move.to.top=Sposta in su all\\'inizio -label.move.up.row=Sposta su di una riga -label.my.network=La mia rete -label.my.templates=I miei template -label.nat.port.range=Intervallo di porte NAT -label.netScaler=NetScaler -label.network.ACL=ACL di rete -label.network.ACLs=ACL di rete -label.network.ACL.total=Totale ACL di rete -label.network.domain.text=Dominio di Rete -label.networking.and.security=Networking e sicurezza -label.network.label.display.for.blank.value=Utilizzare il default gateway -label.network.service.providers=Service Provider di Rete -label.networks=Reti -label.new=Nuovo -label.new.project=Nuovo Progetto -label.new.vm=Nuova VM -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nic.adapter.type=Tipo di scheda NIC -label.no.data=Nessun dato da mostrare -label.no=No -label.no.thanks=No grazie -label.notifications=Notifiche -label.number.of.clusters=Numero di Cluster -label.number.of.hosts=Numero di Host -label.number.of.pods=Numero di Pod -label.number.of.system.vms=Numero delle VM di Sistema -label.number.of.virtual.routers=Numero dei Router Virtuali -label.number.of.zones=Numero di Zone -label.ok=OK -label.order=Ordine -label.outofbandmanagement.port=Porta -label.perfect.forward.secrecy=Segretezza di Forward perfetta -label.physical.network.ID=ID della rete fisica -label.please.specify.netscaler.info=Si prega di specificare le informazioni per Netscaler -label.pod.name=Nome del Pod -label.pods=Pod -label.port.forwarding.policies=Politiche di Port Forwarding -label.port=Porta -label.previous=Precedente -label.primary.storage.count=Pool del Primary Storage -label.primary.storage=Storage Primario -label.private.Gateway=Gateway Privato -label.private.network=Rete privata -label.project.dashboard=Dashboard di progetto -label.project.id=Project ID -label.project.invite=Invitare ad un progetto -label.project.name=Nome del progetto -label.project=Project -label.projects=Progetti -label.project.view=Vista Progetto -label.providers=Fornitori -label.public.network=Rete pubblica -label.purpose=Scopo -label.quickview=Panoramica rapida -label.quota.date=Data -label.rbd.monitor=Ceph monitor -label.rbd.pool=Ceph pool -label.rbd=RBD -label.reboot=Reboot -label.recover.vm=Recupera la VM -label.redundant.router.capability=Capacit\u00e0 di ridondanza del router -label.reinstall.vm=Reinstalla la VM -label.remind.later=Ricordami in seguito -label.remove.ACL=Rimuovere ACL -label.remove.egress.rule=Rimuovere una regola d\\'uscita -label.remove.ip.range=Rimuovere intervallo di indirizzi IP -label.remove.ldap=Rimuovi LDAP -label.remove.pf=Rimuovere regola di port forwarding -label.remove.rule=Rimuovere regola -label.remove.static.nat.rule=Rimuovere regola di NAT statico -label.remove.static.route=Rimuovere una rotta statica -label.remove.tier=Rimuovere un livello -label.remove.vm.from.lb=Rimuovere una VM da regola di bilanciamento di carico -label.remove.vpc=Rimuovere VPC -label.removing=Rimozione -label.reserved.system.gateway=Gateway di sistema riservato -label.reserved.system.netmask=Netmask di sistema riservata -label.reset.VPN.connection=Reset della connessione VPN -label.resource.state=Stato della risorsa -label.restart.network=Riavviare il servizio di rete -label.restart.required=E\\' necessario un riavvio -label.restart.vpc=Riavviare VPC -label.restore=Restore -label.review=Riesaminare -label.revoke.project.invite=Revocare un invit -label.roles=Ruoli -label.root.disk.controller=Controller del disco root -label.routing=Routing -label.rules=Regole -label.s3.access_key=Access Key -label.s3.connection_timeout=Tempo di scadenza connessione -label.s3.endpoint=Dispositivo -label.s3.max_error_retry=Numero massimo di tentativi a seguito di errore -label.s3.nfs.path=Percorso S3 NFS -label.s3.nfs.server=S3 NFS Server -label.s3.secret_key=Secret Key -label.s3.socket_timeout=Tempo di scadenza del Socket -label.s3.use_https=Utilizzare HTTPS -label.save.and.continue=Salvare e proseguire -label.secondary.ips=IP Secondari -label.secondary.storage.count=Pool del Secondary Storage -label.secondary.storage=Storage Secondario -label.secondary.storage.vm=VM di Secondary Storage -label.secret.key=Secret Key -label.select.a.template=Selezionare un template -label.select.a.zone=Selezionare una zone -label.select.instance=Selezionare una instanza -label.select.instance.to.attach.volume.to=Selezionare l\\'instanza da collegare al volume -label.select.iso.or.template=Selezionare immagine ISO o template -label.select.offering=Seleziona l\\'offerta -label.select.project=Selezionare un Progetto -label.select=Selezionare -label.select.tier=Selezionare il Livello -label.select-view=Selezionare la vista -label.select.vm.for.static.nat=Selezionare una VM per il NAT statico -label.service.capabilities=Capacit\u00e0 di Servizio -label.service.state=Stato del Servizio -label.setup=Installazione -label.set.up.zone.type=Configurazione del tipo di Zona -label.shutdown.provider=Arresto del provider -label.site.to.site.VPN=Site-to-site VPN -label.skip.guide=Se si ha familiarit\u00e0 con CloudStack per utilizzi precedenti, si pu\u00f2 saltare questa guida -label.smb.domain=Dominio SMB -label.smb.password=Password SMB -label.smb.username=Username SMB -label.sockets=CPU Socket -label.specify.IP.ranges=Specificare intervallo di indirizzi IP -label.srx=SRX -label.start.IP=Indirizzo IP iniziale -label.start.reserved.system.IP=Indirizzo IP iniziale riservato di sistema -label.static.nat.enabled=NAT Statico Abilitato -label.static.nat.vm.details=Dettagli di NAT Statico della VM -label.sticky.cookie-name=Nome del cookie -label.sticky.domain=Dominio -label.sticky.expire=Scadenza -label.sticky.length=Lunghezza -label.sticky.mode=Modalit\u00e0 -label.sticky.nocache=Senza cache -label.sticky.prefix=Prefisso -label.sticky.tablesize=Dimensione della tabella -label.stop=Stop -label.storage.traffic=Traffico della rete Storage -label.super.cidr.for.guest.networks=Super CIDR per Reti Guest -label.supported.services=Servizi Supportati -label.supported.source.NAT.type=Tipo di Source NAT supportato -label.suspend.project=Sospendere il Progett -label.system.offering=Offerta del sistema -label.system.wide.capacity=Capacit\u00e0 del Sistema -label.task.completed=Attivit\u00e0 completata -label.tier.details=Dettagli del livello -label.tier=Livello -label.timeout=Timeout -label.token=Token -label.total.cpu=CPU Totali -label.total.CPU=CPU Totali -label.total.hosts=Host Totali -label.total.memory=Memoria Totale -label.total.storage=Storage Totale -label.traffic.label=Etichetta del traffico -label.traffic.types=Tipi di Traffico -label.update.project.resources=Aggiornare le risorse di progetto -label.upload=Upload -label.upload.volume=Volume di upload -label.use.vm.ips=Usa Indirizzo IP della VM -label.vcdcname=Nome DC del vCenter -label.vcipaddress=Indirizzo IP del vCenter -label.viewing=Visualizzazione -label.view.secondary.ips=Vedi IP Secondari -label.view=Vista -label.virtual.routers=Router Virtuali -label.virtual.router=Virtual Router -label.vlan.only=VLAN -label.vlan=VLAN -label.vm.destroy=Destroy -label.vm.display.name=Nome visualizzato della VM -label.vm.ip=Indirizzo IP della VM -label.vm.name=Nome VM -label.vm.reboot=Reboot -label.VMs.in.tier=VM nei livelli -label.vm.state=Stato VM -label.vm.stop=Stop -label.vmware.traffic.label=Etichetta del traffico via VMware -label.vnet=VLAN -label.vpc.id=ID del VPC -label.VPC.router.details=Dettagli del router VPC -label.vpc=VPC -label.VPN.connection=Connessione VPN -label.vpn.customer.gateway=Gateway VPN del Cliente -label.VPN.customer.gateway=Gateway VPN del Cliente -label.VPN.gateway=Gateway VPN -label.vpn=VPN -label.vsmctrlvlanid=VLAN ID di Controllo -label.vsmpktvlanid=VLAN ID del Pacchetto -label.vsmstoragevlanid=VLAN ID di Storage -label.what.is.cloudstack=Che cosa \u00e8 CloudStack&\#8482? -label.xenserver.traffic.label=Etichetta del traffico via XenServer -label.yes=S\u00ec -label.zone.details=Dettagli della Zona -label.zones=Zone -label.zone.type=Tipo di Zona -label.zoneWizard.trafficType.guest=Guest\: Traffico di rete tra le virtual machine dell\\'utente finale -label.zoneWizard.trafficType.management=Management\: Traffico di rete tra le risorse interne di CloudStack, incluso qualsiasi componente che comunichi con il Management Server, come ad esempio gli host e le VM di Sistema di CloudStack -label.zoneWizard.trafficType.public=Public\: Traffico di rete tra la rete internet e le virtual machine nell\\'infrastruttura cloud. -label.zoneWizard.trafficType.storage=Storage\: Traffico di rete tra i server di primary e secondary storage, come ad esempio i template delle VM e le operazioni di snapshot -message.acquire.ip.nic=Prego confermare che si vuole acquisire un nuovo IP secondario per questa NIC.
NOTA\: Deve essere configurato manualmente il nuovo IP secondario acquisito all\\'interno della virtual machine. -message.acquire.new.ip=Si prega di confermare di voler acquisire un nuovo indirizzo IP per questa rete. -message.acquire.new.ip.vpc=Si prega di confermare di voler acquisire un nuovo indirizzo IP per questo VPC. -message.action.delete.nexusVswitch=Si prega di confermare di voler cancellare questo nexus 1000v -message.action.delete.nic=Prego conferma che si vuole rimuovere questa NIC, questo rimuover\u00e0 anche le reti associate dalla VM. -message.action.delete.physical.network=Si prega di confermare di voler cancellare questa rete fisica -message.action.delete.system.service.offering=Si prega di confermare di voler cancellare questa offerta di servizio di sistema. -message.action.disable.nexusVswitch=Si prega di confermare di voler disabilitare questo nexus 1000v -message.action.disable.physical.network=Si prega di confermare di voler disabilitare questa rete fisica. -message.action.download.iso=Si prega di confermare di voler scaricare questa immagine ISO. -message.action.download.template=Si prega di confermare di voler scaricare questo template. -message.action.enable.nexusVswitch=Si prega di confermare di voler abilitare questo nexus 1000v -message.action.enable.physical.network=Si prega di confermare l\\'intenzione di abilitare questa rete fisica. -message.action.reboot.router=Tutti i servizi forniti da questo router virtuale saranno interrotti. Si prega di confermare di voler riavviare questo router. -message.action.remove.host=Si prega di confermare di voler rimuovere questo host. -message.action.stop.router=Tutti i servizi forniti da questo router virtuale saranno interrotti. Si prega di confermare di voler arrestare questo router. -message.activate.project=Si \u00e8 sicuri di voler attivare questo progetto? -message.add.domain=Si prega di specificare il sottodominio che si vuole creare in questo dominio -message.add.guest.network=Si prega di confermare di voler aggiungere una rete guest -message.adding.host=Aggiunta host -message.adding.Netscaler.device=Aggiunta di dispositivo Netscaler -message.adding.Netscaler.provider=Aggiunta di un provider Netscaler -message.add.load.balancer.under.ip=La regola di bilanciamento di carico \u00e8 stata aggiunta all\\'indirizzo IP\: -message.add.new.gateway.to.vpc=Si prega di specificare le informazioni per aggiungere un nuovo gateway a questo VPC. -message.add.system.service.offering=Si prega di inserire le seguenti informazioni per aggiungere una nuova offerta di servizio di sistema. -message.add.VPN.gateway=Si prega di confermare di voler aggiungere un Gateway VPN -message.after.enable.s3=Il Secondary Storage S3 \u00e8 configurato. NOTA\: Una volta chiusa questa pagina, non sar\u00e0 pi\u00f9 possibile ri-configurare S3. -message.after.enable.swift=Configurazione Swift completata. NOTA\: Una volta che questa pagina viene chiusa, non sar\u00e0 possibile ri-configurare nuovamente Swift. -message.alert.state.detected=Rilevato uno stato di Alert -message.change.password=Si prega di modificare la propria password. -message.configure.all.traffic.types=Si dispone di pi\u00f9 reti fisiche; si prega di configurare le label per ogni tipo di traffico facendo click sul tasto \\'Edit\\'. -message.configuring.guest.traffic=Configurazione del traffico guest -message.configuring.physical.networks=Configurazione di reti fisiche -message.configuring.public.traffic=Configurazione del traffico pubblico -message.configuring.storage.traffic=Configurazione del traffico storage -message.confirm.action.force.reconnect=Si prega di confermare di voler forzare la riconnessione a questo host. -message.confirm.delete.F5=Si prega di confermare di voler rimuovere F5 -message.confirm.delete.NetScaler=Si prega di confermare di voler rimuovere NetScaler -message.confirm.delete.SRX=Si prega di confermare di voler rimuovere SRX -message.confirm.destroy.router=Si prega di confermare di voler rimuovere questo router -message.confirm.disable.provider=Si prega di confermare di voler disabilitare questo provider -message.confirm.enable.provider=Si prega di confermare di voler abilitare questo provider -message.confirm.join.project=Si prega di confermare di volersi unire a questo progetto. -message.confirm.remove.IP.range=Si prega di confermare di voler rimuovere questo intervallo di indirizzi IP. -message.confirm.shutdown.provider=Si prega di confermare di voler arrestare questo provider -message.create.template=Si \u00e8 sicuri di voler creare il template? -message.creating.cluster=Creazione cluster -message.creating.guest.network=Creazione di una rete guest -message.creating.physical.networks=Creazione di reti fisiche -message.creating.pod=Creazione pod -message.creating.primary.storage=Creazione storage primario -message.creating.secondary.storage=Creazione storage secondario -message.creating.zone=Creazione della zona in corso -message.decline.invitation=Si \u00e8 sicuri di voler declinare l\\'invito a questo progetto? -message.delete.gateway=Si prega di confermare di voler cancellare il gateway -message.delete.project=Si \u00e8 sicuri di voler cancellare questo progetto? -message.delete.user=Si prega di confermare di voler cancellare questo utente. -message.delete.VPN.connection=Si prega di confermare di voler cancellare la connessione VPN -message.delete.VPN.customer.gateway=Si prega di confermare di voler cancellare questo Gateway VPN del Cliente -message.delete.VPN.gateway=Si prega di confermare di voler cancellare questo Gateway VPN -message.desc.advanced.zone=Per topologie di rete pi\u00f9 sofisticate. Queto modello di rete fornisce la maggior flessibilit\u00e0 nel definire reti guest e offrendo funzionalit\u00e0 di rete personalizzate come per esempio firewall, VPN, o supporto per bilanciamento di carico. -message.desc.basic.zone=Indicare una rete singola in cui ogni instanza VM ricever\u00e0 un indirizzo IP assegnato. L\\'isolamento di istanze guest viene effettuato attraverso funzioni di tipo layer-3 come ad esempio i security group (filtraggio dell\\'indirizzo IP sorgente). -message.desc.zone=Una zona \u00e8 l\\'unit\u00e0 organizzativa pi\u00f9 grandi in CloudStack, e corrisponde tipicamente ad un datacenter singolo. Le zono offrono isolamento fisico e ridondanza. Una zona \u00e8 costituita da uno o pi\u00f9 pod (ognuno dei quali contiene pi\u00f9 host e server di storage primario) ed un server di storage secondario condiviso da tutti i pod appartenenti alla zona. -message.detach.disk=Si \u00e8 sicuri di voler sganciare questo disco? -message.disable.user=Si prega di confermare di voler disabilitare questo utente. -message.disable.vpn=Si \u00e8 sicuri di voler disabilitare la VPN? -message.edit.traffic.type=Si prega si specificare la label del traffico che si vuole associare a questo tipo di traffico. -message.enable.user=Si prega di confermare di voler abilitare questo utente. -message.enable.vpn=Si prega di confermare di voler abilitare l\\'accesso VPN per questo indirizzo IP. -message.enabling.security.group.provider=Abilitazione di un provider di Security Group -message.enabling.zone=Abilitazione zona -message.enter.token=Si prega di inserire il token ricevuto nella e-mail di invito. -message.generate.keys=Si prega di confermare di voler generare nuove chiavi per questo utente. -message.installWizard.click.retry=Fare click sul pulsante per riprovare l\\'avvio. -message.installWizard.copy.whatIsAPod=Un pod pu\u00f2 essere utilizzato ad esempio per identificare un singolo rack. Gli host appartenenti al pod sono nella stessa subnet.

Un pod \u00e8 il secondo componente organizzativo pi\u00f9 grande in una installazione CloudStack&\#8482;. I pod sono contenuti in zone. Ogni zona pu\u00f2 contenere uno o pi\u00f9 pod; in una Installazione di Base, si configura un solo pod nella zona. -message.installWizard.copy.whatIsAZone=Una zona \u00e8 il componente organizzativo pi\u00f9 grande in una installazione CloudStack&\#8482;. Una zona corrisponde solitamente ad un singolo datacenter, sebbene sia consentito avere pi\u00f9 zone in un datacenter. Il beneficio di organizzare l\\'infrastruttura in zone deriva dalla possibilit\u00e0 di creare isolamento e ridondanza. Per esempio, ogni zona pu\u00f2 avere la propria configurazione di alimentazione elettrica e collegamenti di rete, e le zone possono essere anche separate geograficamente (anche se non \u00e8 un requisito). -message.installWizard.copy.whatIsSecondaryStorage=Un Secondary storage \u00e8 associato ad una zona, ed \u00e8 utilizzato per la memorizzazione di\:
  • Template - Immagini SO che possono essere usate per eseguire il boot delle VM e che possono includere informazioni di configurazioni aggiuntive, come ad esempio applicazioni installate
  • Immagini ISO - Immagini OS utilizzabili che possono anche essere non-bootable
  • Snapshot di volumi disco - copie salvate di dati delle VM utilizzabili per il recupero di dati o per la creazione di nuovi template
-message.installWizard.tooltip.addCluster.name=Un nome per il cluster. Questo pu\u00f2 essere assegnato utilizzando testo a scelta e non \u00e8 utilizzato da CloudStack. -message.installWizard.tooltip.addHost.hostname=Il nome DNS o l\\'indirizzo IP del sistema host. -message.installWizard.tooltip.addHost.password=Questa \u00e8 la password per l\\'utente identificato precedentemente (dall\\'installazione XenServer). -message.installWizard.tooltip.addHost.username=Tipicamente root. -message.installWizard.tooltip.addPod.name=Un nome per il pod -message.installWizard.tooltip.addPod.reservedSystemEndIp=Questo \u00e8 l\\'intervallo di indirizzi IP nella rete privata che CloudStack utilizza per la gestione delle VM del Secondary Storage e le VM della Console Proxy. Questi indirizzi IP sono ricavati dalla stessa subnet dei server computazionali. -message.installWizard.tooltip.addPod.reservedSystemGateway=Il gateway per gli host appartenenti al pod. -message.installWizard.tooltip.addPod.reservedSystemNetmask=La netmask in uso nella subnet utilizzata dalle VM guest. -message.installWizard.tooltip.addPod.reservedSystemStartIp=Questo \u00e8 l\\'intervallo di indirizzi IP nella rete privata che CloudStack utilizza per la gestione delle VM del Secondary Storage e le VM della Console Proxy. Questi indirizzi IP sono ricavati dalla stessa subnet dei server computazionali. -message.installWizard.tooltip.addPrimaryStorage.name=Il nome del dispositivo storage. -message.installWizard.tooltip.addPrimaryStorage.path=(per NFS) In NFS questo corrisponde al path condiviso dal server. Path (per SharedMountPoint). Con KVM questo \u00e8 il path su ogni host su cui viene effettuato il mount di questo primary storage. Per esempio, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(per NFS, iSCSI, o PreSetup) L\\'indirizzo IP o il nome DNS del dispositivo di storage. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=L\\'indirizzo IP del server NFS su cui \u00e8 condiviso il secondary storage -message.installWizard.tooltip.addSecondaryStorage.path=Il percorso esportato, posizionato sul server precedentemente specificato -message.installWizard.tooltip.addZone.dns1=Questi sono i server DNS da usare per le VM guest nella zona. Questi server DNS saranno raggiunti attraverso la rete pubblica che si configurer\u00e0 nel seguito. Gli indirizzi IP pubblici per la zona devono disporre di una rotta per raggiungere i server DNS indicati qui. -message.installWizard.tooltip.addZone.dns2=Questi sono i server DNS da usare per le VM guest nella zona. Questi server DNS saranno raggiunti attraverso la rete pubblica che si configurer\u00e0 nel seguito. Gli indirizzi IP pubblici per la zona devono disporre di una rotta per raggiungere i server DNS indicati qui. -message.installWizard.tooltip.addZone.internaldns1=Questi sono i server DNS da utilizzare per le VM di sistema nella zona. Questi server DNS saranno raggiunti attraverso l\\'interfaccia di rete configurata nella rete privata delle VM di Sistema. L\\'indirizzo IP privato fornito ai pod devono disporre di una rotta per raggiungere il server DNS indicato qui. -message.installWizard.tooltip.addZone.internaldns2=Questi sono i server DNS da utilizzare per le VM di sistema nella zona. Questi server DNS saranno raggiunti attraverso l\\'interfaccia di rete configurata nella rete privata delle VM di Sistema. L\\'indirizzo IP privato fornito ai pod devono disporre di una rotta per raggiungere il server DNS indicato qui. -message.installWizard.tooltip.addZone.name=Un nome per la zona -message.installWizard.tooltip.configureGuestTraffic.description=Una descrizione per identificare la rete -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=L\\'intervallo degli indirizzi IP che saranno disponibili per l\\'allocazione alle VM guest in questa zona. Se viene usata una NIC, questi indirizzi IP dovrebbero appartenere allo stesso CIDR a cui appartiene il pod. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=Il gateway da assegnare alle VM guest -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=La netmask in uso nella subnet utilizzata dalle VM guest -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=L\\'intervallo degli indirizzi IP che saranno disponibili per l\\'allocazione alle VM guest in questa zona. Se viene usata una NIC, questi indirizzi IP dovrebbero appartenere allo stesso CIDR a cui appartiene il pod. -message.installWizard.tooltip.configureGuestTraffic.name=Un nome da assegnare alla rete -message.instanceWizard.noTemplates=Non ci sono template disponibili\: si prega di aggiungere un template compatibile, e ri-avviare il wizard per la instanza. -message.ip.address.changed=Il tuo indirizzo IP potrebbe essere cambiato; si desidera aggiornare l\\'elenco? Notare che in tal caso verr\u00e0 chiusa la finestra dettagli. -message.iso.desc=Immagine disco contenente dati o supporto avviabile di boot per il SO -message.join.project=Ora appartieni al progetto. Si prega di passare alla vista Progetto per accedere. -message.launch.zone=La Zona \u00e8 pronta per l\\'avvio; si prega di procedere al passo successivo. -message.listView.subselect.multi=(Ctrl/Cmd-click) -message.migrate.instance.to.host=Si prega di confermare di voler migrare instance verso un altro host. -message.migrate.instance.to.ps=Si prega di confermare di voler migrare instance verso un altro primary storage. -message.migrate.router.confirm=Si prega di confermare l\\'host a cui si intende migrare il router\: -message.migrate.volume=Si prega di confermare di voler migrare il volume verso un altro primary storage. -message.no.affinity.groups=Non \u00e8 presente alcun gruppo di affinit\u00e0. Prego proseguire al prossimo passaggio. -message.no.projects.adminOnly=Non si dispone di alcun progetto.
Si prega di chiedere la creazione di un nuovo progetto al proprio amministratore. -message.no.projects=Non si possiedono progetti.
Si prega di creare un nuovo progetto dalla sezione progetti. -message.pending.projects.1=Ci sono inviti a progetti in attesa di risposta\: -message.please.add.at.lease.one.traffic.range=Si prega di aggiungere almeno un intervallo relativo al traffico. -message.please.proceed=Si prega di procedere al passo successivo. -message.please.select.a.configuration.for.your.zone=Si prega di selezionare una configurazione per la zona. -message.please.select.a.different.public.and.management.network.before.removing=Si prega di selezionare una diversa rete pubblica e di management prima della rimozione -message.please.select.networks=Si prega di selezionare le reti per la virtual machine. -message.please.wait.while.zone.is.being.created=Si prega di attendere la creazione della zona; pu\u00f2 richiedere tempo... -message.project.invite.sent=L\\'invito \u00e8 stato spedito all\\'utente; l\\'utente sar\u00e0 aggiunto al progetto solo dopo aver accettato l\\'invito -message.recover.vm=Prego confermare che si vuole recuperare questa VM. -message.reinstall.vm=NOTA\: Attenzione. Questo causer\u00e0 la reinstallazione della VM partendo dal template; i dati nel disco principale verranno persi. I dati nei volumi aggiuntivi, se esistenti, non verranno toccati. -message.remove.vpc=Si prega di confermare di voler rimuovere VPC -message.reset.password.warning.notPasswordEnabled=L\\'immagine template di questa instanza \u00e8 stata creata senza l\\'abilitazione della password -message.reset.password.warning.notStopped=L\\'instanza deve essere arrestata prima di poter modificare la password -message.reset.VPN.connection=Si prega di confermare di voler effettuare il reset della connessione VPN -message.restart.network=Tutti i servizi forniti da questa rete saranno interrotti. Si prega di confermare di voler riavviare questa rete. -message.restart.vpc=Si prega di confermare di voler riavviare VPC -message.select.affinity.groups=Prego selezionare un gruppo di affinit\u00e0 a cui si vuole far appartenere questa VM\: -message.select.a.zone=Una zona corrisponde tipicamente ad un singolo datacenter. Zone multiple consentono di aumentare l\\'affidabilit\u00e0 creando isolamento fisico e ridondanza. -message.select.instance=Si prega di selezionare una instanza. -message.select.iso=Si prega di selezionare una immagine ISO per la nuova instanza virtuale. -message.select.item=Si prega di selezionare un elemento. -message.select.security.groups=Si prega di selezionare i security group per la nuova VM -message.select.template=Si prega di selezionare un template per la nuova instanza virtuale. -message.setup.physical.network.during.zone.creation.basic=Quando si aggiunge una zona di base, si pu\u00f2 configurare una rete fisica, che corrisponde ad una NIC sul sistema host di virtualizzazione. La rete consente il trasporto di vari tipi di traffico di comunicazione.

E\\' possibile anche spostare altri tipi di traffico sulla rete fisica in modalit\u00e0 drag and drop. -message.setup.successful=L\\'installazione del cloud \u00e8 completata con successo\! -message.specify.url=Si prega di specificare la URL -message.suspend.project=Si \u00e8 sicuri di voler sospendere questo progetto? -message.template.desc=Immagine SO utilizzabile per eseguire il boot delle VM -message.tooltip.dns.1=Nome di un server DNS per l\\'uso da parte delle VM in questa zona. Gli indirizzi IP pubblici per la zona devono avere un percorso di instradamento verso questo server. -message.tooltip.dns.2=Un nome di un server DNS aggiuntivo per l\\'uso da parte delle VM in questa zona. Gli indirizzi IP pubblici per la zona devono avere un percorso di instradamento verso questo server. -message.tooltip.internal.dns.1=Nome di un server DNS per l\\'uso da parte delle VM interne di CloudStack di sistema nella zona. Gli indirizzi IP privati per i pod devono avere un percorso di instradamento verso questo server. -message.tooltip.internal.dns.2=Nome di un server DNS per l\\'uso da parte delle VM interne di CloudStack di sistema nella zona. Gli indirizzi IP privati per i pod devono avere un percorso di instradamento verso questo server. -message.tooltip.network.domain=Un suffisso DNS che consentir\u00e0 la creazione di un nome di dominio personalizzato per la rete a cui accedono le VM ospiti. -message.tooltip.pod.name=Un nome per questo pod -message.tooltip.reserved.system.gateway=Il gateway per gli host appartenenti al pod. -message.tooltip.reserved.system.netmask=Il prefisso di rete che definisce la subnet del pod. Utilizza la notazione CIDR. -message.tooltip.zone.name=Un nome per la zona. -message.update.resource.count=Si prega di confermare di voler aggiornare il valore delle risorse per questo account. -message.validate.instance.name=Il nome dell\\'instanza non pu\u00f2 avere lunghezza superiore a 63 caratteri. Sono consentite solo lettere ASCII a-z, A-Z, numeri 0-9, segni \\'-\\'. Il primo carattere deve essere una lettera, e l\\'ultimo una lettera o un numero. -message.validate.invalid.characters=Rilevati caratteri non validi; prego correggere. -message.vm.review.launch=Si prega di riesaminare le informazioni e confermare l\\'instance virtuale scelta sia corretta prima di avviarla. -message.you.must.have.at.least.one.physical.network=E\\' necessario disporre di almeno una rete fisica -message.Zone.creation.complete=Creazione zona completata -message.zone.creation.complete.would.you.like.to.enable.this.zone=Creazione zona completata. Si desidera abilitare questa zona? -message.zone.no.network.selection=La zona selezionata non contiene opzioni per la selezione della rete. -mode=Modalit\u00e0 -notification.reboot.instance=Riavviare una instanza -notification.start.instance=Avviare una instanza -notification.stop.instance=Arrestare una instanza -state.Accepted=Accettato -state.Active=Attivo -state.Allocated=Allocato -state.Allocating=Allocazione in corso -state.BackedUp=Salvataggio eseguito -state.BackingUp=Salvataggio in esecuzione -state.Completed=Completato -state.Creating=Creazione in corso -state.Declined=Declinato -state.Disabled=Disabilitato -state.Enabled=Abilitato -state.Error=Errore -state.Migrating=Migrazione in corso -state.Ready=Pronto -state.Running=In esecuzione -state.Starting=Avvio in corso -state.Stopped=Arrestato -state.Stopping=Arresto in corso -state.Suspended=Sospeso diff --git a/client/WEB-INF/classes/resources/messages_ja_JP.properties b/client/WEB-INF/classes/resources/messages_ja_JP.properties deleted file mode 100644 index 89766e8ab826..000000000000 --- a/client/WEB-INF/classes/resources/messages_ja_JP.properties +++ /dev/null @@ -1,2195 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=\u9805\u76ee\u306e\u30d7\u30ed\u30d1\u30c6\u30a3\u306e\u5909\u66f4 -confirm.enable.s3=S3 \u30d9\u30fc\u30b9\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -confirm.enable.swift=Swift \u306e\u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u306b\u306f\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -error.could.not.change.your.password.because.ldap.is.enabled=\u30a8\u30e9\u30fc\u3002LDAP \u304c\u6709\u52b9\u306a\u305f\u3081\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3067\u304d\u307e\u305b\u3093\u3002 -error.could.not.enable.zone=\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f -error.installWizard.message=\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u623b\u3063\u3066\u30a8\u30e9\u30fc\u3092\u4fee\u6b63\u3067\u304d\u307e\u3059\u3002 -error.invalid.username.password=\u7121\u52b9\u306a\u30e6\u30fc\u30b6\u30fc\u540d\u307e\u305f\u306f\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002 -error.login=\u30e6\u30fc\u30b6\u30fc\u540d/\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u8a18\u9332\u3068\u4e00\u81f4\u3057\u307e\u305b\u3093\u3002 -error.menu.select=\u9805\u76ee\u304c\u9078\u629e\u3055\u308c\u3066\u3044\u306a\u3044\u305f\u3081\u64cd\u4f5c\u3092\u5b9f\u884c\u3067\u304d\u307e\u305b\u3093\u3002 -error.mgmt.server.inaccessible=\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u305b\u3093\u3002\u5f8c\u3067\u518d\u5b9f\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -error.password.not.match=\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u4e00\u81f4\u3057\u307e\u305b\u3093 -error.please.specify.physical.network.tags=\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30bf\u30b0\u3092\u6307\u5b9a\u3057\u306a\u3051\u308c\u3070\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093\u3002 -error.session.expired=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f\u3002 -error.something.went.wrong.please.correct.the.following=\u554f\u984c\u304c\u767a\u751f\u3057\u307e\u3057\u305f\u3002\u6b21\u306e\u5185\u5bb9\u3092\u4fee\u6b63\u3057\u3066\u304f\u3060\u3055\u3044 -error.unable.to.reach.management.server=\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3067\u304d\u307e\u305b\u3093 -error.unresolved.internet.name=\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u540d\u3092\u89e3\u6c7a\u3067\u304d\u307e\u305b\u3093\u3002 -force.delete.domain.warning=\u8b66\u544a\: \u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u3059\u3079\u3066\u306e\u5b50\u30c9\u30e1\u30a4\u30f3\u304a\u3088\u3073\u95a2\u9023\u3059\u308b\u3059\u3079\u3066\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3068\u305d\u306e\u30ea\u30bd\u30fc\u30b9\u304c\u524a\u9664\u3055\u308c\u307e\u3059\u3002 -force.delete=\u5f37\u5236\u7684\u306b\u524a\u9664\u3059\u308b -force.remove.host.warning=\u8b66\u544a\: \u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u5b9f\u884c\u4e2d\u306e\u3059\u3079\u3066\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u304c\u5f37\u5236\u7684\u306b\u505c\u6b62\u3055\u308c\u3001\u30af\u30e9\u30b9\u30bf\u30fc\u304b\u3089\u3053\u306e\u30db\u30b9\u30c8\u304c\u5f37\u5236\u7684\u306b\u89e3\u9664\u3055\u308c\u307e\u3059\u3002 -force.remove=\u5f37\u5236\u7684\u306b\u89e3\u9664\u3059\u308b -force.stop.instance.warning=\u8b66\u544a\: \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5f37\u5236\u505c\u6b62\u306f\u3001\u6700\u7d42\u624b\u6bb5\u306b\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30c7\u30fc\u30bf\u3092\u640d\u5931\u3059\u308b\u3060\u3051\u3067\u306a\u304f\u3001\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u52d5\u4f5c\u304c\u4e00\u8cab\u3057\u306a\u304f\u306a\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 -force.stop=\u5f37\u5236\u7684\u306b\u505c\u6b62\u3059\u308b -hint.no.host.tags=\u30db\u30b9\u30c8\u30bf\u30b0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093 -hint.no.storage.tags=\u30b9\u30c8\u30ec\u30fc\u30b8\u30bf\u30b0\u304c\u898b\u3064\u304b\u308a\u307e\u305b\u3093 -hint.type.part.host.tag=\u30db\u30b9\u30c8\u30bf\u30b0\u306e\u7a2e\u985e -hint.type.part.storage.tag=\u30b9\u30c8\u30ec\u30fc\u30b8\u30bf\u30b0\u306e\u7a2e\u985e -ICMP.code=ICMP \u30b3\u30fc\u30c9 -ICMP.type=ICMP \u306e\u7a2e\u985e -image.directory=\u753b\u50cf\u30c7\u30a3\u30ec\u30af\u30c8\u30ea -inline=\u76f4\u5217 -instances.actions.reboot.label=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u518d\u8d77\u52d5 -label.about.app=CloudStack \u306b\u3064\u3044\u3066 -label.about=\u30d0\u30fc\u30b8\u30e7\u30f3\u60c5\u5831 -label.accept.project.invitation=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u62db\u5f85\u306e\u627f\u8afe -label.account.and.security.group=\u30a2\u30ab\u30a6\u30f3\u30c8\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.account.details=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8a73\u7d30 -label.account.id=\u30a2\u30ab\u30a6\u30f3\u30c8 ID -label.account.lower=\u30a2\u30ab\u30a6\u30f3\u30c8 -label.account.name=\u30a2\u30ab\u30a6\u30f3\u30c8\u540d -label.account.specific=\u30a2\u30ab\u30a6\u30f3\u30c8\u56fa\u6709 -label.accounts=\u30a2\u30ab\u30a6\u30f3\u30c8 -label.account.type=\u30a2\u30ab\u30a6\u30f3\u30c8\u30bf\u30a4\u30d7 -label.account=\u30a2\u30ab\u30a6\u30f3\u30c8 -label.acl=ACL -label.acl.id=ACL ID -label.acl.list.rules=ACL \u30eb\u30fc\u30eb\u306e\u30ea\u30b9\u30c8 -label.acl.name=ACL \u540d -label.acl.replaced=ACL \u304c\u7f6e\u304d\u63db\u3048\u3089\u308c\u307e\u3057\u305f -label.acquire.new.ip=\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u306e\u53d6\u5f97 -label.acquire.new.secondary.ip=\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306e\u53d6\u5f97 -label.action.attach.disk.processing=\u30c7\u30a3\u30b9\u30af\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059... -label.action.attach.disk=\u30c7\u30a3\u30b9\u30af\u306e\u30a2\u30bf\u30c3\u30c1 -label.action.attach.iso=ISO \u306e\u30a2\u30bf\u30c3\u30c1 -label.action.attach.iso.processing=ISO \u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059... -label.action.cancel.maintenance.mode.processing=\u4fdd\u5b88\u30e2\u30fc\u30c9\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u3066\u3044\u307e\u3059... -label.action.cancel.maintenance.mode=\u4fdd\u5b88\u30e2\u30fc\u30c9\u306e\u30ad\u30e3\u30f3\u30bb\u30eb -label.action.change.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u5909\u66f4 -label.action.change.service.processing=\u30b5\u30fc\u30d3\u30b9\u3092\u5909\u66f4\u3057\u3066\u3044\u307e\u3059... -label.action.change.service=\u30b5\u30fc\u30d3\u30b9\u306e\u5909\u66f4 -label.action.configure.samlauthorization=SAML SSO \u8a8d\u8a3c\u3092\u8a2d\u5b9a\u3059\u308b -label.action.copy.ISO=ISO \u306e\u30b3\u30d4\u30fc -label.action.copy.ISO.processing=ISO \u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059.... -label.action.copy.template.processing=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059.... -label.action.copy.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30b3\u30d4\u30fc -label.action.create.template.from.vm=VM \u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u4f5c\u6210 -label.action.create.template.from.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u4f5c\u6210 -label.action.create.template.processing=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059... -label.action.create.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210 -label.action.create.vm.processing=VM \u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059... -label.action.create.vm=VM \u306e\u4f5c\u6210 -label.action.create.volume.processing=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059... -label.action.create.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u4f5c\u6210 -label.action.delete.account.processing=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u524a\u9664 -label.action.delete.cluster.processing=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u524a\u9664 -label.action.delete.disk.offering.processing=\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.disk.offering=\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664 -label.action.delete.domain.processing=\u30c9\u30e1\u30a4\u30f3\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.domain=\u30c9\u30e1\u30a4\u30f3\u306e\u524a\u9664 -label.action.delete.firewall.processing=\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.firewall=\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u898f\u5247\u306e\u524a\u9664 -label.action.delete.ingress.rule.processing=\u53d7\u4fe1\u898f\u5247\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.ingress.rule=\u53d7\u4fe1\u898f\u5247\u306e\u524a\u9664 -label.action.delete.IP.range=IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u524a\u9664 -label.action.delete.IP.range.processing=IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.ISO=ISO \u306e\u524a\u9664 -label.action.delete.ISO.processing=ISO \u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.load.balancer.processing=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.load.balancer=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u306e\u524a\u9664 -label.action.delete.network.processing=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u524a\u9664 -label.action.delete.nexusVswitch=Nexus 1000V \u306e\u524a\u9664 -label.action.delete.nic=NIC \u306e\u524a\u9664 -label.action.delete.physical.network=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u524a\u9664 -label.action.delete.pod.processing=\u30dd\u30c3\u30c9\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.pod=\u30dd\u30c3\u30c9\u306e\u524a\u9664 -label.action.delete.primary.storage.processing=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.primary.storage=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u524a\u9664 -label.action.delete.secondary.storage.processing=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.secondary.storage=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u524a\u9664 -label.action.delete.security.group.processing=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.security.group=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u524a\u9664 -label.action.delete.service.offering.processing=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.service.offering=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664 -label.action.delete.snapshot.processing=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.snapshot=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u524a\u9664 -label.action.delete.system.service.offering=\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664 -label.action.delete.template.processing=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u524a\u9664 -label.action.delete.user.processing=\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.user=\u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664 -label.action.delete.volume.processing=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u524a\u9664 -label.action.delete.zone.processing=\u30be\u30fc\u30f3\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.delete.zone=\u30be\u30fc\u30f3\u306e\u524a\u9664 -label.action.destroy.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u7834\u68c4\u3057\u3066\u3044\u307e\u3059... -label.action.destroy.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7834\u68c4 -label.action.destroy.systemvm.processing=\u30b7\u30b9\u30c6\u30e0 VM \u3092\u7834\u68c4\u3057\u3066\u3044\u307e\u3059... -label.action.destroy.systemvm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u7834\u68c4 -label.action.detach.disk.processing=\u30c7\u30a3\u30b9\u30af\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059... -label.action.detach.disk=\u30c7\u30a3\u30b9\u30af\u306e\u30c7\u30bf\u30c3\u30c1 -label.action.detach.iso=ISO \u306e\u30c7\u30bf\u30c3\u30c1 -label.action.detach.iso.processing=ISO \u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059... -label.action.disable.account.processing=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.disable.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u7121\u52b9\u5316 -label.action.disable.cluster.processing=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.disable.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u7121\u52b9\u5316 -label.action.disable.nexusVswitch=Nexus 1000V \u306e\u7121\u52b9\u5316 -label.action.disable.physical.network=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u7121\u52b9\u5316 -label.action.disable.pod.processing=\u30dd\u30c3\u30c9\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.disable.pod=\u30dd\u30c3\u30c9\u306e\u7121\u52b9\u5316 -label.action.disable.static.NAT.processing=\u9759\u7684 NAT \u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.disable.static.NAT=\u9759\u7684 NAT \u306e\u7121\u52b9\u5316 -label.action.disable.user.processing=\u30e6\u30fc\u30b6\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.disable.user=\u30e6\u30fc\u30b6\u30fc\u306e\u7121\u52b9\u5316 -label.action.disable.zone.processing=\u30be\u30fc\u30f3\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.disable.zone=\u30be\u30fc\u30f3\u306e\u7121\u52b9\u5316 -label.action.download.ISO=ISO \u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 -label.action.download.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 -label.action.download.volume.processing=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059... -label.action.download.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9 -label.action.edit.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u7de8\u96c6 -label.action.edit.disk.offering=\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7de8\u96c6 -label.action.edit.domain=\u30c9\u30e1\u30a4\u30f3\u306e\u7de8\u96c6 -label.action.edit.global.setting=\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a\u306e\u7de8\u96c6 -label.action.edit.host=\u30db\u30b9\u30c8\u306e\u7de8\u96c6 -label.action.edit.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u7de8\u96c6 -label.action.edit.ISO=ISO \u306e\u7de8\u96c6 -label.action.edit.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7de8\u96c6 -label.action.edit.network.processing=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u7de8\u96c6\u3057\u3066\u3044\u307e\u3059... -label.action.edit.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u7de8\u96c6 -label.action.edit.pod=\u30dd\u30c3\u30c9\u306e\u7de8\u96c6 -label.action.edit.primary.storage=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u7de8\u96c6 -label.action.edit.resource.limits=\u30ea\u30bd\u30fc\u30b9\u5236\u9650\u306e\u7de8\u96c6 -label.action.edit.service.offering=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7de8\u96c6 -label.action.edit.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u7de8\u96c6 -label.action.edit.user=\u30e6\u30fc\u30b6\u30fc\u306e\u7de8\u96c6 -label.action.edit.zone=\u30be\u30fc\u30f3\u306e\u7de8\u96c6 -label.action.enable.account.processing=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.enable.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u6709\u52b9\u5316 -label.action.enable.cluster.processing=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.enable.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u6709\u52b9\u5316 -label.action.enable.maintenance.mode.processing=\u4fdd\u5b88\u30e2\u30fc\u30c9\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.enable.maintenance.mode=\u4fdd\u5b88\u30e2\u30fc\u30c9\u306e\u6709\u52b9\u5316 -label.action.enable.nexusVswitch=Nexus 1000V \u306e\u6709\u52b9\u5316 -label.action.enable.physical.network=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u6709\u52b9\u5316 -label.action.enable.pod.processing=\u30dd\u30c3\u30c9\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.enable.pod=\u30dd\u30c3\u30c9\u306e\u6709\u52b9\u5316 -label.action.enable.static.NAT.processing=\u9759\u7684 NAT \u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.enable.static.NAT=\u9759\u7684 NAT \u306e\u6709\u52b9\u5316 -label.action.enable.user.processing=\u30e6\u30fc\u30b6\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.enable.user=\u30e6\u30fc\u30b6\u30fc\u306e\u6709\u52b9\u5316 -label.action.enable.zone.processing=\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.enable.zone=\u30be\u30fc\u30f3\u306e\u6709\u52b9\u5316 -label.action.expunge.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u62b9\u6d88\u3057\u3066\u3044\u307e\u3059... -label.action.expunge.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u62b9\u6d88 -label.action.force.reconnect.processing=\u518d\u63a5\u7d9a\u3057\u3066\u3044\u307e\u3059... -label.action.force.reconnect=\u5f37\u5236\u518d\u63a5\u7d9a -label.action.generate.keys.processing=\u30ad\u30fc\u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059... -label.action.generate.keys=\u30ad\u30fc\u306e\u751f\u6210 -label.action.list.nexusVswitch=Nexus 1000V \u306e\u4e00\u89a7\u8868\u793a -label.action.lock.account.processing=\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u30ed\u30c3\u30af\u3057\u3066\u3044\u307e\u3059... -label.action.lock.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30ed\u30c3\u30af -label.action.manage.cluster.processing=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.manage.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u7ba1\u7406\u5bfe\u8c61\u5316 -label.action.migrate.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u79fb\u884c\u3057\u3066\u3044\u307e\u3059... -label.action.migrate.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c -label.action.migrate.router.processing=\u30eb\u30fc\u30bf\u30fc\u3092\u79fb\u884c\u3057\u3066\u3044\u307e\u3059... -label.action.migrate.router=\u30eb\u30fc\u30bf\u30fc\u306e\u79fb\u884c -label.action.migrate.systemvm.processing=\u30b7\u30b9\u30c6\u30e0 VM \u3092\u79fb\u884c\u3057\u3066\u3044\u307e\u3059... -label.action.migrate.systemvm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u79fb\u884c -label.action.reboot.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u518d\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059... -label.action.reboot.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u518d\u8d77\u52d5 -label.action.reboot.router.processing=\u30eb\u30fc\u30bf\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059... -label.action.reboot.router=\u30eb\u30fc\u30bf\u30fc\u306e\u518d\u8d77\u52d5 -label.action.reboot.systemvm.processing=\u30b7\u30b9\u30c6\u30e0 VM \u3092\u518d\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059... -label.action.reboot.systemvm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u518d\u8d77\u52d5 -label.action.recurring.snapshot=\u5b9a\u671f\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 -label.action.register.iso=ISO \u306e\u767b\u9332 -label.action.register.template=URL \u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u767b\u9332 -label.action.release.ip=IP \u30a2\u30c9\u30ec\u30b9\u306e\u89e3\u653e -label.action.release.ip.processing=IP \u30a2\u30c9\u30ec\u30b9\u3092\u89e3\u653e\u3057\u3066\u3044\u307e\u3059... -label.action.remove.host.processing=\u30db\u30b9\u30c8\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.action.remove.host=\u30db\u30b9\u30c8\u306e\u524a\u9664 -label.action.reset.password.processing=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u30ea\u30bb\u30c3\u30c8\u3057\u3066\u3044\u307e\u3059... -label.action.reset.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u30ea\u30bb\u30c3\u30c8 -label.action.resize.volume.processing=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b5\u30a4\u30ba\u3092\u5909\u66f4\u3057\u3066\u3044\u307e\u3059... -label.action.resize.volume=\u30dc\u30ea\u30e5\u30fc\u30e0 \u30b5\u30a4\u30ba\u306e\u5909\u66f4 -label.action.resource.limits=\u30ea\u30bd\u30fc\u30b9\u5236\u9650 -label.action.restore.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u5fa9\u5143\u3057\u3066\u3044\u307e\u3059... -label.action.restore.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5fa9\u5143 -label.action.revert.snapshot.processing=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3057\u3066\u3044\u307e\u3059... -label.action.revert.snapshot=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3059 -label.action.start.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059... -label.action.start.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5 -label.action.start.router.processing=\u30eb\u30fc\u30bf\u30fc\u3092\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059... -label.action.start.router=\u30eb\u30fc\u30bf\u30fc\u306e\u8d77\u52d5 -label.action.start.systemvm.processing=\u30b7\u30b9\u30c6\u30e0 VM \u3092\u8d77\u52d5\u3057\u3066\u3044\u307e\u3059... -label.action.start.systemvm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u8d77\u52d5 -label.action.stop.instance.processing=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059... -label.action.stop.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u505c\u6b62 -label.action.stop.router.processing=\u30eb\u30fc\u30bf\u30fc\u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059... -label.action.stop.router=\u30eb\u30fc\u30bf\u30fc\u306e\u505c\u6b62 -label.action.stop.systemvm.processing=\u30b7\u30b9\u30c6\u30e0 VM \u3092\u505c\u6b62\u3057\u3066\u3044\u307e\u3059... -label.action.stop.systemvm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u505c\u6b62 -label.actions=\u64cd\u4f5c -label.action.take.snapshot.processing=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059.... -label.action.take.snapshot=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u4f5c\u6210 -label.action=\u64cd\u4f5c -label.action.unmanage.cluster.processing=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u975e\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3044\u307e\u3059... -label.action.unmanage.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u975e\u7ba1\u7406\u5bfe\u8c61\u5316 -label.action.update.OS.preference=OS \u57fa\u672c\u8a2d\u5b9a\u306e\u66f4\u65b0 -label.action.update.OS.preference.processing=OS \u57fa\u672c\u8a2d\u5b9a\u3092\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059... -label.action.update.resource.count.processing=\u30ea\u30bd\u30fc\u30b9\u6570\u3092\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059... -label.action.update.resource.count=\u30ea\u30bd\u30fc\u30b9\u6570\u306e\u66f4\u65b0 -label.action.vmsnapshot.create=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u4f5c\u6210 -label.action.vmsnapshot.delete=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306e\u524a\u9664 -label.action.vmsnapshot.revert=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3059 -label.activate.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u30a2\u30af\u30c6\u30a3\u30d6\u5316 -label.active.sessions=\u30a2\u30af\u30c6\u30a3\u30d6\u306a\u30bb\u30c3\u30b7\u30e7\u30f3 -label.add.accounts.to=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0\u5148\: -label.add.accounts=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0 -label.add.account.to.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0 -label.add.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0 -label.add.ACL=ACL \u306e\u8ffd\u52a0 -label.add.acl.list=ACL \u4e00\u89a7\u306e\u8ffd\u52a0 -label.add.affinity.group=\u65b0\u3057\u3044\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0 -label.add.baremetal.dhcp.device=\u30d9\u30a2\u30e1\u30bf\u30eb DHCP \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.add.baremetal.rack.configuration=\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a\u306e\u8ffd\u52a0 -label.add.BigSwitchBcf.device=BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e\u8ffd\u52a0 -label.add.BrocadeVcs.device=Brocade VCS \u30b9\u30a4\u30c3\u30c1\u306e\u8ffd\u52a0 -label.add.by.cidr=CIDR \u3067\u8ffd\u52a0 -label.add.by.group=\u30b0\u30eb\u30fc\u30d7\u3067\u8ffd\u52a0 -label.add.by=\u8ffd\u52a0\u5358\u4f4d -label.add.ciscoASA1000v=Cisco ASA 1000V \u30ea\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0 -label.add.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u8ffd\u52a0 -label.add.compute.offering=\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0 -label.add.direct.iprange=\u76f4\u63a5 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8ffd\u52a0 -label.add.disk.offering=\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0 -label.add.domain=\u30c9\u30e1\u30a4\u30f3\u306e\u8ffd\u52a0 -label.added.brocade.vcs.switch=\u65b0\u3057\u3044 Brocade VCS \u30b9\u30a4\u30c3\u30c1\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f -label.added.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f -label.added.new.bigswitch.bcf.controller=\u65b0\u3057\u3044 BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f -label.added.nicira.nvp.controller=\u65b0\u3057\u3044 Nicira NVP Controller \u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f -label.add.egress.rule=\u9001\u4fe1\u898f\u5247\u306e\u8ffd\u52a0 -label.addes.new.f5=\u65b0\u3057\u3044 F5 \u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f -label.add.F5.device=F5 \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.add.firewall=\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u898f\u5247\u306e\u8ffd\u52a0 -label.add.globo.dns=GloboDNS \u306e\u8ffd\u52a0 -label.add.gslb=GSLB \u306e\u8ffd\u52a0 -label.add.guest.network=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0 -label.add.host=\u30db\u30b9\u30c8\u306e\u8ffd\u52a0 -label.adding.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -label.adding.failed=\u8ffd\u52a0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f -label.adding.pod=\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -label.adding.processing=\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059... -label.add.ingress.rule=\u53d7\u4fe1\u898f\u5247\u306e\u8ffd\u52a0 -label.adding.succeeded=\u8ffd\u52a0\u3057\u307e\u3057\u305f -label.adding=\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -label.adding.user=\u30e6\u30fc\u30b6\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -label.adding.zone=\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -label.add.intermediate.certificate=\u4e2d\u9593\u8a3c\u660e\u66f8\u306e\u8ffd\u52a0 -label.add.internal.lb=\u5185\u90e8 LB \u306e\u8ffd\u52a0 -label.add.ip.range=IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8ffd\u52a0 -label.add.isolated.guest.network=\u5206\u96e2\u30b2\u30b9\u30c8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0 -label.add.isolated.guest.network.with.sourcenat=\u5206\u96e2\u30b2\u30b9\u30c8\u30cd\u30c3\u30c8\u30ef\u30fc\u30af(\u9001\u4fe1\u5143NAT)\u306e\u8ffd\u52a0 -label.add.isolated.network=\u5206\u96e2\u3055\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0 -label.additional.networks=\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.add.ldap.account=LDAP \u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0 -label.add.LDAP.account=LDAP \u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u8ffd\u52a0 -label.add.list.name=ACL \u4e00\u89a7\u540d -label.add.load.balancer=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u8ffd\u52a0 -label.add.more=\u305d\u306e\u307b\u304b\u306e\u9805\u76ee\u306e\u8ffd\u52a0 -label.add.netScaler.device=NetScaler \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.add.network.acl.list=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u4e00\u89a7\u306e\u8ffd\u52a0 -label.add.network.ACL=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u306e\u8ffd\u52a0 -label.add.network.device=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.add.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0 -label.add.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0 -label.add.new.F5=\u65b0\u3057\u3044 F5 \u306e\u8ffd\u52a0 -label.add.new.gateway=\u65b0\u3057\u3044\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0 -label.add.new.NetScaler=\u65b0\u3057\u3044 NetScaler \u306e\u8ffd\u52a0 -label.add.new.PA=\u65b0\u3057\u3044 Palo Alto \u306e\u8ffd\u52a0 -label.add.new.SRX=\u65b0\u3057\u3044 SRX \u306e\u8ffd\u52a0 -label.add.new.tier=\u65b0\u3057\u3044\u968e\u5c64\u306e\u8ffd\u52a0 -label.add.nfs.secondary.staging.store=NFS \u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u306e\u8ffd\u52a0 -label.add.NiciraNvp.device=NVP Controller \u306e\u8ffd\u52a0 -label.add.NuageVsp.device=Nuage Virtualized Services Directory (VSD) \u306e\u8ffd\u52a0 -label.add.OpenDaylight.device=OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u8ffd\u52a0 -label.add.PA.device=Palo Alto \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.add.physical.network=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0 -label.add.pod=\u30dd\u30c3\u30c9\u306e\u8ffd\u52a0 -label.add.portable.ip.range=\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8ffd\u52a0 -label.add.port.forwarding.rule=\u30dd\u30fc\u30c8\u8ee2\u9001\u898f\u5247\u306e\u8ffd\u52a0 -label.add.primary.storage=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8ffd\u52a0 -label.add.private.gateway=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0 -label.add.region=\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u8ffd\u52a0 -label.add.resources=\u30ea\u30bd\u30fc\u30b9\u306e\u8ffd\u52a0 -label.add.route=\u30eb\u30fc\u30c8\u306e\u8ffd\u52a0 -label.add.rule=\u898f\u5247\u306e\u8ffd\u52a0 -label.add.secondary.storage=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8ffd\u52a0 -label.add.security.group=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u8ffd\u52a0 -label.add.service.offering=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0 -label.add.SRX.device=SRX \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.add.static.nat.rule=\u9759\u7684 NAT \u898f\u5247\u306e\u8ffd\u52a0 -label.add.static.route=\u9759\u7684\u30eb\u30fc\u30c8\u306e\u8ffd\u52a0 -label.add.system.service.offering=\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0 -label.add.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u8ffd\u52a0 -label.add.to.group=\u8ffd\u52a0\u5148\u30b0\u30eb\u30fc\u30d7 -label.add=\u8ffd\u52a0 -label.add.ucs.manager=UCS Manager \u306e\u8ffd\u52a0 -label.add.userdata=\u30e6\u30fc\u30b6\u30fc\u30c7\u30fc\u30bf -label.add.user=\u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0 -label.add.vlan=VLAN \u306e\u8ffd\u52a0 -label.add.vms.to.lb=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u3078\u306e VM \u306e\u8ffd\u52a0 -label.add.vms=VM \u306e\u8ffd\u52a0 -label.add.VM.to.tier=\u968e\u5c64\u3078\u306e VM \u306e\u8ffd\u52a0 -label.add.vm=VM \u306e\u8ffd\u52a0 -label.add.vmware.datacenter=VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306e\u8ffd\u52a0 -label.add.vnmc.device=VNMC \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.add.vnmc.provider=VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u8ffd\u52a0 -label.add.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u8ffd\u52a0 -label.add.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8ffd\u52a0 -label.add.vpc=VPC \u306e\u8ffd\u52a0 -label.add.vpn.customer.gateway=VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0 -label.add.VPN.gateway=VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u8ffd\u52a0 -label.add.vpn.user=VPN \u30e6\u30fc\u30b6\u30fc\u306e\u8ffd\u52a0 -label.add.vxlan=VXLAN \u306e\u8ffd\u52a0 -label.add.zone=\u30be\u30fc\u30f3\u306e\u8ffd\u52a0 -label.admin.accounts=\u7ba1\u7406\u8005\u30a2\u30ab\u30a6\u30f3\u30c8 -label.admin=\u7ba1\u7406\u8005 -label.advanced.mode=\u62e1\u5f35\u30e2\u30fc\u30c9 -label.advanced.search=\u9ad8\u5ea6\u306a\u691c\u7d22 -label.advanced=\u62e1\u5f35 -label.affinity.groups=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.affinity.group=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.affinity=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 -label.agent.password=\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8 \u30d1\u30b9\u30ef\u30fc\u30c9 -label.agent.port=\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u30dd\u30fc\u30c8 -label.agent.state=\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8\u306e\u72b6\u614b -label.agent.username=\u30a8\u30fc\u30b8\u30a7\u30f3\u30c8 \u30e6\u30fc\u30b6\u30fc\u540d -label.agree=\u540c\u610f\u3059\u308b -label.alert.archived=\u30a2\u30e9\u30fc\u30c8\u304c\u30a2\u30fc\u30ab\u30a4\u30d6\u3055\u308c\u307e\u3057\u305f -label.alert.deleted=\u30a2\u30e9\u30fc\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f -label.alert.details=\u30a2\u30e9\u30fc\u30c8\u306e\u8a73\u7d30 -label.alert=\u30a2\u30e9\u30fc\u30c8 -label.algorithm=\u30a2\u30eb\u30b4\u30ea\u30ba\u30e0 -label.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f -label.allocation.state=\u5272\u308a\u5f53\u3066\u72b6\u614b -label.allow=\u8a31\u53ef -label.anti.affinity.groups=\u30a2\u30f3\u30c1\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.anti.affinity.group=\u30a2\u30f3\u30c1\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.anti.affinity=\u30a2\u30f3\u30c1\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 -label.api.key=API \u30ad\u30fc -label.api.version=API \u30d0\u30fc\u30b8\u30e7\u30f3 -label.apply=\u9069\u7528 -label.app.name=CloudStack -label.archive.alerts=\u30a2\u30e9\u30fc\u30c8\u306e\u30a2\u30fc\u30ab\u30a4\u30d6 -label.archive.events=\u30a4\u30d9\u30f3\u30c8\u306e\u30a2\u30fc\u30ab\u30a4\u30d6 -label.archive=\u30a2\u30fc\u30ab\u30a4\u30d6 -label.assigned.vms=\u5272\u308a\u5f53\u3066\u6e08\u307f VM -label.assign.instance.another=\u307b\u304b\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3078\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u5272\u308a\u5f53\u3066 -label.assign.to.load.balancer=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u5272\u308a\u5f53\u3066\u3066\u3044\u307e\u3059 -label.assign=\u5272\u308a\u5f53\u3066 -label.assign.vms=\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u5272\u308a\u5f53\u3066 -label.associated.network.id=\u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID -label.associated.network=\u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.associated.profile=\u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb -label.associate.public.ip=\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u95a2\u9023\u4ed8\u3051 -label.attached.iso=\u30a2\u30bf\u30c3\u30c1\u3055\u308c\u305f ISO -label.author.email=\u4f5c\u6210\u8005\u306e\u96fb\u5b50\u30e1\u30fc\u30eb -label.author.name=\u4f5c\u6210\u8005\u306e\u540d\u524d -label.autoscale.configuration.wizard=\u30aa\u30fc\u30c8\u30b9\u30b1\u30fc\u30eb\u8a2d\u5b9a\u30a6\u30a3\u30b6\u30fc\u30c9 -label.autoscale=\u81ea\u52d5\u30b5\u30a4\u30ba\u8a2d\u5b9a -label.availability=\u53ef\u7528\u6027 -label.availability.zone=\u30a2\u30d9\u30a4\u30e9\u30d3\u30ea\u30c6\u30a3 \u30be\u30fc\u30f3 -label.availabilityZone=\u30a2\u30d9\u30a4\u30e9\u30d3\u30ea\u30c6\u30a3\u30be\u30fc\u30f3 -label.available.public.ips=\u4f7f\u7528\u3067\u304d\u308b\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9 -label.available=\u4f7f\u7528\u53ef\u80fd -label.back=\u623b\u308b -label.bandwidth=\u5e2f\u57df\u5e45 -label.baremetal.dhcp.devices=\u30d9\u30a2\u30e1\u30bf\u30eb DHCP \u30c7\u30d0\u30a4\u30b9 -label.baremetal.dhcp.provider=\u30d9\u30a2\u30e1\u30bf\u30eb DHCP \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc -label.baremetal.pxe.devices=\u30d9\u30a2\u30e1\u30bf\u30eb PXE \u30c7\u30d0\u30a4\u30b9 -label.baremetal.pxe.device=\u30d9\u30a2\u30e1\u30bf\u30eb PXE \u30c7\u30d0\u30a4\u30b9\u306e\u8ffd\u52a0 -label.baremetal.pxe.provider=\u30d9\u30a2\u30e1\u30bf\u30eb PXE \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc -label.baremetal.rack.configuration=\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a -label.basic.mode=\u57fa\u672c\u30e2\u30fc\u30c9 -label.basic=\u57fa\u672c -label.bigswitch.bcf.details=BigSwitch BCF \u306e\u8a73\u7d30 -label.bigswitch.bcf.nat=BigSwitch BCF \u306e NAT \u3092\u6709\u52b9\u5316\u3057\u307e\u3057\u305f -label.bigswitch.controller.address=BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e\u30a2\u30c9\u30ec\u30b9 -label.blade.id=\u30d6\u30ec\u30fc\u30c9 ID -label.blades=\u30d6\u30ec\u30fc\u30c9 -label.bootable=\u8d77\u52d5\u53ef\u80fd -label.broadcast.domain.range=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306e\u7bc4\u56f2 -label.broadcast.domain.type=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306e\u7a2e\u985e -label.broadcast.uri=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 URI -label.broadcasturi=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 URI -label.broadcat.uri=\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 URI -label.brocade.vcs.address=VCS \u30b9\u30a4\u30c3\u30c1 \u30a2\u30c9\u30ec\u30b9 -label.brocade.vcs.details=Brocade VCS \u30b9\u30a4\u30c3\u30c1\u306e\u8a73\u7d30 -label.by.account=\u30a2\u30ab\u30a6\u30f3\u30c8 -label.by.alert.type=\u30a2\u30e9\u30fc\u30c8\u306e\u7a2e\u985e -label.by.availability=\u53ef\u7528\u6027 -label.by.date.end=\u65e5\u4ed8 (\u7d42\u4e86) -label.by.date.start=\u65e5\u4ed8 (\u958b\u59cb) -label.by.domain=\u30c9\u30e1\u30a4\u30f3 -label.by.end.date=\u7d42\u4e86\u65e5 -label.by.event.type=\u30a4\u30d9\u30f3\u30c8\u306e\u7a2e\u985e -label.by.level=\u30ec\u30d9\u30eb -label.by.pod=\u30dd\u30c3\u30c9 -label.by.role=\u5f79\u5272 -label.by.start.date=\u958b\u59cb\u65e5 -label.by.state=\u72b6\u614b -label.bytes.received=\u53d7\u4fe1\u30d0\u30a4\u30c8 -label.bytes.sent=\u9001\u4fe1\u30d0\u30a4\u30c8 -label.by.traffic.type=\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e -label.by.type.id=\u7a2e\u985e ID -label.by.type=\u7a2e\u985e -label.by.zone=\u30be\u30fc\u30f3 -label.cache.mode=\u66f8\u304d\u8fbc\u307f\u30ad\u30e3\u30c3\u30b7\u30e5\u306e\u7a2e\u985e -label.cancel=\u30ad\u30e3\u30f3\u30bb\u30eb -label.capacity.bytes=\u51e6\u7406\u80fd\u529b (\u30d0\u30a4\u30c8) -label.capacity.iops=\u51e6\u7406\u80fd\u529b (IOPS) -label.capacity=\u51e6\u7406\u80fd\u529b -label.certificate=\u30b5\u30fc\u30d0\u30fc\u8a3c\u660e\u66f8 -label.change.affinity=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3\u306e\u5909\u66f4 -label.change.ipaddress=NIC \u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u5909\u66f4 -label.change.service.offering=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u5909\u66f4 -label.change.value=\u5024\u306e\u5909\u66f4 -label.character=\u6587\u5b57 -label.chassis=\u30b7\u30e3\u30fc\u30b7 -label.checksum=\u30c1\u30a7\u30c3\u30af\u30b5\u30e0 -label.cidr.account=CIDR \u307e\u305f\u306f\u30a2\u30ab\u30a6\u30f3\u30c8/\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.cidr=CIDR -label.CIDR.list=CIDR \u4e00\u89a7 -label.cidr.list=\u9001\u4fe1\u5143 CIDR -label.CIDR.of.destination.network=\u5b9b\u5148\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e CIDR -label.cisco.nexus1000v.ip.address=Nexus 1000V \u306e IP \u30a2\u30c9\u30ec\u30b9 -label.cisco.nexus1000v.password=Nexus 1000V \u306e\u30d1\u30b9\u30ef\u30fc\u30c9 -label.cisco.nexus1000v.username=Nexus 1000V \u306e\u30e6\u30fc\u30b6\u30fc\u540d -label.ciscovnmc.resource.details=Cisco VNMC \u30ea\u30bd\u30fc\u30b9\u306e\u8a73\u7d30 -label.clean.up=\u30af\u30ea\u30fc\u30f3 \u30a2\u30c3\u30d7\u3059\u308b -label.clear.list=\u4e00\u89a7\u306e\u6d88\u53bb -label.close=\u9589\u3058\u308b -label.cloud.console=\u30af\u30e9\u30a6\u30c9\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb -label.cloud.managed=Cloud.com \u306b\u3088\u308b\u7ba1\u7406 -label.cluster.name=\u30af\u30e9\u30b9\u30bf\u30fc\u540d -label.clusters=\u30af\u30e9\u30b9\u30bf\u30fc -label.cluster.type=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u7a2e\u985e -label.cluster=\u30af\u30e9\u30b9\u30bf\u30fc -label.clvm=CLVM -label.code=\u30b3\u30fc\u30c9 -label.community=\u30b3\u30df\u30e5\u30cb\u30c6\u30a3 -label.compute.and.storage=\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u3068\u30b9\u30c8\u30ec\u30fc\u30b8 -label.compute.offerings=\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.compute.offering=\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.compute=\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 -label.configuration=\u69cb\u6210 -label.configure.ldap=LDAP \u306e\u69cb\u6210 -label.configure.network.ACLs=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u306e\u69cb\u6210 -label.configure.sticky.policy=\u30b9\u30c6\u30a3\u30c3\u30ad\u30fc\u30dd\u30ea\u30b7\u30fc\u306e\u8a2d\u5b9a -label.configure=\u69cb\u6210 -label.configure.vpc=VPC \u306e\u69cb\u6210 -label.confirmation=\u78ba\u8a8d -label.confirm.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u306e\u78ba\u8a8d\u5165\u529b -label.congratulations=\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306f\u3053\u308c\u3067\u5b8c\u4e86\u3067\u3059\u3002 -label.conserve.mode=\u7bc0\u7d04\u30e2\u30fc\u30c9 -label.console.proxy=\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7 -label.console.proxy.vm=\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7 VM -label.continue.basic.install=\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3092\u7d9a\u884c\u3059\u308b -label.continue=\u7d9a\u884c -label.copying.iso=ISO \u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059 -label.corrections.saved=\u63a5\u7d9a\u304c\u4fdd\u5b58\u3055\u308c\u307e\u3057\u305f -label.counter=\u30ab\u30a6\u30f3\u30bf\u30fc -label.cpu.allocated.for.VMs=VM \u306b\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e CPU -label.cpu.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e CPU -label.CPU.cap=CPU \u30ad\u30e3\u30c3\u30d7 -label.cpu=CPU -label.cpu.limits=CPU \u5236\u9650 -label.cpu.mhz=CPU (MHz) -label.cpu.utilized=CPU \u4f7f\u7528\u7387 -label.created.by.system=\u30b7\u30b9\u30c6\u30e0\u4f5c\u6210 -label.created=\u4f5c\u6210\u65e5\u6642 -label.create.nfs.secondary.staging.storage=NFS \u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u3092\u4f5c\u6210\u3059\u308b -label.create.nfs.secondary.staging.store=NFS \u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u3092\u4f5c\u6210\u3059\u308b -label.create.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210 -label.create.ssh.key.pair=SSH \u306e\u30ad\u30fc\u30da\u30a2\u3092\u4f5c\u6210 -label.create.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210 -label.create.VPN.connection=VPN \u63a5\u7d9a\u306e\u4f5c\u6210 -label.cross.zones=\u30af\u30ed\u30b9 \u30be\u30fc\u30f3 -label.custom.disk.iops=\u30ab\u30b9\u30bf\u30e0 IOPS -label.custom.disk.offering=\u30ab\u30b9\u30bf\u30e0\u30c7\u30a3\u30b9\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.custom.disk.size=\u30ab\u30b9\u30bf\u30e0 \u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba -label.custom=\u30ab\u30b9\u30bf\u30e0 -label.daily=\u6bce\u65e5 -label.data.disk.offering=\u30c7\u30fc\u30bf \u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.date=\u65e5\u6642 -label.day.of.month=\u6bce\u6708\u6307\u5b9a\u65e5 -label.day.of.week=\u6bce\u9031\u6307\u5b9a\u65e5 -label.day=\u65e5 -label.dc.name=DC \u540d -label.dead.peer.detection=\u505c\u6b62\u30d4\u30a2\u3092\u691c\u51fa\u3059\u308b -label.decline.invitation=\u62db\u5f85\u306e\u8f9e\u9000 -label.dedicate.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u5c02\u7528\u306b\u8a2d\u5b9a -label.dedicated=\u5c02\u7528 -label.dedicated.vlan.vni.ranges=\u5c02\u7528 VLAN/VNI \u306e\u7bc4\u56f2 -label.dedicate.host=\u30db\u30b9\u30c8\u3092\u5c02\u7528\u306b\u8a2d\u5b9a -label.dedicate.pod=\u30dd\u30c3\u30c9\u3092\u5c02\u7528\u306b\u8a2d\u5b9a -label.dedicate=\u5c02\u7528\u306b\u8a2d\u5b9a -label.dedicate.vlan.vni.range=VLAN/VNI \u306e\u7bc4\u56f2\u3092\u5c02\u7528\u306b\u8a2d\u5b9a -label.dedicate.zone=\u30be\u30fc\u30f3\u3092\u5c02\u7528\u306b\u8a2d\u5b9a -label.default.egress.policy=\u30c7\u30d5\u30a9\u30eb\u30c8\u306e\u9001\u4fe1\u30dd\u30ea\u30b7\u30fc -label.default=\u30c7\u30d5\u30a9\u30eb\u30c8 -label.default.use=\u30c7\u30d5\u30a9\u30eb\u30c8\u4f7f\u7528 -label.default.view=\u30c7\u30d5\u30a9\u30eb\u30c8 \u30d3\u30e5\u30fc -label.delete.acl.list=ACL \u4e00\u89a7\u306e\u524a\u9664 -label.delete.affinity.group=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u524a\u9664 -label.delete.alerts=\u30a2\u30e9\u30fc\u30c8\u306e\u524a\u9664 -label.delete.baremetal.rack.configuration=\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a\u306e\u524a\u9664 -label.delete.BigSwitchBcf=BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u306e\u524a\u9664 -label.delete.BrocadeVcs=Brocade VCS \u30b9\u30a4\u30c3\u30c1\u306e\u524a\u9664 -label.delete.ciscoASA1000v=Cisco ASA 1000V \u30ea\u30bd\u30fc\u30b9\u306e\u524a\u9664 -label.delete.ciscovnmc.resource=Cisco VNMC \u30ea\u30bd\u30fc\u30b9\u306e\u524a\u9664 -label.delete.events=\u30a4\u30d9\u30f3\u30c8\u306e\u524a\u9664 -label.delete.F5=F5 \u306e\u524a\u9664 -label.delete.gateway=\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664 -label.delete.internal.lb=\u5185\u90e8 LB \u306e\u524a\u9664 -label.delete.NetScaler=NetScaler \u306e\u524a\u9664 -label.delete.NiciraNvp=NVP Controller \u306e\u524a\u9664 -label.delete.NuageVsp=Nuage VSD \u306e\u524a\u9664 -label.delete.OpenDaylight.device=OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u524a\u9664 -label.delete.PA=Palo Alto \u306e\u524a\u9664 -label.delete.portable.ip.range=\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u524a\u9664 -label.delete.profile=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u306e\u524a\u9664 -label.delete.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u524a\u9664 -label.delete.secondary.staging.store=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u306e\u524a\u9664 -label.delete.SRX=SRX \u306e\u524a\u9664 -label.delete=\u524a\u9664 -label.delete.ucs.manager=UCS Manager \u306e\u524a\u9664 -label.delete.VPN.connection=VPN \u63a5\u7d9a\u306e\u524a\u9664 -label.delete.VPN.customer.gateway=VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664 -label.delete.VPN.gateway=VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u306e\u524a\u9664 -label.delete.vpn.user=VPN \u30e6\u30fc\u30b6\u30fc\u306e\u524a\u9664 -label.deleting.failed=\u524a\u9664\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f -label.deleting.processing=\u524a\u9664\u3057\u3066\u3044\u307e\u3059... -label.deny=\u62d2\u5426 -label.deployment.planner=\u5c55\u958b\u30d7\u30e9\u30f3\u30ca\u30fc -label.description=\u8aac\u660e -label.destination.physical.network.id=\u30d6\u30ea\u30c3\u30b8\u5148\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID -label.destination.zone=\u30b3\u30d4\u30fc\u5148\u30be\u30fc\u30f3 -label.destroy.router=\u30eb\u30fc\u30bf\u30fc\u306e\u7834\u68c4 -label.destroy=\u7834\u68c4 -label.destroy.vm.graceperiod=VM \u7834\u68c4\u306e\u7336\u4e88\u671f\u9593 -label.detaching.disk=\u30c7\u30a3\u30b9\u30af\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3044\u307e\u3059 -label.details=\u8a73\u7d30 -label.device.id=\u30c7\u30d0\u30a4\u30b9 ID -label.devices=\u30c7\u30d0\u30a4\u30b9 -label.dhcp=DHCP -label.DHCP.server.type=DHCP \u30b5\u30fc\u30d0\u30fc\u306e\u7a2e\u985e -label.direct.attached.public.ip=\u76f4\u63a5\u30a2\u30bf\u30c3\u30c1\u3055\u308c\u3066\u3044\u308b\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9 -label.direct.ips=\u5171\u6709\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e IP \u30a2\u30c9\u30ec\u30b9 -label.disable.autoscale=\u81ea\u52d5\u30b5\u30a4\u30ba\u8a2d\u5b9a\u306e\u7121\u52b9\u5316 -label.disabled=\u7121\u52b9 -label.disable.host=\u30db\u30b9\u30c8\u306e\u7121\u52b9\u5316 -label.disable.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7121\u52b9\u5316 -label.disable.provider=\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u7121\u52b9\u5316 -label.disable.vnmc.provider=VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u7121\u52b9\u5316 -label.disable.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u7121\u52b9\u5316 -label.disable.vpn=\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u306e\u7121\u52b9\u5316 -label.disabling.vpn.access=VPN \u30a2\u30af\u30bb\u30b9\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -label.disassociate.profile.blade=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3068\u30d6\u30ec\u30fc\u30c9\u306e\u95a2\u9023\u4ed8\u3051\u306e\u89e3\u9664 -label.disbale.vnmc.device=VNMC \u30c7\u30d0\u30a4\u30b9\u306e\u7121\u52b9\u5316 -label.disk.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30c7\u30a3\u30b9\u30af -label.disk.bytes.read.rate=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a\u901f\u5ea6 (BPS) -label.disk.bytes.write.rate=\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f\u901f\u5ea6 (BPS) -label.disk.iops.max=\u6700\u5927 IOPS -label.disk.iops.min=\u6700\u5c0f IOPS -label.disk.iops.read.rate=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a\u901f\u5ea6 (IOPS) -label.disk.iops.total=IOPS \u5408\u8a08 -label.disk.iops.write.rate=\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f\u901f\u5ea6 (IOPS) -label.disk.offering.details=\u30c7\u30a3\u30b9\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30 -label.disk.offering=\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.diskoffering=\u30c7\u30a3\u30b9\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.disk.provisioningtype=\u30d7\u30ed\u30d3\u30b8\u30e7\u30cb\u30f3\u30b0\u306e\u7a2e\u985e -label.disk.read.bytes=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a (\u30d0\u30a4\u30c8) -label.disk.read.io=\u30c7\u30a3\u30b9\u30af\u8aad\u307f\u53d6\u308a (IO) -label.disk.size.gb=\u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba (GB) -label.disk.size=\u30c7\u30a3\u30b9\u30af \u30b5\u30a4\u30ba -label.disk.total=\u30c7\u30a3\u30b9\u30af\u5408\u8a08 -label.disk.volume=\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0 -label.disk.write.bytes=\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f (\u30d0\u30a4\u30c8) -label.disk.write.io=\u30c7\u30a3\u30b9\u30af\u66f8\u304d\u8fbc\u307f (IO) -label.display.name=\u8868\u793a\u540d -label.display.text=\u8868\u793a\u30c6\u30ad\u30b9\u30c8 -label.distributedrouter=\u5206\u6563\u30eb\u30fc\u30bf\u30fc -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e DNS \u30c9\u30e1\u30a4\u30f3 -label.domain.admin=\u30c9\u30e1\u30a4\u30f3\u7ba1\u7406\u8005 -label.domain.details=\u30c9\u30e1\u30a4\u30f3\u306e\u8a73\u7d30 -label.domain.id=\u30c9\u30e1\u30a4\u30f3 ID -label.domain.lower=\u30c9\u30e1\u30a4\u30f3 -label.domain.name=\u30c9\u30e1\u30a4\u30f3\u540d -label.domain.router=\u30c9\u30e1\u30a4\u30f3 \u30eb\u30fc\u30bf\u30fc -label.domain.suffix=DNS \u30c9\u30e1\u30a4\u30f3 \u30b5\u30d5\u30a3\u30c3\u30af\u30b9 (\u4f8b\: xyz.com) -label.domain=\u30c9\u30e1\u30a4\u30f3 -label.done=\u5b8c\u4e86 -label.double.quotes.are.not.allowed=\u4e8c\u91cd\u5f15\u7528\u7b26\u306f\u4f7f\u7528\u3067\u304d\u307e\u305b\u3093 -label.download.progress=\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u306e\u9032\u6357\u72b6\u6cc1 -label.drag.new.position=\u65b0\u3057\u3044\u4f4d\u7f6e\u306b\u30c9\u30e9\u30c3\u30b0 -label.duration.in.sec=\u6301\u7d9a\u6642\u9593(\u79d2) -label.dynamically.scalable=\u52d5\u7684\u306b\u30b5\u30a4\u30ba\u8a2d\u5b9a\u3059\u308b -label.edit.acl.rule=ACL \u898f\u5247\u306e\u7de8\u96c6 -label.edit.affinity.group=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306e\u7de8\u96c6 -label.edit.lb.rule=LB \u898f\u5247\u306e\u7de8\u96c6 -label.edit.network.details=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8a73\u7d30\u306e\u7de8\u96c6 -label.edit.project.details=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u8a73\u7d30\u306e\u7de8\u96c6 -label.edit.region=\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u7de8\u96c6 -label.edit.rule=\u30eb\u30fc\u30eb\u306e\u7de8\u96c6 -label.edit.secondary.ips=\u30bb\u30ab\u30f3\u30c0\u30ea IP \u306e\u7de8\u96c6 -label.edit.tags=\u30bf\u30b0\u306e\u7de8\u96c6 -label.edit.traffic.type=\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u306e\u7de8\u96c6 -label.edit=\u7de8\u96c6 -label.edit.vpc=VPC \u306e\u7de8\u96c6 -label.egress.default.policy=\u9001\u4fe1\u306e\u30c7\u30d5\u30a9\u30eb\u30c8 \u30dd\u30ea\u30b7\u30fc -label.egress.rules=\u9001\u4fe1\u898f\u5247 -label.egress.rule=\u9001\u4fe1\u898f\u5247 -label.elastic.IP=\u30a8\u30e9\u30b9\u30c6\u30a3\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9 -label.elastic.LB=\u30a8\u30e9\u30b9\u30c6\u30a3\u30c3\u30af LB -label.elastic=\u30a8\u30e9\u30b9\u30c6\u30a3\u30c3\u30af -label.email.lower=\u96fb\u5b50\u30e1\u30fc\u30eb -label.email=\u96fb\u5b50\u30e1\u30fc\u30eb -label.enable.autoscale=\u81ea\u52d5\u30b5\u30a4\u30ba\u8a2d\u5b9a\u306e\u6709\u52b9\u5316 -label.enable.host=\u30db\u30b9\u30c8\u306e\u6709\u52b9\u5316 -label.enable.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u6709\u52b9\u5316 -label.enable.provider=\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u6709\u52b9\u5316 -label.enable.s3=S3 \u30d9\u30fc\u30b9\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u6709\u52b9\u5316 -label.enable.swift=Swift \u306e\u6709\u52b9\u5316 -label.enable.vnmc.device=VNMC \u30c7\u30d0\u30a4\u30b9\u306e\u6709\u52b9\u5316 -label.enable.vnmc.provider=VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u6709\u52b9\u5316 -label.enable.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u6709\u52b9\u5316 -label.enable.vpn=\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u306e\u6709\u52b9\u5316 -label.enabling.vpn.access=VPN \u30a2\u30af\u30bb\u30b9\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -label.enabling.vpn=VPN \u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -label.end.IP=\u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9 -label.endpoint.or.operation=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8\u307e\u305f\u306f\u64cd\u4f5c -label.endpoint=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8 -label.end.port=\u7d42\u4e86\u30dd\u30fc\u30c8 -label.end.reserved.system.IP=\u4e88\u7d04\u6e08\u307f\u7d42\u4e86\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9 -label.end.vlan=\u7d42\u4e86 VLAN -label.end.vxlan=\u7d42\u4e86 VXLAN -label.enter.token=\u30c8\u30fc\u30af\u30f3\u306e\u5165\u529b -label.error.code=\u30a8\u30e9\u30fc \u30b3\u30fc\u30c9 -label.error=\u30a8\u30e9\u30fc -label.error.upper=\u30a8\u30e9\u30fc -label.ESP.encryption=ESP \u6697\u53f7\u5316 -label.ESP.hash=ESP \u30cf\u30c3\u30b7\u30e5 -label.ESP.lifetime=ESP \u6709\u52b9\u671f\u9593 (\u79d2) -label.ESP.policy=ESP \u30dd\u30ea\u30b7\u30fc -label.esx.host=ESX/ESXi \u30db\u30b9\u30c8 -label.event.archived=\u30a4\u30d9\u30f3\u30c8\u304c\u30a2\u30fc\u30ab\u30a4\u30d6\u3055\u308c\u307e\u3057\u305f -label.event.deleted=\u30a4\u30d9\u30f3\u30c8\u304c\u524a\u9664\u3055\u308c\u307e\u3057\u305f -label.event=\u30a4\u30d9\u30f3\u30c8 -label.every=\u6bce -label.example=\u4f8b -label.expunge=\u62b9\u6d88 -label.external.link=\u5916\u90e8\u30ea\u30f3\u30af -label.extractable.lower=\u5c55\u958b -label.extractable=\u62bd\u51fa\u53ef\u80fd -label.f5.details=F5 \u306e\u8a73\u7d30 -label.f5=F5 -label.failed=\u5931\u6557 -label.featured=\u304a\u3059\u3059\u3081 -label.fetch.latest=\u6700\u65b0\u60c5\u5831\u306e\u53d6\u5f97 -label.filterBy=\u30d5\u30a3\u30eb\u30bf\u30fc -label.fingerprint=\u30d5\u30a3\u30f3\u30ac\u30fc\u30d7\u30ea\u30f3\u30c8 -label.firewall=\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb -label.firstname.lower=\u540d -label.first.name=\u540d -label.format.lower=\u30d5\u30a9\u30fc\u30de\u30c3\u30c8 -label.format=\u5f62\u5f0f -label.friday=\u91d1\u66dc\u65e5 -label.full.path=\u30d5\u30eb \u30d1\u30b9 -label.full=\u5b8c\u5168 -label.gateway=\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.general.alerts=\u4e00\u822c\u30a2\u30e9\u30fc\u30c8 -label.generating.url=URL \u3092\u751f\u6210\u3057\u3066\u3044\u307e\u3059 -label.globo.dns.configuration=GloboDNS \u306e\u8a2d\u5b9a -label.globo.dns=GloboDNS -label.gluster.volume=\u30dc\u30ea\u30e5\u30fc\u30e0 -label.go.step.2=\u624b\u9806 2 \u306b\u9032\u3080 -label.go.step.3=\u624b\u9806 3 \u306b\u9032\u3080 -label.go.step.4=\u624b\u9806 4 \u306b\u9032\u3080 -label.go.step.5=\u624b\u9806 5 \u306b\u9032\u3080 -label.gpu=GPU -label.group.by.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u5225\u30b0\u30eb\u30fc\u30d7 -label.group.by.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u5225\u30b0\u30eb\u30fc\u30d7 -label.group.by.pod=\u30dd\u30c3\u30c9\u5225\u30b0\u30eb\u30fc\u30d7 -label.group.by.zone=\u30be\u30fc\u30f3\u5225\u30b0\u30eb\u30fc\u30d7 -label.group.optional=\u30b0\u30eb\u30fc\u30d7 (\u30aa\u30d7\u30b7\u30e7\u30f3) -label.group=\u30b0\u30eb\u30fc\u30d7 -label.gslb.assigned.lb.more=\u8ca0\u8377\u5206\u6563\u306e\u8ffd\u52a0\u5272\u308a\u5f53\u3066 -label.gslb.assigned.lb=\u5272\u308a\u5f53\u3066\u6e08\u307f\u8ca0\u8377\u5206\u6563 -label.gslb.delete=GSLB \u306e\u524a\u9664 -label.gslb.details=GSLB \u306e\u8a73\u7d30 -label.gslb.domain.name=GSLB \u30c9\u30e1\u30a4\u30f3\u540d -label.gslb=GSLB -label.gslb.lb.details=\u8ca0\u8377\u5206\u6563\u306e\u8a73\u7d30 -label.gslb.lb.remove=\u3053\u306e GSLB \u304b\u3089\u8ca0\u8377\u5206\u6563\u3092\u524a\u9664 -label.gslb.lb.rule=\u8ca0\u8377\u5206\u6563\u898f\u5247 -label.gslb.service=GSLB \u30b5\u30fc\u30d3\u30b9 -label.gslb.service.private.ip=GSLB \u30b5\u30fc\u30d3\u30b9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9 -label.gslb.service.public.ip=GSLB \u30b5\u30fc\u30d3\u30b9\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9 -label.gslb.servicetype=\u30b5\u30fc\u30d3\u30b9\u306e\u7a2e\u985e -label.guest.cidr=\u30b2\u30b9\u30c8 CIDR -label.guest.end.ip=\u30b2\u30b9\u30c8\u306e\u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9 -label.guest.gateway=\u30b2\u30b9\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.guest.ip.range=\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2 -label.guest.ip=\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9 -label.guest.netmask=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30de\u30b9\u30af -label.guest.network.details=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8a73\u7d30 -label.guest.networks=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.guest.start.ip=\u30b2\u30b9\u30c8\u306e\u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9 -label.guest.traffic=\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af -label.guest.traffic.vswitch.name=\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u540d -label.guest.traffic.vswitch.type=\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u306e\u7a2e\u985e -label.guest.type=\u30b2\u30b9\u30c8\u306e\u7a2e\u985e -label.guest=\u30b2\u30b9\u30c8 -label.ha.enabled=\u9ad8\u53ef\u7528\u6027\u6709\u52b9 -label.health.check.advanced.options=\u62e1\u5f35\u30aa\u30d7\u30b7\u30e7\u30f3\: -label.health.check.configurations.options=\u8a2d\u5b9a\u30aa\u30d7\u30b7\u30e7\u30f3\: -label.health.check.interval.in.sec=\u30d8\u30eb\u30b9 \u30c1\u30a7\u30c3\u30af\u9593\u9694 (\u79d2) -label.health.check.message.desc=\u30ed\u30fc\u30c9\u30d0\u30e9\u30f3\u30b5\u30fc\u306f\u81ea\u52d5\u7684\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u3092\u884c\u3044\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3078\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306f\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af\u304c\u3055\u308c\u307e\u305b\u3093 -label.health.check=\u30d8\u30eb\u30b9 \u30c1\u30a7\u30c3\u30af -label.health.check.wizard=\u30d8\u30eb\u30b9\u30c1\u30a7\u30c3\u30af \u30a6\u30a3\u30b6\u30fc\u30c9 -label.healthy.threshold=\u6b63\u5e38\u3057\u304d\u3044\u5024 -label.help=\u30d8\u30eb\u30d7 -label.hide.ingress.rule=\u53d7\u4fe1\u898f\u5247\u3092\u96a0\u3059 -label.hints=\u30d2\u30f3\u30c8 -label.home=\u30db\u30fc\u30e0 -label.host.MAC=\u30db\u30b9\u30c8\u306e MAC -label.host.name=\u30db\u30b9\u30c8\u540d -label.hosts=\u30db\u30b9\u30c8 -label.host.tags=\u30db\u30b9\u30c8 \u30bf\u30b0 -label.host.tag=\u30db\u30b9\u30c8\u30bf\u30b0 -label.host=\u30db\u30b9\u30c8 -label.hourly=\u6bce\u6642 -label.hvm=HVM -label.hypervisor.capabilities=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306e\u6a5f\u80fd -label.hypervisor.snapshot.reserve=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u4e88\u7d04 -label.hypervisors=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc -label.hypervisor.type=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306e\u7a2e\u985e -label.hypervisor=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc -label.hypervisor.version=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306e\u30d0\u30fc\u30b8\u30e7\u30f3 -label.hyperv.traffic.label=Hyper-V \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=IKE \u6697\u53f7\u5316 -label.IKE.hash=IKE \u30cf\u30c3\u30b7\u30e5 -label.IKE.lifetime=IKE \u6709\u52b9\u671f\u9593 (\u79d2) -label.IKE.policy=IKE \u30dd\u30ea\u30b7\u30fc -label.info=\u60c5\u5831 -label.info.upper=\u60c5\u5831 -label.ingress.rule=\u53d7\u4fe1\u898f\u5247 -label.initiated.by=\u958b\u59cb\u30e6\u30fc\u30b6\u30fc -label.inside.port.profile=\u5185\u90e8\u30dd\u30fc\u30c8 \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb -label.installWizard.addClusterIntro.subtitle=\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u3064\u3044\u3066 -label.installWizard.addClusterIntro.title=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046 -label.installWizard.addHostIntro.subtitle=\u30db\u30b9\u30c8\u306b\u3064\u3044\u3066 -label.installWizard.addHostIntro.title=\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046 -label.installWizard.addPodIntro.subtitle=\u30dd\u30c3\u30c9\u306b\u3064\u3044\u3066 -label.installWizard.addPodIntro.title=\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046 -label.installWizard.addPrimaryStorageIntro.subtitle=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u3064\u3044\u3066 -label.installWizard.addPrimaryStorageIntro.title=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046 -label.installWizard.addSecondaryStorageIntro.subtitle=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u3064\u3044\u3066 -label.installWizard.addSecondaryStorageIntro.title=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046 -label.installWizard.addZoneIntro.subtitle=\u30be\u30fc\u30f3\u306b\u3064\u3044\u3066 -label.installWizard.addZoneIntro.title=\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3057\u307e\u3057\u3087\u3046 -label.installWizard.addZone.title=\u30be\u30fc\u30f3\u306e\u8ffd\u52a0 -label.installWizard.click.launch=[\u8d77\u52d5] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -label.installWizard.subtitle=\u3053\u306e\u30ac\u30a4\u30c9 \u30c4\u30a2\u30fc\u306f CloudStack&\#8482; \u74b0\u5883\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u306b\u5f79\u7acb\u3061\u307e\u3059 -label.installWizard.title=CloudStack&\#8482; \u3078\u3088\u3046\u3053\u305d -label.instance.limits=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u5236\u9650 -label.instance.name=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u540d -label.instance.port=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 \u30dd\u30fc\u30c8 -label.instance.scaled.up=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u9078\u629e\u3057\u305f\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306b\u30b9\u30b1\u30fc\u30eb\u3059\u308b -label.instances=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.instanciate.template.associate.profile.blade=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u4f5c\u6210\u304a\u3088\u3073\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb\u3068\u30d6\u30ec\u30fc\u30c9\u306e\u95a2\u9023\u4ed8\u3051 -label.intermediate.certificate=\u4e2d\u9593\u8a3c\u660e\u66f8 {0} -label.internal.dns.1=\u5185\u90e8 DNS 1 -label.internal.dns.2=\u5185\u90e8 DNS 2 -label.internal.lb.details=\u5185\u90e8 LB \u306e\u8a73\u7d30 -label.internal.lb=\u5185\u90e8 LB -label.internallbvm=InternalLbVm -label.internal.name=\u5185\u90e8\u540d -label.interval.type=\u9593\u9694\u306e\u7a2e\u985e -label.introduction.to.cloudstack=CloudStack&\#8482; \u306e\u7d39\u4ecb -label.invalid.integer=\u7121\u52b9\u306a\u6574\u6570 -label.invalid.number=\u7121\u52b9\u306a\u6570 -label.invitations=\u62db\u5f85\u72b6 -label.invited.accounts=\u62db\u5f85\u6e08\u307f\u30a2\u30ab\u30a6\u30f3\u30c8 -label.invite.to=\u62db\u5f85\u3059\u308b\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\: -label.invite=\u62db\u5f85 -label.ip.address=IP \u30a2\u30c9\u30ec\u30b9 -label.ipaddress=IP \u30a2\u30c9\u30ec\u30b9 -label.ip.allocations=IP \u30a2\u30c9\u30ec\u30b9\u306e\u5272\u308a\u5f53\u3066 -label.ip=IP -label.ip.limits=\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u5236\u9650 -label.ip.or.fqdn=IP \u30a2\u30c9\u30ec\u30b9\u307e\u305f\u306f FQDN -label.ip.range=IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2 -label.ip.ranges=IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2 -label.IPsec.preshared.key=IPsec \u4e8b\u524d\u5171\u6709\u30ad\u30fc -label.ips=IP \u30a2\u30c9\u30ec\u30b9 -label.ipv4.cidr=IPv4 CIDR -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.ipv4.end.ip=IPv4 \u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9 -label.ipv4.gateway=IPv4 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.ipv4.netmask=IPv4 \u30cd\u30c3\u30c8\u30de\u30b9\u30af -label.ipv4.start.ip=IPv4 \u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9 -label.ipv6.address=IPv6 IP \u30a2\u30c9\u30ec\u30b9 -label.ipv6.CIDR=IPv6 CIDR -label.ipv6.dns1=IPv6 DNS 1 -label.ipv6.dns2=IPv6 DNS 2 -label.ipv6.end.ip=IPv6 \u7d42\u4e86 IP \u30a2\u30c9\u30ec\u30b9 -label.ipv6.gateway=IPv6 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.ipv6.start.ip=IPv6 \u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9 -label.iscsi=iSCSI -label.is.default=\u30c7\u30d5\u30a9\u30eb\u30c8 -label.iso.boot=ISO \u8d77\u52d5 -label.iso=ISO -label.isolated.networks=\u5206\u96e2\u3055\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.isolation.method=\u5206\u96e2\u65b9\u6cd5 -label.isolation.mode=\u5206\u96e2\u30e2\u30fc\u30c9 -label.isolation.uri=\u5206\u96e2 URI -label.is.redundant.router=\u5197\u9577 -label.is.shared=\u5171\u6709 -label.is.system=\u30b7\u30b9\u30c6\u30e0 -label.item.listing=\u9805\u76ee\u4e00\u89a7 -label.japanese.keyboard=\u65e5\u672c\u8a9e\u30ad\u30fc\u30dc\u30fc\u30c9 -label.keep.colon=\u4fdd\u6301\: -label.keep=\u4fdd\u6301 -label.keyboard.language=\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u8a00\u8a9e -label.keyboard.type=\u30ad\u30fc\u30dc\u30fc\u30c9\u306e\u7a2e\u985e -label.key=\u30ad\u30fc -label.kvm.traffic.label=KVM \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb -label.label=\u30e9\u30d9\u30eb -label.lang.arabic=\u30a2\u30e9\u30d3\u30a2\u8a9e -label.lang.brportugese=\u30dd\u30eb\u30c8\u30ac\u30eb\u8a9e (\u30d6\u30e9\u30b8\u30eb) -label.lang.catalan=\u30ab\u30bf\u30eb\u30cb\u30a2\u8a9e -label.lang.chinese=\u7c21\u4f53\u5b57\u4e2d\u56fd\u8a9e -label.lang.dutch=\u30aa\u30e9\u30f3\u30c0\u8a9e (\u30aa\u30e9\u30f3\u30c0) -label.lang.english=\u82f1\u8a9e -label.lang.french=\u30d5\u30e9\u30f3\u30b9\u8a9e -label.lang.german=\u30c9\u30a4\u30c4\u8a9e -label.lang.hungarian=\u30cf\u30f3\u30ac\u30ea\u30fc\u8a9e -label.lang.italian=\u30a4\u30bf\u30ea\u30a2\u8a9e -label.lang.japanese=\u65e5\u672c\u8a9e -label.lang.korean=\u97d3\u56fd\u8a9e -label.lang.norwegian=\u30ce\u30eb\u30a6\u30a7\u30fc\u8a9e -label.lang.polish=\u30dd\u30fc\u30e9\u30f3\u30c9\u8a9e -label.lang.russian=\u30ed\u30b7\u30a2\u8a9e -label.lang.spanish=\u30b9\u30da\u30a4\u30f3\u8a9e -label.last.disconnected=\u6700\u7d42\u5207\u65ad\u65e5\u6642 -label.lastname.lower=\u59d3 -label.last.name=\u59d3 -label.latest.events=\u6700\u65b0\u30a4\u30d9\u30f3\u30c8 -label.launch=\u8d77\u52d5 -label.launch.vm=VM \u306e\u8d77\u52d5 -label.launch.zone=\u30be\u30fc\u30f3\u306e\u8d77\u52d5 -label.lb.algorithm.leastconn=\u6700\u5c0f\u63a5\u7d9a -label.lb.algorithm.roundrobin=\u30e9\u30a6\u30f3\u30c9\u30ed\u30d3\u30f3 -label.lb.algorithm.source=\u9001\u4fe1\u5143 -label.LB.isolation=LB \u5206\u96e2 -label.ldap.configuration=LDAP \u69cb\u6210 -label.ldap.group.name=LDAP \u30b0\u30eb\u30fc\u30d7 -label.ldap.link.type=\u7a2e\u985e -label.ldap.port=LDAP \u30dd\u30fc\u30c8 -label.level=\u30ec\u30d9\u30eb -label.link.domain.to.ldap=\u30c9\u30e1\u30a4\u30f3\u3092 LDAP \u306b\u30ea\u30f3\u30af\u3059\u308b -label.linklocal.ip=\u30ea\u30f3\u30af \u30ed\u30fc\u30ab\u30eb IP \u30a2\u30c9\u30ec\u30b9 -label.load.balancer.type=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u7a2e\u985e -label.load.balancer=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc -label.load.balancing.policies=\u8ca0\u8377\u5206\u6563\u30dd\u30ea\u30b7\u30fc -label.load.balancing=\u8ca0\u8377\u5206\u6563 -label.loading=\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059 -label.local.file=\u30ed\u30fc\u30ab\u30eb\u30d5\u30a1\u30a4\u30eb -label.local.storage.enabled.system.vms=\u30b7\u30b9\u30c6\u30e0 VM \u306b\u5bfe\u3057\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u5316\u3059\u308b -label.local.storage.enabled=\u30e6\u30fc\u30b6\u30fc VM \u306b\u5bfe\u3057\u30ed\u30fc\u30ab\u30eb\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u5316\u3059\u308b -label.local.storage=\u30ed\u30fc\u30ab\u30eb \u30b9\u30c8\u30ec\u30fc\u30b8 -label.local=\u30ed\u30fc\u30ab\u30eb -label.login=\u30ed\u30b0\u30aa\u30f3 -label.logout=\u30ed\u30b0\u30aa\u30d5 -label.lun=LUN -label.LUN.number=LUN \u756a\u53f7 -label.lxc.traffic.label=LXC \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb -label.make.project.owner=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u6240\u6709\u8005\u5316 -label.make.redundant=\u5197\u9577\u5316\u69cb\u6210\u3092\u3068\u308b -label.managed=\u7ba1\u7406\u5bfe\u8c61 -label.management.ips=\u7ba1\u7406 IP \u30a2\u30c9\u30ec\u30b9 -label.management.server=\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc -label.management=\u7ba1\u7406 -label.manage.resources=\u30ea\u30bd\u30fc\u30b9\u306e\u7ba1\u7406 -label.manage=\u7ba1\u7406 -label.max.cpus=\u6700\u5927 CPU \u30b3\u30a2\u6570 -label.max.guest.limit=\u6700\u5927\u30b2\u30b9\u30c8\u5236\u9650 -label.maximum=\u6700\u5927 -label.max.instances=\u6700\u5927\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u6570 -label.max.memory=\u6700\u5927\u30e1\u30e2\u30ea (MiB) -label.max.networks=\u6700\u5927\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6570 -label.max.primary.storage=\u6700\u5927\u30d7\u30e9\u30a4\u30de\u30ea (GiB) -label.max.public.ips=\u6700\u5927\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u6570 -label.max.secondary.storage=\u6700\u5927\u30bb\u30ab\u30f3\u30c0\u30ea (GiB) -label.max.snapshots=\u6700\u5927\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u6570 -label.max.templates=\u6700\u5927\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u6570 -label.max.vms=\u6700\u5927\u30e6\u30fc\u30b6\u30fc VM \u6570 -label.max.volumes=\u6700\u5927\u30dc\u30ea\u30e5\u30fc\u30e0\u6570 -label.max.vpcs=\u6700\u5927 VPC \u6570 -label.may.continue=\u7d9a\u884c\u3067\u304d\u307e\u3059\u3002 -label.md5.checksum=MD5 \u30c1\u30a7\u30c3\u30af\u30b5\u30e0 -label.memory.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30e1\u30e2\u30ea -label.memory.limits=\u30e1\u30e2\u30ea\u5236\u9650 (MiB) -label.memory.mb=\u30e1\u30e2\u30ea (MB) -label.memory.total=\u30e1\u30e2\u30ea\u5408\u8a08 -label.memory=\u30e1\u30e2\u30ea -label.memory.used=\u30e1\u30e2\u30ea\u4f7f\u7528\u91cf -label.menu.accounts=\u30a2\u30ab\u30a6\u30f3\u30c8 -label.menu.alerts=\u30a2\u30e9\u30fc\u30c8 -label.menu.all.accounts=\u3059\u3079\u3066\u306e\u30a2\u30ab\u30a6\u30f3\u30c8 -label.menu.all.instances=\u3059\u3079\u3066\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.menu.community.isos=\u30b3\u30df\u30e5\u30cb\u30c6\u30a3 ISO -label.menu.community.templates=\u30b3\u30df\u30e5\u30cb\u30c6\u30a3 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 -label.menu.configuration=\u69cb\u6210 -label.menu.dashboard=\u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 -label.menu.destroyed.instances=\u7834\u68c4\u3055\u308c\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.menu.disk.offerings=\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.menu.domains=\u30c9\u30e1\u30a4\u30f3 -label.menu.events=\u30a4\u30d9\u30f3\u30c8 -label.menu.featured.isos=\u304a\u3059\u3059\u3081\u306e ISO -label.menu.featured.templates=\u304a\u3059\u3059\u3081\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 -label.menu.global.settings=\u30b0\u30ed\u30fc\u30d0\u30eb\u8a2d\u5b9a -label.menu.infrastructure=\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3 -label.menu.instances=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.menu.ipaddresses=IP \u30a2\u30c9\u30ec\u30b9 -label.menu.isos=ISO -label.menu.my.accounts=\u30de\u30a4 \u30a2\u30ab\u30a6\u30f3\u30c8 -label.menu.my.instances=\u30de\u30a4 \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.menu.my.isos=\u30de\u30a4 ISO -label.menu.my.templates=\u30de\u30a4 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 -label.menu.network.offerings=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.menu.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.menu.physical.resources=\u7269\u7406\u30ea\u30bd\u30fc\u30b9 -label.menu.regions=\u30ea\u30fc\u30b8\u30e7\u30f3 -label.menu.running.instances=\u5b9f\u884c\u4e2d\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.menu.security.groups=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.menu.service.offerings=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.menu.snapshots=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 -label.menu.sshkeypair=SSH \u30ad\u30fc\u30da\u30a2 -label.menu.stopped.instances=\u505c\u6b62\u3055\u308c\u305f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 -label.menu.storage=\u30b9\u30c8\u30ec\u30fc\u30b8 -label.menu.system.service.offerings=\u30b7\u30b9\u30c6\u30e0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.menu.system=\u30b7\u30b9\u30c6\u30e0 -label.menu.system.vms=\u30b7\u30b9\u30c6\u30e0 VM -label.menu.templates=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 -label.menu.virtual.appliances=\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9 -label.menu.virtual.resources=\u4eee\u60f3\u30ea\u30bd\u30fc\u30b9 -label.menu.volumes=\u30dc\u30ea\u30e5\u30fc\u30e0 -label.menu.vpc.offerings=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.metrics.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f -label.metrics.clusters=\u30af\u30e9\u30b9\u30bf\u30fc -label.metrics.cpu.used.avg=\u4f7f\u7528\u4e2d -label.metrics.disk.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f -label.metrics.disk.size=\u30b5\u30a4\u30ba -label.metrics.disk.storagetype=\u7a2e\u985e -label.metrics.disk.used=\u4f7f\u7528\u4e2d -label.metrics.hosts=\u30db\u30b9\u30c8 -label.metrics.memory.used.avg=\u4f7f\u7528\u4e2d -label.metrics.name=\u540d\u524d -label.metrics.scope=\u30b9\u30b3\u30fc\u30d7 -label.metrics.state=\u72b6\u614b -label.metrics.storagepool=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb -label.metrics=\u30e1\u30c8\u30ea\u30c3\u30af\u30b9 -label.migrate.instance.to.host=\u5225\u306e\u30db\u30b9\u30c8\u3078\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c -label.migrate.instance.to.ps=\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3078\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c -label.migrate.instance.to=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c\u5148\: -label.migrate.lb.vm=LB VM \u306e\u79fb\u884c -label.migrate.router.to=\u30eb\u30fc\u30bf\u30fc\u306e\u79fb\u884c\u5148\: -label.migrate.systemvm.to=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u79fb\u884c\u5148\: -label.migrate.to.host=\u30db\u30b9\u30c8\u3078\u79fb\u884c -label.migrate.to.storage=\u30b9\u30c8\u30ec\u30fc\u30b8\u3078\u79fb\u884c -label.migrate.volume.to.primary.storage=\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3078\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u79fb\u884c -label.migrate.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u79fb\u884c -label.minimum=\u6700\u5c0f -label.min.instances=\u6700\u5c0f\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u6570 -label.min.past.the.hr=\u5206(\u6bce\u6642) -label.minute.past.hour=\u5206(\u6bce\u6642) -label.minutes.past.hour=\u5206(\u6bce\u6642) -label.mode=\u30e2\u30fc\u30c9 -label.monday=\u6708\u66dc\u65e5 -label.monthly=\u6bce\u6708 -label.more.templates=\u305d\u306e\u307b\u304b\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 -label.move.down.row=1 \u884c\u4e0b\u306b\u79fb\u52d5 -label.move.to.bottom=\u6700\u4e0b\u4f4d\u306b\u79fb\u52d5 -label.move.to.top=\u6700\u4e0a\u4f4d\u306b\u79fb\u52d5 -label.move.up.row=1 \u884c\u4e0a\u306b\u79fb\u52d5 -label.my.account=\u30de\u30a4 \u30a2\u30ab\u30a6\u30f3\u30c8 -label.my.network=\u30de\u30a4 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.my.templates=\u30de\u30a4 \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 -label.name.lower=\u540d\u524d -label.name.optional=\u540d\u524d (\u30aa\u30d7\u30b7\u30e7\u30f3) -label.name=\u540d\u524d -label.nat.port.range=NAT \u30dd\u30fc\u30c8\u306e\u7bc4\u56f2 -label.na=\u5229\u7528\u4e0d\u53ef -label.netmask=\u30cd\u30c3\u30c8\u30de\u30b9\u30af -label.netscaler.details=NetScaler \u306e\u8a73\u7d30 -label.netScaler=NetScaler -label.network.ACLs=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL -label.network.ACL.total=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL \u5408\u8a08 -label.network.ACL=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ACL -label.network.addVM=VM \u3078\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8ffd\u52a0 -label.network.cidr=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af CIDR -label.network.desc=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8aac\u660e -label.network.details=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8a73\u7d30 -label.network.device.type=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c7\u30d0\u30a4\u30b9\u306e\u7a2e\u985e -label.network.device=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c7\u30d0\u30a4\u30b9 -label.network.domain.text=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c9\u30e1\u30a4\u30f3 -label.network.domain=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c9\u30e1\u30a4\u30f3 -label.network.id=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID -label.networking.and.security=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 -label.network.label.display.for.blank.value=\u30c7\u30d5\u30a9\u30eb\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u4f7f\u7528 -label.network.limits=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5236\u9650 -label.network.name=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d -label.network.offering.details=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30 -label.network.offering.display.text=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u8868\u793a\u30c6\u30ad\u30b9\u30c8 -label.network.offering.id=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 ID -label.network.offering.name=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u540d -label.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.network.rate.megabytes=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u901f\u5ea6 (MB/\u79d2) -label.network.rate=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u901f\u5ea6 (MB/\u79d2) -label.network.read=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u8aad\u307f\u53d6\u308a -label.network.service.providers=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30b5\u30fc\u30d3\u30b9 \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc -label.networks=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.network.type=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u7a2e\u985e -label.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.network.write=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u66f8\u304d\u8fbc\u307f -label.new.password=\u65b0\u3057\u3044\u30d1\u30b9\u30ef\u30fc\u30c9 -label.new.project=\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 -label.new.ssh.key.pair=\u65b0\u3057\u3044 SSH \u30ad\u30fc\u30da\u30a2 -label.new=\u65b0\u898f -label.new.vm=\u65b0\u3057\u3044 VM -label.next=\u6b21\u3078 -label.nexusVswitch=Nexus 1000V -label.nfs=NFS -label.nfs.server=NFS \u30b5\u30fc\u30d0\u30fc -label.nfs.storage=NFS \u30b9\u30c8\u30ec\u30fc\u30b8 -label.nic.adapter.type=NIC \u30a2\u30c0\u30d7\u30bf\u30fc\u306e\u7a2e\u985e -label.nicira.controller.address=\u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc \u30a2\u30c9\u30ec\u30b9 -label.nicira.l3gatewayserviceuuid=L3 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 \u30b5\u30fc\u30d3\u30b9\u306e UUID -label.nicira.nvp.details=Nicira NVP \u306e\u8a73\u7d30 -label.nicira.transportzoneuuid=\u30c8\u30e9\u30f3\u30b9\u30dd\u30fc\u30c8 \u30be\u30fc\u30f3\u306e UUID -label.nics=NIC -label.no.actions=\u5b9f\u884c\u3067\u304d\u308b\u64cd\u4f5c\u306f\u3042\u308a\u307e\u305b\u3093 -label.no.alerts=\u6700\u8fd1\u306e\u30a2\u30e9\u30fc\u30c8\u306f\u3042\u308a\u307e\u305b\u3093 -label.no.data=\u8868\u793a\u3059\u308b\u30c7\u30fc\u30bf\u304c\u3042\u308a\u307e\u305b\u3093 -label.no.errors=\u6700\u8fd1\u306e\u30a8\u30e9\u30fc\u306f\u3042\u308a\u307e\u305b\u3093 -label.no.grouping=(\u30b0\u30eb\u30fc\u30d7\u306a\u3057) -label.no.isos=\u4f7f\u7528\u3067\u304d\u308b ISO \u306f\u3042\u308a\u307e\u305b\u3093 -label.no.items=\u4f7f\u7528\u3067\u304d\u308b\u9805\u76ee\u306f\u3042\u308a\u307e\u305b\u3093 -label.none=\u306a\u3057 -label.no.security.groups=\u4f7f\u7528\u3067\u304d\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u306f\u3042\u308a\u307e\u305b\u3093 -label.not.found=\u898b\u3064\u304b\u308a\u307e\u305b\u3093 -label.no.thanks=\u8a2d\u5b9a\u3057\u306a\u3044 -label.notifications=\u901a\u77e5 -label.no=\u3044\u3044\u3048 -label.number.of.clusters=\u30af\u30e9\u30b9\u30bf\u30fc\u6570 -label.number.of.cpu.sockets=CPU \u30bd\u30b1\u30c3\u30c8\u6570 -label.number.of.hosts=\u30db\u30b9\u30c8\u6570 -label.number.of.pods=\u30dd\u30c3\u30c9\u6570 -label.number.of.system.vms=\u30b7\u30b9\u30c6\u30e0 VM \u6570 -label.number.of.virtual.routers=\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u6570 -label.number.of.zones=\u30be\u30fc\u30f3\u6570 -label.num.cpu.cores=CPU \u30b3\u30a2\u6570 -label.numretries=\u518d\u8a66\u884c\u56de\u6570 -label.ocfs2=OCFS2 -label.offer.ha=\u9ad8\u53ef\u7528\u6027\u3092\u63d0\u4f9b\u3059\u308b -label.of.month=\u6708\u6bce -label.ok=OK -label.opendaylight.controllerdetail=OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u306e\u8a73\u7d30 -label.opendaylight.controller=OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc -label.opendaylight.controllers=OpenDaylight \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc -label.openDaylight=OpenDaylight -label.operator=\u6f14\u7b97\u5b50 -label.optional=\u30aa\u30d7\u30b7\u30e7\u30f3 -label.order=\u9806\u5e8f -label.os.preference=OS \u57fa\u672c\u8a2d\u5b9a -label.os.type=OS \u306e\u7a2e\u985e -label.other=\u305d\u306e\u307b\u304b -label.outofbandmanagement.action=\u64cd\u4f5c -label.outofbandmanagement.password=\u30d1\u30b9\u30ef\u30fc\u30c9 -label.outofbandmanagement.port=\u30dd\u30fc\u30c8 -label.outofbandmanagement.username=\u30e6\u30fc\u30b6\u30fc\u540d -label.override.guest.traffic=\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b -label.override.public.traffic=\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30aa\u30fc\u30d0\u30fc\u30e9\u30a4\u30c9\u3059\u308b -label.ovm3.cluster=\u30cd\u30a4\u30c6\u30a3\u30d6\u30af\u30e9\u30b9\u30bf\u30fc -label.ovm3.pool=\u30cd\u30a4\u30c6\u30a3\u30d6\u30d7\u30fc\u30eb -label.ovm3.vip=\u30de\u30b9\u30bf\u30fc VIP IP -label.ovm.traffic.label=OVM \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb -label.ovs=OVS -label.owned.public.ips=\u6240\u6709\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9 -label.owner.account=\u6240\u6709\u8005\u30a2\u30ab\u30a6\u30f3\u30c8 -label.owner.domain=\u6240\u6709\u8005\u30c9\u30e1\u30a4\u30f3 -label.palo.alto.details=Palo Alto \u306e\u8a73\u7d30 -label.PA.log.profile=Palo Alto \u30ed\u30b0 \u30d7\u30ed\u30d5\u30a1\u30a4\u30eb -label.PA=Palo Alto -label.parent.domain=\u89aa\u30c9\u30e1\u30a4\u30f3 -label.passive=\u30d1\u30c3\u30b7\u30d6 -label.password.enabled=\u30d1\u30b9\u30ef\u30fc\u30c9\u7ba1\u7406\u6709\u52b9 -label.password.lower=\u30d1\u30b9\u30ef\u30fc\u30c9 -label.password.reset.confirm=\u6b21\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\: -label.password=\u30d1\u30b9\u30ef\u30fc\u30c9 -label.PA.threat.profile=Palo Alto \u8105\u5a01\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb -label.path=\u30d1\u30b9 -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.persistent=\u6c38\u7d9a -label.physical.network.ID=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af ID -label.physical.network.name=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u540d -label.physical.network=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.PING.CIFS.password=PING CIFS \u30d1\u30b9\u30ef\u30fc\u30c9 -label.PING.CIFS.username=PING CIFS \u30e6\u30fc\u30b6\u30fc\u540d -label.PING.dir=PING \u30c7\u30a3\u30ec\u30af\u30c8\u30ea -label.ping.path=Ping \u30d1\u30b9 -label.PING.storage.IP=PING \u5bfe\u8c61\u306e\u30b9\u30c8\u30ec\u30fc\u30b8 IP \u30a2\u30c9\u30ec\u30b9 -label.planner.mode=\u30d7\u30e9\u30f3\u30ca\u30fc \u30e2\u30fc\u30c9 -label.please.complete.the.following.fields=\u4e0b\u8a18\u9805\u76ee\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 -label.please.specify.netscaler.info=NetScaler \u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044 -label.please.wait=\u304a\u5f85\u3061\u304f\u3060\u3055\u3044 -label.plugin.details=\u30d7\u30e9\u30b0\u30a4\u30f3\u306e\u8a73\u7d30 -label.plugins=\u30d7\u30e9\u30b0\u30a4\u30f3 -label.pod.dedicated=\u30dd\u30c3\u30c9\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f -label.pod.name=\u30dd\u30c3\u30c9\u540d -label.pods=\u30dd\u30c3\u30c9 -label.pod=\u30dd\u30c3\u30c9 -label.polling.interval.sec=\u30dd\u30fc\u30ea\u30f3\u30b0\u9593\u9694 (\u79d2) -label.portable.ip.range.details=\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u8a73\u7d30 -label.portable.ip.ranges=\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2 -label.portable.ips=\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9 -label.portable.ip=\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9 -label.port.forwarding.policies=\u30dd\u30fc\u30c8\u8ee2\u9001\u30dd\u30ea\u30b7\u30fc -label.port.forwarding=\u30dd\u30fc\u30c8\u8ee2\u9001 -label.port.range=\u30dd\u30fc\u30c8\u306e\u7bc4\u56f2 -label.port=\u30dd\u30fc\u30c8 -label.PreSetup=PreSetup -label.previous=\u623b\u308b -label.prev=\u623b\u308b -label.primary.allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 -label.primary.network=\u30d7\u30e9\u30a4\u30de\u30ea \u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.primary.storage.count=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb -label.primary.storage.limits=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u5236\u9650 (GiB) -label.primary.storage=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 -label.primary.used=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u4f7f\u7528\u91cf -label.private.Gateway=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.private.interface=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9 -label.private.ip.range=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2 -label.private.ips=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9 -label.private.ip=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9 -label.privatekey=PKCS\#8 \u79d8\u5bc6\u30ad\u30fc -label.private.key=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30ad\u30fc -label.private.network=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.private.port=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30dd\u30fc\u30c8 -label.private.zone=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30be\u30fc\u30f3 -label.profile=\u30d7\u30ed\u30d5\u30a1\u30a4\u30eb -label.project.dashboard=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30c0\u30c3\u30b7\u30e5\u30dc\u30fc\u30c9 -label.project.id=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 ID -label.project.invite=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u62db\u5f85 -label.project.name=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u540d -label.projects=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 -label.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 -label.project.view=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d3\u30e5\u30fc -label.protocol.number=\u30d7\u30ed\u30c8\u30b3\u30eb\u756a\u53f7 -label.protocol=\u30d7\u30ed\u30c8\u30b3\u30eb -label.providers=\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc -label.provider=\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc -label.public.interface=\u30d1\u30d6\u30ea\u30c3\u30af \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9 -label.public.ips=\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9 -label.public.ip=\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9 -label.public.key=\u516c\u958b\u9375 -label.public.lb=\u30d1\u30d6\u30ea\u30c3\u30af LB -label.public.load.balancer.provider=\u30d1\u30d6\u30ea\u30c3\u30af \u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc -label.public.network=\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.public.port=\u30d1\u30d6\u30ea\u30c3\u30af \u30dd\u30fc\u30c8 -label.public.traffic=\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af -label.public.traffic.vswitch.name=\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u540d -label.public.traffic.vswitch.type=\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e vSwitch \u306e\u7a2e\u985e -label.public=\u30d1\u30d6\u30ea\u30c3\u30af -label.public.zone=\u30d1\u30d6\u30ea\u30c3\u30af \u30be\u30fc\u30f3 -label.purpose=\u76ee\u7684 -label.Pxe.server.type=PXE \u30b5\u30fc\u30d0\u30fc\u306e\u7a2e\u985e -label.qos.type=QoS \u306e\u7a2e\u985e -label.quickview=\u30af\u30a4\u30c3\u30af\u30d3\u30e5\u30fc -label.quiesce.vm=VM \u3092\u4f11\u6b62\u3059\u308b -label.quiet.time.sec=\u5f85\u3061\u6642\u9593 (\u79d2) -label.quota.date=\u65e5\u6642 -label.quota.fullsummary=\u3059\u3079\u3066\u306e\u30a2\u30ab\u30a6\u30f3\u30c8 -label.quota.state=\u72b6\u614b -label.rbd.id=Cephx \u30e6\u30fc\u30b6\u30fc -label.rbd.monitor=Ceph \u30e2\u30cb\u30bf\u30fc -label.rbd.pool=Ceph \u30d7\u30fc\u30eb -label.rbd=RBD -label.rbd.secret=Cephx \u30b7\u30fc\u30af\u30ec\u30c3\u30c8 -label.reboot=\u518d\u8d77\u52d5 -label.recent.errors=\u6700\u8fd1\u306e\u30a8\u30e9\u30fc -label.recover.vm=VM \u306e\u5fa9\u5143 -label.redundant.router.capability=\u5197\u9577\u30eb\u30fc\u30bf\u30fc\u6a5f\u80fd -label.redundant.router=\u5197\u9577\u30eb\u30fc\u30bf\u30fc -label.redundant.state=\u5197\u9577\u72b6\u614b -label.redundant.vpc=\u5197\u9577 VPC -label.refresh.blades=\u30d6\u30ec\u30fc\u30c9\u306e\u66f4\u65b0 -label.refresh=\u66f4\u65b0 -label.region.details=\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u8a73\u7d30 -label.regionlevelvpc=\u30ea\u30fc\u30b8\u30e7\u30f3\u30ec\u30d9\u30eb\u306e VPC -label.region=\u30ea\u30fc\u30b8\u30e7\u30f3 -label.reinstall.vm=VM \u306e\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb -label.related=\u95a2\u9023 -label.release.account.lowercase=\u30a2\u30ab\u30a6\u30f3\u30c8\u304b\u3089\u89e3\u653e -label.release.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u304b\u3089\u89e3\u653e -label.release.dedicated.cluster=\u5c02\u7528\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u89e3\u653e -label.release.dedicated.host=\u5c02\u7528\u30db\u30b9\u30c8\u306e\u89e3\u653e -label.release.dedicated.pod=\u5c02\u7528\u30dd\u30c3\u30c9\u306e\u89e3\u653e -label.release.dedicated.vlan.range=\u5c02\u7528 VLAN \u306e\u7bc4\u56f2\u306e\u89e3\u653e -label.release.dedicated.zone=\u5c02\u7528\u30be\u30fc\u30f3\u306e\u89e3\u653e -label.remind.later=\u30a2\u30e9\u30fc\u30e0\u3092\u8868\u793a\u3059\u308b -label.remove.ACL=ACL \u306e\u524a\u9664 -label.remove.egress.rule=\u9001\u4fe1\u898f\u5247\u306e\u524a\u9664 -label.remove.from.load.balancer=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u304b\u3089\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059 -label.remove.ingress.rule=\u53d7\u4fe1\u898f\u5247\u306e\u524a\u9664 -label.remove.ip.range=IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u524a\u9664 -label.remove.ldap=LDAP \u306e\u524a\u9664 -label.remove.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664 -label.remove.pf=\u30dd\u30fc\u30c8\u8ee2\u9001\u898f\u5247\u306e\u524a\u9664 -label.remove.project.account=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304b\u3089\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u524a\u9664 -label.remove.region=\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u524a\u9664 -label.remove.rule=\u898f\u5247\u306e\u524a\u9664 -label.remove.ssh.key.pair=SSH \u30ad\u30fc\u30da\u30a2\u306e\u524a\u9664 -label.remove.static.nat.rule=\u9759\u7684 NAT \u898f\u5247\u306e\u524a\u9664 -label.remove.static.route=\u9759\u7684\u30eb\u30fc\u30c8\u306e\u524a\u9664 -label.remove.this.physical.network=\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3059\u308b -label.remove.tier=\u968e\u5c64\u306e\u524a\u9664 -label.remove.vm.from.lb=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u304b\u3089\u306e VM \u306e\u524a\u9664 -label.remove.vm.load.balancer=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u304b\u3089\u306e VM \u306e\u524a\u9664 -label.remove.vmware.datacenter=VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306e\u524a\u9664 -label.remove.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u524a\u9664 -label.remove.vpc=VPC \u306e\u524a\u9664 -label.removing=\u524a\u9664\u3057\u3066\u3044\u307e\u3059 -label.removing.user=\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3057\u3066\u3044\u307e\u3059 -label.reource.id=\u30ea\u30bd\u30fc\u30b9 ID -label.replace.acl=ACL \u306e\u7f6e\u304d\u63db\u3048 -label.replace.acl.list=ACL \u4e00\u89a7\u306e\u7f6e\u304d\u63db\u3048 -label.required=\u5fc5\u9808\u3067\u3059 -label.requires.upgrade=\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u304c\u5fc5\u8981 -label.reserved.ip.range=\u4e88\u7d04\u6e08\u307f IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2 -label.reserved.system.gateway=\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.reserved.system.ip=\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9 -label.reserved.system.netmask=\u4e88\u7d04\u6e08\u307f\u30b7\u30b9\u30c6\u30e0 \u30cd\u30c3\u30c8\u30de\u30b9\u30af -label.reset.ssh.key.pair.on.vm=VM \u4e0a\u306e SSH \u30ad\u30fc\u30da\u30a2\u3092\u30ea\u30bb\u30c3\u30c8 -label.reset.ssh.key.pair=SSH \u30ad\u30fc\u30da\u30a2\u306e\u30ea\u30bb\u30c3\u30c8 -label.resetVM=VM \u306e\u30ea\u30bb\u30c3\u30c8 -label.reset.VPN.connection=VPN \u63a5\u7d9a\u306e\u30ea\u30bb\u30c3\u30c8 -label.resize.new.offering.id=\u65b0\u3057\u3044\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.resize.new.size=\u65b0\u3057\u3044\u30b5\u30a4\u30ba(GB) -label.resize.shrink.ok=\u7e2e\u5c0f\u53ef\u80fd\u306b\u3059\u308b -label.resource.limit.exceeded=\u30ea\u30bd\u30fc\u30b9\u5236\u9650\u3092\u8d85\u904e\u3057\u307e\u3057\u305f -label.resource.limits=\u30ea\u30bd\u30fc\u30b9\u5236\u9650 -label.resource.name=\u30ea\u30bd\u30fc\u30b9\u540d -label.resource.state=\u30ea\u30bd\u30fc\u30b9\u306e\u72b6\u614b -label.resources=\u30ea\u30bd\u30fc\u30b9 -label.resource=\u30ea\u30bd\u30fc\u30b9 -label.response.timeout.in.sec=\u5fdc\u7b54\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 (\u79d2) -label.restart.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u518d\u8d77\u52d5 -label.restart.required=\u518d\u8d77\u52d5\u304c\u5fc5\u8981 -label.restart.vpc=VPC \u306e\u518d\u8d77\u52d5 -label.restore=\u5fa9\u5143 -label.retry.interval=\u518d\u8a66\u884c\u9593\u9694 -label.review=\u78ba\u8a8d -label.revoke.project.invite=\u62db\u5f85\u306e\u53d6\u308a\u6d88\u3057 -label.roles=\u30ed\u30fc\u30eb -label.role=\u5f79\u5272 -label.root.certificate=\u30eb\u30fc\u30c8\u8a3c\u660e\u66f8 -label.root.disk.controller=\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc -label.root.disk.offering=\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.router.vm.scaled.up=\u30eb\u30fc\u30bf\u30fc VM \u306e\u30b5\u30a4\u30ba\u304c\u62e1\u5927\u3055\u308c\u307e\u3057\u305f -label.routing.host=\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0 \u30db\u30b9\u30c8 -label.routing=\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0 -label.rule.number=\u898f\u5247\u756a\u53f7 -label.rules=\u898f\u5247 -label.running.vms=\u5b9f\u884c\u4e2d\u306e VM -label.s3.access_key=\u30a2\u30af\u30bb\u30b9 \u30ad\u30fc -label.s3.bucket=\u30d0\u30b1\u30c3\u30c8 -label.s3.connection_timeout=\u63a5\u7d9a\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 -label.s3.endpoint=\u30a8\u30f3\u30c9\u30dd\u30a4\u30f3\u30c8 -label.s3.max_error_retry=\u6700\u5927\u30a8\u30e9\u30fc\u518d\u8a66\u884c\u6570 -label.s3.nfs.path=S3 NFS \u30d1\u30b9 -label.s3.nfs.server=S3 NFS \u30b5\u30fc\u30d0\u30fc -label.s3.secret_key=\u79d8\u5bc6\u30ad\u30fc -label.s3.socket_timeout=\u30bd\u30b1\u30c3\u30c8 \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 -label.s3.use_https=HTTPS \u3092\u4f7f\u7528\u3059\u308b -label.saml.enable=SAML SSO \u8a8d\u8a3c -label.saml.entity=\u8a8d\u8a3c\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc -label.saturday=\u571f\u66dc\u65e5 -label.save.and.continue=\u4fdd\u5b58\u3057\u3066\u7d9a\u884c -label.save.changes=\u5909\u66f4\u3092\u4fdd\u5b58\u3059\u308b -label.save=\u4fdd\u5b58 -label.saving.processing=\u4fdd\u5b58\u3057\u3066\u3044\u307e\u3059... -label.scaledown.policy=\u30b9\u30b1\u30fc\u30eb\u30c0\u30a6\u30f3 \u30dd\u30ea\u30b7\u30fc -label.scale.up.policy=\u30b5\u30a4\u30ba\u62e1\u5927\u30dd\u30ea\u30b7\u30fc -label.scaleup.policy=\u30b9\u30b1\u30fc\u30eb\u30a2\u30c3\u30d7 \u30dd\u30ea\u30b7\u30fc -label.scope=\u30b9\u30b3\u30fc\u30d7 -label.search=\u691c\u7d22 -label.secondary.ips=\u30bb\u30ab\u30f3\u30c0\u30ea IP -label.secondary.isolated.vlan.id=\u5206\u96e2\u3055\u308c\u305f\u30bb\u30ab\u30f3\u30c0\u30ea VLAN ID -label.secondary.staging.store.details=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u306e\u8a73\u7d30 -label.secondary.staging.store=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2 -label.secondary.storage.count=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb -label.secondary.storage.details=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u8a73\u7d30 -label.secondary.storage.limits=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u5236\u9650 (GiB) -label.secondary.storage=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 -label.secondary.storage.vm=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 VM -label.secondary.used=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u4f7f\u7528\u91cf -label.secret.key=\u79d8\u5bc6\u30ad\u30fc -label.security.group.name=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u540d -label.security.groups.enabled=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u6709\u52b9 -label.security.groups=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.security.group=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 -label.select.a.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9078\u629e -label.select.a.zone=\u30be\u30fc\u30f3\u306e\u9078\u629e -label.select.instance.to.attach.volume.to=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3059\u308b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 -label.select.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u9078\u629e -label.select.iso.or.template=ISO \u307e\u305f\u306f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9078\u629e -label.select.offering=\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u9078\u629e -label.select.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u9078\u629e -label.select.region=\u30ea\u30fc\u30b8\u30e7\u30f3\u306e\u9078\u629e -label.select.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9078\u629e -label.select.tier=\u968e\u5c64\u306e\u9078\u629e -label.select=\u9078\u629e -label.select-view=\u30d3\u30e5\u30fc\u306e\u9078\u629e -label.select.vm.for.static.nat=\u9759\u7684 NAT \u7528 VM \u306e\u9078\u629e -label.sent=\u9001\u4fe1\u6e08\u307f -label.server=\u30b5\u30fc\u30d0\u30fc -label.service.capabilities=\u30b5\u30fc\u30d3\u30b9\u306e\u6a5f\u80fd -label.service.offering.details=\u30b5\u30fc\u30d3\u30b9\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30 -label.service.offering=\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.service.state=\u30b5\u30fc\u30d3\u30b9\u306e\u72b6\u614b -label.services=\u30b5\u30fc\u30d3\u30b9 -label.session.expired=\u30bb\u30c3\u30b7\u30e7\u30f3\u306e\u6709\u52b9\u671f\u9650\u304c\u5207\u308c\u307e\u3057\u305f -label.set.default.NIC=\u30c7\u30d5\u30a9\u30eb\u30c8 NIC \u306e\u8a2d\u5b9a -label.settings=\u8a2d\u5b9a -label.setup.network=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u8a2d\u5b9a\u3059\u308b -label.setup=\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7 -label.set.up.zone.type=\u30be\u30fc\u30f3\u306e\u7a2e\u985e\u306e\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7 -label.setup.zone=\u30be\u30fc\u30f3\u3092\u8a2d\u5b9a\u3059\u308b -label.SharedMountPoint=SharedMountPoint -label.shared=\u5171\u6709 -label.show.advanced.settings=\u8a73\u7d30\u8a2d\u5b9a\u306e\u8868\u793a -label.show.ingress.rule=\u53d7\u4fe1\u898f\u5247\u306e\u8868\u793a -label.shutdown.provider=\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u306e\u30b7\u30e3\u30c3\u30c8\u30c0\u30a6\u30f3 -label.simplified.chinese.keyboard=\u7c21\u6613\u4e2d\u56fd\u8a9e\u30ad\u30fc\u30dc\u30fc\u30c9 -label.site.to.site.VPN=\u30b5\u30a4\u30c8\u9593 VPN -label.size=\u30b5\u30a4\u30ba -label.skip.guide=CloudStack \u3092\u4f7f\u7528\u3057\u305f\u3053\u3068\u304c\u3042\u308b\u306e\u3067\u3001\u3053\u306e\u30ac\u30a4\u30c9\u3092\u30b9\u30ad\u30c3\u30d7\u3059\u308b -label.smb.domain=SMB \u30c9\u30e1\u30a4\u30f3 -label.smb.password=SMB \u30d1\u30b9\u30ef\u30fc\u30c9 -label.smb.username=SMB \u30e6\u30fc\u30b6\u30fc\u540d -label.snapshot.limits=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u5236\u9650 -label.snapshot.name=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u540d -label.snapshot.schedule=\u9023\u7d9a\u3057\u305f\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u8a2d\u5b9a\u3059\u308b -label.snapshot.s=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 -label.snapshots=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 -label.snapshot=\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 -label.SNMP.community=SNMP \u30b3\u30df\u30e5\u30cb\u30c6\u30a3 -label.SNMP.port=SNMP \u30dd\u30fc\u30c8 -label.sockets=CPU \u30bd\u30b1\u30c3\u30c8 -label.source.ip.address=\u9001\u4fe1\u5143 IP \u30a2\u30c9\u30ec\u30b9 -label.source.nat.supported=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u9001\u4fe1\u5143 NAT -label.source.nat=\u9001\u4fe1\u5143 NAT -label.source.port=\u9001\u4fe1\u5143\u30dd\u30fc\u30c8 -label.specify.IP.ranges=IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306e\u6307\u5b9a -label.specify.vlan=VLAN \u3092\u6307\u5b9a\u3059\u308b -label.specify.vxlan=VXLAN \u3092\u6307\u5b9a\u3059\u308b -label.SR.name=SR \u540d\u30e9\u30d9\u30eb -label.srx.details=SRX \u306e\u8a73\u7d30 -label.srx=SRX -label.ssh.key.pair.details=SSH \u30ad\u30fc\u30da\u30a2\u306e\u8a73\u7d30 -label.ssh.key.pair=SSH \u30ad\u30fc\u30da\u30a2 -label.ssh.key.pairs=SSH \u30ad\u30fc\u30da\u30a2 -label.standard.us.keyboard=\u6a19\u6e96(US) \u30ad\u30fc\u30dc\u30fc\u30c9 -label.start.IP=\u958b\u59cb IP \u30a2\u30c9\u30ec\u30b9 -label.start.lb.vm=LB VM \u306e\u8d77\u52d5 -label.start.port=\u958b\u59cb\u30dd\u30fc\u30c8 -label.start.reserved.system.IP=\u4e88\u7d04\u6e08\u307f\u958b\u59cb\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9 -label.start.vlan=\u958b\u59cb VLAN -label.start.vxlan=\u958b\u59cb VXLAN -label.state=\u72b6\u614b -label.static.nat.enabled=\u9759\u7684 NAT \u6709\u52b9 -label.static.nat.to=\u9759\u7684 NAT \u306e\u8a2d\u5b9a\u5148\: -label.static.nat=\u9759\u7684 NAT -label.static.nat.vm.details=\u9759\u7684 NAT VM \u306e\u8a73\u7d30 -label.static.routes=\u9759\u7684\u30eb\u30fc\u30c8 -label.statistics=\u7d71\u8a08 -label.status=\u72b6\u6cc1 -label.step.1.title=\u624b\u9806 1\: \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u9078\u629e -label.step.1=\u624b\u9806 1 -label.step.2.title=\u624b\u9806 2\: \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.step.2=\u624b\u9806 2 -label.step.3.title=\u624b\u9806 3\: \u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u9078\u629e -label.step.3=\u624b\u9806 3 -label.step.4.title=\u624b\u9806 4\: \u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.step.4=\u624b\u9806 4 -label.step.5.title=\u624b\u9806 5\: \u78ba\u8a8d -label.step.5=\u624b\u9806 5 -label.stickiness.method=\u6301\u7d9a\u6027\u65b9\u6cd5 -label.stickiness=\u6301\u7d9a\u6027 -label.sticky.cookie-name=Cookie \u540d -label.sticky.domain=\u30c9\u30e1\u30a4\u30f3 -label.sticky.expire=\u5931\u52b9 -label.sticky.holdtime=\u4fdd\u6301\u6642\u9593 -label.sticky.indirect=\u9593\u63a5 -label.sticky.length=\u9577\u3055 -label.sticky.mode=\u30e2\u30fc\u30c9 -label.sticky.name=\u30b9\u30c6\u30a3\u30c3\u30ad\u30fc\u540d -label.sticky.nocache=\u30ad\u30e3\u30c3\u30b7\u30e5\u306a\u3057 -label.sticky.postonly=\u30dd\u30b9\u30c8\u306e\u307f -label.sticky.prefix=\u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9 -label.sticky.request-learn=\u30e9\u30fc\u30cb\u30f3\u30b0\u306e\u8981\u6c42 -label.sticky.tablesize=\u30c6\u30fc\u30d6\u30eb \u30b5\u30a4\u30ba -label.stop.lb.vm=LB VM \u306e\u505c\u6b62 -label.stopped.vms=\u505c\u6b62\u4e2d\u306e VM -label.stop=\u505c\u6b62 -label.storage.pool=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30d7\u30fc\u30eb -label.storage.tags=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30bf\u30b0 -label.storage.traffic=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af -label.storage.type=\u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u7a2e\u985e -label.storage=\u30b9\u30c8\u30ec\u30fc\u30b8 -label.subdomain.access=\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3 \u30a2\u30af\u30bb\u30b9 -label.submitted.by=[\u9001\u4fe1\u30e6\u30fc\u30b6\u30fc\: ] -label.submit=\u9001\u4fe1 -label.succeeded=\u6210\u529f -label.sunday=\u65e5\u66dc\u65e5 -label.super.cidr.for.guest.networks=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30b9\u30fc\u30d1\u30fc CIDR -label.supported.services=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u30b5\u30fc\u30d3\u30b9 -label.supported.source.NAT.type=\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u9001\u4fe1\u5143 NAT \u306e\u7a2e\u985e -label.supportsstrechedl2subnet=\u30b9\u30c8\u30ec\u30c3\u30c1 L2 \u30b5\u30d6\u30cd\u30c3\u30c8\u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b -label.suspend.project=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4e00\u6642\u505c\u6b62 -label.switch.type=\u30b9\u30a4\u30c3\u30c1\u306e\u7a2e\u985e -label.system.capacity=\u30b7\u30b9\u30c6\u30e0\u306e\u51e6\u7406\u80fd\u529b -label.system.offering.for.router=\u30eb\u30fc\u30bf\u30fc\u7528\u30b7\u30b9\u30c6\u30e0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.system.offering=\u30b7\u30b9\u30c6\u30e0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.system.service.offering.details=\u30b7\u30b9\u30c6\u30e0\u30b5\u30fc\u30d3\u30b9\u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30 -label.system.service.offering=\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.system.vm.details=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u8a73\u7d30 -label.system.vm.scaled.up=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30b5\u30a4\u30ba\u304c\u62e1\u5927\u3055\u308c\u307e\u3057\u305f -label.system.vms=\u30b7\u30b9\u30c6\u30e0 VM -label.system.vm.type=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u7a2e\u985e -label.system.vm=\u30b7\u30b9\u30c6\u30e0 VM -label.system.wide.capacity=\u30b7\u30b9\u30c6\u30e0\u5168\u4f53\u306e\u51e6\u7406\u80fd\u529b -label.tagged=\u30bf\u30b0\u3042\u308a -label.tag.key=\u30bf\u30b0 \u30ad\u30fc -label.tags=\u30bf\u30b0 -label.tag.value=\u30bf\u30b0\u5024 -label.target.iqn=\u30bf\u30fc\u30b2\u30c3\u30c8 IQN -label.task.completed=\u30bf\u30b9\u30af\u304c\u5b8c\u4e86\u3057\u307e\u3057\u305f -label.template.limits=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u5236\u9650 -label.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 -label.TFTP.dir=TFTP \u30c7\u30a3\u30ec\u30af\u30c8\u30ea -label.tftp.root.directory=TFTP \u30eb\u30fc\u30c8 \u30c7\u30a3\u30ec\u30af\u30c8\u30ea -label.theme.default=\u30c7\u30d5\u30a9\u30eb\u30c8 \u30c6\u30fc\u30de -label.theme.grey=\u30ab\u30b9\u30bf\u30e0 - \u30b0\u30ec\u30fc -label.theme.lightblue=\u30ab\u30b9\u30bf\u30e0 - \u30e9\u30a4\u30c8 \u30d6\u30eb\u30fc -label.threshold=\u3057\u304d\u3044\u5024 -label.thursday=\u6728\u66dc\u65e5 -label.tier.details=\u968e\u5c64\u306e\u8a73\u7d30 -label.tier=\u968e\u5c64 -label.time.colon=\u6642\u9593\: -label.timeout.in.second = \u30bf\u30a4\u30e0\u30a2\u30a6\u30c8\u5024(\u79d2) -label.timeout=\u30bf\u30a4\u30e0\u30a2\u30a6\u30c8 -label.time=\u6642\u9593 -label.timezone.colon=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3\: -label.time.zone=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3 -label.timezone=\u30bf\u30a4\u30e0\u30be\u30fc\u30f3 -label.token=\u30c8\u30fc\u30af\u30f3 -label.total.cpu=CPU \u5408\u8a08 -label.total.CPU=CPU \u5408\u8a08 -label.total.hosts=\u30db\u30b9\u30c8\u5408\u8a08 -label.total.memory=\u30e1\u30e2\u30ea\u5408\u8a08 -label.total.of.ip=\u5168 IP \u30a2\u30c9\u30ec\u30b9\u6570 -label.total.of.vm=VM \u5408\u8a08 -label.total.storage=\u30b9\u30c8\u30ec\u30fc\u30b8\u5408\u8a08 -label.total.virtual.routers=\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u5408\u8a08 -label.total.virtual.routers.upgrade=\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u304c\u5fc5\u8981\u306a\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u5408\u8a08 -label.total.vms=VM \u5408\u8a08 -label.traffic.label=\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb -label.traffic.types=\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e -label.traffic.type=\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e -label.tuesday=\u706b\u66dc\u65e5 -label.type.id=\u7a2e\u985e ID -label.type.lower=\u7a2e\u985e -label.type=\u7a2e\u985e -label.ucs=UCS -label.uk.keyboard=UK \u30ad\u30fc\u30dc\u30fc\u30c9 -label.unavailable=\u4f7f\u7528\u4e0d\u80fd -label.unhealthy.threshold=\u7570\u5e38\u3057\u304d\u3044\u5024 -label.unlimited=\u7121\u5236\u9650 -label.untagged=\u30bf\u30b0\u306a\u3057 -label.update.project.resources=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30ea\u30bd\u30fc\u30b9\u306e\u66f4\u65b0 -label.update.ssl.cert= SSL \u8a3c\u660e\u66f8 -label.update.ssl= SSL \u8a3c\u660e\u66f8 -label.updating=\u66f4\u65b0\u3057\u3066\u3044\u307e\u3059 -label.upgrade.required=\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u304c\u5fc5\u8981\u3067\u3059 -label.upgrade.router.newer.template=\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3059\u308b -label.upload.from.local=\u30ed\u30fc\u30ab\u30eb\u304b\u3089\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 -label.upload.template.from.local=\u30ed\u30fc\u30ab\u30eb\u304b\u3089\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 -label.upload=\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 -label.upload.volume.from.local=\u30ed\u30fc\u30ab\u30eb\u304b\u3089\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 -label.upload.volume.from.url=URL \u304b\u3089\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 -label.upload.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 -label.url=URL -label.usage.interface=\u4f7f\u7528\u72b6\u6cc1\u6e2c\u5b9a\u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9 -label.usage.sanity.result=\u4f7f\u7528\u72b6\u6cc1\u30b5\u30cb\u30c6\u30a3\u7d50\u679c -label.usage.server=\u4f7f\u7528\u72b6\u6cc1\u6e2c\u5b9a\u30b5\u30fc\u30d0\u30fc -label.used=\u4f7f\u7528\u4e2d -label.user.data=\u30e6\u30fc\u30b6\u30fc \u30c7\u30fc\u30bf -label.user.details=\u30e6\u30fc\u30b6\u30fc\u306e\u8a73\u7d30 -label.username.lower=\u30e6\u30fc\u30b6\u30fc\u540d -label.username=\u30e6\u30fc\u30b6\u30fc\u540d -label.users=\u30e6\u30fc\u30b6\u30fc -label.user=\u30e6\u30fc\u30b6\u30fc -label.user.vm=\u30e6\u30fc\u30b6\u30fc VM -label.use.vm.ips=\u6b21\u306e VM IP \u30a2\u30c9\u30ec\u30b9\u3092\u4f7f\u7528 -label.use.vm.ip=\u6b21\u306e VM IP \u30a2\u30c9\u30ec\u30b9\u3092\u4f7f\u7528\: -label.value=\u5024 -label.vcdcname=vCenter DC \u540d -label.vcenter.cluster=vCenter \u30af\u30e9\u30b9\u30bf\u30fc -label.vcenter.datacenter=vCenter \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc -label.vcenter.datastore=vCenter \u30c7\u30fc\u30bf\u30b9\u30c8\u30a2 -label.vcenter.host=vCenter \u30db\u30b9\u30c8 -label.vcenter.password=vCenter \u30d1\u30b9\u30ef\u30fc\u30c9 -label.vcenter.username=vCenter \u30e6\u30fc\u30b6\u30fc\u540d -label.vcenter=vCenter -label.vcipaddress=vCenter IP \u30a2\u30c9\u30ec\u30b9 -label.version=\u30d0\u30fc\u30b8\u30e7\u30f3 -label.vgpu.max.resolution=\u6700\u5927\u89e3\u50cf\u5ea6 -label.vgpu.max.vgpu.per.gpu=GPU \u3042\u305f\u308a\u306e vGPU \u6570 -label.vgpu.remaining.capacity=\u6b8b\u5b58\u51e6\u7406\u80fd\u529b -label.vgpu.type=vGPU \u306e\u7a2e\u985e -label.vgpu=VGPU -label.vgpu.video.ram=\u30d3\u30c7\u30aa RAM -label.view.all=\u3059\u3079\u3066\u8868\u793a -label.view.console=\u30b3\u30f3\u30bd\u30fc\u30eb\u306e\u8868\u793a -label.viewing=\u8868\u793a\u9805\u76ee\: -label.view.more=\u8a73\u7d30\u8868\u793a -label.view.secondary.ips=\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306e\u8868\u793a -label.view=\u8868\u793a - -label.virtual.appliance.details=\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9\u306e\u8a73\u7d30 -label.virtual.appliances=\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9 -label.virtual.appliance=\u4eee\u60f3\u30a2\u30d7\u30e9\u30a4\u30a2\u30f3\u30b9 -label.virtual.machines=\u4eee\u60f3\u30de\u30b7\u30f3 -label.virtual.machine=\u4eee\u60f3\u30de\u30b7\u30f3 -label.virtual.networking=\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.virtual.network=\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af -label.virtual.routers.group.account=\u30a2\u30ab\u30a6\u30f3\u30c8\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7 -label.virtual.routers.group.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7 -label.virtual.routers.group.pod=\u30dd\u30c3\u30c9\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7 -label.virtual.routers.group.zone=\u30be\u30fc\u30f3\u5225\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc \u30b0\u30eb\u30fc\u30d7 -label.virtual.routers=\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc -label.virtual.router=\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc -label.vlan.id=VLAN/VNI ID -label.vlan.only=VLAN -label.vlan.range.details=VLAN \u306e\u7bc4\u56f2\u306e\u8a73\u7d30 -label.vlan.ranges=VLAN \u306e\u7bc4\u56f2 -label.vlan.range=VLAN/VNI \u306e\u7bc4\u56f2 -label.vlan=VLAN -label.vlan.vni.ranges=VLAN/VNI \u306e\u7bc4\u56f2 -label.vlan.vni.range=VLAN/VNI \u306e\u7bc4\u56f2 -label.vm.add=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8ffd\u52a0 -label.vm.destroy=\u7834\u68c4 -label.vm.display.name=VM \u8868\u793a\u540d -label.VMFS.datastore=VMFS \u30c7\u30fc\u30bf\u30b9\u30c8\u30a2 -label.vmfs=VMFS -label.vm.id=VM ID -label.vm.ip=VM IP \u30a2\u30c9\u30ec\u30b9 -label.vm.name=VM \u540d -label.vm.password=VM \u306e\u30d1\u30b9\u30ef\u30fc\u30c9\: -label.vm.reboot=\u518d\u8d77\u52d5 -label.VMs.in.tier=\u968e\u5c64\u5185\u306e VM -label.vmsnapshot.current=\u4f7f\u7528\u4e2d -label.vmsnapshot.memory=\u30e1\u30e2\u30ea\u3082\u542b\u3081\u308b -label.vmsnapshot.parentname=\u89aa -label.vmsnapshot.type=\u7a2e\u985e -label.vmsnapshot=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 -label.vm.start=\u8d77\u52d5 -label.vm.state=VM \u306e\u72b6\u614b -label.vm.stop=\u505c\u6b62 -label.vms=VM -label.vmware.datacenter.id=VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc ID -label.vmware.datacenter.name=VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u540d -label.vmware.datacenter.vcenter=VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306e vCenter -label.vmware.traffic.label=VMware \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb -label.vnet.id=VLAN/VNI ID -label.vnet=VLAN/VNI -label.vnmc.devices=VNMC \u30c7\u30d0\u30a4\u30b9 -label.vnmc=VNMC -label.volatile=\u63ee\u767a\u6027 -label.volgroup=\u30dc\u30ea\u30e5\u30fc\u30e0 \u30b0\u30eb\u30fc\u30d7 -label.volume.details=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u8a73\u7d30 -label.volume.limits=\u30dc\u30ea\u30e5\u30fc\u30e0\u5236\u9650 -label.volume.migrated=\u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u79fb\u884c\u3055\u308c\u307e\u3057\u305f -label.volume.name=\u30dc\u30ea\u30e5\u30fc\u30e0\u540d -label.volumes=\u30dc\u30ea\u30e5\u30fc\u30e0 -label.volume=\u30dc\u30ea\u30e5\u30fc\u30e0 -label.vpc.distributedvpcrouter=\u5206\u6563 VPC \u30eb\u30fc\u30bf\u30fc -label.vpc.id=VPC ID -label.VPC.limits=VPC \u5236\u9650 -label.vpc.offering.details=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u306e\u8a73\u7d30 -label.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0 -label.vpc.router.details=VPC \u30eb\u30fc\u30bf\u30fc\u306e\u8a73\u7d30 -label.VPC.router.details=VPC \u30eb\u30fc\u30bf\u30fc\u306e\u8a73\u7d30 -label.vpc.supportsregionlevelvpc=\u30ea\u30fc\u30b8\u30e7\u30f3\u30ec\u30d9\u30eb\u306e VPC \u3092\u30b5\u30dd\u30fc\u30c8\u3059\u308b -label.vpc.virtual.router=VPC \u4eee\u60f3\u30eb\u30fc\u30bf\u30fc -label.vpc=VPC -label.VPN.connection=VPN \u63a5\u7d9a -label.vpn.customer.gateway=VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.VPN.customer.gateway=VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.VPN.gateway=VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 -label.vpn=VPN -label.vsmctrlvlanid=\u30b3\u30f3\u30c8\u30ed\u30fc\u30eb VLAN ID -label.vsmpktvlanid=\u30d1\u30b1\u30c3\u30c8 VLAN ID -label.vsmstoragevlanid=\u30b9\u30c8\u30ec\u30fc\u30b8 VLAN ID -label.vsphere.managed=vSphere \u306b\u3088\u308b\u7ba1\u7406 -label.vswitch.name=vSwitch \u540d -label.vSwitch.type=vSwitch \u306e\u7a2e\u985e -label.vxlan.id=VXLAN ID -label.vxlan.range=VXLAN \u306e\u7bc4\u56f2 -label.vxlan=VXLAN -label.waiting=\u5f85\u6a5f\u3057\u3066\u3044\u307e\u3059 -label.warning=\u6ce8\u610f -label.warn=\u8b66\u544a -label.warn.upper=\u8b66\u544a -label.wednesday=\u6c34\u66dc\u65e5 -label.weekly=\u6bce\u9031 -label.welcome.cloud.console=\u7ba1\u7406\u30b3\u30f3\u30bd\u30fc\u30eb\u3078\u3088\u3046\u3053\u305d -label.welcome=\u3088\u3046\u3053\u305d -label.what.is.cloudstack=CloudStack&\#8482; \u306b\u3064\u3044\u3066 -label.xenserver.tools.version.61.plus=\u5143\u306e XS \u30d0\u30fc\u30b8\u30e7\u30f3\u306f 6.1 \u4ee5\u964d -label.Xenserver.Tools.Version61plus=\u5143\u306e XS \u30d0\u30fc\u30b8\u30e7\u30f3\u306f 6.1 \u4ee5\u964d -label.xenserver.traffic.label=XenServer \u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb -label.yes=\u306f\u3044 -label.zone.dedicated=\u5c02\u7528\u30be\u30fc\u30f3 -label.zone.details=\u30be\u30fc\u30f3\u306e\u8a73\u7d30 -label.zone.id=\u30be\u30fc\u30f3 ID -label.zone.lower=\u30be\u30fc\u30f3 -label.zone.name=\u30be\u30fc\u30f3\u540d -label.zone.step.1.title=\u624b\u9806 1\: \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u9078\u629e -label.zone.step.2.title=\u624b\u9806 2\: \u30be\u30fc\u30f3\u306e\u8ffd\u52a0 -label.zone.step.3.title=\u624b\u9806 3\: \u30dd\u30c3\u30c9\u306e\u8ffd\u52a0 -label.zone.step.4.title=\u624b\u9806 4\: IP \u30a2\u30c9\u30ec\u30b9\u7bc4\u56f2\u306e\u8ffd\u52a0 -label.zones=\u30be\u30fc\u30f3 -label.zone.type=\u30be\u30fc\u30f3\u306e\u7a2e\u985e -label.zone=\u30be\u30fc\u30f3 -label.zone.wide=\u30be\u30fc\u30f3\u5168\u4f53 -label.zoneWizard.trafficType.guest=\u30b2\u30b9\u30c8\: \u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002 -label.zoneWizard.trafficType.management=\u7ba1\u7406\: \u30db\u30b9\u30c8\u3084 CloudStack \u30b7\u30b9\u30c6\u30e0 VM \u306a\u3069\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3059\u308b CloudStack \u306e\u5185\u90e8\u30ea\u30bd\u30fc\u30b9\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002 -label.zoneWizard.trafficType.public=\u30d1\u30d6\u30ea\u30c3\u30af\: \u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u3068\u30af\u30e9\u30a6\u30c9\u5185\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002 -label.zoneWizard.trafficType.storage=\u30b9\u30c8\u30ec\u30fc\u30b8\: VM \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3084\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306a\u3069\u3001\u30d7\u30e9\u30a4\u30de\u30ea\u304a\u3088\u3073\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002 -managed.state=\u7ba1\u7406\u5bfe\u8c61\u72b6\u614b -message.acquire.ip.nic=\u3053\u306e NIC \u306e\u305f\u3081\u306b\u65b0\u3057\u3044\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?
\u6ce8\: \u65b0\u3057\u304f\u53d6\u5f97\u3057\u305f\u30bb\u30ab\u30f3\u30c0\u30ea IP \u30a2\u30c9\u30ec\u30b9\u306f\u4eee\u60f3\u30de\u30b7\u30f3\u5185\u3067\u624b\u52d5\u3067\u69cb\u6210\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.acquire.new.ip=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.acquire.new.ip.vpc=\u3053\u306e VPC \u306e\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.acquire.public.ip=\u65b0\u3057\u3044 IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3059\u308b\u30be\u30fc\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.action.cancel.maintenance.mode=\u3053\u306e\u4fdd\u5b88\u3092\u30ad\u30e3\u30f3\u30bb\u30eb\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.cancel.maintenance=\u30db\u30b9\u30c8\u306e\u4fdd\u5b88\u306f\u6b63\u5e38\u306b\u30ad\u30e3\u30f3\u30bb\u30eb\u3055\u308c\u307e\u3057\u305f\u3002\u3053\u306e\u51e6\u7406\u306b\u306f\u6570\u5206\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.change.service.warning.for.instance=\u73fe\u5728\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.change.service.warning.for.router=\u73fe\u5728\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30eb\u30fc\u30bf\u30fc\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.delete.cluster=\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.disk.offering=\u3053\u306e\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.domain=\u3053\u306e\u30c9\u30e1\u30a4\u30f3\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.external.firewall=\u3053\u306e\u5916\u90e8\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u8b66\u544a\: \u540c\u3058\u5916\u90e8\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u518d\u5ea6\u8ffd\u52a0\u3059\u308b\u4e88\u5b9a\u3067\u3042\u308b\u5834\u5408\u306f\u3001\u30c7\u30d0\u30a4\u30b9\u306e\u4f7f\u7528\u72b6\u6cc1\u30c7\u30fc\u30bf\u3092\u30ea\u30bb\u30c3\u30c8\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.delete.external.load.balancer=\u3053\u306e\u5916\u90e8\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u8b66\u544a\: \u540c\u3058\u5916\u90e8\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u518d\u5ea6\u8ffd\u52a0\u3059\u308b\u4e88\u5b9a\u3067\u3042\u308b\u5834\u5408\u306f\u3001\u30c7\u30d0\u30a4\u30b9\u306e\u4f7f\u7528\u72b6\u6cc1\u30c7\u30fc\u30bf\u3092\u30ea\u30bb\u30c3\u30c8\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.delete.ingress.rule=\u3053\u306e\u53d7\u4fe1\u898f\u5247\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.ISO.for.all.zones=\u305d\u306e ISO \u306f\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u304b\u3089\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.ISO=\u3053\u306e ISO \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.network=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.nexusVswitch=\u3053\u306e Nexus 1000V \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.nic=\u3053\u306e NIC \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u95a2\u9023\u4ed8\u3051\u3089\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3082 VM \u304b\u3089\u524a\u9664\u3055\u308c\u307e\u3059\u3002 -message.action.delete.physical.network=\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.pod=\u3053\u306e\u30dd\u30c3\u30c9\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.primary.storage=\u3053\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.secondary.storage=\u3053\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.security.group=\u3053\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.service.offering=\u3053\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.snapshot=\u3053\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.system.service.offering=\u3053\u306e\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.template.for.all.zones=\u305d\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u307e\u3059\u3002\u3059\u3079\u3066\u306e\u30be\u30fc\u30f3\u304b\u3089\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.template=\u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.volume=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.delete.zone=\u3053\u306e\u30be\u30fc\u30f3\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.destroy.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.destroy.systemvm=\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.disable.cluster=\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.disable.nexusVswitch=\u3053\u306e Nexus 1000V \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.disable.physical.network=\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.disable.pod=\u3053\u306e\u30dd\u30c3\u30c9\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.disable.static.NAT=\u9759\u7684 NAT \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.disable.zone=\u3053\u306e\u30be\u30fc\u30f3\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.downloading.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3044\u307e\u3059\u3002 -message.action.download.iso=\u3053\u306e ISO \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.download.template=\u3053\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.enable.cluster=\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.enable.maintenance=\u30db\u30b9\u30c8\u3092\u4fdd\u5b88\u3059\u308b\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002\u3053\u306e\u30db\u30b9\u30c8\u4e0a\u306e VM \u6570\u306b\u3088\u3063\u3066\u306f\u3001\u3053\u306e\u51e6\u7406\u306b\u306f\u6570\u5206\u4ee5\u4e0a\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.enable.nexusVswitch=\u3053\u306e Nexus 1000V \u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.enable.physical.network=\u3053\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.enable.pod=\u3053\u306e\u30dd\u30c3\u30c9\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.enable.zone=\u3053\u306e\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.expunge.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u62b9\u6d88\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.force.reconnect=\u30db\u30b9\u30c8\u306f\u5f37\u5236\u7684\u306b\u518d\u63a5\u7d9a\u3057\u307e\u3057\u305f\u3002\u3053\u306e\u51e6\u7406\u306b\u306f\u6570\u5206\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.host.enable.maintenance.mode=\u4fdd\u5b88\u30e2\u30fc\u30c9\u3092\u6709\u52b9\u306b\u3059\u308b\u3068\u3001\u3053\u306e\u30db\u30b9\u30c8\u3067\u5b9f\u884c\u4e2d\u306e\u3059\u3079\u3066\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u307b\u304b\u306e\u4f7f\u7528\u3067\u304d\u308b\u30db\u30b9\u30c8\u306b\u30e9\u30a4\u30d6 \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3055\u308c\u307e\u3059\u3002 -message.action.instance.reset.password=\u3053\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30eb\u30fc\u30c8 \u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.manage.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.primarystorage.enable.maintenance.mode=\u8b66\u544a\: \u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4fdd\u5b88\u30e2\u30fc\u30c9\u306b\u3059\u308b\u3068\u3001\u305d\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u4e0a\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u4f7f\u7528\u3059\u308b\u3059\u3079\u3066\u306e VM \u304c\u505c\u6b62\u3057\u307e\u3059\u3002\u7d9a\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.reboot.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.reboot.router=\u3053\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u3067\u63d0\u4f9b\u3059\u308b\u3059\u3079\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4e2d\u65ad\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.reboot.systemvm=\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.release.ip=\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.remove.host=\u3053\u306e\u30db\u30b9\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.reset.password.off=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306f\u73fe\u5728\u3053\u306e\u6a5f\u80fd\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u3066\u3044\u307e\u305b\u3093\u3002 -message.action.reset.password.warning=\u73fe\u5728\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.action.restore.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.revert.snapshot=\u6240\u6709\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u3053\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u306b\u623b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.start.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.start.router=\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.start.systemvm=\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.stop.instance=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.stop.router=\u3053\u306e\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u3067\u63d0\u4f9b\u3059\u308b\u3059\u3079\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4e2d\u65ad\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.stop.systemvm=\u3053\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.take.snapshot=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.unmanage.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u975e\u7ba1\u7406\u5bfe\u8c61\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.vmsnapshot.delete=\u3053\u306e VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.action.vmsnapshot.revert=VM \u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u5143\u306b\u623b\u3059 -message.activate.project=\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u30a2\u30af\u30c6\u30a3\u30d6\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.add.cluster=\u30be\u30fc\u30f3 \u306e\u30dd\u30c3\u30c9 \u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u7ba1\u7406\u3055\u308c\u308b\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.cluster.zone=\u30be\u30fc\u30f3 \u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u7ba1\u7406\u3055\u308c\u308b\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.disk.offering=\u65b0\u3057\u3044\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.domain=\u3053\u306e\u30c9\u30e1\u30a4\u30f3\u306b\u4f5c\u6210\u3059\u308b\u30b5\u30d6\u30c9\u30e1\u30a4\u30f3\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.added.new.nuage.vsp.controller=\u65b0\u3057\u3044 Nuage VSP \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f -message.added.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3057\u307e\u3057\u305f -message.add.firewall=\u30be\u30fc\u30f3\u306b\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.guest.network=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.add.host=\u65b0\u3057\u3044\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.adding.host=\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -message.adding.Netscaler.device=NetScaler \u30c7\u30d0\u30a4\u30b9\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -message.adding.Netscaler.provider=NetScaler \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059 -message.add.ip.range.direct.network=\u30be\u30fc\u30f3 \u306e\u76f4\u63a5\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.ip.range.to.pod=

\u30dd\u30c3\u30c9 \u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u307e\u3059

-message.add.ip.range=\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.additional.networks.desc=\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u63a5\u7d9a\u3059\u308b\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.load.balancer=\u30be\u30fc\u30f3\u306b\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.load.balancer.under.ip=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u898f\u5247\u304c\u6b21\u306e IP \u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3057\u3066\u8ffd\u52a0\u3055\u308c\u307e\u3057\u305f\: -message.add.network=\u30be\u30fc\u30f3 \u306b\u65b0\u3057\u3044\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.new.gateway.to.vpc=\u3053\u306e VPC \u306b\u65b0\u3057\u3044\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306e\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.pod.during.zone.creation=\u5404\u30be\u30fc\u30f3\u306b\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30dd\u30c3\u30c9\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30dd\u30c3\u30c9\u306f\u30db\u30b9\u30c8\u3068\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059\u304c\u3001\u3053\u308c\u3089\u306f\u5f8c\u306e\u624b\u9806\u3067\u8ffd\u52a0\u3057\u307e\u3059\u3002\u6700\u521d\u306b\u3001CloudStack \u306e\u5185\u90e8\u7ba1\u7406\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u305f\u3081\u306b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u4e88\u7d04\u3057\u307e\u3059\u3002IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u306f\u3001\u30af\u30e9\u30a6\u30c9\u5185\u306e\u5404\u30be\u30fc\u30f3\u3067\u91cd\u8907\u3057\u306a\u3044\u3088\u3046\u306b\u4e88\u7d04\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.add.pod=\u30be\u30fc\u30f3 \u306b\u65b0\u3057\u3044\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.primary.storage=\u30be\u30fc\u30f3 \u306e\u30dd\u30c3\u30c9 \u306b\u65b0\u3057\u3044\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.primary=\u65b0\u3057\u3044\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30d1\u30e9\u30e1\u30fc\u30bf\u30fc\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.region=\u65b0\u3057\u3044\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u5fc5\u8981\u306a\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.secondary.storage=\u30be\u30fc\u30f3 \u306b\u65b0\u3057\u3044\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u8ffd\u52a0\u3057\u307e\u3059 -message.add.service.offering=\u65b0\u3057\u3044\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.system.service.offering=\u65b0\u3057\u3044\u30b7\u30b9\u30c6\u30e0 \u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.template=\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.volume=\u65b0\u3057\u3044\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.add.VPN.gateway=VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.admin.guide.read=VMware \u30d9\u30fc\u30b9\u306e VM \u306b\u3064\u3044\u3066\u306f\u3001\u30b5\u30a4\u30ba\u5909\u66f4\u306e\u524d\u306b\u7ba1\u7406\u8005\u30ac\u30a4\u30c9\u306e\u52d5\u7684\u306a\u30b5\u30a4\u30ba\u5909\u66f4\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u304a\u8aad\u307f\u304f\u3060\u3055\u3044\u3002\u7d9a\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?\\, -message.advanced.mode.desc=VLAN \u30b5\u30dd\u30fc\u30c8\u3092\u6709\u52b9\u306b\u3059\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30e2\u30c7\u30eb\u3067\u306f\u6700\u3082\u67d4\u8edf\u306b\u30ab\u30b9\u30bf\u30e0 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u63d0\u4f9b\u3067\u304d\u3001\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3001VPN\u3001\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u30b5\u30dd\u30fc\u30c8\u306e\u307b\u304b\u306b\u3001\u76f4\u63a5\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3082\u6709\u52b9\u306b\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 -message.advanced.security.group=\u30b2\u30b9\u30c8 VM \u3092\u5206\u96e2\u3059\u308b\u305f\u3081\u306b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.advanced.virtual=\u30b2\u30b9\u30c8 VM \u3092\u5206\u96e2\u3059\u308b\u305f\u3081\u306b\u30be\u30fc\u30f3\u5168\u4f53\u306e VLAN \u3092\u4f7f\u7528\u3059\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.after.enable.s3=S3 \u30d9\u30fc\u30b9\u306e\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u304c\u69cb\u6210\u3055\u308c\u307e\u3057\u305f\u3002\u6ce8\: \u3053\u306e\u30da\u30fc\u30b8\u3092\u9589\u3058\u308b\u3068\u3001S3 \u3092\u518d\u69cb\u6210\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 -message.after.enable.swift=Swift \u304c\u69cb\u6210\u3055\u308c\u307e\u3057\u305f\u3002\u6ce8\: \u3053\u306e\u30da\u30fc\u30b8\u3092\u9589\u3058\u308b\u3068\u3001Swift \u3092\u518d\u69cb\u6210\u3059\u308b\u3053\u3068\u306f\u3067\u304d\u307e\u305b\u3093\u3002 -message.alert.state.detected=\u30a2\u30e9\u30fc\u30c8\u72b6\u614b\u304c\u691c\u51fa\u3055\u308c\u307e\u3057\u305f -message.allow.vpn.access=VPN \u30a2\u30af\u30bb\u30b9\u3092\u8a31\u53ef\u3059\u308b\u30e6\u30fc\u30b6\u30fc\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.apply.snapshot.policy=\u73fe\u5728\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 \u30dd\u30ea\u30b7\u30fc\u3092\u66f4\u65b0\u3057\u307e\u3057\u305f\u3002 -message.attach.iso.confirm=\u3053\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b ISO \u30d5\u30a1\u30a4\u30eb\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.attach.volume=\u65b0\u3057\u3044\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002Windows \u30d9\u30fc\u30b9\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u306b\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30a2\u30bf\u30c3\u30c1\u3059\u308b\u5834\u5408\u306f\u3001\u30a2\u30bf\u30c3\u30c1\u3057\u305f\u30c7\u30a3\u30b9\u30af\u3092\u8a8d\u8b58\u3059\u308b\u305f\u3081\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u518d\u8d77\u52d5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.basic.mode.desc=VLAN \u30b5\u30dd\u30fc\u30c8\u304c\u4e0d\u8981\u3067\u3042\u308b\u5834\u5408\u306f\u3001\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3067\u4f5c\u6210\u3055\u308c\u308b\u3059\u3079\u3066\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304b\u3089\u76f4\u63a5 IP \u30a2\u30c9\u30ec\u30b9\u304c\u5272\u308a\u5f53\u3066\u3089\u308c\u3001\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u4f7f\u7528\u3057\u3066\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3\u3068\u5206\u96e2\u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002 -message.change.offering.confirm=\u3053\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u5909\u66f4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.change.password=\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.cluster.dedicated=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f -message.cluster.dedication.released=\u5c02\u7528\u30af\u30e9\u30b9\u30bf\u30fc\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f -message.configure.all.traffic.types=\u8907\u6570\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304c\u3042\u308a\u307e\u3059\u3002[\u7de8\u96c6] \u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u3054\u3068\u306b\u30e9\u30d9\u30eb\u3092\u69cb\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.configure.firewall.rules.allow.traffic=\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u8a31\u53ef\u3059\u308b\u3088\u3046\u30eb\u30fc\u30eb\u3092\u8a2d\u5b9a\u3059\u308b -message.configure.firewall.rules.block.traffic=\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u30d6\u30ed\u30c3\u30af\u3059\u308b\u3088\u3046\u30eb\u30fc\u30eb\u3092\u8a2d\u5b9a\u3059\u308b -message.configure.ldap=LDAP \u3092\u69cb\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.configuring.guest.traffic=\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059 -message.configuring.physical.networks=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059 -message.configuring.public.traffic=\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059 -message.configuring.storage.traffic=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u3044\u307e\u3059 -message.confirm.action.force.reconnect=\u3053\u306e\u30db\u30b9\u30c8\u3092\u5f37\u5236\u518d\u63a5\u7d9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.add.vnmc.provider=VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.archive.alert=\u3053\u306e\u30a2\u30e9\u30fc\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.archive.event=\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.archive.selected.alerts=\u9078\u629e\u3057\u305f\u30a2\u30e9\u30fc\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.archive.selected.events=\u9078\u629e\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u3092\u30a2\u30fc\u30ab\u30a4\u30d6\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.attach.disk=\u30c7\u30a3\u30b9\u30af\u3092\u30a2\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.create.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.current.guest.CIDR.unchanged=\u73fe\u5728\u306e\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e CIDR \u3092\u5909\u66f4\u305b\u305a\u306b\u7dad\u6301\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.dedicate.cluster.domain.account=\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.dedicate.host.domain.account=\u3053\u306e\u30db\u30b9\u30c8\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.dedicate.pod.domain.account=\u3053\u306e\u30dd\u30c3\u30c9\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.dedicate.zone=\u3053\u306e\u30be\u30fc\u30f3\u3092\u30c9\u30e1\u30a4\u30f3/\u30a2\u30ab\u30a6\u30f3\u30c8\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.acl.list=\u3053\u306e ACL \u4e00\u89a7\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.alert=\u3053\u306e\u30a2\u30e9\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.baremetal.rack.configuration=\u30d9\u30a2\u30e1\u30bf\u30eb\u30e9\u30c3\u30af\u8a2d\u5b9a\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.BigSwitchBcf=\u3053\u306e BigSwitch BCF \u30b3\u30f3\u30c8\u30ed\u30fc\u30e9\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.BrocadeVcs=Brocade VCS \u30b9\u30a4\u30c3\u30c1\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.ciscoASA1000v=Cisco ASA 1000V \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.ciscovnmc.resource=Cisco VNMC \u30ea\u30bd\u30fc\u30b9\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.F5=F5 \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.internal.lb=\u5185\u90e8 LB \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.NetScaler=NetScaler \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.NuageVsp=Nuage Virtualized Services Directory \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.PA=Palo Alto \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.secondary.staging.store=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c6\u30fc\u30b8\u30f3\u30b0 \u30b9\u30c8\u30a2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.SRX=SRX \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.delete.ucs.manager=UCS Manager \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.destroy.router=\u3053\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u7834\u68c4\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.disable.host=\u30db\u30b9\u30c8\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.disable.network.offering=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.disable.provider=\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.disable.vnmc.provider=VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.disable.vpc.offering=\u3053\u306e VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.enable.host=\u30db\u30b9\u30c8\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.enable.network.offering=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.enable.provider=\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.enable.vnmc.provider=VNMC \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.enable.vpc.offering=\u3053\u306e VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.join.project=\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u53c2\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.migrate.volume=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.refresh.blades=\u30d6\u30ec\u30fc\u30c9\u3092\u66f4\u65b0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.release.dedicated.cluster=\u3053\u306e\u5c02\u7528\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.release.dedicated.host=\u3053\u306e\u5c02\u7528\u30db\u30b9\u30c8\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.release.dedicated.pod=\u3053\u306e\u5c02\u7528\u30dd\u30c3\u30c9\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.release.dedicated.zone=\u3053\u306e\u5c02\u7528\u30be\u30fc\u30f3\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.release.dedicate.vlan.range=\u5c02\u7528 VLAN \u306e\u7bc4\u56f2\u3092\u89e3\u653e\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.event=\u3053\u306e\u30a4\u30d9\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.IP.range=\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.load.balancer=\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u304b\u3089 VM \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.network.offering=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.selected.alerts=\u9078\u629e\u3057\u305f\u30a2\u30e9\u30fc\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.selected.events=\u9078\u629e\u3057\u305f\u30a4\u30d9\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.vmware.datacenter=VMware \u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.remove.vpc.offering=\u3053\u306e VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.replace.acl.new.one=ACL \u3092\u65b0\u3057\u3044\u3082\u306e\u3068\u7f6e\u304d\u63db\u3048\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.scale.up.router.vm=\u30eb\u30fc\u30bf\u30fc VM \u306e\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.scale.up.system.vm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.shutdown.provider=\u3053\u306e\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u30b7\u30e3\u30c3\u30c8\u30c0\u30a6\u30f3\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.start.lb.vm=LB VM \u3092\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.stop.lb.vm=LB VM \u3092\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.upgrade.router.newer.template=\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.upgrade.routers.account.newtemplate=\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.upgrade.routers.cluster.newtemplate=\u3053\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.upgrade.routers.newtemplate=\u3053\u306e\u30be\u30fc\u30f3\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.confirm.upgrade.routers.pod.newtemplate=\u3053\u306e\u30dd\u30c3\u30c9\u306e\u3059\u3079\u3066\u306e\u30eb\u30fc\u30bf\u30fc\u3092\u30a2\u30c3\u30d7\u30b0\u30ec\u30fc\u30c9\u3057\u3066\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f7f\u7528\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.copy.iso.confirm=ISO \u3092\u6b21\u306e\u5834\u6240\u306b\u30b3\u30d4\u30fc\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.copy.template.confirm=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.copy.template=\u30be\u30fc\u30f3 \u304b\u3089\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 XXX \u3092\u6b21\u306e\u5834\u6240\u306b\u30b3\u30d4\u30fc\u3057\u307e\u3059\: -message.create.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.create.template.vm=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 \u304b\u3089 VM \u3092\u4f5c\u6210\u3057\u307e\u3059 -message.create.template.volume=\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0 \u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u524d\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u30dc\u30ea\u30e5\u30fc\u30e0 \u30b5\u30a4\u30ba\u306b\u3088\u3063\u3066\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u306b\u306f\u6570\u5206\u4ee5\u4e0a\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 -message.creating.cluster=\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 -message.creating.guest.network=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 -message.creating.physical.networks=\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 -message.creating.pod=\u30dd\u30c3\u30c9\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 -message.creating.primary.storage=\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 -message.creating.secondary.storage=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 -message.creating.systemVM=\u30b7\u30b9\u30c6\u30e0 VM \u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 (\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044) -message.creating.zone=\u30be\u30fc\u30f3\u3092\u4f5c\u6210\u3057\u3066\u3044\u307e\u3059 -message.decline.invitation=\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3078\u306e\u62db\u5f85\u3092\u8f9e\u9000\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.dedicated.zone.released=\u5c02\u7528\u30be\u30fc\u30f3\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f -message.dedicate.zone=\u30be\u30fc\u30f3\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u3066\u3044\u307e\u3059 -message.delete.account=\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.delete.affinity.group=\u3053\u306e\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.delete.gateway=\u3053\u306e\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.delete.project=\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.delete.user=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.delete.VPN.connection=VPN \u63a5\u7d9a\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.delete.VPN.customer.gateway=\u3053\u306e VPN \u30ab\u30b9\u30bf\u30de\u30fc \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.delete.VPN.gateway=\u3053\u306e VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.desc.add.new.lb.sticky.rule=\u65b0\u3057\u3044 LB \u30b9\u30c6\u30a3\u30c3\u30ad\u30fc\u30eb\u30fc\u30eb\u3092\u8ffd\u52a0 -message.desc.advanced.zone=\u3088\u308a\u6d17\u7df4\u3055\u308c\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6280\u8853\u3092\u30b5\u30dd\u30fc\u30c8\u3057\u307e\u3059\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3059\u308b\u3068\u3001\u3088\u308a\u67d4\u8edf\u306b\u30b2\u30b9\u30c8\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u5b9a\u7fa9\u3057\u3001\u30d5\u30a1\u30a4\u30a2\u30a6\u30a9\u30fc\u30eb\u3001VPN\u3001\u30ed\u30fc\u30c9 \u30d0\u30e9\u30f3\u30b5\u30fc\u306e\u30b5\u30dd\u30fc\u30c8\u306e\u3088\u3046\u306a\u30ab\u30b9\u30bf\u30de\u30a4\u30ba\u3057\u305f\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u63d0\u4f9b\u3067\u304d\u307e\u3059\u3002 -message.desc.basic.zone=\u5404 VM \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b IP \u30a2\u30c9\u30ec\u30b9\u304c\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304b\u3089\u76f4\u63a5\u5272\u308a\u5f53\u3066\u3089\u308c\u308b\u3001\u5358\u4e00\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 (\u9001\u4fe1\u5143 IP \u30a2\u30c9\u30ec\u30b9\u306e\u30d5\u30a3\u30eb\u30bf\u30fc) \u306e\u3088\u3046\u306a\u30ec\u30a4\u30e4\u30fc 3 \u30ec\u30d9\u30eb\u306e\u65b9\u6cd5\u3067\u30b2\u30b9\u30c8\u3092\u5206\u96e2\u3067\u304d\u307e\u3059\u3002 -message.desc.cluster=\u5404\u30dd\u30c3\u30c9\u306b\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30db\u30b9\u30c8\u3092\u30b0\u30eb\u30fc\u30d7\u5316\u3059\u308b\u65b9\u6cd5\u3067\u3059\u30021 \u3064\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u306f\u3059\u3079\u3066\u540c\u4e00\u306e\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u304b\u3089\u69cb\u6210\u3055\u308c\u3001\u540c\u3058\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3092\u5b9f\u884c\u3057\u3001\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u306b\u3042\u308a\u3001\u540c\u3058\u5171\u6709\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u5404\u30af\u30e9\u30b9\u30bf\u30fc\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30db\u30b9\u30c8\u3068 1 \u3064\u4ee5\u4e0a\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059\u3002 -message.desc.created.ssh.key.pair=\u4f5c\u6210\u3055\u308c\u305f SSH \u30ad\u30fc\u30da\u30a2 -message.desc.create.ssh.key.pair=SSH \u30ad\u30fc\u30da\u30a2\u306e\u751f\u6210\u304a\u3088\u3073\u767b\u9332\u306e\u305f\u3081\u306b\u4ee5\u4e0b\u306e\u30c7\u30fc\u30bf\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044

(1) \u516c\u958b\u9375\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u308b\u5834\u5408\u3001CloudStack \u3067\u306f\u305d\u306e\u516c\u958b\u9375\u3092\u767b\u9332\u3057\u3001\u5bfe\u5fdc\u3059\u308b\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u30ad\u30fc\u3092\u4f7f\u3063\u3066\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059

(2) \u516c\u958b\u9375\u304c\u8a2d\u5b9a\u3055\u308c\u3066\u3044\u306a\u3044\u5834\u5408\u3001CloudStack \u3067\u306f\u65b0\u3057\u3044 SSH \u30ad\u30fc\u30da\u30a2 \u3092\u751f\u6210\u3057\u307e\u3059\u3001\u305d\u306e\u6642 CloudStack \u3067\u306f\u79d8\u5bc6\u9375\u3092\u4fdd\u6301\u3057\u306a\u3044\u305f\u3081\u30e6\u30fc\u30b6\u30fc\u3067\u30b3\u30d4\u30fc\u304a\u3088\u3073\u4fdd\u5b58\u3057\u3066\u304f\u3060\u3055\u3044
-message.desc.host=\u5404\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u3001\u30b2\u30b9\u30c8 VM \u3092\u5b9f\u884c\u3059\u308b\u305f\u3081\u306e\u30db\u30b9\u30c8 (\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc) \u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30db\u30b9\u30c8\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002CloudStack \u3067\u30db\u30b9\u30c8\u3092\u6a5f\u80fd\u3055\u305b\u308b\u306b\u306f\u3001\u30db\u30b9\u30c8\u306b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u3066 IP \u30a2\u30c9\u30ec\u30b9\u3092\u5272\u308a\u5f53\u3066\u3001\u30db\u30b9\u30c8\u304c CloudStack \u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u306b\u63a5\u7d9a\u3057\u3066\u3044\u308b\u3053\u3068\u3092\u78ba\u8a8d\u3057\u307e\u3059\u3002

\u30db\u30b9\u30c8\u306e DNS \u540d\u307e\u305f\u306f IP \u30a2\u30c9\u30ec\u30b9\u3001\u30e6\u30fc\u30b6\u30fc\u540d (\u901a\u5e38\u306f root) \u3068\u30d1\u30b9\u30ef\u30fc\u30c9\u3001\u304a\u3088\u3073\u30db\u30b9\u30c8\u306e\u5206\u985e\u306b\u4f7f\u7528\u3059\u308b\u30e9\u30d9\u30eb\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.desc.primary.storage=\u5404\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u3001\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30b5\u30fc\u30d0\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306f\u3001\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u4e0a\u3067\u52d5\u4f5c\u3059\u308b\u3059\u3079\u3066\u306e VM \u306e\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002\u57fa\u790e\u3068\u306a\u308b\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3067\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u308b\u3001\u6a19\u6e96\u306b\u6e96\u62e0\u3057\u305f\u30d7\u30ed\u30c8\u30b3\u30eb\u3092\u4f7f\u7528\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.desc.reset.ssh.key.pair=\u3053\u306e VM \u306b\u8ffd\u52a0\u3059\u308b SSH \u30ad\u30fc\u30da\u30a2\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u308b\u5834\u5408 root \u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u5909\u66f4\u3055\u308c\u308b\u70b9\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044 -message.desc.secondary.storage=\u5404\u30be\u30fc\u30f3\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u3001NFS \u3064\u307e\u308a\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304c\u5fc5\u8981\u3067\u3059\u3002\u4eca\u3053\u3053\u3067\u6700\u521d\u306e\u30b5\u30fc\u30d0\u30fc\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306f VM \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3001ISO \u30a4\u30e1\u30fc\u30b8\u3001\u304a\u3088\u3073VM \u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306f\u30be\u30fc\u30f3\u5185\u306e\u3059\u3079\u3066\u306e\u30db\u30b9\u30c8\u3067\u4f7f\u7528\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002

IP \u30a2\u30c9\u30ec\u30b9\u3068\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u30d1\u30b9\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.desc.zone=\u30be\u30fc\u30f3\u306f CloudStack \u74b0\u5883\u5185\u306e\u6700\u5927\u306e\u7d44\u7e54\u5358\u4f4d\u3067\u3001\u901a\u5e38\u3001\u5358\u4e00\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306b\u76f8\u5f53\u3057\u307e\u3059\u3002\u30be\u30fc\u30f3\u306b\u3088\u3063\u3066\u7269\u7406\u7684\u306a\u5206\u96e2\u3068\u5197\u9577\u6027\u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002\u30be\u30fc\u30f3\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30dd\u30c3\u30c9 (\u5404\u30dd\u30c3\u30c9\u306f\u30db\u30b9\u30c8\u3068\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059) \u3068\u3001\u30be\u30fc\u30f3\u5185\u306e\u3059\u3079\u3066\u306e\u30dd\u30c3\u30c9\u3067\u5171\u6709\u3055\u308c\u308b\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u69cb\u6210\u3055\u308c\u307e\u3059\u3002 -message.detach.disk=\u3053\u306e\u30c7\u30a3\u30b9\u30af\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.detach.iso.confirm=\u3053\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304b\u3089 ISO \u30d5\u30a1\u30a4\u30eb\u3092\u30c7\u30bf\u30c3\u30c1\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.disable.account=\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u3059\u3079\u3066\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u30af\u30e9\u30a6\u30c9 \u30ea\u30bd\u30fc\u30b9\u306b\u30a2\u30af\u30bb\u30b9\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002\u5b9f\u884c\u4e2d\u306e\u3059\u3079\u3066\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u304c\u4eca\u3059\u3050\u306b\u30b7\u30e3\u30c3\u30c8\u30c0\u30a6\u30f3\u3055\u308c\u307e\u3059\u3002 -message.disable.snapshot.policy=\u73fe\u5728\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 \u30dd\u30ea\u30b7\u30fc\u3092\u7121\u52b9\u306b\u3057\u307e\u3057\u305f\u3002 -message.disable.user=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.disable.vpn.access=\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.disable.vpn=VPN \u3092\u7121\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.disabling.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -message.disabling.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u7121\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -message.disallowed.characters=\u8a31\u53ef\u3055\u308c\u306a\u3044\u6587\u5b57\: <,> -message.download.ISO=ISO \u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f 00000 \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059 -message.download.template=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f 00000 \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059 -message.download.volume.confirm=\u3053\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.download.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u30c0\u30a6\u30f3\u30ed\u30fc\u30c9\u3059\u308b\u306b\u306f 00000 \u3092\u30af\u30ea\u30c3\u30af\u3057\u307e\u3059 -message.edit.account=\u7de8\u96c6 (\u300c-1\u300d\u306f\u3001\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\u306e\u91cf\u306b\u5236\u9650\u304c\u306a\u3044\u3053\u3068\u3092\u793a\u3057\u307e\u3059) -message.edit.confirm=\u4fdd\u5b58\u3059\u308b\u524d\u306b\u5909\u66f4\u5185\u5bb9\u3092\u78ba\u8a8d\u3057\u3066\u304f\u3060\u3055\u3044 -message.edit.limits=\u6b21\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u5236\u9650\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u300c-1\u300d\u306f\u3001\u30ea\u30bd\u30fc\u30b9\u4f5c\u6210\u306b\u5236\u9650\u304c\u306a\u3044\u3053\u3068\u3092\u793a\u3057\u307e\u3059\u3002 -message.edit.traffic.type=\u3053\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u306b\u95a2\u9023\u4ed8\u3051\u308b\u30c8\u30e9\u30d5\u30a3\u30c3\u30af \u30e9\u30d9\u30eb\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.enable.account=\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.enabled.vpn.ip.sec=IPSec \u4e8b\u524d\u5171\u6709\u30ad\u30fc\: -message.enabled.vpn=\u73fe\u5728\u3001\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u304c\u6709\u52b9\u306b\u306a\u3063\u3066\u3044\u307e\u3059\u3002\u6b21\u306e IP \u30a2\u30c9\u30ec\u30b9\u7d4c\u7531\u3067\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\u3002 -message.enable.user=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.enable.vpn.access=\u73fe\u5728\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3059\u308b VPN \u306f\u7121\u52b9\u3067\u3059\u3002VPN \u30a2\u30af\u30bb\u30b9\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.enable.vpn=\u3053\u306e IP \u30a2\u30c9\u30ec\u30b9\u306b\u5bfe\u3059\u308b\u30ea\u30e2\u30fc\u30c8 \u30a2\u30af\u30bb\u30b9 VPN \u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.enabling.network.offering=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -message.enabling.security.group.provider=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7 \u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -message.enabling.vpc.offering=VPC \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -message.enabling.zone.dots=\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059... -message.enabling.zone=\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3044\u307e\u3059 -message.enter.seperated.list.multiple.cidrs=CIDR \u304c\u8907\u6570\u3042\u308b\u5834\u5408\u306f\u3001\u30b3\u30f3\u30de\u533a\u5207\u308a\u306e\u4e00\u89a7\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 -message.enter.token=\u96fb\u5b50\u30e1\u30fc\u30eb\u306e\u62db\u5f85\u72b6\u306b\u8a18\u8f09\u3055\u308c\u3066\u3044\u308b\u30c8\u30fc\u30af\u30f3\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.generate.keys=\u3053\u306e\u30e6\u30fc\u30b6\u30fc\u306b\u65b0\u3057\u3044\u30ad\u30fc\u3092\u751f\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.gslb.delete.confirm=\u3053\u306e GSLB \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.gslb.lb.remove.confirm=GSLB \u304b\u3089\u8ca0\u8377\u5206\u6563\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.guest.traffic.in.advanced.zone=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306f\u3001\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u9593\u306e\u901a\u4fe1\u3067\u3059\u3002\u5404\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30b2\u30b9\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u901a\u4fe1\u3059\u308b\u305f\u3081\u306e VLAN ID \u306e\u7bc4\u56f2\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.guest.traffic.in.basic.zone=\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306f\u3001\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306e\u4eee\u60f3\u30de\u30b7\u30f3\u9593\u306e\u901a\u4fe1\u3067\u3059\u3002CloudStack \u3067\u30b2\u30b9\u30c8 VM \u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u308b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u7bc4\u56f2\u304c\u4e88\u7d04\u6e08\u307f\u306e\u30b7\u30b9\u30c6\u30e0 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3068\u91cd\u8907\u3057\u306a\u3044\u3088\u3046\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.host.dedicated=\u30db\u30b9\u30c8\u3092\u5c02\u7528\u306b\u8a2d\u5b9a\u3057\u307e\u3057\u305f -message.host.dedication.released=\u5c02\u7528\u30db\u30b9\u30c8\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f -message.installWizard.click.retry=\u8d77\u52d5\u3092\u518d\u8a66\u884c\u3059\u308b\u306b\u306f\u30dc\u30bf\u30f3\u3092\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.installWizard.copy.whatIsACluster=\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30db\u30b9\u30c8\u3092\u30b0\u30eb\u30fc\u30d7\u5316\u3059\u308b\u65b9\u6cd5\u3067\u3059\u30021 \u3064\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u306f\u3059\u3079\u3066\u540c\u4e00\u306e\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u304b\u3089\u69cb\u6210\u3055\u308c\u3001\u540c\u3058\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3092\u5b9f\u884c\u3057\u3001\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u306b\u3042\u308a\u3001\u540c\u3058\u5171\u6709\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u540c\u3058\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u9593\u3067\u306f\u3001\u30e6\u30fc\u30b6\u30fc\u3078\u306e\u30b5\u30fc\u30d3\u30b9\u3092\u4e2d\u65ad\u305b\u305a\u306b\u3001\u4eee\u60f3\u30de\u30b7\u30f3 \u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u30e9\u30a4\u30d6 \u30de\u30a4\u30b0\u30ec\u30fc\u30b7\u30e7\u30f3\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u30af\u30e9\u30b9\u30bf\u30fc\u306f CloudStack&\#8482; \u74b0\u5883\u5185\u306e 3 \u756a\u76ee\u306b\u5927\u304d\u306a\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u3002\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30dd\u30c3\u30c9\u306b\u542b\u307e\u308c\u3001\u30dd\u30c3\u30c9\u306f\u30be\u30fc\u30f3\u306b\u542b\u307e\u308c\u307e\u3059\u3002

CloudStack&\#8482; \u3067\u306f 1 \u3064\u306e\u30af\u30e9\u30a6\u30c9\u74b0\u5883\u306b\u8907\u6570\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u304c\u3001\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u306f\u30af\u30e9\u30b9\u30bf\u30fc\u306f 1 \u3064\u3067\u3059\u3002 -message.installWizard.copy.whatIsAHost=\u30db\u30b9\u30c8\u306f\u5358\u4e00\u306e\u30b3\u30f3\u30d4\u30e5\u30fc\u30bf\u30fc\u3067\u3001\u30b2\u30b9\u30c8\u4eee\u60f3\u30de\u30b7\u30f3\u3092\u5b9f\u884c\u3059\u308b\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30ea\u30bd\u30fc\u30b9\u3092\u63d0\u4f9b\u3057\u307e\u3059\u3002\u30d9\u30a2 \u30e1\u30bf\u30eb \u30db\u30b9\u30c8\u3092\u9664\u3044\u3066\u3001\u5404\u30db\u30b9\u30c8\u306b\u306f\u30b2\u30b9\u30c8\u4eee\u60f3\u30de\u30b7\u30f3\u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306e\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc \u30bd\u30d5\u30c8\u30a6\u30a7\u30a2\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002\u30d9\u30a2 \u30e1\u30bf\u30eb \u30db\u30b9\u30c8\u306b\u3064\u3044\u3066\u306f\u3001\u300e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u30ac\u30a4\u30c9\u4e0a\u7d1a\u7de8\u300f\u3067\u7279\u6b8a\u4f8b\u3068\u3057\u3066\u8aac\u660e\u3057\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001KVM \u304c\u6709\u52b9\u306a Linux \u30b5\u30fc\u30d0\u30fc\u3001Citrix XenServer \u304c\u52d5\u4f5c\u3059\u308b\u30b5\u30fc\u30d0\u30fc\u3001\u304a\u3088\u3073 ESXi \u30b5\u30fc\u30d0\u30fc\u304c\u30db\u30b9\u30c8\u3067\u3059\u3002\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u306f\u3001XenServer \u307e\u305f\u306f KVM \u3092\u5b9f\u884c\u3059\u308b\u5358\u4e00\u306e\u30db\u30b9\u30c8\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002

\u30db\u30b9\u30c8\u306f CloudStack&\#8482; \u74b0\u5883\u5185\u306e\u6700\u5c0f\u306e\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u3002\u30db\u30b9\u30c8\u306f\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u542b\u307e\u308c\u3001\u30af\u30e9\u30b9\u30bf\u30fc\u306f\u30dd\u30c3\u30c9\u306b\u542b\u307e\u308c\u3001\u30dd\u30c3\u30c9\u306f\u30be\u30fc\u30f3\u306b\u542b\u307e\u308c\u307e\u3059\u3002 -message.installWizard.copy.whatIsAPod=\u901a\u5e38\u30011 \u3064\u306e\u30dd\u30c3\u30c9\u306f\u5358\u4e00\u306e\u30e9\u30c3\u30af\u3092\u8868\u3057\u307e\u3059\u3002\u540c\u3058\u30dd\u30c3\u30c9\u5185\u306e\u30db\u30b9\u30c8\u306f\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u306b\u542b\u307e\u308c\u307e\u3059\u3002

\u30dd\u30c3\u30c9\u306f CloudStack&\#8482; \u74b0\u5883\u5185\u306e 2 \u756a\u76ee\u306b\u5927\u304d\u306a\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u3002\u30dd\u30c3\u30c9\u306f\u30be\u30fc\u30f3\u306b\u542b\u307e\u308c\u307e\u3059\u3002\u5404\u30be\u30fc\u30f3\u306f 1 \u3064\u4ee5\u4e0a\u306e\u30dd\u30c3\u30c9\u3092\u542b\u3080\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u57fa\u672c\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u306f\u3001\u30be\u30fc\u30f3\u5185\u306e\u30dd\u30c3\u30c9\u306f 1 \u3064\u3067\u3059\u3002 -message.installWizard.copy.whatIsAZone=\u30be\u30fc\u30f3\u306f CloudStack&\#8482; \u74b0\u5883\u5185\u306e\u6700\u5927\u306e\u7d44\u7e54\u5358\u4f4d\u3067\u3059\u30021 \u3064\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u5185\u306b\u8907\u6570\u306e\u30be\u30fc\u30f3\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059\u304c\u3001\u901a\u5e38\u3001\u30be\u30fc\u30f3\u306f\u5358\u4e00\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306b\u76f8\u5f53\u3057\u307e\u3059\u3002\u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3092\u30be\u30fc\u30f3\u306b\u7d44\u7e54\u5316\u3059\u308b\u3068\u3001\u30be\u30fc\u30f3\u3092\u7269\u7406\u7684\u306b\u5206\u96e2\u3057\u3066\u5197\u9577\u5316\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002\u305f\u3068\u3048\u3070\u3001\u5404\u30be\u30fc\u30f3\u306b\u96fb\u6e90\u3068\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30a2\u30c3\u30d7\u30ea\u30f3\u30af\u3092\u914d\u5099\u3057\u307e\u3059\u3002\u5fc5\u9808\u3067\u306f\u3042\u308a\u307e\u305b\u3093\u304c\u3001\u30be\u30fc\u30f3\u306f\u9060\u9694\u5730\u306b\u5206\u6563\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002 -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482; \u306f\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30ea\u30bd\u30fc\u30b9\u3092\u30d7\u30fc\u30eb\u3059\u308b\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2 \u30d7\u30e9\u30c3\u30c8\u30d5\u30a9\u30fc\u30e0\u3067\u3001\u30d1\u30d6\u30ea\u30c3\u30af\u3001\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u3001\u304a\u3088\u3073\u30cf\u30a4\u30d6\u30ea\u30c3\u30c9\u306e Infrastructure as a Service (IaaS) \u30af\u30e9\u30a6\u30c9\u3092\u69cb\u7bc9\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002CloudStack&\#8482; \u3092\u4f7f\u7528\u3057\u3066\u3001\u30af\u30e9\u30a6\u30c9 \u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3092\u69cb\u6210\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3001\u30b9\u30c8\u30ec\u30fc\u30b8\u3001\u304a\u3088\u3073\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30ce\u30fc\u30c9\u3092\u7ba1\u7406\u3057\u3001\u30af\u30e9\u30a6\u30c9 \u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u74b0\u5883\u3092\u5c55\u958b\u3001\u7ba1\u7406\u3001\u304a\u3088\u3073\u69cb\u6210\u3057\u307e\u3059\u3002

CloudStack&\#8482; \u306f\u30b3\u30e2\u30c7\u30a3\u30c6\u30a3\u5316\u3057\u305f\u30cf\u30fc\u30c9\u30a6\u30a7\u30a2\u4e0a\u3067\u52d5\u4f5c\u3059\u308b\u500b\u5225\u306e\u4eee\u60f3\u30de\u30b7\u30f3 \u30a4\u30e1\u30fc\u30b8\u3092\u8d85\u3048\u3066\u62e1\u5f35\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u3001\u7c21\u5358\u306a\u8a2d\u5b9a\u3067\u52d5\u4f5c\u3059\u308b\u30af\u30e9\u30a6\u30c9 \u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u306e\u30bd\u30d5\u30c8\u30a6\u30a7\u30a2 \u30b9\u30bf\u30c3\u30af\u306b\u3088\u3063\u3066\u3001\u4eee\u60f3\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u3064\u307e\u308a\u591a\u5c64\u578b\u306e\u30de\u30eb\u30c1\u30c6\u30ca\u30f3\u30c8 \u30af\u30e9\u30a6\u30c9 \u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u3092\u30b5\u30fc\u30d3\u30b9\u3068\u3057\u3066\u69cb\u7bc9\u3057\u3001\u5c55\u958b\u3057\u3001\u7ba1\u7406\u3059\u308b\u305f\u3081\u306b\u4e0d\u53ef\u6b20\u306a\u30b3\u30f3\u30dd\u30fc\u30cd\u30f3\u30c8\u304c\u3059\u3079\u3066\u63d0\u4f9b\u3055\u308c\u307e\u3059\u3002\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 \u30d0\u30fc\u30b8\u30e7\u30f3\u3068\u30d7\u30ec\u30df\u30a2\u30e0 \u30d0\u30fc\u30b8\u30e7\u30f3\u306e\u4e21\u65b9\u304c\u63d0\u4f9b\u3055\u308c\u307e\u3059\u304c\u3001\u30aa\u30fc\u30d7\u30f3 \u30bd\u30fc\u30b9 \u30d0\u30fc\u30b8\u30e7\u30f3\u3067\u3082\u307b\u3068\u3093\u3069\u306e\u6a5f\u80fd\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002 -message.installWizard.copy.whatIsPrimaryStorage=CloudStack&\#8482; \u306e\u30af\u30e9\u30a6\u30c9 \u30a4\u30f3\u30d5\u30e9\u30b9\u30c8\u30e9\u30af\u30c1\u30e3\u3067\u306f\u3001\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3068\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e 2 \u7a2e\u985e\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002\u3069\u3061\u3089\u306e\u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u3082\u3001iSCSI\u3001NFS \u30b5\u30fc\u30d0\u30fc\u3001\u307e\u305f\u306f\u30ed\u30fc\u30ab\u30eb \u30c7\u30a3\u30b9\u30af\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002

\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306f\u30af\u30e9\u30b9\u30bf\u30fc\u306b\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3001\u305d\u306e\u30af\u30e9\u30b9\u30bf\u30fc\u5185\u306e\u30db\u30b9\u30c8\u3067\u52d5\u4f5c\u3059\u308b\u3059\u3079\u3066\u306e VM \u306e\u5404\u30b2\u30b9\u30c8 VM \u306e\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002\u901a\u5e38\u3001\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30b5\u30fc\u30d0\u30fc\u306f\u30db\u30b9\u30c8\u306e\u8fd1\u304f\u306b\u8a2d\u7f6e\u3057\u307e\u3059\u3002 -message.installWizard.copy.whatIsSecondaryStorage=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306f\u30be\u30fc\u30f3\u3068\u95a2\u9023\u4ed8\u3051\u3089\u308c\u3001\u6b21\u306e\u9805\u76ee\u3092\u683c\u7d0d\u3057\u307e\u3059\u3002
  • \u30c6\u30f3\u30d7\u30ec\u30fc\u30c8 - VM \u306e\u8d77\u52d5\u306b\u4f7f\u7528\u3067\u304d\u308b OS \u30a4\u30e1\u30fc\u30b8\u3067\u3001\u30a2\u30d7\u30ea\u30b1\u30fc\u30b7\u30e7\u30f3\u306e\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u306a\u3069\u8ffd\u52a0\u306e\u69cb\u6210\u3092\u542b\u3081\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002
  • ISO \u30a4\u30e1\u30fc\u30b8 - \u8d77\u52d5\u53ef\u80fd\u307e\u305f\u306f\u8d77\u52d5\u4e0d\u53ef\u306e OS \u30a4\u30e1\u30fc\u30b8\u3067\u3059\u3002
  • \u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8 - VM \u30c7\u30fc\u30bf\u306e\u4fdd\u5b58\u30b3\u30d4\u30fc\u3067\u3059\u3002\u30c7\u30fc\u30bf\u306e\u5fa9\u5143\u307e\u305f\u306f\u65b0\u3057\u3044\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u306b\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002
-message.installWizard.now.building=\u30af\u30e9\u30a6\u30c9\u3092\u69cb\u7bc9\u3057\u3066\u3044\u307e\u3059... -message.installWizard.tooltip.addCluster.name=\u30af\u30e9\u30b9\u30bf\u30fc\u306e\u540d\u524d\u3067\u3059\u3002CloudStack \u3067\u4f7f\u7528\u3055\u308c\u3066\u3044\u306a\u3044\u3001\u4efb\u610f\u306e\u30c6\u30ad\u30b9\u30c8\u3092\u6307\u5b9a\u3067\u304d\u307e\u3059\u3002 -message.installWizard.tooltip.addHost.hostname=\u30db\u30b9\u30c8\u306e DNS \u540d\u307e\u305f\u306f IP \u30a2\u30c9\u30ec\u30b9\u3067\u3059\u3002 -message.installWizard.tooltip.addHost.password=XenServer \u5074\u3067\u6307\u5b9a\u3057\u305f\u3001\u4e0a\u306e\u30e6\u30fc\u30b6\u30fc\u540d\u306b\u5bfe\u3059\u308b\u30d1\u30b9\u30ef\u30fc\u30c9\u3067\u3059\u3002 -message.installWizard.tooltip.addHost.username=\u901a\u5e38\u306f root \u3067\u3059\u3002 -message.installWizard.tooltip.addPod.name=\u30dd\u30c3\u30c9\u306e\u540d\u524d\u3067\u3059\u3002 -message.installWizard.tooltip.addPod.reservedSystemEndIp=\u3053\u308c\u306f\u3001\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 VM \u304a\u3088\u3073\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7 VM \u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306b CloudStack \u3067\u4f7f\u7528\u3059\u308b\u3001\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306e IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30b5\u30fc\u30d0\u30fc\u3068\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u304b\u3089\u5272\u308a\u5f53\u3066\u307e\u3059\u3002 -message.installWizard.tooltip.addPod.reservedSystemGateway=\u3053\u306e\u30dd\u30c3\u30c9\u5185\u306e\u30db\u30b9\u30c8\u306e\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3067\u3059\u3002 -message.installWizard.tooltip.addPod.reservedSystemNetmask=\u30b2\u30b9\u30c8\u306e\u4f7f\u7528\u3059\u308b\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u3067\u4f7f\u7528\u3055\u308c\u308b\u30cd\u30c3\u30c8\u30de\u30b9\u30af\u3067\u3059\u3002 -message.installWizard.tooltip.addPod.reservedSystemStartIp=\u3053\u308c\u306f\u3001\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 VM \u304a\u3088\u3073\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7 VM \u3092\u7ba1\u7406\u3059\u308b\u305f\u3081\u306b CloudStack \u3067\u4f7f\u7528\u3059\u308b\u3001\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u5185\u306e IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30b3\u30f3\u30d4\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0 \u30b5\u30fc\u30d0\u30fc\u3068\u540c\u3058\u30b5\u30d6\u30cd\u30c3\u30c8\u304b\u3089\u5272\u308a\u5f53\u3066\u307e\u3059\u3002 -message.installWizard.tooltip.addPrimaryStorage.name=\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c7\u30d0\u30a4\u30b9\u306e\u540d\u524d\u3067\u3059\u3002 -message.installWizard.tooltip.addPrimaryStorage.path=(NFS \u306e\u5834\u5408) \u30b5\u30fc\u30d0\u30fc\u304b\u3089\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u30d1\u30b9\u3067\u3059\u3002(SharedMountPoint \u306e\u5834\u5408) \u30d1\u30b9\u3067\u3059\u3002KVM \u3067\u306f\u3053\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u304c\u30de\u30a6\u30f3\u30c8\u3055\u308c\u308b\u5404\u30db\u30b9\u30c8\u4e0a\u306e\u30d1\u30b9\u3067\u3059\u3002\u305f\u3068\u3048\u3070\u3001/mnt/primary \u3067\u3059\u3002 -message.installWizard.tooltip.addPrimaryStorage.server=(NFS\u3001iSCSI\u3001\u307e\u305f\u306f PreSetup \u306e\u5834\u5408) \u30b9\u30c8\u30ec\u30fc\u30b8 \u30c7\u30d0\u30a4\u30b9\u306e IP \u30a2\u30c9\u30ec\u30b9\u307e\u305f\u306f DNS \u540d\u3067\u3059\u3002 -message.installWizard.tooltip.addSecondaryStorage.nfsServer=\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u30db\u30b9\u30c8\u3059\u308b NFS \u30b5\u30fc\u30d0\u30fc\u306e IP \u30a2\u30c9\u30ec\u30b9\u3067\u3059\u3002 -message.installWizard.tooltip.addSecondaryStorage.path=\u4e0a\u306b\u6307\u5b9a\u3057\u305f\u30b5\u30fc\u30d0\u30fc\u306b\u5b58\u5728\u3059\u308b\u3001\u30a8\u30af\u30b9\u30dd\u30fc\u30c8\u3055\u308c\u305f\u30d1\u30b9\u3067\u3059\u3002 -message.installWizard.tooltip.addZone.dns1=\u30be\u30fc\u30f3\u5185\u306e\u30b2\u30b9\u30c8 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306b\u306f\u3001\u5f8c\u3067\u8ffd\u52a0\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u7d4c\u7531\u3067\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.installWizard.tooltip.addZone.dns2=\u30be\u30fc\u30f3\u5185\u306e\u30b2\u30b9\u30c8 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306b\u306f\u3001\u5f8c\u3067\u8ffd\u52a0\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u7d4c\u7531\u3067\u30a2\u30af\u30bb\u30b9\u3057\u307e\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b\u30d1\u30d6\u30ea\u30c3\u30af DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.installWizard.tooltip.addZone.internaldns1=\u30be\u30fc\u30f3\u5185\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306f\u3001\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4ecb\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3055\u308c\u307e\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.installWizard.tooltip.addZone.internaldns2=\u30be\u30fc\u30f3\u5185\u306e\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u3067\u3059\u3002\u3053\u308c\u3089\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306f\u3001\u30b7\u30b9\u30c6\u30e0 VM \u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4ecb\u3057\u3066\u30a2\u30af\u30bb\u30b9\u3055\u308c\u307e\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u3053\u3067\u6307\u5b9a\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.installWizard.tooltip.addZone.name=\u30be\u30fc\u30f3\u306e\u540d\u524d\u3067\u3059\u3002 -message.installWizard.tooltip.configureGuestTraffic.description=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u8aac\u660e\u3067\u3059\u3002 -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=\u3053\u306e\u30be\u30fc\u30f3\u306e\u30b2\u30b9\u30c8\u306b\u5272\u308a\u5f53\u3066\u308b\u3053\u3068\u304c\u3067\u304d\u308b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u4f7f\u7528\u3059\u308b NIC \u304c 1 \u3064\u306e\u5834\u5408\u306f\u3001\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30dd\u30c3\u30c9\u306e CIDR \u3068\u540c\u3058 CIDR \u306b\u542b\u307e\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.installWizard.tooltip.configureGuestTraffic.guestGateway=\u30b2\u30b9\u30c8\u306e\u4f7f\u7528\u3059\u308b\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3067\u3059\u3002 -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=\u30b2\u30b9\u30c8\u306e\u4f7f\u7528\u3059\u308b\u30b5\u30d6\u30cd\u30c3\u30c8\u4e0a\u3067\u4f7f\u7528\u3055\u308c\u308b\u30cd\u30c3\u30c8\u30de\u30b9\u30af\u3067\u3059\u3002 -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=\u3053\u306e\u30be\u30fc\u30f3\u306e\u30b2\u30b9\u30c8\u306b\u5272\u308a\u5f53\u3066\u308b\u3053\u3068\u304c\u3067\u304d\u308b IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3067\u3059\u3002\u4f7f\u7528\u3059\u308b NIC \u304c 1 \u3064\u306e\u5834\u5408\u306f\u3001\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u306f\u30dd\u30c3\u30c9\u306e CIDR \u3068\u540c\u3058 CIDR \u306b\u542b\u307e\u308c\u3066\u3044\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.installWizard.tooltip.configureGuestTraffic.name=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u540d\u524d\u3067\u3059\u3002 -message.instance.scaled.up.confirm=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.instanceWizard.noTemplates=\u4f7f\u7528\u53ef\u80fd\u306a\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u4e92\u63db\u6027\u306e\u3042\u308b\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u8ffd\u52a0\u3057\u3066\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9 \u30a6\u30a3\u30b6\u30fc\u30c9\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.ip.address.changed=\u304a\u4f7f\u3044\u306e IP \u30a2\u30c9\u30ec\u30b9\u304c\u5909\u66f4\u3055\u308c\u3066\u3044\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002\u4e00\u89a7\u3092\u66f4\u65b0\u3057\u307e\u3059\u304b? \u305d\u306e\u5834\u5408\u306f\u3001\u8a73\u7d30\u30da\u30a4\u30f3\u304c\u9589\u3058\u308b\u3053\u3068\u306b\u6ce8\u610f\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.iso.desc=\u30c7\u30fc\u30bf\u307e\u305f\u306f OS \u8d77\u52d5\u53ef\u80fd\u30e1\u30c7\u30a3\u30a2\u3092\u542b\u3080\u30c7\u30a3\u30b9\u30af \u30a4\u30e1\u30fc\u30b8 -message.join.project=\u3053\u308c\u3067\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u53c2\u52a0\u3057\u307e\u3057\u305f\u3002\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u53c2\u7167\u3059\u308b\u306b\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30d3\u30e5\u30fc\u306b\u5207\u308a\u66ff\u3048\u3066\u304f\u3060\u3055\u3044\u3002 -message.launch.vm.on.private.network=\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8\u306a\u5c02\u7528\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u8d77\u52d5\u3057\u307e\u3059\u304b? -message.launch.zone=\u30be\u30fc\u30f3\u3092\u8d77\u52d5\u3059\u308b\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002\u6b21\u306e\u624b\u9806\u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002 -message.link.domain.to.ldap=\u3053\u306e\u30c9\u30e1\u30a4\u30f3\u3068 LDAP \u306e\u81ea\u52d5\u540c\u671f\u3092\u6709\u52b9\u5316\u3059\u308b -message.listView.subselect.multi=(Ctrl/Cmd \u30ad\u30fc\u3092\u62bc\u3057\u306a\u304c\u3089\u30af\u30ea\u30c3\u30af) -message.lock.account=\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u3092\u30ed\u30c3\u30af\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u3059\u3079\u3066\u306e\u30e6\u30fc\u30b6\u30fc\u304c\u30af\u30e9\u30a6\u30c9 \u30ea\u30bd\u30fc\u30b9\u3092\u7ba1\u7406\u3067\u304d\u306a\u304f\u306a\u308a\u307e\u3059\u3002\u305d\u306e\u5f8c\u3082\u65e2\u5b58\u306e\u30ea\u30bd\u30fc\u30b9\u306b\u306f\u30a2\u30af\u30bb\u30b9\u3067\u304d\u307e\u3059\u3002 -message.migrate.instance.confirm=\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u79fb\u884c\u5148\u306f\u6b21\u306e\u30db\u30b9\u30c8\u3067\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.migrate.instance.to.host=\u5225\u306e\u30db\u30b9\u30c8\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.migrate.instance.to.ps=\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.migrate.router.confirm=\u30eb\u30fc\u30bf\u30fc\u306e\u79fb\u884c\u5148\u306f\u6b21\u306e\u30db\u30b9\u30c8\u3067\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.migrate.systemvm.confirm=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u79fb\u884c\u5148\u306f\u6b21\u306e\u30db\u30b9\u30c8\u3067\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.migrate.volume=\u5225\u306e\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306b\u30dc\u30ea\u30e5\u30fc\u30e0\u3092\u79fb\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.network.addVM.desc=\u3053\u306e VM \u3092\u8ffd\u52a0\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u305f\u3081\u306e\u65b0\u3057\u3044 NIC \u304c\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002 -message.network.addVMNIC=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u65b0\u3057\u3044 VM NIC \u3092\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.network.remote.access.vpn.configuration=\u30ea\u30e2\u30fc\u30c8\u30a2\u30af\u30bb\u30b9 VPN \u306e\u8a2d\u5b9a\u306f\u751f\u6210\u3055\u308c\u307e\u3057\u305f\u304c\u9069\u7528\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u63a5\u7d9a\u6027\u3092\u78ba\u8a8d\u3057\u3082\u3046\u4e00\u5ea6\u8a66\u3057\u3066\u304f\u3060\u3055\u3044 -message.new.user=\u30a2\u30ab\u30a6\u30f3\u30c8\u306b\u65b0\u3057\u3044\u30e6\u30fc\u30b6\u30fc\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.no.affinity.groups=\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u304c\u3042\u308a\u307e\u305b\u3093\u3002\u6b21\u306e\u624b\u9806\u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002 -message.no.host.available=\u79fb\u884c\u306b\u4f7f\u7528\u3067\u304d\u308b\u30db\u30b9\u30c8\u306f\u3042\u308a\u307e\u305b\u3093 -message.no.network.support.configuration.not.true=\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u304c\u6709\u52b9\u306a\u30be\u30fc\u30f3\u304c\u7121\u3044\u305f\u3081\u3001\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6a5f\u80fd\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u624b\u9806 5. \u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002 -message.no.network.support=\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u3068\u3057\u3066 vSphere \u3092\u9078\u629e\u3057\u307e\u3057\u305f\u304c\u3001\u3053\u306e\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u306b\u8ffd\u52a0\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u6a5f\u80fd\u306f\u3042\u308a\u307e\u305b\u3093\u3002\u624b\u9806 5. \u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002 -message.no.projects.adminOnly=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002
\u7ba1\u7406\u8005\u306b\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306e\u4f5c\u6210\u3092\u4f9d\u983c\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.no.projects=\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u304c\u3042\u308a\u307e\u305b\u3093\u3002
\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30bb\u30af\u30b7\u30e7\u30f3\u304b\u3089\u65b0\u3057\u3044\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4f5c\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.number.clusters=

\u30af\u30e9\u30b9\u30bf\u30fc\u6570

-message.number.hosts=

\u30db\u30b9\u30c8\u6570

-message.number.pods=

\u30dd\u30c3\u30c9\u6570

-message.number.storage=

\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8 \u30dc\u30ea\u30e5\u30fc\u30e0\u6570

-message.number.zones=

\u30be\u30fc\u30f3\u6570

-message.password.has.been.reset.to=\u6b21\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\: -message.password.of.the.vm.has.been.reset.to=VM \u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u306f\u6b21\u306e\u3088\u3046\u306b\u30ea\u30bb\u30c3\u30c8\u3055\u308c\u307e\u3057\u305f\: -message.pending.projects.1=\u4fdd\u7559\u4e2d\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u62db\u5f85\u72b6\u304c\u3042\u308a\u307e\u3059\u3002 -message.pending.projects.2=\u8868\u793a\u3059\u308b\u306b\u306f\u30d7\u30ed\u30b8\u30a7\u30af\u30c8 \u30bb\u30af\u30b7\u30e7\u30f3\u306b\u79fb\u52d5\u3057\u3066\u3001\u4e00\u89a7\u304b\u3089\u62db\u5f85\u72b6\u3092\u9078\u629e\u3057\u307e\u3059\u3002 -message.please.add.at.lease.one.traffic.range=\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7bc4\u56f2\u3092\u8ffd\u52a0\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.please.confirm.remove.ssh.key.pair=\u3053\u306e SSH \u30ad\u30fc\u30da\u30a2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.please.proceed=\u6b21\u306e\u624b\u9806\u306b\u9032\u3093\u3067\u304f\u3060\u3055\u3044\u3002 -message.please.select.a.configuration.for.your.zone=\u30be\u30fc\u30f3\u306e\u69cb\u6210\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.please.select.a.different.public.and.management.network.before.removing=\u524a\u9664\u306e\u524d\u306b\u7570\u306a\u308b\u30d1\u30d6\u30ea\u30c3\u30af\u304a\u3088\u3073\u7ba1\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.please.select.networks=\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.please.select.ssh.key.pair.use.with.this.vm=\u3053\u306e VM \u306b\u4f7f\u7528\u3059\u308b SSH \u30ad\u30fc\u30da\u30a2\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 -message.please.wait.while.zone.is.being.created=\u30be\u30fc\u30f3\u304c\u4f5c\u6210\u3055\u308c\u308b\u307e\u3067\u3057\u3070\u3089\u304f\u304a\u5f85\u3061\u304f\u3060\u3055\u3044... -message.pod.dedication.released=\u5c02\u7528\u30dd\u30c3\u30c9\u304c\u89e3\u653e\u3055\u308c\u307e\u3057\u305f -message.portable.ip.delete.confirm=\u3053\u306e\u30dd\u30fc\u30bf\u30d6\u30eb IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.project.invite.sent=\u30e6\u30fc\u30b6\u30fc\u306b\u62db\u5f85\u72b6\u304c\u9001\u4fe1\u3055\u308c\u307e\u3057\u305f\u3002\u30e6\u30fc\u30b6\u30fc\u304c\u62db\u5f85\u3092\u627f\u8afe\u3059\u308b\u3068\u3001\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u306b\u8ffd\u52a0\u3055\u308c\u307e\u3059\u3002 -message.public.traffic.in.advanced.zone=\u30af\u30e9\u30a6\u30c9\u5185\u306e VM \u304c\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u3068\u3001\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u305f\u3081\u306b\u3001\u4e00\u822c\u306b\u30a2\u30af\u30bb\u30b9\u53ef\u80fd\u306a IP \u30a2\u30c9\u30ec\u30b9\u3092\u5272\u308a\u5f53\u3066\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306f CloudStack \u306e\u30e6\u30fc\u30b6\u30fc \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4f7f\u7528\u3057\u3066\u3053\u308c\u3089\u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3001\u30b2\u30b9\u30c8 \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3068\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u9593\u306b NAT \u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u304c\u3067\u304d\u307e\u3059\u3002

\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u305f\u3081\u306b\u3001\u5c11\u306a\u304f\u3068\u3082 1 \u3064 IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.public.traffic.in.basic.zone=\u30af\u30e9\u30a6\u30c9\u5185\u306e VM \u304c\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u304b\u30a4\u30f3\u30bf\u30fc\u30cd\u30c3\u30c8\u7d4c\u7531\u3067\u30af\u30e9\u30a4\u30a2\u30f3\u30c8\u306b\u30b5\u30fc\u30d3\u30b9\u3092\u63d0\u4f9b\u3059\u308b\u3068\u3001\u30d1\u30d6\u30ea\u30c3\u30af \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u304c\u751f\u6210\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u305f\u3081\u306b\u3001\u4e00\u822c\u306b\u30a2\u30af\u30bb\u30b9\u53ef\u80fd\u306a IP \u30a2\u30c9\u30ec\u30b9\u3092\u5272\u308a\u5f53\u3066\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u4f5c\u6210\u3059\u308b\u3068\u3001\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u307b\u304b\u306b\u3053\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u7bc4\u56f2\u304b\u3089\u30a2\u30c9\u30ec\u30b9\u304c 1 \u3064\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u307e\u3059\u3002\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u3068\u30b2\u30b9\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u306e\u9593\u306b\u3001\u9759\u7684\u306a 1 \u5bfe 1 \u306e NAT \u304c\u81ea\u52d5\u7684\u306b\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3055\u308c\u307e\u3059\u3002\u30a8\u30f3\u30c9 \u30e6\u30fc\u30b6\u30fc\u306f CloudStack \u306e\u30e6\u30fc\u30b6\u30fc \u30a4\u30f3\u30bf\u30fc\u30d5\u30a7\u30a4\u30b9\u3092\u4f7f\u7528\u3057\u3066\u8ffd\u52a0\u306e IP \u30a2\u30c9\u30ec\u30b9\u3092\u53d6\u5f97\u3057\u3001\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3068\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u306e\u9593\u306b\u9759\u7684 NAT \u3092\u5b9f\u88c5\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002 -message.question.are.you.sure.you.want.to.add=\u8ffd\u52a0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.read.admin.guide.scaling.up=\u30b5\u30a4\u30ba\u3092\u62e1\u5927\u3059\u308b\u524d\u306b\u7ba1\u7406\u8005\u30ac\u30a4\u30c9\u306e\u52d5\u7684\u306a\u30b5\u30a4\u30ba\u5909\u66f4\u306e\u30bb\u30af\u30b7\u30e7\u30f3\u3092\u304a\u8aad\u307f\u304f\u3060\u3055\u3044\u3002 -message.recover.vm=\u3053\u306e VM \u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.redirecting.region=\u30ea\u30fc\u30b8\u30e7\u30f3\u306b\u30ea\u30c0\u30a4\u30ec\u30af\u30c8\u3057\u3066\u3044\u307e\u3059... -message.reinstall.vm=\u6ce8\: \u6ce8\u610f\u3057\u3066\u7d9a\u884c\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u3053\u308c\u306b\u3088\u308a VM \u304c\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u304b\u3089\u518d\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3055\u308c\u307e\u3059\u3002\u30eb\u30fc\u30c8 \u30c7\u30a3\u30b9\u30af\u4e0a\u306e\u30c7\u30fc\u30bf\u306f\u5931\u308f\u308c\u307e\u3059\u3002\u8ffd\u52a0\u306e\u30c7\u30fc\u30bf \u30dc\u30ea\u30e5\u30fc\u30e0\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u305d\u306e\u30dc\u30ea\u30e5\u30fc\u30e0\u306b\u5f71\u97ff\u306f\u3042\u308a\u307e\u305b\u3093\u3002 -message.removed.ssh.key.pair=\u524a\u9664\u3055\u308c\u305f SSH \u30ad\u30fc\u30da\u30a2 -message.remove.ldap=LDAP \u69cb\u6210\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.remove.region=\u3053\u306e\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u304b\u3089\u3053\u306e\u30ea\u30fc\u30b8\u30e7\u30f3\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.remove.vpc=VPC \u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.remove.vpn.access=\u6b21\u306e\u30e6\u30fc\u30b6\u30fc\u304b\u3089 VPN \u30a2\u30af\u30bb\u30b9\u3092\u524a\u9664\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.reset.password.warning.notPasswordEnabled=\u3053\u306e\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306f\u3001\u30d1\u30b9\u30ef\u30fc\u30c9\u7ba1\u7406\u3092\u6709\u52b9\u306b\u305b\u305a\u306b\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002 -message.reset.password.warning.notStopped=\u73fe\u5728\u306e\u30d1\u30b9\u30ef\u30fc\u30c9\u3092\u5909\u66f4\u3059\u308b\u524d\u306b\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u505c\u6b62\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.reset.VPN.connection=VPN \u63a5\u7d9a\u3092\u30ea\u30bb\u30c3\u30c8\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.restart.mgmt.server=\u65b0\u3057\u3044\u8a2d\u5b9a\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.restart.mgmt.usage.server=\u65b0\u3057\u3044\u8a2d\u5b9a\u3092\u6709\u52b9\u306b\u3059\u308b\u305f\u3081\u306b\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u4f7f\u7528\u72b6\u6cc1\u6e2c\u5b9a\u30b5\u30fc\u30d0\u30fc\u3092\u518d\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.restart.network=\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u63d0\u4f9b\u3059\u308b\u3059\u3079\u3066\u306e\u30b5\u30fc\u30d3\u30b9\u304c\u4e2d\u65ad\u3055\u308c\u307e\u3059\u3002\u3053\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.restart.vpc.remark=VPC \u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b?

\u6ce8\u610f\: \u975e\u5197\u9577 VPC \u306e\u5197\u9577\u5316\u306f\u5f37\u5236\u7684\u306b\u30af\u30ea\u30fc\u30f3\u30a2\u30c3\u30d7\u3055\u308c\u307e\u3059. \u307e\u305f\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306f\u6570\u5206\u9593\u5229\u7528\u51fa\u6765\u306a\u304f\u306a\u308a\u307e\u3059.

-message.restart.vpc=VPC \u3092\u518d\u8d77\u52d5\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.restoreVM=VM \u3092\u5fa9\u5143\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.security.group.usage=(\u8a72\u5f53\u3059\u308b\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u3059\u3079\u3066\u9078\u629e\u3059\u308b\u306b\u306f\u3001Ctrl \u30ad\u30fc\u3092\u62bc\u3057\u306a\u304c\u3089\u30af\u30ea\u30c3\u30af\u3057\u3066\u304f\u3060\u3055\u3044) -message.select.affinity.groups=\u3053\u306e VM \u3092\u8ffd\u52a0\u3059\u308b\u30a2\u30d5\u30a3\u30cb\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.select.a.zone=\u30be\u30fc\u30f3\u306f\u901a\u5e38\u3001\u5358\u4e00\u306e\u30c7\u30fc\u30bf\u30bb\u30f3\u30bf\u30fc\u306b\u76f8\u5f53\u3057\u307e\u3059\u3002\u8907\u6570\u306e\u30be\u30fc\u30f3\u3092\u8a2d\u5b9a\u3057\u3001\u7269\u7406\u7684\u306b\u5206\u96e2\u3057\u3066\u5197\u9577\u6027\u3092\u6301\u305f\u305b\u308b\u3053\u3068\u306b\u3088\u308a\u3001\u30af\u30e9\u30a6\u30c9\u306e\u4fe1\u983c\u6027\u3092\u9ad8\u3081\u307e\u3059\u3002 -message.select.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.select.iso=\u65b0\u3057\u3044\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e ISO \u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.select.item=\u9805\u76ee\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.select.security.groups=\u65b0\u3057\u3044\u4eee\u60f3\u30de\u30b7\u30f3\u306e\u30bb\u30ad\u30e5\u30ea\u30c6\u30a3 \u30b0\u30eb\u30fc\u30d7\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.select.template=\u65b0\u3057\u3044\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.select.tier=\u968e\u5c64\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.set.default.NIC.manual=\u4eca\u3059\u3050\u306b\u3053\u306e VM \u306e\u30c7\u30d5\u30a9\u30eb\u30c8 NIC \u3092\u624b\u52d5\u3067\u66f4\u65b0\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.set.default.NIC=\u3053\u306e NIC \u3092\u3053\u306e VM \u306e\u30c7\u30d5\u30a9\u30eb\u30c8\u306b\u8a2d\u5b9a\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.setup.physical.network.during.zone.creation.basic=\u57fa\u672c\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u3068\u304d\u306f\u3001\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u4e0a\u306e NIC \u306b\u5bfe\u5fdc\u3059\u308b 1 \u3064\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3067\u304d\u307e\u3059\u3002\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306f\u3044\u304f\u3064\u304b\u306e\u7a2e\u985e\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u4f1d\u9001\u3057\u307e\u3059\u3002

\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u307b\u304b\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u3092\u30c9\u30e9\u30c3\u30b0 \u30a2\u30f3\u30c9 \u30c9\u30ed\u30c3\u30d7\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002 -message.setup.physical.network.during.zone.creation=\u62e1\u5f35\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u3068\u304d\u306f\u30011 \u3064\u4ee5\u4e0a\u306e\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u5404\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306f\u30cf\u30a4\u30d1\u30fc\u30d0\u30a4\u30b6\u30fc\u4e0a\u306e 1 \u3064\u306e NIC \u306b\u5bfe\u5fdc\u3057\u307e\u3059\u3002\u5404\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u306f\u3001\u7d44\u307f\u5408\u308f\u305b\u306b\u5236\u9650\u304c\u3042\u308a\u307e\u3059\u304c\u30011 \u3064\u4ee5\u4e0a\u306e\u7a2e\u985e\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u901a\u4fe1\u3067\u304d\u307e\u3059\u3002

\u5404\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306b\u5bfe\u3057\u3066\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u306e\u7a2e\u985e\u3092\u30c9\u30e9\u30c3\u30b0 \u30a2\u30f3\u30c9 \u30c9\u30ed\u30c3\u30d7\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.setup.successful=\u30af\u30e9\u30a6\u30c9\u304c\u30bb\u30c3\u30c8\u30a2\u30c3\u30d7\u3055\u308c\u307e\u3057\u305f\u3002 -message.snapshot.schedule=\u4ee5\u4e0b\u306e\u5229\u7528\u53ef\u80fd\u306a\u30aa\u30d7\u30b7\u30e7\u30f3\u3092\u9078\u629e\u3057\u30dd\u30ea\u30b7\u30fc\u53c2\u7167\u3092\u9069\u7528\u3059\u308b\u3053\u3068\u3067\u30b9\u30b1\u30b8\u30e5\u30fc\u30ea\u30f3\u30b0\u306b\u3088\u308b\u9023\u7d9a\u3057\u305f\u30b9\u30ca\u30c3\u30d7\u30b7\u30e7\u30c3\u30c8\u3092\u8a2d\u5b9a\u3067\u304d\u307e\u3059 -message.specifiy.tag.key.value=\u30bf\u30b0 \u30ad\u30fc\u304a\u3088\u3073\u5024\u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044 -message.specify.url=URL \u3092\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044 -message.step.1.continue=\u7d9a\u884c\u3059\u308b\u306b\u306f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u307e\u305f\u306f ISO \u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 -message.step.1.desc=\u65b0\u3057\u3044\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u7528\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002ISO \u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3067\u304d\u308b\u7a7a\u767d\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u9078\u629e\u3059\u308b\u3053\u3068\u3082\u3067\u304d\u307e\u3059\u3002 -message.step.2.continue=\u7d9a\u884c\u3059\u308b\u306b\u306f\u30b5\u30fc\u30d3\u30b9 \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 -message.step.3.continue=\u7d9a\u884c\u3059\u308b\u306b\u306f\u30c7\u30a3\u30b9\u30af \u30aa\u30d5\u30a1\u30ea\u30f3\u30b0\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 -message.step.4.continue=\u7d9a\u884c\u3059\u308b\u306b\u306f\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044 -message.step.4.desc=\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u304c\u63a5\u7d9a\u3059\u308b\u30d7\u30e9\u30a4\u30de\u30ea \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.storage.traffic=\u30db\u30b9\u30c8\u3084 CloudStack \u30b7\u30b9\u30c6\u30e0 VM \u306a\u3069\u3001\u7ba1\u7406\u30b5\u30fc\u30d0\u30fc\u3068\u901a\u4fe1\u3059\u308b CloudStack \u306e\u5185\u90e8\u30ea\u30bd\u30fc\u30b9\u9593\u306e\u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3067\u3059\u3002\u3053\u3053\u3067\u30b9\u30c8\u30ec\u30fc\u30b8 \u30c8\u30e9\u30d5\u30a3\u30c3\u30af\u3092\u69cb\u6210\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.suspend.project=\u3053\u306e\u30d7\u30ed\u30b8\u30a7\u30af\u30c8\u3092\u4e00\u6642\u505c\u6b62\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.systems.vms.ready=\u30b7\u30b9\u30c6\u30e0 VM \u306e\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\u3002 -message.template.copying=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u30b3\u30d4\u30fc\u3057\u3066\u3044\u307e\u3059\u3002 -message.template.desc=VM \u306e\u8d77\u52d5\u306b\u4f7f\u7528\u3067\u304d\u308b OS \u30a4\u30e1\u30fc\u30b8 -message.tier.required=\u968e\u5c64\u306f\u5fc5\u9808\u3067\u3059 -message.tooltip.dns.1=\u30be\u30fc\u30f3\u5185\u306e VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.tooltip.dns.2=\u30be\u30fc\u30f3\u5185\u306e VM \u3067\u4f7f\u7528\u3059\u308b 2 \u756a\u76ee\u306e DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30be\u30fc\u30f3\u306e\u30d1\u30d6\u30ea\u30c3\u30af IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.tooltip.internal.dns.1=\u30be\u30fc\u30f3\u5185\u306e CloudStack \u5185\u90e8\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.tooltip.internal.dns.2=\u30be\u30fc\u30f3\u5185\u306e CloudStack \u5185\u90e8\u30b7\u30b9\u30c6\u30e0 VM \u3067\u4f7f\u7528\u3059\u308b DNS \u30b5\u30fc\u30d0\u30fc\u306e\u540d\u524d\u3067\u3059\u3002\u30dd\u30c3\u30c9\u306e\u30d7\u30e9\u30a4\u30d9\u30fc\u30c8 IP \u30a2\u30c9\u30ec\u30b9\u304b\u3089\u3001\u3053\u306e\u30b5\u30fc\u30d0\u30fc\u306b\u901a\u4fe1\u3067\u304d\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.tooltip.network.domain=DNS \u30b5\u30d5\u30a3\u30c3\u30af\u30b9\u3067\u3059\u3002\u3053\u306e\u30b5\u30d5\u30a3\u30c3\u30af\u30b9\u304b\u3089\u30b2\u30b9\u30c8 VM \u3067\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u306e\u30ab\u30b9\u30bf\u30e0 \u30c9\u30e1\u30a4\u30f3\u540d\u304c\u4f5c\u6210\u3055\u308c\u307e\u3059\u3002 -message.tooltip.pod.name=\u3053\u306e\u30dd\u30c3\u30c9\u306e\u540d\u524d\u3067\u3059\u3002 -message.tooltip.reserved.system.gateway=\u30dd\u30c3\u30c9\u5185\u306e\u30db\u30b9\u30c8\u306e\u30b2\u30fc\u30c8\u30a6\u30a7\u30a4\u3067\u3059\u3002 -message.tooltip.reserved.system.netmask=\u30dd\u30c3\u30c9\u306e\u30b5\u30d6\u30cd\u30c3\u30c8\u3092\u5b9a\u7fa9\u3059\u308b\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30d7\u30ec\u30d5\u30a3\u30c3\u30af\u30b9\u3067\u3059\u3002CIDR \u8868\u8a18\u3092\u4f7f\u7528\u3057\u307e\u3059\u3002 -message.tooltip.zone.name=\u30be\u30fc\u30f3\u306e\u540d\u524d\u3067\u3059\u3002 -message.update.os.preference=\u3053\u306e\u30db\u30b9\u30c8\u306e OS \u57fa\u672c\u8a2d\u5b9a\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002\u540c\u69d8\u306e\u57fa\u672c\u8a2d\u5b9a\u3092\u6301\u3064\u3059\u3079\u3066\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306f\u3001\u5225\u306e\u30db\u30b9\u30c8\u3092\u9078\u629e\u3059\u308b\u524d\u306b\u307e\u305a\u3053\u306e\u30db\u30b9\u30c8\u306b\u5272\u308a\u5f53\u3066\u3089\u308c\u307e\u3059\u3002 -message.update.resource.count=\u3053\u306e\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u30ea\u30bd\u30fc\u30b9\u6570\u3092\u66f4\u65b0\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.update.ssl.failed=SSL \u8a3c\u660e\u66f8\u306e\u66f4\u65b0\u306b\u5931\u6557\u3057\u307e\u3057\u305f\u3002 -message.update.ssl.succeeded=SSL \u8a3c\u660e\u66f8\u306e\u66f4\u65b0\u306b\u6210\u529f\u3057\u307e\u3057\u305f -message.update.ssl=\u5404\u30b3\u30f3\u30bd\u30fc\u30eb \u30d7\u30ed\u30ad\u30b7\u304a\u3088\u3073\u30bb\u30ab\u30f3\u30c0\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u306e\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3067\u66f4\u65b0\u3059\u308b\u3001X.509 \u6e96\u62e0\u306e\u65b0\u3057\u3044 SSL \u8a3c\u660e\u66f8\u3092\u9001\u4fe1\u3057\u3066\u304f\u3060\u3055\u3044\: -message.validate.accept=\u6709\u52b9\u306a\u62e1\u5f35\u5b50\u3092\u6301\u3064\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.creditcard=\u30af\u30ec\u30b8\u30c3\u30c8 \u30ab\u30fc\u30c9\u756a\u53f7\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.date.ISO=\u65e5\u4ed8\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044 (ISO)\u3002 -message.validate.date=\u65e5\u4ed8\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.digits=\u6570\u5b57\u306e\u307f\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.email.address=\u30e1\u30fc\u30eb \u30a2\u30c9\u30ec\u30b9\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.equalto=\u540c\u3058\u5024\u3092\u518d\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.fieldrequired=\u3053\u308c\u306f\u5fc5\u9808\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3067\u3059\u3002 -message.validate.fixfield=\u3053\u306e\u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u4fee\u6b63\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.instance.name=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u540d\u306f 63 \u6587\u5b57\u4ee5\u5185\u3067\u6307\u5b9a\u3057\u3066\u304f\u3060\u3055\u3044\u3002ASCII \u6587\u5b57\u306e a\uff5ez\u3001A\uff5eZ\u3001\u6570\u5b57\u306e 0\uff5e9\u3001\u304a\u3088\u3073\u30cf\u30a4\u30d5\u30f3\u306e\u307f\u3092\u4f7f\u7528\u3067\u304d\u307e\u3059\u3002\u6587\u5b57\u3067\u59cb\u307e\u308a\u3001\u6587\u5b57\u307e\u305f\u306f\u6570\u5b57\u3067\u7d42\u308f\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002 -message.validate.invalid.characters=\u7121\u52b9\u306a\u6587\u5b57\u304c\u898b\u3064\u304b\u308a\u307e\u3057\u305f\u3002\u4fee\u6574\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.max={0} \u4ee5\u4e0b\u306e\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.maxlength={0} \u6587\u5b57\u4ee5\u4e0b\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.minlength={0} \u6587\u5b57\u4ee5\u4e0a\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.number=\u6570\u5024\u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.range={0} \uff5e {1} \u306e\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.range.length={0} \uff5e {1} \u6587\u5b57\u3067\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.validate.URL=URL \u3092\u6b63\u3057\u304f\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.virtual.network.desc=\u30a2\u30ab\u30a6\u30f3\u30c8\u306e\u5c02\u7528\u4eee\u60f3\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3067\u3059\u3002\u30d6\u30ed\u30fc\u30c9\u30ad\u30e3\u30b9\u30c8 \u30c9\u30e1\u30a4\u30f3\u306f VLAN \u5185\u306b\u914d\u7f6e\u3055\u308c\u3001\u30d1\u30d6\u30ea\u30c3\u30af \u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3078\u306e\u30a2\u30af\u30bb\u30b9\u306f\u3059\u3079\u3066\u4eee\u60f3\u30eb\u30fc\u30bf\u30fc\u306b\u3088\u3063\u3066\u30eb\u30fc\u30c6\u30a3\u30f3\u30b0\u3055\u308c\u307e\u3059\u3002 -message.vm.create.template.confirm=\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3059\u308b\u3068 VM \u304c\u81ea\u52d5\u7684\u306b\u518d\u8d77\u52d5\u3055\u308c\u307e\u3059\u3002 -message.vm.review.launch=\u6b21\u306e\u60c5\u5831\u3092\u53c2\u7167\u3057\u3066\u3001\u4eee\u60f3\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u3092\u6b63\u3057\u304f\u8a2d\u5b9a\u3057\u305f\u3053\u3068\u3092\u78ba\u8a8d\u3057\u3066\u304b\u3089\u8d77\u52d5\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.vnmc.available.list=\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u4e00\u89a7\u3067 VNMC \u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002 -message.vnmc.not.available.list=\u30d7\u30ed\u30d0\u30a4\u30c0\u30fc\u4e00\u89a7\u3067 VNMC \u3092\u5229\u7528\u3067\u304d\u307e\u305b\u3093\u3002 -message.volume.create.template.confirm=\u3053\u306e\u30c7\u30a3\u30b9\u30af \u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u3092\u4f5c\u6210\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? \u30dc\u30ea\u30e5\u30fc\u30e0 \u30b5\u30a4\u30ba\u306b\u3088\u3063\u3066\u306f\u3001\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u4f5c\u6210\u306b\u306f\u6570\u5206\u4ee5\u4e0a\u304b\u304b\u308b\u53ef\u80fd\u6027\u304c\u3042\u308a\u307e\u3059\u3002 -message.waiting.for.builtin.templates.to.load=\u7d44\u307f\u8fbc\u307f\u30c6\u30f3\u30d7\u30ec\u30fc\u30c8\u306e\u30ed\u30fc\u30c9\u3092\u5f85\u6a5f\u3057\u3066\u3044\u307e\u3059... -message.XSTools61plus.update.failed=[\u5143\u306e XS \u30d0\u30fc\u30b8\u30e7\u30f3\u306f 6.1 \u4ee5\u964d] \u30d5\u30a3\u30fc\u30eb\u30c9\u3092\u66f4\u65b0\u3067\u304d\u307e\u305b\u3093\u3067\u3057\u305f\u3002\u30a8\u30e9\u30fc\: -message.you.must.have.at.least.one.physical.network=\u5c11\u306a\u304f\u3068\u3082 1 \u3064\u7269\u7406\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u304c\u5fc5\u8981\u3067\u3059 -message.your.cloudstack.is.ready=CloudStack \u306e\u6e96\u5099\u304c\u3067\u304d\u307e\u3057\u305f\! -message.Zone.creation.complete=\u30be\u30fc\u30f3\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f -message.zone.creation.complete.would.you.like.to.enable.this.zone=\u30be\u30fc\u30f3\u304c\u4f5c\u6210\u3055\u308c\u307e\u3057\u305f\u3002\u3053\u306e\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -message.zone.no.network.selection=\u9078\u629e\u3057\u305f\u30be\u30fc\u30f3\u3067\u306f\u3001\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u3092\u9078\u629e\u3067\u304d\u307e\u305b\u3093\u3002 -message.zone.step.1.desc=\u30be\u30fc\u30f3\u306e\u30cd\u30c3\u30c8\u30ef\u30fc\u30af \u30e2\u30c7\u30eb\u3092\u9078\u629e\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.zone.step.2.desc=\u65b0\u3057\u3044\u30be\u30fc\u30f3\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.zone.step.3.desc=\u65b0\u3057\u3044\u30dd\u30c3\u30c9\u3092\u8ffd\u52a0\u3059\u308b\u305f\u3081\u306b\u3001\u6b21\u306e\u60c5\u5831\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -message.zoneWizard.enable.local.storage=\u8b66\u544a\: \u3053\u306e\u30be\u30fc\u30f3\u306e\u30ed\u30fc\u30ab\u30eb \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u6709\u52b9\u306b\u3059\u308b\u5834\u5408\u306f\u3001\u30b7\u30b9\u30c6\u30e0 VM \u306e\u8d77\u52d5\u5834\u6240\u306b\u5fdc\u3058\u3066\u6b21\u306e\u64cd\u4f5c\u304c\u5fc5\u8981\u3067\u3059\u3002

1. \u30b7\u30b9\u30c6\u30e0 VM \u3092\u5171\u6709\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3067\u8d77\u52d5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u5171\u6709\u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3092\u4f5c\u6210\u3057\u305f\u5f8c\u3067\u30be\u30fc\u30f3\u306b\u8ffd\u52a0\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002\u30be\u30fc\u30f3\u3092\u7121\u52b9\u72b6\u614b\u304b\u3089\u958b\u59cb\u3059\u308b\u5fc5\u8981\u3082\u3042\u308a\u307e\u3059\u3002

2. \u30b7\u30b9\u30c6\u30e0 VM \u3092\u30ed\u30fc\u30ab\u30eb \u30d7\u30e9\u30a4\u30de\u30ea \u30b9\u30c8\u30ec\u30fc\u30b8\u3067\u8d77\u52d5\u3059\u308b\u5fc5\u8981\u304c\u3042\u308b\u5834\u5408\u306f\u3001\u30be\u30fc\u30f3\u3092\u6709\u52b9\u306b\u3059\u308b\u524d\u306b system.vm.use.local.storage \u3092 true \u306b\u8a2d\u5b9a\u3059\u308b\u5fc5\u8981\u304c\u3042\u308a\u307e\u3059\u3002


\u7d9a\u884c\u3057\u3066\u3082\u3088\u308d\u3057\u3044\u3067\u3059\u304b? -messgae.validate.min={0} \u4ee5\u4e0a\u306e\u5024\u3092\u5165\u529b\u3057\u3066\u304f\u3060\u3055\u3044\u3002 -mode=\u30e2\u30fc\u30c9 -network.rate=\u30cd\u30c3\u30c8\u30ef\u30fc\u30af\u901f\u5ea6 -notification.reboot.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u518d\u8d77\u52d5 -notification.start.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u8d77\u52d5 -notification.stop.instance=\u30a4\u30f3\u30b9\u30bf\u30f3\u30b9\u306e\u505c\u6b62 -side.by.side=\u4e26\u5217 -state.Accepted=\u627f\u8afe\u6e08\u307f -state.Active=\u30a2\u30af\u30c6\u30a3\u30d6 -state.Allocated=\u5272\u308a\u5f53\u3066\u6e08\u307f -state.Allocating=\u5272\u308a\u5f53\u3066\u4e2d -state.BackedUp=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u6e08\u307f -state.BackingUp=\u30d0\u30c3\u30af\u30a2\u30c3\u30d7\u4e2d -state.Completed=\u5b8c\u4e86 -state.Creating=\u4f5c\u6210\u4e2d -state.Declined=\u8f9e\u9000 -state.Destroyed=\u7834\u68c4\u6e08\u307f -state.detached=\u30c7\u30bf\u30c3\u30c1\u6e08\u307f -state.Disabled=\u7121\u52b9 -state.Enabled=\u6709\u52b9 -state.Error=\u30a8\u30e9\u30fc -state.Expunging=\u62b9\u6d88\u4e2d -state.Migrating=\u79fb\u884c\u4e2d -state.Pending=\u4fdd\u7559 -state.Ready=\u6e96\u5099\u5b8c\u4e86 -state.Running=\u5b9f\u884c\u4e2d -state.Starting=\u958b\u59cb\u4e2d -state.Stopped=\u505c\u6b62\u6e08\u307f -state.Stopping=\u505c\u6b62\u3057\u3066\u3044\u307e\u3059 -state.Suspended=\u4e00\u6642\u505c\u6b62 -title.upload.volume=\u30dc\u30ea\u30e5\u30fc\u30e0\u306e\u30a2\u30c3\u30d7\u30ed\u30fc\u30c9 -ui.listView.filters.all=\u3059\u3079\u3066 -ui.listView.filters.mine=\u81ea\u5206\u306e\u3082\u306e diff --git a/client/WEB-INF/classes/resources/messages_ko_KR.properties b/client/WEB-INF/classes/resources/messages_ko_KR.properties deleted file mode 100644 index 28d1ecb926f4..000000000000 --- a/client/WEB-INF/classes/resources/messages_ko_KR.properties +++ /dev/null @@ -1,1478 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=\ud56d\ubaa9 \uc18d\uc131 \ubcc0\uacbd -confirm.enable.s3=S3 \uae30\ubc18 2\ucc28 \uc800\uc7a5\uc18c \uc9c0\uc6d0\uc744 \ud558\ub824\uba74 \uc544\ub798 \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -confirm.enable.swift=Swift \uae30\uc220 \uc9c0\uc6d0\ub97c \uc0ac\uc6a9 \ud558\ub824\uba74 \ub2e4\uc74c \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -error.could.not.change.your.password.because.ldap.is.enabled=LDAP \uae30\ub2a5\uc774 \ud65c\uc131\ud654 \ub418\uc5b4 \uc788\uae30 \ub54c\ubb38\uc5d0 \ud328\uc2a4\uc6cc\ub4dc \ubcc0\uacbd\uc744 \uc2e4\ud328\ud558\uc600\uc2b5\ub2c8\ub2e4. -error.could.not.enable.zone=Zone\uc744 \uc0ac\uc6a9 \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -error.installWizard.message=\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc2dc \uc624\ub958\ub97c \uc218\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -error.invalid.username.password=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc0ac\uc6a9\uc790\uba85 \ub610\ub294 \uc554\ud638 -error.login=\uc0ac\uc6a9\uc790\uba85/\uc554\ud638\uac00 \uae30\ub85d\uacfc \uc77c\uce58\ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. -error.menu.select=\ud56d\ubaa9\uc774 \uc120\ud0dd\ub418\uc5b4 \uc788\uc9c0 \uc54a\uae30 \ub54c\ubb38\uc5d0 \uc791\uc5c5\uc744 \uc2e4\ud589\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -error.mgmt.server.inaccessible=\uad00\ub9ac \uc11c\ubc84\uc5d0 \uc811\uadfc \ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c\uc5d0 \uc7ac\uc2e4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624. -error.password.not.match=\uc554\ud638\uac00 \uc77c\uce58\ud558\uc9c0 \uc54a\uc74c -error.please.specify.physical.network.tags=\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \ud0dc\uadf8\ub97c \uc9c0\uc815\ud558\uc9c0 \uc54a\uc73c\uba74, \ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uc740 \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -error.session.expired=\uc138\uc158 \uc720\ud6a8\uae30\uac04\uc774 \ub04a\uc5b4\uc84c\uc2b5\ub2c8\ub2e4. -error.something.went.wrong.please.correct.the.following=\ubb38\uc81c\uac00 \ubc1c\uc0dd\ud588\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \ub0b4\uc6a9\uc744 \uc218\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624 -error.unable.to.reach.management.server=\uad00\ub9ac \uc11c\ubc84\uc640 \ud1b5\uc2e0\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -error.unresolved.internet.name=\uc778\ud130\ub137 \uc8fc\uc18c\ub97c \uc54c\uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -force.delete.domain.warning=\uacbd\uace0\:\uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud558\uba74, \ubaa8\ub4e0 \ub0b4\ubd80 \ub3c4\uba54\uc778 \ubc0f \uad00\ub828\ud558\ub294 \ubaa8\ub4e0 \uacc4\uc815 \uc815\ubcf4\uc640 \uadf8 \uc790\uc6d0\uc774 \uc0ad\uc81c\ub429\ub2c8\ub2e4. -force.delete=\uac15\uc81c \uc0ad\uc81c -force.remove.host.warning=\uacbd\uace0\:\uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud558\uba74, \uc2e4\ud589\uc911 \ubaa8\ub4e0 \uac00\uc0c1 \uba38\uc2e0\uc774 \uac15\uc81c\uc801\uc73c\ub85c \uc815\uc9c0\ub418\uc5b4 \ud074\ub7ec\uc2a4\ud130\uc5d0\uc11c \ud638\uc2a4\ud2b8\uac00 \uac15\uc81c\uc801\uc73c\ub85c \ud574\uc81c\ub429\ub2c8\ub2e4. -force.remove=\uac15\uc81c \ud574\uc81c -force.stop.instance.warning=\uacbd\uace0\: \uc778\uc2a4\ud134\uc2a4 \uac15\uc81c \uc815\uc9c0\ub294 \ucd5c\uc885 \uc218\ub2e8\uc73c\ub85c \ud574 \uc8fc\uc2ed\uc2dc\uc624. \ub370\uc774\ud130\uac00 \uc190\uc2e4\ub420 \ubfd0\ub9cc \uc544\ub2c8\ub77c \uac00\uc0c1 \uba38\uc2e0 \ub3d9\uc791\uc774 \uc77c\uad00\ud558\uc9c0 \uc54a\uac8c \ub420 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4. -force.stop=\uac15\uc81c \uc815\uc9c0 -ICMP.code=ICMP \ucf54\ub4dc -ICMP.type=ICMP \uc885\ub958 -image.directory=\uc774\ubbf8\uc9c0 \ub514\ub809\ud1a0\ub9ac -inline=\uc9c1\ub82c -instances.actions.reboot.label=\uc778\uc2a4\ud134\uc2a4 \uc7ac\uc2dc\uc791 -label.about.app=CloudStack \uc18c\uac1c -label.about=\uc18c\uac1c -label.accept.project.invitation=\ud504\ub85c\uc81d\ud2b8 \ucd08\ub300 \uc2b9\uc778 -label.account.and.security.group=\uacc4\uc815 \uc815\ubcf4, \ubcf4\uc548 \uadf8\ub8f9 -label.account.id=\uacc4\uc815 \uc815\ubcf4 ID -label.account.name=\uacc4\uc815 \uc815\ubcf4\uba85 -label.account.specific=\uacc4\uc815 \uc815\ubcf4 \uace0\uc720 -label.accounts=\uacc4\uc815 \uc815\ubcf4 -label.account=\uacc4\uc815 \uc815\ubcf4 -label.acquire.new.ip=\uc0c8\ub85c\uc6b4 IP \uc8fc\uc18c \ucde8\ub4dd -label.acquire.new.secondary.ip=\uc0c8\ub85c\uc6b4 \ub450\ubc88\uc9f8 IP \uc8fc\uc18c \ucde8\ub4dd -label.action.attach.disk.processing=\ub514\uc2a4\ud06c\ub97c \uc5f0\uacb0\ud558\ub294 \uc911... -label.action.attach.disk=\ub514\uc2a4\ud06c \uc5f0\uacb0 -label.action.attach.iso=ISO \uc5f0\uacb0 -label.action.attach.iso.processing=ISO\ub97c \uc5f0\uacb0\ud558\ub294 \uc911... -label.action.cancel.maintenance.mode.processing=\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub97c \ucde8\uc18c\ud558\ub294 \uc911... -label.action.cancel.maintenance.mode=\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc \ucde8\uc18c -label.action.change.password=\uc554\ud638 \ubcc0\uacbd -label.action.change.service.processing=\uc11c\ube44\uc2a4\ub97c \ubcc0\uacbd\ud558\ub294 \uc911... -label.action.change.service=\uc11c\ube44\uc2a4 \ubcc0\uacbd -label.action.copy.ISO=ISO \ubcf5\uc0ac -label.action.copy.template=\ud15c\ud50c\ub9bf \ubcf5\uc0ac -label.action.create.template.from.vm=VM\uc5d0\uc11c \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30 -label.action.create.template.from.volume=\ubcfc\ub968\uc5d0\uc11c \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30 -label.action.create.template.processing=\ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4dc\ub294 \uc911... -label.action.create.template=\ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30 -label.action.create.vm.processing=VM\ub97c \ub9cc\ub4dc\ub294 \uc911... -label.action.create.vm=VM \ub9cc\ub4e4\uae30 -label.action.create.volume.processing=\ubcfc\ub968\uc744 \ub9cc\ub4dc\ub294 \uc911... -label.action.create.volume=\ubcfc\ub968 \ub9cc\ub4e4\uae30 -label.action.delete.account.processing=\uacc4\uc815 \uc815\ubcf4\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.account=\uacc4\uc815 \uc815\ubcf4 \uc0ad\uc81c -label.action.delete.cluster.processing=\ud074\ub7ec\uc2a4\ud130\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.cluster=\ud074\ub7ec\uc2a4\ud130 \uc0ad\uc81c -label.action.delete.disk.offering.processing=\ub514\uc2a4\ud06c \uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.disk.offering=\ub514\uc2a4\ud06c \uc81c\uacf5 \uc0ad\uc81c -label.action.delete.domain.processing=\ub3c4\uba54\uc778\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.domain=\ub3c4\uba54\uc778 \uc0ad\uc81c -label.action.delete.firewall.processing=\ubc29\ud654\ubcbd(fire wall)\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.firewall=\ubc29\ud654\ubcbd(fire wall) \uaddc\uce59 \uc0ad\uc81c -label.action.delete.ingress.rule.processing=\uc218\uc2e0 \uaddc\uce59\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.ingress.rule=\uc218\uc2e0 \uaddc\uce59 \uc0ad\uc81c -label.action.delete.IP.range=IP \uc8fc\uc18c \ubc94\uc704 \uc0ad\uc81c -label.action.delete.IP.range.processing=IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.ISO=ISO \uc0ad\uc81c -label.action.delete.ISO.processing=ISO\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.load.balancer.processing=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.load.balancer=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59 \uc0ad\uc81c -label.action.delete.network.processing=\ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.network=\ub124\ud2b8\uc6cc\ud06c \uc0ad\uc81c -label.action.delete.nexusVswitch=Nexus 1000V \uc0ad\uc81c -label.action.delete.physical.network=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uc0ad\uc81c -label.action.delete.pod=Pod \uc0ad\uc81c -label.action.delete.pod.processing=Pod\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.primary.storage.processing=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.primary.storage=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ad\uc81c -label.action.delete.secondary.storage=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ad\uc81c -label.action.delete.secondary.storage.processing=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.security.group.processing=\ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.security.group=\ubcf4\uc548 \uadf8\ub8f9 \uc0ad\uc81c -label.action.delete.service.offering.processing=\uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.service.offering=\uc11c\ube44\uc2a4\uc81c\uacf5 \uc0ad\uc81c -label.action.delete.snapshot.processing=\uc2a4\ub0c5\uc0f7\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.snapshot=\uc2a4\ub0c5\uc0f7 \uc0ad\uc81c -label.action.delete.system.service.offering=\uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5 \uc0ad\uc81c -label.action.delete.template.processing=\ud15c\ud50c\ub9bf\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.template=\ud15c\ud50c\ub9bf \uc0ad\uc81c -label.action.delete.user.processing=\uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.user=\uc0ac\uc6a9\uc790 \uc0ad\uc81c -label.action.delete.volume.processing=\ubcfc\ub968\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.volume=\ubcfc\ub968 \uc0ad\uc81c -label.action.delete.zone.processing=Zone\uc744 \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.delete.zone=Zone \uc0ad\uc81c -label.action.destroy.instance.processing=\uc778\uc2a4\ud134\uc2a4\ub97c \ud30c\uae30\ud558\ub294 \uc911... -label.action.destroy.instance=\uc778\uc2a4\ud134\uc2a4 \ud30c\uae30 -label.action.destroy.systemvm.processing=\uc2dc\uc2a4\ud15c VM\ub97c \ud30c\uae30\ud558\ub294 \uc911... -label.action.destroy.systemvm=\uc2dc\uc2a4\ud15c VM \ud30c\uae30 -label.action.detach.disk.processing=\ub514\uc2a4\ud06c\ub97c \ubd84\ub9ac \ud558\ub294 \uc911... -label.action.detach.disk=\ub514\uc2a4\ud06c \ubd84\ub9ac -label.action.detach.iso=ISO \ubd84\ub9ac -label.action.detach.iso.processing=ISO\ub97c \ubd84\ub9ac \ud558\ub294 \uc911... -label.action.disable.account.processing=\uacc4\uc815 \uc815\ubcf4\ub97c \uc911\uc9c0\ud558\ub294 \uc911... -label.action.disable.account=\uacc4\uc815 \uc815\ubcf4 \uc911\uc9c0 -label.action.disable.cluster.processing=\ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911... -label.action.disable.cluster=\ud074\ub7ec\uc2a4\ud130 \uc0ac\uc6a9 \uc548 \ud568 -label.action.disable.nexusVswitch=Nexus 1000V \uc0ac\uc6a9 \uc548 \ud568 -label.action.disable.physical.network=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9 \uc548 \ud568 -label.action.disable.pod=Pod \uc0ac\uc6a9 \uc548 \ud568 -label.action.disable.pod.processing=Pod\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911... -label.action.disable.static.NAT.processing=\uc815\uc801 NAT\ub97c \uc911\uc9c0\ud558\ub294 \uc911... -label.action.disable.static.NAT=\uc815\uc801 NAT \uc0ac\uc6a9 \uc548 \ud568 -label.action.disable.user.processing=\uc0ac\uc6a9\uc790\ub97c \uc911\uc9c0\ud558\ub294 \uc911... -label.action.disable.user=\uc0ac\uc6a9\uc790 \uc911\uc9c0 -label.action.disable.zone.processing=Zone\uc744 \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911... -label.action.disable.zone=Zone \uc0ac\uc6a9 \uc548 \ud568 -label.action.download.ISO=ISO \ub2e4\uc6b4\ub85c\ub4dc -label.action.download.template=\ud15c\ud50c\ub9bf \ub2e4\uc6b4\ub85c\ub4dc -label.action.download.volume.processing=\ubcfc\ub968\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub294 \uc911... -label.action.download.volume=\ubcfc\ub968 \ub2e4\uc6b4\ub85c\ub4dc -label.action.edit.account=\uacc4\uc815 \uc815\ubcf4 \ud3b8\uc9d1 -label.action.edit.disk.offering=\ub514\uc2a4\ud06c \uc81c\uacf5 \ud3b8\uc9d1 -label.action.edit.domain=\ub3c4\uba54\uc778 \ud3b8\uc9d1 -label.action.edit.global.setting=\uae00\ub85c\ubc8c \uc124\uc815 \ud3b8\uc9d1 -label.action.edit.host=\ud638\uc2a4\ud2b8 \ud3b8\uc9d1 -label.action.edit.instance=\uc778\uc2a4\ud134\uc2a4 \ud3b8\uc9d1 -label.action.edit.ISO=ISO \ud3b8\uc9d1 -label.action.edit.network.offering=\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 \ud3b8\uc9d1 -label.action.edit.network.processing=\ub124\ud2b8\uc6cc\ud06c\ub97c \ud3b8\uc9d1\ud558\ub294 \uc911... -label.action.edit.network=\ub124\ud2b8\uc6cc\ud06c \ud3b8\uc9d1 -label.action.edit.pod=Pod \ud3b8\uc9d1 -label.action.edit.primary.storage=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ud3b8\uc9d1 -label.action.edit.resource.limits=\uc790\uc6d0 \uc81c\ud55c \ud3b8\uc9d1 -label.action.edit.service.offering=\uc11c\ube44\uc2a4 \uc81c\uacf5 \ud3b8\uc9d1 -label.action.edit.template=\ud15c\ud50c\ub9bf \ud3b8\uc9d1 -label.action.edit.user=\uc0ac\uc6a9\uc790 \ud3b8\uc9d1 -label.action.edit.zone=Zone \ud3b8\uc9d1 -label.action.enable.account.processing=\uacc4\uc815 \uc815\ubcf4\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911... -label.action.enable.account=\uacc4\uc815 \uc815\ubcf4 \uc0ac\uc6a9\ud568 -label.action.enable.cluster.processing=\ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911... -label.action.enable.cluster=\ud074\ub7ec\uc2a4\ud130 \uc0ac\uc6a9\ud568 -label.action.enable.maintenance.mode.processing=\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911... -label.action.enable.maintenance.mode=\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc \uc0ac\uc6a9\ud568 -label.action.enable.nexusVswitch=Nexus 1000V \uc0ac\uc6a9\ud568 -label.action.enable.physical.network=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc6a9\ud568 -label.action.enable.pod=Pod \uc0ac\uc6a9\ud568 -label.action.enable.pod.processing=Pod\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911... -label.action.enable.static.NAT.processing=\uc815\uc801 NAT\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911... -label.action.enable.static.NAT=\uc815\uc801 NAT \uc0ac\uc6a9\ud568 -label.action.enable.user.processing=\uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9 \uc124\uc815 \uc911... -label.action.enable.user=\uc0ac\uc6a9\uc790 \uc0ac\uc6a9\ud568 -label.action.enable.zone.processing=Zone\uc744 \uc0ac\uc6a9 \uc124\uc815 \uc911... -label.action.enable.zone=Zone \uc0ac\uc6a9\ud568 -label.action.force.reconnect.processing=\uc7ac\uc811\uc18d\ud558\ub294 \uc911... -label.action.force.reconnect=\uac15\uc81c\uc7ac\uc811\uc18d -label.action.generate.keys.processing=\ud0a4\ub97c \uc0dd\uc131\ud558\ub294 \uc911... -label.action.generate.keys=\ud0a4 \uc0dd\uc131 -label.action.list.nexusVswitch=Nexus 1000V \ubaa9\ub85d \ud45c\uc2dc -label.action.lock.account.processing=\uacc4\uc815 \uc815\ubcf4\ub97c \uc7a0\uadf8\ub294 \uc911... -label.action.lock.account=\uacc4\uc815 \uc815\ubcf4 \uc7a0\uae08 -label.action.manage.cluster.processing=\ud074\ub7ec\uc2a4\ud130\ub97c \uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\ub294 \uc911... -label.action.manage.cluster=\ud074\ub7ec\uc2a4\ud130 \uad00\ub9ac \ub3d9\uc791 -label.action.migrate.instance.processing=\uc778\uc2a4\ud134\uc2a4\ub97c \uc774\uc804\ud558\ub294 \uc911... -label.action.migrate.instance=\uc778\uc2a4\ud134\uc2a4 \uc774\uc804 -label.action.migrate.router.processing=\ub77c\uc6b0\ud130\ub97c \uc774\uc804\ud558\ub294 \uc911... -label.action.migrate.router=\ub77c\uc6b0\ud130 \uc774\uc804 -label.action.migrate.systemvm.processing=\uc2dc\uc2a4\ud15c VM\ub97c \uc774\uc804\ud558\ub294 \uc911 -label.action.migrate.systemvm=\uc2dc\uc2a4\ud15c VM \uc774\uc804 -label.action.reboot.instance.processing=\uc778\uc2a4\ud134\uc2a4\ub97c \uc7ac\uc2dc\uc791\ud558\ub294 \uc911... -label.action.reboot.instance=\uc778\uc2a4\ud134\uc2a4 \uc7ac\uc2dc\uc791 -label.action.reboot.router.processing=\ub77c\uc6b0\ud130\ub97c \uc7ac\uc2dc\uc791\ud558\ub294 \uc911... -label.action.reboot.router=\ub77c\uc6b0\ud130 \uc7ac\uc2dc\uc791 -label.action.reboot.systemvm.processing=\uc2dc\uc2a4\ud15c VM\ub97c \uc7ac\uc2dc\uc791\ud558\ub294 \uc911... -label.action.reboot.systemvm=\uc2dc\uc2a4\ud15c VM \uc7ac\uc2dc\uc791 -label.action.recurring.snapshot=\uc815\uae30 \uc2a4\ub0c5\uc0f7 -label.action.register.iso=ISO \ub4f1\ub85d -label.action.release.ip=IP \uc8fc\uc18c \ud574\uc81c -label.action.release.ip.processing=IP \uc8fc\uc18c\ub97c \ud574\uc81c\ud558\ub294 \uc911... -label.action.remove.host.processing=\ud638\uc2a4\ud2b8\ub97c \uc0ad\uc81c\ud558\ub294 \uc911... -label.action.remove.host=\ud638\uc2a4\ud2b8 \uc0ad\uc81c -label.action.reset.password.processing=\uc554\ud638\ub97c \uc7ac\uc124\uc815 \ud558\ub294 \uc911... -label.action.reset.password=\uc554\ud638 \uc7ac\uc124\uc815 -label.action.resize.volume.processing=\ubcfc\ub968 \ud06c\uae30 \ubcc0\uacbd \uc911... -label.action.resize.volume=\ubcfc\ub968 \ud06c\uae30 \ubcc0\uacbd -label.action.resource.limits=\uc790\uc6d0 \uc81c\ud55c -label.action.restore.instance.processing=\uc778\uc2a4\ud134\uc2a4\ub97c \ubcf5\uc6d0\ud558\ub294 \uc911... -label.action.restore.instance=\uc778\uc2a4\ud134\uc2a4 \ubcf5\uc6d0 -label.action.start.instance.processing=\uc778\uc2a4\ud134\uc2a4\ub97c \uc2dc\uc791\ud558\ub294 \uc911... -label.action.start.instance=\uc778\uc2a4\ud134\uc2a4 \uc2dc\uc791 -label.action.start.router.processing=\ub77c\uc6b0\ud130\ub97c \uc2dc\uc791\ud558\ub294 \uc911... -label.action.start.router=\ub77c\uc6b0\ud130 \uc2dc\uc791 -label.action.start.systemvm.processing=\uc2dc\uc2a4\ud15c VM\ub97c \uc2dc\uc791\ud558\ub294 \uc911... -label.action.start.systemvm=\uc2dc\uc2a4\ud15c VM \uc2dc\uc791 -label.action.stop.instance.processing=\uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud558\ub294 \uc911... -label.action.stop.instance=\uc778\uc2a4\ud134\uc2a4 \uc815\uc9c0 -label.action.stop.router.processing=\ub77c\uc6b0\ud130\ub97c \uc815\uc9c0\ud558\ub294 \uc911... -label.action.stop.router=\ub77c\uc6b0\ud130 \uc815\uc9c0 -label.action.stop.systemvm.processing=\uc2dc\uc2a4\ud15c VM\ub97c \uc815\uc9c0\ud558\ub294 \uc911... -label.action.stop.systemvm=\uc2dc\uc2a4\ud15c VM \uc815\uc9c0 -label.actions=\uc791\uc5c5 -label.action.take.snapshot.processing=\uc2a4\ub0c5\uc0f7\uc744 \ub9cc\ub4dc\ub294 \uc911.... -label.action.take.snapshot=\uc2a4\ub0c5\uc0f7 \ub9cc\ub4e4\uae30 -label.action.unmanage.cluster.processing=\ud074\ub7ec\uc2a4\ud130\ub97c \ube44\uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\ub294 \uc911... -label.action.unmanage.cluster=\ud074\ub7ec\uc2a4\ud130 \ube44\uad00\ub9ac \ub3d9\uc791 -label.action.update.OS.preference=OS \uae30\ubcf8 \uc124\uc815 \uc5c5\ub370\uc774\ud2b8 -label.action.update.OS.preference.processing=OS \uae30\ubcf8 \uc124\uc815\uc744 \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uc911... -label.action.update.resource.count.processing=\uc790\uc6d0 \uc218\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 \uc911... -label.action.update.resource.count=\uc790\uc6d0 \uc218 \uc5c5\ub370\uc774\ud2b8 -label.action.vmsnapshot.create=VM \uc2a4 -label.action.vmsnapshot.delete=VM -label.action.vmsnapshot.revert=VM \uc2a4\ub0c5\uc0f7 -label.activate.project=\ud504\ub85c\uc81d\ud2b8 \ud65c\uc131\ud654 -label.active.sessions=\ud65c\uc131 \uc138\uc158 -label.add.accounts.to=\uacc4\uc815 \uc815\ubcf4 \ucd94\uac00\: -label.add.accounts=\uacc4\uc815 \uc815\ubcf4 \ucd94\uac00 -label.add.account.to.project=\uacc4\uc815 \uc815\ubcf4 \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd94\uac00 -label.add.account=\uacc4\uc815 \uc815\ubcf4 \ucd94\uac00 -label.add.ACL=\uad8c\ud55c \uad00\ub9ac(ACL) \ucd94\uac00 -label.add.by.cidr=CIDR \ub85c \ucd94\uac00 -label.add.by.group=\uadf8\ub8f9\uc5d0\uc11c \ucd94\uac00 -label.add.by=\ucd94\uac00 \ub2e8\uc704 -label.add.cluster=\ud074\ub7ec\uc2a4\ud130 \ucd94\uac00 -label.add.compute.offering=\ucef4\ud4e8\ud305 \uc790\uc6d0 \ucd94\uac00 -label.add.direct.iprange=\uc9c1\uc811 IP \uc8fc\uc18c \ubc94\uc704 \ucd94\uac00 -label.add.disk.offering=\ub514\uc2a4\ud06c \uc81c\uacf5 \ucd94\uac00 -label.add.domain=\ub3c4\uba54\uc778 \ucd94\uac00 -label.add.egress.rule=\uc804\uc1a1 \uaddc\uce59 \ucd94\uac00 -label.add.F5.device=F5 \uae30\uae30 \ucd94\uac00 -label.add.firewall=\ubc29\ud654\ubcbd(fire wall) \uaddc\uce59 \ucd94\uac00 -label.add.guest.network=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c \ucd94\uac00 -label.add.host=\ud638\uc2a4\ud2b8 \ucd94\uac00 -label.adding.cluster=\ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\uc911... -label.adding.failed=\ucd94\uac00\ud560 \uc218 \uc5c6\uc74c -label.adding.pod=Pod\ub97c \ucd94\uac00 \uac00\ub2a5 -label.adding.processing=\ucd94\uac00\ud558\ub294 \uc911... -label.add.ingress.rule=\uc218\uc2e0 \uaddc\uce59 \ucd94\uac00 -label.adding.succeeded=\ucd94\uac00 \uc644\ub8cc -label.adding=\uc815\ubcf4 \ucd94\uac00 -label.adding.user=\uc0ac\uc6a9\uc790 \ucd94\uac00 -label.adding.zone=Zone \ucd94\uac00 -label.add.ip.range=IP \uc8fc\uc18c \ubc94\uc704 \ucd94\uac00 -label.additional.networks=\ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c -label.add.load.balancer=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 \ucd94\uac00 -label.add.more=\ub2e4\ub978 \ud56d\ubaa9 \ucd94\uac00 -label.add.netScaler.device=Netscaler \uae30\uae30 \ucd94\uac00 -label.add.network.ACL=\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) \ucd94\uac00 -label.add.network.device=\ub124\ud2b8\uc6cc\ud06c \uae30\uae30 \ucd94\uac00 -label.add.network.offering=\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 \ucd94\uac00 -label.add.network=\ub124\ud2b8\uc6cc\ud06c \ucd94\uac00 -label.add.new.F5=\uc0c8\ub85c\uc6b4 F5 \ucd94\uac00 -label.add.new.gateway=\uc0c8 \uac8c\uc774\ud2b8\uc6e8\uc774 \ucd94\uac00\ud558\uae30 -label.add.new.NetScaler=\uc0c8\ub85c\uc6b4 NetScaler \ucd94\uac00 -label.add.new.SRX=\uc0c8\ub85c\uc6b4 SRX \ucd94\uac00 -label.add.new.tier=\uc0c8 \uacc4\uce35 \ucd94\uac00 -label.add.NiciraNvp.device=Nvp \ucf58\ud2b8\ub864\ub7ec -label.add.physical.network=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \ucd94\uac00 -label.add.pod=Pod \ucd94\uac00 -label.add.port.forwarding.rule=\ud3ec\ud1a0 \uc804\uc1a1 \uaddc\uce59\uc758 \ucd94\uac00 -label.add.primary.storage=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00 -label.add.region=\uc9c0\uc5ed -label.add.resources=\uc790\uc6d0 \ucd94\uac00 -label.add.route=\ub77c\uc6b0\ud2b8 \ucd94\uac00 -label.add.rule=\uaddc\uce59 \ucd94\uac00 -label.add.secondary.storage=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00 -label.add.security.group=\ubcf4\uc548 \uadf8\ub8f9 \ucd94\uac00 -label.add.service.offering=\uc11c\ube44\uc2a4\uc81c\uacf5 \ucd94\uac00 -label.add.SRX.device=SRX \uae30\uae30 \ucd94\uac00 -label.add.static.nat.rule=\uc815\uc801 NAT \uaddc\uce59 \ucd94\uac00 -label.add.static.route=\uc815\uc801 \ub77c\uc6b0\ud2b8 \ucd94\uac00 -label.add.system.service.offering=\uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5 \ucd94\uac00 -label.add.template=\ud15c\ud50c\ub9bf \ucd94\uac00 -label.add.to.group=\uadf8\ub8f9\uc5d0 \ucd94\uac00 -label.add=\ucd94\uac00 -label.add.user=\uc0ac\uc6a9\uc790 \ucd94\uac00 -label.add.vlan=VLAN \ucd94\uac00 -label.add.vms.to.lb=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59\uc5d0 VM \ucd94\uac00 -label.add.vms=VM \ucd94\uac00 -label.add.VM.to.tier=\uacc4\uce35\uc5d0 VM \ucd94\uac00 -label.add.vm=VM \ucd94\uac00 -label.add.volume=\ubcfc\ub968 \ucd94\uac00 -label.add.vpc=VPC \ucd94\uac00 -label.add.vpn.customer.gateway=VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774 \ucd94\uac00 -label.add.VPN.gateway=VPN \uac8c\uc774\ud2b8\uc6e8\uc774 \ucd94\uac00 -label.add.vpn.user=VPN \uc0ac\uc6a9\uc790 \ucd94\uac00 -label.add.vxlan=VXLAN \ucd94\uac00 -label.add.zone=Zone \ucd94\uac00 -label.admin.accounts=\uad00\ub9ac\uc790 \uacc4\uc815 \uc815\ubcf4 -label.admin=\uad00\ub9ac\uc790 -label.advanced.mode=\ud655\uc7a5 \ubaa8\ub4dc -label.advanced.search=\uace0\ub3c4 \uac80\uc0c9 -label.advanced=\ud655\uc7a5 -label.agent.password=\uc5d0\uc774\uc804\ud2b8 \uc554\ud638 -label.agent.username=\uc5d0\uc774\uc804\ud2b8 \uc0ac\uc6a9\uc790\uba85 -label.agree=\ub3d9\uc758 -label.alert=\uc54c\ub9bc \uccb4\uc81c -label.algorithm=\uc54c\uace0\ub9ac\uc998 -label.allocated=\ud560\ub2f9 \uc644\ub8cc \uc0c1\ud0dc -label.allocation.state=\ud560\ub2f9 \uc0c1\ud0dc -label.api.key=API \ud0a4 -label.apply=\uc801\uc6a9 -label.app.name=CloudStack -label.archive.alerts=\uc54c\ub9bc -label.archive.events=\uc774\ubca4\ud2b8 -label.assign.to.load.balancer=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \ud560\ub2f9 -label.assign=\ud560\ub2f9 -label.associated.network.id=\uad00\ub828 \ub124\ud2b8\uc6cc\ud06c ID -label.associated.network=\uad00\ub828 \ub124\ud2b8\uc6cc\ud06c -label.attached.iso=\uc5f0\uacb0 ISO -label.author.email=\uc81c\uc791\uc790 -label.availability=\uac00\uc6a9\uc131 -label.availability.zone=\uc774\uc6a9 \uac00\ub2a5 Zone -label.available.public.ips=\uc0ac\uc6a9 \uac00\ub2a5 \uacf5\uac1c IP \uc8fc\uc18c -label.available=\uc0ac\uc6a9 \uac00\ub2a5 -label.back=\ub4a4\ub85c -label.bandwidth=\ub300\uc5ed\ud3ed -label.basic.mode=\uae30\ubcf8 \ubaa8\ub4dc -label.basic=\uae30\ubcf8 -label.bootable=\ubd80\ud305 \uac00\ub2a5 -label.broadcast.domain.range=\ube0c\ub85c\ub4dc\uce90\uc2a4\ud2b8 \ub3c4\uba54\uc778 \ubc94\uc704 -label.broadcast.domain.type=\ube0c\ub85c\ub4dc\uce90\uc2a4\ud2b8 \ub3c4\uba54\uc778 \uc885\ub958 -label.by.account=\uacc4\uc815 \uc815\ubcf4 -label.by.alert.type=\uc54c\ub9bc -label.by.availability=\uac00\uc6a9\uc131 -label.by.date.end=\ub0a0\uc9dc(\uc885\ub8cc\uc77c) -label.by.date.start=\ub0a0\uc9dc(\uc2dc\uc791\uc77c) -label.by.domain=\ub3c4\uba54\uc778 -label.by.end.date=\uc885\ub8cc\uc77c -label.by.event.type=\uc774\ubca4\ud2b8 -label.by.level=\ub808\ubca8 -label.by.pod=Pod -label.by.role=\uc5ed\ud560 -label.by.start.date=\uc2dc\uc791\uc77c -label.by.state=\uc0c1\ud0dc -label.bytes.received=\uc218\uc2e0 \ubc14\uc774\ud2b8 -label.bytes.sent=\uc804\uc1a1 \ubc14\uc774\ud2b8 -label.by.traffic.type=\ud2b8\ub798\ud53d \uc885\ub958 -label.by.type.id=\uc885\ub958 ID -label.by.type=\uc885\ub958 -label.by.zone=Zone -label.cancel=\ucde8\uc18c -label.capacity=\ucc98\ub9ac \ub2a5\ub825 -label.certificate=\uc778\uc99d\uc11c -label.change.service.offering=\uc11c\ube44\uc2a4 \uc81c\uacf5 \ubcc0\uacbd -label.change.value=\uac12 \ubcc0\uacbd -label.character=\ubb38\uc790 -label.cidr.account=CIDR \ub610\ub294 \uacc4\uc815 \uc815\ubcf4/\ubcf4\uc548 \uadf8\ub8f9 -label.cidr=CIDR -label.CIDR.list=CIDR \ubaa9\ub85d -label.cidr.list=\uc804\uc1a1\uc6d0 CIDR -label.CIDR.of.destination.network=\ub300\uc0c1 \ub124\ud2b8\uc6cc\ud06c CIDR -label.clean.up=\uc0ad\uc81c\ud558\uae30 -label.clear.list=\ubaa9\ub85d \uc0ad\uc81c -label.close=\ub2eb\uae30 -label.cloud.console=\ud074\ub77c\uc6b0\ub4dc \uad00\ub9ac \ucf58\uc194 -label.cloud.managed=Cloud.com \uad00\ub9ac -label.cluster.name=\ud074\ub7ec\uc2a4\ud130\uba85 -label.clusters=\ud074\ub7ec\uc2a4\ud130 -label.cluster.type=\ud074\ub7ec\uc2a4\ud130 \uc885\ub958 -label.cluster=\ud074\ub7ec\uc2a4\ud130 -label.clvm=CLVM -label.code=\ucf54\ub4dc -label.community=\ucee4\ubba4\ub2c8\ud2f0 -label.compute.and.storage=\ucef4\ud4e8\ud305\uacfc \uc2a4\ud1a0\ub9ac\uc9c0 -label.compute.offering=\ucef4\ud4e8\ud305 \uc790\uc6d0 \uc81c\uacf5 -label.compute=\ucef4\ud4e8\ud305 -label.configuration=\uad6c\uc131 -label.configure.network.ACLs=\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) \uad6c\uc131 -label.configure=\uad6c\uc131 -label.configure.vpc=VPC \uad6c\uc131 -label.confirmation=\ud655\uc778 -label.confirm.password=\uc554\ud638 \ud655\uc778 \uc785\ub825 -label.congratulations=\uc124\uc815\uc774 \uace7 \uc644\ub8cc\uc785\ub2c8\ub2e4. -label.conserve.mode=\uc808\uc57d \ubaa8\ub4dc -label.console.proxy=\ucf58\uc194 \ud504\ub85d\uc2dc -label.continue.basic.install=\uae30\ubcf8 \uc124\uce58 \uc2e4\ud589 -label.continue=\uc2e4\ud589 -label.corrections.saved=\uc811\uc18d \uc815\ubcf4 \uc800\uc7a5 -label.cpu.allocated.for.VMs=VM\uc5d0 \ud560\ub2f9 \uc644\ub8cc CPU -label.cpu.allocated=\ud560\ub2f9 \uc644\ub8cc CPU -label.CPU.cap=CPU \uc81c\ud55c -label.cpu=CPU -label.cpu.mhz=CPU (MHz) -label.cpu.utilized=CPU \uc0ac\uc6a9\uc728 -label.created.by.system=\uc2dc\uc2a4\ud15c \ub9cc\ub4e4\uae30 -label.created=\uc77c\uc2dc \ub9cc\ub4e4\uae30 -label.create.project=\ud504\ub85c\uc81d\ud2b8 \ub9cc\ub4e4\uae30 -label.create.template=\ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30 -label.create.VPN.connection=VPN \uc811\uc18d \ub9cc\ub4e4\uae30 -label.cross.zones=\ud06c\ub85c\uc2a4 \uc874 -label.custom.disk.size=\ub9de\ucda4 \ub514\uc2a4\ud06c \ud06c\uae30 -label.daily=\ub9e4\uc77c -label.data.disk.offering=\ub370\uc774\ud0c0 \ub514\uc2a4\ud06c \uc81c\uacf5 -label.date=\ub0a0\uc9dc -label.day.of.month=\ub9e4\uc6d4 \uc9c0\uc815\uc77c -label.day.of.week=\ub9e4\uc8fc \uc9c0\uc815\uc77c -label.dead.peer.detection=\uc815\uc9c0 \ud53c\uc5b4 \uac10\uc9c0 -label.decline.invitation=\ucd08\ub300 \uac70\uc808 -label.dedicated=\uc804\uc6a9 -label.default=\uae30\ubcf8 -label.default.use=\uae30\ubcf8 \uc0ac\uc6a9 -label.default.view=\uae30\ubcf8 \ubcf4\uae30 -label.delete.alerts=\uc54c\ub9bc -label.delete.events=\uc774\ubca4\ud2b8 -label.delete.F5=F5 \uc0ad\uc81c -label.delete.gateway=\uac8c\uc774\ud2b8\uc6e8\uc774 \uc0ad\uc81c -label.delete.NetScaler=NetScaler \uc0ad\uc81c -label.delete.project=\ud504\ub85c\uc81d\ud2b8 \uc0ad\uc81c -label.delete.SRX=SRX \uc0ad\uc81c -label.delete=\uc0ad\uc81c -label.delete.VPN.connection=VPN \uc811\uc18d \uc0ad\uc81c -label.delete.VPN.customer.gateway=VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774 \uc0ad\uc81c -label.delete.VPN.gateway=VPN \uac8c\uc774\ud2b8\uc6e8\uc774\uc0ad\uc81c -label.delete.vpn.user=VPN \uc0ac\uc6a9\uc790 \uc0ad\uc81c -label.deleting.failed=\uc0ad\uc81c\ud560 \uc218 \uc5c6\uc74c -label.deleting.processing=\uc0ad\uc81c\ud558\ub294 \uc911... -label.description=\uc124\uba85 -label.destination.physical.network.id=\ubaa9\uc801 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c ID -label.destination.zone=\ubcf5\uc0ac\ud560 Zone -label.destroy.router=\ub77c\uc6b0\ud130 \ud30c\uae30 -label.destroy=\ud30c\uae30 -label.detaching.disk=\ub514\uc2a4\ud06c\ub97c \ubd84\ub9ac\ud568 -label.details=\uc0c1\uc138 -label.device.id=\uae30\uae30 ID -label.devices=\uae30\uae30 -label.dhcp=DHCP -label.DHCP.server.type=DHCP \uc11c\ubc84 \uc885\ub958 -label.direct.ips=\uc9c1\uc811 IP \uc8fc\uc18c -label.disabled=\uc0ac\uc6a9 \uc548\ud568 -label.disable.provider=\uc81c\uacf5\uc790 \uc0ac\uc6a9 \uc548 \ud568 -label.disable.vpn=VPN \uc0ac\uc6a9 \uc548 \ud568 -label.disabling.vpn.access=VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815 \uc911 -label.disk.allocated=\ud560\ub2f9 \uc644\ub8cc \ub514\uc2a4\ud06c -label.disk.offering=\ub514\uc2a4\ud06c \uc81c\uacf5 -label.disk.size.gb=\ub514\uc2a4\ud06c \ud06c\uae30(GB \ub2e8\uc704) -label.disk.size=\ub514\uc2a4\ud06c \ud06c\uae30 -label.disk.total=\ub514\uc2a4\ud06c \ud569\uacc4 -label.disk.volume=\ub514\uc2a4\ud06c \ubcfc\ub968 -label.display.text=\ud45c\uc2dc \ud14d\uc2a4\ud2b8 -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c DNS \ub3c4\uba54\uc778 -label.domain.admin=\ub3c4\uba54\uc778 \uad00\ub9ac\uc790 -label.domain.id=\ub3c4\uba54\uc778 ID -label.domain.name=\ub3c4\uba54\uc778\uba85 -label.domain.router=\ub3c4\uba54\uc778 \ub77c\uc6b0\ud130 -label.domain.suffix=DNS \ub3c4\uba54\uc778 (\uc608\: xyz.com) -label.domain=\ub3c4\uba54\uc778 -label.done=\uc644\ub8cc -label.double.quotes.are.not.allowed=\ud070 \ub530\uc634\ud45c \uc0ac\uc6a9\ud560 \uc218 \uc5c6\uc74c -label.download.progress=\ub2e4\uc6b4\ub85c\ub4dc \uc9c4\ud589 \uc0ac\ud56d -label.drag.new.position=\uc0c8\ub85c\uc6b4 \uc704\uce58\uc5d0 \ub04c\uc5b4\uc624\uae30 -label.edit.lb.rule=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59 \ud3b8\uc9d1 -label.edit.network.details=\ub124\ud2b8\uc6cc\ud06c \uc0c1\uc138\ud55c \ud3b8\uc9d1 -label.edit.project.details=\ud504\ub85c\uc81d\ud2b8 \uc0c1\uc138 \ud3b8\uc9d1 -label.edit.tags=\ud0dc\uadf8 \ud3b8\uc9d1 -label.edit.traffic.type=\ud2b8\ub798\ud53d \uc885\ub958 \ud3b8\uc9d1 -label.edit=\ud3b8\uc9d1 -label.edit.vpc=VPC \ud3b8\uc9d1 -label.egress.default.policy=Egress \uae30\ubcf8 -label.egress.rule=\uc804\uc1a1 \uaddc\uce59 -label.elastic.IP=\ud0c4\ub825\uc801 IP \uc8fc\uc18c -label.elastic.LB=\ud0c4\ub825\uc801 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 -label.elastic=\uc624\ub958 \uc2a4\ud2f1 -label.email=\uc804\uc790 \uba54\uc77c -label.enable.provider=\uc81c\uacf5\uc790 \uc0ac\uc6a9\ud568 -label.enable.swift=Swift \uc0ac\uc6a9\ud568 -label.enable.vpn=VPN \uc0ac\uc6a9\ud568 -label.enabling.vpn.access=VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \ud558\uace0 \uc788\uc74c -label.enabling.vpn=VPN\ub97c \uc0ac\uc6a9 \ud558\uace0 \uc788\uc74c -label.end.IP=\uc885\ub8cc IP \uc8fc\uc18c -label.endpoint.or.operation=\uc5d4\ub4dc \ud3ec\uc778\ud2b8 \ub610\ub294 \uc791\uc5c5 -label.end.port=\uc885\ub8cc \ud3ec\ud1a0 -label.end.reserved.system.IP=\uc608\uc57d\ub41c \uc885\ub8cc \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c -label.enter.token=\ud1a0\ud070 \uc785\ub825 -label.error.code=\uc624\ub958 \ucf54\ub4dc -label.error=\uc624\ub958 -label.ESP.encryption=ESP \uc554\ud638\ud654 -label.ESP.hash=ESP \ud574\uc2dc -label.ESP.lifetime=ESP \uc720\ud6a8\uae30\uac04(\ucd08) -label.ESP.policy=ESP \uc815\ucc45 -label.esx.host=ESX/ESXi \ud638\uc2a4\ud2b8 -label.example=\uc608 -label.extractable=\ucd94\ucd9c \uac00\ub2a5 -label.f5=F5 -label.failed=\uc2e4\ud328 -label.featured=\ucd94\ucc9c -label.fetch.latest=\ucd5c\uc2e0 \uc815\ubcf4 \ucde8\ub4dd -label.filterBy=\ud544\ud130 -label.firewall=\ubc29\ud654\ubcbd(fire wall) -label.first.name=\uc774\ub984 -label.format=\ud615\uc2dd -label.friday=\uae08\uc694\uc77c -label.full.path=\uc804\uccb4 \uacbd\ub85c -label.full=\uc804\uccb4 -label.gateway=\uac8c\uc774\ud2b8\uc6e8\uc774 -label.general.alerts=\uc77c\ubc18 \uc54c\ub9bc \uccb4\uc81c -label.generating.url=URL\ub97c \uc0dd\uc131\ud558\uace0 \uc788\uc74c -label.gluster.volume=\ubcfc\ub968 -label.go.step.2=\ub2e8\uacc4 2\uc73c\ub85c -label.go.step.3=\ub2e8\uacc4 3\uc73c\ub85c -label.go.step.4=\ub2e8\uacc4 4\uc73c\ub85c -label.go.step.5=\ub2e8\uacc4 5\uc73c\ub85c -label.gpu=CPU -label.group.optional=\uadf8\ub8f9(\uc635\uc158) -label.group=\uadf8\ub8f9 -label.guest.cidr=\uac8c\uc2a4\ud2b8 CIDR -label.guest.end.ip=\uac8c\uc2a4\ud2b8 \uc885\ub8cc IP \uc8fc\uc18c -label.guest.gateway=\uac8c\uc2a4\ud2b8 \uac8c\uc774\ud2b8\uc6e8\uc774 -label.guest.ip.range=\uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c \ubc94\uc704 -label.guest.ip=\uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c -label.guest.netmask=\uac8c\uc2a4\ud2b8 \ub137 \ub9c8\uc2a4\ud06c -label.guest.networks=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c -label.guest.start.ip=\uac8c\uc2a4\ud2b8 \uc2dc\uc791 IP \uc8fc\uc18c -label.guest.traffic=\uac8c\uc2a4\ud2b8 \ud2b8\ub798\ud53d -label.guest.type=\uac8c\uc2a4\ud2b8 \uc885\ub958 -label.guest=\uac8c\uc2a4\ud2b8 -label.ha.enabled=\uace0\uac00\uc6a9\uc131 \uc0ac\uc6a9\ud568 -label.help=\ub3c4\uc6c0\ub9d0 -label.hide.ingress.rule=\uc218\uc2e0 \uaddc\uce59\uc744 \uc228\uae30\uae30 -label.hints=\uc815\ubcf4 -label.host.MAC=\ud638\uc2a4\ud2b8 MAC -label.host.name=\ud638\uc2a4\ud2b8\uba85 -label.hosts=\ud638\uc2a4\ud2b8 -label.host.tags=\ud638\uc2a4\ud2b8 \ud0dc\uadf8 -label.host=\ud638\uc2a4\ud2b8 -label.hourly=\ub9e4\uc2dc\uac04 -label.hypervisor.capabilities=\ud558\uc774\ud37c \ubc14\uc774\uc800 \uae30\ub2a5 -label.hypervisors=\ud558\uc774\ud37c\ubc14\uc774\uc800 -label.hypervisor.type=\ud558\uc774\ud37c \ubc14\uc774\uc800 \uc885\ub958 -label.hypervisor=\ud558\uc774\ud37c \ubc14\uc774\uc800 -label.hypervisor.version=\ud558\uc774\ud37c \ubc14\uc774\uc800 \ubc84\uc804 -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=IKE \uc554\ud638\ud654 -label.IKE.hash=IKE \ud574\uc2dc -label.IKE.lifetime=IKE \uc720\ud6a8\uae30\uac04(\ucd08) -label.IKE.policy=IKE \uc815\ucc45 -label.info=\uc815\ubcf4 -label.ingress.rule=\uc218\uc2e0 \uaddc\uce59 -label.initiated.by=\uc2dc\uc791 \uc0ac\uc6a9\uc790 -label.installWizard.addClusterIntro.subtitle=\ud074\ub7ec\uc2a4\ud130 \ub300\ud55c \uc815\ubcf4 -label.installWizard.addClusterIntro.title=\ud074\ub7ec\uc2a4\ud130 \ucd94\uac00 -label.installWizard.addHostIntro.subtitle=\ud638\uc2a4\ud2b8\uc5d0 \ub300\ud574 -label.installWizard.addHostIntro.title=\ud638\uc2a4\ud2b8 \ucd94\uac00 -label.installWizard.addPodIntro.subtitle=Pod\uc5d0 \ub300\ud55c \uc815\ubcf4 -label.installWizard.addPodIntro.title=Pod \ucd94\uac00 -label.installWizard.addPrimaryStorageIntro.subtitle=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ub300\ud574 -label.installWizard.addPrimaryStorageIntro.title=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00 -label.installWizard.addSecondaryStorageIntro.subtitle=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ub300\ud574 -label.installWizard.addSecondaryStorageIntro.title=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \ucd94\uac00 -label.installWizard.addZoneIntro.subtitle=Zone\uc5d0 \ub300\ud55c \uc815\ubcf4 -label.installWizard.addZoneIntro.title=Zone \ucd94\uac00 -label.installWizard.addZone.title=Zone \ucd94\uac00 -label.installWizard.click.launch=[\uc2dc\uc791]\uc744 \ud074\ub9ad\ud574 \uc8fc\uc2ed\uc2dc\uc624. -label.installWizard.subtitle=\ud604\uc7ac \uac00\uc774\ub4dc \ud22c\uc5b4\ub294 CloudStack\u2122 \ud658\uacbd \uc124\uc815\uc5d0 \ub3c4\uc6c0\uc774 \ub429\ub2c8\ub2e4 -label.installWizard.title=CloudStack\u2122 \ub9c8\ubc95\uc0ac -label.instance.limits=\uc778\uc2a4\ud134\uc2a4 \uc81c\ud55c -label.instance.name=\uc778\uc2a4\ud134\uc2a4\uba85 -label.instances=\uc778\uc2a4\ud134\uc2a4 -label.instance=\uc778\uc2a4\ud134\uc2a4 -label.internal.dns.1=\ub0b4\ubd80 DNS 1 -label.internal.dns.2=\ub0b4\ubd80 DNS 2 -label.internal.name=\ub0b4\ubd80\uba85 -label.interval.type=\uac04\uaca9 \uc885\ub958 -label.introduction.to.cloudstack=CloudStack\u2122 \uc18c\uac1c -label.invalid.integer=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc815\uc218\uac12 -label.invalid.number=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 \uc22b\uc790\uac12 -label.invitations=\ucd08\ub300\uc7a5 -label.invited.accounts=\ucd08\ub300\uac00 \ub05d\ub09c \uacc4\uc815 \uc815\ubcf4 -label.invite.to=\ucd08\ub300 \ud504\ub85c\uc81d\ud2b8\: -label.invite=\ucd08\ub300 -label.ip.address=IP \uc8fc\uc18c -label.ipaddress=IP \uc8fc\uc18c -label.ip.allocations=IP \uc8fc\uc18c \ud560\ub2f9 -label.ip=IP -label.ip.limits=\uacf5\uac1c IP \uc8fc\uc18c \uc81c\ud55c -label.ip.or.fqdn=IP \uc8fc\uc18c \ub610\ub294 FQDN -label.ip.range=IP \uc8fc\uc18c \ubc94\uc704 -label.ip.ranges=IP \uc8fc\uc18c \ubc94\uc704 -label.IPsec.preshared.key=IPsec \uc0ac\uc804 \uacf5\uc720 \ud0a4 -label.ips=IP -label.iscsi=iSCSI -label.is.default=\uae30\ubcf8 -label.iso.boot=ISO \uc2dc\uc791 -label.iso=ISO -label.isolated.networks=\ubd84\ub9ac \ub124\ud2b8\uc6cc\ud06c -label.isolation.method=\ubd84\ub9ac \ubc29\ubc95 -label.isolation.mode=\ubd84\ub9ac \ubaa8\ub4dc -label.is.redundant.router=\uc911\ubcf5 -label.is.shared=\uacf5\uc720 -label.is.system=\uc2dc\uc2a4\ud15c -label.item.listing=\ud56d\ubaa9 \ubaa9\ub85d -label.keep=\uc720\uc9c0 -label.keyboard.type=\ud0a4\ubcf4\ub4dc \uc885\ub958 -label.key=\ud0a4 -label.kvm.traffic.label=KVM \ud2b8\ub798\ud53d \ub77c\ubca8 -label.label=\ub77c\ubca8 -label.lang.chinese=\uc911\uad6d\uc5b4(\uac04\uccb4) -label.lang.english=\uc601\uc5b4 -label.lang.japanese=\uc77c\ubcf8\uc5b4 -label.lang.korean=\ud55c\uad6d\uc5b4 -label.lang.spanish=\uc2a4\ud398\uc778\uc5b4 -label.last.disconnected=\ub9c8\uc9c0\ub9c9 \uc885\ub8cc \uc2dc\uc810 -label.last.name=\uc131 -label.latest.events=\ucd5c\uc2e0 \uc774\ubca4\ud2b8 -label.launch=\uc2dc\uc791 -label.launch.vm=VM \uc2dc\uc791 -label.launch.zone=Zone \uc2dc\uc791 -label.lb.algorithm.leastconn=\ucd5c\uc18c \uc811\uc18d -label.lb.algorithm.roundrobin=\ub77c\uc6b4\ub4dc \ub85c\ube48 -label.lb.algorithm.source=\uc2dc\uc791 \uc704\uce58 -label.LB.isolation=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \ubd84\ub9ac -label.ldap.link.type=\uc885\ub958 -label.level=\ub808\ubca8 -label.load.balancer=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 -label.load.balancing.policies=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc815\ucc45 -label.load.balancing=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 -label.loading=\ub85c\ub4dc \ud558\ub294 \uc911 -label.local.storage=\ub85c\uceec \uc2a4\ud1a0\ub9ac\uc9c0 -label.local=\ub85c\uceec -label.login=\ub85c\uadf8\uc778 -label.logout=\ub85c\uadf8\uc544\uc6c3 -label.lun=LUN -label.LUN.number=LUN \ubc88\ud638 -label.make.project.owner=\uacc4\uc815 \uc815\ubcf4 \ud504\ub85c\uc81d\ud2b8 \uc18c\uc720\uc790 -label.management.ips=\uad00\ub9ac IP \uc8fc\uc18c -label.management=\uad00\ub9ac -label.manage.resources=\uc790\uc6d0 \uad00\ub9ac -label.manage=\uad00\ub9ac -label.max.guest.limit=\ucd5c\ub300 \uac8c\uc2a4\ud2b8 \uc81c\ud55c -label.maximum=\ucd5c\ub300 -label.max.networks=\ucd5c\ub300 \ub124\ud2b8\uc6cc\ud06c\uc218 -label.max.public.ips=\ucd5c\ub300 \uacf5\uac1c IP \uc8fc\uc18c\uc218 -label.max.snapshots=\ucd5c\ub300 \uc2a4\ub0c5\uc0f7\uc218 -label.max.templates=\ucd5c\ub300 \ud15c\ud50c\ub9bf\uc218 -label.max.vms=\ucd5c\ub300 \uc0ac\uc6a9\uc790 VM\uc218 -label.max.volumes=\ucd5c\ub300 \ubcfc\ub968\uc218 -label.may.continue=\uc2e4\ud589 \ud560 \uc218 \uc788\uc74c -label.md5.checksum=MD5 \uccb4\ud06c\uc12c -label.memory.allocated=\ud560\ub2f9\uc644\ub8cc \uba54\ubaa8\ub9ac -label.memory.mb=\uba54\ubaa8\ub9ac (MB) -label.memory.total=\uba54\ubaa8\ub9ac \ud569\uacc4 -label.memory=\uba54\ubaa8\ub9ac -label.memory.used=\uba54\ubaa8\ub9ac \uc0ac\uc6a9\ub7c9 -label.menu.accounts=\uacc4\uc815 \uc815\ubcf4 -label.menu.alerts=\uc54c\ub9bc \uccb4\uacc4 -label.menu.all.accounts=\ubaa8\ub4e0 \uacc4\uc815 \uc815\ubcf4 -label.menu.all.instances=\ubaa8\ub4e0 \uc778\uc2a4\ud134\uc2a4 -label.menu.community.isos=\ucee4\ubba4\ub2c8\ud2f0 ISO -label.menu.community.templates=\ucee4\ubba4\ub2c8\ud2f0 \ud15c\ud50c\ub9bf -label.menu.configuration=\uad6c\uc131 -label.menu.dashboard=\ub300\uc2dc \ubcf4\ub4dc -label.menu.destroyed.instances=\ud30c\uae30\ub41c \uc778\uc2a4\ud134\uc2a4 -label.menu.disk.offerings=\ub514\uc2a4\ud06c\uc81c\uacf5 -label.menu.domains=\ub3c4\uba54\uc778 -label.menu.events=\uc774\ubca4\ud2b8 -label.menu.featured.isos=\ucd94\ucc9c ISO -label.menu.featured.templates=\ucd94\ucc9c \ud15c\ud50c\ub9bf -label.menu.global.settings=\uae00\ub85c\ubc8c \uc124\uc815 -label.menu.infrastructure=\uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0 -label.menu.instances=\uc778\uc2a4\ud134\uc2a4 -label.menu.ipaddresses=IP \uc8fc\uc18c -label.menu.isos=ISO -label.menu.my.accounts=\ub098\uc758 \uacc4\uc815 \uc815\ubcf4 -label.menu.my.instances=\ub098\uc758 \uc778\uc2a4\ud134\uc2a4 -label.menu.my.isos=\ub098\uc758 ISO -label.menu.my.templates=\ub098\uc758 \ud15c\ud50c\ub9bf -label.menu.network.offerings=\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 -label.menu.network=\ub124\ud2b8\uc6cc\ud06c -label.menu.physical.resources=\ubb3c\ub9ac \uc790\uc6d0 -label.menu.running.instances=\uc2e4\ud589 \uc911 \uc778\uc2a4\ud134\uc2a4 -label.menu.security.groups=\ubcf4\uc548 \uadf8\ub8f9 -label.menu.service.offerings=\uc11c\ube44\uc2a4\uc81c\uacf5 -label.menu.snapshots=\uc2a4\ub0c5\uc0f7 -label.menu.stopped.instances=\uc815\uc9c0\ub41c \uc778\uc2a4\ud134\uc2a4 -label.menu.storage=\uc2a4\ud1a0\ub9ac\uc9c0 -label.menu.system.service.offerings=\uc2dc\uc2a4\ud15c \uc81c\uacf5 -label.menu.system=\uc2dc\uc2a4\ud15c -label.menu.system.vms=\uc2dc\uc2a4\ud15c VM -label.menu.templates=\ud15c\ud50c\ub9bf -label.menu.virtual.appliances=\uac00\uc0c1 \uc544\ud504\ub77c\uc774\uc548\uc2a4 -label.menu.virtual.resources=\uac00\uc0c1 \uc790\uc6d0 -label.menu.volumes=\ubcfc\ub968 -label.metrics.allocated=\ud560\ub2f9 \uc644\ub8cc \uc0c1\ud0dc -label.metrics.clusters=\ud074\ub7ec\uc2a4\ud130 -label.metrics.cpu.used.avg=\uc0ac\uc6a9 \uc911 -label.metrics.disk.allocated=\ud560\ub2f9 \uc644\ub8cc \uc0c1\ud0dc -label.metrics.disk.size=\ud06c\uae30 -label.metrics.disk.storagetype=\uc885\ub958 -label.metrics.disk.used=\uc0ac\uc6a9 \uc911 -label.metrics.hosts=\ud638\uc2a4\ud2b8 -label.metrics.memory.used.avg=\uc0ac\uc6a9 \uc911 -label.metrics.name=\uc774\ub984 -label.metrics.scope=\ubc94\uc704 -label.metrics.state=\uc0c1\ud0dc -label.migrate.instance.to.host=\ub2e4\ub978 \ud638\uc2a4\ud2b8\uc5d0\uac8c \uc778\uc2a4\ud134\uc2a4 \uc774\uc804 -label.migrate.instance.to.ps=\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc778\uc2a4\ud134\uc2a4 \uc774\uc804 -label.migrate.instance.to=\uc778\uc2a4\ud134\uc2a4 \uc774\uc804 \uc704\uce58\: -label.migrate.router.to=\ub77c\uc6b0\ud130 \uc774\uc804 \uc704\uce58\: -label.migrate.systemvm.to=\uc2dc\uc2a4\ud15c VM \uc774\uc804 \uc704\uce58\: -label.migrate.volume.to.primary.storage=\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ubcfc\ub968 \uc774\uc804 -label.minimum=\ucd5c\uc18c -label.mode=\ubaa8\ub4dc -label.monday=\uc6d4\uc694\uc77c -label.monthly=\ub9e4\uc6d4 -label.more.templates=\ub2e4\ub978 \ud15c\ud50c\ub9bf -label.move.down.row=\uc544\ub798\ub85c \uc774\ub3d9 -label.move.to.bottom=\ub9c8\uc9c0\ub9c9\uc73c\ub85c \uc774\ub3d9 -label.move.to.top=\ucc98\uc74c\uc73c\ub85c \uc774\ub3d9 -label.move.up.row=\uc704\ub85c \uc774\ub3d9 -label.my.account=\ub098\uc758 \uacc4\uc815 \uc815\ubcf4 -label.my.network=\ub0b4 \ub124\ud2b8\uc6cc\ud06c -label.my.templates=\ub098\uc758 \ud15c\ud50c\ub9bf -label.name.lower=\uc774\ub984 -label.name.optional=\uc774\ub984(\uc635\uc158) -label.name=\uc774\ub984 -label.nat.port.range=NAT \ud3ec\ud1a0 \ubc94\uc704 -label.netmask=\ub137 \ub9c8\uc2a4\ud06c -label.netScaler=NetScaler -label.network.ACLs=\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) -label.network.ACL.total=\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) \ud569\uacc4 -label.network.ACL=\ub124\ud2b8\uc6cc\ud06c \uad8c\ud55c \uad00\ub9ac(ACL) -label.network.desc=\ub124\ud2b8\uc6cc\ud06c \uc124\uba85 -label.network.device.type=\ub124\ud2b8\uc6cc\ud06c \uae30\uae30 \uc885\ub958 -label.network.device=\ub124\ud2b8\uc6cc\ud06c \uae30\uae30 -label.network.domain.text=\ub124\ud2b8\uc6cc\ud06c \ub3c4\uba54\uc778 -label.network.domain=\ub124\ud2b8\uc6cc\ud06c \ub3c4\uba54\uc778 -label.network.id=\ub124\ud2b8\uc6cc\ud06c ID -label.networking.and.security=\ub124\ud2b8\uc6cc\ud06c\uc640 \ubcf4\uc548 -label.network.label.display.for.blank.value=\uae30\ubcf8 \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ac\uc6a9 -label.network.name=\ub124\ud2b8\uc6cc\ud06c\uba85 -label.network.offering.display.text=\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 \ud45c\uc2dc \ud14d\uc2a4\ud2b8 -label.network.offering.id=\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 ID -label.network.offering.name=\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uba85 -label.network.offering=\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5 -label.network.rate.megabytes=\ub124\ud2b8\uc6cc\ud06c \uc18d\ub3c4 (MB/\ucd08) -label.network.rate=\ub124\ud2b8\uc6cc\ud06c \uc18d\ub3c4 -label.network.read=\ub124\ud2b8\uc6cc\ud06c \uc77d\uae30 -label.network.service.providers=\ub124\ud2b8\uc6cc\ud06c \uc11c\ube44\uc2a4 \uc81c\uacf5\uc790 -label.networks=\ub124\ud2b8\uc6cc\ud06c -label.network.type=\ub124\ud2b8\uc6cc\ud06c \uc885\ub958 -label.network=\ub124\ud2b8\uc6cc\ud06c -label.network.write=\ub124\ud2b8\uc6cc\ud06c \uae30\uc785 -label.new.password=\uc0c8\ub85c\uc6b4 \uc554\ud638 -label.new.project=\uc0c8 \ud504\ub85c\uc81d\ud2b8 -label.new=\uc2e0\uaddc -label.new.vm=\uc0c8 VM -label.next=\ub2e4\uc74c -label.nexusVswitch=Nexus 1000V -label.nfs=NFS -label.nfs.server=NFS \uc11c\ubc84 -label.nfs.storage=NFS \uc2a4\ud1a0\ub9ac\uc9c0 -label.nic.adapter.type=NIC \uc544\ub2f5\ud130 \uc885\ub958 -label.nics=NIC -label.no.actions=\uc2e4\ud589\ud560 \uc218 \uc788\ub294 \uc791\uc5c5 \uc5c6\uc74c -label.no.alerts=\ucd5c\uadfc \uc54c\ub9bc \uccb4\uacc4 \uc5c6\uc74c -label.no.data=\ud45c\uc2dc\ud560 \ub370\uc774\ud130\uac00 \uc5c6\uc74c -label.no.errors=\ucd5c\uadfc \uc624\ub958\ub294 \uc5c6\uc74c -label.no.isos=\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 ISO \uc5c6\uc74c -label.no.items=\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ud56d\ubaa9 \uc5c6\uc74c -label.none=\uc5c6\uc74c -label.no.security.groups=\uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 \ubcf4\uc548 \uadf8\ub8f9 \uc5c6\uc74c -label.not.found=\uac80\uc0c9 \uacb0\uacfc \uc5c6\uc74c -label.no.thanks=\uc124\uc815 \uc548\ud568 -label.notifications=\uc54c\ub9bc -label.no=\uc544\ub2c8\uc624 -label.number.of.clusters=\ud074\ub7ec\uc2a4\ud130\uc218 -label.number.of.hosts=\ud638\uc2a4\ud2b8\uc218 -label.number.of.pods=Pod\uc218 -label.number.of.system.vms=\uc2dc\uc2a4\ud15c VM \uc218 -label.number.of.virtual.routers=\uac00\uc0c1 \ub77c\uc6b0\ud130\uc218 -label.number.of.zones=Zone\uc218 -label.num.cpu.cores=CPU \ucf54\uc5b4\uc218 -label.numretries=\uc7ac\uc2dc\ud589 \ud68c\uc218 -label.ocfs2=OCFS2 -label.offer.ha=\uace0\uac00\uc6a9\uc131 \uc81c\uacf5 -label.ok=\ud655\uc778 -label.optional=\uc635\uc158 -label.order=\uc21c\uc11c -label.os.preference=OS \uae30\ubcf8 \uc124\uc815 -label.os.type=OS \uc885\ub958 -label.outofbandmanagement.password=\uc554\ud638 -label.outofbandmanagement.username=\uc0ac\uc6a9\uc790\uba85 -label.owned.public.ips=\uc18c\uc720 \uacf5\uac1c IP \uc8fc\uc18c -label.owner.account=\uc18c\uc720\uc790 \uacc4\uc815 \uc815\ubcf4 -label.owner.domain=\uc18c\uc720\uc790 \ub3c4\uba54\uc778 -label.parent.domain=\ubd80\ubaa8 \ub3c4\uba54\uc778 -label.password.enabled=\uc554\ud638 \uad00\ub9ac \uc0ac\uc6a9 -label.password=\uc554\ud638 -label.path=\uacbd\ub85c -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.physical.network.ID=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c ID -label.physical.network=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c -label.PING.CIFS.password=PING CIFS \uc554\ud638 -label.PING.CIFS.username=PING CIFS \uc0ac\uc6a9\uc790\uba85 -label.PING.dir=PING \ub514\ub809\ud1a0\ub9ac -label.PING.storage.IP=PING \ub300\uc0c1 \uc2a4\ud1a0\ub9ac\uc9c0 IP \uc8fc\uc18c -label.please.specify.netscaler.info=Netscaler \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624 -label.please.wait=\uae30\ub2e4\ub824 \uc8fc\uc2ed\uc2dc\uc624... -label.pod.name=Pod\uba85 -label.pod=Pod -label.pods=Pod -label.port.forwarding.policies=\ud3ec\ud1a0 \uc804\uc1a1 \uc815\ucc45 -label.port.forwarding=\ud3ec\ud1a0 \uc804\uc1a1 -label.port.range=\ud3ec\ud1a0 \ubc94\uc704 -label.PreSetup=PreSetup -label.previous=\ub4a4\ub85c -label.prev=\ub4a4\ub85c -label.primary.allocated=\ud560\ub2f9 \uc644\ub8cc \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 -label.primary.network=\uae30\ubcf8 \ub124\ud2b8\uc6cc\ud06c -label.primary.storage.count=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uadf8\ub8f9 -label.primary.storage=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 -label.primary.used=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ac\uc6a9\ub7c9 -label.private.Gateway=\uc0ac\uc124 \uac8c\uc774\ud2b8\uc6e8\uc774 -label.private.interface=\uc0ac\uc124 \uc778\ud130\ud398\uc774\uc2a4 -label.private.ip.range=\uc0ac\uc124 IP \uc8fc\uc18c \ubc94\uc704 -label.private.ips=\uc0ac\uc124 IP \uc8fc\uc18c -label.private.ip=\uc0ac\uc124 IP \uc8fc\uc18c -label.privatekey=PKC\#8 \ube44\ubc00 \ud0a4 -label.private.network=\uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c -label.private.port=\uc0ac\uc124 \ud3ec\ud2b8 -label.private.zone=\uc0ac\uc124 Zone -label.project.dashboard=\ud504\ub85c\uc81d\ud2b8 \ub300\uc2dc \ubcf4\ub4dc -label.project.id=\ud504\ub85c\uc81d\ud2b8 ID -label.project.invite=\ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd08\ub300 -label.project.name=\ud504\ub85c\uc81d\ud2b8\uba85 -label.projects=\ud504\ub85c\uc81d\ud2b8 -label.project=\ud504\ub85c\uc81d\ud2b8 -label.project.view=\ud504\ub85c\uc81d\ud2b8 \ubcf4\uae30 -label.protocol=\ud504\ub85c\ud1a0\ucf5c -label.providers=\uc81c\uacf5\uc790 -label.public.interface=\uacf5\uac1c \uc778\ud130\ud398\uc774\uc2a4 -label.public.ips=\uacf5\uac1c IP \uc8fc\uc18c -label.public.ip=\uacf5\uac1c IP \uc8fc\uc18c -label.public.network=\uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c -label.public.port=\uacf5\uac1c \ud3ec\ud2b8 -label.public.traffic=\uacf5\uac1c \ud2b8\ub798\ud53d -label.public=\uacf5\uac1c -label.public.zone=\uacf5\uac1c Zone -label.purpose=\ubaa9\uc801 -label.Pxe.server.type=PXE \uc11c\ubc84 \uc885\ub958 -label.quota.date=\ub0a0\uc9dc -label.quota.fullsummary=\ubaa8\ub4e0 \uacc4\uc815 \uc815\ubcf4 -label.quota.state=\uc0c1\ud0dc -label.reboot=\uc7ac\uc2dc\uc791 -label.recent.errors=\ucd5c\uadfc \uc624\ub958 -label.recover.vm=VM \ubcf5\uad6c -label.redundant.router.capability=\uc911\ubcf5 \ub77c\uc6b0\ud130 \uae30\ub2a5 -label.redundant.router=\uc911\ubcf5 \ub77c\uc6b0\ud130 -label.redundant.state=\uc911\ubcf5 \uc0c1\ud0dc -label.refresh=\uc5c5\ub370\uc774\ud2b8 -label.reinstall.vm=VM \uc7ac\uc124\uce58 -label.related=\uad00\ub828 -label.remind.later=\uc54c\ub9bc \ud45c\uc2dc -label.remove.ACL=\uad8c\ud55c \uad00\ub9ac(ACL) \uc0ad\uc81c -label.remove.egress.rule=\uc804\uc1a1 \uaddc\uce59 \uc0ad\uc81c -label.remove.from.load.balancer=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\uc5d0\uc11c \uc778\uc2a4\ud134\uc2a4\ub97c \uc0ad\uc81c\ud558\ub294 \uc911 -label.remove.ingress.rule=\uc218\uc2e0 \uaddc\uce59 \uc0ad\uc81c -label.remove.ip.range=IP \uc8fc\uc18c \ubc94\uc704 \uc0ad\uc81c -label.remove.pf=\ud3ec\ud1a0 \uc804\uc1a1 \uaddc\uce59 \uc0ad\uc81c -label.remove.project.account=\ud504\ub85c\uc81d\ud2b8 \uacc4\uc815 \uc815\ubcf4 \uc0ad\uc81c -label.remove.rule=\uaddc\uce59 \uc0ad\uc81c -label.remove.static.nat.rule=\uc815\uc801 NAT \uaddc\uce59 \uc0ad\uc81c -label.remove.static.route=\uc815\uc801 \ub77c\uc6b0\ud2b8 \uc0ad\uc81c -label.remove.tier=\uacc4\uce35 \uc0ad\uc81c -label.remove.vm.from.lb=\ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59\uc5d0 VM \uc0ad\uc81c -label.remove.vpc=VPC \uc0ad\uc81c -label.removing=\uc0ad\uc81c\ud558\ub294 \uc911 -label.removing.user=\uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud558\ub294 \uc911 -label.required=\ud544\uc218 \uc0ac\ud56d -label.reserved.system.gateway=\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c \uac8c\uc774\ud2b8\uc6e8\uc774 -label.reserved.system.ip=\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c -label.reserved.system.netmask=\uc608\uc57d\ub41c \uc2dc\uc2a4\ud15c \ub137 \ub9c8\uc2a4\ud06c -label.reset.VPN.connection=VPN \uc811\uc18d \uc7ac\uc124\uc815 -label.resize.new.offering.id=\uc0c8\ub85c \uc81c\uacf5 -label.resize.shrink.ok=\ubcc0\uacbd \uc644\ub8cc -label.resource.limits=\uc790\uc6d0 \uc81c\ud55c -label.resource.state=\uc790\uc6d0 \uc0c1\ud0dc -label.resources=\uc790\uc6d0 -label.resource=\uc790\uc6d0 -label.restart.network=\ub124\ud2b8\uc6cc\ud06c \uc7ac\uc2dc\uc791 -label.restart.required=\uc7ac\uc2dc\uc791 \ud544\uc694 -label.restart.vpc=VPC \uc7ac\uc2dc\uc791 -label.review=\ud655\uc778 -label.revoke.project.invite=\ucd08\ub300 \ucde8\uc18c -label.role=\uc5ed\ud560 -label.root.disk.controller=\ub8e8\ud2b8 \ub514\uc2a4\ud06c \ucf58\ud2b8\ub864\ub7ec -label.root.disk.offering=\ub8e8\ud2b8 \ub514\uc2a4\ud06c\uc81c\uacf5 -label.routing=\ub77c\uc6b0\ud305 -label.rules=\uaddc\uce59 -label.running.vms=\uc2e4\ud589\uc911 VM -label.s3.nfs.path=S3 NFS -label.s3.nfs.server=S3 NFS -label.s3.secret_key=\ube44\ubc00 \ud0a4 -label.saturday=\ud1a0\uc694\uc77c -label.save.and.continue=\uc800\uc7a5\ud558\uae30 -label.save=\uc800\uc7a5 -label.saving.processing=\uc800\uc7a5\ud558\ub294 \uc911... -label.scope=\ubc94\uc704 -label.search=\uac80\uc0c9 -label.secondary.storage=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 -label.secondary.storage.count=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uadf8\ub8f9 -label.secondary.storage.vm=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 VM -label.secondary.used=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc0ac\uc6a9\ub7c9 -label.secret.key=\ube44\ubc00 \ud0a4 -label.security.group.name=\ubcf4\uc548 \uadf8\ub8f9\uba85 -label.security.groups.enabled=\ubcf4\uc548 \uadf8\ub8f9 \uc720\ud6a8 -label.security.groups=\ubcf4\uc548 \uadf8\ub8f9 -label.security.group=\ubcf4\uc548 \uadf8\ub8f9 -label.select.a.template=\ud15c\ud50c\ub9bf \uc120\ud0dd -label.select.a.zone=Zone \uc120\ud0dd -label.select.instance.to.attach.volume.to=\ubcfc\ub968\uc744 \uc5f0\uacb0\ud558\ub294 \uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624 -label.select.instance=\uc778\uc2a4\ud134\uc2a4 \uc120\ud0dd -label.select.iso.or.template=ISO \ub610\ub294 \ud15c\ud50c\ub9bf \uc120\ud0dd -label.select.offering=\uc81c\uacf5 \uc120\ud0dd -label.select.project=\ud504\ub85c\uc81d\ud2b8 \uc120\ud0dd -label.select.tier=\uacc4\uce35 \uc120\ud0dd -label.select=\uc120\ud0dd -label.select-view=\ud45c\uc2dc \ubc29\ubc95 \uc120\ud0dd -label.select.vm.for.static.nat=\uc815\uc801 NAT\uc6a9 VM \uc120\ud0dd -label.sent=\uc804\uc1a1\ub41c \uc0c1\ud0dc -label.server=\uc11c\ubc84 -label.service.capabilities=\uc11c\ube44\uc2a4 \uae30\ub2a5 -label.service.offering=\uc11c\ube44\uc2a4\uc81c\uacf5 -label.service.state=\uc11c\ube44\uc2a4 -label.session.expired=\uc138\uc158 \uc720\ud6a8\uae30\uac04\uc774 \ub04a\uc5b4\uc9d0 -label.setup=\uc124\uc815 -label.set.up.zone.type=Zone \uc885\ub958 \uc124\uc815 -label.SharedMountPoint=SharedMountPoint -label.shared=\uacf5\uc720 -label.show.ingress.rule=\uc218\uc2e0 \uaddc\uce59 \ud45c\uc2dc -label.shutdown.provider=\uc81c\uacf5\uc790 \uc885\ub8cc -label.site.to.site.VPN=\uc0ac\uc774\ud2b8\uac04 \uc0ac\uc124\ub124\ud2b8\uc6cc\ud06c(VPN) -label.size=\ud06c\uae30 -label.skip.guide=CloudStack \uc0ac\uc6a9 \uac00\uc774\ub4dc \uac74\ub108\ub6f0\uae30 -label.snapshot.limits=\uc2a4\ub0c5\uc0f7 \uc81c\ud55c -label.snapshot.name=\uc2a4\ub0c5\uc0f7 \uc774\ub984 -label.snapshot.s=\uc2a4\ub0c5\uc0f7 -label.snapshots=\uc2a4\ub0c5\uc0f7 -label.snapshot=\uc2a4\ub0c5\uc0f7 -label.source.nat=\uc804\uc1a1\uc6d0 NAT -label.specify.IP.ranges=IP \uc8fc\uc18c \ubc94\uc704 \uc9c0\uc815 -label.specify.vlan=VLAN \uc9c0\uc815 -label.specify.vxlan=VXLAN \uc9c0\uc815 -label.SR.name=SR \uba85 \ub77c\ubca8 -label.srx=SRX -label.start.IP=\uc2dc\uc791 IP \uc8fc\uc18c -label.start.port=\uc2dc\uc791 \ud3ec\ud1a0 -label.start.reserved.system.IP=\uc608\uc57d\ub41c \uc2dc\uc791 \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c -label.state=\uc0c1\ud0dc -label.static.nat.enabled=\uc815\uc801 NAT \uc720\ud6a8 -label.static.nat.to=\uc815\uc801 NAT \uc124\uc815 \uc704\uce58\: -label.static.nat=\uc815\uc801 NAT -label.static.nat.vm.details=\uc815\uc801 NAT VM \uc0c1\uc138 \uc815\ubcf4 -label.statistics=\ud1b5\uacc4 -label.status=\uc0c1\ud0dc -label.step.1.title=\ub2e8\uacc4 1. \ud15c\ud50c\ub9bf \uc120\ud0dd -label.step.1=\ub2e8\uacc4 1 -label.step.2.title=\ub2e8\uacc4 2. \uc11c\ube44\uc2a4 \uc81c\uacf5 -label.step.2=\ub2e8\uacc4 2 -label.step.3.title=\ub2e8\uacc4 3. \ub514\uc2a4\ud06c \uc81c\uacf5 \uc120\ud0dd -label.step.3=\ub2e8\uacc4 3 -label.step.4.title=\ub2e8\uacc4 4. \ub124\ud2b8\uc6cc\ud06c -label.step.4=\ub2e8\uacc4 4 -label.step.5.title=\ub2e8\uacc4 5. \ucd5c\uc885 \ud655\uc778 -label.step.5=\ub2e8\uacc4 5 -label.stickiness=\uc9c0\uc18d\uc131 -label.sticky.cookie-name=Cookie \uba85 -label.sticky.domain=\ub3c4\uba54\uc778 -label.sticky.expire=\ub9cc\ub8cc\uc2dc\uac04 -label.sticky.holdtime=\ubcf4\uad00 \uc720\uc9c0 \uc2dc\uac04 -label.sticky.indirect=\uac04\uc811 -label.sticky.length=\uae38\uc774 -label.sticky.mode=\ubaa8\ub4dc -label.sticky.nocache=\uce90\uc2dc \uc5c6\uc74c -label.sticky.postonly=\ud3ec\uc2a4\ud2b8\ub9cc -label.sticky.prefix=\ud504\ub808\ud53d\uc2a4 -label.sticky.request-learn=\ub7ec\ub2dd \uc694\uad6c -label.sticky.tablesize=\ud14c\uc774\ube14 \ud06c\uae30 -label.stopped.vms=\uc815\uc9c0 \uc911 VM -label.stop=\uc815\uc9c0 -label.storage.tags=\uc2a4\ud1a0\ub9ac\uc9c0 \ud0dc\uadf8 -label.storage.traffic=\uc2a4\ud1a0\ub9ac\uc9c0 \ud2b8\ub798\ud53d -label.storage.type=\uc2a4\ud1a0\ub9ac\uc9c0 \uc885\ub958 -label.storage=\uc2a4\ud1a0\ub9ac\uc9c0 -label.subdomain.access=\uc11c\ube0c \ub3c4\uba54\uc778 \uc811\uadfc -label.submitted.by=[\uc0ac\uc6a9\uc790\: ] -label.submit=\ubcf4\ub0b4\uae30 -label.succeeded=\uc644\ub8cc -label.sunday=\uc77c\uc694\uc77c -label.super.cidr.for.guest.networks=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c \uc288\ud37c CIDR -label.supported.services=\uae30\uc220 \uc9c0\uc6d0\ub418\ub294 \uc11c\ube44\uc2a4 -label.supported.source.NAT.type=\uae30\uc220 \uc9c0\uc6d0\ub418\ub294 \uc804\uc1a1 NAT \uc885\ub958 -label.suspend.project=\ud504\ub85c\uc81d\ud2b8 \uc77c\uc2dc\uc815\uc9c0 -label.switch.type=\ud615\uc2dd -label.system.capacity=\uc2dc\uc2a4\ud15c \ucc98\ub9ac \ub2a5\ub825 -label.system.offering=\uc2dc\uc2a4\ud15c \uc81c\uacf5 -label.system.service.offering=\uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5 -label.system.vms=\uc2dc\uc2a4\ud15c VM -label.system.vm.type=\uc2dc\uc2a4\ud15c VM \uc885\ub958 -label.system.vm=\uc2dc\uc2a4\ud15c VM -label.system.wide.capacity=\uc2dc\uc2a4\ud15c \uc804\uccb4 \ucc98\ub9ac \ub2a5\ub825 -label.tagged=\ud0dc\uadf8 -label.tags=\ud0dc\uadf8 -label.target.iqn=\ud0c0\uac9f IQN -label.task.completed=\uc791\uc5c5 \uc644\ub8cc -label.template.limits=\ud15c\ud50c\ub9bf \uc81c\ud55c -label.template=\ud15c\ud50c\ub9bf -label.TFTP.dir=TFTP \ub514\ub809\ud1a0\ub9ac -label.theme.default=\uae30\ubcf8 \ud14c\ub9c8 -label.theme.grey=\ub9de\ucda4- \ud68c\uc0c9\uc870 -label.theme.lightblue=\ub9de\ucda4 - \ub77c\uc774\ud2b8 \ube14\ub8e8 -label.thursday=\ubaa9\uc694\uc77c -label.tier.details=\uacc4\uce35 \uc0c1\uc138 \uc7a5\ubc84 -label.tier=\uacc4\uce35 -label.timeout=\uc2dc\uac04 \ucd08\uacfc -label.time=\uc2dc\uac01 -label.time.zone=\uc2dc\uac04\ub300 -label.timezone=\uc2dc\uac04\ub300 -label.token=\ud1a0\ud070 -label.total.cpu=CPU \ud569\uacc4 -label.total.CPU=CPU \ud569\uacc4 -label.total.hosts=\ud638\uc2a4\ud2b8 \ud569\uacc4 -label.total.memory=\uba54\ubaa8\ub9ac \ud569\uacc4 -label.total.of.vm=VM \ud569\uacc4 -label.total.storage=\uc2a4\ud1a0\ub9ac\uc9c0 \ud569\uacc4 -label.total.vms=VM \ud569\uacc4 -label.traffic.label=\ud2b8\ub798\ud53d \ub77c\ubca8 -label.traffic.types=\ud2b8\ub798\ud53d \uc885\ub958 -label.traffic.type=\ud2b8\ub798\ud53d \uc885\ub958 -label.tuesday=\ud654\uc694\uc77c -label.type.id=\uc885\ub958 ID -label.type=\uc885\ub958 -label.unavailable=\uc0ac\uc6a9 \ubd88\uac00 -label.unlimited=\ubb34\uc81c\ud55c -label.untagged=\ud0dc\uadf8 \uc5c6\uc74c -label.update.project.resources=\ud504\ub85c\uc81d\ud2b8 \uc790\uc6d0 \uc5c5\ub370\uc774\ud2b8 -label.update.ssl.cert= SSL \uc778\uc99d\uc11c \uc5c5\ub370\uc774\ud2b8 -label.update.ssl= SSL \uc778\uc99d\uc11c \uc5c5\ub370\uc774\ud2b8 -label.updating=\uc5c5\ub370\uc774\ud2b8\ud558\uace0 \uc788\ub294 \uc911 -label.upload=\uc5c5\ub85c\ub4dc -label.upload.volume=\ubcfc\ub968\uc758 \uc5c5\ub85c\ub4dc -label.url=URL -label.usage.interface=\uc0ac\uc6a9 \uc0c1\ud669 \uce21\uc815 \uc778\ud130\ud398\uc774\uc2a4 -label.used=\uc0ac\uc6a9 \uc911 -label.username=\uc0ac\uc6a9\uc790\uba85 -label.users=\uc0ac\uc6a9\uc790 -label.user=\uc0ac\uc6a9\uc790 -label.value=\uac12 -label.vcdcname=vCenter DC \uba85 -label.vcenter.cluster=vCenter \ud074\ub7ec\uc2a4\ud130 -label.vcenter.datacenter=vCenter \ub370\uc774\ud130 \uc13c\ud130 -label.vcenter.datastore=vCenter \ub370\uc774\ud130 \uc2a4\ud1a0\uc5b4 -label.vcenter.host=vCenter \ud638\uc2a4\ud2b8 -label.vcenter.password=vCenter \uc554\ud638 -label.vcenter.username=vCenter \uc0ac\uc6a9\uc790\uba85 -label.vcipaddress=vCenter IP \uc8fc\uc18c -label.version=\ubc84\uc804 -label.view.all=\ubaa8\ub450 \ud45c\uc2dc -label.view.console=\ucf58\uc194 \ud45c\uc2dc -label.viewing=\ud45c\uc2dc \ud56d\ubaa9\: -label.view.more=\uc0c1\uc138 \ud45c\uc2dc -label.view=\ud45c\uc2dc - -label.virtual.appliances=\uac00\uc0c1 \uc5b4\ud50c\ub77c\uc774\uc5b8\uc2a4 -label.virtual.appliance=\uac00\uc0c1 \uc5b4\ud50c\ub77c\uc774\uc5b8\uc2a4 -label.virtual.network=\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c -label.virtual.routers=\uac00\uc0c1 \ub77c\uc6b0\ud130 -label.virtual.router=\uac00\uc0c1 \ub77c\uc6b0\ud130 -label.vlan.id=VLAN ID -label.vlan.only=\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c(VLAN) -label.vlan.range=VLAN \ubc94\uc704 -label.vlan=\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c(VLAN) -label.vlan.vni.range=VLAN \ubc94\uc704 -label.vm.add=\uc778\uc2a4\ud134\uc2a4 \ucd94\uac00 -label.vm.destroy=\ud30c\uae30 -label.vm.display.name=VM \ud45c\uc2dc\uba85 -label.VMFS.datastore=VMFS \ub370\uc774\ud130 \uc2a4\ud1a0\uc5b4 -label.vmfs=VMFS -label.vm.name=VM \uba85 -label.vm.reboot=\uc7ac\uc2dc\uc791 -label.VMs.in.tier=\uacc4\uce35 \ub0b4\ubd80 \uac00\uc0c1\uba38\uc2e0 -label.vmsnapshot.type=\uc885\ub958 -label.vm.start=\uc2dc\uc791 -label.vm.state=VM \uc0c1\ud0dc -label.vm.stop=\uc815\uc9c0 -label.vms=VM -label.vmware.traffic.label=VMware \ud2b8\ub798\ud53d \ub77c\ubca8 -label.vnet.id=VLAN ID -label.vnet=\uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c(VLAN) -label.volgroup=\ubcfc\ub968 \uadf8\ub8f9 -label.volume.limits=\ubcfc\ub968 \uc81c\ud55c -label.volume.name=\ubcfc\ub968\uba85 -label.volumes=\ubcfc\ub968 -label.volume=\ubcfc\ub968 -label.vpc.id=VPC ID -label.VPC.router.details=VPC \ub77c\uc6b0\ud130 \uc0c1\uc138 -label.vpc=VPC -label.VPN.connection=VPN \uc811\uc18d -label.vpn.customer.gateway=VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774 -label.VPN.customer.gateway=VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774 -label.VPN.gateway=VPN \uac8c\uc774\ud2b8\uc6e8\uc774 -label.vpn=\uac00\uc0c1 \uc0ac\uc124\ub9dd(VPN) -label.vsmctrlvlanid=\uc81c\uc5b4 VLAN ID -label.vsmpktvlanid=\ud328\ud0b7 VLAN ID -label.vsmstoragevlanid=\uc2a4\ud1a0\ub9ac\uc9c0 VLAN ID -label.vsphere.managed=vSphere \uad00\ub9ac -label.vxlan.id=VXLAN ID -label.vxlan.range=VXLAN \ubc94\uc704 -label.vxlan=VXLAN -label.waiting=\ub300\uae30\ud558\ub294 \uc911 -label.warn=\uacbd\uace0 -label.wednesday=\uc218\uc694\uc77c -label.weekly=\ub9e4\uc8fc -label.welcome.cloud.console=\uad00\ub9ac \ucf58\uc194\uc5d0 \uc624\uc2e0\uac83\uc744 \ud658\uc601\ud569\ub2c8\ub2e4\! -label.welcome=\uc5b4\uc11c \uc624\uc2ed\uc2dc\uc624 -label.what.is.cloudstack=CloudStack\u2122 \uc815\ubcf4 -label.xenserver.traffic.label=XenServer \ud2b8\ub798\ud53d \ub77c\ubca8 -label.yes=\uc608 -label.zone.details=Zone \uc0c1\uc138 -label.zone.id=Zone ID -label.zone.lower=Zone -label.zone.step.1.title=\ub2e8\uacc4 1. \ub124\ud2b8\uc6cc\ud06c \uc120\ud0dd -label.zone.step.2.title=\ub2e8\uacc4 2. Zone \ucd94\uac00 -label.zone.step.3.title=\ub2e8\uacc4 3. Pod \ucd94\uac00 -label.zone.step.4.title=\ub2e8\uacc4 4. IP \uc8fc\uc18c \ubc94\uc704 \ucd94\uac00 -label.zones=Zone -label.zone.type=Zone \uc885\ub958 -label.zone.wide=Zone \uc804\uccb4 -label.zone=Zone -managed.state=\uad00\ub9ac \ub300\uc0c1 \uc0c1\ud0dc -message.acquire.new.ip=\ud604\uc7ac \ub124\ud2b8\uc6cc\ud06c\uac00 \uc0c8\ub85c\uc6b4 IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.acquire.public.ip=\uc0c8\ub85c\uc6b4 IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\ub294 Zone\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.action.cancel.maintenance.mode=\ud604\uc7ac \uc720\uc9c0 \ubcf4\uc218\ub97c \ucde8\uc18c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.cancel.maintenance=\ud638\uc2a4\ud2b8 \uc720\uc9c0 \ubcf4\uc218\ub294 \uc815\uc0c1\uc801\uc73c\ub85c \ucde8\uc18c\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ucc98\ub9ac\uc5d0\ub294 \uba87 \ubd84 \uc815\ub3c4 \uac78\ub9b4 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.action.change.service.warning.for.instance=\ud604\uc7ac \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4. -message.action.change.service.warning.for.router=\ud604\uc7ac \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \ub77c\uc6b0\ud130\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4. -message.action.delete.cluster=\ud604\uc7ac \ud074\ub7ec\uc2a4\ud130\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.disk.offering=\ud604\uc7ac \ub514\uc2a4\ud06c\uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.domain=\ud604\uc7ac \ub3c4\uba54\uc778\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.external.firewall=\ud604\uc7ac \uc678\ubd80 \ubc29\ud654\ubcbd(fire wall)\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uacbd\uace0\: \uac19\uc740 \uc678\ubd80 \ubc29\ud654\ubcbd(fire wall)\ub97c \ub2e4\uc2dc \ucd94\uac00\ud560 \uacbd\uc6b0\ub294 \uae30\uae30 \uc0ac\uc6a9 \uc0c1\ud669 \ub370\uc774\ud130\ub97c \uc7ac\uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. -message.action.delete.external.load.balancer=\ud604\uc7ac \uc678\ubd80 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \uacbd\uace0\: \uac19\uc740 \uc678\ubd80 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \ub2e4\uc2dc \ucd94\uac00\ud560 \uacbd\uc6b0\ub294 \uae30\uae30 \uc0ac\uc6a9 \uc0c1\ud669 \ub370\uc774\ud130\ub97c \uc7ac\uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. -message.action.delete.ingress.rule=\ud604\uc7ac \uc218\uc2e0 \uaddc\uce59\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.ISO.for.all.zones=\uc774 ISO\ub294 \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.ISO=\ud604\uc7ac ISO\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.network=\ud604\uc7ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.nexusVswitch=\ud604\uc7ac Nexus 1000V\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.physical.network=\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.pod=\ud604\uc7ac Pod\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.primary.storage=\ud604\uc7ac \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.secondary.storage=\ud604\uc7ac 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.security.group=\ud604\uc7ac \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.service.offering=\ud604\uc7ac \uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.snapshot=\ud604\uc7ac \uc2a4\ub0c5\uc0f7\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.system.service.offering=\ud604\uc7ac \uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.template.for.all.zones=\uadf8 \ud15c\ud50c\ub9bf\uc740 \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ac\uc6a9\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ubaa8\ub4e0 Zone\uc5d0\uc11c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.template=\ud604\uc7ac \ud15c\ud50c\ub9bf\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.volume=\ud604\uc7ac \ubcfc\ub968\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.delete.zone=\ud604\uc7ac Zone\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.destroy.instance=\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.destroy.systemvm=\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\ub97c \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.disable.cluster=\ud604\uc7ac \ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.disable.nexusVswitch=\ud604\uc7ac Nexus 1000V\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.disable.physical.network=\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.disable.pod=\ud604\uc7ac Pod\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.disable.static.NAT=\uc815\uc801 NAT\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.disable.zone=\ud604\uc7ac Zone\uc744 \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.download.iso=\ud604\uc7ac ISO\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.download.template=\ud604\uc7ac \ud15c\ud50c\ub9bf\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.enable.cluster=\ud604\uc7ac \ud074\ub7ec\uc2a4\ud130\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.enable.maintenance=\ud638\uc2a4\ud2b8\ub97c \uc720\uc9c0 \ubcf4\uc218\ud560 \uc900\ube44\ub97c \ud560 \uc218 \uc788\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 \ud638\uc2a4\ud2b8\uc0c1 VM \uc218\uc5d0 \ub530\ub77c\uc11c \ucc98\ub9ac\uc5d0 \uba87 \ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4. -message.action.enable.nexusVswitch=\ud604\uc7ac Nexus 1000V\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.enable.physical.network=\ud604\uc7ac \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc0ac\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.enable.pod=\ud604\uc7ac Pod\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.enable.zone=\ud604\uc7ac Zone\uc744 \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.force.reconnect=\ud638\uc2a4\ud2b8\ub294 \uac15\uc81c\uc801\uc73c\ub85c \uc7ac\uc811\uc18d\ud588\uc2b5\ub2c8\ub2e4. \uc774 \ucc98\ub9ac\uc5d0\ub294 \uba87 \ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4 -message.action.host.enable.maintenance.mode=\uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub97c \uc0ac\uc6a9 \ud558\uba74, \uc774 \ud638\uc2a4\ud2b8\ub85c \uc2e4\ud589 \uc911\uc778 \ubaa8\ub4e0 \uc778\uc2a4\ud134\uc2a4\ub97c \ub2e4\ub978 \uc0ac\uc6a9\uac00\ub2a5 \ud638\uc2a4\ud2b8\uc5d0\uac8c \uc2e4\uc2dc\uac04 \uc774\uc804\ub429\ub2c8\ub2e4. -message.action.instance.reset.password=\ud604\uc7ac \uac00\uc0c1 \uba38\uc2e0 \ub8e8\ud2b8 \uc554\ud638\ub97c \ubcc0\uacbd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.manage.cluster=\ud074\ub7ec\uc2a4\ud130\ub97c \uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.primarystorage.enable.maintenance.mode=\uacbd\uace0\: \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc720\uc9c0 \ubcf4\uc218 \ubaa8\ub4dc\ub85c \ud558\uba74 \uadf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc0c1 \ubcfc\ub968\uc744 \uc0ac\uc6a9\ud558\ub294 \ubaa8\ub4e0 VM\uac00 \uc815\uc9c0\ud569\ub2c8\ub2e4. \uc2e4\ud589\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.reboot.instance=\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.reboot.router=\ud604\uc7ac \uac00\uc0c1 \ub77c\uc6b0\ud130\ub85c \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uc11c\ube44\uc2a4\uac00 \uc911\ub2e8\ub429\ub2c8\ub2e4. \uc774 \ub77c\uc6b0\ud130\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.reboot.systemvm=\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\uc744 \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.release.ip=\ud604\uc7ac IP \uc8fc\uc18c\ub97c \ud574\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.remove.host=\ud604\uc7ac \ud638\uc2a4\ud2b8\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.reset.password.off=\uc778\uc2a4\ud134\uc2a4\ub294 \ud604\uc7ac \uae30\ub2a5\uc744 \uc9c0\uc6d0 \ud558\uc9c0 \uc54a\uc2b5\ub2c8\ub2e4. -message.action.reset.password.warning=\ud604\uc7ac \uc554\ud638\ub97c \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4. -message.action.restore.instance=\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \ubcf5\uc6d0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.start.instance=\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.start.router=\ud604\uc7ac \ub77c\uc6b0\ud130\ub97c \uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.start.systemvm=\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\uc744 \uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.stop.instance=\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.stop.router=\ud604\uc7ac \uac00\uc0c1 \ub77c\uc6b0\ud130\ub85c \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uc11c\ube44\uc2a4\uac00 \uc911\ub2e8\ub429\ub2c8\ub2e4. \uc774 \ub77c\uc6b0\ud130\ub97c \uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.stop.systemvm=\ud604\uc7ac \uc2dc\uc2a4\ud15c VM\uc744 \uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.take.snapshot=\ud604\uc7ac \ubcfc\ub968 \uc2a4\ub0c5\uc0f7\uc744 \ub9cc\ub4dc\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.action.unmanage.cluster=\ud074\ub7ec\uc2a4\ud130\ub97c \ube44\uad00\ub9ac \ub300\uc0c1\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.activate.project=\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \ud65c\uc131\ud654 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.add.cluster=Zone Pod \uc5d0 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub85c \uad00\ub9ac\ub418\ub294 \ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. -message.add.cluster.zone=Zone \uc5d0 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub85c \uad00\ub9ac\ub418\ub294 \ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. -message.add.disk.offering=\uc0c8\ub85c\uc6b4 \ub514\uc2a4\ud06c \uc81c\uacf5\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \ub2e4\uc74c \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.domain=\ud604\uc7ac \ub3c4\uba54\uc778\uc5d0 \ub9cc\ub4e4\uace0\uc790 \ud558\ub294 \uc11c\ube0c \ub3c4\uba54\uc778\uc744 \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.firewall=Zone\uc5d0 \ubc29\ud654\ubcbd(fire wall)\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4. -message.add.guest.network=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c\ub97c \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.add.host=\uc0c8\ub85c\uc6b4 \ud638\uc2a4\ud2b8\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.adding.host=\ud638\uc2a4\ud2b8\ub97c \ucd94\uac00\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4 -message.adding.Netscaler.device=Netscaler \uae30\uae30\ub97c \ucd94\uac00\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4 -message.adding.Netscaler.provider=Netscaler \uc81c\uacf5\uc790\ub97c \ucd94\uac00\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. -message.add.ip.range.direct.network=Zone \uc9c1\uc811 \ub124\ud2b8\uc6cc\ud06c \uc5d0 IP \uc8fc\uc18c \ubc94\uc704\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4 -message.add.ip.range.to.pod=

Pod \uc5d0 IP \uc8fc\uc18c \ubc94\uc704\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4.

-message.add.ip.range=Zone \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c\uc5d0 IP \uc8fc\uc18c \ubc94\uc704\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. -message.additional.networks.desc=\uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uac00 \uc811\uc18d\ud558\ub294 \ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.load.balancer.under.ip=\ub2e4\uc74c IP \uc8fc\uc18c\uc5d0 \ub300\ud574\uc11c \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uaddc\uce59\uc744 \ucd94\uac00\ud569\ub2c8\ub2e4\: -message.add.load.balancer=Zone\uc5d0 \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. -message.add.network=Zone \uc5d0 \uc0c8\ub85c\uc6b4 \ub124\ud2b8\uc6cc\ud06c\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. -message.add.new.gateway.to.vpc=\ud604\uc7ac VPC\uc5d0 \uc0c8\ub85c\uc6b4 \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud55c \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.pod.during.zone.creation=\uac01 Zone\uc5d0\ub294 \ud55c \uac1c \uc774\uc0c1 Pod\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 Pod\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. Pod\ub294 \ud638\uc2a4\ud2b8\uc640 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131\ud569\ub2c8\ub2e4\ub9cc \uc774\ub294 \ub2e4\uc74c \uc21c\uc11c\ub85c \ucd94\uac00\ud569\ub2c8\ub2e4. \ub9e8 \ucc98\uc74c CloudStack \ub0b4\ubd80 \uad00\ub9ac \ud2b8\ub798\ud53d\uc744 \uc704\ud574\uc11c IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc608\uc57d\ud569\ub2c8\ub2e4. IP \uc8fc\uc18c \ubc94\uc704\ub294 \ud074\ub77c\uc6b0\ub4dc \ub0b4\ubd80 \uac01 Zone\uc5d0\uc11c \uc911\ubcf5 \ud558\uc9c0 \uc54a\uac8c \uc608\uc57d\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. -message.add.pod=Zone \uc5d0 \uc0c8\ub85c\uc6b4 Pod\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. -message.add.primary.storage=Zone Pod \uc5d0 \uc0c8\ub85c\uc6b4 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. -message.add.primary=\uc0c8\ub85c\uc6b4 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \ud30c\ub77c\ubbf8\ud130\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.secondary.storage=Zone \uc5d0 \uc0c8\ub85c\uc6b4 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4 -message.add.service.offering=\uc0c8\ub85c\uc6b4 \ucef4\ud4e8\ud305 \uc790\uc6d0 \uc81c\uacf5\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574\uc11c, \ub2e4\uc74c \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.system.service.offering=\uc0c8\ub85c\uc6b4 \uc2dc\uc2a4\ud15c \uc11c\ube44\uc2a4 \uc81c\uacf5\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \ub2e4\uc74c \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.template=\uc0c8\ub85c\uc6b4 \ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4e4\uae30\ud558\uae30 \uc704\ud574 \uc544\ub798 \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.volume=\uc0c8\ub85c\uc6b4 \ubcfc\ub968\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.add.VPN.gateway=VPN \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \ucd94\uac00\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.advanced.mode.desc=VLAN \uae30\uc220 \uc9c0\uc6d0\ub97c \uc0ac\uc6a9 \ud558\ub294 \uacbd\uc6b0\ub294 \uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uc774 \ubaa8\ub378\uc5d0\uc11c\ub294 \uac00\uc7a5 \uc720\uc5f0\ud558\uac8c \uce74\uc2a4\ud0d0\ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\uc5b4 \ubc29\ud654\ubcbd(fire wall), VPN, \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 \uae30\uc220 \uc9c0\uc6d0 \uc678\uc5d0, \uc9c1\uc811 \ub124\ud2b8\uc6cc\ud06c\uc640 \uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c\ub3c4 \uc0ac\uc6a9 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.advanced.security.group=\uac8c\uc2a4\ud2b8 VM\ub97c \ubd84\ub9ac\ud558\uae30 \uc704\ud574\uc11c \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.advanced.virtual=\uac8c\uc2a4\ud2b8 VM\ub97c \ubd84\ub9ac\ud558\uae30 \uc704\ud574\uc11c \uc874 \uc804\uccb4 VLAN\ub97c \uc0ac\uc6a9\ud558\ub294 \uacbd\uc6b0\ub294 \uc774 \uc635\uc158\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.after.enable.swift=Swift\uac00 \uad6c\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc8fc\uc758\:\uc774 \ud398\uc774\uc9c0\ub97c \ub2eb\uc73c\uba74 Swift\ub97c \uc7ac\uad6c\uc131\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -message.alert.state.detected=\uacbd\uacc4\uccb4\uc81c \uc0c1\ud0dc\uac00 \uac10\uc9c0\ub418\uc5c8\uc2b5\ub2c8\ub2e4 -message.allow.vpn.access=VPN \uc811\uadfc\ub97c \ud5c8\uac00\ud558\ub294 \uc0ac\uc6a9\uc790 \uc0ac\uc6a9\uc790\uba85\uacfc \uc554\ud638\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.apply.snapshot.policy=\ud604\uc7ac \uc2a4\ub0c5\uc0f7 \uc815\ucc45\ub97c \uc5c5\ub370\uc774\ud2b8\ud588\uc2b5\ub2c8\ub2e4. -message.attach.iso.confirm=\ud604\uc7ac \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc5d0 ISO \ud30c\uc77c\uc744 \uc5f0\uacb0 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.attach.volume=\uc0c8\ub85c\uc6b4 \ubcfc\ub968\uc744 \uc5f0\uacb0 \ud558\uae30 \uc704\ud574 \uc544\ub798 \ub370\uc774\ud130\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624.Windows \ubca0\uc774\uc2a4 \uac00\uc0c1 \uba38\uc2e0\uc5d0 \ub514\uc2a4\ud06c \ubcfc\ub968\uc744 \uc5f0\uacb0 \ud558\ub294 \uacbd\uc6b0\ub294 \uc5f0\uacb0 \ud55c \ub514\uc2a4\ud06c\ub97c \uc778\uc2dd\ud558\uae30 \uc704\ud574\uc11c \uc778\uc2a4\ud134\uc2a4\ub97c \uc7ac\uc2dc\uc791\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. -message.basic.mode.desc=VLAN \uae30\uc220 \uc9c0\uc6d0\uac00\ubd88\ud544\uc694\ud55c\uacbd\uc6b0\ub294 \uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\ub85c \ub9cc\ub4e4\uae30\ub418\ub294 \ubaa8\ub4e0 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uc9c1\uc811 IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud560 \uc218 \uc788\uc5b4 \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc0ac\uc6a9\ud574 \ubcf4\uc548\uc640 \ubd84\ub9ac\uac00 \uc81c\uacf5\ub429\ub2c8\ub2e4. -message.change.offering.confirm=\ud604\uc7ac \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 \uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \ubcc0\uacbd\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.change.password=\uc554\ud638\ub97c \ubcc0\uacbd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.configure.all.traffic.types=\ubcf5\uc218\uc758 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uac00 \uc788\uc2b5\ub2c8\ub2e4. [\ud3b8\uc9d1]\uc744 \ud074\ub9ad\ud574 \ud2b8\ub798\ud53d\uc758 \uc885\ub958 \ub9c8\ub2e4 \ub77c\ubca8\uc744 \uad6c\uc131\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.configuring.guest.traffic=\uac8c\uc2a4\ud2b8 \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4 -message.configuring.physical.networks=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4 -message.configuring.public.traffic=\uacf5\uac1c \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4 -message.configuring.storage.traffic=\uc2a4\ud1a0\ub9ac\uc9c0 \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc788\uc2b5\ub2c8\ub2e4 -message.confirm.action.force.reconnect=\ud604\uc7ac \ud638\uc2a4\ud2b8\ub97c \uac15\uc81c \uc7ac\uc811\uc18d\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.delete.F5=F5\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.delete.NetScaler=NetScaler\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.delete.SRX=SRX\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.destroy.router=\ud604\uc7ac \ub77c\uc6b0\ud130\ub97c \ud30c\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.disable.provider=\ud604\uc7ac \uc81c\uacf5\uc790\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.enable.provider=\ud604\uc7ac \uc81c\uacf5\uc790\ub97c \uc0ac\uc6a9\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.join.project=\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucc38\uc5ec\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.remove.IP.range=\ud604\uc7ac IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.confirm.shutdown.provider=\ud604\uc7ac \uc81c\uacf5\uc790\ub97c \uc885\ub8cc\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.copy.iso.confirm=ISO\ub97c \ub2e4\uc74c \uc7a5\uc18c\uc5d0 \ubcf5\uc0ac\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.copy.template=\uc874 \uc73c\uc5d0\uc11c \ud15c\ud50c\ub9bf XXX\ub97c \ub2e4\uc74c \uc7a5\uc18c\uc5d0 \ubcf5\uc0ac\ud569\ub2c8\ub2e4\: -message.create.template=\ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4e4\uae30\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.create.template.vm=\ud15c\ud50c\ub9bf \uc73c\uc5d0\uc11c VM\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.create.template.volume=\ub514\uc2a4\ud06c \ubcfc\ub968 \ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4e4\uae30\ud558\uae30 \uc804\uc5d0, \ub2e4\uc74c \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.\ubcfc\ub968 \ud06c\uae30\uc5d0 \ub530\ub77c\uc11c\ub294 \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\uc5d0\ub294 \uba87\ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4. -message.creating.cluster=\ud074\ub7ec\uc2a4\ud130\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.creating.guest.network=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c\ub97c \ub9cc\ub4ed\ub2c8\ub2e4. -message.creating.physical.networks=\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.creating.pod=Pod\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.creating.primary.storage=\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.creating.secondary.storage=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.creating.zone=Zone\uc744 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.decline.invitation=\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd08\ub300\ub97c \uac70\uc808\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.delete.account=\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.delete.gateway=\ud604\uc7ac \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.delete.project=\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.delete.user=\ud604\uc7ac \uc0ac\uc6a9\uc790\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.delete.VPN.connection=VPN \uc811\uc18d\uc744 \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.delete.VPN.customer.gateway=\ud604\uc7ac VPN \uace0\uac1d \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.delete.VPN.gateway=\ud604\uc7ac VPN \uac8c\uc774\ud2b8\uc6e8\uc774\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.desc.advanced.zone=\ubcf4\ub2e4 \uc138\ub828\ub41c \ub124\ud2b8\uc6cc\ud06c \uae30\uc220\uc744 \uc9c0\uc6d0\ud569\ub2c8\ub2e4. \uc774 \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud558\uba74, \ubcf4\ub2e4 \uc720\uc5f0\ud558\uac8c \uac8c\uc2a4\ud2b8 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc815\ud558\uace0 \ubc29\ud654\ubcbd(fire wall), VPN, \ub124\ud2b8\uc6cc\ud06c \ub85c\ub4dc \uacf5\uc720 \uc7a5\uce58 \uae30\uc220 \uc9c0\uc6d0\uc640 \uac19\uc740 \uc0ac\uc6a9\uc790 \uc9c0\uc815 \ud55c \ub124\ud2b8\uc6cc\ud06c \uc81c\uacf5\uc744 \uc81c\uacf5\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.desc.basic.zone=\uac01 VM \uc778\uc2a4\ud134\uc2a4\uc5d0 IP \uc8fc\uc18c\uac00 \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \uc9c1\uc811 \ud560\ub2f9\ud560 \uc218 \uc788\ub294 \ub2e8\uc77c \ub124\ud2b8\uc6cc\ud06c\ub97c \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubcf4\uc548 \uadf8\ub8f9 (\uc804\uc1a1\uc6d0 IP \uc8fc\uc18c \ud544\ud130)\uacfc \uac19\uc740 \uce35 \uc138 \uac00\uc9c0 \ub808\ubca8 \ubc29\ubc95\uc73c\ub85c \uac8c\uc2a4\ud2b8\ub97c \ubd84\ub9ac\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.desc.cluster=\uac01 Pod\uc5d0\ub294 \ud55c \uac1c \uc774\uc0c1 \ud074\ub7ec\uc2a4\ud130\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \ucd5c\ucd08 \ud074\ub7ec\uc2a4\ud130\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \ud074\ub7ec\uc2a4\ud130\ub294 \ud638\uc2a4\ud2b8\ub97c \uadf8\ub8f9\ud654 \ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ud55c \ud074\ub7ec\uc2a4\ud130 \ub0b4\ubd80 \ud638\uc2a4\ud2b8\ub294 \ubaa8\ub450 \ub3d9\uc77c\ud55c \ud558\ub4dc\uc6e8\uc5b4\uc5d0\uc11c \uad6c\uc131\ub418\uc5b4 \uac19\uc740 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc2e4\ud589\ud558\uace0 \uac19\uc740 \uc11c\ube0c \ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0 \uc788\uc5b4 \uac19\uc740 \uacf5\uc720 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc811\uadfc \ud569\ub2c8\ub2e4. \uac01 \ud074\ub7ec\uc2a4\ud130\ub294 \ud55c \uac1c \uc774\uc0c1 \ud638\uc2a4\ud2b8\uc640 \ud55c \uac1c \uc774\uc0c1 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131\ub429\ub2c8\ub2e4. -message.desc.host=\uac01 \ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \uac8c\uc2a4\ud2b8 VM\ub97c \uc2e4\ud589\ud558\uae30 \uc704\ud55c \ud638\uc2a4\ud2b8 (\ucef4\ud4e8\ud130)\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \ud638\uc2a4\ud2b8\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. CloudStack\uc73c\ub85c \ud638\uc2a4\ud2b8\ub97c \ub3d9\uc791\ud558\ub824\uba74 \ud638\uc2a4\ud2b8\uc5d0\uac8c \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc124\uce58\ud558\uace0 IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud574 \ud638\uc2a4\ud2b8\uac00 CloudStack \uad00\ub9ac \uc11c\ubc84\uc5d0 \uc811\uc18d\ud558\ub3c4\ub85d \ud569\ub2c8\ub2e4.

\ud638\uc2a4\ud2b8 DNS \uba85 \ub610\ub294 IP \uc8fc\uc18c, \uc0ac\uc6a9\uc790\uba85(\uc6d0\ub798 root)\uacfc \uc554\ud638 \ubc0f \ud638\uc2a4\ud2b8 \ubd84\ub958\uc5d0 \uc0ac\uc6a9\ud558\ub294 \ub77c\ubca8\uc744 \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.desc.primary.storage=\uac01 \ud074\ub7ec\uc2a4\ud130\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1\uc758 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \uc11c\ubc84\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 \ud074\ub7ec\uc2a4\ud130 \ub0b4 \ubd80 \ud638\uc2a4\ud2b8\uc0c1\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \ubaa8\ub4e0 VM \ub514\uc2a4\ud06c \ubcfc\ub968\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uae30\ubcf8\uc801\uc73c\ub85c \ud558\uc774\ud37c \ubc14\uc774\uc800\uc5d0\uc11c \uae30\uc220 \uc9c0\uc6d0\ub418\ub294 \ud45c\uc900\uc5d0 \uc900\uac70\ud55c \ud504\ub85c\ud1a0\ucf5c\uc744 \uc0ac\uc6a9\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.desc.secondary.storage=\uac01 Zone\uc5d0\ub294 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1\uc758 NFS \uc989 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uac00 \ud544\uc694\ud569\ub2c8\ub2e4. \uc9c0\uae08 \uc5ec\uae30\uc11c \uccab\ubc88\uc9f8 \uc11c\ubc84\ub97c \ucd94\uac00\ud569\ub2c8\ub2e4. 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 VM \ud15c\ud50c\ub9bf, ISO \uc774\ubbf8\uc9c0 \ubc0f VM \ub514\uc2a4\ud06c \ubcfc\ub968 \uc2a4\ub0c5\uc0f7\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uc774 \uc11c\ubc84\ub294 Zone\ub0b4 \ubaa8\ub4e0 \ud638\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4.

IP \uc8fc\uc18c\uc640 \ub0b4\ubcf4\ub0b4\ub0bc \uacbd\ub85c\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.desc.zone=Zone\uc740 CloudStack \ud658\uacbd\ub0b4 \ucd5c\ub300 \uc870\uc9c1 \ub2e8\uc704\ub85c \uc6d0\ub798 \ub2e8\uc77c \ub370\uc774\ud130 \uc13c\ud130\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4. Zone\uc5d0 \ud574\uc11c \ubb3c\ub9ac\uc801\uc778 \ubd84\ub9ac\uc640 \uc911\ubcf5\uc131\uc774 \uc81c\uacf5\ub429\ub2c8\ub2e4. Zone\uc740 \ud55c \uac1c \uc774\uc0c1 Pod( \uac01 Pod\ub294 \ud638\uc2a4\ud2b8\uc640 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\uc5d0\uc11c \uad6c\uc131)\uc640 Zone\ub0b4 \ubaa8\ub4e0 Pod\ub85c \uacf5\uc720\ub418\ub294 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\ub85c \uad6c\uc131\ub429\ub2c8\ub2e4. -message.detach.disk=\ud604\uc7ac \ub514\uc2a4\ud06c\ub97c \ubd84\ub9ac \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.detach.iso.confirm=\ud604\uc7ac \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc5d0\uc11c ISO \ud30c\uc77c\uc744 \ubd84\ub9ac \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.disable.account=\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c?\uc774 \uacc4\uc815 \uc815\ubcf4 \ubaa8\ub4e0 \uc0ac\uc6a9\uc790\uac00 \ud074\ub77c\uc6b0\ub4dc \uc790\uc6d0\uc5d0 \uc811\uadfc \ud560 \uc218 \uc5c6\uac8c \ub429\ub2c8\ub2e4. \uc2e4\ud589\uc911 \ubaa8\ub4e0 \uac00\uc0c1 \uba38\uc2e0\uc740 \uae08\ubc29\uc5d0 \uc885\ub8cc \ub429\ub2c8\ub2e4. -message.disable.snapshot.policy=\ud604\uc7ac \uc2a4\ub0c5\uc0f7 \uc815\ucc45\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \uc124\uc815\ud588\uc2b5\ub2c8\ub2e4. -message.disable.user=\ud604\uc7ac \uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.disable.vpn.access=VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.disable.vpn=VPN\ub97c \uc0ac\uc6a9 \uc548 \ud568\uc73c\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.download.ISO=ISO\ub97c \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub824\uba74 00000\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. -message.download.template=\ud15c\ud50c\ub9bf\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub824\uba74 00000\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. -message.download.volume=\ubcfc\ub968\uc744 \ub2e4\uc6b4\ub85c\ub4dc\ud558\ub824\uba74 00000\uc744 \ud074\ub9ad\ud569\ub2c8\ub2e4. -message.edit.account=\ud3b8\uc9d1 ("-1"\ub294 \uc790\uc6d0 \ub9cc\ub4e4\uae30 \uc22b\uc790\uc5d0 \uc81c\ud55c\uc774 \uc5c6\ub294 \uac12\uc785\ub2c8\ub2e4.) -message.edit.limits=\ub2e4\uc74c \uc790\uc6d0\uc5d0 \uc81c\ud55c\uc744 \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.\u300c-1\u300d\uc740 \uc790\uc6d0 \ub9cc\ub4e4\uae30\uc5d0 \uc81c\ud55c\uc774 \uc5c6\ub2e4\ub294 \uc758\ubbf8\uc785\ub2c8\ub2e4. -message.edit.traffic.type=\ud604\uc7ac \ud2b8\ub798\ud53d\uc758 \uc885\ub958\uc5d0 \uad00\ub828 \ud2b8\ub798\ud53d \ub77c\ubca8\uc744 \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.enable.account=\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.enabled.vpn.ip.sec=IPSec \uc0ac\uc804 \uacf5\uc720 \ud0a4\: -message.enabled.vpn=\ud604\uc7ac VPN \uc811\uadfc \uc0ac\uc6a9 \uc124\uc815\ub418\uc5b4 \uc788\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c IP \uc8fc\uc18c \uacbd\uc720\ub85c \uc811\uadfc \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.enable.user=\ud604\uc7ac \uc0ac\uc6a9\uc790\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.enable.vpn.access=\ud604\uc7ac\uc774 IP \uc8fc\uc18c\uc5d0 \ub300\ud55c VPN\ub294 \uc720\ud6a8\ud558\uc9c0 \uc54a\uc740\uc785\ub2c8\ub2e4. VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.enable.vpn=\ud604\uc7ac IP \uc8fc\uc18c\uc5d0 \ub300\ud55c VPN \uc811\uadfc\ub97c \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.enabling.security.group.provider=\ubcf4\uc548 \uadf8\ub8f9 \uc81c\uacf5\uc790\ub97c \uc0ac\uc6a9 \ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4. -message.enabling.zone=Zone\uc744 \uc0ac\uc6a9\ud558\uace0 \uc788\uc2b5\ub2c8\ub2e4 -message.enter.token=\uc804\uc790 \uba54\uc77c \ucd08\ub300\uc7a5\uc5d0 \uc124\uba85\ub418\uc5b4 \uc788\ub294 \ud1a0\ud070\uc744 \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.generate.keys=\ud604\uc7ac \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc0c8\ub85c\uc6b4 \ud0a4\ub97c \uc0dd\uc131\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.guest.traffic.in.advanced.zone=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c \ud2b8\ub798\ud53d\uc740 \ucd5c\uc885 \uc0ac\uc6a9\uc790 \uac00\uc0c1 \uba38\uc2e0\uac04 \ud1b5\uc2e0\uc785\ub2c8\ub2e4. \uac01 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c \uac8c\uc2a4\ud2b8 \ud2b8\ub798\ud53d\uc744 \ud1b5\uc2e0\ud558\uae30 \uc704\ud55c VLAN ID \ubc94\uc704\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.guest.traffic.in.basic.zone=\uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c \ud2b8\ub798\ud53d\uc740 \ucd5c\uc885 \uc0ac\uc6a9\uc790\uc758 \uac00\uc0c1 \uba38\uc2e0\uac04 \ud1b5\uc2e0\uc785\ub2c8\ub2e4. CloudStack\uc5d0 \uac8c\uc2a4\ud2b8 VM\uc5d0 \ud560\ub2f9\ud560 \uc218 \uc788\ub294 IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uc774 \ubc94\uc704\uac00 \uc608\uc57d \ub05d\ub09c \uc2dc\uc2a4\ud15c IP \uc8fc\uc18c \ubc94\uc704\uc640 \uc911\ubcf5 \ud558\uc9c0 \uc54a\uac8c \uc8fc\uc758\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.installWizard.click.retry=\uc2dc\uc791\uc744 \uc7ac\uc2dc\ud589\ud558\ub824\uba74 \ubc84\ud2bc\uc744 \ud074\ub9ad\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.installWizard.copy.whatIsACluster=\ud074\ub7ec\uc2a4\ud130\ub294 \ud638\uc2a4\ud2b8\ub97c \uadf8\ub8f9\ud654 \ud558\ub294 \ubc29\ubc95\uc785\ub2c8\ub2e4. \ud55c \uac00\uc9c0 \ud074\ub7ec\uc2a4\ud130\ub0b4 \ud638\uc2a4\ud2b8\ub294 \ubaa8\ub450 \ub3d9\uc77c\ud55c \ud558\ub4dc\uc6e8\uc5b4\uc5d0\uc11c \uad6c\uc131\ub418\uc5b4 \uac19\uc740 \ud558\uc774\ud37c \ubc14\uc774\uc800\ub97c \uc2e4\ud589\ud558\uace0 \uac19\uc740 \uc11c\ube0c \ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0 \uc788\uc5b4\uc11c \uac19\uc740 \uacf5\uc720 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc811\uadfc \ud569\ub2c8\ub2e4. \uac19\uc740 \ud074\ub7ec\uc2a4\ud130\ub0b4\uc758 \ud638\uc2a4\ud2b8 \uc0ac\uc774\uc5d0\uc11c\ub294 \uc0ac\uc6a9\uc790\uc5d0\uac8c \uc11c\ube44\uc2a4\ub97c \uc911\ub2e8\ud558\uc9c0 \uc54a\uace0 \uac00\uc0c1 \uba38\uc2e0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc2e4\uc2dc\uac04 \uc774\uc804 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ud074\ub7ec\uc2a4\ud130\ub294 CloudStack\u2122 \ud658\uacbd\ub0b4\uc758 \uc138 \ubc88\uc9f8\ub85c \ud070 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. \ud074\ub7ec\uc2a4\ud130\ub294 Pod\uc5d0 \ud3ec\ud568\ub418\uc5b4 Pod\ub294 Zone\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4.

CloudStack\u2122 \uc5d0\uc11c\ub294 \ud55c \uac00\uc9c0 \ud074\ub77c\uc6b0\ub4dc \ud658\uacbd\uc5d0 \ubcf5\uc218 \ud074\ub7ec\uc2a4\ud130\ub97c \uc124\uc815\ud560 \uc218 \uc788\uc73c\ub098 \uae30\ubcf8 \uc124\uce58\uc5d0\uc11c\ub294 \ud074\ub7ec\uc2a4\ud130\ub294 \ud55c \uac1c\uc785\ub2c8\ub2e4. -message.installWizard.copy.whatIsAHost=\ud638\uc2a4\ud2b8\ub294 \ub2e8\uc77c \ucef4\ud4e8\ud130\ub85c \uc190\ub2d8 \uac00\uc0c1 \uba38\uc2e0\uc744 \uc2e4\ud589\ud558\ub294 \ucef4\ud4e8\ud305 \uc790\uc6d0\uc744 \uc81c\uacf5\ud569\ub2c8\ub2e4. \ubca0\uc5b4 \uba54\ud0c8 \ud638\uc2a4\ud2b8\ub97c \uc81c\uc678\ud558\uace0, \uac01 \ud638\uc2a4\ud2b8\ub294 \uac8c\uc2a4\ud2b8 \uac00\uc0c1 \uba38\uc2e0\uc744 \uad00\ub9ac\ud558\uae30 \uc704\ud55c \ud558\uc774\ud37c \ubc14\uc774\uc800 \uc18c\ud504\ud2b8\uc6e8\uc5b4\ub97c \uc124\uce58\ud569\ub2c8\ub2e4. \ubca0\uc5b4 \uba54\ud0c8 \ud638\uc2a4\ud2b8\uc5d0 \ub300\ud574\uc11c\ub294 \uc124\uce58 \uac00\uc774\ub4dc \uace0\uae09\ud3b8 \ud2b9\uc218 \uc0ac\ub840\ub85c\uc11c \uc124\uba85\ud569\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, KVM\uc740 \uc720\ud6a8\ud55c Linux \uc11c\ubc84, Citrix XenServer\uac00 \ub3d9\uc791\ud558\ub294 \uc11c\ubc84 \ubc0f ESXi \uc11c\ubc84\uac00 \ud638\uc2a4\ud2b8\uc785\ub2c8\ub2e4. \uae30\ubcf8 \uc124\uce58\uc5d0\uc11c\ub294 XenServer \ub610\ub294 KVM\ub97c \uc2e4\ud589\ud558\ub294 \ub2e8\uc77c \ud638\uc2a4\ud2b8\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4.

\ud638\uc2a4\ud2b8\ub294 CloudStack\u2122 \ud658\uacbd\ub0b4\uc758 \ucd5c\uc18c\uc758 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. \ud638\uc2a4\ud2b8\ub294 \ud074\ub7ec\uc2a4\ud130\uc5d0 \ud3ec\ud568\ub418\uc5b4 \ud074\ub7ec\uc2a4\ud130\ub294 Pod\uc5d0 \ud3ec\ud568\ub418\uc5b4 Pod\ub294 Zone\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4. -message.installWizard.copy.whatIsAPod=\uc6d0\ub798 \ud55c \uac00\uc9c0 Pod\ub294 \ub2e8\uc77c \uc7a0\uae08\uc744 \ub098\ud0c0\ub0c5\ub2c8\ub2e4. \uac19\uc740 Pod\ub0b4 \ud638\uc2a4\ud2b8\ub294 \uac19\uc740 \uc11c\ube0c \ub124\ud2b8\uc6cc\ud06c\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4.

Pod\ub294 CloudStack\u2122 \ud658\uacbd\ub0b4\uc758 \ub450 \ubc88\uc9f8\ub85c \ud070 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. Pod\ub294 Zone\uc5d0 \ud3ec\ud568\ub429\ub2c8\ub2e4. \uac01 Zone\uc740 \ud55c \uac1c \uc774\uc0c1\uc758 Pod\ub97c \ud3ec\ud568\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uae30\ubcf8 \uc124\uce58\uc5d0\uc11c\ub294 Zone\ub0b4 Pod\ub294 \ud55c \uac1c\uc785\ub2c8\ub2e4. -message.installWizard.copy.whatIsAZone=Zone\uc740 CloudStack\u2122 \ud658\uacbd\ub0b4 \ucd5c\ub300 \uc870\uc9c1 \ub2e8\uc704\uc785\ub2c8\ub2e4. \ud55c \uac00\uc9c0 \ub370\uc774\ud130 \uc13c\ud130\ub0b4\uc5d0 \ubcf5\uc218 Zone\uc744 \uc124\uc815\ud560 \uc218 \uc788\uc73c\ub098 \uc6d0\ub798 Zone\uc740 \ub2e8\uc77c\uc758 \ub370\uc774\ud130 \uc13c\ud130\uc5d0 \ud560\ub2f9\ud569\ub2c8\ub2e4. \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0\ub97c Zone\uc5d0 \uc870\uc9c1\ud654\ud558\uba74, Zone\uc744 \ubb3c\ub9ac\uc801\uc6b0\ub85c \ubd84\ub9ac\ud574 \uc124\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, \uac01 Zone\uc5d0 \uc804\uc6d0\uacfc \ub124\ud2b8\uc6cc\ud06c \uc5c5\ub9c1\ud06c\ub97c \ubc30\uce58\ud569\ub2c8\ub2e4. \ud544\uc218\uac00 \uc544\ub2c8\uc9c0\ub9cc \uc6d0\uaca9\uc9c0\uc5d0 \ubd84\uc0b0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.installWizard.copy.whatIsCloudStack=CloudStack\u2122\ub294 \ucef4\ud4e8\ud305 \uc790\uc6d0\uc744 \ud3ec\ud568\ud558\ub294 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \ud50c\ub7ab\uc6f9 \uc591\uc2dd\uc5d0\uc11c \uacf5\uac1c, \uc0ac\uc124, \ubc0f \ud558\uc774\ube0c\ub9ac\ub4dc\uc758 Infrastructure as a Service (IaaS) \ud074\ub77c\uc6b0\ub4dc\ub97c \uad6c\ucd95\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. CloudStack\u2122\ub97c \uc0ac\uc6a9\ud558\uace0, \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0\ub97c \uad6c\uc131\ud558\ub294 \ub124\ud2b8\uc6cc\ud06c, \uc2a4\ud1a0\ub9ac\uc9c0 \ubc0f \ucef4\ud4e8\ud305 \ub178\ub4dc\ub97c \uad00\ub9ac\ud558\uace0 \ud074\ub77c\uc6b0\ub4dc \ucef4\ud4e8\ud305 \ud658\uacbd\uc744 \uc124\uc815, \uad00\ub9ac \ubc0f \uad6c\uc131\ud569\ub2c8\ub2e4.

CloudStack\u2122\uc740 \ud558\ub4dc\uc6e8\uc5b4\uc0c1\uc5d0\uc11c \ub3d9\uc791\ud558\ub294 \uac1c\ubcc4 \uac00\uc0c1 \uba38\uc2e0 \uc774\ubbf8\uc9c0\ub97c \ub118\uc5b4 \ud655\uc7a5\ud560 \uc218 \uc788\uae30 \ub54c\ubb38\uc5d0 \uac04\ub2e8\ud55c \uc124\uc815\uc73c\ub85c \ub3d9\uc791\ud558\ub294 \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0 \uc18c\ud504\ud2b8\uc6e8\uc5b4 \uc2a4\ud0dd\uc5d0 \uc758\ud574 \uac00\uc0c1 \ub370\uc774\ud130 \uc13c\ud130 \uc989 \uc5ec\ub7ec \uce35\ud615 \uba40\ud2f0 \uc138\uc785\uc790 \ud074\ub77c\uc6b0\ub4dc \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc744 \uc11c\ube44\uc2a4\ub85c\uc11c \uad6c\ucd95\ud558\uace0 \uc124\uc815\ud558\uace0 \uad00\ub9ac\ud558\uae30 \uc704\ud574\uc11c \ubd88\uac00\uacb0\ud55c \ud56d\ubaa9\uc744 \ubaa8\ub450 \uc81c\uacf5\ud569\ub2c8\ub2e4. \uc624\ud508 \uc18c\uc2a4 \ubc84\uc804\uacfc \ud504\ub9ac\ubbf8\uc5c4 \ubc84\uc804 \uc591\ucabd \ubaa8\ub450\uc5d0 \uc81c\uacf5\ud558\uba70 \uc624\ud508 \uc18c\uc2a4 \ubc84\uc804\uc5d0\uc11c\ub3c4 \ub300\ubd80\ubd84 \uae30\ub2a5\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.installWizard.copy.whatIsPrimaryStorage=CloudStack\u2122 \ud074\ub77c\uc6b0\ub4dc \uc778\ud504\ub77c\uc2a4\ud2b8\ub7ed\uccd0\uc5d0\uc11c\ub294 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc640 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 \ub450 \uc885\ub958\uc758 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. \uc591\ucabd \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0\uc11c iSCSI, NFS \uc11c\ubc84, \ub610\ub294 \ub85c\uceec \ub514\uc2a4\ud06c\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 \ud074\ub7ec\uc2a4\ud130\uc5d0 \uad00\ub828\ub418\uc5b4\uadf8 \ud074\ub7ec\uc2a4\ud130\ub0b4\uc758 \ud638\uc2a4\ud2b8\ub85c \ub3d9\uc791\ud558\ub294 \ubaa8\ub4e0 VM \uc911 \uac01 \uac8c\uc2a4\ud2b8 VM\uc758 \ub514\uc2a4\ud06c \ubcfc\ub968\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4. \uc6d0\ub798, \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \uc11c\ubc84\ub294 \ud638\uc2a4\ud2b8 \uadfc\ucc98\uc5d0 \uc124\uce58\ud569\ub2c8\ub2e4. -message.installWizard.copy.whatIsSecondaryStorage=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub294 Zone\uacfc \uad00\ub828\ub3e4 \uc544\ub798\uc758 \ud56d\ubaa9\uc744 \ud3ec\ud568\ud569\ub2c8\ub2e4.
  • \ud15c\ud50c\ub9bf - VM \uc2dc\uc791 \uc2dc \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 OS \uc774\ubbf8\uc9c0\ub85c \uc560\ud50c\ub9ac\ucf00\uc774\uc158\uc758 \uc124\uce58 \ub4f1 \ucd94\uac00 \uad6c\uc131\uc744 \ud3ec\ud568\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
  • ISO \uc774\ubbf8\uc9c0 - \ubc14\ub85c \uc2dc\uc791 \uac00\ub2a5 \ub610\ub294 \uc2dc\uc791 \ubd88\uac00\uc758 OS \uc774\ubbf8\uc9c0\uc785\ub2c8\ub2e4.
  • \ub514\uc2a4\ud06c \ubcfc\ub968 \uc2a4\ub0c5\uc0f7 - VM \ub370\uc774\ud130 \uc800\uc7a5 \ubcf5\uc0ac\ubcf8\uc785\ub2c8\ub2e4. \ub370\uc774\ud130\uc758 \ubcf5\uc6d0 \ub610\ub294 \uc0c8\ub85c\uc6b4 \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.
-message.installWizard.now.building=\ud074\ub77c\uc6b0\ub4dc\ub97c \uad6c\ucd95\ud558\uace0 \uc788\ub294 \uc911... -message.installWizard.tooltip.addCluster.name=\ud074\ub7ec\uc2a4\ud130 \uc774\ub984\uc785\ub2c8\ub2e4. CloudStack\uc5d0\uc11c \uc608\uc57d\ud558\uc9c0 \uc54a\uc740 \uc784\uc758 \ud14d\uc2a4\ud2b8\ub97c \uc9c0\uc815\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.installWizard.tooltip.addHost.hostname=\ud638\uc2a4\ud2b8 DNS \uba85 \ub610\ub294 IP \uc8fc\uc18c\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addHost.password=XenServer \uce21\uc5d0\uc11c \uc9c0\uc815\ud55c \uc704\uc758 \uc0ac\uc6a9\uc790\uba85\uc5d0 \ub300\ud55c \uc554\ud638\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addHost.username=\uc6d0\ub798 root \uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addPod.name=Pod \uc774\ub984\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addPod.reservedSystemEndIp=\uc774\uac83\uc740 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 VM \ubc0f \ucf58\uc194 \ud504\ub85d\uc2dc VM\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574\uc11c CloudStack\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c\ub0b4 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 \ucef4\ud4e8\ud305 \uc11c\ubc84\uc640 \uac19\uc740 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ud560\ub2f9\ud569\ub2c8\ub2e4. -message.installWizard.tooltip.addPod.reservedSystemGateway=\ud604\uc7ac Pod\ub0b4 \ud638\uc2a4\ud2b8 \uac8c\uc774\ud2b8\uc6e8\uc774\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addPod.reservedSystemNetmask=\uac8c\uc2a4\ud2b8\uac00 \uc0ac\uc6a9\ud558\ub294 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0\uc11c \uc9c0\uc815\ud55c \ub137 \ub9c8\uc2a4\ud06c\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addPod.reservedSystemStartIp=\uc774\uac83\uc740 2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0 VM \ubc0f \ucf58\uc194 \ud504\ub85d\uc2dc VM\ub97c \uad00\ub9ac\ud558\uae30 \uc704\ud574\uc11c CloudStack\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c\ub0b4\uc758 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 \ucef4\ud4e8\ud305 \uc11c\ubc84\uc640 \uac19\uc740 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c \ud560\ub2f9\ud569\ub2c8\ub2e4. -message.installWizard.tooltip.addPrimaryStorage.name=\uc2a4\ud1a0\ub9ac\uc9c0 \uae30\uae30\uc758 \uc774\ub984\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addPrimaryStorage.path=(NFS\uc758 \uacbd\uc6b0) \uc11c\ubc84\uc5d0\uc11c \ub0b4\ubcf4\ub0b4\uae30 \uacbd\ub85c\uc785\ub2c8\ub2e4. (SharedMountPoint\uc758 \uacbd\uc6b0) \uc77c\ubc18 \uacbd\ub85c\uc785\ub2c8\ub2e4. KVM\uc5d0\uc11c\ub294 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uac00 \ub9c8\uc6b4\ud2b8\ub418\ub294 \uac01 \ud638\uc2a4\ud2b8\uc0c1\uc758 \uacbd\ub85c\uc785\ub2c8\ub2e4. \uc608\ub97c \ub4e4\uc5b4, /mnt/primary \uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addPrimaryStorage.server=(NFS, iSCSI \ub610\ub294 PreSetup\uc758 \uacbd\uc6b0) \uc2a4\ud1a0\ub9ac\uc9c0 \uae30\uae30\uc758 IP \uc8fc\uc18c \ub610\ub294 DNS \uba85\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=2\ucc28 \uc2a4\ud1a0\ub9ac\uc9c0\ub97c \ud638\uc2a4\ud2b8 \ud558\ub294 NFS \uc11c\ubc84 IP \uc8fc\uc18c\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addSecondaryStorage.path=\uc704\uc5d0\uc11c \uc9c0\uc815\ud55c \uc11c\ubc84\uc5d0 \uc874\uc7ac\ud558\ub294 \ub0b4\ubcf4\ub0b4\uae30 \uacbd\ub85c\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.addZone.dns1=Zone\ub0b4\uc758 \uac8c\uc2a4\ud2b8 VM\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \uc774\ub7ec\ud55c DNS \uc11c\ubc84\uc5d0\ub294 \ub2e4\uc74c\uc5d0 \ucd94\uac00\ud558\ub294 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c \uacbd\uc720\ub85c \uc811\uadfc \ud569\ub2c8\ub2e4. Zone\uc758 \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 \uacf5\uac1c DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.installWizard.tooltip.addZone.dns2=Zone\ub0b4 \uac8c\uc2a4\ud2b8 VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \ud604\uc7ac DNS \uc11c\ubc84\uc5d0\ub294 \ub2e4\uc74c\uc5d0 \ucd94\uac00\ud558\ub294 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c \uacbd\uc720\ub85c \uc811\uadfc\ud569\ub2c8\ub2e4. Zone\uc758 \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 \uacf5\uac1c DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.installWizard.tooltip.addZone.internaldns1=Zone\ub0b4\uc758 \uc2dc\uc2a4\ud15c VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \ud604\uc7ac DNS \uc11c\ubc84\ub294 \uc2dc\uc2a4\ud15c VM\uc758 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac1c\uc785\uc2dc\ucf1c \uc811\uadfc\ud569\ub2c8\ub2e4. Pod\uc758 \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.installWizard.tooltip.addZone.internaldns2=Zone\ub0b4 \uc2dc\uc2a4\ud15c VM\uc73c\ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84\uc785\ub2c8\ub2e4. \ud604\uc7ac DNS \uc11c\ubc84\ub294 \uc2dc\uc2a4\ud15c VM\uc758 \uc0ac\uc124 \ub124\ud2b8\uc6cc\ud06c \uc778\ud130\ud398\uc774\uc2a4\ub97c \uac1c\uc785\uc2dc\ucf1c \uc811\uadfc\ud569\ub2c8\ub2e4. Pod\uc758 \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc5ec\uae30\uc11c \uc9c0\uc815\ud558\ub294 DNS \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.installWizard.tooltip.addZone.name=Zone\uc758 \uc774\ub984\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.configureGuestTraffic.description=\ub124\ud2b8\uc6cc\ud06c \uc124\uba85\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=\ud604\uc7ac Zone\uc758 \uac8c\uc2a4\ud2b8\uc5d0\uac8c \ud560\ub2f9\ud560 \uc218 \uc788\ub294 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\ud558\ub294 NIC\uac00 \ud55c \uac00\uc9c0\uc778 \uacbd\uc6b0\ub294 \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 Pod\uc758 CIDR\uc640 \uac19\uc740 CIDR\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=\uac8c\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uac8c\uc774\ud2b8\uc6e8\uc774\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=\uac8c\uc2a4\ud2b8\uc5d0\uc11c \uc0ac\uc6a9\ud558\ub294 \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\uc0c1\uc5d0\uc11c \uc0ac\uc6a9\ub418\ub294 \ub137 \ub9c8\uc2a4\ud06c\uc785\ub2c8\ub2e4. -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=\ud604\uc7ac Zone\uc758 \uac8c\uc2a4\ud2b8\uc5d0\uac8c \ud560\ub2f9\ud560 \uc218 \uc788\ub294 IP \uc8fc\uc18c \ubc94\uc704\uc785\ub2c8\ub2e4. \uc0ac\uc6a9\ud558\ub294 NIC\uac00 \ud55c \uac00\uc9c0 \uacbd\uc6b0\ub294 \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub294 Pod\uc758 CIDR\uc640 \uac19\uc740 CIDR\uc5d0 \ud3ec\ud568\ub418\uc5b4 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.installWizard.tooltip.configureGuestTraffic.name=\ub124\ud2b8\uc6cc\ud06c \uc774\ub984\uc785\ub2c8\ub2e4. -message.instanceWizard.noTemplates=\uc0ac\uc6a9 \uac00\ub2a5\ud55c \ud15c\ud50c\ub9bf\uc774 \uc5c6\uc2b5\ub2c8\ub2e4. \ud638\ud658\uc131\uc774 \uc788\ub294 \ud15c\ud50c\ub9bf\uc744 \ucd94\uac00\ud558\uace0, \uc778\uc2a4\ud134\uc2a4 \uc704\uc800\ub4dc\ub97c \uc7ac\uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.ip.address.changed=\uc0ac\uc6a9 IP \uc8fc\uc18c\uac00 \ubcc0\uacbd\ub41c \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4. \ubaa9\ub85d\uc744 \uc5c5\ub370\uc774\ud2b8\ud569\ub2c8\uae4c? \uadf8 \uacbd\uc6b0\ub294 \uc0c1\uc138 \uc124\uc815\ucc3d\uc774 \ub2eb\ub294 \uac83\uc5d0 \uc8fc\uc758\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.iso.desc=\ub370\uc774\ud130 \ub610\ub294 OS \uc2dc\uc791 \uac00\ub2a5 \ubbf8\ub514\uc5b4\ub97c \ud3ec\ud568\ud55c \ub514\uc2a4\ud06c \uc774\ubbf8\uc9c0 -message.join.project=\uc774\uac83\uc73c\ub85c, \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucc38\uc5ec\ud588\uc2b5\ub2c8\ub2e4. \ud504\ub85c\uc81d\ud2b8\ub97c \ucc38\uc870\ud558\ub824\uba74 \ud504\ub85c\uc81d\ud2b8 \ubcf4\uae30\ub85c \uc804\ud658\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.launch.vm.on.private.network=\uc0ac\uc801 \uc804\uc6a9 \ub124\ud2b8\uc6cc\ud06c\ub85c \uc778\uc2a4\ud134\uc2a4\ub97c \uc2dc\uc791\ud569\ub2c8\uae4c? -message.launch.zone=Zone\uc744 \uc2dc\uc791\ud560 \uc900\ube44\uac00 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. \ub2e4\uc74c \uc21c\uc11c\uc5d0 \ub530\ub77c \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.lock.account=\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4\ub97c \uc7a0\uadf8\uc5b4\ub3c4 \uc88b\uc2b5\ub2c8\uae4c? \uc774 \uacc4\uc815 \uc815\ubcf4 \ubaa8\ub4e0 \uc0ac\uc6a9\uc790\uac00 \ud074\ub77c\uc6b0\ub4dc \uc790\uc6d0\uc744 \uad00\ub9ac\ud560 \uc218 \uc5c6\uac8c \ub429\ub2c8\ub2e4. \uadf8 \ud6c4\ub3c4 \uae30\uc874 Zone \uc790\uc6d0\uc5d0\ub294 \uc811\uadfc \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.migrate.instance.confirm=\uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 \uc774\uc804 \uc704\uce58\ub294 \ub2e4\uc74c \ud638\uc2a4\ud2b8\ub85c \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.migrate.instance.to.host=\ub2e4\ub978 \ud638\uc2a4\ud2b8\uc5d0\uac8c \uc778\uc2a4\ud134\uc2a4\ub97c \uc774\uc804\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.migrate.instance.to.ps=\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc774\uc804\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.migrate.router.confirm=\ub77c\uc6b0\ud130 \uc774\uc804 \uc704\uce58\ub85c \ud638\uc2a4\ud2b8\ub97c \uc120\ud0dd\uc2ed\uc2dc\uc624. -message.migrate.systemvm.confirm=\uc2dc\uc2a4\ud15c VM \uc774\uc804 \uc774\uc804 \uc704\uce58\ub85c \ud638\uc2a4\ud2b8\ub97c \uc120\ud0dd\uc2ed\uc2dc\uc624. -message.migrate.volume=\ub2e4\ub978 \uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0\uc5d0 \ubcfc\ub968\uc744 \uc774\uc804\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.new.user=\uacc4\uc815 \uc815\ubcf4\uc5d0 \uc0c8\ub85c\uc6b4 \uc0ac\uc6a9\uc790\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.no.network.support.configuration.not.true=\ubcf4\uc548 \uadf8\ub8f9\uc774 \uc720\ud6a8\ud55c Zone\uc774 \uc5c6\uae30 \ub54c\ubb38\uc5d0 \ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c \uae30\ub2a5\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e8\uacc4 5\ub85c \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.no.network.support=\ud558\uc774\ud37c \ubc14\uc774\uc800\ub85c\uc11c vSphere\ub97c \uc120\ud0dd\ud588\uc73c\ub098 \uc774 \ud558\uc774\ud37c \ubc14\uc774\uc800\uc5d0 \ucd94\uac00 \ub124\ud2b8\uc6cc\ud06c \uae30\ub2a5\uc740 \uc5c6\uc2b5\ub2c8\ub2e4. \ub2e8\uacc4 5\ub85c \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.no.projects.adminOnly=\ud504\ub85c\uc81d\ud2b8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
\uad00\ub9ac\uc790\uc5d0\uac8c \uc0c8\ub85c\uc6b4 \ud504\ub85c\uc81d\ud2b8 \uc0dd\uc131\uc744 \uc758\ub8b0\ud558\uc2ed\uc2dc\uc624. -message.no.projects=\ud504\ub85c\uc81d\ud2b8\uac00 \uc5c6\uc2b5\ub2c8\ub2e4.
\ud504\ub85c\uc81d\ud2b8 \uc139\uc158\uc5d0\uc11c \uc0c8\ub85c\uc6b4 \ud504\ub85c\uc81d\ud2b8\ub97c \ub9cc\ub4e4\uc5b4 \uc8fc\uc2ed\uc2dc\uc624. -message.number.clusters=

\ud074\ub7ec\uc2a4\ud130\uc218

-message.number.hosts=

\ud638\uc2a4\ud2b8\uc218

-message.number.pods=

Pod\uc218

-message.number.storage=

\uae30\ubcf8 \uc2a4\ud1a0\ub9ac\uc9c0 \ubcfc\ub968\uc218

-message.number.zones=

Zone\uc218

-message.pending.projects.1=\ubcf4\ub958\uc911\uc778 \ud504\ub85c\uc81d\ud2b8 \ucd08\ub300\uc7a5\uc774 \uc788\uc2b5\ub2c8\ub2e4. -message.pending.projects.2=\ud45c\uc2dc\ud558\ub824\uba74 \ud504\ub85c\uc81d\ud2b8 \uc139\uc158\uc73c\ub85c \uc774\ub3d9\ud558\uace0 \ubaa9\ub85d\uc5d0\uc11c \ucd08\ub300\uc7a5\uc744 \uc120\ud0dd\ud569\ub2c8\ub2e4. -message.please.add.at.lease.one.traffic.range=\uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \ud2b8\ub798\ud53d \ubc94\uc704\ub97c \ucd94\uac00\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.please.proceed=\ub2e4\uc74c\uc758 \uc21c\uc11c\uc5d0 \uc9c4\ud589\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.please.select.a.configuration.for.your.zone=Zone \uad6c\uc131\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.please.select.a.different.public.and.management.network.before.removing=\uc0ad\uc81c \uc804\uc5d0 \ub2e4\ub978 \uacf5\uac1c \ubc0f \uad00\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.please.select.networks=\uac00\uc0c1 \uba38\uc2e0 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.please.wait.while.zone.is.being.created=Zone\uc774 \ub9cc\ub4e4\uae30\ub420 \ub54c\uae4c\uc9c0 \uc7a0\uae50 \uae30\ub2e4\ub824 \uc8fc\uc2ed\uc2dc\uc624... -message.project.invite.sent=\uc0ac\uc6a9\uc790\uc5d0\uac8c \ucd08\ub300\uc7a5\uc774 \uc804\uc1a1\ub418\uc5c8\uc2b5\ub2c8\ub2e4. \uc0ac\uc6a9\uc790\uac00 \ucd08\ub300\ub97c \uc2b9\uc778\ud558\uba74, \ud504\ub85c\uc81d\ud2b8\uc5d0 \ucd94\uac00\ub429\ub2c8\ub2e4. -message.public.traffic.in.advanced.zone=\ud074\ub77c\uc6b0\ub4dc \ub0b4\ubd80 VM\uc774 \uc778\ud130\ub137\uc5d0 \uc811\uadfc \ud558\uba74, \uacf5\uac1c \ud2b8\ub798\ud53d\uc774 \uc0dd\uc131\ub429\ub2c8\ub2e4. \uc774 \ub54c\ubb38\uc5d0 \uc77c\ubc18\uc801\uc73c\ub85c \uc811\uadfc \uac00\ub2a5\ud55c IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \ucd5c\uc885 \uc0ac\uc6a9\uc790\ub294 CloudStack \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud574 \uc774\ub7ec\ud55c IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\uace0 \uc190\ub2d8 \ub124\ud2b8\uc6cc\ud06c\uc640 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c \uc0ac\uc774\uc5d0 NAT\ub97c \uad6c\ud604\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

\uc778\ud130\ub137 \ud2b8\ub798\ud53d\uc744 \uc704\ud574 \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 IP \uc8fc\uc18c \ubc94\uc704\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.public.traffic.in.basic.zone=\ud074\ub77c\uc6b0\ub4dc \ub0b4\ubd80 VM\uc774 \uc778\ud130\ub137\uc5d0 \uc811\uadfc \ud560 \ub54c \uc778\ud130\ub137 \uacbd\uc720\ub85c \ud074\ub77c\uc774\uc5b8\ud2b8\uc5d0 \uc11c\ube44\uc2a4\ub97c \uc81c\uacf5\ud558\uba74, \uacf5\uac1c \ud2b8\ub798\ud53d\uc774 \uc0dd\uc131\ub429\ub2c8\ub2e4. \uc774 \ub54c\ubb38\uc5d0 \uc77c\ubc18\uc801\uc73c\ub85c \uc811\uadfc \uac00\ub2a5\ud55c IP \uc8fc\uc18c\ub97c \ud560\ub2f9\ud560 \ud544\uc694\uac00 \uc788\uc2b5\ub2c8\ub2e4. \uc778\uc2a4\ud134\uc2a4\ub97c \ub9cc\ub4e4\uae30\ud558\uba74, \uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c \uc678\uc5d0\uc774 \uacf5\uac1c IP \uc8fc\uc18c \ubc94\uc704\uc5d0\uc11c \uc8fc\uc18c\uac00 \ud558\ub098\uc758 \uc778\uc2a4\ud134\uc2a4\uc5d0 \ud560\ub2f9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \uacf5\uac1c IP \uc8fc\uc18c\uc640 \uac8c\uc2a4\ud2b8 IP \uc8fc\uc18c \uc0ac\uc774\uc5d0 \uc815\uc801\uc778 1\ub300 1 NAT\uac00 \uc790\ub3d9\uc73c\ub85c \uc124\uc815 \ub429\ub2c8\ub2e4. \ucd5c\uc885 \uc0ac\uc6a9\uc790\ub294 CloudStack \uc0ac\uc6a9\uc790 \uc778\ud130\ud398\uc774\uc2a4\ub97c \uc0ac\uc6a9\ud574 \ucd94\uac00 IP \uc8fc\uc18c\ub97c \ucde8\ub4dd\ud558\uace0 \uc778\uc2a4\ud134\uc2a4\uc640 \uacf5\uac1c IP \uc8fc\uc18c \uc0ac\uc774\uc5d0 \uc815\uc801 NAT\ub97c \uad6c\ud604\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. -message.remove.vpc=VPC\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.remove.vpn.access=\ub2e4\uc74c \uc0ac\uc6a9\uc790\uc5d0\uc11c VPN \uc811\uadfc\ub97c \uc0ad\uc81c\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.reset.password.warning.notPasswordEnabled=\ud604\uc7ac \uc778\uc2a4\ud134\uc2a4 \ud15c\ud50c\ub9bf\uc740 \uc554\ud638 \uad00\ub9ac\ub97c \uc0ac\uc6a9 \ud558\uc9c0 \uc54a\uace0 \uc0dd\uc131\ub418\uc5c8\uc2b5\ub2c8\ub2e4. -message.reset.password.warning.notStopped=\ud604\uc7ac \uc554\ud638\ub97c \ubcc0\uacbd\ud558\uae30 \uc804\uc5d0 \uc778\uc2a4\ud134\uc2a4\ub97c \uc815\uc9c0\ud574\uc57c \ud569\ub2c8\ub2e4. -message.reset.VPN.connection=VPN \uc811\uc18d\uc744 \uc7ac\uc124\uc815 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.restart.mgmt.server=\uc0c8\ub85c\uc6b4 \uc124\uc815\uc744 \uc0ac\uc6a9 \ud558\uae30 \uc704\ud574 \uad00\ub9ac \uc11c\ubc84\ub97c \uc7ac\uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.restart.mgmt.usage.server=\uc0c8\ub85c\uc6b4 \uc124\uc815\uc744 \uc0ac\uc6a9 \ud558\uae30 \uc704\ud574 \uad00\ub9ac \uc11c\ubc84\uc640 \uc0ac\uc6a9 \uc0c1\ud669 \uce21\uc815 \uc11c\ubc84\ub97c \uc7ac\uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.restart.network=\ud604\uc7ac \ub124\ud2b8\uc6cc\ud06c\ub85c \uc81c\uacf5\ud558\ub294 \ubaa8\ub4e0 \uc11c\ube44\uc2a4\uac00 \uc911\ub2e8\ub429\ub2c8\ub2e4. \uc774 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.restart.vpc=VPC\ub97c \uc7ac\uc2dc\uc791\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.security.group.usage=(\ud574\ub2f9\ud558\ub294 \ubcf4\uc548 \uadf8\ub8f9\uc744 \ubaa8\ub450 \uc120\ud0dd\ud558\ub824\uba74 Ctrl \ud0a4\ub97c \ub204\ub974\uba74\uc11c \ud074\ub9ad\ud574 \uc8fc\uc2ed\uc2dc\uc624) -message.select.a.zone=Zone\uc740 \uc6d0\ub798 \ub2e8\uc77c \ub370\uc774\ud130 \uc13c\ud130\uc5d0 \ud574\ub2f9\ud569\ub2c8\ub2e4. \ubcf5\uc218 Zone\uc744 \uc124\uc815\ud558\uace0 \ubb3c\ub9ac\uc801\uc73c\ub85c \ubd84\ub9ac\ud558\ub294 \ubc29\ubc95\uc73c\ub85c \ud074\ub77c\uc6b0\ub4dc\uc758 \uc2e0\ub8b0\uc131\uc744 \ub192\uc77c \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.select.instance=\uc778\uc2a4\ud134\uc2a4\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.select.iso=\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 ISO\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.select.item=\ud56d\ubaa9\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.select.security.groups=\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uba38\uc2e0 \ubcf4\uc548 \uadf8\ub8f9\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.select.template=\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4 \ud15c\ud50c\ub9bf\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.setup.physical.network.during.zone.creation.basic=\uae30\ubcf8 Zone\uc744 \ucd94\uac00\ud560 \ub54c\ub294 \ud558\uc774\ud37c \ubc14\uc774\uc800\uc0c1\uc758 \ub124\ud2b8\uc6cd\uce74\ub4dc(NIC)\uc5d0 \ub300\uc751\ud558\ub294 \ud55c \uac00\uc9c0 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc124\uc815 \ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ub124\ud2b8\uc6cc\ud06c\ub294 \uba87 \uac00\uc9c0 \uc885\ub958\uc758 \ud2b8\ub798\ud53d\uc744 \uc804\uc1a1\ud569\ub2c8\ub2e4.

\ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uc5d0 \ub2e4\ub978 \ud2b8\ub798\ud53d\uc758 \uc885\ub958\ub97c\ub4dc\ub798\uadf8 \uc564 \ub4dc\ub86d \ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. -message.setup.physical.network.during.zone.creation=\ud655\uc7a5 Zone\uc744 \ucd94\uac00\ud560 \ub54c\ub294 \ud55c \uac1c \uc774\uc0c1 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\ub97c \uc124\uc815\ud574\uc57c \ud569\ub2c8\ub2e4. \uac01 \ub124\ud2b8\uc6cc\ud06c\ub294 \ud558\uc774\ud37c \ubc14\uc774\uc800\uc0c1 \ud55c \uac00\uc9c0 \ub124\ud2b8\uc6cc\ud06c \uce74\ub4dc(NIC)\uc5d0 \ub300\uc751\ud569\ub2c8\ub2e4. \uac01 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uc5d0\uc11c\ub294 \uad6c\uc131\uc5d0 \uc81c\ud55c\uc774 \uc788\uc73c\ub098, \ud55c \uac00\uc9c0 \uc885\ub958 \uc774\uc0c1 \ud2b8\ub798\ud53d\uc744 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4.

\uac01 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uc5d0 \ub300\ud574\uc11c\ud2b8\ub798\ud53d \uc885\ub958\ub97c \ub4dc\ub798\uadf8 \uc564 \ub4dc\ub86d\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.setup.successful=\ud074\ub77c\uc6b0\ub4dc\uac00 \uc124\uc815 \ub418\uc5c8\uc2b5\ub2c8\ub2e4. -message.specify.url=URL\ub97c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624 -message.step.1.continue=\uc2e4\ud589\ud558\ub824\uba74 \ud15c\ud50c\ub9bf \ub610\ub294 ISO\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.step.1.desc=\uc0c8\ub85c\uc6b4 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uc6a9 \ud15c\ud50c\ub9bf\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.ISO\ub97c \uc124\uce58 \ud560 \uc218 \uc788\ub294 \uacf5\ubc31 \ud15c\ud50c\ub9bf\uc744 \uc120\ud0dd\ud560 \uc218\ub3c4 \uc788\uc2b5\ub2c8\ub2e4. -message.step.2.continue=\uc2e4\ud589\ud558\ub824\uba74 \uc11c\ube44\uc2a4\uc81c\uacf5\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.step.3.continue=\uc2e4\ud589\ud558\ub824\uba74 \ub514\uc2a4\ud06c\uc81c\uacf5\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.step.4.continue=\uc2e4\ud589\ud558\ub824\uba74 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.step.4.desc=\uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\uac00 \uc811\uc18d\ud558\ub294 \uae30\ubcf8 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.storage.traffic=\ud638\uc2a4\ud2b8\ub098 CloudStack \uc2dc\uc2a4\ud15c VM \ub4f1 \uad00\ub9ac \uc11c\ubc84\uc640 \ud1b5\uc2e0\ud558\ub294 CloudStack \ub0b4\ubd80 \uc790\uc6d0\uac04 \ud2b8\ub798\ud53d\uc785\ub2c8\ub2e4. \uc5ec\uae30\uc11c \uc2a4\ud1a0\ub9ac\uc9c0 \ud2b8\ub798\ud53d\uc744 \uad6c\uc131\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.suspend.project=\ud604\uc7ac \ud504\ub85c\uc81d\ud2b8\ub97c \uc77c\uc2dc\uc815\uc9c0\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.template.desc=VM\uc758 \uc2dc\uc791\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub294 OS \uc774\ubbf8\uc9c0 -message.tooltip.dns.1=Zone\ub0b4 VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Zone \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.tooltip.dns.2=Zone\ub0b4 VM \ub85c \uc0ac\uc6a9\ud558\ub294 \ub450\ubc88\uc9f8 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Zone \uacf5\uac1c IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.tooltip.internal.dns.1=Zone\ub0b4 CloudStack \ub0b4\ubd80 \uc2dc\uc2a4\ud15c VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Pod \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.tooltip.internal.dns.2=Zone\ub0b4 CloudStack \ub0b4\ubd80 \uc2dc\uc2a4\ud15c VM \ub85c \uc0ac\uc6a9\ud558\ub294 DNS \uc11c\ubc84 \uc774\ub984\uc785\ub2c8\ub2e4. Pod \uc0ac\uc124 IP \uc8fc\uc18c\uc5d0\uc11c \uc774 \uc11c\ubc84\uc5d0 \ud1b5\uc2e0\ud560 \uc218 \uc788\uc5b4\uc57c \ud569\ub2c8\ub2e4. -message.tooltip.network.domain=DNS \uc11c\ud53d\uc2a4\uc785\ub2c8\ub2e4. \uc774 \uc11c\ud53d\uc2a4\uc5d0\uc11c \uac8c\uc2a4\ud2b8 VM \ub85c \uc811\uadfc \ud558\ub294 \ub124\ud2b8\uc6cc\ud06c \ub9de\ucda4\ud615 \ub3c4\uba54\uc778\uba85\uc744 \ub9cc\ub4ed\ub2c8\ub2e4. -message.tooltip.pod.name=\ud604\uc7ac Pod \uc774\ub984\uc785\ub2c8\ub2e4. -message.tooltip.reserved.system.gateway=Pod\ub0b4 \ud638\uc2a4\ud2b8 \uac8c\uc774\ud2b8\uc6e8\uc774\uc785\ub2c8\ub2e4. -message.tooltip.reserved.system.netmask=Pod \uc11c\ube0c\ub124\ud2b8\uc6cc\ud06c\ub97c \uc815\ud558\ub294 \ub124\ud2b8\uc6cc\ud06c \ud504\ub808\ud53d\uc2a4\uc785\ub2c8\ub2e4. CIDR \ud45c\uae30\ub97c \uc0ac\uc6a9\ud569\ub2c8\ub2e4. -message.tooltip.zone.name=Zone \uc774\ub984\uc785\ub2c8\ub2e4. -message.update.os.preference=\ud604\uc7ac \ud638\uc2a4\ud2b8 OS \uae30\ubcf8 \uc124\uc815\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624.\uac19\uc740 \uae30\ubcf8 \uc124\uc815\uc744 \uac00\uc9c0\ub294 \ubaa8\ub4e0 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\ub294 \ub2e4\ub978 \ud638\uc2a4\ud2b8\ub97c \uc120\ud0dd\ud558\uae30 \uc804\uc5d0 \uc6b0\uc120\uc774 \ud638\uc2a4\ud2b8\uac00 \ud560\ub2f9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. -message.update.resource.count=\ud604\uc7ac \uacc4\uc815 \uc815\ubcf4 \uc790\uc6d0\uc218\ub97c \uc5c5\ub370\uc774\ud2b8\ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.update.ssl=\uac01 \ucf58\uc194 \ud504\ub85d\uc2dc \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\ub85c \uc5c5\ub370\uc774\ud2b8\ud558\ub294 X.509 \uae30\ubc18 \uc0c8 SSL \uc778\uc99d\uc11c\ub97c \uc804\uc1a1\ud574 \uc8fc\uc2ed\uc2dc\uc624\: -message.validate.instance.name=\uc778\uc2a4\ud134\uc2a4\uba85\uc740 63 \ubb38\uc790 \uc774\ub0b4\uc5d0\uc11c \uc9c0\uc815\ud574 \uc8fc\uc2ed\uc2dc\uc624. ASCII \ubb38\uc790\uc758 a-z, A-Z, \uc22b\uc790\uc758 0-9 \ubc0f \ud558\uc774\ud508\ub9cc\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\uc2b5\ub2c8\ub2e4. \ubb38\uc790\ub85c \uc2dc\uc791\ud558\uc5ec \ubb38\uc790 \ub610\ub294 \uc22b\uc790\ub85c \ub05d\ub0b4\uc57c \ud569\ub2c8\ub2e4. -message.virtual.network.desc=\uacc4\uc815 \uc815\ubcf4 \uc804\uc6a9 \uac00\uc0c1 \ub124\ud2b8\uc6cc\ud06c\uc785\ub2c8\ub2e4. \ube0c\ub85c\ub4dc\uce90\uc2a4\ud2b8 \ub3c4\uba54\uc778\uc740 VLAN \ub0b4\uc5d0 \ubc30\uce58\ub418\uc5b4 \uacf5\uac1c \ub124\ud2b8\uc6cc\ud06c\uc5d0 \uc811\uadfc\ub294 \ubaa8\ub450 \uac00\uc0c1 \ub77c\uc6b0\ud130\uc5d0 \ud574\uc11c \ub8e8\ud305 \ub429\ub2c8\ub2e4. -message.vm.create.template.confirm=\ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\ud558\uba74 VM\uc774 \uc790\ub3d9\uc73c\ub85c \uc7ac\uc2dc\uc791\ub429\ub2c8\ub2e4. -message.vm.review.launch=\ub2e4\uc74c\uc758 \uc815\ubcf4\ub97c \ucc38\uc870\ud558\uace0 \uac00\uc0c1 \uc778\uc2a4\ud134\uc2a4\ub97c \uc62c\ubc14\ub974\uac8c \uc124\uc815\ud55c \uac83\uc744 \ud655\uc778\ud558\uace0 \ub098\uc11c \uc2dc\uc791\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.volume.create.template.confirm=\ud604\uc7ac \ub514\uc2a4\ud06c \ubcfc\ub968 \ud15c\ud50c\ub9bf\uc744 \ub9cc\ub4dc\uc2dc\uaca0\uc2b5\ub2c8\uae4c? \ubcfc\ub968 \ud06c\uae30\uc5d0 \ub530\ub77c \ud15c\ud50c\ub9bf \ub9cc\ub4e4\uae30\uc5d0 \uba87 \ubd84 \uc774\uc0c1 \uac78\ub9b4 \uac00\ub2a5\uc131\uc774 \uc788\uc2b5\ub2c8\ub2e4. -message.you.must.have.at.least.one.physical.network=\uc801\uc5b4\ub3c4 \ud55c \uac1c \uc774\uc0c1 \ubb3c\ub9ac \ub124\ud2b8\uc6cc\ud06c\uac00 \ud544\uc694\ud569\ub2c8\ub2e4 -message.zone.creation.complete.would.you.like.to.enable.this.zone=Zone\uc744 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. \uc774 Zone\uc744 \uc0ac\uc6a9 \ud558\uc2dc\uaca0\uc2b5\ub2c8\uae4c? -message.Zone.creation.complete=Zone\uc744 \ub9cc\ub4e4\uc5c8\uc2b5\ub2c8\ub2e4. -message.zone.no.network.selection=\uc120\ud0dd\ud55c Zone\uc5d0\uc11c\ub294 \ub124\ud2b8\uc6cc\ud06c\ub97c \uc120\ud0dd\ud560 \uc218 \uc5c6\uc2b5\ub2c8\ub2e4. -message.zone.step.1.desc=Zone \ub124\ud2b8\uc6cc\ud06c \ubaa8\ub378\uc744 \uc120\ud0dd\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.zone.step.2.desc=\uc0c8 Zone\uc744 \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -message.zone.step.3.desc=\uc0c8 Pod\ub97c \ucd94\uac00\ud558\uae30 \uc704\ud574 \uc544\ub798 \uc815\ubcf4\ub97c \uc785\ub825\ud574 \uc8fc\uc2ed\uc2dc\uc624. -mode=\ubaa8\ub4dc -network.rate=\ub124\ud2b8\uc6cc\ud06c \uc18d\ub3c4 -notification.reboot.instance=\uc778\uc2a4\ud134\uc2a4 \uc7ac\uc2dc\uc791 -notification.start.instance=\uc778\uc2a4\ud134\uc2a4 \uc2dc\uc791 -notification.stop.instance=\uc778\uc2a4\ud134\uc2a4 \uc815\uc9c0 -side.by.side=\ubcd1\ub82c -state.Accepted=\uc2b9\uc778 \uc644\ub8cc -state.Active=\ud65c\uc131 -state.Allocated=\ud560\ub2f9 \ub05d\ub09c \uc0c1\ud0dc -state.Allocating=\ud560\ub2f9 \uc911 -state.BackedUp=\ubc31\uc5c5 \uc644\ub8cc -state.BackingUp=\ubc31\uc5c5 \uc911 -state.Completed=\uc644\ub8cc -state.Creating=\uc0dd\uc131 \uc911 -state.Declined=\uac70\uc808 -state.Destroyed=\ud30c\uae30\ub41c \uc0c1\ud0dc -state.Disabled=\uc720\ud6a8\ud558\uc9c0 \uc54a\uc740 -state.Enabled=\uc0ac\uc6a9\ud568 -state.Error=\uc624\ub958 -state.Expunging=\uc81c\uac70 \uc911 -state.Migrating=\uc774\uc804 \uc911 -state.Pending=\ubcf4\ub958 -state.Ready=\uc900\ube44 \uc644\ub8cc -state.Running=\uc2e4\ud589 \uc911 -state.Starting=\uc2dc\uc791 \uc911 -state.Stopped=\uc815\uc9c0\ub41c \uc0c1\ud0dc -state.Stopping=\uc815\uc9c0\ud558\uace0 \uc788\ub294 \uc911 -state.Suspended=\uc77c\uc2dc\uc815\uc9c0 -ui.listView.filters.all=\ubaa8\ub450 -ui.listView.filters.mine=\ub0b4 \uc815\ubcf4\ub9cc diff --git a/client/WEB-INF/classes/resources/messages_nb_NO.properties b/client/WEB-INF/classes/resources/messages_nb_NO.properties deleted file mode 100644 index cec91dc64b56..000000000000 --- a/client/WEB-INF/classes/resources/messages_nb_NO.properties +++ /dev/null @@ -1,2258 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Endrede egenskaper -confirm.enable.s3=Vennligst fyll inn f\u00f8lgende informasjon for \u00e5 aktivere st\u00f8tte for S3-st\u00f8ttet sekund\u00e6rlagring -confirm.enable.swift=Vennligst fyll inn f\u00f8lgende informasjon for \u00e5 aktivere st\u00f8tte for Swift -error.could.not.change.your.password.because.ldap.is.enabled=Feil kunne ikke bytte ditt passord fordi LDAP er aktivert. -error.could.not.enable.zone=Kunne ikke aktivere sonen -error.installWizard.message=Noe gikk galt. G\u00e5 tilbake og korriger feilene. -error.invalid.username.password=Ugyldig brukernavn eller passord -error.login=Ditt brukernavn/passord stemmer ikke overens med v\u00e5re opplysninger. -error.menu.select=Kan ikke utf\u00f8re handlingen grunnet ingen valgte elementer. -error.mgmt.server.inaccessible=Administrasjonsserver er utilgjengelig. Vennligst pr\u00f8v igjen senere. -error.password.not.match=Passordfeltene sammensvarer ikke -error.please.specify.physical.network.tags=Nettverkstilbud er ikke tilgjengelig f\u00f8r du spesifiserer knagger for dette fysiske nettverket. -error.session.expired=Din sesjon har utl\u00f8pt. -error.something.went.wrong.please.correct.the.following=Noe gikk galt. Vennligst korrig\u00e9r f\u00f8lgende -error.unable.to.reach.management.server=Kan ikke oppn\u00e5 kontakt med administrasjonsserveren -error.unresolved.internet.name=Ditt internettnavn kan ikke l\u00f8ses. -force.delete.domain.warning=Advarsel\: dette alternativet vil medf\u00f8re at alle underdomener og alle assosierte kontoer og dere resurser blir slettet. -force.delete=Tving sletting -force.remove.host.warning=Advarsel\: ved valg av dette alternativet vil CloudStack stoppe alle kj\u00f8rende virtuelle maskiner, f\u00f8r verten blir fjernet fra klyngen. -force.remove=Tving fjerning -force.stop.instance.warning=Advarsel\: \u00c5 tvinge en stopp av denne instansen b\u00f8r v\u00e6re siste utvei. Det kan f\u00f8re til tap av data og ukonsistent oppf\u00f8rsel av virtuell maskinstatus. -force.stop=Tving stopp -hint.no.host.tags=Ingen hosttagger funnet -hint.no.storage.tags=Ingen lagringstagger funnet -hint.type.part.host.tag=Skriv inn deler av hosttagg -hint.type.part.storage.tag=Skriv inn deler av lagringstagg -ICMP.code=ICMP-kode -ICMP.type=ICMP-type -image.directory=Bilde-katalog -inline=I Rekke -instances.actions.reboot.label=Omstart av instans -label.about.app=Om CloudStack -label.about=Om -label.accept.project.invitation=Aksepter prosjektinvitasjon -label.account.and.security.group=Konto, Sikkerhetsgruppe -label.account.details=Kontodetaljer -label.account.id=Konto ID -label.account=Konto -label.account.lower=konto -label.account.name=Kontonavn -label.accounts=Kontoer -label.account.specific=Kontospesifikk -label.account.type=Kontotype -label.acl=ACL -label.acl.id=ACL ID -label.acl.list.rules=ACL Liste Regler -label.acl.name=ACL Navn -label.acl.replaced=ACL erstattet -label.acquire.new.ip=Tilegne ny IP -label.acquire.new.secondary.ip=Tilegne ny sekund\u00e6r IP -label.action.attach.disk.processing=Tilknytter Disk.... -label.action.attach.disk=Tilknytt Disk -label.action.attach.iso.processing=Tilknytter ISO.... -label.action.attach.iso=Tilknytt ISO -label.action.cancel.maintenance.mode=Avbryt vedlikeholdsmodus -label.action.cancel.maintenance.mode.processing=Avbryter vedlikeholdsmodus.... -label.action.change.password=Endre passord -label.action.change.service=Endre Tjeneste -label.action.change.service.processing=Endrer Tjeneste.... -label.action.configure.samlauthorization=Konfigurer SAML SSO-autorisering -label.action.copy.ISO=Kopier ISO -label.action.copy.ISO.processing=Kopierer ISO.... -label.action.copy.template=Kopier mal -label.action.copy.template.processing=Kopierer \u00f8yeblikksbilde.... -label.action.create.template.from.vm=Lag Mal fra VM -label.action.create.template.from.volume=Lag Mal fra Volum -label.action.create.template=Opprett mal -label.action.create.template.processing=Oppretter mal.... -label.action.create.vm=Opprett VM -label.action.create.vm.processing=Oppretter VM.... -label.action.create.volume=Opprett volum -label.action.create.volume.processing=Oppretter volum.... -label.action.delete.account.processing=Sletter konto.... -label.action.delete.account=Slett konto -label.action.delete.cluster.processing=Sletter klynge.... -label.action.delete.cluster=Slett klynge -label.action.delete.disk.offering.processing=Sletter disktilbud.... -label.action.delete.disk.offering=Slett disktilbud -label.action.delete.domain.processing=Sletter domene.... -label.action.delete.domain=Slett domene -label.action.delete.firewall.processing=Sletter brannmur.... -label.action.delete.firewall=Slett brannmurregel -label.action.delete.ingress.rule.processing=Sletter inng\u00e5ende regel.... -label.action.delete.ingress.rule=Slett inng\u00e5ende regel -label.action.delete.IP.range.processing=Sletter IP-rekke.... -label.action.delete.IP.range=Slett IP-rekke -label.action.delete.ISO.processing=Sletter ISO.... -label.action.delete.ISO=Slett ISO -label.action.delete.load.balancer.processing=Sletter Lastbalanserer -label.action.delete.load.balancer=Slett lastbalanseringsregel -label.action.delete.network.processing=Sletter nettverk.... -label.action.delete.network=Slett nettverk -label.action.delete.nexusVswitch=Slett Nexus 1000v -label.action.delete.nic=Fjern NIC -label.action.delete.physical.network=Slett fysisk nettverk -label.action.delete.pod.processing=Sletter pod.... -label.action.delete.pod=Slett pod -label.action.delete.primary.storage.processing=Sletter prim\u00e6rlagring.... -label.action.delete.primary.storage=Slett prim\u00e6rlagring -label.action.delete.secondary.storage.processing=Sletter sekund\u00e6rlagring.... -label.action.delete.secondary.storage=Slett sekund\u00e6rlagring -label.action.delete.security.group.processing=Slett Sikkerhetsgruppe.... -label.action.delete.security.group=Slett Sikkerhetsgruppe -label.action.delete.service.offering.processing=Sletter tjenestetilbud.... -label.action.delete.service.offering=Slett tjenestetilbud -label.action.delete.snapshot.processing=Sletter \u00f8yeblikksbilde.... -label.action.delete.snapshot=Slett \u00f8yeblikksbilde -label.action.delete.system.service.offering=Slett system-tjenestetilbud -label.action.delete.template.processing=Sletter mal.... -label.action.delete.template=Slett mal -label.action.delete.user.processing=Sletter bruker.... -label.action.delete.user=Slett bruker -label.action.delete.volume.processing=Sletter volum.... -label.action.delete.volume=Slett volum -label.action.delete.zone.processing=Sletter sone.... -label.action.delete.zone=Slett sone -label.action.destroy.instance.processing=\u00d8delegger instans.... -label.action.destroy.instance=\u00d8delegg Instans -label.action.destroy.systemvm.processing=Sletter system VM.... -label.action.destroy.systemvm=Slett system VM -label.action.detach.disk=Frakoble disk -label.action.detach.disk.processing=Kobler fra disk.... -label.action.detach.iso=Frakoble ISO -label.action.detach.iso.processing=Frakobler ISO.... -label.action.disable.account=Deaktiver konto -label.action.disable.account.processing=Deaktiverer konto.... -label.action.disable.cluster=Deaktiver klyngen -label.action.disable.cluster.processing=Deaktiverer klyngen... -label.action.disable.nexusVswitch=Deaktiver Nexus 1000v -label.action.disable.physical.network=Deaktiver fysisk nettverk -label.action.disable.pod=Deaktiver pod -label.action.disable.pod.processing=Deaktiverer pod... -label.action.disable.static.NAT=Deaktiver statisk NAT -label.action.disable.static.NAT.processing=Deaktiverer statisk NAT.... -label.action.disable.user=Deaktivert bruker -label.action.disable.user.processing=Deaktiverer bruker.... -label.action.disable.zone=Deaktiver sonen -label.action.disable.zone.processing=Deaktiverer sonen... -label.action.download.ISO=Last ned ISO -label.action.download.template=Laster ned mal -label.action.download.volume=Last ned volum -label.action.download.volume.processing=Laster ned volum.... -label.action.edit.account=Rediger konto -label.action.edit.disk.offering=Editer disktilbud -label.action.edit.domain=Editer domene -label.action.edit.global.setting=Editer global innstilling -label.action.edit.host=Editer vert -label.action.edit.instance=Rediger instans -label.action.edit.ISO=Rediger ISO -label.action.edit.network=Editer Nettverk -label.action.edit.network.offering=Editer nettverkstilbud -label.action.edit.network.processing=Editerer Nettverk.... -label.action.edit.pod=Editer Pod -label.action.edit.primary.storage=Editer Prim\u00e6rlagring -label.action.edit.resource.limits=Rediger ressursbegrensninger -label.action.edit.service.offering=Editer tjenestetilbud -label.action.edit.template=Editer mal -label.action.edit.user=Rediger bruker -label.action.edit.zone=Rediger Sone -label.action.enable.account=Aktiver konto -label.action.enable.account.processing=Aktiverer konto.... -label.action.enable.cluster=Aktiver klynge -label.action.enable.cluster.processing=Aktiverer klyngen... -label.action.enable.maintenance.mode=Aktiver vedlikeholdsmodus -label.action.enable.maintenance.mode.processing=Aktiver vedlikeholdsmodus... -label.action.enable.nexusVswitch=Aktiver Nexus 1000v -label.action.enable.physical.network=Aktiver fysisk nettverk -label.action.enable.pod=Aktiver pod -label.action.enable.pod.processing=Aktiverer pod... -label.action.enable.static.NAT=Aktiver statisk NAT -label.action.enable.static.NAT.processing=Aktiverer statisk NAT.... -label.action.enable.user=Aktiver Bruker -label.action.enable.user.processing=Aktiverer Bruker.... -label.action.enable.zone=Aktiver sone -label.action.enable.zone.processing=Aktiverer sone... -label.action.expunge.instance.processing=Sletter instans.... -label.action.expunge.instance=Slett Instans Permanent -label.action.force.reconnect.processing=Kobler til p\u00e5 nytt.... -label.action.force.reconnect=Tving ny tilkobling -label.action.generate.keys=Generer n\u00f8kler -label.action.generate.keys.processing=Genererer n\u00f8kler.... -label.action=Handling -label.action.list.nexusVswitch=Liste Nexus 1000v -label.action.lock.account=L\u00e5s konto -label.action.lock.account.processing=L\u00e5ser konto.... -label.action.manage.cluster=Administrer klynge -label.action.manage.cluster.processing=Administrerer klynge.... -label.action.migrate.instance=Migrer Instans -label.action.migrate.instance.processing=Migrerer Instans.... -label.action.migrate.router=Migrer ruter -label.action.migrate.router.processing=Migrerer Ruter.... -label.action.migrate.systemvm=Migrer System VM -label.action.migrate.systemvm.processing=Migrerer System VM.... -label.action.reboot.instance=Omstart Instans -label.action.reboot.instance.processing=Starter om Instans.... -label.action.reboot.router=Omstart Ruter -label.action.reboot.router.processing=Omstaer Instans.... -label.action.reboot.systemvm=Omstart System VM -label.action.reboot.systemvm.processing=Omstarter System VM -label.action.recurring.snapshot=Gjentagende \u00f8yeblikksbilder -label.action.register.iso=Registrer ISO -label.action.register.template=Registrer mal fra en URL -label.action.release.ip=Frigj\u00f8r IP -label.action.release.ip.processing=Frigj\u00f8r IP-adresse.... -label.action.remove.host=Fjern Vert -label.action.remove.host.processing=Fjerner Vert.... -label.action.reset.password.processing=Tilbakestiller passord.... -label.action.reset.password=Tilbakestill passord -label.action.resize.volume=Endre st\u00f8rrelse p\u00e5 volum -label.action.resize.volume.processing=Endrer st\u00f8rrelse p\u00e5 volum.... -label.action.resource.limits=Ressursbegrensninger -label.action.restore.instance=Gjenopprett Instans -label.action.restore.instance.processing=Gjenoppretter Instans.... -label.action.revert.snapshot.processing=Tilbakestiller til \u00f8yeblikksbilde.... -label.action.revert.snapshot=Tilbakestill til \u00f8yeblikksbilde -label.actions=Handlinger -label.action.start.instance.processing=Starter instans.... -label.action.start.instance=Start instans -label.action.start.router.processing=Stopper ruter -label.action.start.router=Start ruter -label.action.start.systemvm.processing=Starter System VM.... -label.action.start.systemvm=Start System VM -label.action.stop.instance.processing=Stopper instans.... -label.action.stop.instance=Stopp instans -label.action.stop.router.processing=Stopper ruter.... -label.action.stop.router=Stopp ruter -label.action.stop.systemvm.processing=Stopper System VM.... -label.action.stop.systemvm=Stopp System VM -label.action.take.snapshot.processing=Tar \u00f8yeblikksbilde.... -label.action.take.snapshot=Ta \u00f8yeblikksbilde -label.action.unmanage.cluster=Fjern administrasjon av klynge -label.action.unmanage.cluster.processing=Fjerner administrasjon av klynge... -label.action.update.OS.preference=Oppdater OS-preferanser -label.action.update.OS.preference.processing=Oppdaterer OS-preferanser..... -label.action.update.resource.count=Oppdater resurs oversikt -label.action.update.resource.count.processing=Oppdaterer resurs oversikt -label.action.vmsnapshot.create=Ta VM \u00f8yeblikksbilde -label.action.vmsnapshot.delete=Slett VM \u00f8yeblikksbilde -label.action.vmsnapshot.revert=Tilbakestill til maskin\u00f8yeblikksbilde -label.activate.project=Aktiver prosjekt -label.active.sessions=Aktive sesjoner -label.add.account=Legg til konto -label.add.accounts=Legg til kontoer -label.add.accounts.to=Legg kontoer til -label.add.account.to.project=Legg kontoen til prosjektet -label.add.ACL=Legg til ACL -label.add.acl.list=Legg til ACL liste -label.add.affinity.group=Legg til affinitetsgruppe -label.add.baremetal.dhcp.device=Legg Til Barmetall DHCP Enhet -label.add.baremetal.rack.configuration=Legg Til Barmetall Rack Konfigurering -label.add.BigSwitchBcf.device=Legg til BigSwitch BCF kontroller -label.add.BrocadeVcs.device=Legg til Brocade VCS Svitsj -label.add.by.cidr=Legg til med CIDR -label.add.by.group=Legg til med gruppe -label.add.by=Legg til ved -label.add.ciscoASA1000v=Legg til CiscoASA1000v Resurs -label.add.cluster=Legg til klynge -label.add.compute.offering=Legg til systemtilbud -label.add.direct.iprange=Legg til direkte IP-rekke -label.add.disk.offering=Legg til disktilbud -label.add.domain=Legg til domene -label.added.brocade.vcs.switch=Ny Brocade Vcs svitsj lagt til -label.added.network.offering=La til nettverkstilbud -label.added.new.bigswitch.bcf.controller=La til ny BigSwitch BCF kontroller -label.added.nicira.nvp.controller=La til ny Nicira NVP-kontroller -label.add.egress.rule=Legg til egress regel -label.addes.new.f5=La til ny F5 -label.add.F5.device=Legg til F5 enhet -label.add.firewall=Legg til brannmurregel -label.add.globo.dns=legg til GloboDNS -label.add.gslb=Legg til GSLB -label.add.guest.network=Legg til gjestenettverk -label.add.host=Legg til vert -label.adding.cluster=Legger til klynge -label.adding.failed=Tillegging feilet -label.adding.pod=Legger til pod -label.adding.processing=Legger til -label.add.ingress.rule=Legg til ingressregel -label.adding.succeeded=Tillegging vellykket -label.adding=Tillegger -label.adding.user=Legger til bruker -label.adding.zone=Legger til sone -label.add.intermediate.certificate=Legg til intermediate sertifikat -label.add.internal.lb=Legg til intern LB -label.add.ip.range=Legg til IP-rekke -label.add.isolated.guest.network=Legg til Isolert gjestenettverk -label.add.isolated.guest.network.with.sourcenat=Legg til isolert gjestenettverk med kilde-NAT -label.add.isolated.network=Legg Til Isolert Nettverk -label.additional.networks=Ekstra nettverk -label.add.ldap.account=Legg til LDAP-konto -label.add.LDAP.account=Legg til LDAP-konto -label.add=Legg til -label.add.list.name=ACL listenavn -label.add.load.balancer=Legg til lastbalanserer -label.add.more=Legg til mer -label.add.netScaler.device=Legg til Netscaler enhet -label.add.network.ACL=Legg til nettverk ACL -label.add.network.acl.list=Legg til nettverk ACL liste -label.add.network.device=Legg til nettverksenhet -label.add.network=Legg til nettverk -label.add.network.offering=Legg til nettverkstilbud -label.add.new.F5=Legg til ny F5 -label.add.new.gateway=Legg til ny gateway -label.add.new.NetScaler=Legg til ny NetScaler -label.add.new.PA=Legg til ny Palo Alto -label.add.new.SRX=Legg til ny SRX -label.add.new.tier=Legg til ny gren -label.add.nfs.secondary.staging.store=Legg Til NFS sekund\u00e6rmellomlagringsomr\u00e5de -label.add.NiciraNvp.device=Legg til Nvp kontroller -label.add.NuageVsp.device=Legg til Nuage Virtualized Services Directory (VSD) -label.add.OpenDaylight.device=Legg til OpenDayLight kontroller -label.add.PA.device=Legg til Palo Alto enhet -label.add.physical.network=Legg til fysisk nettverk -label.add.pod=Legg til pod -label.add.portable.ip.range=Legg til portabel IP-rekke -label.add.port.forwarding.rule=Legg til portvideresendingsregel -label.add.primary.storage=Legg til prim\u00e6rlagring -label.add.private.gateway=Legg til privat gateway -label.add.region=Legg til region -label.add.resources=Legg til ressurser -label.add.route=Legg til rute -label.add.rule=Legg til regel -label.add.secondary.storage=Legg til sekund\u00e6rlagring -label.add.security.group=Legg til sikkerhetsgruppe -label.add.service.offering=Legg til tjenestetilbud -label.add.SRX.device=Legg til SRX enhet -label.add.static.nat.rule=Legg til statisk NAT-regel -label.add.static.route=Legg til statisk rute -label.add.system.service.offering=Legg til et systemtilbud -label.add.template=Legg til mal -label.add.to.group=Legg til gruppe -label.add.ucs.manager=Legg Til UCS Manager -label.add.userdata=Brukerdata -label.add.user=Legg til bruker -label.add.vlan=Legg til VLAN -label.add.vm=Legg til VM -label.add.vms=Legg til VMer -label.add.vms.to.lb=Legg til VM(er) til lastbalanseringsregel -label.add.VM.to.tier=Legg VM til VPC-gren -label.add.vmware.datacenter=Legg til VMware datasenter -label.add.vnmc.device=Legg til VNMC enhet -label.add.vnmc.provider=Legg til VNMC tilbyder -label.add.volume=Legg til volum -label.add.vpc=Legg til VPC -label.add.vpc.offering=Legg til VPC tilbud -label.add.vpn.customer.gateway=Legg til VPN Kundegateway -label.add.VPN.gateway=Legg til VPN Gateway -label.add.vpn.user=Legg til VPN-bruker -label.add.vxlan=Legg til VXLAN -label.add.zone=Legg til sone -label.admin.accounts=Adminkontoer -label.admin=Admin -label.advanced=Avansert -label.advanced.mode=Avansermodus -label.advanced.search=Avansert s\u00f8k -label.affinity=Affinitet -label.affinity.group=Affinitetsgruppe -label.affinity.groups=Affinitetsgrupper -label.agent.password=Agentpassord -label.agent.port=Agentport -label.agent.state=Agentstatus -label.agent.username=Agentbrukernavn -label.agree=Godtar -label.alert.archived=Varsel arkivert -label.alert.deleted=Varsel slettet -label.alert.details=Varseldetaljer -label.alert=Varsel -label.algorithm=Algoritme -label.allocated=Allokert -label.allocation.state=Allokeringsstatus -label.allow=Tillat -label.anti.affinity=Anti-affinitet -label.anti.affinity.group=Anti-affinitetsgruppe -label.anti.affinity.groups=Anti-affinitetsgrupper -label.api.key=API-n\u00f8kkel -label.api.version=API Versjon -label.apply=Bruk -label.app.name=CloudStack -label.archive.alerts=Arkiver varsler -label.archive=Arkiv -label.archive.events=Arkiver hendelser -label.assigned.vms=Tildelte VMer -label.assign.instance.another=Tildel instans til en annen konto -label.assign=Tildel -label.assign.to.load.balancer=Legg til instans til lastbalanserer -label.assign.vms=Tildel VMer -label.associated.network=Assosiert nettverk -label.associated.network.id=Assosiert nettverksid -label.associated.profile=Assosiert Profil -label.associate.public.ip=Assosiert Offentlig IP-adresse -label.attached.iso=Tilknyttet ISO -label.author.email=Forfatter e-post -label.author.name=Forfatternavn -label.autoscale=Autoskaler -label.autoscale.configuration.wizard=Autoskalering konfigurasjonsveiviser -label.availability=Tilgjengelighet -label.availability.zone=Tilgjengelighetssone -label.availabilityZone=tilgjengelighetssone -label.available.public.ips=Tilgjengelig offentlige IP-adresser -label.available=Tilgjengelig -label.back=Tilbake -label.bandwidth=B\u00e5ndbredde -label.baremetal.dhcp.devices=Barmetall DHCP Enheter -label.baremetal.dhcp.provider=Barmetall DHCP Tilbyder -label.baremetal.pxe.device=Legg Til Barmetall PXE Enhet -label.baremetal.pxe.devices=Barmetall PXE Enheter -label.baremetal.pxe.provider=Barmetall PXE Tilbyder -label.baremetal.rack.configuration=Barmetall Rack Konfigurering -label.basic=Basis -label.basic.mode=Basismodus -label.bigswitch.bcf.details=BigSwitch BCF detaljer -label.bigswitch.bcf.nat=BigSwitch BCF NAT aktivert -label.bigswitch.controller.address=BigSwitch BCF kontrolleradresse -label.blade.id=Blad-ID -label.blades=Blad -label.bootable=Botbar -label.broadcast.domain.range=Kringkastings domene rekke -label.broadcast.domain.type=Kringkastings Domene Type -label.broadcast.uri=Kringkastings URI -label.broadcasturi=kringkastinguri -label.broadcat.uri=Kringkastings URI -label.brocade.vcs.address=Vcs Switch Addresse -label.brocade.vcs.details=Brocade Vcs svitsj detaljer -label.by.account=Etter Konto -label.by.alert.type=Etter varseltype -label.by.availability=Etter Tilgjengelighet -label.by.date.end=Etter dato (slutt) -label.by.date.start=Etter dato (start) -label.by.domain=Etter Domene -label.by.end.date=Etter sluttdato -label.by.event.type=Etter hendelsestype -label.by.level=Etter niv\u00e5 -label.by.pod=Etter Pod -label.by.role=Etter Rolle -label.by.start.date=Etter Startdato -label.by.state=Etter tilstand -label.bytes.received=Bytes Mottatt -label.bytes.sent=Bytes sendt -label.by.traffic.type=Etter Trafikktype -label.by.type=Etter Type -label.by.type.id=Etter Type ID -label.by.zone=Etter Sone -label.cache.mode=Write-cache Type -label.cancel=Avbryt -label.capacity.bytes=Kapasitet Bytes -label.capacity.iops=Kapasitet IOPS -label.capacity=Kapasitet -label.certificate=Sertifikat -label.change.affinity=Endre affinitet -label.change.ipaddress=Endre IP-adresse for nettverkskort -label.change.service.offering=Endre tjenestetilbud -label.change.value=Endre verdi -label.character=Karakter -label.chassis=Kasse -label.checksum=sjekksum -label.cidr.account=CIDR eller konto/sikkerhetsgruppe -label.cidr=CIDR -label.CIDR.list=CIDR liste -label.cidr.list=Kilde-CIDR -label.CIDR.of.destination.network=CIDR for destinasjonsnettverk -label.cisco.nexus1000v.ip.address=Nexus 1000v IP Addresse -label.cisco.nexus1000v.password=Nexus 1000v Passord -label.cisco.nexus1000v.username=Nexus 1000v Brukernavn -label.ciscovnmc.resource.details=CiscoVNMC ressursdetaljer -label.clean.up=Rydd opp -label.clear.list=T\u00f8m liste -label.close=Lukk -label.cloud.console=Cloud -label.cloud.managed=Forvaltet Av Cloud.com -label.cluster=Klynge -label.cluster.name=Klyngenavn -label.clusters=Klynger -label.cluster.type=Klyngetype -label.clvm=CLVM -label.code=Kode -label.community=Fellesskap -label.compute.and.storage=Regnekraft og lagring -label.compute=Beregne -label.compute.offering=Regnekraftstilbud -label.compute.offerings=Regnekraftstilbud -label.configuration=Konfigurering -label.configure=Konfigurer -label.configure.ldap=Konfigurer LDAP -label.configure.network.ACLs=Konfigurer Nettverksaksesslister -label.configure.sticky.policy=Konfigurer Sticky Policy -label.configure.vpc=Konfigurer VPC -label.confirmation=Bekreftelse -label.confirm.password=Bekreft passord -label.congratulations=Gratulerer\! -label.conserve.mode=Konserveringsmodus -label.console.proxy=Konsollproxy -label.console.proxy.vm=Konsollproxy VM -label.continue.basic.install=Fortsett med enkelt oppsett -label.continue=Fortsett -label.copying.iso=Kopierer ISO -label.corrections.saved=Endringer lagret -label.counter=Teller -label.cpu.allocated=CPU allokert -label.cpu.allocated.for.VMs=CPU Allokert for VMer -label.CPU.cap=CPU begrensning -label.cpu=CPU -label.cpu.limits=CPU-begrensninger -label.cpu.mhz=CPU (i MHz) -label.cpu.utilized=CPU-utnyttelse -label.created.by.system=Opprettet av systemet -label.created=Opprettet -label.create.nfs.secondary.staging.storage=Legg Til NFS sekund\u00e6rmellomlagringsomr\u00e5de -label.create.nfs.secondary.staging.store=Opprett NFS sekund\u00e6rmellomlagringsomr\u00e5de -label.create.project=Opprett prosjekt -label.create.ssh.key.pair=Lag SSH-n\u00f8kkelpar -label.create.template=Opprett mal -label.create.VPN.connection=Opprett VPN-tilkobling -label.cross.zones=Kryssoner -label.custom.disk.iops=Tilpasset IOPS -label.custom.disk.offering=Brukertilpasset disktilbud -label.custom.disk.size=Tilpasset Diskst\u00f8rrelse -label.custom=Tilpasset -label.daily=Daglig -label.data.disk.offering=Datadisktilbud -label.date=Dato -label.day=Dag -label.day.of.month=Dag i m\u00e5ned -label.day.of.week=Dag i uke -label.dc.name=Datasenter Navn -label.dead.peer.detection=D\u00f8d endepunkt-deteksjon -label.decline.invitation=Avvis invitasjon -label.dedicate.cluster=Dediker kluster -label.dedicated=Dedikert -label.dedicate=Dediker -label.dedicated.vlan.vni.ranges=Dedikerte VLAN/VNI Rekker -label.dedicate.host=Dediker host -label.dedicate.pod=Dedikert pod -label.dedicate.vlan.vni.range=Dedikert VLAN/VNI Rekke -label.dedicate.zone=Dediker sone -label.default.egress.policy=Egress standard policy -label.default=Standardverdi -label.default.use=Standard bruk -label.default.view=Standardvisning -label.delete.acl.list=Slett ACL liste -label.delete.affinity.group=Slett affinitetsgruppe -label.delete.alerts=Slette varsler -label.delete.baremetal.rack.configuration=Slett Barmetall Rack Konfigurering -label.delete.BigSwitchBcf=Fjern BigSwitch BCF-kontroller -label.delete.BrocadeVcs=Fjern Brocade VCS-svitsj -label.delete.ciscoASA1000v=Slett CiscoASA1000v -label.delete.ciscovnmc.resource=Slett CiscoVNMC ressurs -label.delete.events=Slett hendelser -label.delete.F5=Slett F5 -label.delete.gateway=slett gateway -label.delete.internal.lb=Slett intern LB -label.delete.NetScaler=Slett Netscaler -label.delete.NiciraNvp=Fjern Nvp-kontroller -label.delete.NuageVsp=Fjern Nuage VSD -label.delete.OpenDaylight.device=Fjern OpenDaylight kontroller -label.delete.PA=Slett Palo Alto -label.delete.portable.ip.range=Slett portabel IP-rekke -label.delete.profile=Slett Profil -label.delete.project=Slett prosjekt -label.delete.secondary.staging.store=Slett NFS sekund\u00e6rmellomlagringsomr\u00e5de -label.delete=Slett -label.delete.SRX=Slett SRX -label.delete.ucs.manager=Slett UCS Manager -label.delete.VPN.connection=Slett VPN-tilkobling -label.delete.VPN.customer.gateway=Slett VPN-kundegateway -label.delete.VPN.gateway=Slett VPN-gateway -label.delete.vpn.user=Slett VPN-bruker -label.deleting.failed=Sletting feilet -label.deleting.processing=Sletter.... -label.deny=Nekt -label.deployment.planner=utbyggings planlegger -label.description=Beskrivelse -label.destination.physical.network.id=Fysisk nettverksid-destinasjon -label.destination.zone=Destinasjonssone -label.destroy=Destruer -label.destroy.router=Slett ruter -label.destroy.vm.graceperiod=\u00d8delegg VM ventetid -label.detaching.disk=Kobler fra disk -label.details=Detaljer -label.device.id=Enhets ID -label.devices=Enheter -label.dhcp=DHCP -label.DHCP.server.type=DHCP servertype -label.direct.attached.public.ip=Direkte Tilknyttet Offentlig IP-adresse -label.direct.ips=Deltnettverk-IPadresser -label.disable.autoscale=Deaktiver autoskalering -label.disabled=Inaktiv -label.disable.host=Deaktiver host -label.disable.network.offering=Deaktiver nettverkstilbud -label.disable.provider=Deaktiver tilbyder -label.disable.vnmc.provider=Deatkivert VNMC tilbyder -label.disable.vpc.offering=Deaktivert VPC tilbud -label.disable.vpn=Dekativer VPN -label.disabling.vpn.access=Deaktiverer VPN Tilgang -label.disassociate.profile.blade=Deassosier profil fra Blade -label.disbale.vnmc.device=Deaktivert VNMC enhet -label.disk.allocated=Disk allokert -label.disk.bytes.read.rate=Disklesehastighet (BPS) -label.disk.bytes.write.rate=Diskskrivehastighet (BPS) -label.disk.iops.max=Maks IOPS -label.disk.iops.min=Min IOPS -label.disk.iops.read.rate=Disklesehastighet (IOPS) -label.disk.iops.total=IOPS Totalt -label.disk.iops.write.rate=Diskskrivehastighet (IOPS) -label.disk.offering.details=Disktilbud detaljer -label.diskoffering=diskoffering -label.disk.offering=Disktilbud -label.disk.provisioningtype=Provisjoneringstype -label.disk.read.bytes=Disk lese (Bytes) -label.disk.read.io=Disk lese (IO) -label.disk.size=Diskst\u00f8rrelse -label.disk.size.gb=Diskst\u00f8rrelse (i GB) -label.disk.total=Disk Totalt -label.disk.volume=Disk Volum -label.disk.write.bytes=Disk skrive (Bytes) -label.disk.write.io=Disk skrive (IO) -label.display.name=Visningsnavn -label.display.text=Visningstekst -label.distributedrouter=DIstribuert router -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=DNS domene for gjestenettverk -label.domain.admin=Domeneadministrator -label.domain.details=Domenedetaljer -label.domain=Domene -label.domain.id=Domene ID -label.domain.lower=domene -label.domain.name=Domenenavn -label.domain.router=Domeneruter -label.domain.suffix=DNS domenesuffiks (f.eks, xyz.com) -label.done=Utf\u00f8rt -label.double.quotes.are.not.allowed=Doble anf\u00f8rselstegn er ikke tillatt -label.download.progress=Nedlastningsprogresjon -label.drag.new.position=Dra til ny posisjon -label.duration.in.sec=Varighet (i sek.) -label.dynamically.scalable=Dynamisk skalerbar -label.edit.acl.rule=Endre ACL regel -label.edit.affinity.group=Rediger affinitetsgruppe -label.edit=Editer -label.edit.lb.rule=Endre LB-regel -label.edit.network.details=Edit\u00e9r nettverksdetaljer -label.edit.project.details=Editer prosjektdetaljer -label.edit.region=Editer region -label.edit.rule=Endre regel -label.edit.secondary.ips=Endre sekund\u00e6re IPer -label.edit.tags=Rediger tagger -label.edit.traffic.type=Endre trafikktype -label.edit.vpc=Rediger VPC -label.egress.default.policy=Egress standardpolicy -label.egress.rule=Egressregel -label.egress.rules=Egressregler -label.elastic=Elastisk -label.elastic.IP=Elastisk IP -label.elastic.LB=Elastisk LB -label.email=E-post -label.email.lower=epost -label.enable.autoscale=Aktivert autoskalering -label.enable.host=Aktiver host -label.enable.network.offering=Aktiver nettverkstilbud -label.enable.provider=Aktiver tilbyder -label.enable.s3=Aktiver S3-st\u00f8ttet sekund\u00e6rlagring -label.enable.swift=Aktiver Swift -label.enable.vnmc.device=Aktivert VNMC enhet -label.enable.vnmc.provider=Aktivert VNMC tilbyder -label.enable.vpc.offering=Aktiver VPC tilbud -label.enable.vpn=Aktiver VPN -label.enabling.vpn.access=Aktiverer VPN-tilgang -label.enabling.vpn=Aktiverer VPN -label.end.IP=Slutt-IP -label.endpoint=Endepunkt -label.endpoint.or.operation=Endepunkt eller operasjon -label.end.port=Sluttport -label.end.reserved.system.IP=Siste reserverte system IP -label.end.vlan=Slutt VLAN -label.end.vxlan=Slutt VXLAN -label.enter.token=Skriv inn koden -label.error.code=Feilkode -label.error=Feil -label.error.upper=ERROR -label.ESP.encryption=ESP kryptering -label.ESP.hash=ESP hash -label.ESP.lifetime=ESP levetid (sekund) -label.ESP.policy=ESP policy -label.esx.host=ESX/ESXi vert -label.event.archived=Hendelser Arkivert -label.event.deleted=Hendelse slettet -label.event=Hendelse -label.every=Hver -label.example=Eksempel -label.expunge=Permanent Slett -label.external.link=Ekstern kobling -label.extractable.lower=Nedlastbar -label.extractable=Nedlastbar -label.f5.details=F5 detaljer -label.f5=F5 -label.failed=Feilet -label.featured=Fremhevet -label.fetch.latest=Hent siste -label.filterBy=Filtrer etter -label.fingerprint=Fingeravtrykk -label.firewall=Brannmur -label.first.name=Fornavn -label.firstname.lower=fornavn -label.format=Format -label.format.lower=format -label.friday=Fredag -label.full=Full -label.full.path=Full sti -label.gateway=Gateway -label.general.alerts=Generelle varsler -label.generating.url=Genererer URL -label.globo.dns.configuration=GloboDNS-konfigurasjon -label.globo.dns=GloboDNS -label.gluster.volume=Volum -label.go.step.2=G\u00e5 til steg 2 -label.go.step.3=G\u00e5 til steg 3 -label.go.step.4=G\u00e5 til steg 4 -label.go.step.5=G\u00e5 til steg 5 -label.gpu=CPU -label.group.by.account=Grupper p\u00e5 konto -label.group.by.cluster=Grupper p\u00e5 kluster -label.group.by.pod=Grupper p\u00e5 pod -label.group.by.zone=Grupper p\u00e5 sone -label.group=Gruppe -label.group.optional=Gruppe (Valgfritt) -label.gslb.assigned.lb.more=Tildel mer lastbalansering -label.gslb.assigned.lb=Tildelt lastbalansering -label.gslb.delete=Slett GSLB -label.gslb.details=GSLB detaljer -label.gslb.domain.name=GSLB domenenavn -label.gslb=GSLB -label.gslb.lb.details=Lastbalanseringsdetaljer -label.gslb.lb.remove=Fjern lastbalansering fra denne GSLB -label.gslb.lb.rule=Lastbalanseringsregel -label.gslb.service=GSLB tjeneste -label.gslb.service.private.ip=GSLB tjeneste privat IP-adresse -label.gslb.service.public.ip=GSLB tjeneste offentlig IP-adresse -label.gslb.servicetype=Tjeneste Type -label.guest.cidr=Gjest CIDR -label.guest.end.ip=Gjest slutt-IP -label.guest.gateway=Gjestegateway -label.guest=Gjest -label.guest.ip=Gjest IP-adresse -label.guest.ip.range=Gjest IP-rekke -label.guest.netmask=Gjest nettmaske -label.guest.network.details=Gjestenettverksdetaljer -label.guest.networks=Gjestenettverk -label.guest.start.ip=Gjest start-IP -label.guest.traffic=Gjestetrafikk -label.guest.traffic.vswitch.name=Gjestetrafikk vSwitch Navn -label.guest.traffic.vswitch.type=Gjestetrafikk vSwitch Type -label.guest.type=Gjestetype -label.ha.enabled=HA Aktivert -label.health.check.advanced.options=Avanserte valg\: -label.health.check.configurations.options=Konfigureringsvalg\: -label.health.check=Helsesjekk -label.health.check.interval.in.sec=Helsesjekk Intervall (i sekunder) -label.health.check.message.desc=Din lastbalanserer vil automatisk utf\u00f8re helsesjekker mot dine cloudstackinstanser og kun rute trafikk til de instansene som passerer helsesjekk. -label.health.check.wizard=Helsesjekkveiviser -label.healthy.threshold=Sunn Terskel -label.help=Hjelp -label.hide.ingress.rule=Skjul ingressregel -label.hints=Hint -label.home=Hjem -label.host.MAC=Verts MAC -label.host.name=Vertsnavn -label.hosts=Verter -label.host.tag=Merkelapper for vert -label.host.tags=Vertsknagger -label.host=Vert -label.hourly=Hver time -label.hvm=HVM -label.hypervisor.capabilities=Hypervisor evner -label.hypervisor=Hypervisor -label.hypervisors=Hypervisors -label.hypervisor.snapshot.reserve=Hypervisor \u00d8yeblikks Kapasitet -label.hypervisor.type=Hypervisor type -label.hypervisor.version=Hypervisor versjon -label.hyperv.traffic.label=HyperV Trafikk Etikett -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=IKE kryptering -label.IKE.hash=IKE Hash -label.IKE.lifetime=IKE livstid (sekunder) -label.IKE.policy=IKE policy -label.info=Info -label.info.upper=INFO -label.ingress.rule=Ingressregel -label.initiated.by=Initiert av -label.inside.port.profile=Intern Port Profil -label.installWizard.addClusterIntro.subtitle=Hva er en klynge? -label.installWizard.addClusterIntro.title=La oss legge til en klynge -label.installWizard.addHostIntro.subtitle=Hva er en vert? -label.installWizard.addHostIntro.title=La oss legge til en vert -label.installWizard.addPodIntro.subtitle=Hva er en pod? -label.installWizard.addPodIntro.title=La oss legge til en pod -label.installWizard.addPrimaryStorageIntro.subtitle=Hva er prim\u00e6rlagring? -label.installWizard.addPrimaryStorageIntro.title=Legg til prim\u00e6rlagring -label.installWizard.addSecondaryStorageIntro.subtitle=Hva er sekund\u00e6rlagring? -label.installWizard.addSecondaryStorageIntro.title=Legg til sekund\u00e6rlagring -label.installWizard.addZoneIntro.subtitle=Hva er en sone? -label.installWizard.addZoneIntro.title=La oss legge til en sone -label.installWizard.addZone.title=Legg til sone -label.installWizard.click.launch=Klikk startknappen. -label.installWizard.subtitle=Denne veiviseren vil hjelpe deg i din installasjon av CloudStack&\#8482 -label.installWizard.title=Hei og velkommen til CloudStack&\#8482 -label.instance=Instans -label.instance.limits=Instans Begrensninger -label.instance.name=Instans Navn -label.instance.port=Instansport -label.instance.scaled.up=Instans skalert til forespurt tilbud -label.instances=Instanser -label.instanciate.template.associate.profile.blade=Instansier mal og assosier malen med Blade -label.intermediate.certificate=Intermediate sertifikat {0} -label.internal.dns.1=Intern DNS 1 -label.internal.dns.2=Intern DNS 2 -label.internal.lb.details=Intern LB detaljer -label.internal.lb=Intern LB -label.internallbvm=InternalLbVm -label.internal.name=Internt navn -label.interval.type=Intervalltype -label.introduction.to.cloudstack=Introduksjon til CloudStack&\#8482 -label.invalid.integer=Ugyldig heltall -label.invalid.number=Ugyldig tall -label.invitations=Invitasjoner -label.invited.accounts=Inviterte kontoer -label.invite=Inviter -label.invite.to=Inviter til -label.ip.address=IP-adresse -label.ipaddress=IP-adresse -label.ip.allocations=IP Allokeringer -label.ip=IP -label.ip.limits=Offentlig IP-addresse Grenser -label.ip.or.fqdn=IP eller FQDN -label.ip.range=IP-rekke -label.ip.ranges=IP-rekker -label.IPsec.preshared.key=IPSec Delt N\u00f8kkel -label.ips=IPer -label.ipv4.cidr=IPv4 CIDR -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.ipv4.end.ip=IPv4 Slutt IP -label.ipv4.gateway=IPv4 Gateway -label.ipv4.netmask=IPv4 nettmaske -label.ipv4.start.ip=IPv4 Start IP -label.ipv6.address=IPv6 IP Adresse -label.ipv6.CIDR=IPv6 CIDR -label.ipv6.dns1=IPv6 DNS1 -label.ipv6.dns2=IPv6 DNS2 -label.ipv6.end.ip=IPv6 Slutt IP -label.ipv6.gateway=IPv6 Gateway -label.ipv6.start.ip=IPv6 Start IP -label.iscsi=iSCSI -label.is.default=Er standard -label.iso.boot=ISO Boot -label.iso=ISO -label.isolated.networks=Isolerte nettverk -label.isolation.method=Isolasjonsmetode -label.isolation.mode=Isolasjonsmetode -label.isolation.uri=Isolasjons URI -label.is.redundant.router=Redundant -label.is.shared=Er delt -label.is.system=Er system -label.item.listing=Elementlisting -label.japanese.keyboard=Japansk-tastatur -label.keep=Behold -label.keep.colon=Behold\: -label.keyboard.language=Tastaturspr\u00e5k -label.keyboard.type=Tastaturtype -label.key=N\u00f8kkel -label.kvm.traffic.label=KVM trafikketikett -label.label=Etikett -label.lang.arabic=Arabisk -label.lang.brportugese=Brasiliansk Portugisisk -label.lang.catalan=Katalansk -label.lang.chinese=Kinesisk (Forenklet) -label.lang.dutch=Dutch (Nederland) -label.lang.english=Engelsk -label.lang.french=Fransk -label.lang.german=Tysk -label.lang.hungarian=Ungarsk -label.lang.italian=Italiensk -label.lang.japanese=Japanesisk -label.lang.korean=Koreansk -label.lang.norwegian=Norsk -label.lang.polish=Polsk -label.lang.russian=Russisk -label.lang.spanish=Spansk -label.last.disconnected=Siste Frakobling -label.last.name=Etternavn -label.lastname.lower=etternavn -label.latest.events=Siste hendelser -label.launch=Start -label.launch.vm=Start VM -label.launch.zone=Start sone -label.lb.algorithm.leastconn=F\u00e6rrest tilkoblinger -label.lb.algorithm.roundrobin=Ringdistribusjon -label.lb.algorithm.source=Kilde -label.LB.isolation=LB-isolering -label.ldap.configuration=LDAP-konfigurasjon -label.ldap.group.name=LDAP Gruppe -label.ldap.link.type=Type -label.ldap.port=LDAP port -label.level=Niv\u00e5 -label.link.domain.to.ldap=Knytt domene til LDAP -label.linklocal.ip=Link-lokal IP-adresse -label.load.balancer=Lastbalanserer -label.load.balancer.type=Lastbalanseringstype -label.load.balancing=Lastbalansering -label.load.balancing.policies=Regler for lastbalansering -label.loading=Laster -label.local.file=Lokal fil -label.local=Lokal -label.local.storage.enabled=Aktiver lokal lagring for bruker VMer -label.local.storage.enabled.system.vms=Aktiver lokal lagring for SystemVMer -label.local.storage=Lokal lagring -label.login=Logg inn -label.logout=Logg ut -label.lun=LUN -label.LUN.number=LUN \# -label.lxc.traffic.label=LXC trafikk etikett -label.make.project.owner=Gj\u00f8r konto prosjekteier -label.make.redundant=Gj\u00f8r redundant -label.manage=Administrer -label.managed=Administrert -label.management=Administrasjon -label.management.ips=Administrasjons IP-adresser -label.management.server=Administrasjonsserver -label.manage.resources=Behandle ressurser -label.max.cpus=Maks CPU kjerner -label.max.guest.limit=Maks antall gjester -label.maximum=Maksimum -label.max.instances=Maks Instanser -label.max.memory=Maks minne (MiB) -label.max.networks=Maks nettverk -label.max.primary.storage=Maks prim\u00e6r (GiB) -label.max.public.ips=Maks offentlige IPer -label.max.secondary.storage=Maks sekund\u00e6r (GiB) -label.max.snapshots=Maks \u00f8yeblikksbilder -label.max.templates=Maks maler -label.max.vms=Maks bruker-VMer -label.max.volumes=Maks volumer -label.max.vpcs=Maks VPCs -label.may.continue=Du kan n\u00e5 fortsette. -label.md5.checksum=MD5 sjekksum -label.memory.allocated=Minne allokert -label.memory.limits=Minnebegrensning (MiB) -label.memory.mb=Minne (i MB) -label.memory=Minne -label.memory.total=Minne totalt -label.memory.used=Minne brukt -label.menu.accounts=Kontoer -label.menu.alerts=Varsler -label.menu.all.accounts=Alle kontoer -label.menu.all.instances=Alle instanser -label.menu.community.isos=Fellesskap ISO medier -label.menu.community.templates=Felleskap Maler -label.menu.configuration=Konfigurering -label.menu.dashboard=Dashbord -label.menu.destroyed.instances=\u00d8delagte instanser -label.menu.disk.offerings=Disktilbud -label.menu.domains=Domener -label.menu.events=Hendelser -label.menu.featured.isos=Fremhevede ISOer -label.menu.featured.templates=Fremhevde maler -label.menu.global.settings=Globale innstillinger -label.menu.infrastructure=Infrastruktur -label.menu.instances=Instanser -label.menu.ipaddresses=IP-adresser -label.menu.isos=ISOer -label.menu.my.accounts=Mine kontoer -label.menu.my.instances=Mine instanser -label.menu.my.isos=Mine ISOer -label.menu.my.templates=Mine maler -label.menu.network=Nettverk -label.menu.network.offerings=Nettverkstilbud -label.menu.physical.resources=Fysiske ressurser -label.menu.regions=Regioner -label.menu.running.instances=Kj\u00f8rende instanser -label.menu.security.groups=Sikkerhetsgrupper -label.menu.service.offerings=Tjenestetilbud -label.menu.snapshots=\u00d8yebliksbilder -label.menu.sshkeypair=SSH n\u00f8kkelpar -label.menu.stopped.instances=Stoppede instanser -label.menu.storage=Lagring -label.menu.system.service.offerings=Systemtilbud -label.menu.system=System -label.menu.system.vms=System VMer -label.menu.templates=Maler -label.menu.virtual.appliances=Virtuelle Apparater -label.menu.virtual.resources=Virtuelle ressurser -label.menu.volumes=Volumer -label.menu.vpc.offerings=VPC tilbud -label.metrics.allocated=Allokert -label.metrics=Beregninger -label.metrics.clusters=Klynger -label.metrics.cpu.allocated=CPU-Allokasjon -label.metrics.cpu.max.dev=Avvik -label.metrics.cpu.total=Totalt -label.metrics.cpu.usage=CPU-bruk -label.metrics.cpu.used.avg=Brukt -label.metrics.disk.allocated=Allokert -label.metrics.disk=Disk -label.metrics.disk.iops.total=IOPS -label.metrics.disk.read=Lese -label.metrics.disk.size=St\u00f8rrelse -label.metrics.disk.storagetype=Type -label.metrics.disk.total=Totalt -label.metrics.disk.unallocated=Uallokert -label.metrics.disk.usage=Diskforbruk -label.metrics.disk.used=Brukt -label.metrics.disk.write=Skriv -label.metrics.hosts=Verter -label.metrics.memory.allocated=Minneallokering -label.metrics.memory.max.dev=Avvik -label.metrics.memory.total=Totalt -label.metrics.memory.usage=Minneforbruk -label.metrics.memory.used.avg=Brukt -label.metrics.name=Navn -label.metrics.network.read=Lese -label.metrics.network.usage=Nettverksforbruk -label.metrics.network.write=Skriv -label.metrics.num.cpu.cores=Kjerner -label.metrics.property=Egenskap -label.metrics.scope=Omfang -label.metrics.state=Status -label.metrics.storagepool=Lagringspool -label.metrics.vm.name=VM-navn -label.migrate.instance.to.host=Migrer instansen til en annen vert -label.migrate.instance.to=Migrer instans til -label.migrate.instance.to.ps=Migrer instansen til en annen prim\u00e6rlagring. -label.migrate.lb.vm=Migrer LB VM -label.migrate.router.to=Migrer Ruter til -label.migrate.systemvm.to=Migrer System VM til -label.migrate.to.host=Migrer til vert -label.migrate.to.storage=Migrer til lagring -label.migrate.volume=Migrer volum -label.migrate.volume.to.primary.storage=Migrer volumet til en annen prim\u00e6rlagring. -label.minimum=Minimum -label.min.instances=Min Instanser -label.min.past.the.hr=minutter etter time -label.minute.past.hour=minutt(er) etter hel time -label.minutes.past.hour=minutt(er) etter time -label.mode=Modus -label.monday=Mandag -label.monthly=M\u00e5nedlig -label.more.templates=Flere maler -label.move.down.row=Flytt \u00e9n rad ned -label.move.to.bottom=Flytt til bunnen -label.move.to.top=Flytt til toppen -label.move.up.row=Flytt \u00e9n rad opp -label.my.account=Min konto -label.my.network=Mitt nettverk -label.my.templates=Mine maler -label.name.lower=Navn -label.name=Navn -label.name.optional=Navn (Valgfritt) -label.na=N/A -label.nat.port.range=NAT portrekke -label.netmask=Nettmaske -label.netscaler.details=NetScaler detaljer -label.netScaler=NetScaler -label.network.ACL=Nettverk ACL -label.network.ACLs=Nettverk ACLer -label.network.ACL.total=Nettverk ACL Total -label.network.addVM=Legg nettverk til VM -label.network.cidr=Nettverk CIDR -label.network.desc=Nettverksbeskrivelse -label.network.details=Nettverksdetaljer -label.network.device=Nettverksenhet -label.network.device.type=Type nettverksenhet -label.network.domain=Nettverksdomene -label.network.domain.text=Nettverksdomene -label.network.id=Nettverks ID -label.networking.and.security=Nettverk og sikkerhet -label.network.label.display.for.blank.value=Bruk standard gateway -label.network.limits=Nettverksbegrensninger -label.network.name=Nettverksnavn -label.network=Nettverk -label.network.offering.details=Nettverkstilbud detaljer -label.network.offering.display.text=Nettverkstilbud Forklaring -label.network.offering.id=Nettverkstilbud ID -label.network.offering.name=Nettverkstilbud Navn -label.network.offering=Nettverkstilbud -label.network.rate.megabytes=Nettverks fart (MB/s) -label.network.rate=Nettverks fart (MB/s) -label.network.read=Nettverk les -label.network.service.providers=Nettverktjenestetilbydere -label.networks=Nettverk -label.network.type=Nettverkstype -label.network.write=Nettverk skriveoperasjoner -label.new=Ny -label.new.password=Nytt passord -label.new.project=Nytt prosjekt -label.new.ssh.key.pair=Nytt SSH-n\u00f8kkelpar -label.new.vm=Ny VM -label.next=Neste -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=NFS Server -label.nfs.storage=NFS Lagring -label.nic.adapter.type=NIC adaptertype -label.nicira.controller.address=Kontrolleradresse -label.nicira.l2gatewayserviceuuid=L2 Gateway tjeneste-uuid -label.nicira.l3gatewayserviceuuid=L3 Gateway Tjeneste Uuid -label.nicira.nvp.details=Nicira NVP detaljer -label.nicira.transportzoneuuid=Transport sone Uuid -label.nics=NICer -label.no.actions=Ingen tilgjengelige handlinger -label.no.alerts=Ingen nylige alarmer -label.no.data=Ingen data \u00e5 vise -label.no.errors=Ingen nylige feil -label.no.grouping=(ingen gruppering) -label.no.isos=Ingen tilgjengelige ISOer -label.no.items=Ingen tilgjengelige elementer -label.no=Nei -label.none=Ingen -label.no.security.groups=Ingen tilgjengelige sikkerhetsgrupper -label.not.found=Ikke funnet -label.no.thanks=Nei, takk -label.notifications=Notifikasjoner -label.number.of.clusters=Antall klynger -label.number.of.cpu.sockets=Totalt antall CPU-sockets -label.number.of.hosts=Antall verter -label.number.of.pods=Antall pods -label.number.of.system.vms=Antall System VMer -label.number.of.virtual.routers=Antall virtuelle rutere -label.number.of.zones=Antall soner -label.num.cpu.cores=\# av CPU-kjerner -label.numretries=Antall fors\u00f8k -label.ocfs2=OCFS2 -label.offer.ha=Tilby HA -label.of.month=av m\u00e5ned -label.ok=OK -label.opendaylight.controllerdetail=OpenDaylight kontrollerdetaljer -label.opendaylight.controller=OpenDaylight kontroller -label.opendaylight.controllers=OpenDaylight kontrollere -label.openDaylight=OpenDaylight -label.operator=Operat\u00f8r -label.optional=Valgfritt -label.order=Rekkef\u00f8lge -label.os.preference=OS-preferanse -label.os.type=OS-type -label.other=Andre -label.outofbandmanagement.action=Handling -label.outofbandmanagement.password=Passord -label.outofbandmanagement.port=Port -label.outofbandmanagement.username=Brukernavn -label.override.guest.traffic=Overstyr Gjeste Trafikk -label.override.public.traffic=Overstyr Offentlig Trafikk -label.ovm3.cluster=Innebygd Klynge Funksjon -label.ovm3.pool=Innebygd Pooling -label.ovm3.traffic.label=OVM3 trafikketikett -label.ovm3.vip=Hoved VIP IP -label.ovm.traffic.label=OVM trafikk etikett -label.ovs=OVS -label.owned.public.ips=Offentlige IP-addresser i bruk -label.owner.account=Eierkonto -label.owner.domain=Eierdomene -label.palo.alto.details=Palo Alto detaljer -label.PA.log.profile=Palo Alto logg profil -label.PA=Palo Alto -label.parent.domain=Foreldre domene -label.passive=Passiv -label.password.enabled=Passord Aktivert -label.password.lower=passord -label.password=Passord -label.password.reset.confirm=Passordet har blitt resatt til -label.PA.threat.profile=Palo Alto trussel profil -label.path=Sti -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.persistent=Vedvarende -label.physical.network=Fysisk nettverk -label.physical.network.ID=Fysisk nettverksid -label.physical.network.name=Fysisk nettverksnavn -label.PING.CIFS.password=PING CIFS passord -label.PING.CIFS.username=PING CIFS brukernavn -label.PING.dir=PING-mappe -label.ping.path=Ping Sti -label.PING.storage.IP=PING lagrings-IP -label.planner.mode=Planleggingsmodus -label.please.complete.the.following.fields=Vennligst fullf\u00f8rt f\u00f8lgende felter -label.please.specify.netscaler.info=Vennligst spesifiser NetScaler-info -label.please.wait=Vennligst vent -label.plugin.details=Plugin detaljer -label.plugins=Plugins -label.pod.dedicated=Pod Dedikert -label.pod.name=Pod navn -label.pod=Pod -label.pods=Pods -label.polling.interval.sec=Sjekkintervall (i sekunder) -label.portable.ip=Flyttbar IP -label.portable.ip.range.details=Portabel IP-rekke detaljer -label.portable.ip.ranges=Transportable IP-rekker -label.portable.ips=Portabel IP-rekke -label.port.forwarding.policies=Regler for portvideresending -label.port.forwarding=Portvideresending -label.port=Port -label.port.range=Portrekke -label.PreSetup=Forberedt Konfigurasjon -label.prev=Forrige -label.previous=Forrige -label.primary.allocated=Prim\u00e6rlagring allokert -label.primary.network=Prim\u00e6rnettverk -label.primary.storage.count=Prim\u00e6rlagrings Pool -label.primary.storage.limits=Prim\u00e6rlagring Maxgrense (GiB) -label.primary.storage=Prim\u00e6rlagring -label.primary.used=Prim\u00e6rlagring brukt -label.private.Gateway=Privat Gateway -label.private.interface=Privat Grensesnitt -label.private.ip=Privat IP-adresse -label.private.ip.range=Privat IP-rekke -label.private.ips=Private IP-adresser -label.privatekey=PKCS\#8 Privat N\u00f8kkel -label.private.key=Privat n\u00f8kkel -label.private.network=Privat nettverk -label.private.port=Privat port -label.private.zone=Privat sone -label.profile=Profil -label.project.dashboard=Prosjektoversikt -label.project.id=Prosjektid -label.project.invite=Inviter til prosjekt -label.project.name=Prosjektnavn -label.project=Prosjekt -label.projects=Prosjekter -label.project.view=Prosjektvisning -label.protocol.number=Protokollnummer -label.protocol=Protokoll -label.providers=Tilbydere -label.provider=Tilbyder -label.public.interface=Offentlig Grensesnitt -label.public.ip=Offentlig IP-adresse -label.public.ips=Offentlig IP-adresser -label.public.key=Offentlig n\u00f8kkel -label.public.lb=Offentlig LB -label.public.load.balancer.provider=Offentlig Lastbalanserer Tilbyder -label.public.network=Offentlig nettverk -label.public=Offentlig -label.public.port=Offentlig port -label.public.traffic=Offentlig trafikk -label.public.traffic.vswitch.name=Offentlig Trafikk vSwitch Navn -label.public.traffic.vswitch.type=Offentlig Trafikk vSwitch Type -label.public.zone=Offentlig sone -label.purpose=Form\u00e5l -label.Pxe.server.type=PXE Servertype -label.qos.type=QoS Type -label.quickview=Hurtigvisning -label.quiesce.vm=Quiesce VM -label.quiet.time.sec=Quiet Tid (sekunder) -label.quota.add.credits=Legg til kreditt -label.quota.balance=Balanse -label.quota.configuration=Kvotekonfigurasjon -label.quota.configure=Konfigurer Kvote -label.quota.credit=Kreditt -label.quota.credits=Kreditt -label.quota.date=Dato -label.quota.dates=Oppdater datoer -label.quota.description=Kvotebeskrivelse -label.quota.email.body=Innhold -label.quota.email.lastupdated=Sist oppdatert -label.quota.email.subject=Emne -label.quota.email.template=Epostmal -label.quota.enddate=Sluttdato -label.quota.endquota=Sluttkvote -label.quota.enforcequota=Tving Kvote -label.quota.fullsummary=Alle kontoer -label.quota.minbalance=Minste balanse -label.quota.remove=Fjern Kvote -label.quota.startdate=Startdato -label.quota.startquota=Startkvote -label.quota.statement.balance=Kvotebalanse -label.quota.statement.bydates=Kontoutskrift -label.quota.statement=Kontoutskrift -label.quota.statement.quota=Kvoteforbrukk -label.quota.statement.tariff=Kvotetariff -label.quota.state=Status -label.quota.summary=Sammendrag -label.quota.tariff.edit=Rediger tariff -label.quota.tariff.effectivedate=Effektiv dato -label.quota.tariff=Tariff -label.quota.tariff.value=Tariffverdi -label.quota.total=Totalt -label.quota.totalusage=Totalbruk -label.quota.type.name=Brukstype -label.quota.type.unit=Bruksenhet -label.quota.usage=Kvoteforbruk -label.quota.value=Kvoteverdi -label.rbd.id=Cephx user -label.rbd.monitor=Ceph monitor -label.rbd.pool=Ceph pool -label.rbd=RBD -label.rbd.secret=Cephx hemmelighet -label.reboot=Restart -label.recent.errors=Nylige feil -label.recover.vm=Gjenopprett VM -label.redundant.router.capability=Redundant ruter -label.redundant.router=Redundant ruter -label.redundant.state=Redundant tilstand -label.redundant.vpc=Redundant VPC -label.refresh.blades=Oppdater blad(er) -label.refresh=Oppfrisk -label.region.details=Regiondetaljer -label.regionlevelvpc=Region Niv\u00e5 VPC -label.region=Region -label.reinstall.vm=Reinstaller VM -label.related=Relaterte -label.release.account=Frigi fra Konto -label.release.account.lowercase=Frigi fra konto -label.release.dedicated.cluster=Frigj\u00f8r dedikert kluster -label.release.dedicated.host=Frigj\u00f8r dedikert host -label.release.dedicated.pod=Frigj\u00f8r Dedikert Pod -label.release.dedicated.vlan.range=Frigj\u00f8r dedikerte VLAN rekke -label.release.dedicated.zone=Frigj\u00f8r dedikert sone -label.remind.later=P\u00e5minn meg senere -label.remove.ACL=Fjern ACL -label.remove.egress.rule=Fjern egressregel -label.remove.from.load.balancer=Fjerner instans fra lastbalanserer -label.remove.ingress.rule=Fjern ingressregel -label.remove.ip.range=Fjern IP-rekke -label.remove.ldap=Fjern LDAP -label.remove.network.offering=Fjern nettverkstilbud -label.remove.pf=Fjern portvideresendingsregel -label.remove.project.account=Fjern konto fra prosjekt -label.remove.region=Fjern region -label.remove.rule=Fjern regel -label.remove.ssh.key.pair=Fjern SSH-n\u00f8kkelpar -label.remove.static.nat.rule=Fjern statisk NAT-regel -label.remove.static.route=Fjern statisk rute -label.remove.this.physical.network=Fjern dette fysiske nettverk -label.remove.tier=Fjern gren -label.remove.vm.from.lb=Fjern VM fra lastbalanseringsregel -label.remove.vm.load.balancer=Fjern VM fra lastbalanserer -label.remove.vmware.datacenter=Fjern VMware datasenter -label.remove.vpc=fjern VPC -label.remove.vpc.offering=Fjern VPC tilbud -label.removing=Fjerner -label.removing.user=Fjerner Bruker -label.reource.id=Ressurs ID -label.replace.acl=Erstatt ACL -label.replace.acl.list=Erstatt ACL Liste -label.required=P\u00e5krevd -label.requires.upgrade=Krever oppgradering -label.reserved.ip.range=Reservert IP-rekke -label.reserved.system.gateway=Reservert System Gateway -label.reserved.system.ip=Reservert System IP -label.reserved.system.netmask=Reservert system nettmaske -label.reset.ssh.key.pair.on.vm=Reset SSH-n\u00f8kkelpar p\u00e5 VM -label.reset.ssh.key.pair=Resett SSH-n\u00f8kkelpar -label.resetVM=Resett VM -label.reset.VPN.connection=Resett VPN-tilkobling -label.resize.new.offering.id=Nytt tilbud -label.resize.new.size=Ny st\u00f8rrelse (GB) -label.resize.shrink.ok=Krympe OK -label.resource.limit.exceeded=Ressursbegrensning Overskridet -label.resource.limits=Ressursbegrensninger -label.resource.name=Ressursnavn -label.resource=Ressurs -label.resources=Ressurser -label.resource.state=Ressurs Status -label.response.timeout.in.sec=Respons Tidsavbrudd (sekunder) -label.restart.network=Nettverksomstart -label.restart.required=Omstart p\u00e5krevd -label.restart.vpc=Omstart VPC -label.restore=Gjenopprett -label.retry.interval=Nyfors\u00f8k Intervall -label.review=Gjennomg\u00e5 -label.revoke.project.invite=Tilbakekall invitasjonen -label.role=Rolle -label.root.certificate=Rootsertifikat -label.root.disk.controller=Root diskkontroller -label.root.disk.offering=Root disktilbud -label.root.disk.size=Rotdiskst\u00f8rrelse (GB) -label.router.vm.scaled.up=RuterVM skalert opp -label.routing.host=Ruter Vert -label.routing=Ruting -label.rule.number=Regelnummer -label.rules=Regler -label.running.vms=Kj\u00f8rende VMer -label.s3.access_key=Aksessn\u00f8kkel -label.s3.bucket=B\u00f8tte -label.s3.connection_timeout=Tilkoblingsavbrudd -label.s3.endpoint=Endepunkt -label.s3.max_error_retry=Max Nyfors\u00f8k Etter Feilmelding -label.s3.nfs.path=S3 NFS Sti -label.s3.nfs.server=S3 NFS Server -label.s3.secret_key=Hemmelig n\u00f8kkel -label.s3.socket_timeout=Socket Tidsavbrudd -label.s3.use_https=Bruk HTTPS -label.saml.enable=Autoriser SAML SSO -label.saml.entity=Identitets Tilbydere -label.saturday=L\u00f8rdag -label.save.and.continue=Lagre og fortsett -label.save.changes=Lagre endringer -label.save=Lagre -label.saving.processing=Lagrer.... -label.scaledown.policy=Nedtrappings policy -label.scale.up.policy=Oppskalerings policy -label.scaleup.policy=Oppskalerings policy -label.scope=Omfang -label.search=S\u00f8k -label.secondary.ips=Sekund\u00e6re IPer -label.secondary.isolated.vlan.id=Sekund\u00e6r Isolert VLAN ID -label.secondary.staging.store.details=Sekund\u00e6rmellomlagringsomr\u00e5de detaljer -label.secondary.staging.store=Sekund\u00e6rmellomlagringsomr\u00e5de -label.secondary.storage.count=Sekund\u00e6rlagrings Pool -label.secondary.storage.details=Sekund\u00e6rlagringsdetaljer -label.secondary.storage.limits=Sekund\u00e6rlagringsbregrensninger (GiB) -label.secondary.storage=Sekund\u00e6rlagring -label.secondary.storage.vm=Sekund\u00e6rlagring VM -label.secondary.used=Sekund\u00e6rlagringsplass brukt -label.secret.key=Hemmelig n\u00f8kkel -label.security.group.name=Sikkerhetsgruppenavn -label.security.groups.enabled=Sikkerhetsgrupper Aktivert -label.security.group=Sikkerhetsgruppe -label.security.groups=Sikkerhetsgrupper -label.select.a.template=Velg en mal -label.select.a.zone=Velg en sone -label.select.instance.to.attach.volume.to=Velg instans for tildeling av volum -label.select.instance=Velg instans -label.select.iso.or.template=Velg ISO eller mal -label.select.offering=Velg tilbud -label.select.project=Velg prosjekt -label.select.region=Velg region -label.select.template=Velg Mal -label.select.tier=Velg gren -label.select=Velg -label.select-view=Velg visning -label.select.vm.for.static.nat=Velg instans for statisk NAT -label.sent=Sendt -label.server=Tjener -label.service.capabilities=Tjeneste Evner -label.service.offering.details=Tjenstetilbudsdetaljer -label.service.offering=Tjenestetilbud -label.service.state=Tjenestestatus -label.services=Tjenester -label.session.expired=Sesjon utl\u00f8pt -label.set.default.NIC=Sett som standard NIC -label.settings=Innstillinger -label.setup.network=Sett opp nettverk -label.setup=Oppsett -label.setup.zone=Sett opp sone -label.set.up.zone.type=Oppsett av sonetype -label.shared=Delt -label.SharedMountPoint=SharedMountPoint -label.show.advanced.settings=VIs avanserte instillinger -label.show.ingress.rule=Vis ingressregel -label.shutdown.provider=Steng tilbyder -label.simplified.chinese.keyboard=Forenklet kinesisk-tastatur -label.site.to.site.VPN=Site-to-site VPN -label.size=St\u00f8rrelse -label.skip.guide=Jeg har brukt CloudStack tidligere. Hopp over denne veiviseren -label.smb.domain=SMB Domene -label.smb.password=SMB Passord -label.smb.username=SMB Brukernavn -label.snapshot.limits=\u00d8yeblikksbildebegrensning -label.snapshot.name=\u00d8yeblikksbildenavn -label.snapshot.schedule=Sett Opp Gjentagende \u00f8yeblikksbilder -label.snapshot.s=\u00d8yeblikksbilder -label.snapshots=\u00d8yeblikksbilder -label.snapshot=\u00d8yeblikksbilde -label.SNMP.community=SNMP Community -label.SNMP.port=SNM Port -label.sockets=CPU Sokkel -label.source.ip.address=Kilde IP-adresse -label.source.nat=Kilde NAT -label.source.nat.supported=SourceNAT st\u00f8ttet -label.source.port=Kildeport -label.specify.IP.ranges=Spesifiser IP-rekker -label.specify.vlan=Spesifiser VLAN -label.specify.vxlan=Spesifiser VXLAN -label.SR.name=SR navnelapp -label.srx.details=SRX detaljer -label.srx=SRX -label.ssh.key.pair.details=SSH-n\u00f8kkelpardetaljer -label.ssh.key.pair=SSH-n\u00f8kkelpar -label.ssh.key.pairs=SSH n\u00f8kkelpar -label.standard.us.keyboard=Standard (Amerikansk) tastatur -label.start.IP=Start-IP -label.start.lb.vm=Start LB VM -label.start.port=Start port -label.start.reserved.system.IP=F\u00f8rste reserverte system IP -label.start.vlan=Start VLAN -label.start.vxlan=Start VXLAN -label.state=Status -label.static.nat.enabled=Statisk NAT aktivert -label.static.nat=Statistk NAT -label.static.nat.to=Statisk NAT til -label.static.nat.vm.details=Statisk NAT VM Detaljer -label.static.routes=Statiske ruter -label.statistics=Statistikk -label.status=Status -label.step.1=Steg 1 -label.step.1.title=Steg 1\: Velg en mal -label.step.2=Steg 2 -label.step.2.title=Steg 2\: Tjenestetilbud -label.step.3=Steg 3 -label.step.3.title=Steg 3\: Velg et disktilbud -label.step.4=Steg 4 -label.step.4.title=Steg 4\: Nettverk -label.step.5=Steg 5 -label.step.5.title=Steg 5\: Repetere -label.stickiness=Klebrighet -label.stickiness.method=Klebrighetmetode -label.sticky.cookie-name=Cookie navn -label.sticky.domain=Domene -label.sticky.expire=Utl\u00f8per -label.sticky.holdtime=Oppholds tid -label.sticky.indirect=Indirekte -label.sticky.length=Lengde -label.sticky.mode=Modus -label.sticky.name=Sticky Navn -label.sticky.nocache=Ingen cache -label.sticky.postonly=Send bare -label.sticky.prefix=Prefiks -label.sticky.request-learn=L\u00e6r Foresp\u00f8rsel -label.sticky.tablesize=Tabellst\u00f8rrelse -label.stop.lb.vm=Stop LB VM -label.stopped.vms=Stoppede VMer -label.stop=Stopp -label.storage=Lagring -label.storage.pool=Lagringspool -label.storage.tags=Merkelapper for lagring -label.storage.traffic=Lagringstrafikk -label.storage.type=Lagringstype -label.subdomain.access=Tilgang for underdomene -label.submit=Send -label.submitted.by=[Innsendt av\: ] -label.succeeded=Vellykket -label.sunday=S\u00f8ndag -label.super.cidr.for.guest.networks=Super CIDR for gjestenettverk -label.supported.services=St\u00f8ttede Tjenester -label.supported.source.NAT.type=Supporterte kilde-NAT typer -label.supportsstrechedl2subnet=St\u00f8tter strekket L2 subnett -label.suspend.project=Suspender prosjekt -label.switch.type=Svitsjtype -label.system.capacity=Systemkapasistet -label.system.offering.for.router=Systemtilbud for Rutere -label.system.offering=Systemtilbud -label.system.service.offering.details=Systemtjenestetilbudsdetaljer -label.system.service.offering=Systemtjenestetilbud -label.system.vm.details=SystemVM-detaljer -label.system.vm.scaled.up=SystemVM skalert opp -label.system.vms=System VMer -label.system.vm=System VM -label.system.vm.type=SystemVM-type -label.system.wide.capacity=Systemomfattende kapasistet -label.tagged=Tagget -label.tag.key=Merkelapp Key -label.tags=Tagger -label.tag.value=Tag Verdi -label.target.iqn=M\u00e5l IQN -label.task.completed=Oppgave utf\u00f8rt -label.template.limits=Malbegrensninger -label.template=Mal -label.TFTP.dir=TFTP-mappe -label.tftp.root.directory=TFTP rot-mappe -label.theme.default=Standardtema -label.theme.grey=Tilpasset - Gr\u00e5 -label.theme.lightblue=Tilpasset - Lys Gr\u00e5 -label.threshold=Terskel -label.thursday=Torsdag -label.tier.details=VPC-gren detaljer -label.tier=Gren -label.time.colon=Time\: -label.timeout.in.second = Tidsavbrudd (sekunder) -label.timeout=Tidsavbrudd -label.time=Tid -label.timezone.colon=Tidssone\: -label.time.zone=Tidssone -label.timezone=Tidssone -label.token=Kode -label.total.cpu=Totalt CPU -label.total.CPU=Totalt CPU -label.total.hosts=Totalt Verter -label.total.memory=Totalt minne -label.total.of.ip=Totalt IP-adresser -label.total.of.vm=Totalt av VM -label.total.storage=Totalt lagring -label.total.virtual.routers=Total antall virtuelle rutere -label.total.virtual.routers.upgrade=Totalt antall virtuelle routere som trenger oppgradering -label.total.vms=Totalt VMs -label.traffic.label=Trafikketikett -label.traffic.types=Trafikktyper -label.traffic.type=Trafikktype -label.tuesday=Tirsdag -label.type.id=Type ID -label.type.lower=type -label.type=Type -label.ucs=UCS -label.uk.keyboard=UK-tastatur -label.unavailable=Utilgjengelig -label.unhealthy.threshold=Usunn Terskel -label.unlimited=Ubegrenset -label.untagged=Utagget -label.update.project.resources=Oppdater prosjektressurser -label.update.ssl.cert= SSL-sertifikat -label.update.ssl= SSL-sertifikat -label.updating=Oppdaterer -label.upgrade.required=Oppgradering er p\u00e5krevd -label.upgrade.router.newer.template=Oppgrader ruter til nyere mal -label.upload.from.local=Last opp fra lokal -label.upload=Last opp -label.upload.template.from.local=Last opp mal fra lokal -label.upload.volume.from.local=Last opp volum fra lokal -label.upload.volume.from.url=Last opp volum fra URL -label.upload.volume=Last opp volum -label.url=URL -label.usage.interface=Brukergrensesnitt -label.usage.sanity.result=Forbruks Tilregnelighet Resultat -label.usage.server=Forbruksserver -label.usage.type=Brukstype -label.usage.unit=Enhet -label.used=Brukt -label.user=Bruker -label.user.data=Brukerdata -label.user.details=Brukerdetaljer -label.username=Brukernavn -label.username.lower=brukernavn -label.users=Brukere -label.user.vm=Bruker VM -label.use.vm.ip=Bruk VM IP\: -label.use.vm.ips=Bruk VM IPer -label.value=Verdi -label.vcdcname=vCenter DC navn -label.vcenter.cluster=vCenter Klynge -label.vcenter.datacenter=vCenter Datacenter -label.vcenter.datastore=vCenter Datastore -label.vcenter.host=vCenter Vert -label.vcenter.password=vCenter passord -label.vcenter.username=vCenter brukernavn -label.vcenter=vcenter -label.vcipaddress=vCenter IP-adresse -label.version=Versjon -label.vgpu.max.resolution=Maks oppl\u00f8sning -label.vgpu.max.vgpu.per.gpu=VGPUs per GPU -label.vgpu.remaining.capacity=Gjenst\u00e5ende kapasitet -label.vgpu.type=vGPU type -label.vgpu=VGPU -label.vgpu.video.ram=Video RAM -label.view.all=Vis alle -label.view.console=Se konsoll -label.viewing=Viser -label.view.more=Vis mer -label.view.secondary.ips=Se sekund\u00e6re IPer -label.view=Vis -label.virtual.appliance.details=Virtuelt apparat detaljer -label.virtual.appliances=Virtuelle Apparater -label.virtual.appliance=Virtuellt Apparat -label.virtual.machines=Virtuelle Maskiner -label.virtual.machine=Virtuell Maskin -label.virtual.networking=Virtuelt Nettverk -label.virtual.network=Virtuelt-nettverk -label.virtual.routers.group.account=Virtuelle rutere gruppert p\u00e5 konto -label.virtual.routers.group.cluster=Virtuelle rutere gruppert p\u00e5 kluster -label.virtual.routers.group.pod=Virtuelle rutere gruppert p\u00e5 pod -label.virtual.routers.group.zone=Virtuelle rutere gruppert p\u00e5 sone -label.virtual.routers=Virtuelle rutere -label.virtual.router=Virtuell ruter -label.vlan.id=VLAN/VNI ID -label.vlan.only=VLAN -label.vlan.range.details=VLAN-rekke detaljer -label.vlan.ranges=VLAN-rekke(r) -label.vlan.range=VLAN/VNI Rekke -label.vlan=VLAN/VNI -label.vlan.vni.ranges=VLAN/VNI Rekke(r) -label.vlan.vni.range=VLAN/VNI Rekke -label.vm.add=Legg til Instans -label.vm.destroy=Destruer -label.vm.display.name=Visningsnavn for VM -label.VMFS.datastore=VMFS lagringsomr\u00e5de -label.vmfs=VMFS -label.vm.id=VM ID -label.vm.ip=VM IP-adresse -label.vm.name=VM-navn -label.vm.password=Passord til VM er -label.vm.reboot=Restart -label.VMs.in.tier=VMer i VPC-gren -label.vmsnapshot.current=isCurrent -label.vmsnapshot.memory=\u00d8yeblikksbilde av minne -label.vmsnapshot.parentname=Forelder -label.vmsnapshot.type=Type -label.vmsnapshot=VM \u00d8yeblikksbilder -label.vm.start=Start -label.vm.state=VM-status -label.vm.stop=Stopp -label.vms=VMer -label.vmware.datacenter.id=VMware datasenter ID -label.vmware.datacenter.name=VMware datasenternavn -label.vmware.datacenter.vcenter=VMware datasenter vcenter -label.vmware.traffic.label=VMware trafikketikett -label.vnet.id=VLAN/VNI ID -label.vnet=VLAN/VNI -label.vnmc.devices=VNMC enheter -label.vnmc=VNMC -label.volatile=volatil -label.volgroup=Volumgruppe -label.volume.details=Volumdetaljer -label.volume.limits=Volumbegrensninger -label.volume.migrated=Volum migrert -label.volume.name=Volumnavn -label.volumes=Volumer -label.volume=Volum -label.vpc.distributedvpcrouter=Distribuert VPC router -label.vpc.id=VPC ID -label.VPC.limits=VPC begrensninger -label.vpc.offering.details=VPC tilbudsdetaljer -label.vpc.offering=VPC tilbud -label.vpc.router.details=VPC ruterdetaljer -label.VPC.router.details=VPC ruterdetaljer -label.vpc.supportsregionlevelvpc=St\u00f8tter Region Niv\u00e5 VPC -label.vpc.virtual.router=VPC virtuell ruter -label.vpc=VPC -label.VPN.connection=VPN-tilkobling -label.vpn.customer.gateway=VPN Kundegateway -label.VPN.customer.gateway=VPN Kundegateway -label.vpn.force.encapsulation=Tving UDP innkapsling av ESP-pakker -label.VPN.gateway=VPN Gateway -label.vpn=VPN -label.vsmctrlvlanid=Kontroll VLAN ID -label.vsmpktvlanid=Pakke VLAN ID -label.vsmstoragevlanid=Lagrings VLAN ID -label.vsphere.managed=Administrert Av vSphere -label.vswitch.name=vSwitch navn -label.vSwitch.type=vSwitch type -label.vxlan.id=VXLAN ID -label.vxlan.range=VXLAN-rekke -label.vxlan=VXLAN -label.waiting=Venter -label.warning=Advarsel -label.warn.upper=WARN -label.warn=Varsle -label.wednesday=Onsdag -label.weekly=Ukentlig -label.welcome.cloud.console=Velkommen til administrasjonskonsollet -label.welcome=Velkommen -label.what.is.cloudstack=Hva er CloudStack&\#8482? -label.xenserver.tools.version.61.plus=Original XS versjon er 6.1\\+ -label.Xenserver.Tools.Version61plus=Original XS versjon er 6.1\\+ -label.xenserver.traffic.label=XenServer trafikketikett -label.yes=Ja -label.zone.dedicated=Dedikert sone -label.zone.details=Sonedetaljer -label.zone.id=Sone ID -label.zone.lower=Sone -label.zone.name=Sonenavn -label.zone=Sone -label.zones=Soner -label.zone.step.1.title=Steg 1\: Velg et nettverk -label.zone.step.2.title=Steg 2\: Legg til en sone -label.zone.step.3.title=Steg 3\: Legg til en pod -label.zone.step.4.title=Steg 4\: Legg til en IP-rekke -label.zone.type=Sonetype -label.zone.wide=Sone omfattende -label.zoneWizard.trafficType.guest=Gjest\: Trafikk mellom brukeres virtuelle maskiner -label.zoneWizard.trafficType.management=Administrasjon\: Trafikk mellom CloudStacks interne ressurser, inkludert eventuelle komponenter som kommuniserer med administrasjonsservere, som verter og CloudStack systemVMer -label.zoneWizard.trafficType.public=Offentlig\: nettverkstrafikk mellom internet og VMs i CloudStack. -label.zoneWizard.trafficType.storage=Lagring\: Trafikk mellom prim\u00e6r og sekund\u00e6rlagringsservere, slik som VM-maler og \u00f8yeblikksbilder. -managed.state=Administrert Status -message.acquire.ip.nic=Vennligst bekreft at du vil allokere en ny sekund\u00e6r IP for dette nettverkskortet.
NB\: Du m\u00e5 manuelt konfigurere den nye sekund\u00e6r-IPen i den virtuelle maskinen. -message.acquire.new.ip=Vennligst bekreft at du \u00f8nsker \u00e5 anskaffe en ny IP for dette nettverket -message.acquire.new.ip.vpc=Vennligst bekreft at du \u00f8nsker \u00e5 hente en ny IP for denne VPC. -message.acquire.public.ip=Vennligst velg en sone som du vil hente ny IP fra. -message.action.cancel.maintenance=Din vert har vellykket blitt kansellert for vedlikehold. Denne prosessen kan ta opptil flere minutter. -message.action.cancel.maintenance.mode=Vennligst bekreft at du \u00f8nsker \u00e5 kansellere dette vedlikeholdet. -message.action.change.service.warning.for.instance=Din instans m\u00e5 v\u00e6re stopped f\u00f8r du fors\u00f8ker \u00e5 endret n\u00e5v\u00e6rende tjenestetilbud. -message.action.change.service.warning.for.router=Din ruter m\u00e5 v\u00e6re stoppet f\u00f8r du kan fors\u00f8ke \u00e5 endre n\u00e5v\u00e6rende tjenestetilbud. -message.action.delete.cluster=Vennligst bekreft at du vil slette denne klyngen. -message.action.delete.disk.offering=Vennligst bekreft at du \u00f8nsker \u00e5 slette dette disktilbudet. -message.action.delete.domain=Vennligst bekreft at du vil slette dette domenet. -message.action.delete.external.firewall=Vennligst bekreft at du vil fjerne denne eksterne brannmuren. Advarsel\: hvis du planlegger \u00e5 legge tilbake den samme eksterne brannmuren, m\u00e5 du resette bruksdataene p\u00e5 enheten. -message.action.delete.external.load.balancer=Vennligst bekreft at du \u00f8nsker \u00e5 fjerne denne eksterne lastbalansereren. Advarsel\: hvis du planlegger \u00e5 legge til den samme eksterne lastbalansereren senere, m\u00e5 du resette bruksdataene p\u00e5 enheten. -message.action.delete.ingress.rule=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne inng\u00e5ende regel. -message.action.delete.ISO.for.all.zones=Denne ISO er brukt av alle soner. Vennligst bekreft at du \u00f8nsker \u00e5 slette den fra alle soner. -message.action.delete.ISO=Vennligst bekreft at du vil slette denne ISO. -message.action.delete.network=Vennligst bekreft at du vil slette dette nettverket. -message.action.delete.nexusVswitch=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne nexus 1000v -message.action.delete.nic=Vennligst bekreft at du vil fjerne dette NIC, noe som ogs\u00e5 vil fjerne det assosierte nettverket fra VMen. -message.action.delete.physical.network=Vennligst bekreft at du \u00f8nsker \u00e5 slette dette fysiske nettverk -message.action.delete.pod=Vennligst bekreft at du vil slette denne pod. -message.action.delete.primary.storage=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne prim\u00e6rlagring. -message.action.delete.secondary.storage=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne sekund\u00e6rlagring. -message.action.delete.security.group=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne sikkerhetsgruppe. -message.action.delete.service.offering=Vennligst bekreft at du \u00f8nsker \u00e5 slette dette tjenestetilbud. -message.action.delete.snapshot=Vennligst bekreft at du \u00f8nsker \u00e5 slette dette \u00f8yeblikksbildet. -message.action.delete.system.service.offering=Vennligst bekreft at du \u00f8nsker \u00e5 slette dette system-tjenestetilbud. -message.action.delete.template.for.all.zones=Denne mal er brukt av alle soner. Vennligst bekreft at du \u00f8nsker \u00e5 slette den fra alle soner. -message.action.delete.template=Vennligst bekreft at du vil slette denne mal. -message.action.delete.volume=Vennligst bekreft at du vil slette dette volumet. -message.action.delete.zone=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne sone. -message.action.destroy.instance=Vennligst bekreft at du \u00f8nsker \u00e5 fjerne denne instansen. -message.action.destroy.systemvm=Vennligst bekreft at du \u00f8nsker \u00e5 \u00f8delegge denne System VM. -message.action.disable.cluster=Vennligst bekreft at du \u00f8nsker \u00e5 detaktivere denne klyngen. -message.action.disable.nexusVswitch=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne nexus 1000v -message.action.disable.physical.network=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere dette fysiske nettverket. -message.action.disable.pod=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne poden -message.action.disable.static.NAT=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere statisk NAT. -message.action.disable.zone=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne sonen. -message.action.downloading.template=Laster ned mal. -message.action.download.iso=Vennligst bekreft at du \u00f8nsker \u00e5 laste ned denne ISO. -message.action.download.template=Vennligst bekreft at du \u00f8nsker \u00e5 laste ned denne malen. -message.action.enable.cluster=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne klyngen. -message.action.enable.maintenance=Din vert har vellykket blitt forberedt for vedlikehold. Denne prosessen kan ta opptil flere minutter. -message.action.enable.nexusVswitch=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne nexus 1000v -message.action.enable.physical.network=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere dette fysiske nettverket. -message.action.enable.pod=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne poden. -message.action.enable.zone=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne sonen. -message.action.expunge.instance=Vennligst bekreft at du vil permanent slette denne instansen. -message.action.force.reconnect=Din vert har vellykket blitt tvunget til \u00e5 koble til p\u00e5 nytt. Denne prosessen kan ta noen minutter. -message.action.host.enable.maintenance.mode=Aktivering av vedlikeholdsmodus vil for\u00e5rsake migrering av alle kj\u00f8rende instanser p\u00e5 denne vert til hvilken som helst annen tilgjengelig vert. -message.action.instance.reset.password=Vennligst bekreft ay du \u00f8nsker \u00e5 endre ROOT-passordet for denne virtuelle maskin. -message.action.manage.cluster=Vennligst bekreft at du \u00f8nsker \u00e5 administrere klyngen. -message.action.primarystorage.enable.maintenance.mode=Advarsel\: setting av prim\u00e6rlagring i vedlikeholdsmodus vil for\u00e5rsake at alle VMer som benytter volum fra det vil bli stoppet. \u00d8nsker du \u00e5 fortsette? -message.action.reboot.instance=Vennligst bekreft at du vill restarte denne instansen. -message.action.reboot.router=Alle tjenester levert fra denne virtuelle ruter vil bli avbrutt. Vennligst bekreft at du \u00f8nsker \u00e5 restarte denne ruteren. -message.action.reboot.systemvm=Vennligst bekreft at du vil restarte denne system VM -message.action.release.ip=Vennligst bekreft at du \u00f8nsker \u00e5 frigi denne IP. -message.action.remove.host=Vennligst bekreft at du vil gjerne denne tjeneren. -message.action.reset.password.off=Din instans st\u00f8tter forel\u00f8pig ikke denne funksjonen. -message.action.reset.password.warning=Din instans m\u00e5 v\u00e6re stoppet f\u00f8r man fors\u00f8ker \u00e5 bytte n\u00e5v\u00e6rende passord. -message.action.restore.instance=Vennligst bekreft at du \u00f8nsker \u00e5 gjenopprette denne instansen. -message.action.revert.snapshot=Vennligst bekreft at du \u00f8nsker \u00e5 gjenopprette volumet til dette \u00f8yeblikksbildet. -message.action.start.instance=Vennligst bekreft at du \u00f8nsker \u00e5 starte denne instansen. -message.action.start.router=Vennligst bekreft at du vil starte denne ruter. -message.action.start.systemvm=Vennligst bekreft at du vil starte denne system VM. -message.action.stop.instance=Vennligst bekreft at du vil stoppe denne instansen. -message.action.stop.router=Alle tjenester levert fra denne virtuelle ruter vil bli avbrutt. Vennligst bekreft at du \u00f8nsker \u00e5 stoppe denne ruteren. -message.action.stop.systemvm=Vennligst bekreft at du vil stoppe denne system VM. -message.action.take.snapshot=Vennligst bekreft at du vil ta et \u00f8yeblikksbilde av dette volumet. -message.action.unmanage.cluster=Vennligst bekreft at du ikke \u00f8nsker \u00e5 administere klyngen. -message.action.vmsnapshot.delete=Vennligst bekreft at du \u00f8nsker \u00e5 slette dette VM \u00f8yeblikksbildet. -message.action.vmsnapshot.revert=Tilbakestill VM \u00f8yeblikksbilde -message.activate.project=Er du sikker p\u00e5 du \u00f8nsker \u00e5 aktivere dette prosjektet? -message.add.cluster=Legg til en hypervisor-administrert klynge for sone , pod -message.add.cluster.zone=Legg til en hypervisor-administrert klynge for sone -message.add.disk.offering=Vennligst spesifiser f\u00f8lgende parametere for \u00e5 legge til et nytt disktjenestetilbud -message.add.domain=Vennligst bekreft underdomenet du \u00f8nsker \u00e5 opprette under dette domenet -message.added.new.nuage.vsp.controller=La til ny Nuage Vsp-kontroller -message.added.vpc.offering=La til VPC tilbud -message.add.firewall=Legg en brannmur til sonen -message.add.guest.network=Vennligst bekreft at du \u00f8nsker \u00e5 legge til gjestenettverk -message.add.host=Vennligst spesifiser f\u00f8lgende parametere for \u00e5 legge til en ny vert -message.adding.host=Legger til vert -message.adding.Netscaler.device=Legg til NetScaler-enhet -message.adding.Netscaler.provider=Legger til Netscaler tilbyder -message.add.ip.range.direct.network=Legg til en IP-rekke til et direkte-nettverk i sone -message.add.ip.range=Legg til en IP-rekke til offentlige nettverk i sonen -message.add.ip.range.to.pod=

Legg til IP-addresser til pod\:

-message.additional.networks.desc=Vennligst velg tilleggsnettverk som din virtuelle instans vil v\u00e6re tilkoblet. -message.add.load.balancer=Legg til lastbalanserer i sone -message.add.load.balancer.under.ip=Lastbalanseringsregelen har blitt lagt til under IP\: -message.add.network=Legg til nytt nettverk for sone\: -message.add.new.gateway.to.vpc=Vennligst spesifiser f\u00f8lgende p\u00e5krevd informasjon for \u00e5 legge til en ny gateway i dette VPC nettverket. -message.add.pod.during.zone.creation=Hver sone m\u00e5 inneholde en eller flere pods, og vi legger til den f\u00f8rste poden n\u00e5. En pod inneholder verter og prim\u00e6rlagring, som du legger til i et senere steg.F\u00f8rst, konfigurer en rekke med reserverte IP-adresser for CloudStacks interne administrasjonstrafikk. Den reserverte IP-rekken m\u00e5 v\u00e6re unik for hver sone i en sky. -message.add.pod=Legg til ny pod for sone -message.add.primary.storage=Legg til ny prim\u00e6rlagring for sone , pod -message.add.primary=Vennligst spesifiser f\u00f8lgende paramtere for \u00e5 legge til ny hovedlagring. -message.add.region=Vennligst spesifiser f\u00f8lgende p\u00e5krevd informasjon for \u00e5 legge til en ny region. -message.add.secondary.storage=Legg til ny lagring for sone -message.add.service.offering=Vennligst skriv inn f\u00f8lgende data for \u00e5 legge til et nytt datakraftstilbud. -message.add.system.service.offering=Vennligst skriv inn f\u00f8lgende data for \u00e5 legge til et nytt systemtjenestetilbud. -message.add.template=Vennligst skriv inn f\u00f8lgende data for \u00e5 opprette din nye mal -message.add.volume=Vennligst skriv inn f\u00f8lgende data for \u00e5 legge til et nytt volum. -message.add.VPN.gateway=Vennligst bekreft at du \u00f8nsker \u00e5 legge til en VPN Gateway -message.admin.guide.read=For VMware-baserte VMer, vennligst les avsnittet om dynamisk skalering i administrasjonsdokumentasjonen f\u00f8r skalering. \u00d8nsker du \u00e5 fortsette?\\, -message.advanced.mode.desc=Velg denne nettverksmodellen hvis du \u00f8nsker \u00e5 aktivere VLAN-st\u00f8tte. Denne nettverksmodellen gir den st\u00f8rste fleksibiliteten ved \u00e5 tillate administatorer \u00e5 lage egne nettverkstilbud som \u00e5 tilby brannmur, vpn og lastbalanserings-st\u00f8tte s\u00e5 vel som \u00e5 tillate direkte mot virtuelt nettverk. -message.advanced.security.group=Velg dette hvis du \u00f8nsker \u00e5 bruke sikkerhetsgrupper for \u00e5 tilby gjeste-VM isolering. -message.advanced.virtual=Velg dette hvis du \u00f8nsker \u00e5 bruke soneomfattende VLAN for \u00e5 tilby gjeste-VM isolering. -message.after.enable.s3=S3-st\u00f8ttet sekund\u00e6rlagring konfigurert. Merk\: N\u00e5r du forlater denne siden s\u00e5 vil det ikke v\u00e6re mulig \u00e5 konfigurere S3 p\u00e5 nytt. -message.after.enable.swift=Swift konfigurert. Merk\: N\u00e5r du forlater denne siden s\u00e5 vil det ikke v\u00e6re mulig konfigurere Swift p\u00e5 nytt. -message.alert.state.detected=Alarm oppdaget -message.allow.vpn.access=Vennligst skriv inn et brukernavn og passord for brukeren du til gi VPN-tilgang. -message.apply.snapshot.policy=Du har oppdatert den n\u00e5v\u00e6rende \u00f8yeblikksbilde policyen. -message.attach.iso.confirm=Vennligst bekreft at du vil tildele ISOen til denne virtuelle instans. -message.attach.volume=Vennligst fyll inn f\u00f8lgende data for \u00e5 tilknytte et nytt volum. Hvis du tilknytter et diskvolum til en Windows-basert virtuell maskin s\u00e5 er du n\u00f8dt til \u00e5 restarte instansen for \u00e5 se den tilknyttede disken. -message.basic.mode.desc=Velg denne nettverksmodellen hvis du *ikke* vil aktivere VLAN st\u00f8tte. Alle virtuelle instnanser opprettet under denne nettverksmodellen vil bli tildelt en IP direkte fra nettverket og sikkerhetsgrupper blir benyttet for \u00e5 tilby sikkerhet og segregering. -message.change.ipaddress=Vennligst bekreft at du \u00f8nsker \u00e5 endre IP-adressen til dette nettverkskortet p\u00e5 maskinen. -message.change.offering.confirm=Vennligst bekreft at du vil forandre servicetilbudet for denne virtuelle maskinen. -message.change.password=Vennligst endre ditt passord -message.cluster.dedicated=Dedikert Til Klynge -message.cluster.dedication.released=Klynge dedikering frigjort -message.configure.all.traffic.types=Du har flere fysiske nett; vennligst konfigurer etiketter for hver trafikktype ved \u00e5 klikke p\u00e5 Rediger-knappen. -message.configure.firewall.rules.allow.traffic=Konfigurer reglene for \u00e5 tillate trafikk -message.configure.firewall.rules.block.traffic=Konfigurer reglene for \u00e5 blokkere trafikk -message.configure.ldap=Bekreft at du \u00f8nsker \u00e5 konfigurere LDAP. -message.configuring.guest.traffic=Konfigurerer gjestetrafikk -message.configuring.physical.networks=Konfigurer fysisk nettverk -message.configuring.public.traffic=Konfigurerer offentlig trafikk -message.configuring.storage.traffic=Konfigurerer lagringstrafikk -message.confirm.action.force.reconnect=Vennligst bekreft at du \u00f8nsker \u00e5 tvinge et nytt tilkoblingsfors\u00f8k for denne vert. -message.confirm.add.vnmc.provider=Vennligst bekreft at du \u00f8nsker \u00e5 installere denne VNMC tilbyderen. -message.confirm.archive.alert=Vennlgist bekreft at du vil arkivere denne varslingen. -message.confirm.archive.event=Vennligst bekreft at du \u00f8nsker \u00e5 arkivere denne hendelsen. -message.confirm.archive.selected.alerts=Vennligst bekreft at du \u00f8nsker \u00e5 arkivere valgte varsler -message.confirm.archive.selected.events=Vennligst bekreft at du vil arkivere valgte hendelser -message.confirm.attach.disk=Er du sikker p\u00e5 at du vil tildele disk? -message.confirm.create.volume=Er du sikker p\u00e5 at du vil opprette volum? -message.confirm.current.guest.CIDR.unchanged=\u00d8nsker du \u00e5 beholde n\u00e5v\u00e6rende gjestenettverks CIDR uendret? -message.confirm.dedicate.cluster.domain.account=Bekreft at du vil dedikere denne klyngen til et domene / en konto? -message.confirm.dedicate.host.domain.account=\u00d8nsker du virkelig \u00e5 dedikere denne verten til et domene/konto? -message.confirm.dedicate.pod.domain.account=\u00d8nsker du virkelig \u00e5 dedikere denne pod til et domene/konto? -message.confirm.dedicate.zone=\u00d8nsker du virkelig \u00e5 dedikere denne sonen til et domene/konto? -message.confirm.delete.acl.list=Er du sikker p\u00e5 at du \u00f8nsker \u00e5 slette denne ACL listen? -message.confirm.delete.alert=Er du sikker p\u00e5 at du vil slette denne varslingen ? -message.confirm.delete.baremetal.rack.configuration=Vennligst bekreft at du \u00f8nsker \u00e5 slette Bare Metal-konfigurasjonen. -message.confirm.delete.BigSwitchBcf=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne BigSwitch BCF Controlleren? -message.confirm.delete.BrocadeVcs=Vennligst bekreft at du vil slette denne Brocade Vcs svitsjen -message.confirm.delete.ciscoASA1000v=Vennligst bekreft at du vil slette CiscoASA1000v -message.confirm.delete.ciscovnmc.resource=Vennligst bekreft at du vil slette CiscoVNMC -message.confirm.delete.F5=Vennligst bekreft at du \u00f8nsker \u00e5 slette F5 -message.confirm.delete.internal.lb=Vennligst bekreft at du \u00f8nsker \u00e5 slette Intern LB -message.confirm.delete.NetScaler=Vennligst bekreft at du \u00f8nsker \u00e5 slette Netscaler -message.confirm.delete.NuageVsp=Vennligst bekreft at du \u00f8nsker \u00e5 slette Nuage Virtualized Service Directory -message.confirm.delete.PA=Vennligst bekreft at du vil slette Palo Alto -message.confirm.delete.secondary.staging.store=Vennligst bekreft at du vil slette dette sekund\u00e6rmellomlagringsomr\u00e5de. -message.confirm.delete.SRX=Vennligst bekreft at du \u00f8nsker \u00e5 slette SRX -message.confirm.delete.ucs.manager=Vennligst bekreft at du \u00f8nsker \u00e5 slette UCS Manager -message.confirm.destroy.router=Vennligst bekreft at du \u00f8nsker \u00e5 fjerne denne ruteren -message.confirm.disable.host=Vennligst bekreft at du vil detaktivere denne vert -message.confirm.disable.network.offering=Er du sikker p\u00e5 at du vil deaktivere dette nettverkstilbudet? -message.confirm.disable.provider=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne tilbyderen -message.confirm.disable.vnmc.provider=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne VNMC tilbyderen. -message.confirm.disable.vpc.offering=Er du sikker p\u00e5 at du vil deaktivere dette VPC tilbudet? -message.confirm.enable.host=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere verten -message.confirm.enable.network.offering=Vil du aktivere dette nettverkstilbudet? -message.confirm.enable.provider=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne tilbyderen -message.confirm.enable.vnmc.provider=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne VNMC tilbyderen. -message.confirm.enable.vpc.offering=Er du sikker p\u00e5 at du vil aktivere dette VPC nettverkstilbudet? -message.confirm.join.project=Vennligst bekreft at du \u00f8nsker \u00e5 delta i dette prosjektet. -message.confirm.migrate.volume=\u00d8nsker du \u00e5 migrere dette volumet? -message.confirm.refresh.blades=Vennligst bekreft at du vil oppdatere blade status. -message.confirm.release.dedicated.cluster=Vil du aktivere denne dedikerte klyngen? -message.confirm.release.dedicated.host=\u00d8nsker du \u00e5 frigi denne dedikerte verten ? -message.confirm.release.dedicated.pod=\u00d8nsker du \u00e5 frigi denne dedikerte poden ? -message.confirm.release.dedicated.zone=\u00d8nsker du \u00e5 frigi denne dedikerte sonen ? -message.confirm.release.dedicate.vlan.range=Vennligst bekreft at du vil frigi denne dedierte VLAN-rekken -message.confirm.remove.event=Er du sikker p\u00e5 at du vil fjerne denne hendelsen? -message.confirm.remove.IP.range=Vennligst bekreft du til fjerne denne IP-rangen. -message.confirm.remove.load.balancer=Vennligst bekreft at du vil fjerne VM fra lastbalanserer -message.confirm.remove.network.offering=Er du sikker p\u00e5 at du vil fjerne dette nettverkstilbudet? -message.confirm.remove.selected.alerts=Vennligst bekreft at du \u00f8nsker \u00e5 fjerne valgte alarmer -message.confirm.remove.selected.events=Vennligst bekreft at du vil fjerne valgte hendelser -message.confirm.remove.vmware.datacenter=Vennligst bekreft at du vil fjerne dette VMWare data senteret -message.confirm.remove.vpc.offering=Er du sikker p\u00e5 at du vil fjerne dette VPC tilbudet? -message.confirm.replace.acl.new.one=Vil du erstatte ACL med en ny? -message.confirm.scale.up.router.vm=\u00d8nsker du \u00e5 skalere opp denne Ruter-VMen? -message.confirm.scale.up.system.vm=\u00d8nsker du \u00e5 skalere opp denne system VM? -message.confirm.shutdown.provider=Vennligst bekreft at du \u00f8nsker \u00e5 stenge denne tilbyderen -message.confirm.start.lb.vm=Vennligst bekreft at du vil starte LB VM -message.confirm.stop.lb.vm=Vennligst bekreft at du vil stoppe LB VM -message.confirm.upgrade.router.newer.template=Vennligst bekreft at du vil oppgradere ruter til \u00e5 bruke nyere mal -message.confirm.upgrade.routers.account.newtemplate=Vennligst bekreft at du vil oppgradere alle rutere i denne kontoen til \u00e5 bruke en nyere mal -message.confirm.upgrade.routers.cluster.newtemplate=Vennligst bekreft at du vil oppgradere alle rutere i denne klyngen til \u00e5 bruke en nyere mal -message.confirm.upgrade.routers.newtemplate=Vennligst bekreft at du vil oppgradere alle rutere i denne sonen til \u00e5 bruke en nyere mal -message.confirm.upgrade.routers.pod.newtemplate=Vennligst bekreft at du vil oppgradere alle rutere i denne pod til \u00e5 bruke en nyere mal -message.copy.iso.confirm=Vennligst bekreft at du vil kopiere din ISO til -message.copy.template.confirm=\u00d8nsker du \u00e5 kopiere malen? -message.copy.template=Kopier template XXX fra sone til -message.create.template=Er du sikker p\u00e5 at du \u00f8nsker \u00e5 lage malen? -message.create.template.vm=Lage VM fra template -message.create.template.volume=Vennligst spesifiser f\u00f8lgende informasjon f\u00f8r opprettelse av en mal for ditt diskvolum\: . Opprettelse av malen kan ta flere minutter og lenger avhengig av st\u00f8rrelsen p\u00e5 volumet. -message.creating.cluster=Oppretter klynge -message.creating.guest.network=Oppretter gjestenettverk -message.creating.physical.networks=Oppretter fysiske nettverk -message.creating.pod=Oppretter pod -message.creating.primary.storage=Oppretter prim\u00e6rlagring -message.creating.secondary.storage=Oppretter sekund\u00e6rlagring -message.creating.systemVM=Oppretter system-VMer (dette kan ta litt tid) -message.creating.zone=Oppretter sone -message.decline.invitation=Er du sikker p\u00e5 du \u00f8nsker \u00e5 avvise denne prosjektinvitasjonen? -message.dedicated.zone.released=Sone dedikering frigitt -message.dedicate.zone=Dedikerer sone -message.delete.account=Vennligst bekreft at du vil slette denne kontoen. -message.delete.affinity.group=Vennligst bekreft du til fjerne denne affinitetsgruppen. -message.delete.gateway=Vennligst bekreft at du \u00f8nsker \u00e5 slette gateway -message.delete.project=Er du sikker p\u00e5 du \u00f8nsker \u00e5 slette dette prosjektet? -message.delete.user=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne bruker. -message.delete.VPN.connection=Vennligst bekreft at du \u00f8nsker \u00e5 slette VPN-tilkobling -message.delete.VPN.customer.gateway=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne VPN gatewayen -message.delete.VPN.gateway=Vennligst bekreft at du \u00f8nsker \u00e5 slette denne VPN gatewayen -message.desc.add.new.lb.sticky.rule=Legg til ny LB sticky regel -message.desc.advanced.zone=For mer avanserte nettverks topologier. Denne nettverks modellen gir flest egenskaper rundt definisjon av gjestenettverk og gir alternativer for tilpassede netverkstilbud, slik for brannmurer, VPN og lastbalanserere. -message.desc.basic.zone=Gir et enkelt nettverk hvor alle virtuelle instanser blir tildelt en IP-adresse direkte fra nettverket. Isolering av gjester kan tilbys p\u00e5 lag-3 ved hjelp av sikkerhetsgrupper (IP-adresse kilde-filtrering). -message.desc.cluster=Hver pod m\u00e5 inneholde en eller flere pods, og vi vil installere den f\u00f8rste klyngen n\u00e5. En klynge har til form\u00e5l \u00e5 samle en gruppe hypervisor verter. All vertene i en klynge m\u00e5 ha identisk marskinvare, kj\u00f8re samme hypervisor, v\u00e6re p\u00e5 samme nettverk, og ha tilgang til den samme prim\u00e6rlagringsenheten. Hver klynge best\u00e5r av en eller flere verter og en eller flere prim\u00e6rlagrings verter. -message.desc.created.ssh.key.pair=Laget et SSH-n\u00f8kkelpar. -message.desc.create.ssh.key.pair=Vennligst fyll inn f\u00f8lgende data for \u00e5 opprette eller registrere et ssh-n\u00f8kkelpar.

(1) Hvis offentlig n\u00f8kkel er valgt s\u00e5 vil CloudStack registrere den offentlige n\u00f8kkelen. Du kan bruke den igjennom din private n\u00f8kkel.

(2) Hvis offentlig n\u00f8kkel ikke er valgt s\u00e5 vil CloudStack opprette et SSH-n\u00f8kkelpar. I dette tilfellet, vennligst kopier og ta v\u00e6re p\u00e5 den private n\u00f8kkelen. CloudStack vil ikke ta vare p\u00e5 den.
-message.desc.host=Hver klynge m\u00e5 inneholde minst en vert (datamaskin) for gjester \u00e5 kj\u00f8re p\u00e5, og vi legger til den f\u00f8rste n\u00e5. For at en vert skal fungere i CloudStack m\u00e5 du installere hypervisor-programvare p\u00e5 den, tildele en IP-adresse og s\u00f8rge for at den er tilkoblet CloudStacks administrasjonsserver.

Oppgi vertens DNS- eller IP-adresse, brukernavnet (vanligvis root) og passord, og eventuelle etiketter du \u00f8nsker \u00e5 kategorisere den med. -message.desc.primary.storage=Hver klynge m\u00e5 inneholde en eller flere prim\u00e6rlagringer, og vi skal legge til den f\u00f8rste n\u00e5. Prim\u00e6rlagring inneholder diskvolumer for alle maskiner som kj\u00f8rer p\u00e5 verter i klyngen. Bruk hvilken som helst standard-protokoll den underliggende hypervisoren st\u00f8tter. -message.desc.reset.ssh.key.pair=Vennligst spesifiser et ssh n\u00f8kkelpar som du vil legge til denne VM. Vennligst merk at root passordet vil bli endret av denne operasjonen hvis passord er aktivert. -message.desc.secondary.storage=Hver sone m\u00e5 ha minst en NFS eller sekund\u00e6rlagringsserver og vi vil legge til den f\u00f8rste n\u00e5. Sekund\u00e6rlingsserveren lagrer VM-maler, ISO-bilder og VM-disk \u00f8yeblikksbilder. Denne serveren m\u00e5 v\u00e6re tilgjengelig for alle verter i denne sonen.

Oppgi IP-adresseng og eksportert sti. -message.desc.zone=En sone er den st\u00f8rste gruppe enheten i en CloudStack installasjon. En sone er typisk sett p\u00e5 som et datasenter, og gir bedre p\u00e5litelighet gjennom isolasjon og redundans. En sone best\u00e5r av en eller flere pods (hver pod inneholder hypervisor verter og prim\u00e6rlagringsenheter) og en sekund\u00e6rlagringsenhet som er delt mellom alle pods i sonen. -message.detach.disk=Er du sikker p\u00e5 at du \u00f8nsker \u00e5 frakoble denne disken? -message.detach.iso.confirm=Vennligst bekreft at du \u00f8nsker \u00e5 frakoble ISOen fra denne virtuelle instansen. -message.disable.account=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne kontoen. Ved \u00e5 deaktivere kontoen s\u00e5 vil alle brukere av denne kontoen ikke lenger ha tilgang til sine skyressurser. Alle virtuelle maskiner vil bli skrudd av umiddelbart. -message.disable.snapshot.policy=Du har deaktivert den n\u00e5v\u00e6rende \u00f8yeblikksbilde policyen. -message.disable.user=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere denne bruker. -message.disable.vpn.access=Vennligst bekreft at du \u00f8nsker \u00e5 deaktivere VPN-tilgang. -message.disable.vpn=Er du sikker p\u00e5 at du vil deaktivere VPN? -message.disabling.network.offering=Deaktiverer nettverkstilbud -message.disabling.vpc.offering=Deaktiverer VPC tilbud -message.disallowed.characters=Ikke tillatte tegn\: \\<\\,\\> -message.download.ISO=Vennligst klikk 00000 for \u00e5 laste ned ISO -message.download.template=Vennligst klikk 00000 for \u00e5 laste ned mal -message.download.volume.confirm=Vennligst bekreft at du \u00f8nsker \u00e5 laste ned dette volumet. -message.download.volume=Vennligst klikk 00000 for \u00e5 laste ned volumet -message.edit.account=Oppdater ("-1" indikerer at det ikke er satt \u00f8vre grense for resursbruk) -message.edit.confirm=Vennligst bekreft dine endringer f\u00f8r du klikker "Lagre". -message.edit.limits=Oppdater \u00f8vre grense for resursbruk. "-1" indikerer at det ikke er satt \u00f8vre grense. -message.edit.traffic.type=Vennligst oppgi trafikk-etiketten du \u00f8nsker knyttet til denne trafikktypen. -message.enable.account=Bekreft at du \u00f8nsker \u00e5 aktivere denne kontoen. -message.enabled.vpn=Din fjerntilkoblings-VPN er aktivert og kan n\u00e5s via IPen -message.enabled.vpn.ip.sec=Din IPSec delte n\u00f8kkel (psk) er -message.enable.user=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere denne bruker. -message.enable.vpn.access=VPN er deaktivert for denne IP-adressen. \u00d8nsker du \u00e5 aktivere VPN-tilgang? -message.enable.vpn=Vennligst bekreft at du \u00f8nsker \u00e5 aktivere VPN-tilgang for denne IP-adressen -message.enabling.network.offering=Aktiver nettverkstilbud -message.enabling.security.group.provider=Aktiverer sikkerhetsgruppetilbyder -message.enabling.vpc.offering=Aktiverer VPC tilbud -message.enabling.zone=Aktiverer sonen -message.enabling.zone.dots=Aktiverer sone... -message.enter.seperated.list.multiple.cidrs=Skriv inn en kommaseparert liste over CIDRs hvis du har mer enn en -message.enter.token=Vennligst skriv inn koden du fikk i invitasjonsmailen. -message.generate.keys=Vennligst bekreft at du \u00f8nsker \u00e5 generere nye n\u00f8kler for denne bruker. -message.gslb.delete.confirm=Vennligst bekreft at du vil slette denne GSLB -message.gslb.lb.remove.confirm=Vennligst bekreft at du vil slette lastbalansering fra GSLB -message.guest.traffic.in.advanced.zone=Gjestetrafikk er kommunikasjon mellom sluttbrukers virtuelle maskiner. Spesifiser en rekke med VLAN-ider som kan inneholde gjestetrafikk for hvert fysiske nettverk. -message.guest.traffic.in.basic.zone=Gjestetrafikk er kommunikasjon mellom sluttbrukers virtuelle gjester. Spesifiser en rekke med IP-adresser som CloudStack kan tildele virtuelle gjester. S\u00f8rg for at denne rekken ikke overlapper IP-rekken(e) som er reservert systemmaskiner. -message.host.dedicated=Dedikert Vert -message.host.dedication.released=Vert dedikering frigitt -message.installWizard.click.retry=Klikk p\u00e5 knappen for \u00e5 pr\u00f8ve oppstart p\u00e5 nytt. -message.installWizard.copy.whatIsACluster=En klynge har til form\u00e5l \u00e5 samle en gruppe hypervisor verter. All vertene i en klynge m\u00e5 ha identisk marskinvare, kj\u00f8re samme hypervisor, v\u00e6re p\u00e5 samme subnett, og ha tilgang til den samme prim\u00e6rlagringsenheten. Kj\u00f8rende virtuelle maskiner (VM) kan migreres fra en vert i klyngen til en annen uten avbrudd for brukeren. En klynge er den tredje st\u00f8rste enheten i CloudStack. En pod inneholder en eller flere klynger, og en sone inneholder en eller flere pods.

CloudStack can inneholde en eller flere klynger, men for en basic installasjon trengs bare en. -message.installWizard.copy.whatIsAHost=En vert er en enkelt datamaskin. Verter tilbyr ressurser som kan gj\u00f8re virtuelle gjester. Hver vert har hypervisor-programvare installert for \u00e5 administrere gjestene (bortsett fra r\u00e5jern-verter, som er et spesialtilfelle diskutert i den avanserte installasjonsguiden). For eksempel, en Linux KVM-aktivert server, en Citrix XenServer server og en ESXi server er verter. I en enkel installasjon bruker vi en enkelt vert som kj\u00f8rer XenServer eller KVM.

Verten er den minste organisasjonsenheten i en CloudStack-installasjon. Verter er del av klynger, klynger er del av poder og poder er del av soner. -message.installWizard.copy.whatIsAPod=En pod representerer ofte et enkelt rack. Verter i samme pod er i samme subnett.

En pod er den nest st\u00f8rste enheten i en CloudStack-installasjon. Poder er en del av soner. Hver sone kan inneholde en eller flere poder; i en enkel installasjon vil du kun ha en pod i sonen. -message.installWizard.copy.whatIsAZone=En sone er den st\u00f8rste gruppe enheten i en CloudStack installasjon. En sone er typisk sett p\u00e5 som et datasenter, selv om man kan ha flere datasenter i en sone. CloudStack infrastrukturen kan deles inn i soner for \u00e5 isolere og \u00e5 gi redundans. Hver sone kan for eksempel ha sin egen data senter str\u00f8mtilf\u00f8rsel og nettverkslink, og soner kan v\u00e6re spredd over st\u00f8rre distanser. -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482 er en programvare-plattform som grupperer dataressurser for \u00e5 bygge offentlige, private og hybride infrastruktur som en tjeneste (IaaS) skyer. CloudStack&\#8482 administrerer nettverk, lagring og regnekraft-verter som til sammen blir en sky-infrastruktur. Bruk CloudStack&\#8482 til \u00e5 distribuere, administrerre og konfigurere dine skyressurser og milj\u00f8er.

Utvid forbi individuelle virtuelle gjester som kj\u00f8rer p\u00e5 typisk maskinvare, CloudStack&\#8482 gir en skybasert infrastruktur-programvare for levering av virtuelle datasentre som en tjeneste - lever alle de essensielle komponenente for \u00e5 bygge, distribuere og administrere multi-tier og multi-tenant sky-applikasjoner. B\u00e5de fri kildekode- og premium-versjoner er tilgjengelig, hvor den fri kildekode-basert gir tiln\u00e6rmet samme funksjonalitet. -message.installWizard.copy.whatIsPrimaryStorage=En CloudStack&\#8482 sky-infrastruktur tar i bruk to typer lagring\: prim\u00e6rlagring og sekund\u00e6rlagring.

Prim\u00e6rlagring er assosiert med en klynge, og lagrer datadisker for hver gjest som kj\u00f8rer i den klyngen. Prim\u00e6rlagring er typisk plassert n\u00e6rt den faktiske verten. -message.installWizard.copy.whatIsSecondaryStorage=Sekund\u00e6rlagring er assosiert med en sone, og lagrer f\u00f8lgende\:
  • Maler - OS-bilder som kan brukes til \u00e5 starte opp virtuelle gjester og kan inkludere ekstra konfigurasjon, som installerte applikasjoner
  • ISO-bilder - Bilder som kan v\u00e6re bootbare eller ikke-bootbare.
  • Diskvolum \u00f8yeblikksbilder - Lagrede kopier av virtuelle gjester som kan benyttes til rekonstruksjon eller for \u00e5 lage nye maler
-message.installWizard.now.building=Bygger n\u00e5 din nettsky... -message.installWizard.tooltip.addCluster.name=Klyngenavnet. Dette kan v\u00e6re hva som helst og er ikke benyttet av CloudStack. -message.installWizard.tooltip.addHost.hostname=DNS-navnet eller IP-adressen til verten. -message.installWizard.tooltip.addHost.password=Dette er passordet for brukeren gjengitt ovenfor (fra din XenServer-installasjon). -message.installWizard.tooltip.addHost.username=Vanligvis root. -message.installWizard.tooltip.addPod.name=Et navn for poden -message.installWizard.tooltip.addPod.reservedSystemEndIp=Dette er IP-rekken i det private nettverket som CloudStack bruker for \u00e5 administrere Sekund\u00e6rlagrins-servere og Konsollproxy-servere. Disse IP-adressene tas fra samme subnett som regnekraft-serverne. -message.installWizard.tooltip.addPod.reservedSystemGateway=Gatewayen til vertene i poden. -message.installWizard.tooltip.addPod.reservedSystemNetmask=Nettmasken benyttet p\u00e5 subnettet gjestene vil bruke. -message.installWizard.tooltip.addPod.reservedSystemStartIp=Dette er IP-rekken i det private nettverket som CloudStack bruker for \u00e5 administrere Sekund\u00e6rlagrins-servere og Konsollproxy-servere. Disse IP-adressene tas fra samme subnett som regnekraft-serverne. -message.installWizard.tooltip.addPrimaryStorage.name=Navnet p\u00e5 lagringsenheten. -message.installWizard.tooltip.addPrimaryStorage.path=(for NFS) I NFS er dette den eksporterte filbanen fra serveren. Banen (for SharedMountPoint). Med KVM er dette banen p\u00e5 hver vert hvor denne prim\u00e6re lagringen er tilkoblet. For eksempel\: "mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(for NFS, iSCSI eller PreSetup) IP-adressen eller DNS-navnet til lagringsenheten. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=IP-adressen til NFS-serveren som inneholder sekund\u00e6r lagring -message.installWizard.tooltip.addSecondaryStorage.path=Den eksporterte filbanen, fra serveren du spesifiserte ovenfor -message.installWizard.tooltip.addZone.dns1=Dette er DNS-serveren som benyttes av gjeste-VMer i sonen. Disse DNS-serverene vil bli aksessert via det offentlige nettverket du vil legge til senere. De offentlige IP-adressene for en sone m\u00e5 ha en rute til DNS-serveren navngitt her. -message.installWizard.tooltip.addZone.dns2=Dette er DNS-serveren som benyttes av gjeste-VMer i sonen. Disse DNS-serverene vil bli aksessert via det offentlige nettverket du vil legge til senere. De offentlige IP-adressene for en sone m\u00e5 ha en rute til DNS-serveren navngitt her. -message.installWizard.tooltip.addZone.internaldns1=Dette er DNS-servere som benyttes av systemmaskiner i sonen. Disse DNS-serverne vil bli aksessert via det private nettverksgrensesnittet til systemmaskinene. De private IP-adressene du oppgir for podene m\u00e5 ha en rute til DNS-serverne nevnt her. -message.installWizard.tooltip.addZone.internaldns2=Dette er DNS-servere som benyttes av systemmaskiner i sonen. Disse DNS-serverne vil bli aksessert via det private nettverksgrensesnittet til systemmaskinene. De private IP-adressene du oppgir for podene m\u00e5 ha en rute til DNS-serverne nevnt her. -message.installWizard.tooltip.addZone.name=Et navn for sonen -message.installWizard.tooltip.configureGuestTraffic.description=En beskrivelse av nettverket -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=Rekken av IP-adresser som vil v\u00e6re tilgjengelig for allokering til gjester i denne sonen. Hvis ett grensesnitt er brukt, b\u00f8r disse IPene v\u00e6re i samme CIDR som podens CIDR. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=Gatewayen gjestene skal bruke -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=Nettmasken benyttet p\u00e5 subnettet gjestene skal bruke -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=Rekken av IP-adresser som vil v\u00e6re tilgjengelig for allokering til gjester i denne sonen. Hvis ett grensesnitt er brukt, b\u00f8r disse IPene v\u00e6re i samme CIDR som podens CIDR. -message.installWizard.tooltip.configureGuestTraffic.name=Et navn for nettverket -message.instance.scaled.up.confirm=\u00d8nsker du \u00e5 skalere opp denne instancen? -message.instanceWizard.noTemplates=Du har ingen maler tilgjengelig. Vennligst legg til en kompatibel mal og kj\u00f8r instansveiviseren. -message.ip.address.changed=Din IP-adresse kan ha endret seg. \u00d8nsker du \u00e5 oppdatere visningen? Merk at detaljvisningen vil i s\u00e5fall lukkes. -message.iso.desc=Diskimage som inneholder data etter oppstartsbar media for OS -message.join.project=Du har n\u00e5 deltatt i et prosjekt. Vennligst bytt til prosjektvisning for \u00e5 se prosjektet. -message.launch.vm.on.private.network=\u00d8nsker du \u00e5 starte instancen din p\u00e5 ditt dedikerte nettverk? -message.launch.zone=Sonen er klar for aktivering; vennligst fortsett til neste steg. -message.ldap.group.import=Alle brukere fra nevnte gruppe vil bli importert -message.link.domain.to.ldap=Aktiver automatisk synkronisering for dette domenet i LDAP -message.listView.subselect.multi=(Ctrl/Cmd-klikk) -message.lock.account=Vennligst bekreft at du \u00f8nsker \u00e5 l\u00e5se denne kontoen. Ved \u00e5 l\u00e5se kontoen s\u00e5 vil ingen brukere av denne kontoen kunne administere sine skyressurser. Eksisterende ressurser kan fortsatt bli aksessert. -message.migrate.instance.confirm=Vennligst bekreft verten du \u00f8nsker \u00e5 migrere den virtuelle instansen til. -message.migrate.instance.to.host=Vennligst bekreft at du \u00f8nsker \u00e5 migrere instansen til en annen vert. -message.migrate.instance.to.ps=Vennligst bekreft at du \u00f8nsker \u00e5 migrere instansen til en annen prim\u00e6rlagring. -message.migrate.router.confirm=Vennligst bekreft verten du \u00f8nsker \u00e5 migrere ruteren til\: -message.migrate.systemvm.confirm=Vennligst bekreft verten du \u00f8nsker \u00e5 migrere system VM til\: -message.migrate.volume=Vennligst bekreft at du \u00f8nsker \u00e5 migrere volumet til en annen prim\u00e6rlagring. -message.network.addVM.desc=Vennligst spesifiser nettverket du vil legge til denne VMen. Et nytt NIC vil bli lagt til for dette nettverket. -message.network.addVMNIC=Vennligst bekreft at du vil legge til ett nytt NIC for dette nettverket. -message.network.remote.access.vpn.configuration=VPN fjerntilgangskonfigurasjon har blitt generert, men aktivering feilet. Vennligst sjekk tilkoblingen til nettverkselementet og fors\u00f8k p\u00e5 nytt. -message.new.user=Spesifiser f\u00f8lgende informasjon for \u00e5 legge til en ny bruker til denne kontoen -message.no.affinity.groups=Du har ingen affinitetsgrupper. Fortsett til neste steg. -message.no.host.available=Ingen hoster tilgjengelig for migrering -message.no.network.support.configuration.not.true=Du har ingen soner med sikkerhetsgrupper aktivert. Derfor ingen ekstra nettverksfunksjoner. Fortsett til steg 5. -message.no.network.support=Din valgte hypervisor, vSphere, har ikke flere nettverks evner. Forsett til punkt 5. -message.no.projects.adminOnly=Du har ingen prosjekter.
Vennligst be din administrator om \u00e5 opprette et nytt prosjekt. -message.no.projects=Du har ingen prosjekter.
Vennligst opprett et nytt fra prosjektseksjonen. -message.number.clusters=

\# av Klynger

-message.number.hosts=

\# av Verter

-message.number.pods=

\# av Pods

-message.number.storage=

\# av Prim\u00e6rlagringsvolumer

-message.number.zones=

\# av Soner

-message.password.has.been.reset.to=Passordet har blitt endret til -message.password.of.the.vm.has.been.reset.to=Passorde for VM har blitt endre til -message.pending.projects.1=Du har f\u00f8lgende prosjektinvitasjoner\: -message.pending.projects.2=For \u00e5 se, vennligst g\u00e5 til prosjektseksjonen og velg invitasjoner fra nedtrekksmenyen. -message.please.add.at.lease.one.traffic.range=Vennligst legg til minst \u00e9tt trafikkniv\u00e5 -message.please.confirm.remove.ssh.key.pair=Vennligst bekreft at du vil fjerne dette SSH-n\u00f8kkelpar -message.please.proceed=Vennligst fortsett til neste steg -message.please.select.a.configuration.for.your.zone=Vennligst velg en konfigurasjon for din sone -message.please.select.a.different.public.and.management.network.before.removing=Vennligst velg et annet offentlig- og administrasjonsnettverk f\u00f8r du fjerner -message.please.select.networks=Vennligst velg nettverk for din VM -message.please.select.ssh.key.pair.use.with.this.vm=Vennligst velg et ssh n\u00f8kkelpar som du vil at denne VM skal benytte\: -message.please.wait.while.zone.is.being.created=Vennlist vent mens din sone opprettes. Dette kan ta noe tid... -message.pod.dedication.released=Pod dedikering frigitt -message.portable.ip.delete.confirm=Vennligst bekreft at du vil slette denne portable IP-rekken -message.project.invite.sent=Invitasjon sendt til bruker. De vil bli lagt til prosjektet s\u00e5 snart de har akseptert invitasjonen -message.public.traffic.in.advanced.zone=Offentlig trafikk blir generert av verter i skyen som aksesserer internett. Offentlige IP-adresser m\u00e5 allokerers for dette form\u00e5et. Sluttbrukere kan bruke CloudStack brukergrensesnittet til \u00e5 foresp\u00f8rre om disse IP-adressene til \u00e5 implentere NAT mellom deres gjestenettverk og det offentlige nettverket.

Oppgi minst en rekke med IP-adresser for internettrafikk. -message.public.traffic.in.basic.zone=Offentlig trafikk blir generert n\u00e5r virtuelle gjester i skyen aksesserer internett eller kan tilby tjenester til klienter over internett. Offentlig tilgjengelige IP-adresser m\u00e5 allokerers for dette form\u00e5let. N\u00e5r en instans opprettes vil en IP fra dette settet med Offentlige IP-adresser bli tildelt i tillegg til en gjeste-IP-adresse. Statisk 1-1 NAT vil ogs\u00e5 bli satt opp automatisk mellom the offentlige og den private IP-adressen. Sluttbrukere kan ogs\u00e5 bruke CloudStack brukergrensesnittet til \u00e5 tilegne ekstra IP-adresser for \u00e5 implementere statisk NAT mellom deres instans og den offentlige IP-adressen. -message.question.are.you.sure.you.want.to.add=Er du sikker p\u00e5 at du vil legge til -message.read.admin.guide.scaling.up=Vennligst les avsnittet om dynamisk skalering i administrasjondokumentasjonen f\u00f8r du oppskalerer. -message.recover.vm=Vennligst bekreft at du \u00f8nsker \u00e5 gjenopprette denne VMen. -message.redirecting.region=Omdirigerer til region... -message.reinstall.vm=Advarsel\: Fortsett med forsiktighet. Dette vil reinstallere VMen fra malen; data p\u00e5 rot-disken vil forsvinne. Ekstra datavolumer; hvis noen, vil ikke bli r\u00f8rt. -message.removed.ssh.key.pair=Fjernet et SSH-n\u00f8kkelpar -message.remove.ldap=Er du sikker p\u00e5 at du vil slette LDAP-konfigurasjonen? -message.remove.region=Er du sikker p\u00e5 at du vil fjerne denne regionen fra denne administrasjonsserveren? -message.remove.vpc=Vennligst bekreft at du \u00f8nsker \u00e5 fjerne VPC -message.remove.vpn.access=Vennligst bekreft at du \u00f8nsker \u00e5 fjerne VPN-tilgang fra f\u00f8lgende bruker. -message.reset.password.warning.notPasswordEnabled=Denne malen vil bli opprettet uten passord -message.reset.password.warning.notStopped=Din instans m\u00e5 stoppes f\u00f8r man fors\u00f8ker \u00e5 bytte n\u00e5v\u00e6rende passord -message.reset.VPN.connection=Vennligst bekreft at du \u00f8nsker \u00e5 resette VPN-tilkobling -message.restart.mgmt.server=Vennlist restart administrajonsserveren(e) din(e) for at de nye innstillingene skal tr\u00e5 i kraft. -message.restart.mgmt.usage.server=Vennligst restart administrasjonsserveren(e) din(e) og bruksserver(e) for at de nye innstillingene skal tr\u00e5 i kraft. -message.restart.network=Alle tjenester fra dette nettverket vil bli avbrutt. Vennligst bekreft at du \u00f8nsker \u00e5 restarte dette nettverket. -message.restart.vpc.remark=Vennligst bekreft du at du vil restarte VPC

Merk\: \u00c5 gj\u00f8re en ikke reduntant VPC redundant vil tvinge en opprydning. Nettverkene vil ikke v\u00e6re tilgjengelig i noen minutter.

-message.restart.vpc=Vennligst bekreft at du \u00f8nsker \u00e5 restarte VPC -message.restoreVM=Vil du gjenopprette denne VMen? -message.security.group.usage=(Bruk Ctrl-klikk for \u00e5 velge alle aktuelle sikkerhetsgrupper) -message.select.affinity.groups=Vennligst velg en affinitetsgruppe denne VMen skal tilh\u00f8re\: -message.select.a.zone=En sone er typisk sett p\u00e5 som et datasenter. Multiple soner gir CloudStack bedre p\u00e5litelighet gjennom isolasjon og redundans. -message.select.instance=Vennligst velg en instans. -message.select.iso=Vennligst velg en ISO for din nye virtuelle instans. -message.select.item=Vennligst velg et element -message.select.security.groups=Vennligst velg sikkerhetsgruppe(r) for din nye VM -message.select.template=Vennligst velg en mal for din nye virtuelle instans. -message.select.tier=Vennligst velg en VPC-gren -message.set.default.NIC.manual=Vennligst oppdater standard-NIC manuelt p\u00e5 VMen n\u00e5. -message.set.default.NIC=Vennligst bekreft at du vil gj\u00f8re dette NIC til standard for denne VM. -message.setup.physical.network.during.zone.creation.basic=N\u00e5r du legger til en enkel sone s\u00e5 kan du sette opp ett fysisk nettverk som korrensponderer til et NIC p\u00e5 hypervisor. Nettverket transporterer flere typer trafikk.

Du kan ogs\u00e5 drag og slippe andre trafikktyper over til det fysiske nettverket. -message.setup.physical.network.during.zone.creation=N\u00e5r du legger til en avansert sone, m\u00e5 du konfigurere en eller flere fysiske nettverk. Hvert nettverk representerer et NIC p\u00e5 verten. Hvert fysiske nettverk kan inneholde en eller flere typer trafikk, med noen restriksjoner for hvordan de kan kombineres.

Dra og slipp en eller flere nettverkstyper til hvert fysiske nettverk. -message.setup.successful=Oppsettet av nettskyen er vellykket\! -message.snapshot.schedule=Du kan sette opp gjentakende \u00f8yeblikksbilder ved \u00e5 velge fra tilgjengelige opsjoner nedenfor og aktivere dine preferanser. -message.specifiy.tag.key.value=Vennligst bekreft tag n\u00f8kkel og verdi -message.specify.url=Vennligst spesifiser URL -message.step.1.continue=Vennligst velg en mal eller ISO for \u00e5 fortsette. -message.step.1.desc=Vennligst velg en mal for din nye virtuelle instans. Du kan ogs\u00e5 velge en blank mal som du kan installere fra en ISO p\u00e5. -message.step.2.continue=Velg et resurstilbud for \u00e5 fortsette -message.step.3.continue=Vennligst velg et disktilbud for \u00e5 fortsette -message.step.4.continue=Vennligst velg minst ett nettverk for \u00e5 fortsette -message.step.4.desc=Vennligst velg prim\u00e6rnettverket som din virtuelle instans vil bli tilkoblet til. -message.storage.traffic=Trafikk mellom CloudStacks interne ressurser, inkludert alle komponenter som kommuniserer med administrassjonsserver, som verter og CloudStack systemmaskiner. Vennligst konfigurer lagringstrafikk her. -message.suspend.project=Er du sikker du \u00f8nsker \u00e5 pause dette prosjektet? -message.systems.vms.ready=System-VMer klare. -message.template.copying=Malen blir kopiert. -message.template.desc=OS-image som kan brukes til \u00e5 starte VMer -message.tier.required=VPC-gren er p\u00e5krevd. -message.tooltip.dns.1=Oppgi en DNS server for bruk av VMer i denne sonen. De offentlige IP-adressene for denne sonen m\u00e5 ha en rute til denne serveren. -message.tooltip.dns.2=En sekund\u00e6r DNS server for bruk av VMer i denne sonen. De offentlige IP-adressene for denne sonen m\u00e5 ha en rute til denne serveren. -message.tooltip.internal.dns.1=Navn p\u00e5 en DNS-server for bruk av CloudStack interne systemVMer i sonen. Den private IP-adressen i podden m\u00e5 ha en rute til serveren. -message.tooltip.internal.dns.2=Navn p\u00e5 en DNS-server for bruk av CloudStack interne systemVMer i sonen. Den private IP-adressen i podden m\u00e5 ha en rute til serveren. -message.tooltip.network.domain=Et DNS suffiks som vil opprette et tilpasset domenenavn for nettverket som aksesseres av gjeste VMer. -message.tooltip.pod.name=Et navn for denne pod. -message.tooltip.reserved.system.gateway=Gatewayen til vertene i poden. -message.tooltip.reserved.system.netmask=Nettverksprefiks som definerer podens subnett. Bruker CIDR-notasjon. -message.tooltip.zone.name=Et navn for denne sonen. -message.update.os.preference=Vennligst velg preferert OS for denne verten. Alle virtuelle instanser med lignende OS vil f\u00f8rst bli allokert til denne verten f\u00f8r andre velges. -message.update.resource.count=Vennligst bekreft at du \u00f8nsker \u00e5 oppdatere ressurstellere for denne kontoen. -message.update.ssl.failed=Oppdatering av SSL-sertifikat feilet. -message.update.ssl.succeeded=Oppdatering av SSL-sertifikat vellykket -message.update.ssl=Vennligst send inn en ny X.509 kompatibel SSL-sertifikatkjede for \u00e5 oppdatere hver konsollproxy og virtuell instans for sekund\u00e6rlagring\: -message.validate.accept=Vennligst skriv inn en verdi med et gyldig prefiks. -message.validate.creditcard=Vennligst oppgi et gyldig kredittkortnummer. -message.validate.date.ISO=Vennligst skriv inn en gyldig dato (ISO). -message.validate.date=Vennligst skriv inn en gyldig dato. -message.validate.digits=Vennligst skriv inn kun tall. -message.validate.email.address=Vennligst skriv inn en gyldig e-postadresse. -message.validate.equalto=Vennligst skriv inn den samme verdien igjen. -message.validate.fieldrequired=Dette feltet er p\u00e5krevd. -message.validate.fixfield=Vennligst fiks dette feltet. -message.validate.instance.name=Instansnavn kan ikke v\u00e6re lenger enn 63 tegn. Kun ACSCII bokstaver a~z, A~Z, tall 0~9, bindestrek er tillatt. M\u00e5 starte med en bokstav og slutte med en bokstav eller et tall. -message.validate.invalid.characters=Ugyldige tegn funnet; vennligst korriger. -message.validate.maxlength=Vennligst ikke skriv inn mer enn {0} tegn. -message.validate.max=Skriv en verdi mindre enn eller lik {0}. -message.validate.minlength=Vennligst skriv inn minst {0} tegn. -message.validate.number=Vennligst skriv inn et gyldig nummer. -message.validate.range.length=Vennligst skriv inn en verdi som er mellom {0} og {1} tegn langt. -message.validate.range=Skriv en verdi mellom {0} og {1}. -message.validate.URL=Vennligst skriv inn en gyldig URL. -message.virtual.network.desc=Et dedikert virtualisert nettverk for din konto. Kringkastingsdomenet er isolert inne i et VLAN og offentlig nettverkstrafikk er rutet ut av en virtuell ruter. -message.vm.create.template.confirm=Oppretting av Mal vil restarte VM automatisk. -message.vm.review.launch=Vennligst vurder f\u00f8lgende informasjon og bekreft at din virtuelle instans er korrekt f\u00f8r kj\u00f8ring -message.vnmc.available.list=VNMC er ikke tilgjengelig fra tilbyder listen. -message.vnmc.not.available.list=VNMC er ikke tilgjengelig fra tilbyder listen. -message.volume.create.template.confirm=Vennligst bekreft at du \u00f8nsker \u00e5 lage en mal for dette diskvolumet. Opprettelse av male kan ta opptil flere minutter eller lenger, avhengig av st\u00f8rrelsen p\u00e5 volumet. -message.waiting.for.builtin.templates.to.load=Venter p\u00e5 at innebygde maler skal lastes... -message.XSTools61plus.update.failed=Feilet \u00e5 oppdatere original XS versjon er 6.1\\+ feltet. Feil\: -message.you.must.have.at.least.one.physical.network=Du trenger minst ett fysisk nettverk -message.your.cloudstack.is.ready=Din CloudStack er klar\! -message.Zone.creation.complete=Opprettelsen av sonen utf\u00f8rt -message.zone.creation.complete.would.you.like.to.enable.this.zone=Soneopprettelse fullf\u00f8rt. \u00d8nsker du \u00e5 aktivere denne sonen? -message.zone.no.network.selection=Sonen du har valgt har ingen mulighet for valg av nettverk. -message.zone.step.1.desc=Vennligst en nettverksmodell for din sone. -message.zone.step.2.desc=Vennligst skriv inn f\u00f8lgende informasjon for \u00e5 legge til en ny sone -message.zone.step.3.desc=Vennligst skriv inn f\u00f8lgende informasjon for \u00e5 legge til en ny pod -message.zoneWizard.enable.local.storage=ADVARSEL\: Hvis du aktiverer lokal lagring for denne sonen m\u00e5 du gj\u00f8re f\u00f8lgende, avhengig av hvor du \u00f8nsker at systemmaskiner skal starte\:

1. Hvis systemmaskiner trenger \u00e5 starte fra delt lagring, m\u00e5 det legges til delt lagring etter at sonen er opprettet. Sonen m\u00e5 ogs\u00e5 startes som deaktivert.

2. Hvis systemmaskiner trenger \u00e5 starte fra lokal lagring, m\u00e5 system.vm.use.local.storage settes til true f\u00f8r du aktiverer sonen.


Vil du fortsette? -messgae.validate.min=Skriv en verdig st\u00f8rre enn eller lik {0}. -mode=Modus -network.rate=Nettverksrate -notification.reboot.instance=Omstart av instans -notification.start.instance=Start instans -notification.stop.instance=Stopp instans -side.by.side=Side ved side -state.Accepted=Akseptert -state.Active=Aktiv -state.Allocated=Allokert -state.Allocating=Allokerer -state.BackedUp=Sikkerhetskopiert -state.BackingUp=Sikkerhetskopierer -state.Completed=Utf\u00f8rt -state.Creating=Oppretter -state.Declined=Avvist -state.Destroyed=Destruert -state.detached=Frakoblet -state.Disabled=Inaktiv -state.Enabled=Aktivert -state.Error=Feil -state.Expunging=Fjerner -state.Migrating=Migrering -state.Pending=Venter -state.Ready=Klar -state.Running=Kj\u00f8rer -state.Starting=Starter -state.Stopped=Stoppet -state.Stopping=Stopper -state.Suspended=Pauset -title.upload.volume=Last opp volum -ui.listView.filters.all=Alle -ui.listView.filters.mine=Mine diff --git a/client/WEB-INF/classes/resources/messages_nl_NL.properties b/client/WEB-INF/classes/resources/messages_nl_NL.properties deleted file mode 100644 index b691eaa5076d..000000000000 --- a/client/WEB-INF/classes/resources/messages_nl_NL.properties +++ /dev/null @@ -1,2257 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Item eigenschappen gewijzigd -confirm.enable.s3=Vul de volgende informatie in om ondersteuning voor S3-aangestuurde Secundaire Opslag te activeren -confirm.enable.swift=Vul de volgende informatie in om ondersteuning voor Swift te activeren -error.could.not.change.your.password.because.ldap.is.enabled=Fout. Kan wachtwoord niet wijzigen omdat LDAP is uitgeschakeld. -error.could.not.enable.zone=Kon zone niet activeren -error.installWizard.message=Er ging iets mis; je kunt teruggaan om de eventuele fouten te herstellen -error.invalid.username.password=Ongeldige gebruikersnaam of wachtwoord -error.login=Uw gebruikersnaam/wachtwoord komt niet overeen met onze gegevens -error.menu.select=Kan actie niet uitvoeren omdat geen items zijn geselecteerd -error.mgmt.server.inaccessible=The Management Server is niet toegankelijk. Probeer het later opnieuw. -error.password.not.match=De wachtwoord velden komen niet overeen -error.please.specify.physical.network.tags=Netwerk aanbiedingen zijn niet beschikbaar totdat u labels voor het fysieke netwerk specificeert. -error.session.expired=Uw sessie is verlopen -error.something.went.wrong.please.correct.the.following=Er is iets mis gegaan; Corrigeer het volgende -error.unable.to.reach.management.server=Niet in staat om de Management Server te bereiken -error.unresolved.internet.name=Uw internet naam kan niet worden omgezet. -force.delete.domain.warning=Waarschuwing\: Wanneer u deze optie selecteert zullen alle onderliggende domeinen, hun gekoppelde accounts en hun verbruik worden verwijderd. -force.delete=Geforceerd verwijderen -force.remove=Geforceerd loskoppelen -force.remove.host.warning=Waarschuwing\: Wanneer u deze optie selecteert zal CloudStack alle draaiende virtuele machines geforceerd stoppen voordat de host van het cluster wordt verwijderd. -force.stop=Geforceerd stoppen -force.stop.instance.warning=Waarschuwing\: Een instantie geforceerd stoppen zou uw laatste optie moeten zijn. Het kan leiden tot dataverlies en inconsistent gedrag van de staat van de virtuele machine. -hint.no.host.tags=geen machine kentekens gevonden -hint.no.storage.tags=geen opslag kentekens gevonden -hint.type.part.host.tag=type een deel van een machine kenteken -hint.type.part.storage.tag=type een deel van een opslag kenteken -ICMP.code=ICMP Code -ICMP.type=ICMP Type -image.directory=Afbeelding Directory -inline=Inline -instances.actions.reboot.label=Herstart instantie -label.about.app=Over CloudStack -label.about=Over -label.accept.project.invitation=Accepteer project uitnodiging -label.account=Account -label.account.and.security.group=Account, Security group -label.account.details=rekening gegevens -label.account.id=Account ID -label.account.lower=account -label.account.name=Account Naam -label.accounts=Accounts -label.account.specific=Account-specifiek -label.account.type=Account type -label.acl=ACL -label.acl.id=ACL ID -label.acl.list.rules=ACL lijst regels -label.acl.name=ACL naam -label.acl.replaced=ACL vervangen -label.acquire.new.ip=Bemachtig nieuw IP -label.acquire.new.secondary.ip=Verkrijg nieuw secundair IP -label.action=Actie -label.action.attach.disk.processing=Schijf wordt toegevoegd.... -label.action.attach.disk=Schijf toevoegen -label.action.attach.iso=ISO toevoegen -label.action.attach.iso.processing=ISO wordt toegevoegd.... -label.action.cancel.maintenance.mode=Annuleer Onderhoudsmodus -label.action.cancel.maintenance.mode.processing=Onderhoudsmodus wordt geannuleerd.... -label.action.change.password=Wijzig Wachtwoord -label.action.change.service.processing=Service wordt gewijzigd.... -label.action.change.service=Wijzig Service -label.action.configure.samlauthorization=configureer SAML SSO authorisatie -label.action.copy.ISO=Kopieer ISO -label.action.copy.ISO.processing=Bezig een ISO te kopi\u00ebren... -label.action.copy.template=Kopieer Template -label.action.copy.template.processing=Bezig een template te kopi\u00ebren... -label.action.create.template=Cre\u00eber Template -label.action.create.template.from.vm=Cre\u00eber Template vanaf VM -label.action.create.template.from.volume=Cre\u00eber Template van Volume -label.action.create.template.processing=Bezig met aanmaken Template.... -label.action.create.vm=Cre\u00eber VM -label.action.create.vm.processing=Bezig met aanmaken VM.... -label.action.create.volume=Cre\u00eber Volume -label.action.create.volume.processing=Bezig met cre\u00ebren volume.... -label.action.delete.account.processing=Bezig met verwijderen account.... -label.action.delete.account=Verwijder account -label.action.delete.cluster.processing=Bezig met verwijderen van Cluster.... -label.action.delete.cluster=Verwijder Cluster -label.action.delete.disk.offering.processing=Bezig met verwijderen van Schijf Aanbieding.... -label.action.delete.disk.offering=Verwijder Schijf Aanbieding -label.action.delete.domain.processing=Bezig met verwijderen van Domein.... -label.action.delete.domain=Verwijder Domein -label.action.delete.firewall.processing=Bezig met verwijderen van Firewall.... -label.action.delete.firewall=Verwijder firewall regel -label.action.delete.ingress.rule.processing=Bezig met verwijderen van Inkomende Regel.... -label.action.delete.ingress.rule=Verwijder Inkomende Regel -label.action.delete.IP.range.processing=Bezig met verwijderen van IP Range.... -label.action.delete.IP.range=Verwijder IP Range -label.action.delete.ISO.processing=Bezig met verwijderen van ISO.... -label.action.delete.ISO=Verwijder ISO -label.action.delete.load.balancer.processing=Bezig met verwijderen van Load Balancer.... -label.action.delete.load.balancer=Verwijder load balancer regel -label.action.delete.network.processing=Bezig met verwijderen van Netwerk.... -label.action.delete.network=Verwijder Netwerk -label.action.delete.nexusVswitch=Verwijder Nexus 1000v -label.action.delete.nic=Verwijder netwerkkaart -label.action.delete.physical.network=Verwijder fysiek netwerk -label.action.delete.pod.processing=Bezig met verwijderen van Pod.... -label.action.delete.pod=Verwijder Pod -label.action.delete.primary.storage.processing=Bezig met verwijderen van Primaire Opslag.... -label.action.delete.primary.storage=Verwijder Primaire Opslag -label.action.delete.secondary.storage.processing=Bezig met verwijderen van Secundaire Opslag.... -label.action.delete.secondary.storage=Verwijder Secundaire Opslag -label.action.delete.security.group.processing=Bezig met verwijderen van Security Group.... -label.action.delete.security.group=Verwijder Security Group -label.action.delete.service.offering.processing=Bezig met verwijderen van Service Aanbieding.... -label.action.delete.service.offering=Verwijder Service Aanbieding -label.action.delete.snapshot.processing=Bezig met verwijderen van Snapshot.... -label.action.delete.snapshot=Verwijder Snapshot -label.action.delete.system.service.offering=Verwijder Systeem Service Aanbieding -label.action.delete.template.processing=Bezig met verwijderen van Template.... -label.action.delete.template=Verwijder Template -label.action.delete.user.processing=Bezig met verwijderen Gebruiker.... -label.action.delete.user=Verwijder Gebruiker -label.action.delete.volume.processing=Bezig met verwijderen van Volume.... -label.action.delete.volume=Verwijder Volume -label.action.delete.zone.processing=Bezig met verwijderen van Zone.... -label.action.delete.zone=Verwijder Zone -label.action.destroy.instance.processing=Bezig met vernietigen van Instantie.... -label.action.destroy.instance=Verwijder Instantie -label.action.destroy.systemvm.processing=Bezig met vernietigen van Systeem VM.... -label.action.destroy.systemvm=Vernietig Systeem VM -label.action.detach.disk=Ontkoppel Schijf -label.action.detach.disk.processing=Bezig met ontkoppelen van Schijf.... -label.action.detach.iso=Ontkoppel ISO -label.action.detach.iso.processing=Bezig met ontkoppelen van ISO.... -label.action.disable.account=Deactiveer account -label.action.disable.account.processing=Bezig met deactiveren van account.... -label.action.disable.cluster=Deactiveer Cluster -label.action.disable.cluster.processing=Bezig met deactiveren van Cluster.... -label.action.disable.nexusVswitch=Deactiveer Nexus 1000v -label.action.disable.physical.network=Deactiveer fysiek netwerk -label.action.disable.pod=Deactiveer Pod -label.action.disable.pod.processing=Bezig met deactiveren van Pod.... -label.action.disable.static.NAT=Deactiveer Static NAT -label.action.disable.static.NAT.processing=Bezig met deactiveren van Static NAT.... -label.action.disable.user=Deactiveer Gebruiker -label.action.disable.user.processing=Bezig met deactiveren van Gebruiker.... -label.action.disable.zone=Deactiveer Zone -label.action.disable.zone.processing=Bezig met deactiveren van Zone.... -label.action.download.ISO=Download ISO -label.action.download.template=Download Template -label.action.download.volume=Download Volume -label.action.download.volume.processing=Bezig met downloaden van Volume.... -label.action.edit.account=Wijzig account -label.action.edit.disk.offering=Wijzig schijf aanbieding -label.action.edit.domain=Wijzig Domein -label.action.edit.global.setting=Wijzig Algemene Instellingen -label.action.edit.host=Wijzig Host -label.action.edit.instance=Wijzig Instantie -label.action.edit.ISO=Wijzig ISO -label.action.edit.network.offering=Wijzig Netwerk Aanbieding -label.action.edit.network.processing=Bezig met wijzigen van Netwerk... -label.action.edit.network=Wijzig Netwerk -label.action.edit.pod=Wijzig Pod -label.action.edit.primary.storage=Wijzig Primaire Opslag -label.action.edit.resource.limits=Wijzig verbruikslimieten -label.action.edit.service.offering=Wijzig Service Aanbieding -label.action.edit.template=Wijzig Template -label.action.edit.user=Wijzig Gebruiker -label.action.edit.zone=Wijzig Zone -label.action.enable.account=Activeer account -label.action.enable.account.processing=Bezig met activeren van account.... -label.action.enable.cluster=Activeer Cluster -label.action.enable.cluster.processing=Bezig met activeren van Cluster.... -label.action.enable.maintenance.mode=Activeer onderhoudsmodus -label.action.enable.maintenance.mode.processing=Bezig met activeren van Onderhoudsmodus -label.action.enable.nexusVswitch=Activeer Nexus 1000v -label.action.enable.physical.network=Activeer fysiek netwerk -label.action.enable.pod=Activeer Pod -label.action.enable.pod.processing=Bezig met activeren van Pod.... -label.action.enable.static.NAT=Activeer Static NAT -label.action.enable.static.NAT.processing=Bezig met activeren van Static NAT.... -label.action.enable.user=Activeer Gebruiker -label.action.enable.user.processing=Bezig met activeren van Gebruiker.... -label.action.enable.zone=Activeer Zone -label.action.enable.zone.processing=Bezig met activeren van Zone.... -label.action.expunge.instance.processing=Opruimen Instantie.... -label.action.expunge.instance=Ruim instantie op -label.action.force.reconnect=Forceer opnieuw verbinden -label.action.force.reconnect.processing=Bezig met opnieuw verbinden.... -label.action.generate.keys=Genereer Sleutels -label.action.generate.keys.processing=Bezig met generen van Sleutels.... -label.action.list.nexusVswitch=Toon Nexus 1000v -label.action.lock.account=Account op slot zetten -label.action.lock.account.processing=Bezig met account op slot zetten.... -label.action.manage.cluster=Beheer Cluster -label.action.manage.cluster.processing=Bezig met beheren van Cluster.... -label.action.migrate.instance=Migreer Instantie -label.action.migrate.instance.processing=Bezig met migreren van Instantie.... -label.action.migrate.router=MIgreer Router -label.action.migrate.router.processing=Bezig met migreren van Router.... -label.action.migrate.systemvm=Migreer Systeem VM -label.action.migrate.systemvm.processing=Bezig met migreren van Systeem VM.... -label.action.reboot.instance=Herstart Instantie -label.action.reboot.instance.processing=Bezig met herstarten van Instantie.... -label.action.reboot.router=Herstart Router -label.action.reboot.router.processing=Bezig met herstarten van Router.... -label.action.reboot.systemvm=Herstart Systeem VM -label.action.reboot.systemvm.processing=Bezig met herstarten van Systeem VM.... -label.action.recurring.snapshot=Terugkerende Snapshots -label.action.register.iso=Registreer ISO -label.action.register.template=Registreer een template van een URL -label.action.release.ip=Ontkoppel IP -label.action.release.ip.processing=Bezig met ontkoppelen van IP.... -label.action.remove.host.processing=Bezig met verwijderen van Host.... -label.action.remove.host=Verwijder Host -label.action.reset.password.processing=Bezig met resetten van wachtwoord.... -label.action.reset.password=Reset Wachtwoord -label.action.resize.volume.processing=Bezig met aanpassen van de grootte van het Volume -label.action.resize.volume=Wijzig de grootte van het volume -label.action.resource.limits=Verbruikslimieten -label.action.restore.instance=Herstel Instantie -label.action.restore.instance.processing=Bezig met herstellen van Instantie.... -label.action.revert.snapshot=Draai terug naar snapshot -label.action.revert.snapshot.processing=Terugdraaien naar snapshot... -label.actions=Acties -label.action.start.instance.processing=Bezig met starten van Instantie.... -label.action.start.instance=Start Instantie -label.action.start.router.processing=Start Router.... -label.action.start.router=Start Router -label.action.start.systemvm.processing=Bezig met starten van Systeem VM.... -label.action.start.systemvm=Start Systeem VM -label.action.stop.instance.processing=Bezig met stoppen van Instantie.... -label.action.stop.instance=Stop Instantie -label.action.stop.router.processing=Bezig met stoppen van Router.... -label.action.stop.router=Stop Router -label.action.stop.systemvm.processing=Bezig met stoppen van Systeem VM.... -label.action.stop.systemvm=Stop Systeem VM -label.action.take.snapshot=Neem Snapshot -label.action.take.snapshot.processing=Bezig met nemen van Snapshot.... -label.action.unmanage.cluster.processing=Bezig met uitschakelen van Clusterbeheer.... -label.action.unmanage.cluster=Schakel Clusterbeheer uit -label.action.update.OS.preference.processing=Bezig met wijzigen van OS voorkeuren.... -label.action.update.OS.preference=Wijzig OS voorkeuren -label.action.update.resource.count.processing=Bezig met updaten van verbruikslimieten.... -label.action.update.resource.count=Update Verbruikslimieten -label.action.vmsnapshot.create=Neem Snapshot van de VM -label.action.vmsnapshot.delete=Verwijder Snapshot van de VM -label.action.vmsnapshot.revert=Draai Snapshot van de VM terug -label.activate.project=Activeer Project -label.active.sessions=Actieve Sessies -label.add.accounts.to=Voeg accounts toe aan -label.add.accounts=Voeg accounts toe -label.add.account.to.project=Voeg account aan project toe -label.add.account=Voeg Account toe -label.add.acl.list=voeg een ACL lijst toe -label.add.ACL=Voeg ACL toe -label.add.affinity.group=Nieuwe affinity groep toevoegen -label.add.baremetal.dhcp.device=Voeg Baremetal DHCP Apparaat toe -label.add.baremetal.rack.configuration=voeg baremetal rek configuratie toe -label.add.BigSwitchBcf.device=Voeg eenBigSwitch BCF controller toe -label.add.BrocadeVcs.device=Voeg een Brocade Vcs switch toe -label.add.by.cidr=Voeg toe door middel van CIDR -label.add.by.group=Voeg toe door middel van Groep -label.add.by=Voeg toe door middel van -label.add.ciscoASA1000v=voeg CiscoASA1000v toe -label.add.cluster=Voeg Cluster toe -label.add.compute.offering=Voeg Compute aanbieding toe -label.add.direct.iprange=Voeg Direct IP Range toe -label.add.disk.offering=Voeg Schijf Aanbieding toe -label.add.domain=Voeg Domein toe -label.added.brocade.vcs.switch=een nieuwe Brocade Vcs switch is toegevoegd -label.added.network.offering=netwerk aanbieding toegevoegd -label.added.new.bigswitch.bcf.controller=een nieuwe BigSwitch BCF controller is toegevoegd -label.added.nicira.nvp.controller=Nieuwe Nicira NVP Controller toegevoegd -label.add.egress.rule=Voeg uitgaande regel toe -label.addes.new.f5=Nieuwe F5 toegevoegd -label.add.F5.device=Voeg F5 apparaat toe -label.add.firewall=Voeg firewall regel toe -label.add.globo.dns=voeg GloboDNS toe -label.add.gslb=GSLB Toevoegen -label.add.guest.network=Gast netwerk toevoegen -label.add.host=Host toevoegen -label.adding.cluster=Bezig met toevoegen van Cluster -label.adding.failed=Toevoegen mislukt -label.adding.pod=Bezig met toevoegen van Pod -label.adding.processing=Toevoegen.... -label.add.ingress.rule=Voeg inkomende regel toe -label.adding.succeeded=Toevoegen geslaagd -label.adding=Toevoegen -label.adding.user=Bezig met toevoegen van Gebruiker -label.adding.zone=Bezig met toevoegen van Zone -label.add.intermediate.certificate=Voeg een intermediair certificaat toe -label.add.internal.lb=voeg interne LB toe -label.add.ip.range=Voeg IP range toe -label.add.isolated.guest.network=Voeg een ge\u00efsoleerd netwerk toe -label.add.isolated.guest.network.with.sourcenat=voeg en ge\u00efsoleerd gast netwerk met bron-NAT toe -label.add.isolated.network=Geisoleerd Netwerk Toevoegen -label.additional.networks=Additioneele Netwerken -label.add.ldap.account=Voeg LDAP account toe -label.add.LDAP.account=voeg LDAP rekening toe -label.add.list.name=ACL lijst naam -label.add.load.balancer=Voeg Load Balancer toe -label.add.more=Voeg meer toe -label.add.netScaler.device=Voeg Netscaler apparaat toe -label.add.network.acl.list=voeg netwerk ACL lijst toe -label.add.network.ACL=Voeg netwerk ACL toe -label.add.network.device=Voeg Netwerk Apparaat toe -label.add.network.offering=Voeg netwerk aanbieding toe -label.add.network=Voeg Netwerk toe -label.add.new.F5=Voeg nieuwe F5 toe -label.add.new.gateway=Voeg nieuwe gateway toe -label.add.new.NetScaler=Voeg nieuwe Netscaler toe -label.add.new.PA=Nieuwe Palo Alto toevoegen -label.add.new.SRX=Voeg nieuwe SRX toe -label.add.new.tier=Voeg nieuwe Tier toe -label.add.nfs.secondary.staging.store=Secundaire Staging Opslag toevoegen -label.add.NiciraNvp.device=Voeg NVP Controller toe -label.add.NuageVsp.device=Voeg Nuage Virtualized Services Directory (VSD) toe -label.add.OpenDaylight.device=OpenDaylight Controller toevoegen -label.add.PA.device=Nieuw Palo Alto apparaat toevoegen -label.add.physical.network=Voeg fysiek netwerk toe -label.add.pod=Voeg Pod toe -label.add.portable.ip.range=Porteerbare IP Range toevoegen -label.add.port.forwarding.rule=Voeg port forwarding regel toe -label.add.primary.storage=Voeg Primaire Opslag toe -label.add.private.gateway=voeg private doorgang toe -label.add.region=Voeg Regio toe -label.add.resources=Resources toevoegen -label.add.route=Route toevoegen -label.add.rule=Regel toevoegen -label.add.secondary.storage=Secundaire Opslag toevoegen -label.add.security.group=Security Group toevoegen -label.add.service.offering=Service Aanbieding toevoegen -label.add.SRX.device=SRX apparaat toevoegen -label.add.static.nat.rule=Statische NAT regel toevoegen -label.add.static.route=Statische route toevoegen -label.add.system.service.offering=Systeem Service Aanbieding toevoegen -label.add.template=Template toevoegen -label.add.to.group=Toevoegen aan groep -label.add.ucs.manager=UCS Manager toevoegen -label.add.userdata=Gebruikers gegevens -label.add.user=Gebruiker toevoegen -label.add.vlan=VLAN toevoegen -label.add.vms.to.lb=Voeg VM(s) toe aan load balancer regel -label.add.vms=VMs toevoegen -label.add.VM.to.tier=Voeg VM toe aan tier -label.add.vm=VM toevoegen -label.add.vmware.datacenter=VMware datacenter toevoegen -label.add.vnmc.device=VNMC apparaat toevoegen -label.add.vnmc.provider=VNMC provider toevoegen -label.add=Voeg toe -label.add.volume=Volume toevoegen -label.add.vpc.offering=VPC Aanbieding toevoegen -label.add.vpc=VPC toevoegen -label.add.vpn.customer.gateway=VPN Customer Gateway toevoegen -label.add.VPN.gateway=VPN Gateway toevoegen -label.add.vpn.user=VPN gebruiker toevoegen -label.add.vxlan=VXLAN toevoegen -label.add.zone=Zone toevoegen -label.admin.accounts=Beheer Accounts -label.admin=Beheerder -label.advanced=Geavanceerd -label.advanced.mode=Geavanceerde Modus -label.advanced.search=Geavanceerd zoeken -label.affinity=Affinity -label.affinity.group=Affinity Groep -label.affinity.groups=Affinity Groepen -label.agent.password=Agent wachtwoord -label.agent.port=Agent poort -label.agent.state=agent status -label.agent.username=Agent Gebruikersnaam -label.agree=Accepteren -label.alert=Alarm -label.alert.archived=waarschuwing gearchiveerd -label.alert.deleted=waarschuwing verwijderd -label.alert.details=waarschuwing gegevens -label.algorithm=Algoritme -label.allocated=Gebruikt -label.allocation.state=Verbruik Staat -label.allow=Toestaan -label.anti.affinity=Anti-affinity -label.anti.affinity.group=Anti-affinity Groep -label.anti.affinity.groups=Anti-affinity Groepen -label.api.key=API Sleutel -label.api.version=API versie -label.apply=Uitvoeren -label.app.name=CloudStack -label.archive.alerts=Archiveer waarschuwingen -label.archive=archief -label.archive.events=Archiveer evenementen -label.assigned.vms=toegewezen VMs -label.assign.instance.another=Wijs instantie toe aan een andere Account -label.assign=Toevoegen -label.assign.to.load.balancer=Voeg instantie toe aan load balancer -label.assign.vms=wijs VMs toe -label.associated.network=Bijbehorend Netwerk -label.associated.network.id=Bijbehorend Netwerk ID -label.associated.profile=Bijbehorend Profiel -label.associate.public.ip=Associeers Publiek IP -label.attached.iso=Gekoppelde ISO -label.author.email=Auteur e-mail -label.author.name=Auteur naam -label.autoscale=Automatisch Schalen -label.autoscale.configuration.wizard=autoschaal configuratie toverdoos -label.availability=Beschikbaarheid -label.availability.zone=Beschikbaarheids-zone -label.availabilityZone=beschikbaarheidszone -label.available=Beschikbaar -label.available.public.ips=Beschikbare Publieke IP adressen -label.back=Terug -label.bandwidth=Bandbreedte -label.baremetal.dhcp.devices=Baremetal DHCP Apparten -label.baremetal.dhcp.provider=Baremetal DHCP Provider -label.baremetal.pxe.devices=Baremetal DHCP Apparaten -label.baremetal.pxe.device=Voeg Baremetal PXE Apparaat toe -label.baremetal.pxe.provider=Baremetal PXE Provider -label.baremetal.rack.configuration=baremetal rek configuratie -label.basic=Basis -label.basic.mode=Basis Modus -label.bigswitch.bcf.details=BigSwitch BCF gegevens -label.bigswitch.bcf.nat=BigSwitch BCF NAT staat aan -label.bigswitch.controller.address=BigSwitch BCF Controller adres -label.blade.id=Blade ID -label.blades=Blades -label.bootable=Bootable -label.broadcast.domain.range=Broadcast domain range -label.broadcast.domain.type=Broadcast Domain Type -label.broadcast.uri=Broadcast URI -label.broadcasturi=broadcasturi -label.broadcat.uri=broadcast URI -label.brocade.vcs.address=Vcs switch adres -label.brocade.vcs.details=Brocade Vcs switch gegevens -label.by.account=Op Account -label.by.alert.type=Op alarm type -label.by.availability=Op Beschikbaarheid -label.by.date.end=Op datum (eind) -label.by.date.start=Op datum (start) -label.by.domain=Op Domein -label.by.end.date=Op Eind Datum -label.by.event.type=Op gebeurtenis type -label.by.level=Op Level -label.by.pod=Op Pod -label.by.role=Op Rol -label.by.start.date=Op Start Datum -label.by.state=Op Staat -label.bytes.received=Bytes Ontvangen -label.bytes.sent=Bytes Verzonden -label.by.traffic.type=Op Verkeerstype -label.by.type.id=Op Type ID -label.by.type=Op Type -label.by.zone=Op Zone -label.cache.mode=Schrijf cache Type -label.cancel=Annuleer -label.capacity.bytes=Capaciteit in bytes -label.capacity=Capaciteit -label.capacity.iops=Capaciteit in IOPS -label.certificate=Certificaat -label.change.affinity=Wijzig Affinity -label.change.ipaddress=Verander het IP adres voor NIC -label.change.service.offering=Wijzig service aanbieding -label.change.value=Wijzig waarde -label.character=Karakter -label.chassis=Chassis -label.checksum=controlesom -label.cidr.account=CIDRN of Account/Security Group -label.cidr=CIDR -label.cidr.list=Bron CIDR -label.CIDR.list=CIDR lijst -label.CIDR.of.destination.network=CIDR van bestemmingsnetwerk -label.cisco.nexus1000v.ip.address=Nexus 1000v IP Adres -label.cisco.nexus1000v.password=Nexus 1000v Wachtwoord -label.cisco.nexus1000v.username=Nexus 1000v Gebruikersnaam -label.ciscovnmc.resource.details=CiscoVNMC resource details -label.clean.up=Opschonen -label.clear.list=Schoon lijst op -label.close=Sluiten -label.cloud.console=Cloud Beheers Console -label.cloud.managed=Cloud.com Managed -label.cluster=Cluster -label.cluster.name=Cluster Naam -label.clusters=Clusters -label.cluster.type=Cluster Type -label.clvm=CLVM -label.code=Code -label.community=Community -label.compute.and.storage=Compute en Opslag -label.compute=Compute -label.compute.offering=Compute aanbieding -label.compute.offerings=Compute aanbiedingen -label.configuration=Configuratie -label.configure=Configureer -label.configure.ldap=Configureer LDAP -label.configure.network.ACLs=Configureer Netwerk ACLs -label.configure.sticky.policy=configureer klevende regel -label.configure.vpc=Configureer VPC -label.confirmation=Bevestiging -label.confirm.password=Bevestig wachtwoord -label.congratulations=Gefeliciteerd\! -label.conserve.mode=Conserveer modus -label.console.proxy=Console proxy -label.console.proxy.vm=Console Proxy VM -label.continue.basic.install=Ga door met basis installatie -label.continue=Ga door -label.copying.iso=bezig ISO te kopi\u00ebren -label.corrections.saved=Correcties opgeslagen -label.counter=teller -label.cpu.allocated=CPU gebruik -label.cpu.allocated.for.VMs=CPU gebruikt voor VMs -label.CPU.cap=CPU Cap -label.cpu=CPU -label.cpu.limits=CPU limieten -label.cpu.mhz=CPU (in MHz) -label.cpu.utilized=CPU Verbruik -label.created=Aangemaakt -label.created.by.system=Aangemaakt door systeem -label.create.nfs.secondary.staging.storage=Creeer NFS staging secudaire opslag -label.create.nfs.secondary.staging.store=Creeer NFS staging secudaire opslag -label.create.project=Nieuw project -label.create.ssh.key.pair=cre\u00eber een SSH sleutelpaar -label.create.template=Nieuwe template -label.create.VPN.connection=Nieuwe VPN connectie -label.cross.zones=Over Zones -label.custom=Aangepast -label.custom.disk.iops=Aangepaste IOPS -label.custom.disk.offering=schijf aanbieding op maat -label.custom.disk.size=Vrije schijf grootte -label.daily=Dagelijkse -label.data.disk.offering=Data Schijf Aanbieding -label.date=Datum -label.day=dag -label.day.of.month=Dag van de Maand -label.day.of.week=Dag van de Week -label.dc.name=DC Naam -label.dead.peer.detection=Dead Peer detectie -label.decline.invitation=Sla uitnodiging af -label.dedicate.cluster=Cluster toewijden -label.dedicated=Toegewijd -label.dedicated.vlan.vni.ranges=Toegewijde VLAN/VNI Ranges -label.dedicate.host=Host Toewijden -label.dedicate.pod=Pod toewijden -label.dedicate=Toewijden -label.dedicate.vlan.vni.range=Toegewijde VLAN/VNI Range -label.dedicate.zone=Zone toewijden -label.default.egress.policy=Standaard Uitgaande policy -label.default=Standaard -label.default.use=Standaard Gebruik -label.default.view=Standaard Weergave -label.delete.acl.list=verwijder ACL lijst -label.delete.affinity.group=Verwijder Affinity Groep -label.delete.alerts=Verwijder waarschuwingen -label.delete.baremetal.rack.configuration=verwijder baremetal rek configuratie -label.delete.BigSwitchBcf=Verwijder BigSwitch BCF Controller -label.delete.BrocadeVcs=Verwijder Brocade Vcs Switch -label.delete.ciscoASA1000v=verwijder CiscoASA1000v -label.delete.ciscovnmc.resource=CiscoVNMC resource verwijderen -label.delete.events=Verwijder gebeurtenissen -label.delete.F5=Verwijder F5 -label.delete.gateway=Verwijder gateway -label.delete.internal.lb=verwijder interne LB -label.delete.NetScaler=Verwijder NetScaler -label.delete.NiciraNvp=Verwijder Nvp Controller -label.delete.NuageVsp=Verwijder Nuage VSD -label.delete.OpenDaylight.device=OpenDaylight Controller verwijderen -label.delete.PA=Verwijder Palo Alto -label.delete.portable.ip.range=Porteerbare IP Range verwijderen -label.delete.profile=Profiel Verwijderen -label.delete.project=Verwijder project -label.delete.secondary.staging.store=Secundaire Staging Opslag verwijderen -label.delete.SRX=Verwijder SRX -label.delete.ucs.manager=Verwijder UCS Manager -label.delete=Verwijder -label.delete.VPN.connection=Verwijder VPN connectie -label.delete.VPN.customer.gateway=Verwijder VPN Customer Gateway -label.delete.VPN.gateway=Verwijder VPN Gateway -label.delete.vpn.user=Verwijder VPN gebruiker -label.deleting.failed=Verwijderen Mislukt -label.deleting.processing=Verwijderen.... -label.deny=Weigeren -label.deployment.planner=Deployment planner -label.description=Beschrijving -label.destination.physical.network.id=Bestemming fysiek netwerk ID -label.destination.zone=Bestemmingszone -label.destroy.router=Verwijder router -label.destroy=Verwijder -label.destroy.vm.graceperiod=Respijt periode verwijderde VM -label.detaching.disk=Ontkoppelen Schijf -label.details=Details -label.device.id=Apparaat ID -label.devices=Apparaten -label.dhcp=DHCP -label.DHCP.server.type=DHCP Server Type -label.direct.attached.public.ip=direct verbonden publieke IP -label.direct.ips=Shared Netwerk IPs -label.disable.autoscale=Autoscale uitschakelen -label.disabled=Uitgeschakeld -label.disable.host=schakel host uit -label.disable.network.offering=Netwerk Aanbieding Uitschakelen -label.disable.provider=Provider uitschakelen -label.disable.vnmc.provider=VNMC provider uitschakelen -label.disable.vpc.offering=VPC aanbieding uitschakelen -label.disable.vpn=VPN uitschakelen -label.disabling.vpn.access=Uitschakelen van VPN Toegang -label.disassociate.profile.blade=Ontkoppel Profiel van Blade -label.disbale.vnmc.device=VNMC apparaat uitschakelen -label.disk.allocated=Schijfruimte gealloceerd -label.disk.bytes.read.rate=Lees Snelheid Schijf (BPS) -label.disk.bytes.write.rate=Schrijf Snelheid Schijf (BPS) -label.disk.iops.max=Max IOPS -label.disk.iops.min=Min IOPS -label.disk.iops.read.rate=Lees Snelheid Schijf (IOPS) -label.disk.iops.total=IOPS Totaal -label.disk.iops.write.rate=Schrijf snelheid Schijf (IOPS) -label.disk.offering.details=schijfe offerte gegevens -label.diskoffering=opslagaanbieding -label.disk.offering=Schijf Aanbieding -label.disk.provisioningtype=Provisioning type -label.disk.read.bytes=Schijf lezen (Bytes) -label.disk.read.io=Schijf Lezen (IO) -label.disk.size.gb=Schijf Grootte (in GB) -label.disk.size=Schijf Grootte -label.disk.total=Schijf Totaal -label.disk.volume=Schijf Volume -label.disk.write.bytes=Schijf Schrijven (Bytes) -label.disk.write.io=Schijf Schrijven (IO) -label.display.name=publieke naam -label.display.text=Weergavetekst -label.distributedrouter=gedistribueerde router -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=DNS domein voor Gast Netwerken -label.domain.admin=Domein Beheerder -label.domain.details=domein gegevens -label.domain=Domein -label.domain.id=Domein ID -label.domain.lower=domein -label.domain.name=Domeinnaam -label.domain.router=Domein router -label.domain.suffix=DNS domein achtervoegsel (v.b., xyz.com) -label.done=Klaar -label.double.quotes.are.not.allowed=Aanhalingstekens zijn hier niet toegestaan -label.download.progress=Download Voortgang -label.drag.new.position=Sleep naar nieuwe positie -label.duration.in.sec=duur (in sec) -label.dynamically.scalable=Dynamisch Schaalbaar -label.edit.acl.rule=wijzig ACL regel -label.edit.affinity.group=Wijzig Affinity Groep -label.edit.lb.rule=Wijzig LB regel -label.edit.network.details=Wijzig netwerk details -label.edit.project.details=Wijzig project details -label.edit.region=Wijzig Regio -label.edit.rule=wijzig regel -label.edit.secondary.ips=Weizig secundaire IPs -label.edit.tags=Wijzig tags -label.edit.traffic.type=Wijzig traffic type -label.edit.vpc=Wijzig VPC -label.edit=Wijzig -label.egress.default.policy=Standaard uitgaande policy -label.egress.rules=Uitgaande regels -label.egress.rule=Uitgaande regel -label.elastic=Elastisch -label.elastic.IP=Elastisch IP -label.elastic.LB=Elastisch LB -label.email=Email -label.email.lower=email -label.enable.autoscale=Autoscale inschakelen -label.enable.host=schakel host in -label.enable.network.offering=Netwerk Aanbieding Inschakelen -label.enable.provider=Provider inschakelen -label.enable.s3=S3-gebaseerde Secondary Storage inschakelen -label.enable.swift=Swift inschakelen -label.enable.vnmc.device=VNMC appraat inschakelen -label.enable.vnmc.provider=VNMC provider inschakelen -label.enable.vpc.offering=VPC aanbieding inschakelen -label.enable.vpn=VPN inschakelen -label.enabling.vpn.access=VPN toegang inschakelen -label.enabling.vpn=VPN inschakelen -label.end.IP=Eind IP -label.endpoint=Endpoint -label.endpoint.or.operation=Endpoint or Operation -label.end.port=Eind Poort -label.end.reserved.system.IP=Einde gereserveerde systeem IP -label.end.vlan=Laatste VLAN -label.end.vxlan=Laatste VXLAN -label.enter.token=Voer token in -label.error.code=Fout code -label.error=Fout -label.error.upper=FOUT -label.ESP.encryption=ESP Encryptie -label.ESP.hash=ESP Hash -label.ESP.lifetime=ESP Lifetime (secondes) -label.ESP.policy=ESP policy -label.esx.host=ESX/ESXi Host -label.event.archived=gebeurtenis gearchiveerd -label.event.deleted=gebeurtenis verwijderd -label.event=gebeurtenis -label.every=elke -label.example=Voorbeeld -label.expunge=Ruim op -label.external.link=Externe link -label.extractable.lower=ophaalbaar -label.extractable=Uitpakbaar -label.f5.details=F5 details -label.f5=F5 -label.failed=Mislukt -label.featured=Voorgesteld -label.fetch.latest=Haal laatste op -label.filterBy=Filter per -label.fingerprint=vinger afdruk -label.firewall=Firewall -label.firstname.lower=voornaam -label.first.name=Voornaam -label.format=Formaat -label.format.lower=formaat -label.friday=Vrijdag -label.full.path=Volledig pad -label.full=Volledig -label.gateway=Gateway -label.general.alerts=Algemene Waarschuwingen -label.generating.url=Generen van URL -label.globo.dns.configuration=GloboDNS configuratie -label.globo.dns=GloboDNS -label.gluster.volume=Volume -label.go.step.2=Ga naar Stap 2 -label.go.step.3=Ga naar Stap 3 -label.go.step.4=Ga naar Stap 4 -label.go.step.5=Ga naar Stap 5 -label.gpu=CPU -label.group.by.account=groepeer per account -label.group.by.cluster=groepeer per cluster -label.group.by.pod=groepeer per pod -label.group.by.zone=groepeer per zone -label.group=Groep -label.group.optional=Groep (Optioneel) -label.gslb.assigned.lb.more=Wijs meer load balancing toe -label.gslb.assigned.lb=toegewezen load balancing -label.gslb.delete=GSLB verwijderen -label.gslb.details=GSLB details -label.gslb.domain.name=GSLB Domein Naam -label.gslb=GSLB -label.gslb.lb.details=load balancing details -label.gslb.lb.remove=verwijder load balancing van deze GSLB -label.gslb.lb.rule=load balancing regel -label.gslb.service=GSLB service -label.gslb.service.private.ip=GSLB service Private IP -label.gslb.service.public.ip=GSLB service Publiek IP -label.gslb.servicetype=Service Type -label.guest.cidr=Gast CIDR -label.guest.end.ip=Gast eind IP -label.guest=Gast -label.guest.gateway=Gast Gateway -label.guest.ip=Gast IP Adres -label.guest.ip.range=Gast IP range -label.guest.netmask=Gast Netmask -label.guest.network.details=Gast netwerk details -label.guest.networks=Gast netwerken -label.guest.start.ip=Gast start IP -label.guest.traffic=Gast verkeer -label.guest.traffic.vswitch.name=vSwitch Gast Verkeer Naam -label.guest.traffic.vswitch.type=vSwitch Gast Verkeer Type -label.guest.type=Gast Type -label.ha.enabled=HA ingeschakeld -label.health.check.advanced.options=geavanceerde opties\: -label.health.check.configurations.options=configuratie opties\: -label.health.check=Health Check -label.health.check.interval.in.sec=gezondheid check interval (in sec) -label.health.check.message.desc=Uw load balancer zal automatisch gezondheidskeuringen op uw cloudstack instanties uitvoeren en allen verkeer routeren naar instanties die gezondheidskeuring doorstaan. -label.health.check.wizard=gezondheids controle tovenaar -label.healthy.threshold=gezonde marge -label.help=Help -label.hide.ingress.rule=Verberg Inkomende Regel -label.hints=Tips -label.home=Home -label.host=Host -label.host.MAC=Host MAC -label.host.name=Hostnaam -label.hosts=Hosts -label.host.tag=machine kenteken -label.host.tags=Host Tags -label.hourly=Uurlijks -label.hvm=HVM -label.hypervisor.capabilities=Hypervisor mogelijkheden -label.hypervisor=Hypervisor -label.hypervisors=Hypervisors -label.hypervisor.snapshot.reserve=Hypervisor Snapshot Reserve -label.hypervisor.type=Hypervisor Type -label.hypervisor.version=Hypervisor versie -label.hyperv.traffic.label=HyperV verkeerslabel -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=IKE Encryptie -label.IKE.hash=IKE Hash -label.IKE.lifetime=IKE lifetime (secondes) -label.IKE.policy=IKE policy -label.info=Info -label.info.upper=INFORMATIE -label.ingress.rule=Inkomende Regel -label.initiated.by=Ge\u00efnitieerd door -label.inside.port.profile=binnen poort profiel -label.installWizard.addClusterIntro.subtitle=Wat is een cluster? -label.installWizard.addClusterIntro.title=Nu\: Cluster toevoegen -label.installWizard.addHostIntro.subtitle=Wat is een host? -label.installWizard.addHostIntro.title=Nu\: Host toevoegen -label.installWizard.addPodIntro.subtitle=Wat is een pod? -label.installWizard.addPodIntro.title=Nu\: Pod toevoegen -label.installWizard.addPrimaryStorageIntro.subtitle=Wat is primary storage? -label.installWizard.addPrimaryStorageIntro.title=Nu\: Primaire opslag toevoegen -label.installWizard.addSecondaryStorageIntro.subtitle=Wat is secundaire opslag? -label.installWizard.addSecondaryStorageIntro.title=Nu\: Secundaire opslag toevoegen -label.installWizard.addZoneIntro.subtitle=Wat is een zone? -label.installWizard.addZoneIntro.title=Nu\: Zone toevoegen -label.installWizard.addZone.title=Zone toevoegen -label.installWizard.click.launch=Klik op de lanceer knop. -label.installWizard.subtitle=Deze rondleiding gaat je helpen met het uitvoeren van de CloudStack&\#8482 installatie -label.installWizard.title=Hallo en welkom bij CloudStack&\#8482 -label.instance=Instantie -label.instance.limits=Instantie Limieten -label.instance.name=Instantie Naam -label.instance.port=instantie poort -label.instance.scaled.up=Instantie is geschaald naar de gevraagde aanbieding -label.instances=Instanties -label.instanciate.template.associate.profile.blade=Initieer Template en verbind Profiel met Blade -label.intermediate.certificate=Intermediair certificaat {0} -label.internal.dns.1=Interne DNS 1 -label.internal.dns.2=Interne DNS 2 -label.internal.lb.details=interne LB gegevens -label.internal.lb=interne LB -label.internallbvm=interne LBVM -label.internal.name=Interne naam -label.interval.type=Interval Type -label.introduction.to.cloudstack=CloudStack&\#8482 Introductie -label.invalid.integer=Onjuiste Waarde -label.invalid.number=Onjuist nummer -label.invitations=Uitnodigingen -label.invited.accounts=Uitgenodigde accounts -label.invite.to=Nodig uit voor -label.invite=Uitnodigen -label.ip.address=IP Adres -label.ipaddress=IP Adres -label.ip.allocations=IP Allocaties -label.ip=IP -label.ip.limits=Publieke IP Limieten -label.ip.or.fqdn=IP of FQDN -label.ip.range=IP Range -label.ip.ranges=IP Ranges -label.IPsec.preshared.key=IPsec Preshared-Key -label.ips=IPs -label.ipv4.cidr=IPv4 CIDR -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.ipv4.end.ip=IPv4 Eind IP -label.ipv4.gateway=IPv4 Gateway -label.ipv4.netmask=IPv4 Netmask -label.ipv4.start.ip=IPv4 Begin IP -label.ipv6.address=IPv6 IP Address -label.ipv6.CIDR=IPv6 CIDR -label.ipv6.dns1=IPv6 DNS1 -label.ipv6.dns2=IPv6 DNS2 -label.ipv6.end.ip=IPv6 Eind IP -label.ipv6.gateway=IPv6 Gateway -label.ipv6.start.ip=IPv6 Begin IP -label.iscsi=iSCSI -label.is.default=Is Standaard -label.iso.boot=ISO Boot -label.iso=ISO -label.isolated.networks=Geisoleerde netwerken -label.isolation.method=Isolatie methode -label.isolation.mode=Isolatie Modus -label.isolation.uri=Isolatie URI -label.is.redundant.router=Redundant -label.is.shared=Is Gedeeld -label.is.system=Is Systeem -label.item.listing=Items lijst -label.japanese.keyboard=Japans toetsenbord -label.keep=Bewaar -label.keep.colon=bewaar\: -label.keyboard.language=toetsenbord taal -label.keyboard.type=Toetsenbord type -label.key=Sleutel -label.kvm.traffic.label=KVM verkeer label -label.label=Label -label.lang.arabic=Arabisch -label.lang.brportugese=Braziliaans Portgees -label.lang.catalan=Catalaans -label.lang.chinese=Chinees (Simplified) -label.lang.dutch=Nederlands (Nederlands) -label.lang.english=Engels -label.lang.french=Frans -label.lang.german=Duits -label.lang.hungarian=Hongaars -label.lang.italian=Italiaans -label.lang.japanese=Japans -label.lang.korean=Koreans -label.lang.norwegian=Noors -label.lang.polish=Pools -label.lang.russian=Russisch -label.lang.spanish=Spaans -label.last.disconnected=Laatse keer niet verbonden -label.last.name=Achternaam -label.lastname.lower=achternaam -label.latest.events=Laatste gebeurtenissen -label.launch=Lanceer -label.launch.vm=Lanceer VM -label.launch.zone=Lanceer zone -label.lb.algorithm.leastconn=Minste connecties -label.lb.algorithm.roundrobin=Round-robin -label.lb.algorithm.source=Bron -label.LB.isolation=LB isolatie -label.ldap.configuration=LDAP Configuratie -label.ldap.group.name=LDAP Groep -label.ldap.link.type=Type -label.ldap.port=LDAP poort -label.level=Level -label.link.domain.to.ldap=link domein aan LDAP -label.linklocal.ip=Link Local IP Adres -label.load.balancer=Load Balancer -label.load.balancer.type=loadbalancer type -label.load.balancing=Load Balancing -label.load.balancing.policies=Load balancing policies -label.loading=Laden -label.local.file=lokaal bestand -label.local=Lokaal -label.local.storage.enabled=Schakel locale opslag voor gebruiker VMs in -label.local.storage.enabled.system.vms=zet lokale opslag voor systeem VMs aan -label.local.storage=Lokale Opslag -label.login=Login -label.logout=Log uit -label.lun=LUN -label.LUN.number=LUN \# -label.lxc.traffic.label=LXC verkeerslabel -label.make.project.owner=Maak account project eigenaar -label.make.redundant=Maak redundant -label.manage=Beheer -label.managed=beheerd(e) -label.management=Beheer -label.management.ips=Beheers IP Adressen -label.management.server=Beheers Machine -label.manage.resources=Beheer Resources -label.max.cpus=Max. CPU cores -label.max.guest.limit=Max. Instanties -label.maximum=Maximaal -label.max.instances=Max Instances -label.max.memory=Max. geheugen (MiB) -label.max.networks=Max. netwerken -label.max.primary.storage=Max. primare opslag (GiB) -label.max.public.ips=Max. publieke IPs -label.max.secondary.storage=Max. secundaire opslag (GiB) -label.max.snapshots=Max. snapshots -label.max.templates=Max. templates -label.max.vms=Max. VMs per gebruiker -label.max.volumes=Max. volumes -label.max.vpcs=Max. VPCs -label.may.continue=U kunt nu verder gaan. -label.md5.checksum=MD5 checksum -label.memory.allocated=Geheugen Gealloceerd -label.memory=Geheugen -label.memory.limits=Geheugen limieten (MiB) -label.memory.mb=Geheugen (in MB) -label.memory.total=Totaal Geheugen -label.memory.used=Geheugen gebruikt -label.menu.accounts=Accounts -label.menu.alerts=Waarschuwingen -label.menu.all.accounts=Alle Accounts -label.menu.all.instances=Alle Instanties -label.menu.community.isos=Community ISOs -label.menu.community.templates=Community Templates -label.menu.configuration=Configuratie -label.menu.dashboard=Dashboard -label.menu.destroyed.instances=Vernietigde Instanties -label.menu.disk.offerings=Schijf Aanbiedingen -label.menu.domains=Domeinen -label.menu.events=Gebeurtenissen -label.menu.featured.isos=Voorgestelde ISOs -label.menu.featured.templates=Voorgestelde Templates -label.menu.global.settings=Algemene Instellingen -label.menu.infrastructure=Infrastructuur -label.menu.instances=Instanties -label.menu.ipaddresses=IP Adressen -label.menu.isos=ISOs -label.menu.my.accounts=Mijn Accounts -label.menu.my.instances=Mijn Instanties -label.menu.my.isos=Mijn ISOs -label.menu.my.templates=Mijn Templates -label.menu.network=Netwerk -label.menu.network.offerings=Netwerk Aanbiedingen -label.menu.physical.resources=Fysieke Resources -label.menu.regions=Regio\\'s -label.menu.running.instances=Draaiende Instanties -label.menu.security.groups=Security Groups -label.menu.service.offerings=Service Aanbiedingen -label.menu.snapshots=Snapshots -label.menu.sshkeypair=SSH sleutelpaar -label.menu.stopped.instances=Uitgeschakelde Instanties -label.menu.storage=Opslag -label.menu.system.service.offerings=Systeem Aanbiedingen -label.menu.system=Systeem -label.menu.system.vms=Systeem VMs -label.menu.templates=Templates -label.menu.virtual.appliances=Virtueele Appliances -label.menu.virtual.resources=Virtuele Resources -label.menu.volumes=Volumes -label.menu.vpc.offerings=VPC Aanbiedingen -label.metrics.allocated=Gebruikt -label.metrics.clusters=Clusters -label.metrics.cpu.allocated=CPU allocatie -label.metrics.cpu.max.dev=afwijking -label.metrics.cpu.total=totaal -label.metrics.cpu.usage=CPU gebruik -label.metrics.cpu.used.avg=Gebruikt -label.metrics.disk.allocated=Gebruikt -label.metrics.disk.iops.total=IOPS -label.metrics.disk.read=lees -label.metrics.disk=schijf -label.metrics.disk.size=Grootte -label.metrics.disk.storagetype=Type -label.metrics.disk.total=totaal -label.metrics.disk.unallocated=niet-toegekend -label.metrics.disk.usage=schijf gebruik -label.metrics.disk.used=Gebruikt -label.metrics.disk.write=schrijf -label.metrics.hosts=Hosts -label.metrics=meet-gegevens -label.metrics.memory.allocated=geheugen allocatie -label.metrics.memory.max.dev=afwijking -label.metrics.memory.total=totaal -label.metrics.memory.usage=geheugen gebruik -label.metrics.memory.used.avg=Gebruikt -label.metrics.name=Naam -label.metrics.network.read=lees -label.metrics.network.usage=netwerk gebruik -label.metrics.network.write=schrijf -label.metrics.num.cpu.cores=kernen -label.metrics.property=eigenschap -label.metrics.scope=Scope -label.metrics.state=Staat -label.metrics.storagepool=opslag poel -label.metrics.vm.name=VM naam -label.migrate.instance.to.host=Migreer instantie naar andere host -label.migrate.instance.to=Migreer instantie naar -label.migrate.instance.to.ps=Migreer instantie naar andere primaire opslag -label.migrate.lb.vm=Migreer LB VM -label.migrate.router.to=Migreer Router naar -label.migrate.systemvm.to=Migreer Systeem VM naar -label.migrate.to.host=Migreer naar host -label.migrate.to.storage=Migreer naar opslag -label.migrate.volume=Migreer volume -label.migrate.volume.to.primary.storage=Migreer volume naar andere primaire opslag -label.minimum=Minimum -label.min.instances=Min Instances -label.min.past.the.hr=min na het uur -label.minute.past.hour=Minuten na het uur -label.minutes.past.hour=minu(u)t(en) in het laatste uur -label.mode=Modus -label.monday=Maandag -label.monthly=Maandelijks -label.more.templates=Meer Templates -label.move.down.row=Verplaats \u00e9\u00e9n regel naar beneden -label.move.to.bottom=Verplaats naar beneden -label.move.to.top=Verplaats naar boven -label.move.up.row=Verplaats \u00e9\u00e9n regel naar boven -label.my.account=Mijn Account -label.my.network=Mijn netwerk -label.my.templates=Mijn templates -label.name.lower=naam -label.name=Naam -label.name.optional=Naam (Optioneel) -label.na=N/A -label.nat.port.range=NAT Poort Range -label.netmask=Netmask -label.netscaler.details=NetScaler details -label.netScaler=NetScaler -label.network.ACL=Netwerk ACL -label.network.ACLs=Netwerk ACLs -label.network.ACL.total=Netwerk ACL Totaal -label.network.addVM=Voeg netwerk toe aan VM -label.network.cidr=Network CIDR -label.network.desc=Netwerk Beschr. -label.network.details=netwerk details -label.network.device=Netwerk Apparaat -label.network.device.type=Netwerk Apparaat Type -label.network.domain=Netwerk Domein -label.network.domain.text=Netwerk Domein -label.network.id=Netwerk ID -label.networking.and.security=Netwerken en beveiliging -label.network.label.display.for.blank.value=Gebruik standaard gateway -label.network.limits=Netwerk limieten -label.network.name=Netwerk Naam -label.network=Netwerk -label.network.offering.details=netwerk offerte gegevens -label.network.offering.display.text=Netwerk Aanbieding Weergave Tekst -label.network.offering.id=Netwerk Aanbieding ID -label.network.offering.name=Netwerk Aanbieding Naam -label.network.offering=Netwerk Aanbieding -label.network.rate.megabytes=Netwerk Snelheid (MB/s) -label.network.rate=Netwerk Snelheid (Mb/s) -label.network.read=Netwerk gelezen -label.network.service.providers=Netwerk Service Aanbieders -label.networks=Netwerken -label.network.type=Netwerk Type -label.network.write=Netwerk geschreven -label.new=Nieuw -label.new.password=Nieuw wachtwoord -label.new.project=Nieuw Project -label.new.ssh.key.pair=nieuw SSH sleutelpaar -label.new.vm=Nieuwe VM -label.next=Volgende -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=NFS Server -label.nfs.storage=NFS Opslag -label.nic.adapter.type=NIC adapter type -label.nicira.controller.address=Controller Adres -label.nicira.l2gatewayserviceuuid=L2 gateway service UUID -label.nicira.l3gatewayserviceuuid=L3 Gateway Service Uuid -label.nicira.nvp.details=Nicira NVP details -label.nicira.transportzoneuuid=Transport Zone Uuid -label.nics=NICs -label.no.actions=Geen Beschikbare Acties -label.no.alerts=Geen Recente Waarschuwingen -label.no.data=Geen data om weer te geven -label.no.errors=Geen Recente Fouten -label.no.grouping=(Geen groepering) -label.no.isos=Geen beschikbare ISOs -label.no.items=Geen Beschikbare Items -label.no=Nee -label.none=Geen -label.no.security.groups=Geen Beschikbare Security Groups -label.not.found=Niet gevonden -label.no.thanks=Nee bedankt -label.notifications=Notificaties -label.number.of.clusters=Aantal Clusters -label.number.of.cpu.sockets=Het aantal CPU sockets -label.number.of.hosts=Aantal Hosts -label.number.of.pods=Aantal Pods -label.number.of.system.vms=Aantal Systeem VMs -label.number.of.virtual.routers=Aantal Virtual Routers -label.number.of.zones=Aantal Zones -label.num.cpu.cores=Aantal CPU Cores -label.numretries=Keren opnieuw geprorbeerd -label.ocfs2=OCFS2 -label.offer.ha=HA aanbieden -label.of.month=van de maand -label.ok=OK -label.opendaylight.controllerdetail=OpenDaylight Controller Details -label.opendaylight.controller=OpenDaylight Controller -label.opendaylight.controllers=OpenDaylight Controllers -label.openDaylight=OpenDaylight -label.operator=operator -label.optional=Optioneel -label.order=Volgorde -label.os.preference=OS Voorkeur -label.os.type=OS Type -label.other=anders -label.outofbandmanagement.action=Actie -label.outofbandmanagement.password=Wachtwoord -label.outofbandmanagement.port=Poort -label.outofbandmanagement.username=Gebruikersnaam -label.override.guest.traffic=Overschrijf Gast Verkeer -label.override.public.traffic=Overschrijf Publiek Verkeer -label.ovm3.cluster=inheems clustering -label.ovm3.pool=inheemse pooling -label.ovm3.traffic.label=OVM3 verkeer etiket -label.ovm3.vip=Master VIP IP ip -label.ovm.traffic.label=OVM verkeerslabel -label.ovs=OVS -label.owned.public.ips=Publieke IP Adressen in beheer -label.owner.account=Account Eigenaar -label.owner.domain=Domein Eigenaar -label.palo.alto.details=Palo Alto details -label.PA.log.profile=Palo Alto Log Profiel -label.PA=Palo Alto -label.parent.domain=Bovenliggend Domein -label.passive=passief -label.password.enabled=Wachtwoord Ingeschakeld -label.password.lower=wachtwoord -label.password.reset.confirm=Het wachtwoord is gereset naar -label.password=Wachtwoord -label.path=Pad -label.PA.threat.profile=Palo Alto Threat Profiel -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.persistent=Persistent -label.physical.network=Fysiek Netwerk -label.physical.network.ID=Fysiek netwerk ID -label.physical.network.name=fysieke netwerk naam -label.PING.CIFS.password=PING CIFS wachtwoord -label.PING.CIFS.username=PING CIFS gebruikersnaam -label.PING.dir=PING Directory -label.ping.path=ping pad -label.PING.storage.IP=PING opslag IP -label.planner.mode=Planner modus -label.please.complete.the.following.fields=vul alstublieft de volgende velden volledig af -label.please.specify.netscaler.info=Geef hier informatie van de Netscaler op -label.please.wait=Een ogenblik geduld a.u.b. -label.plugin.details=Plugin details -label.plugins=Plugins -label.pod.dedicated=Pod toegewijd -label.pod.name=Pod Naam -label.pod=Pod -label.pods=Pods -label.polling.interval.sec=Polling Interval (in sec) -label.portable.ip.range.details=Porteerbare IP Range details -label.portable.ip.ranges=Porteerbare IP Ranges -label.portable.ips=Porteerbare IPs -label.portable.ip=verplaatsbaar IP -label.port.forwarding.policies=Port forwarding policies -label.port.forwarding=Port Forwarding -label.port=Poort -label.port.range=Port Range -label.PreSetup=PreSetup -label.previous=Vorige -label.prev=Terug -label.primary.allocated=Primaire Opslag Gealloceerd -label.primary.network=Primair Netwerk -label.primary.storage.count=Primaire Opslag Pools -label.primary.storage.limits=Primaire Opslag limieten (GiB) -label.primary.storage=Primaire Opslag -label.primary.used=Primaire Opslag Gebruikt -label.private.Gateway=Priv\u00e9 Gateway -label.private.interface=Priv\u00e9 Interface -label.private.ip=Priv\u00e9 IP Adres -label.private.ip.range=Priv\u00e9 IP Range -label.private.ips=Priv\u00e9 IP adressen -label.privatekey=PKCS\#8 Private Key -label.private.key=priv\u00e9 sleutel -label.private.network=Priv\u00e9 Netwerk -label.private.port=Priv\u00e9 Port -label.private.zone=Priv\u00e9 Zone -label.profile=Profiel -label.project.dashboard=Project Dashboard -label.project.id=Project ID -label.project.invite=Nodig uit voor project -label.project.name=Project naam -label.project=Project -label.projects=Projecten -label.project.view=Project Weergave -label.protocol.number=protocol nummer -label.protocol=Protocol -label.provider=Provider -label.providers=Providers -label.public.interface=Publieke Interface -label.public.ip=Publiek IP Adres -label.public.ips=Publieke IP Adressen -label.public.key=publieke sleutel -label.public.lb=publieke LB -label.public.load.balancer.provider=Publieke Load Balancer Provider -label.public.network=Publiek netwerk -label.public.port=Publieke Poort -label.public=Publiek -label.public.traffic=Publiek verkeer -label.public.traffic.vswitch.name=vSwitch Publiek Verkeer Naam -label.public.traffic.vswitch.type=vSwitch Publiek Verkeer Type -label.public.zone=Publieke Zone -label.purpose=Doel -label.Pxe.server.type=PXE Server Type -label.qos.type=QoS Type -label.quickview=Sneloverzicht -label.quiesce.vm=Quiesce VM -label.quiet.time.sec=Quiet Time (in sec) -label.quota.add.credits=voeg krediet toe -label.quota.balance=balans -label.quota.configuration=quota configuratie -label.quota.configure=configureer quota -label.quota.credit=krediet -label.quota.credits=tegoeden -label.quota.date=Datum -label.quota.dates=bijwerken data -label.quota.description=quota beschrijving -label.quota.email.body=inhoud -label.quota.email.lastupdated=laatste wijziging -label.quota.email.subject=onderwerp -label.quota.email.template=e-mail sjabloon -label.quota.enddate=eind datum -label.quota.endquota=eind quota -label.quota.enforcequota=dwing quota af -label.quota.fullsummary=Alle Accounts -label.quota.minbalance=min balans -label.quota.remove=verwijder quota -label.quota.startdate=start datum -label.quota.startquota=start quota -label.quota.statement.balance=quota balans -label.quota.statement.bydates=verklaring -label.quota.statement.quota=quota gebruik -label.quota.statement.tariff=quota tarief -label.quota.statement=verklaring -label.quota.state=Staat -label.quota.summary=samenvatting -label.quota.tariff.edit=wijzig tarief -label.quota.tariff.effectivedate=effectieve datum -label.quota.tariff=tarief -label.quota.tariff.value=tarief waarde -label.quota.total=totaal -label.quota.totalusage=totaal gebruik -label.quota.type.name=gebruik type -label.quota.type.unit=gebruik eenheid -label.quota.usage=quota verbruik -label.quota.value=quota waarde -label.rbd.id=Cephx gebruiker -label.rbd.monitor=Ceph monitor -label.rbd.pool=Ceph pool -label.rbd=RBD -label.rbd.secret=Cephx secret -label.reboot=Reboot -label.recent.errors=Recente Fouten -label.recover.vm=Herstel VM -label.redundant.router.capability=Redundante router mogelijkheden -label.redundant.router=Redundante Router -label.redundant.state=Redundante staat -label.redundant.vpc=Redundante VPC -label.refresh.blades=Ververs Blades -label.refresh=Ververs -label.region.details=regio gegevens -label.regionlevelvpc=Region Level VPC -label.region=Regio -label.reinstall.vm=Herinstalleer VM -label.related=Samenhangend -label.release.account.lowercase=ontkoppel van account -label.release.account=Ontkoppel van Account -label.release.dedicated.cluster=Toegewijd Cluster loskoppelen -label.release.dedicated.host=Toegewijde Host ontkoppelen -label.release.dedicated.pod=Toegewijde Pod loskoppelen -label.release.dedicated.vlan.range=Toegewijde VLAN range ontkoppelen -label.release.dedicated.zone=Toegewijde zone ontkoppelen -label.remind.later=Herinner me later -label.remove.ACL=Verwijder ACL -label.remove.egress.rule=Verwijder uitgaande regel -label.remove.from.load.balancer=Verwijder Instantie van load balancer -label.remove.ingress.rule=Verwijder inkomende regel -label.remove.ip.range=Verwijder IP range -label.remove.ldap=Verwijder LDAP -label.remove.network.offering=Netwerk Aanbieding Verwijderen -label.remove.pf=Verwijder port forwarding regel -label.remove.project.account=Verwijder account van project -label.remove.region=Verwijder Regio -label.remove.rule=Verwijder regel -label.remove.ssh.key.pair=verwijder SSH sleutelpaar -label.remove.static.nat.rule=Verwijder static NAT regel -label.remove.static.route=Verwijder statische route -label.remove.this.physical.network=verwijder dit fysieke netwerk -label.remove.tier=Verwijder tier -label.remove.vm.from.lb=Verwijder VM van load balancer regel -label.remove.vm.load.balancer=verwijder VM uit de load balancer -label.remove.vmware.datacenter=VMware datacenter verwijderen -label.remove.vpc.offering=VPC aanbieding verwijderen -label.remove.vpc=verwijder VPC -label.removing.user=Verwijderen Gebruiker -label.removing=Verwijderen -label.reource.id=Verbruik ID -label.replace.acl.list=vervang ACL lijst -label.replace.acl=vervang ACL -label.required=Vereist -label.requires.upgrade=Upgrade Benodigd -label.reserved.ip.range=Gereserveerde IP Range -label.reserved.system.gateway=Gereseveerde systeem gateway -label.reserved.system.ip=Gereserveerd Systeem IP -label.reserved.system.netmask=Gereserveerd systeem netmask -label.reset.ssh.key.pair.on.vm=zet SSH sleutelpaar terug op VM -label.reset.ssh.key.pair=zet SSH sleutelpaar terug -label.resetVM=Reset VM -label.reset.VPN.connection=Reset VPN verbinding -label.resize.new.offering.id=Nieuwe Aanbieding -label.resize.new.size=Nieuwe grootte (GB) -label.resize.shrink.ok=Verklein OK -label.resource.limit.exceeded=resource limiet overschreden -label.resource.limits=Verbruikslimieten -label.resource.name=Verbruik Naam -label.resource.state=Verbruik staat -label.resources=Verbruiken -label.resource=Verbruik -label.response.timeout.in.sec=antwoord wachttijd (in sec) -label.restart.network=Herstart netwerk -label.restart.required=Herstart benodigd -label.restart.vpc=herstart VPC -label.restore=Herstel -label.retry.interval=Wachttijd voor nieuwe poging -label.review=Beoordeel -label.revoke.project.invite=Trek uitnodiging in -label.role=Rol -label.root.certificate=root certificaat -label.root.disk.controller=Root schijf controller -label.root.disk.offering=Root Schijf Aanbieding -label.router.vm.scaled.up=Router VM Omhoog Geschaald -label.routing.host=routeer machine -label.routing=Routing -label.rule.number=Regel Nummer -label.rules=Regels -label.running.vms=Draaiende VMs -label.s3.access_key=Toegangssleutel -label.s3.bucket=Bucket -label.s3.connection_timeout=Connectie Timeout -label.s3.endpoint=Endpoint -label.s3.max_error_retry=Max. opnieuw proberen na Fout -label.s3.nfs.path=S3 NFS Pad -label.s3.nfs.server=S3 NFS Server -label.s3.secret_key=Geheime sleutel -label.s3.socket_timeout=Socket Timeout -label.s3.use_https=Gebruik HTTPS -label.saml.enable=authoriseer SAML SSO -label.saml.entity=identificeer leverancier -label.saturday=Zaterdag -label.save.and.continue=Opslaan en verder gaan -label.save.changes=Bewaar wijzigingen -label.save=Opslaan -label.saving.processing=Opslaan.... -label.scaledown.policy=verklein beleid -label.scale.up.policy=schaal op beleid -label.scaleup.policy=vergoot beleid -label.scope=Scope -label.search=Zoeken -label.secondary.ips=Secundaire IPs -label.secondary.isolated.vlan.id=Secundair Geisoleerd VLAN ID -label.secondary.staging.store.details=Secundaire Staging Opslag details -label.secondary.staging.store=Secundaire Staging Opslag -label.secondary.storage.count=Secundaire Opslag Pools -label.secondary.storage.details=Secundaire Opslag details -label.secondary.storage.limits=Secundaire Opslag limieten (GiB) -label.secondary.storage=Secundaire Opslag -label.secondary.storage.vm=Secundaire Opslag VM -label.secondary.used=Secundaire Opslag Gebruikt -label.secret.key=Geheime sleutel -label.security.group.name=Security Group Naam -label.security.group=Security Group -label.security.groups.enabled=Security Groups Ingeschakeld -label.security.groups=Security Groups -label.select.a.template=Selecteer een template -label.select.a.zone=Selecteer een zone -label.select.instance=Selecteer een instance -label.select.instance.to.attach.volume.to=Selecteer een instance om het volume aan te koppelen -label.select.iso.or.template=Selecteer een ISO of template -label.select.offering=Selecteer Aanbieding -label.select.project=Selecteer Project -label.select.region=Select regio -label.select=Selecteer -label.select.template=Selecteer Template -label.select.tier=Selecteer Tier -label.select-view=Selecteer Weergave -label.select.vm.for.static.nat=Selecteer VM voor static NAT -label.sent=Verstuurd -label.server=Server -label.service.capabilities=Service Mogelijkheden -label.service.offering.details=dienst offerte gegevens -label.service.offering=Service Aanbieding -label.services=Diensten -label.service.state=Service Status -label.session.expired=Sessie Verlopen -label.set.default.NIC=Stel standaard NIC in -label.settings=Instellingen -label.setup=Instellen -label.setup.network=cre\u00eber netwerk -label.setup.zone=cre\u00eber zone -label.set.up.zone.type=Stel zone type in -label.shared=Gedeeld -label.SharedMountPoint=SharedMountPoint -label.show.advanced.settings=Geavaceerde instellingen weergeven -label.show.ingress.rule=Toon Inkomende Regel -label.shutdown.provider=Schakel provider uit -label.simplified.chinese.keyboard=versimpeld Chinees toetsenbord -label.site.to.site.VPN=Site-to-site VPN -label.size=Grootte -label.skip.guide=Ik heb CloudStack al eerder gebruikt, sla deze stap over -label.smb.domain=SMB Domein -label.smb.password=SMB Wachtwoord -label.smb.username=SMB Gebruikersnaam -label.snapshot.limits=Snapshot Limieten -label.snapshot.name=Snapshot Naam -label.snapshot.schedule=cre\u00eber herhaalde momentopname -label.snapshot=Snapshot -label.snapshot.s=Snapshots -label.snapshots=Snapshots -label.SNMP.community=SNMP Community -label.SNMP.port=SNMP Poort -label.sockets=CPU Sockets -label.source.ip.address=bron IP adres -label.source.nat=Source NAT -label.source.nat.supported=SourceNAT ondersteund -label.source.port=bron poort -label.specify.IP.ranges=Specificeer IP ranges -label.specify.vlan=Specificeer VLAN -label.specify.vxlan=Specificeer VXLAN -label.SR.name=SR Name-Label -label.srx.details=SRX details -label.srx=SRX -label.ssh.key.pair.details=SSH sleutelpaar gegevens -label.ssh.key.pair=SSH sleutelpaar -label.ssh.key.pairs=SSH sleutel paren -label.standard.us.keyboard=standaard (Amerikaans-US) toetsenbord -label.start.IP=Start IP -label.start.lb.vm=Start LB VM -label.start.port=Start Poort -label.start.reserved.system.IP=Start gereseveerd systeem IP -label.start.vlan=start VLAN -label.start.vxlan=start VXLAN -label.state=Staat -label.static.nat.enabled=Static NAT Ingeschakeld -label.static.nat=Static NAT -label.static.nat.to=Static NAT naar -label.static.nat.vm.details=Static NAT VM Details -label.static.routes=statische routes -label.statistics=Statistieken -label.status=Status -label.step.1=Stap 1 -label.step.1.title=Stap 1\: Selecteer een Template -label.step.2=Stap 2 -label.step.2.title=Stap 2\: Service Aanbieding -label.step.3=Stap 3 -label.step.3.title=Stap 4\: Selecteer een Schijf Aanbieding -label.step.4=Stap 4 -label.step.4.title=Stap 4\: Netwerk -label.step.5=Stap 5 -label.step.5.title=Stap 5\: Beoordeel -label.stickiness.method=kleef methode -label.stickiness=Stickiness -label.sticky.cookie-name=Cookie naam -label.sticky.domain=Domein -label.sticky.expire=Verloopt -label.sticky.holdtime=Wacht tijd -label.sticky.indirect=Indirect -label.sticky.length=Lengte -label.sticky.mode=Modus -label.sticky.name=klevende naam -label.sticky.nocache=Geen cache -label.sticky.postonly=Alleen Post -label.sticky.prefix=Prefix -label.sticky.request-learn=Request learn -label.sticky.tablesize=Tabel grootte -label.stop.lb.vm=Stop LB VM -label.stopped.vms=Uitgeschakelde VMs -label.stop=Stop -label.storage=Opslag -label.storage.pool=opslag poel -label.storage.tags=Opslag Tags -label.storage.traffic=Opslag Verkeer -label.storage.type=Opslag Type -label.subdomain.access=Subdomein Toegang -label.submitted.by=[Verstuurd door\: ] -label.submit=Verstuur -label.succeeded=Geslaagd -label.sunday=Zondag -label.super.cidr.for.guest.networks=Super CIDR voor Gast Netwerken -label.supported.services=Geondersteunde Diensten -label.supported.source.NAT.type=Ondersteunde Source NAT type -label.supportsstrechedl2subnet=Ondersteund Streched L2 Subnet -label.suspend.project=Pauzeer Project -label.switch.type=Switch Type -label.system.capacity=Systeem Capaciteit -label.system.offering.for.router=Systeem Aanbieding voor Router -label.system.offering=Systeem Aanbieding -label.system.service.offering.details=systeem dienst offerte gegevens\: -label.system.service.offering=Systeem Service Aanbieding -label.system.vm.details=Systeem VM details -label.system.vm.scaled.up=Systeem VM omhoog geschaald -label.system.vms=Systeem VMs -label.system.vm=Systeem VM -label.system.vm.type=Systeem VM type -label.system.wide.capacity=Systeembreede capaciteit -label.tagged=Tagged -label.tag.key=Tag Sleutel -label.tags=Tags -label.tag.value=Tag Waarde -label.target.iqn=Doel IQN -label.task.completed=Taak uitgevoerd -label.template.limits=Template Limieten -label.template=Template -label.TFTP.dir=TFTP Directory -label.tftp.root.directory=TFTP root directory -label.theme.default=Standaard Thema -label.theme.grey=Aangepast - Grijs -label.theme.lightblue=Aangepast - Licht Blauw -label.threshold=marge -label.thursday=Donderdag -label.tier.details=Tier details -label.tier=Tier -label.time.colon=tijd\: -label.timeout.in.second = timeout (seconden) -label.timeout=Timeout -label.time=Tijd -label.timezone.colon=tijdszone\: -label.time.zone=Tijdzone -label.timezone=Tijdzone -label.token=Token -label.total.cpu=Totaal CPU -label.total.CPU=Totaal CPU -label.total.hosts=Totaal Hosts -label.total.memory=Totaal Geheugen -label.total.of.ip=totaal aantal IP adressen -label.total.of.vm=Totaal VMs -label.total.storage=Totaal Opslag -label.total.virtual.routers=Totaal Virtual Routers -label.total.virtual.routers.upgrade=Totaal Virtueele Routers die een ugrade nodig hebben -label.total.vms=Totaal VMs -label.traffic.label=Verkeerslabel -label.traffic.types=Verkeer Types -label.traffic.type=Verkeer Type -label.tuesday=Dinsdag -label.type.id=Type ID -label.type.lower=type -label.type=Type -label.ucs=UCS -label.uk.keyboard=Brits toetsenbord -label.unavailable=Niet beschikbaar -label.unhealthy.threshold=ongezonde marge -label.unlimited=Ongelimiteerd -label.untagged=Untagged -label.update.project.resources=Update project verbruik -label.update.ssl.cert= SSL Certificaat -label.update.ssl= SSL Certificaat -label.updating=Bezig met updaten -label.upgrade.required=Upgrade is benodigd -label.upgrade.router.newer.template=Upgrade Router om nieuwe Template te gebruiken -label.upload.from.local=laad vanuit lokaal -label.upload.template.from.local=laad sjabloon vanuit lokaal -label.upload=Upload -label.upload.volume.from.local=laad volume vanuit lokaal -label.upload.volume.from.url=laad volume vanuit een webadres -label.upload.volume=Upload Volume -label.url=URL -label.usage.interface=Verbruik Interface -label.usage.sanity.result=gebruiks zingevings resultaat -label.usage.server=gebruik server -label.usage.type=gebruik type -label.usage.unit=eenheid -label.used=Gebruikt -label.user.data=Gebruiker Data -label.user.details=gebruikers gegevens -label.user=Gebruiker -label.username=Gebruikersnaam -label.username.lower=gebruikersnaam -label.users=Gebruikers -label.user.vm=gebruiker VM -label.use.vm.ip=Gebruik VM IP\: -label.use.vm.ips=Gebruik VM IPs -label.value=Waarde -label.vcdcname=vCenter DC naam -label.vcenter.cluster=vCenter Cluster -label.vcenter.datacenter=vCenter Datacenter -label.vcenter.datastore=VCenter Datastore -label.vcenter.host=vCenter Host -label.vcenter.password=vCenter Wachtwoord -label.vcenter.username=vCenter Gebruikersnaam -label.vcenter=vcenter -label.vcipaddress=vCenter IP Adres -label.version=Versie -label.vgpu.max.resolution=Maximale resolutie -label.vgpu.max.vgpu.per.gpu=vGPUs per GPU -label.vgpu.remaining.capacity=Overgebleven capaciteit -label.vgpu.type=vCPU type -label.vgpu=VGPU -label.vgpu.video.ram=Video RAM -label.view.all=Toon alle -label.view.console=Toon console -label.viewing=Weergeven -label.view.more=Toon meer -label.view.secondary.ips=Toon secundaire IPs -label.view=Toon -label.virtual.appliance.details=Virtual applicance details -label.virtual.appliances=Virtueele Appliances -label.virtual.appliance=Virtuele Appliance -label.virtual.machines=virtuele machines -label.virtual.machine=virtuele machine -label.virtual.networking=Virtual Networking -label.virtual.network=Virtueel Netwerk -label.virtual.routers.group.account=Groepeer Virtuele Routers op account -label.virtual.routers.group.cluster=Groepeer Virtuele Routers op cluster -label.virtual.routers.group.pod=Groepeer Virtuele Routers op pod -label.virtual.routers.group.zone=Groepeer Virtuele Routers op zone -label.virtual.routers=Virtuele Routers -label.virtual.router=Virtuele Router -label.vlan.id=VLAN/VNI ID -label.vlan.only=VLAN -label.vlan.range.details=VLAN Range details -label.vlan.ranges=VLAN Range(s) -label.vlan.range=VLAN/VNI Reeks -label.vlan=VLAN/VNI -label.vlan.vni.ranges=VLAN/VNI Range(s) -label.vlan.vni.range=VLAN/VNI Reeks -label.vm.add=Instantie Toevoegen -label.vm.destroy=Verwijder -label.vm.display.name=VM weergave naam -label.VMFS.datastore=VMFS datastore -label.vmfs=VMFS -label.vm.id=VM ID -label.vm.ip=VM IP adres -label.vm.name=VM naam -label.vm.password=Het wachtwoord van de VM is -label.vm.reboot=Reboot -label.VMs.in.tier=VMs in tier -label.vmsnapshot.current=isHuidige -label.vmsnapshot.memory=Snapshot geheugen -label.vmsnapshot.parentname=Bovenliggend -label.vmsnapshot.type=Type -label.vmsnapshot=VM Snapshots -label.vm.start=Start -label.vm.state=VM staat -label.vm.stop=Stop -label.vms=VMs -label.vmware.datacenter.id=VMware datacenter ID -label.vmware.datacenter.name=VMware datacenter Naam -label.vmware.datacenter.vcenter=VMware datacenter vcenter -label.vmware.traffic.label=VMware verkeerslabel -label.vnet.id=VLAN/VNI ID -label.vnet=VLAN/VNI -label.vnmc.devices=VNMC apparaten -label.vnmc=VNMC -label.volatile=Volatile -label.volgroup=Volume Groep -label.volume.details=volume gegevens -label.volume.limits=Volume Limieten -label.volume.migrated=volume gemigreerd -label.volume.name=Volume Naam -label.volumes=Volumes -label.volume=Volume -label.vpc.distributedvpcrouter=Gedistribueerde VPC Router -label.vpc.id=VPC ID -label.VPC.limits=VPC limieten -label.vpc.offering.details=VPC Aanbieding details -label.vpc.offering=VPC Aanbieding -label.vpc.router.details=VPC router details -label.VPC.router.details=VPC router details -label.vpc.supportsregionlevelvpc=Ondersteund Region Level VPC -label.vpc.virtual.router=VPC Virtueele Router -label.vpc=VPC -label.VPN.connection=VPN Connectie -label.vpn.customer.gateway=VPN Customer Gateway -label.VPN.customer.gateway=VPN Customer Gateway -label.vpn.force.encapsulation=Forceer UDP Encapsulatie van ESP Packets -label.VPN.gateway=VPN Gateway -label.vpn=VPN -label.vsmctrlvlanid=Controle VLAN ID -label.vsmpktvlanid=Pakket VLAN ID -label.vsmstoragevlanid=Opslag VLAN ID -label.vsphere.managed=vSphere beheerd -label.vswitch.name=vSwitch naam -label.vSwitch.type=vSwitch type -label.vxlan.id=VXLAN ID -label.vxlan.range=VXLAN Reeks -label.vxlan=VXLAN -label.waiting=Wachten -label.warning=waarschuwing -label.warn.upper=WAARSCHUWING -label.warn=Waarschuwing -label.wednesday=Woensdag -label.weekly=Wekelijks -label.welcome.cloud.console=Welkom op de Management Console -label.welcome=Welkom -label.what.is.cloudstack=Wat is CloudStack&\#8482? -label.xenserver.tools.version.61.plus=XenServer Tools Versie 6.1\\+ -label.Xenserver.Tools.Version61plus=XenServer Tools Versie 6.1\\+ -label.xenserver.traffic.label=XenServer verkeerslabel -label.yes=Ja -label.zone.dedicated=Zone toegewijd -label.zone.details=Zone details -label.zone.id=Zone ID -label.zone.lower=zone -label.zone.name=zone naam -label.zone.step.1.title=Stap 1\: Selecteer een Netwerk -label.zone.step.2.title=Stap 2\: Zone toevoegen -label.zone.step.3.title=Stap 3\: Pod toevoegen -label.zone.step.4.title=Step 4\: IP range toevoegen -label.zones=Zones -label.zone.type=Type Zone -label.zone.wide=Zone breed -label.zoneWizard.trafficType.guest=Gast\: Verkeer tussen virtuele machines van de eindgebruiker -label.zoneWizard.trafficType.management=Management\: Verkeer tussen CloudStack\\\\'s interne resources zoals componenten die communiceren met de Management Server zoals hosts en CloudStack systeem VMs -label.zoneWizard.trafficType.public=Publiek\: Verkeer tussen het internet en virtueele machines in de cloud. -label.zoneWizard.trafficType.storage=Opslag\: Verkeer tussen de primaire en secundaire opslag servers zoals VM templates en snapshots -label.zone=Zone -managed.state=Beheersstaat -message.acquire.ip.nic=Bevestig dat u een nieuw secundair IP voor deze netwerkkaart wilt verkrijgen. LET OP\: U dient het secundaire IP adres handmatig te configureren binnen de virtueele machine. -message.acquire.new.ip=Bevestigen dat je een nieuw IP voor dit netwerk wilt verkrijgen. -message.acquire.new.ip.vpc=Bevestig dat u een nieuw IP wilt verkrijgen voor deze VPC. -message.acquire.public.ip=Selecteer de zone waarvan u een nieuw IP wenst te verkrijgen. -message.action.cancel.maintenance=Het onderhoud voor de host is succesvol geannuleerd. Het daadwerkelijke proces kan echter enkele minuten duren. -message.action.cancel.maintenance.mode=Bevestig dat u het onderhoud wilt annuleren. -message.action.change.service.warning.for.instance=Uw instantie moet uitgeschakeld zijn voordat u de service aanbieding kunt wijzigen. -message.action.change.service.warning.for.router=Uw router moet uitgeschakeld zijn voordat u de service aanbieding kunt wijzigen. -message.action.delete.cluster=Bevestig dat u dit cluster wilt verwijderen. -message.action.delete.disk.offering=Bevestig dat u deze schijf aanbieding wilt verwijderen. -message.action.delete.domain=Bevestig dat u dit domein wilt verwijderen. -message.action.delete.external.firewall=Bevestig dat u deze externe firewall wilt verwijderen. Waarschuwing\: Als u van plan bent dezelfde firewall opnieuw toe te voegen, dient u de verbruiksstatistieken eerst te resetten. -message.action.delete.external.load.balancer=Bevestig dat u deze externe loadbalancer wilt verwijderen. Waarschuwing\: Als u van plan bent dezelfde loadbalancer opnieuw toe te voegen, dient u de verbruiksstatistieken eerst te resetten. -message.action.delete.ingress.rule=Bevestig dat u deze inkomende regel wilt verwijderen. -message.action.delete.ISO=Bevestig dat u deze ISO wilt verwijderen. -message.action.delete.ISO.for.all.zones=Deze ISO wordt gebruikt door alle zones. Bevestig dat u deze wilt verwijderen van alle zones. -message.action.delete.network=Bevestig dat u dit netwerk wilt verwijderen. -message.action.delete.nexusVswitch=Bevestig dat u deze nexus 1000v wilt verwijderen -message.action.delete.nic=Bevestig dat u deze netwerkkaart wilt verwijderen, de VM zal ontkoppeld worden van het netwerk wat aan de netwerkkaart aangesloten zit. -message.action.delete.physical.network=Bevestig dat u dit fysieke netwerk wilt verwijderen. -message.action.delete.pod=Bevestig dat u deze pod wilt verwijderen. -message.action.delete.primary.storage=Bevestig dat u deze primaire opslag wilt verwijderen. -message.action.delete.secondary.storage=Bevestig dat u deze secudaire opslag wilt verwijderen. -message.action.delete.security.group=Bevestig dat u deze security group wilt verwijderen. -message.action.delete.service.offering=Bevestig dat u deze service aanbieding wilt verwijderen. -message.action.delete.snapshot=Bevestig dat u deze snapshot wilt verwijderen. -message.action.delete.system.service.offering=Bevestig dat u deze systeem service aanbieding wilt verwijderen. -message.action.delete.template=Bevestig dat u deze template wilt verwijderen -message.action.delete.template.for.all.zones=Deze template wordt gebruikt door alle zones. Bevestig dat u deze wilt verwijderen van alle zones. -message.action.delete.volume=Bevestig dat u dit volume wilt verwijderen -message.action.delete.zone=Bevestig dat u deze zone wilt verwijderen -message.action.destroy.instance=Bevestig dat u deze instantie wilt vernietigen -message.action.destroy.systemvm=Bevestig dat u deze Systeem VM wilt vernietigen -message.action.disable.cluster=Bevestig dat u dit cluster wilt uitschakelen. -message.action.disable.nexusVswitch=Bevestig dat u deze nexus 1000v wilt uitschakelen. -message.action.disable.physical.network=Bevestig dat u dit fysieke netwerk wilt uitschakelen. -message.action.disable.pod=Bevestig dat u deze pod wilt uitschakelen. -message.action.disable.static.NAT=Bevestig dat u static NAT wilt uitschakelen. -message.action.disable.zone=Bevestig dat u deze zone wilt uitschakelen. -message.action.downloading.template=Downloaden template. -message.action.download.iso=Bevestig dat u deze ISO wilt downloaden. -message.action.download.template=Bevestig dat u deze template wilt downloaden. -message.action.enable.cluster=Bevestig dat u dit cluster wilt inschakelen. -message.action.enable.maintenance=Uw host is succesvol voorbereid op onderhoud. Het proces kan echter een paar minuten duren afhankelijk van de hoeveelheid VMs op de host. -message.action.enable.nexusVswitch=Bevestig dat u deze nexus 1000v wilt inschakelen -message.action.enable.physical.network=Bevestig dat u dit fysieke netwerk wilt inschakelen. -message.action.enable.pod=Bevestigd dat u deze pod wilt inschakelen. -message.action.enable.zone=Bevestig dat u deze zone wilt inschakelen. -message.action.expunge.instance=Bevestig dat u deze instantie wilt opruimen -message.action.force.reconnect=De host is succesvol geforceerd om opnieuw te verbinden. Dit proces kan echter enkele minuten duren. -message.action.host.enable.maintenance.mode=Het inschakelen van de onderhoudsmodus zorgt ervoor dat alle draaiende instanties worden gemigreerd naar andere beschikbare hosts. -message.action.instance.reset.password=Bevestig dat u het ROOT wachtwoord van deze virtueele machine wilt aanpassen. -message.action.manage.cluster=Bevestig dat u dit cluster wilt beheren. -message.action.primarystorage.enable.maintenance.mode=Waarschuwing\: Wanneer u de primaire opslag in onderhoudsmodus plaatst, worden alle VMs die hier gebruik van maken gestopt. Weet u zeker dat u deze actie wilt uitvoeren? -message.action.reboot.instance=Bevestig dat u deze instantie wilt herstarten. -message.action.reboot.router=Als u deze router herstarten zullen de diensten op de router verstoord worden. Weet u zeker dat u deze actie wil uitvoeren? -message.action.reboot.systemvm=Bevestig dat u deze Systeem VM wilt herstarten. -message.action.release.ip=Bevestigd dat u dit IP adres wilt los koppelen. -message.action.remove.host=Bevestig dat u deze host wilt verwijderen. -message.action.reset.password.off=Uw instantie ondersteunt deze functie momenteel niet. -message.action.reset.password.warning=Uw instantie moet gestopt worden voordat u het wachtwoord kunt wijzigen. -message.action.restore.instance=Bevestig dat u deze instantie wilt herstellen. -message.action.revert.snapshot=Bevestig dat u het volume wilt terugdraaien naar dit snapshot. -message.action.start.instance=Bevestig dat u deze instantie wilt starten. -message.action.start.router=Bevestig dat uw deze router wilt starten. -message.action.start.systemvm=Bevestig dat u deze Systeem VM wilt starten. -message.action.stop.instance=Bevestig dat u deze instantie wilt stoppen. -message.action.stop.router=Als u deze router stopt zullen de diensten die gebruik maken van de router verstoord worden. Weet u zeker dat u deze actie wil uitvoeren? -message.action.stop.systemvm=Bevestig dat u deze systeem VM wilt stoppen. -message.action.take.snapshot=Bevestig dat u een snapshot wilt maken van dit volume. -message.action.unmanage.cluster=Bevestig dat u dit cluster niet langer wilt laten beheren door CloudStack. -message.action.vmsnapshot.delete=Bevestig dat u deze VM snapshot wilt verwijderen. -message.action.vmsnapshot.revert=Draai VM snapshot terug -message.activate.project=Weet u zeker dat u dit project wilt activeren? -message.add.cluster=Voeg een hypervisor beheerd cluster toe voor zone , pod -message.add.disk.offering=Specificeer de volgende waardes om een nieuwe schijf aanbieding toe te voegen -message.add.domain=Specificeer het subdomein welke u onder dit domein wilt aanmaken -message.added.new.nuage.vsp.controller=nieuwe Nuage Vsp Controller toegevoegd -message.added.vpc.offering=VPC aanbieding toegevoegd -message.add.firewall=Voeg firewall toe aan zone -message.add.guest.network=Bevestig dat u een gast netwerk wilt toevoegen -message.add.host=Specificeer de volgende parameters om een nieuwe host toe te voegen -message.adding.host=Host toevoegen -message.adding.Netscaler.device=Netscaler toevoegen -message.adding.Netscaler.provider=Netscaler provider toevoegen -message.add.ip.range.direct.network=Voeg een IP range toe aan direct gekoppeld netwerk in zone -message.add.ip.range.to.pod=

Voeg een IP range toe aan pod\:

-message.add.ip.range=Voeg een IP range aan het publieke netwerk in de zone toe -message.additional.networks.desc=Selecteer additionele netwerk(en) waar uw virtuele instantie aan gekoppeld moet worden. -message.add.load.balancer.under.ip=De loadbalancer regel is toegeovegd onder IP adres\: -message.add.load.balancer=Voeg load balancer toe aan zone -message.add.network=Voeg nieuw netwerk toe aan zone\: -message.add.new.gateway.to.vpc=Specificeer de volgende informatie om een nieuwe gateway toe te voegen aan deze VPC. -message.add.pod.during.zone.creation=Elke zone moet \u00e9\u00e9n of meerdere pods hebben, de eerste pod gaan we nu toevoegen. Een pod bevat de hosts en primaire opslag servers welke we in een van de volgende stappen toevoegen. Allereerst dient u een reeks gereserveerde IP adressen te defini\u00ebren voor CloudStack&\#39s management verkeer. Deze gereserveerde IP reeks moet uniek zijn voor elke zone in de cloud. -message.add.pod=Voeg een nieuwe pod toe aan zone -message.add.primary=Specificeer de volgende parameters om nieuwe primaire opslag toe te voegen -message.add.primary.storage=Voeg nieuwe primaire opslag toe voor zone , pod -message.add.region=Specificeer de benodigde informatie om een nieuwe regio toe te voegen. -message.add.secondary.storage=Voeg nieuwe opslag toe voor zone -message.add.service.offering=Specificeer de volgende gegevens om een nieuwe service aanbieding aan te maken. -message.add.system.service.offering=Specificeer de volgende gegevens om een nieuwe systeem aanbieding toe te voegen. -message.add.template=Specificeer de volgende gegevens om een nieuwe template aan te maken -message.add.volume=Specificeer de volgende gegevens om een nieuw volume toe te voegen. -message.add.VPN.gateway=Bevestig dat u een VPN Gateway wilt toevoegen -message.admin.guide.read=Voor VMware-gebaseerde VMs, lees eerst de dynamic scaling sectie in de admin guide voordat u gaat schalen. Weet u zeker dat u verder wilt gaan?\\, -message.advanced.mode.desc=Kies dit netwerk model als u VLAN ondersteuning wilt inschakelen. Dit netwerk model geeft u de meeste flexibiliteit en stelt beheerders in staat om aangepaste netwerk aanbiedingen aan te maken met firewall, vpn, of load balancer ondersteuning. Ook kunt u kiezen tussen direct en virtual networking. -message.advanced.security.group=Kies dit netwerk model als u security groups wilt gebruiken om virtueele machines te isoleren. -message.advanced.virtual=Kies deze optie als u zone breede VLANs wilt gebruiken om virtueele machines te isoleren. -message.after.enable.s3=S3-backed Secondary Storage is geconfigureerd. Let op\: Als u deze pagina verlaat zult u niet in staat zijn om S3 te (her)configureren. -message.after.enable.swift=Swift is geconfigureerd. Let op\: Als u deze pagina verlaat zult u niet in staat zijn om Swift te (her)configureren. -message.alert.state.detected=Probleem status gedetecteerd -message.allow.vpn.access=Specificeer een gebruikersnaam en wachtwoord voor de gebruiker die u toegang wilt geven tot de VPN. -message.apply.snapshot.policy=De huidige snapshot policy is succesvol gewijzigd. -message.attach.iso.confirm=Bevestig dat u deze ISO wilt koppelen aan de virtuele machine. -message.attach.volume=Specificeer de volgende gegevens om een nieuw volume te koppelen. Als u een schijf volume wilt toevoegen aan een Windows gebaseerde machine, dan dient u deze te rebooten om de schijf zichtbaar te maken. -message.basic.mode.desc=Kies dit netwerk model als u *geen* VLAN ondersteuning wilt inschakelen. Alle virtuele machines onder dit netwerk model zullen direct een IP gealloceerd krijgen vanuit het netwerk en security groups kunnen gebruikt worden om beveiliging en segmentering te realiseren. -message.change.ipaddress=Bevestig alstublieft dat U het IP adres voor deze NIC op de VM wilt wijzigen. -message.change.offering.confirm=Bevestig dat u de service aanbieding van deze virtueele machine wilt wijzigen. -message.change.password=Wijzig a.u.b. uw wachtwoord. -message.cluster.dedicated=Zone toegewijd -message.cluster.dedication.released=Cluster toewijding losgekoppeld -message.configure.all.traffic.types=U heeft meerdere fysieke netwerken; Configureer labels voor elk verkeerstype door op de Wijzig knop te klikken. -message.configure.firewall.rules.allow.traffic=configureer regels om verkeer toe te staan -message.configure.firewall.rules.block.traffic=configureer regels om verkeer te blokkeren -message.configure.ldap=Bevestig dat u LDAP wilt configureren. -message.configuring.guest.traffic=Bezig met configureren guest traffic -message.configuring.physical.networks=Bezig met configureren fysieke netwerken -message.configuring.public.traffic=Bezig met configureren publiek verkeer -message.configuring.storage.traffic=Bezig met configureren opslag verkeer -message.confirm.action.force.reconnect=Bevestig dat u deze host geforceerd opnieuw wilt laten verbinden. -message.confirm.add.vnmc.provider=Bevestig dat u de VNMC provider wilt toevoegen. -message.confirm.archive.alert=Bevestig dat U deze melding wilt archiveren, alstublieft. -message.confirm.archive.event=bevestig dat u deze melding wilt archiveren, alstublieft -message.confirm.archive.selected.alerts=bevestig dat u de geselecteerde meldingen wilt archiveren, alstublieft -message.confirm.archive.selected.events=bevestig dat u de geselecteerde gebeurtenissen wilt archiveren, alstublieft -message.confirm.attach.disk=Weet U zeker dat U een disk wilt koppelen? -message.confirm.create.volume=Weet U zeker dat U een volume wilt cre\u00ebren? -message.confirm.current.guest.CIDR.unchanged=Wilt u het huidige gastnetwerk-CIDR ongewijzigd laten? -message.confirm.dedicate.cluster.domain.account=Weet u zeker dat u dit cluster wilt toewijden aan een domein/account? -message.confirm.dedicate.host.domain.account=Weet u zeker dat u deze host wilt toewijden aan een domein/account? -message.confirm.dedicate.pod.domain.account=Weet u zeker dat u deze pod wilt toewijden aan een domein/account? -message.confirm.dedicate.zone=Weet u zeker dat u deze zone wilt toewijden aan een domein/account? -message.confirm.delete.acl.list=Weet U zeker dat U dit ACL wilt verwijderen? -message.confirm.delete.alert=Weet U zeker dat U deze melding wilt verwijderen? -message.confirm.delete.baremetal.rack.configuration=Bevestig dat u de baremetal rek configuratie wilt verwijderen, alstublieft. -message.confirm.delete.BigSwitchBcf=bevestig dat u deze BigSwitch BCF Controller wilt verwijderen, alstublieft -message.confirm.delete.BrocadeVcs=bevestigd dat Brocade Vcs Switch wilt verwijderen, altublieft -message.confirm.delete.ciscoASA1000v=bevestig dat u CiscoASA100v wilt verwijderen, alstublieft -message.confirm.delete.ciscovnmc.resource=Bevestig dat u de CiscoVNMC resource wilt verwijderen. -message.confirm.delete.F5=Bevestig dat u deze F5 wilt verwijderen -message.confirm.delete.internal.lb=bevestigd dat U interne LB wilt verwijderen, alstublieft -message.confirm.delete.NetScaler=Bevestig dat u deze NetScaler wilt verwijderen -message.confirm.delete.NuageVsp=bevestig dat u Nuage Virtualized Services Directory wilt verwijderen, alstublieft -message.confirm.delete.PA=Bevestig dat u Palo Alto wilt verwijderen -message.confirm.delete.secondary.staging.store=Bevestig dat u de secudaire staging opslag wilt verwijderen. -message.confirm.delete.SRX=Bevestig dat u deze SRX wilt verwijderen -message.confirm.delete.ucs.manager=Bevestig dat u de UCS Manager wilt verwijderen -message.confirm.destroy.router=Bevestig dat u deze router wilt verwijderen -message.confirm.disable.host=bevestigd dat de machine wilt afkoppelen, alstublieft -message.confirm.disable.network.offering=Weet u zeker dat u deze netwerk aanbieding wilt uitschakelen? -message.confirm.disable.provider=Bevestig dat u deze provider wilt uitschakelen -message.confirm.disable.vnmc.provider=Bevestig dat u de VNMC provider wilt uitschakelen. -message.confirm.disable.vpc.offering=Weet u zeker dat u deze VPC aanbieding wilt uitschakelen? -message.confirm.enable.host=bevestigd dat u de machine wilt aankoppelen, alsublieft -message.confirm.enable.network.offering=Weet u het zeker dat u deze netwerk aanbieding wilt inschakelen? -message.confirm.enable.provider=Bevestig dat u deze provider wilt inschakelen -message.confirm.enable.vnmc.provider=Bevestig dat u de VNMC provider wilt inschakelen. -message.confirm.enable.vpc.offering=Weet u zeker dat u deze VPC aanbieding wilt inschakelen? -message.confirm.join.project=Bevestig dat u aan dit project wilt bijdragen -message.confirm.migrate.volume=Wilt U dit volume migreren? -message.confirm.refresh.blades=Bevestig dat u de blades wilt verversen. -message.confirm.release.dedicated.cluster=Weet u zeker dat u dit toegewijde cluster wilt loskoppelen? -message.confirm.release.dedicated.host=Weet u zeker dat u deze toegewijde host wilt loskoppelen? -message.confirm.release.dedicated.pod=Weet u zeker dat u deze toegewijde pod wilt loskoppelen? -message.confirm.release.dedicated.zone=Weet u zeker dat u deze toegewijde zone wilt loskoppelen? -message.confirm.release.dedicate.vlan.range=Bevestig dat u de toegewijde VLAN range wilt loskoppelen -message.confirm.remove.event=Weet u zeker dat u deze melding wilt verwijderen? -message.confirm.remove.IP.range=Bevestig dat u deze IP range wilt verwijderen. -message.confirm.remove.load.balancer=bevestigd dat U deze VM uit de load balancer wilt halen, alstublieft -message.confirm.remove.network.offering=Weet u zeker dat u deze netwerk aanbieding wilt verwijderen? -message.confirm.remove.selected.alerts=bevestig dat u de geselecteerde meldingen wilt verwijderen, alstublieft -message.confirm.remove.selected.events=bevestig dat u de geselcteerde gebeurtenissen wilt verwijderen, alstublieft -message.confirm.remove.vmware.datacenter=Bevestig dat u VM datacenter wilt verwijderen -message.confirm.remove.vpc.offering=Weet u zeker dat u deze VPC aanbieding wilt verwijderen? -message.confirm.replace.acl.new.one=Wilt U de ACL vervangen door een nieuwe? -message.confirm.scale.up.router.vm=Weet u zeker dat u de Router VM wilt opschalen? -message.confirm.scale.up.system.vm=Weet u zeker dat u de Systeem VM wilt opschalen? -message.confirm.shutdown.provider=Bevestig dat u deze provider wilt afsluiten -message.confirm.start.lb.vm=Bevestig dat u de LB VM wilt starten -message.confirm.stop.lb.vm=Bevestig dat u de LB VM wilt stoppen -message.confirm.upgrade.router.newer.template=Bevestig dat u de router naar een nieuwere template versie wilt upgraden -message.confirm.upgrade.routers.account.newtemplate=Bevestig dat u alle routers onder deze account wilt upgraden naar een nieuwe template -message.confirm.upgrade.routers.cluster.newtemplate=Bevestig dat u alle routers in dit cluster wilt upgraden naar een nieuwe template -message.confirm.upgrade.routers.newtemplate=Bevestig dat u alle routers in deze zone wilt upgraden naar een nieuwe template -message.confirm.upgrade.routers.pod.newtemplate=Bevestig dat u alle routers in deze pod wilt upgraden naar een nieuwe template -message.copy.iso.confirm=Bevestig dat u deze ISO wilt kopieeren naar -message.copy.template.confirm=Weet u zeker dat u de template wilt kopieeren? -message.copy.template=Kopieer template XXX van zone naar -message.create.template.vm=Maak een VM aan vanaf een template -message.create.template.volume=Specificeer a.u.b. de volgende informatie voordat u een template van het schijf volume\: . Het maken van een template kan een paar minuten duren maar ook langer afhankelijk van de grote van het volume. -message.create.template=Weet u het zeker dat u een template wilt aanmaken? -message.creating.cluster=Cluster aanmaken -message.creating.guest.network=Gast netwerk aanmaken -message.creating.physical.networks=Fysieke netwerken aanmaken -message.creating.pod=Pod aanmaken -message.creating.primary.storage=Primaire opslag aanmaken -message.creating.secondary.storage=Secundaire opslag aanmaken -message.creating.systemVM=Bezig met aanmaken van systeem VMs (dit kan enige tijd duren) -message.creating.zone=Zone aanmaken -message.decline.invitation=Weet u zeker dat u deze project uitnodiging wilt afwijzen? -message.dedicated.zone.released=Zone toewijding losgekoppeld -message.dedicate.zone=Dedicating zone -message.delete.account=Bevestig dat u deze account wilt verwijderen. -message.delete.affinity.group=Bevestig dat u deze affinity groep wilt verwijderen -message.delete.gateway=Bevestig dat u deze gateway wilt verwijderen -message.delete.project=Weet u zeker dat u dit project wilt verwijderen? -message.delete.user=Bevestig dat u deze gebruiker wilt verwijderen -message.delete.VPN.connection=Bevestig dat u deze VPN verbinding wilt verwijderen -message.delete.VPN.customer.gateway=Bevestig dat u deze VPN Customer Gateway wilt verwijderen -message.delete.VPN.gateway=Bevestig dat u deze VPN Gateway wilt verwijderen -message.desc.add.new.lb.sticky.rule=voeg een nieuwe LB klevende regel toe -message.desc.advanced.zone=Voor ingewikkeldere netwerk topologie\u00ebn. Dit netwerk model geeft de meeste flexibiliteit en het definieren van gast netwerken en het aanbieden van speciale diensten zoals firewall, VPN of loadbalancer ondersteuning. -message.desc.basic.zone=Cre\u00ebert een enkel netwerk waar elke VM instantie direct een IP op krijgt. Het isoleren van instanties kunt op layer-3 niveau doen door middel van security groups. -message.desc.cluster=Elke pod moet \u00e9\u00e9n of meerdere cluster bevatten, en we gaan het eerste cluster nu toevoegen. Een cluster is een manier om hosts te groeperen. De hosts in een cluster hebben identieke hardware, gebruiken de zelfde hypervisor, zitten op hetzelfde subnet en kunnen bij dezelfde gedeelde opslag. Elk cluster bestaan uit \u00e9\u00e9n of meerdere hosts en \u00e9\u00e9n of meerdere primaire opslag systemen. -message.desc.created.ssh.key.pair=Cre\u00eber SSH sleutelpaar. -message.desc.create.ssh.key.pair=Gelieve de volgende gegevens in te vullen voor het maken of registreren van een ssh sleutelpaar.
(1) Als de publieke sleutel wordt ingesteld zal CloudStack de publieke sleutel te registreren. Je kunt het gebruiken via uw geheime sleutel.
(2) Als de publieke sleutel niet is ingesteld zal CloudStack een nieuw SSH-sleutelpaar cre\u00ebren. In dat geval, kopi\u00ebert en slaat van de private/geheime sleutel alsutblieft op. CloudStack zal het niet bewaren.
-message.desc.host=Elke cluster moet een of meerdere hosts (servers) bevatten om gast VMs op te draaien. We gaan de eerste host nu toevoegen. Om een host met CloudStack te laten werken moet hij voorzien zijn van hypersvisor software, een werkend IP adres en in staat zijn de management server over het netwerk te bereiken.

Specificeer de DNS hostnaam of het IP adres van de host, de gebruikersnaam (meestal root) en het bijbehorende wachtwoord en als laatste eventuele labels om de host te categoriseren. -message.desc.primary.storage=Elk cluster moet over \u00e9\u00e9n of meerdere primaire opslag servers beschikken, de eerste gaan we nu aanmaken. Primaire opslag bevat de volumes van VMs draaiende op de hosts in het cluster. Gebruik een protocol dat is ondersteund door de hypervisor. -message.desc.reset.ssh.key.pair=Specificeer een sleutelpaar dat u aan deze VM wilt toevoegen, alstublieft. Let alstublieft op dat het root-wachtwoord veranderd wordt door deze operatie als wachtwoord is aangezet. -message.desc.secondary.storage=Elke zone moet minimaal \u00e9\u00e9n of meerdere secundaire opslag servers hebben, de eerste maken we nu aan. Secundaire opslag wordt gebruikt voor het opslaan van VM templates, ISO bestanden en snapshots. Deze server moet beschikbaar zijn aan alle hosts in de zone.

Specificeer het IP adres en het exporteerde pad. -message.desc.zone=Een zone is de grootste organisatorische unit binnen CloudStack en correspondeert normaliter met enkel datacenter. Zones geven fysieke isolatie en redundantie. Een zone bestaat uit een of meerdere pods (waarvan ieder eigen hosts en primaire opslag servers heeft) en een secundaire opslag server welke gedeeld wordt door alle pods in de zone. -message.detach.disk=Weet u zeker zeker dat u deze schijf wilt ontkoppelen? -message.detach.iso.confirm=Bevestig dat u deze ISO wilt ontkoppelen van de virtueele machine. -message.disable.account=Bevestig dat u deze account wilt uitschakelen. Als u deze account uitschakelt zullen de gebruikers niet langer toegang hebben tot hun cloud resources. Alle draaiende virtueele machines zullen direct afgesloten worden. -message.disable.snapshot.policy=De huidige snapshot policy is uitgeschakeld. -message.disable.user=Bevestig dat u deze gebruiker wilt uitschakelen. -message.disable.vpn.access=Bevestig dat u VPN toegang wilt uitschakelen. -message.disable.vpn=Weet u zeker dat u VPN wilt uitschakelen? -message.disabling.network.offering=Netwerk Aanbieding Uitschakelen -message.disabling.vpc.offering=VPC offering uitschakelen -message.disallowed.characters=Niet toegestane karakters\: \\<\\,\\> -message.download.ISO=Klik op 00000 om de ISO te downloaden -message.download.template=Klik op 00000 om de template te downloaden -message.download.volume.confirm=bevestigd at U dit volume wilt ophalen, alstublieft -message.download.volume=Klik op 00000 om het volume te downloaden -message.edit.account=Wijzig ("-1" geeft aan dat er geen limiet is ingesteld) -message.edit.confirm=Bevestig u veranderingen voor u op "bewaar" klikt, alstublieft. -message.edit.limits=Specificeer de limieten voor de volgende resources. Met "-1" geeft u aan dat er geen limiet geld. -message.edit.traffic.type=Specificeer het verkeerslabel dat u met dit type verkeer wilt associeren. -message.enable.account=Bevestig dat u deze account wilt inschakelen. -message.enabled.vpn.ip.sec=Uw IPSec pre-shared key is -message.enabled.vpn=Uw VPN toegang is ingeschakeld en kan benaderd worden via het IP -message.enable.user=Bevestig dat u deze gebruiker wilt inschakelen. -message.enable.vpn.access=VPN is momenteel uitgeschakeld voor dit IP adres. Wilt u deze inschakelen? -message.enable.vpn=Bevestig dat u VPN toegang voor dit IP adres wilt inschakelen. -message.enabling.network.offering=Netwerk Aanbieding Inschakelen -message.enabling.security.group.provider=Inschakelen Security Group provider -message.enabling.vpc.offering=VPC aanbieding inschakelen -message.enabling.zone.dots=Bezig met activeren van Zone.... -message.enabling.zone=Inschakelen zone -message.enter.seperated.list.multiple.cidrs=Gelieve een met komma\\'s gescheiden lijst van CIDRs invoeren wanneer er meer dan een zijn -message.enter.token=Vul het token in dat vermeld staat in de e-mail uitnodiging. -message.generate.keys=Bevestig dat u nieuwe sleutels wilt genereren voor deze gebruiker. -message.gslb.delete.confirm=Bevestigd dat u deze GSLB wilt verwijderen -message.gslb.lb.remove.confirm=Bevestig dat u loadbalancing van GSLB wilt verwijderen -message.guest.traffic.in.advanced.zone=Gast netwerk verkeer is communicatie tussen virtuele machines van de eindgebruiker. Specificeer een range van VLAN IDs om gast verkeer te transporteren over het fysieke netwerk. -message.guest.traffic.in.basic.zone=Gast netwerk verkeer is communicatie tussen virtuele machines van de eindgebruiker. Specificeer een range van IP adressen welke CloudStack kan uitdelen aan gast VMs. Let erop dat deze range niet overlapt met de gereserveerde systeem IP range. -message.host.dedicated=Host toegewijd -message.host.dedication.released=Toegewijde host losgekoppeld -message.installWizard.click.retry=Druk op de knop om de lancering opnieuw te proberen -message.installWizard.copy.whatIsACluster=Een cluster is een manier om hosts te groeperen. De hosts in een cluster hebben ieder identieke hardware, draaien dezelfde hypervisor, zitten op hetzelfde subnet en kunnen dezelfde gedeelde opslag benaderen. Virtuele machines (VMs) kunnen live gemigreerd worden van tot ene naar de andere host in hetzelfde cluster zonder dat de gebruiker hier iets van merkt. Een cluster is de 3e grootste organisatorische unit binnen Cloudstack&\#8482;. Clusters worden ondergebracht in pods, en pods zijn op hun beurt ondergebracht in zones. CloudStack&\#8482; biedt te mogelijkheid tot meerdere clusters, maar voor een basis installatie hebben we maar \u00e9\u00e9n cluster nodig. -message.installWizard.copy.whatIsAHost=Een host een opzichzelfstaande computer. Hosts verzorgen de resources nodig om de gast virtuele machines te draaien. Elke host heeft eigen hypervisor software geinstalleerd om de virtuele machines erop te beheren (Afgezien van bare metal hosts, hierover is meer te vinden in de geavanceerde installatie handleiding). Om een paar voorbeelden te noemen\: een Linux server met KVM, een server met Citrix XenServer en servers met ESXi geinstalleerd zijn hosts. Bij de basis installatie gebruiken we een opzichzelfstaande host met XenServer of KVM geinstalleerd.

Een host is de kleinste organisatorische unit binnen een CloudStack&\#8482; omgeving. Hosts worden ondergebracht in clusters, cluster zijn ondergebracht in pods en pods zijn ongebracht in zones. -message.installWizard.copy.whatIsAPod=Een pod vertegenwoordigd meestal een rack. Hosts in dezelfde pod hebben hetzelfde subnet.

Een pod is de tweede grootste organisatorische unit binnen een CloudStack&\#8482; omgeving. Pods zijn ondergebracht in zones. Elke zone kan meerdere pods hebben, voor de basis installatie hebben we een enkele pod in de zone. -message.installWizard.copy.whatIsAZone=Een zone is de grootste organisatorische unit binnen een CloudStack&\#8482; omgeving. Een zone staat meestal voor een datacenter, al is het geen probleem om meerdere zones in hetzelfde datacenter te hebben. Het voordeel van infrastructuur onderbrengen in zones is om fysieke isolatie en redundantie te cre\u00ebren. Elke zone kan bijvoorbeeld zijn eigen stroom voorziening en netwerk uplinks hebben en kunnen geografisch verspreid worden (al is dit geen vereiste). -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482; is een software platform welke computer capaciteit herenigd om public, private en hybrid infrastructure as a Service (IaaS) clouds te bouwen. CloudStack&\#8482; beheert het netwerk, de opslag en de computer nodes welke de cloud infrastructuur vertegenwoordigen. Gebruik CloudStack&\#8482; om cloud computing omgevingen uit te rollen, te beheren en te configureren.

CloudStack&\#8482 gaat veel verder dan het draaien van virtuele machine bestanden op commodity hardware, het is een turnkey oplossing om virtuele datacenters (as a service) te realiseren. Daarbij levert het alle essenti\u00eble componenten om multi-tier en multi-tentant cloud applicaties te bouwen en te beheren. Er is een zowel een open-source als Premium versie beschikbaar, waarbij de open-source versie nagenoeg dezelfde functionaliteit biedt als de Premium versie. -message.installWizard.copy.whatIsPrimaryStorage=Een CloudStack&\#8482; cloud infrastructuur maakt gebruik van 2 type opslag, namelijk primaire en secundaire opslag. Primaire opslag kan iSCSI, NFS of lokale opslag zijn. Secundaire opslag werkt via NFS of een S3-compatible opslag systeem.

Primaire opslag is onderdeel van een cluster, en het bevat de schijf volumes van iedere gast VM in dat cluster. De primaire opslag server wordt meestal dicht bij de hosts geplaatst. -message.installWizard.copy.whatIsSecondaryStorage=Secundaire opslag is onderdeel van een zone, en biedt opslagruimte aan\:
  • Templates - kant-en-klare VMs die gebruikt kunnen worden zonder voorafgaande installatie.
  • ISO bestanden - Installatie mediums voor VMs.
  • Schijf volume snapshots - reservekopie\u00ebn van schijf volumes die later gebruikt kunnen worden tijdens recovery of het maken van nieuwe templates.
-message.installWizard.now.building=Bezig met het bouwen van je cloud... -message.installWizard.tooltip.addCluster.name=Een naam voor het cluster. U kunt deze tekst vrij invullen, en zal verder niet gebruikt worden door CloudStack. -message.installWizard.tooltip.addHost.hostname=De DNS naam of het IP adres van de host. -message.installWizard.tooltip.addHost.password=Dit is het wachtwoord voor de gebruiker die hierboven genoemd wordt (van uw Xenserver instllatie). -message.installWizard.tooltip.addHost.username=Meestal root. -message.installWizard.tooltip.addPod.name=Een naam voor de pod -message.installWizard.tooltip.addPod.reservedSystemEndIp=Dit is de IP range van het private netwerk dat CloudStack gebruikt om met Secundaire Opslag VMs en Console Proxy VMs te communiceren. Deze IP adressen komen uit hetzelfde subnet als de gast VMs. -message.installWizard.tooltip.addPod.reservedSystemGateway=De gateway voor de hosts in die pod. -message.installWizard.tooltip.addPod.reservedSystemNetmask=De netmask die gebruikt wordt op het subnet dat de gast VMs gaan gebruiken. -message.installWizard.tooltip.addPod.reservedSystemStartIp=Dit is de IP range van het private netwerk dat CloudStack gebruikt om met Secundaire Opslag VMs en Console Proxy VMs te communiceren. Deze IP adressen komen uit hetzelfde subnet als de gast VMs. -message.installWizard.tooltip.addPrimaryStorage.name=De naam voor het opslag apparaat. -message.installWizard.tooltip.addPrimaryStorage.path=(Voor NFS) Bij NFS dit is het ge\u00ebxporteerde pad van de server. Pad (Voor SharedMountPoint). Bij KVM is dit het pad waar op elke machine de primaire opslag is gekoppeld. Bijvoorbeeld, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(Voor NFS, iSCSI of PreSetup) Het IP adres of DNS naam van het opslag apparaat. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=Het IP adres van de NFS server welke de secundaire opslag serveert -message.installWizard.tooltip.addSecondaryStorage.path=Het ge\u00ebxporteerde pad, op de server die u hierboven heeft gespecificeerd -message.installWizard.tooltip.addZone.dns1=Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het publieke netwerk wat we later gaan toevoegen. De publieke IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld. -message.installWizard.tooltip.addZone.dns2=Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het publieke netwerk wat we later gaan toevoegen. De publieke IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld. -message.installWizard.tooltip.addZone.internaldns1=Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het private netwerk wat we later gaan toevoegen. De private IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld. -message.installWizard.tooltip.addZone.internaldns2=Deze DNS servers worden gebruik door gast VMs in de Zone. Deze DNS servers moeten toegankelijk zijn op het private netwerk wat we later gaan toevoegen. De private IP adressen voor de zone moeten een route hebben naar de DNS server hier vermeld. -message.installWizard.tooltip.addZone.name=Een naam voor de zone -message.installWizard.tooltip.configureGuestTraffic.description=Een beschrijving voor het netwerk -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=De IP reeks welke beschikbaar zal zijn voor gast VMs in de zone. Als \u00e9\u00e9n NIC gebruikt wordt, zouden deze IP adressen in hetzelfde CIDR moeten vallen als die van de pod. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=De gateway welke gast VMs moeten gebruiken -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=De netmask die gebruikt wordt op het subnet dat door gast VMs gebruikt wordt -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=De IP reeks welke beschikbaar zal zijn voor gast VMs in de zone. Als \u00e9\u00e9n NIC gebruikt wordt, zouden deze IP adressen in hetzelfde CIDR moeten vallen als die van de pod. -message.installWizard.tooltip.configureGuestTraffic.name=Een naam voor het netwerk -message.instance.scaled.up.confirm=Weet u zeker dat u deze VM wilt opschalen? -message.instanceWizard.noTemplates=Er zijn geen templates beschikbaar. Voeg een geschikte template toe, en herstart deze instantie wizard. -message.ip.address.changed=Uw IP adres is mogelijk gewijzigd, wilt u de lijst verversen? Wanneer dit het geval is, zal het detail paneel gesloten worden. -message.iso.desc=Image bestand met data of bootable media voor besturingsysteem -message.join.project=U neemt nu deel aan een project. Klik op het project overzicht om het project te zien. -message.launch.vm.on.private.network=Wilt u de instantie starten op uw eigen private dedicated netwerk? -message.launch.zone=De zone is klaar om geactiveerd te worden, ga door naar de volgende stap. -message.ldap.group.import=Alle gebruikers uit de gegeven groep worden ge\u00efmporteerd -message.link.domain.to.ldap=schakel autosync voor dit domein in LDAP in -message.listView.subselect.multi=(Ctrl/Cmd-click) -message.lock.account=Bevestig dat u deze account wilt vergrendelen. Wanneer u de account vergrendeld zullen alle gebruikers van deze account hun cloud resources niet meer kunnen beheren. Toegang tot bestaande producten blijft bestaan. -message.migrate.instance.confirm=Bevestig de host naar waar u de instantie toe wilt migreren. -message.migrate.instance.to.host=Bevestig dat u de instantie naar een andere host toe wilt migreren. -message.migrate.instance.to.ps=Bevestig dat u de instantie naar een andere primaire opslag toe wilt migreren. -message.migrate.router.confirm=Bevestig de host waar u de router naartoe wilt migreren\: -message.migrate.systemvm.confirm=Bevestig de host naar waar u de systeem VM toe wilt migreren\: -message.migrate.volume=Bevestig dat u het volume wilt migreren naar een andere primaire opslag. -message.network.addVM.desc=Specificeer het netwerk dat u aan deze VM wilt toevoegen. Een nieuwe netwerk interface zal worden toegevoegd aan de VM. -message.network.addVMNIC=Bevestig dat u een nieuwe netwerk interface voor dit netwerk wilt verkrijgen. -message.network.remote.access.vpn.configuration=VPN configuratie op afstand is gegenereerd, maar kon niet worden doorgevoerd. Controleer alstublieft de verbinding met het netwerk bestanddeel en probeer opnieuw. -message.new.user=Sepecificeer de volgende waarden om een nieuwe gebruiker toe te voegen aan de account -message.no.affinity.groups=U heeft geen affinity groepen. Ga door naar de volgende stap. -message.no.host.available=Geen hosts beschikbaar voor Migratie -message.no.network.support.configuration.not.true=Er is geen zone waarin security groups zijn ingeschakeld. Om die reden zijn er geen additionele netwerk diensten beschikbaar. Ga door naar stap 5. -message.no.network.support=De geselecteerde hypervisor, vSphere, beschikt niet over additionele netwerk diensten. Ga door naar stap 5. -message.no.projects.adminOnly=U hebt momenteel geen projecten.
Uw beheerder kan een nieuw project aanmaken. -message.no.projects=U hebt momenteel geen projecten.
U kunt een nieuw project aanmaken vanuit de projecten sectie. -message.number.clusters=

Aantal Clusters

-message.number.hosts=

Aantal Hosts

-message.number.pods=

Aantal Pods

-message.number.storage=

Aantal Primaire Opslag Volumes

-message.number.zones=

Aantal Zones

-message.password.has.been.reset.to=Het wachtwoord is veranderd in -message.password.of.the.vm.has.been.reset.to=Het wachtwoord van de VM is veranderd in -message.pending.projects.1=U heeft openstaande project uitnodigigingen\: -message.pending.projects.2=Ga naar de project sectie om deze te zien. Selecteer de uitnodiging vanuit het drop-down menu. -message.please.add.at.lease.one.traffic.range=U dient minimaal \u00e9\u00e9n traffic range toe te voegen. -message.please.confirm.remove.ssh.key.pair=bevestig dat u dit SSH sleutelpaar wilt verwijderen, alstublieft -message.please.proceed=Ga door naar de volgende stap. -message.please.select.a.configuration.for.your.zone=Selecteer een configuratie voor uw zone. -message.please.select.a.different.public.and.management.network.before.removing=Selecteer a.u.b. een ander publiek en beheer netwerk voordat u deze verwijderd -message.please.select.networks=Selecteer netwerken voor uw virtuele machine. -message.please.select.ssh.key.pair.use.with.this.vm=selecteer alstublieft een ssh sleutelpaar dat U met deze VM wilt gebruiken\: -message.please.wait.while.zone.is.being.created=Even geduld, uw zone wordt aangemaakt; Dit kan enige tijd duren... -message.pod.dedication.released=Toegewijde pod losgekoppeld -message.portable.ip.delete.confirm=Bevestig dat u deze porteerbare IP reeks wilt verwijderen -message.project.invite.sent=Uitnodiging is verstuurd aan gebruiker. De gebruiker wordt toegevoegd aan het project wanneer hij de uitnodiging accepteert. -message.public.traffic.in.advanced.zone=Publiek verkeer wordt gegenereerd wanneer VMs in de cloud het internet bezoeken. Publiek toegankelijke IPs moeten om deze reden toegevoegd worden. Eindgebruikers kunnen deze IP adressen via de Cloudstack UI aanvragen om zo verkeer tussen het gast netwerk en publieke netwerk te realiseren.

Geef minimaal \u00e9\u00e9n IP range op voor internet verkeer. -message.public.traffic.in.basic.zone=Publiek verkeer wordt gegenereerd wanneer VMs in de cloud het internet bezoeken of diensten serveren aan het internet. Publiek toegankelijke IPs moeten om deze reden toegevoegd worden. Wanneer een instantie wordt aangemaakt, krijgt deze automatisch een van deze IP adressen toegewezen naast het gast IP adres. Static 1-1 NAT wordt automatisch geconfigureerd tussen het publieke IP en gast IP adres. Eindgebruikers kunnen via de CloudStack UI meerdere IP adressen aanvragen om static NAT tussen hun instanties en het publieke IP te realiseren. -message.question.are.you.sure.you.want.to.add=Weet U zeker dat U het volgende wenst toe te voegen -message.read.admin.guide.scaling.up=Gelieve de dynamic scaling sectie te lezen in admin guide voordat u gaat opschalen. -message.recover.vm=Bevestig dat u deze VM wilt herstellen. -message.redirecting.region=U wordt doorverbonden met de regio... -message.reinstall.vm=LET OP\: Als u doorgaat zal de VM opnieuw ge\u00efnstalleerd worden vanaf de template. Alle data op de root disk zal verwijderd worden. Eventuele data volumes blijven onaangeraakt. -message.removed.ssh.key.pair=een ssh sleutelpaar is verwijderd -message.remove.ldap=Weet u zeker dat u de LDAP configuratie wilt verwijderen? -message.remove.region=Weet u zeker dat u deze regio wilt verwijderen van deze management server? -message.remove.vpc=Bevestigd dat u de VPC wilt verwijderen -message.remove.vpn.access=Bevestig dat u VPN toegang wilt verwijderen van de volgende gebruiker. -message.reset.password.warning.notPasswordEnabled=De template van deze instantie was aangemaakt zonder wachtwoord functie -message.reset.password.warning.notStopped=Uw instantie moet gestopt worden voordat u het wachtwoord kunt wijzigen. -message.reset.VPN.connection=Bevestig dat u deze VPN verbinding wilt resetten -message.restart.mgmt.server=Gelieve uw management server(s) herstarten om deze wijziging actief te maken. -message.restart.mgmt.usage.server=Gelieve uw management server(s) en gebruik server(s) herstarten om deze wijziging actief te maken. -message.restart.network=Als u dit netwerk herstart zullen de diensten op het netwerk verstoord worden. Weet u zeker dat u deze actie wil uitvoeren? -message.restart.vpc=Bevestig dat u deze VPC wilt herstarten -message.restart.vpc.remark=Bevestig altublieft dat U de VPC wilt herstarten

Opmerking\: Een niet-redundante VPC redundant maken zal opschonen forceren. De netwerken zullen enige tijd niet beschikbaar zijn.

-message.restoreVM=Wilt u de VM herstellen? -message.security.group.usage=(Gebruik Ctrl-klik om meerdere security groups te selecteren) -message.select.affinity.groups=Selecteer welke affinity groepen u wilt gebruiken voor deze VM\: -message.select.a.zone=Een zone correspondeert meestal met een enkel datacenter. Meerdere zones maken de cloud betrouwbaarder door fysiek isolatie en redunatie te verzorgen. -message.select.instance=Selecteer een instantie. -message.select.iso=Gelieve een ISO te selecteren voor uw nieuwe instantie. -message.select.item=Gelieve een item te selecteren. -message.select.security.groups=Gelieve security group(s) te selecteren voor de nieuwe instantie -message.select.template=Gelieve een template te selecteren voor de nieuwe instantie -message.select.tier=Gelieve een tier te selecteren -message.set.default.NIC=Bevestig dat u dit netwerk apparaat standaard wilt maken voor deze VM. -message.set.default.NIC.manual=U dient nu manueel de netwerk interface op de VM updaten. -message.setup.physical.network.during.zone.creation.basic=Wanneer u een basis zone toevoegt bevat deze een fysiek netwerk welke correspondeert met de netwerkkaart op de hypervisor. Op dit netwerk zullen meerdere verkeerstypen gebruikt worden.

U kunt via drag & drop andere verkeerstypen toevoegen aan het fysieke netwerk. -message.setup.physical.network.during.zone.creation=Wanneer u een geavanceerde zone toevoegt, dient u meerdere fysiek netwerken te configureren. Een netwerk correspondeert met een netwerkkaart op de hypervisor. Elk fysiek netwerk kan een of meerdere traffic types bevatten, met bepaald geldende restricties hoe deze gecombineerd mogen worden. Drag & Drop een of meerdere verkeerstypen op het fysieke netwerk. -message.setup.successful=Cloud installatie is succesvol verlopen\! -message.snapshot.schedule=U kunt terugkerende momentopname plannen maken door uit de onderstaande mogelijkheden te kiezen en uw beleid voorkeuren toe te passen. -message.specifiy.tag.key.value=Gelieve een tag sleutel en waarde te specificeren -message.specify.url=Gelieve een URL te specificeren -message.step.1.continue=Gelieve een template of ISO te selecteren om door te gaan -message.step.1.desc=Selecteer een template voor uw nieuwe instantie. U kunt ook een blanco template selecteren op welke een ISO bestand geinstalleerd kan worden. -message.step.2.continue=Selecteer een service aanbieding om verder te gaan. -message.step.3.continue=Selecteer een schijf aanbieding om verder te gaan -message.step.4.continue=Selecteer minimaal \u00e9\u00e9n netwerk om door te gaan -message.step.4.desc=Selecteer het primaire netwerk aan welke uw instantie verbonden moet worden -message.storage.traffic=Verkeer tussen CloudStack&\#39s interne diensten, inclusief componenten die communiceren met de management server zoals hosts en CloudStack systeem VMs. Configureer opslag verkeer hier. -message.suspend.project=Weet u zeker dat u dit project wilt pauzeren? -message.systems.vms.ready=Systeem VMs klaar. -message.template.copying=De template wordt gekopieerd. -message.template.desc=OS image bestand dat gebruikt kan worden om de VM op te starten -message.tier.required=Tier is benodigd -message.tooltip.dns.1=Naam van de DNS server die gebruikt mag worden door VMs in de zone. De publieke IP adressen in de zone moeten een route hebben naar deze server. -message.tooltip.dns.2=Naam van een secudaire DNS server die gebruikt mag worden door VMs in de zone. De publieke IP adressen in de zone moeten een route hebben naar deze server. -message.tooltip.internal.dns.1=Naam van de DNS server die gebruikt mag worden door interne systeem VMs van CloudStack in de zone. De priv\u00e9 IP adressen in de pod moeten een route hebben naar deze server. -message.tooltip.internal.dns.2=Naam van de DNS server die gebruikt mag worden door interne systeem VMs van CloudStack in de zone. De priv\u00e9 IP adressen in de pod moeten een route hebben naar deze server. -message.tooltip.network.domain=Een DNS toevoeging dat de domeinnaam zal zijn voor het netwerk wat toegangkelijk is voor gast VMs. -message.tooltip.pod.name=Een naam voor deze pod. -message.tooltip.reserved.system.gateway=De gateway voor hosts in deze pod. -message.tooltip.reserved.system.netmask=De netwerk prefix dat het pod subnet definieert. Gebruik de CIDR notatie. -message.tooltip.zone.name=Een naam voor de zone. -message.update.os.preference=Selecteer een OS voorkeur voor deze host. Alle virtueel instanties van gelijke voorkeur zullen eerst op deze machine gealloceerd worden voordat er gekeken wordt naar andere hosts. -message.update.resource.count=Bevestig dat u de verbruiksstatistieken voor deze account wilt bijwerken. -message.update.ssl.failed=update SSL certificaat is mislukt -message.update.ssl=Geef een nieuw X.509 compliant SSL certificaat in waarmee elke console proxy en secundaire opslag instantie mee geupdate kunnen worden\: -message.update.ssl.succeeded=update SSL certificaat is gelukt -message.validate.accept=Gelieve een waarde in te geven met een geldidge extensie. -message.validate.creditcard=Gelieve een geldig credit card nummer in te geven. -message.validate.date=Gelieve een geldige datum in te geven. -message.validate.date.ISO=Gelieve een geldige datum (ISO) in te geven. -message.validate.digits=Gelieve alleen cijfers in te geven. -message.validate.email.address=Gelieve een geldig email adres in te geven. -message.validate.equalto=Voer dezelfde waarde nogmaals in. -message.validate.fieldrequired=Dit veld is vereist -message.validate.fixfield=Gelieve dit veld te herstellen. -message.validate.instance.name=Namen van instantie kunnen niet langer zijn dan 63 karakters. Alleen ASCII letters a~z, A~Z, cijfers 0~9 zijn toegestaan. Moet beginnen met een letter en mag eindigen met een letter of cijfer. -message.validate.invalid.characters=Niet toegestane karakters gevonden, corrigeer deze. -message.validate.max=Gelieve een waarde kleiner of gelijk aan {0} in te geven. -message.validate.maxlength=Gelieve niet meer dan {0} karakters in te geven. -message.validate.minlength=Gelieve minimaal {0} karakters in te geven. -message.validate.number=Gelieve een geldig nummer in te geven. -message.validate.range=Gelieve een waarde tussen {0} en {1} in te geven. -message.validate.range.length=Gelieve een waarde tussen de {0} en {1} karakters lang in te geven. -message.validate.URL=Gelieve een geldige URL in te geven. -message.virtual.network.desc=Een dedicated gevirtualiseerd netwerk voor uw account. Het broadcast domein is ingesloten binnen een VLAN en toegang naar het publieke netwerk wordt gerouteerd door een virtueele router. -message.vm.create.template.confirm=Creer een template welke de VM atuomatisch laat opstarten. -message.vm.review.launch=Gelieve de volgende gegevens te verifi\u00ebren te bevestigen zodat uw instantie gestart kan worden. -message.vnmc.available.list=VNMC is niet beschikbaar van de provider lijst. -message.vnmc.not.available.list=VNMC is niet beschikbaar van de provider lijst. -message.volume.create.template.confirm=Bevestig dat u een template wilt maken van dit schijf volume. Het maken van een template kan meerdere minuten duren maar soms ook langer afhankelijk van de grootte van het volume. -message.waiting.for.builtin.templates.to.load=Wachten totdat ingebouwde templates zijn geladen... -message.XSTools61plus.update.failed=Kon XenServer Tools Version 6.1\\+ field niet updaten. Fout\: -message.you.must.have.at.least.one.physical.network=U moet minimaal \u00e9\u00e9n fysiek netwerk hebben -message.your.cloudstack.is.ready=Uw CloudStack is klaar\! -message.Zone.creation.complete=De installatie van de zone is compleet -message.zone.creation.complete.would.you.like.to.enable.this.zone=De installatie van de zone is compleet, wilt u deze zone meteen inschakelen? -message.zone.no.network.selection=De geselecteerde zone heeft geen meerdere netwerk selectie mogelijkheden. -message.zone.step.1.desc=Selecteer een netwerk model voor uw zone. -message.zone.step.2.desc=Specificeer de volgende gegevens om een nieuwe zone toe te voegen -message.zone.step.3.desc=Specificeer de volgende gegevens om een nieuwe pod toe te voegen -message.zoneWizard.enable.local.storage=WAARSCHUWING\: Als u lokale opslag activeert voor deze zone, moet u de volgende stappen ondernemen afhankelijk van het opslagsysteem waar u de systeem VMs vanaf wilt starten\:

1. Wanneer de systeem VMs gestart moeten worden van primaire (gedeelde) opslag moet deze nadat configuratie van de zone klaar is, toegevoegd worden.

2. Wanneer de systeem VMs gestart moeten worden vanaf lokale opslag, dient de parameter system.vm.use.local.storage gezet zijn voordat u de zone activeert.


Weet u zeker dat u verder wilt gaan? -messgae.validate.min=Gelieve een waarde groter of gelijk aan {0} in te geven. -mode=Modus -network.rate=Netwerk Snelheid -notification.reboot.instance=Herstart instantie -notification.start.instance=Start Instantie -notification.stop.instance=Stop Instantie -side.by.side=Zij aan Zij -state.Accepted=Geaccepteerd -state.Active=Actief -state.Allocated=Gebruikt -state.Allocating=Alloceren -state.BackedUp=Geback-upt -state.BackingUp=Back-uppen -state.Completed=Uitgevoerd -state.Creating=Aanmaken -state.Declined=Geweigerd -state.Destroyed=Verwijderd -state.detached=ontkoppeld -state.Disabled=Uitgeschakeld -state.Enabled=Geactiveerd -state.Error=Fout -state.Expunging=Opruimen -state.Migrating=MIgreren -state.Pending=In afwachting -state.Ready=Klaar -state.Running=Draaiend -state.Starting=Starten -state.Stopped=Gestopt -state.Stopping=Stoppen -state.Suspended=Gepauzeerd -title.upload.volume=laad volume -ui.listView.filters.all=Alle -ui.listView.filters.mine=Eigen diff --git a/client/WEB-INF/classes/resources/messages_pl.properties b/client/WEB-INF/classes/resources/messages_pl.properties deleted file mode 100644 index be5ca74f2adc..000000000000 --- a/client/WEB-INF/classes/resources/messages_pl.properties +++ /dev/null @@ -1,484 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -error.invalid.username.password=B\u0142\u0119dna nazwa u\u017cytkownika lub has\u0142o -label.account.id=ID konta -label.account=Konto -label.account.name=Nazwa konta -label.accounts=Konta -label.action.attach.disk=Dodaj dysk -label.action.attach.disk.processing=Dodawanie dysku -label.action.attach.iso=Dodaj obraz ISO -label.action.attach.iso.processing=Dodawanie obrazu ISO -label.action.change.password=Zmie\u0144 has\u0142o -label.action.copy.ISO=Kopiuj ISO -label.action.copy.template=Kopij szablon -label.action.create.template.from.vm=Utw\u00f3rz szablon z VM -label.action.create.template.from.volume=Utw\u00f3rz Szablon z wolumenu -label.action.create.template.processing=Tworz\u0119 szablon -label.action.create.template=Utw\u00f3rz szablon -label.action.create.vm.processing=Tworz\u0119 VM.... -label.action.create.vm=Utw\u00f3rz VM -label.action.create.volume.processing=Tworz\u0119 wolumen.... -label.action.create.volume=Utw\u00f3rz wolumen -label.action.delete.account.processing=Usuwanie dost\u0119pu.... -label.action.delete.account=Usu\u0144 dost\u0119p -label.action.delete.cluster.processing=Usuwam klaster.... -label.action.delete.cluster=Usu\u0144 klaster -label.action.delete.domain.processing=Usuwam domen\u0119.... -label.action.delete.domain=Usu\u0144 domen\u0119 -label.action.delete.firewall.processing=Usuwam Firewall -label.action.delete.firewall=Usu\u0144 regu\u0142\u0119 Firewall -label.action.delete.ISO.processing=Usuwam ISO.... -label.action.delete.ISO=Usu\u0144 ISO -label.action.delete.network.processing=Usuwam sie\u0107.... -label.action.delete.network=Usu\u0144 sie\u0107 -label.action.delete.nexusVswitch=Usu\u0144 Nexus 1000v -label.action.delete.physical.network=Usu\u0144 fizyczn\u0105 sie\u0107 -label.action.delete.user.processing=Usuwam u\u017cytkownika.... -label.action.delete.user=Usu\u0144 u\u017cytkownika -label.action.delete.volume.processing=Usuwam wolumen.... -label.action.delete.volume=Usu\u0144 wolumen -label.action.delete.zone.processing=Usuwam stref\u0119.... -label.action.delete.zone=Usu\u0144 stref\u0119 -label.action.destroy.instance.processing=Usuwam instancj\u0119 -label.action.destroy.instance=Usu\u0144 instancj\u0119 -label.action.detach.disk=Od\u0142\u0105cz dysk -label.action.detach.disk.processing=Od\u0142\u0105czanie dysku.... -label.action.detach.iso=Od\u0142\u0105cz obraz ISO -label.action.detach.iso.processing=Od\u0142\u0105czanie obrazu ISO -label.action.disable.account.processing=Wy\u0142\u0105czam dost\u0119p.... -label.action.disable.account=Wy\u0142\u0105cz dost\u0119p -label.action.disable.cluster.processing=Wy\u0142\u0105czam klaster.... -label.action.disable.cluster=Wy\u0142\u0105cz klaster -label.action.disable.nexusVswitch=Wy\u0142\u0105cz Nexus 1000v -label.action.disable.physical.network=Wy\u0142\u0105cz fizyczn\u0105 sie\u0107 -label.action.disable.user.processing=Wy\u0142\u0105czam u\u017cytkownika -label.action.disable.user=Wy\u0142\u0105cz u\u017cytkownika -label.action.disable.zone.processing=Wy\u0142\u0105czam stref\u0119.... -label.action.disable.zone=Wy\u0142\u0105cz stref\u0119 -label.action.download.ISO=Pobierz ISO -label.action.download.template=Pobierz szablon -label.action.download.volume=Pobierz wolumen -label.action.download.volume.processing=Pobieram wolumen.... -label.action.edit.account=Edytuj dost\u0119p -label.action.edit.domain=Edytuj domen\u0119 -label.action.edit.global.setting=Edytuj Globalne ustawienia -label.action.edit.host=Edytuj host -label.action.edit.instance=Edytuj instancj\u0119 -label.action.edit.ISO=Edytuj ISO -label.action.edit.network=Edytuj sie\u0107 -label.action.edit.network.processing=Zmieniam sie\u0107.... -label.action.edit.template=Edytuj szablon -label.action.edit.user=Edytuj u\u017cytkownika -label.action.edit.zone=Edytuj stref\u0119 -label.action.enable.account.processing=W\u0142\u0105czam dost\u0119p.... -label.action.enable.account=W\u0142\u0105cz dost\u0119p -label.action.enable.cluster.processing=W\u0142\u0105czam klaster.... -label.action.enable.cluster=W\u0142\u0105cz klaster -label.action.enable.nexusVswitch=W\u0142\u0105cz Nexus 1000v -label.action.enable.physical.network=W\u0142\u0105cz fizyczn\u0105 sie\u0107 -label.action.enable.user.processing=W\u0142\u0105czam u\u017cytkownika.... -label.action.enable.user=W\u0142\u0105cz u\u017cytkownika -label.action.enable.zone.processing=W\u0142\u0105czam stref\u0119.... -label.action.enable.zone=W\u0142\u0105cz stref\u0119 -label.action.generate.keys=Generuj klucze -label.action.generate.keys.processing=Generuj\u0119 klucze.... -label.action.list.nexusVswitch=Kista Nexus 1000v -label.action.lock.account.processing=Blokuj\u0119 dost\u0119p.... -label.action.lock.account=Zablokuj dost\u0119p -label.action.manage.cluster.processing=Zarz\u0105dzam klastrem.... -label.action.manage.cluster=Zarz\u0105dzaj klastrem -label.action.migrate.instance=Migruj instancj\u0119 -label.action.migrate.instance.processing=Migruj\u0119 instancj\u0119.... -label.action.migrate.router=Migruj router -label.action.migrate.router.processing=Migruje router.... -label.action.migrate.systemvm=Migruj system VM -label.action.migrate.systemvm.processing=Migruj\u0119 system VM.... -label.action.reboot.instance.processing=Restartuje instancj\u0119 -label.action.reboot.instance=Restartuj instancj\u0119 -label.action.reboot.router.processing=Restartuje router..... -label.action.reboot.router=Restartuj router -label.action.reboot.systemvm.processing=Restartuje system VM.... -label.action.reboot.systemvm=Restartuj system VM -label.action.register.iso=Rejestruj ISO -label.action.remove.host.processing=Usuwam host.... -label.action.remove.host=Usu\u0144 host -label.action.reset.password.processing=Resetuj\u0119 has\u0142o.... -label.action.reset.password=Resetuj has\u0142o -label.action.resize.volume.processing=Zmieniam wielko\u015b\u0107 wolumenu.... -label.action.resize.volume=Zmie\u0144 wielko\u015b\u0107 wolumenu -label.action.restore.instance=Przywr\u00f3\u0107 instancj\u0119 -label.actions=Akcje -label.action.start.instance.processing=Uruchamiam instancj\u0119.... -label.action.start.instance=Uruchom instancj\u0119 -label.action.start.router.processing=Uruchamiam router.... -label.action.start.router=Uruchom router -label.action.start.systemvm.processing=Uruchamiam system VM... -label.action.start.systemvm=Uruchom system VM -label.action.stop.instance.processing=Zatrzymuj\u0119 instancj\u0119.... -label.action.stop.instance=Zatrzymaj instancj\u0119 -label.action.stop.router.processing=Zatrzymuj\u0119 router... -label.action.stop.router=Zatrzymaj router -label.action.stop.systemvm.processing=Zatrzymuj\u0119 system VM.... -label.action.stop.systemvm=Zatrzymaj system VM -label.action.take.snapshot.processing=Tworz\u0119 snapshot.... -label.action.take.snapshot=Zr\u00f3b snapshot -label.activate.project=Aktywuj projekt -label.add.account=Dodaj konto -label.add.accounts=Dodaj konta -label.add.accounts.to=Dodaj konto do -label.add.account.to.project=Dodaj konto do projektu -label.add.ACL=Dodaj ACL -label.add.by.cidr=Dodaj przez CIDR -label.add.by=Dodaj przez -label.add.by.group=Dodaj przez grup\u0119 -label.add.cluster=Dodaj klaster -label.add=Dodaj -label.add.domain=Dodaj domen\u0119 -label.add.firewall=Dodaj regu\u0142\u0119 firewall -label.add.host=Dodaj host -label.adding=Dodawanie -label.adding.failed=Dodanie nieudane -label.adding.processing=Dodawanie -label.adding.succeeded=Dodanie udane -label.add.more=Dodaj wi\u0119cej -label.add.network.device=Dodaj urz\u0105dzenie sieciowe -label.add.network=Dodaj sie\u0107 -label.add.new.F5=Dodaj nowy F5 -label.add.new.SRX=Dodaj nowy SRX -label.add.region=Dodaj region -label.add.rule=Dodaj regu\u0142\u0119 -label.add.to.group=Dodaj do grupy -label.add.user=Dodaj u\u017cytkownika -label.add.vlan=Dodaj VLAN -label.add.vm=Dodaj VM -label.add.vms=Dodaj VM-ny -label.add.volume=Dodaj wolumen -label.add.vpc=Dodaj VPC -label.add.zone=Dodaj stref\u0119 -label.admin=Admin -label.api.key=Klucz API -label.apply=Zastosuj -label.author.name=Imi\u0119 autora -label.available=Dost\u0119pne -label.available.public.ips=Dost\u0119pne publiczne adresy IP -label.back=Wstecz -label.bandwidth=Przepustowo\u015b\u0107 -label.cancel=Zako\u0144cz -label.certificate=Certyfikat -label.cidr=CIDR -label.CIDR.list=Lista CIDR -label.clean.up=Wyczy\u015b\u0107 -label.clear.list=Wyczy\u015b\u0107 list\u0119 -label.close=Zamknij -label.clvm=CLVM -label.code=Kod -label.community=Spo\u0142eczno\u015b\u0107 -label.configuration=Konfiguracja -label.configure=Konfiguruj -label.configure.vpc=Konfiguruj VPC -label.confirmation=Potwierdzenie -label.confirm.password=Potwierd\u017a has\u0142o -label.congratulations=Gratulacje\! -label.continue=Kontynuuj -label.corrections.saved=Poprawka zapisana -label.cpu=CPU -label.cpu.limits=Limit CPU -label.cpu.mhz=CPU (w MHz) -label.created.by.system=Utworzono przez system -label.created=Utworzono -label.create.project=Stw\u00f3rz projekt -label.daily=Dziennie -label.date=Data -label.day.of.month=Dzie\u0144 miesi\u0105ca -label.day.of.week=Dzie\u0144 tygodnia -label.dedicated=Dedykowany -label.default=Domy\u015blnie -label.default.view=Widok domy\u015blny -label.delete.F5=Usu\u0144 F5 -label.delete.project=Usu\u0144 projekt -label.delete.SRX=Usu\u0144 SRX -label.delete=Usu\u0144 -label.deleting.failed=Usuwanie nieudane -label.deleting.processing=Usuwanie.... -label.destroy.router=Zniszcz router -label.destroy=Zniszcz -label.detaching.disk=Od\u0142\u0105czanie dysku -label.details=Szczeg\u00f3\u0142y -label.disabled=Wy\u0142\u0105czony -label.disable.vpn=Wy\u0142\u0105cz VPN -label.disk.size.gb=Wielko\u015b\u0107 dysku (w GB) -label.disk.size=Wielko\u015b\u0107 dysku -label.domain.admin=Administrator domeny -label.domain=Domena -label.domain.id=ID domeny -label.domain.name=Nazwa domeny -label.done=Sko\u0144czono -label.download.progress=Post\u0119p w pobieraniu -label.drag.new.position=Przenie\u015b w nowe miejsce -label.edit=Edytuj -label.edit.network.details=Edytuj szczeg\u00f3\u0142y sieci -label.edit.project.details=Zmie\u0144 szczeg\u00f3\u0142y projektu -label.edit.vpc=Edytuj VPC -label.elastic=Elastyczny -label.elastic.IP=Zmienne IP -label.email=Poczta -label.enable.vpn=W\u0142\u0105cz VPN -label.error=B\u0142\u0105d -label.f5=F5 -label.failed=B\u0142\u0105d -label.featured=Polecane -label.filterBy=Filtrowanie wg -label.firewall=Zapora -label.first.name=Pierwsza nazwa -label.format=Format -label.friday=Pi\u0105tek -label.full.path=Pe\u0142na \u015bcie\u017cka -label.go.step.2=Id\u017a do punktu 2 -label.go.step.3=Id\u017a do punktu 3 -label.go.step.4=Id\u017a do punktu 4 -label.go.step.5=Id\u017a do punktu 5 -label.gpu=CPU -label.group=Grupa -label.group.optional=Grupa (opcjonalnie) -label.guest=Go\u015b\u0107 -label.guest.type=Rodzaj go\u015bci -label.help=Pomoc -label.hints=Podpowiedzi -label.id=ID -label.info=Informacje -label.instances=Instancje -label.invitations=Zaproszenia -label.invited.accounts=Zaproszone konta -label.invite.to=Zapro\u015b do -label.invite=Zapro\u015b -label.ip=IP -label.ips=IP -label.iso=ISO -label.keep=Zostaw -label.key=Klucz -label.lang.english=Angielski -label.lang.french=Francuski -label.lang.japanese=Japo\u0144ski -label.lang.korean=Korea\u0144ski -label.lang.russian=Rosyjski -label.lang.spanish=Hiszpia\u0144ski -label.last.name=Nazwisko -label.launch=Rozpocznij -label.lb.algorithm.leastconn=Ostatnie po\u0142\u0105czenie -label.ldap.link.type=Wpisz -label.level=Poziom -label.loading=Wczytywanie -label.local=Lokalne -label.local.storage=Pami\u0119\u0107 lokalna -label.login=Zaloguj -label.logout=Wyloguj -label.lun=LUN -label.LUN.number=LUN \# -label.max.guest.limit=Maksymalna liczba go\u015bci -label.maximum=Maksimum -label.max.public.ips=Maksymalna liczba publicznych adres\u00f3w IP -label.memory.limits=Limit pami\u0119ci (MiB) -label.memory.mb=Pami\u0119\u0107 (w MB) -label.memory=Pami\u0119\u0107 -label.menu.accounts=Konta -label.menu.alerts=Alarmy -label.menu.all.accounts=Wszystkie konta -label.menu.all.instances=Wszystkie instancje -label.menu.configuration=Konfiguracja -label.menu.domains=Domeny -label.menu.infrastructure=Infrastruktura -label.menu.instances=Instancje -label.menu.ipaddresses=Adresy IP -label.menu.isos=ISO -label.menu.my.accounts=Moje konta -label.menu.my.instances=Moje instancje -label.menu.my.isos=Moje ISO -label.menu.network=Sie\u0107 -label.menu.regions=Regiony -label.menu.system=System -label.metrics.cpu.used.avg=U\u017cyte -label.metrics.disk.size=Wielko\u015bc -label.metrics.disk.storagetype=Wpisz -label.metrics.disk.used=U\u017cyte -label.metrics.memory.used.avg=U\u017cyte -label.metrics.name=Nazwa -label.metrics.state=Status -label.minimum=Minimum -label.mode=Tryb -label.monday=Poniedzia\u0142ek -label.monthly=Miesi\u0119cznie -label.move.down.row=Jeden rz\u0105d na d\u00f3\u0142 -label.move.to.top=Przenie\u015b na sam\u0105 g\u00f3r\u0119 -label.move.up.row=Jeden rz\u0105d do g\u00f3ry -label.my.account=Moje konto -label.my.network=Moja sie\u0107 -label.name.lower=Nazwa -label.name=Nazwa -label.name.optional=Nazwa (opcjonalnie) -label.network.id=ID sieci -label.network.name=Nazwa sieci -label.network=Sie\u0107 -label.networks=Sieci -label.new=Nowy -label.new.project=Nowy projekt -label.next=Nast\u0119pny -label.nfs=NFS -label.nfs.server=Serwer NFS -label.no.data=Brak danych -label.none=Brak -label.no=Nie -label.no.thanks=Nie dzi\u0119kuj\u0119 -label.notifications=Przypomnienia -label.number.of.hosts=Liczba host\u00f3w -label.ok=OK -label.order=Zadanie -label.outofbandmanagement.password=Has\u0142o -label.outofbandmanagement.username=Nazwa u\u017cytkownika -label.password=Has\u0142o -label.path=\u015acie\u017cka -label.please.wait=Prosz\u0119 czeka\u0107 -label.plugin.details=Szczeg\u00f3\u0142y wtyczki -label.plugins=Wtyczki -label.previous=Wstecz -label.private.network=Sie\u0107 prywatna -label.project.id=Nazwa ID projektu -label.project.invite=Zapro\u015b do projektu -label.project.name=Nazwa projektu -label.project=Projekt -label.projects=Projekty -label.protocol=Protok\u00f3\u0142 -label.providers=Dostawcy -label.public.ip=Publiczny adres IP -label.public.ips=Publiczne adresy IP -label.public.network=Sie\u0107 publiczna -label.public=Pobliczny -label.public.port=Publiczny port -label.quota.date=Data -label.quota.fullsummary=Wszystkie konta -label.quota.state=Status -label.reboot=Uruchom ponownie -label.refresh=Od\u015bwie\u017c -label.region=Region -label.remind.later=Przypomnij p\u00f3\u017aniej -label.remove.rule=Usu\u0144 regu\u0142\u0119 -label.remove.vpc=Usu\u0144 VPC -label.removing.user=Usu\u0144 u\u017cytkownika -label.removing=Usuwanie -label.required=Wymagane -label.resource.limits=Limit zasob\u00f3w -label.resources=Zasoby -label.resource=Zas\u00f3b -label.restart.required=Wymagany restart -label.rules=Zasady -label.saturday=Sobota -label.save.and.continue=Zapisz i kontynuuj -label.save=Zapisz -label.saving.processing=Zapisywanie.... -label.search=Szukaj -label.select.instance=Wybierz instancj\u0119 -label.select.project=Wybierz projekt -label.select=Wybierz -label.sent=Wys\u0142ano -label.server=Serwer -label.setup=Konfiguracja -label.size=Wielko\u015bc -label.specify.IP.ranges=Wyszczeg\u00f3lnij zasi\u0119g adres\u00f3w IP -label.srx=SRX -label.state=Status -label.statistics=Statystyki -label.status=Status -label.step.1=Krok 1 -label.step.2=Krok 2 -label.step.3=Krok 3 -label.step.4=Krok 4 -label.step.5=Krok 5 -label.sticky.domain=Domena -label.sticky.expire=Wygasa -label.sticky.length=D\u0142ugo\u015b\u0107 -label.sticky.mode=Tryb -label.sticky.prefix=Prefiks -label.stop=Stop -label.sunday=Niedziela -label.suspend.project=Zawie\u015b projekt -label.tagged=Otagowany -label.tags=Tagi -label.task.completed=Zadania uko\u0144czone -label.time=Czas -label.time.zone=Strefa czasowa -label.timezone=Strefa czasowa -label.type.id=Wpisz ID -label.type=Wpisz -label.unavailable=Niedost\u0119pny -label.unlimited=Nieograniczony -label.untagged=Nieotagowany -label.updating=Aktualizowanie -label.url=URL -label.used=U\u017cyte -label.username=Nazwa u\u017cytkownika -label.users=U\u017cytkownicy -label.user=U\u017cytkowni -label.version=Wersja -label.view.all=Zobacz wszystko -label.view=Zobacz -label.vlan.only=VLAN -label.vlan=VLAN -label.vm.add=Dodaj instancj\u0119 -label.vm.destroy=Zniszcz -label.vmfs=VMFS -label.vm.name=Nazwa VM -label.vm.reboot=Uruchom ponownie -label.vmsnapshot.type=Wpisz -label.vm.start=Rozpocznij -label.vm.stop=Stop -label.vms=VMs -label.vnet=VLAN -label.vpc=VPC -label.vpn=VPN -label.waiting=Czekanie -label.warn=Ostrze\u017cenie -label.wednesday=\u015aroda -label.weekly=Tygodniowo -label.welcome=Witaj -label.what.is.cloudstack=Czym jest CloudStack&\#8482? -label.yes=Tak -message.action.delete.nexusVswitch=Potwierd\u017a, \u017ce chcesz usun\u0105\u0107\: nexus 1000v -message.action.download.iso=Potwierd\u017a, \u017ce chcesz pobra\u0107 ten obraz ISO. -message.activate.project=Czy na pewno chcesz aktywowa\u0107 ten projekt? -message.confirm.delete.F5=Czy na pewno chcesz usun\u0105\u0107 F5? -message.confirm.delete.SRX=Czy na pewno chcesz usun\u0105\u0107 SRX? -message.delete.project=Czy na pewno chcesz usun\u0105\u0107 ten projekt? -message.disable.vpn=Czy na pewno chcesz wy\u0142\u0105czy\u0107 VPN? -message.no.projects=Nie posiadasz \u017cadnych projekt\u00f3w.
Utw\u00f3rz nowy projekt w zak\u0142adce projekty -message.please.proceed=Przejd\u017a do nast\u0119pnego punktu -message.suspend.project=Czy na pewno chcesz zawiesi\u0107 ten projekt -mode=Tryb -state.Accepted=Akceptowano -state.Active=Aktywny -state.Completed=Uko\u0144czono -state.Creating=Tworzenie -state.Declined=Odrzucono -state.Destroyed=Zniszczono -state.Disabled=Wy\u0142\u0105czony -state.Enabled=W\u0142\u0105czone -state.Error=B\u0142\u0105d -state.Ready=Gotowe -state.Starting=Rozpoczynanie -state.Stopped=Zatrzymano -state.Suspended=Zawieszono -ui.listView.filters.all=Wszystko diff --git a/client/WEB-INF/classes/resources/messages_pt_BR.properties b/client/WEB-INF/classes/resources/messages_pt_BR.properties deleted file mode 100644 index b64cea32966c..000000000000 --- a/client/WEB-INF/classes/resources/messages_pt_BR.properties +++ /dev/null @@ -1,2261 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=Propriedades do item alteradas -confirm.enable.s3=Por favor, preencha as informa\u00e7\u00f5es abaixo para habilitar suporte o Storage Secund\u00e1rio fornecido por S3 -confirm.enable.swift=Por favor, preencha as informa\u00e7\u00f5es abaixo para habilitar suporte ao Swift -error.could.not.change.your.password.because.ldap.is.enabled=Erro\: a nuvem n\u00e3o alterou sua senha porque o LDAP est\u00e1 ativo. -error.could.not.enable.zone=N\u00e3o foi poss\u00edvel habilitar a zona -error.installWizard.message=Alguma coisa est\u00e1 errada; voc\u00ea pode voltar e corrigir quaisquer erros -error.invalid.username.password=Usu\u00e1rio ou senha inv\u00e1lidos -error.login=O seu usu\u00e1rio/senha n\u00e3o coincidem com nossos registros. -error.menu.select=N\u00e3o foi poss\u00edvel realizar a a\u00e7\u00e3o pois nenhum item foi selecionado. -error.mgmt.server.inaccessible=O Servidor de Gerenciamento est\u00e1 inacess\u00edvel. Tente novamente mais tarde. -error.password.not.match=Os campos de senha n\u00e3o combinam -error.please.specify.physical.network.tags=As Ofertas de Rede n\u00e3o estar\u00e3o dispon\u00edveis enquanto voc\u00ea n\u00e3o especificar tags para esta interface f\u00edsica. -error.session.expired=Sua sess\u00e3o expirou. -error.something.went.wrong.please.correct.the.following=Alguma coisa est\u00e1 errada; por favor corrija abaixo -error.unable.to.reach.management.server=N\u00e3o foi poss\u00edvel acessar o Servidor de Gerenciamento -error.unresolved.internet.name=Imposs\u00edvel resolver DNS -force.delete.domain.warning=Aten\u00e7\u00e3o\: Esta op\u00e7\u00e3o remover\u00e1 todos os dom\u00ednios, contas e recursos associados. -force.delete=For\u00e7ar Exclus\u00e3o -force.remove=For\u00e7ar Remo\u00e7\u00e3o -force.remove.host.warning=Aten\u00e7\u00e3o\: O CloudStack desligar\u00e1 de maneira for\u00e7ada todas as VMs antes de remover o host do cluster. -force.stop=For\u00e7ar Parada -force.stop.instance.warning=Aviso\: For\u00e7ar o desligamento desta inst\u00e2ncia deve ser sua \u00faltima op\u00e7\u00e3o. Isto pode levar a perda de dados, bem como comportamento inconsist\u00eante do estado da m\u00e1quina virtual. -hint.no.host.tags=Nenhuma tag de host encontrada -hint.no.storage.tags=Nenhuma tag de storage encontrada -hint.type.part.host.tag=Digite parte de um tag de host -hint.type.part.storage.tag=Digite parte de um tag de storage -ICMP.code=C\u00f3digo ICMP -ICMP.type=Tipo ICMP -image.directory=Diret\u00f3rio da Imagem -inline=Inline -instances.actions.reboot.label=Reiniciar inst\u00e2ncia -label.about.app=Sobre o CloudStack -label.about=Sobre -label.accept.project.invitation=Aceitar convite de projeto. -label.account.and.security.group=Contas, grupos de Seguran\u00e7a -label.account=Conta -label.account.details=Detalhes da conta -label.account.id=ID da Conta -label.account.lower=conta -label.account.name=Nome da Conta -label.accounts=Contas -label.account.specific=Conta-Specific -label.account.type=Tipo de Conta -label.acl=ACL -label.acl.id=ACL ID -label.acl.list.rules=Lista de regas de ACL -label.acl.name=Nome da ACL -label.acl.replaced=ACL trocado -label.acquire.new.ip=Adquirir novo IP -label.acquire.new.secondary.ip=Adquira um novo IP secund\u00e1rio -label.action.attach.disk=Anexar Disco -label.action.attach.disk.processing=Anexando Disco.... -label.action.attach.iso=Anexar ISO -label.action.attach.iso.processing=Anexando ISO.... -label.action=A\u00e7\u00e3o -label.action.cancel.maintenance.mode=Cancelar Modo de Manuten\u00e7\u00e3o -label.action.cancel.maintenance.mode.processing=Cancelando Modo de Manuten\u00e7\u00e3o.... -label.action.change.password=Troca de Senha -label.action.change.service.processing=Trocando de Plano.... -label.action.change.service=Trocar Plano -label.action.configure.samlauthorization=Configurar Autoriza\u00e7\u00e3o SAML SSO -label.action.copy.ISO=Copiar ISO -label.action.copy.ISO.processing=Copiando ISO... -label.action.copy.template=Copiar Template -label.action.copy.template.processing=Copiando Template... -label.action.create.template=Criar Template -label.action.create.template.from.vm=Criar Template a partir da VM -label.action.create.template.from.volume=Criar Template a partir do Disco -label.action.create.template.processing=Criando Template.... -label.action.create.vm=Criar VM -label.action.create.vm.processing=Criando VM.... -label.action.create.volume=Criar Disco -label.action.create.volume.processing=Criando Disco.... -label.action.delete.account.processing=Removendo conta.... -label.action.delete.account=Remover conta -label.action.delete.cluster.processing=Removendo Cluster.... -label.action.delete.cluster=Remover Cluster -label.action.delete.disk.offering.processing=Removendo Oferta de Disco.... -label.action.delete.disk.offering=Remover Oferta de Disco -label.action.delete.domain.processing=Removendo Dom\u00ednio.... -label.action.delete.domain=Remover Dom\u00ednio -label.action.delete.firewall.processing=Removendo Firewall.... -label.action.delete.firewall=Remover regra de firewall -label.action.delete.ingress.rule.processing=Removendo Regra de Entrada.... -label.action.delete.ingress.rule=Remover Regra de Entrada -label.action.delete.IP.range.processing=Removendo Range de IP.... -label.action.delete.IP.range=Remover Range IP -label.action.delete.ISO.processing=Removendo ISO.... -label.action.delete.ISO=Removendo ISO -label.action.delete.load.balancer.processing=Removendo Load Balancer.... -label.action.delete.load.balancer=Remover regra de balanceador de carga -label.action.delete.network.processing=Removendo Rede.... -label.action.delete.network=Remover Rede -label.action.delete.nexusVswitch=Remover NexusVswitch -label.action.delete.nic=Remover Interface de Rede -label.action.delete.physical.network=Deletar rede f\u00edsica -label.action.delete.pod.processing=Removendo POD.... -label.action.delete.pod=Remover POD -label.action.delete.primary.storage.processing=Removendo Storage Prim\u00e1rio.... -label.action.delete.primary.storage=Remover Storage Prim\u00e1rio -label.action.delete.secondary.storage.processing=Removendo Storage Secund\u00e1rio.... -label.action.delete.secondary.storage=Remover Storage Secund\u00e1rio -label.action.delete.security.group.processing=Removendo Security Group.... -label.action.delete.security.group=Remover Security Group -label.action.delete.service.offering.processing=Removendo Plano.... -label.action.delete.service.offering=Remover Plano -label.action.delete.snapshot.processing=Removendo Snapshot.... -label.action.delete.snapshot=Remover Snapshot -label.action.delete.system.service.offering=Deletar Oferta de Servi\u00e7o de Sistema -label.action.delete.template.processing=Removendo Template.... -label.action.delete.template=Remover Template -label.action.delete.user.processing=Removendo Usu\u00e1rio.... -label.action.delete.user=Remover Usu\u00e1rio -label.action.delete.volume.processing=Removendo Disco.... -label.action.delete.volume=Remover Disco -label.action.delete.zone.processing=Removendo Zona.... -label.action.delete.zone=Remover Zona -label.action.destroy.instance=Apagar Inst\u00e2ncia -label.action.destroy.instance.processing=Apagando Inst\u00e2ncia.... -label.action.destroy.systemvm=Apagar VM de Sistema -label.action.destroy.systemvm.processing=Apagando VM de Sistema.... -label.action.detach.disk=Desplugar Disco -label.action.detach.disk.processing=Desplugando Disco.... -label.action.detach.iso=Desplugar ISO -label.action.detach.iso.processing=Desplugando ISO.... -label.action.disable.account=Desativar conta -label.action.disable.account.processing=Desativando conta.... -label.action.disable.cluster=Desativar Cluster -label.action.disable.cluster.processing=Desativando Cluster.... -label.action.disable.nexusVswitch=Desabilitar NexusVswitch -label.action.disable.physical.network=Desabilitar rede f\u00edsica -label.action.disable.pod=Desativar POD -label.action.disable.pod.processing=Desativando POD.... -label.action.disable.static.NAT=Desativar NAT Est\u00e1tico -label.action.disable.static.NAT.processing=Desativando NAT Est\u00e1tico.... -label.action.disable.user=Desativar Usu\u00e1rio -label.action.disable.user.processing=Desativando Usu\u00e1rio.... -label.action.disable.zone=Desativar Zona -label.action.disable.zone.processing=Desativando Zona.... -label.action.download.ISO=Baixar ISO -label.action.download.template=Baixar Template -label.action.download.volume=Baixar Disco -label.action.download.volume.processing=Baixando Disco.... -label.action.edit.account=Editar conta -label.action.edit.disk.offering=Editar Oferta de Disco -label.action.edit.domain=Editar Dom\u00ednio -label.action.edit.global.setting=Editar Configura\u00e7\u00f5es Globais -label.action.edit.host=Editar Host -label.action.edit.instance=Editar Inst\u00e2ncia -label.action.edit.ISO=Editar ISO -label.action.edit.network=Editar Rede -label.action.edit.network.offering=Editar Oferta de Rede -label.action.edit.network.processing=Editarando Rede.... -label.action.edit.pod=Editar Pod -label.action.edit.primary.storage=Editar Storage Prim\u00e1rio -label.action.edit.resource.limits=Editar Limite de Recursos -label.action.edit.service.offering=Editar Plano -label.action.edit.template=Editar Template -label.action.edit.user=Editar Usu\u00e1rio -label.action.edit.zone=Editar Zona -label.action.enable.account=Ativar conta -label.action.enable.account.processing=Ativando conta.... -label.action.enable.cluster=Ativar Cluster -label.action.enable.cluster.processing=Ativando Cluster.... -label.action.enable.maintenance.mode=Ativar Modo de Manuten\u00e7\u00e3o -label.action.enable.maintenance.mode.processing=Ativando Modo de Manuten\u00e7\u00e3o.... -label.action.enable.nexusVswitch=Habilitar NexusVswitch -label.action.enable.physical.network=Habilitar rede f\u00edsica -label.action.enable.pod=Ativar POD -label.action.enable.pod.processing=Ativando POD.... -label.action.enable.static.NAT=Ativar NAT Est\u00e1tico -label.action.enable.static.NAT.processing=Ativando NAT Est\u00e1tico.... -label.action.enable.user=Habilitar usu\u00e1rio -label.action.enable.user.processing=Habilitando Usu\u00e1rio... -label.action.enable.zone=Ativar Zona -label.action.enable.zone.processing=Ativando Zona.... -label.action.expunge.instance=Eliminar Inst\u00e2ncia -label.action.expunge.instance.processing=Expurgando Inst\u00e2ncia.... -label.action.force.reconnect=Force Reconnect -label.action.force.reconnect.processing=Reconectando.... -label.action.generate.keys=Gerar Chaves -label.action.generate.keys.processing=Gerando Chaves.... -label.action.list.nexusVswitch=Listar NexusVswitch -label.action.lock.account=Bloquear conta -label.action.lock.account.processing=Bloqueando conta.... -label.action.manage.cluster.processing=Vinculando o Cluster.... -label.action.manage.cluster=Vincular Cluster -label.action.migrate.instance=Migrar Inst\u00e2ncia -label.action.migrate.instance.processing=Migrando Inst\u00e2ncia.... -label.action.migrate.router=Migrar Roteador -label.action.migrate.router.processing=Migrando Roteador... -label.action.migrate.systemvm=Migrar VM de Sistema -label.action.migrate.systemvm.processing=Migrando VM de Sistema... -label.action.reboot.instance.processing=Reiniciando Inst\u00e2ncia... -label.action.reboot.instance=Reiniciar Inst\u00e2ncia -label.action.reboot.router.processing=Reiniciando Roteador.... -label.action.reboot.router=Reiniciar Roteador -label.action.reboot.systemvm.processing=Reiniciando VM de Sistema.... -label.action.reboot.systemvm=Reiniciar VM de Sistema -label.action.recurring.snapshot=Snapshots recorrentes -label.action.register.iso=Registrar ISO -label.action.register.template=Registrar Template da URL -label.action.release.ip=Liberar IP -label.action.release.ip.processing=Liberando IP.... -label.action.remove.host.processing=Removendo Host.... -label.action.remove.host=Remover Host -label.action.reset.password.processing=Recuperando a Senha.... -label.action.reset.password=Recuperar Senha -label.action.resize.volume.processing=Resizing Volume.... -label.action.resize.volume=Resize Volume -label.action.resource.limits=Limite de Recursos -label.action.restore.instance.processing=Restaurando Inst\u00e2ncia... -label.action.restore.instance=Restaurar Inst\u00e2ncia -label.action.revert.snapshot.processing=Revertendo para Snapshot... -label.action.revert.snapshot=Reverter para Snapshot -label.actions=A\u00e7\u00f5es -label.action.start.instance=Iniciar Inst\u00e2ncia -label.action.start.instance.processing=Iniciando Inst\u00e2ncia... -label.action.start.router=Iniciar Roteador -label.action.start.router.processing=Iniciando Roteador.... -label.action.start.systemvm=Iniciar VM de Sistema -label.action.start.systemvm.processing=Iniciando VM de Sistema.... -label.action.stop.instance=Parar Inst\u00e2ncia -label.action.stop.instance.processing=Parando Inst\u00e2ncia... -label.action.stop.router=Parar Roteador -label.action.stop.router.processing=Parando Roteador.... -label.action.stop.systemvm=Parar VM de Sistema -label.action.stop.systemvm.processing=Parando VM de Sistema.... -label.action.take.snapshot.processing=Tirando Snapshot.... -label.action.take.snapshot=Tirar Snapshot -label.action.unmanage.cluster=Desvincular Cluster -label.action.unmanage.cluster.processing=Desvinculando Cluster.... -label.action.update.OS.preference=Atualizar Prefer\u00eancia de SO -label.action.update.OS.preference.processing=Atualizando Prefer\u00eancia de SO.... -label.action.update.resource.count=Atualiza Contador de Recursos -label.action.update.resource.count.processing=Atualizando Contador de Recursos.... -label.action.vmsnapshot.create=Fazer Snapshot de VM -label.action.vmsnapshot.delete=Remover snapshot de VM -label.action.vmsnapshot.revert=Reverter snapshot de VM -label.activate.project=Ativar Projeto -label.active.sessions=Sess\u00f5es Ativas -label.add.account=Adicionar Conta -label.add.accounts=Adicionar contas -label.add.accounts.to=Adicionar contas para -label.add.account.to.project=Adicionar conta ao projeto -label.add.ACL=Adicionar ACL -label.add.acl.list=Adiciona Lista ACL -label.add=Adicionar -label.add.affinity.group=Adicionar um grupo de afinidade -label.add.baremetal.dhcp.device=Adiciona Dispositivo DHCP Baremetal -label.add.baremetal.rack.configuration=Adicionar Configura\u00e7\u00e3o de Rack de Baremetal -label.add.BigSwitchBcf.device=Adicionar BigSwitch BCF Controller -label.add.BrocadeVcs.device=Adicionar Brocade Vcs Switch -label.add.by=Adicionado por -label.add.by.cidr=Adicionar por CIDR -label.add.by.group=Adicionar por Grupo -label.add.ciscoASA1000v=Adicone Recurso -label.add.cluster=Adicionar Cluster -label.add.compute.offering=Adicionar oferta de computa\u00e7\u00e3o -label.add.direct.iprange=Add Direct Ip Range -label.add.disk.offering=Adicionar Oferta de Disco -label.add.domain=Adicionar Dom\u00ednio -label.added.brocade.vcs.switch=Adicionado novo Brocade Vcs Switch -label.added.network.offering=Adicionar uma oferta de rede -label.added.new.bigswitch.bcf.controller=Adicionar novo BigSwitch BCF Controller -label.added.nicira.nvp.controller=Adicionado nova Controladora Nicira NVP -label.add.egress.rule=Adicionar regra egress -label.addes.new.f5=Adicionado novo F5 -label.add.F5.device=Adicionar dispositivo F5 -label.add.firewall=Adicionar regra de Firewall -label.add.globo.dns=Adicionar GloboDNS -label.add.gslb=Adicionar GSLB -label.add.guest.network=Adicionar rede guest -label.add.host=Adicionar Host -label.adding=Adicionando -label.adding.cluster=Adicionando Cluster -label.adding.failed=Falha ao Adicionar -label.adding.pod=Adicionando POD -label.adding.processing=Adicionando.... -label.add.ingress.rule=Adicionar Regra de Entrada -label.adding.succeeded=Adicionado com Sucesso -label.adding.user=Adicionando Usu\u00e1rio -label.adding.zone=Adicionando Zona -label.add.intermediate.certificate=Adicionar certificado intermedi\u00e1rio -label.add.internal.lb=Adiciona LB Interno -label.add.ip.range=Adicionar Range de IP -label.add.isolated.guest.network=Adiciona Rede Guest Isolada -label.add.isolated.guest.network.with.sourcenat=Adicionar rede Guest isolada com SourceNat -label.add.isolated.network=Adiciona Rede Isolada -label.additional.networks=Redes Adicionais -label.add.ldap.account=Adicionar Conta LDAP -label.add.LDAP.account=Adicionar Conta LDAP -label.add.list.name=Nome de Lista ACL -label.add.load.balancer=Adicionar Load Balance -label.add.more=Adicionar Mais -label.add.netScaler.device=Adicionar dispositivo Netscaler -label.add.network.ACL=Adicione ACL de rede -label.add.network.acl.list=Adicionar Lista de ACL de Rede -label.add.network=Adicionar Rede -label.add.network.device=Adicionar Dispositivo de Rede -label.add.network.offering=Adicionar oferta de rede -label.add.new.F5=Adicionar um novo F5 -label.add.new.gateway=Adicionar novo gateway -label.add.new.NetScaler=Adicionar um novo NetScaler -label.add.new.PA=Adicionar novo Palo Alto -label.add.new.SRX=Adicionar um novo SRX -label.add.new.tier=Adicionar nova camada -label.add.nfs.secondary.staging.store=Adiciona Armazenamento NFS de Est\u00e1gio Secund\u00e1rio -label.add.NiciraNvp.device=Adicionar Controlador Nvp -label.add.NuageVsp.device=Adicionar Nuage Virtualized Services Directory (VSD) -label.add.OpenDaylight.device=Adiciona Controlador OpenDaylight -label.add.PA.device=Adicionar dispositivo Palo Alto -label.add.physical.network=Adicionar rede f\u00edsica -label.add.pod=Adicionar POD -label.add.portable.ip.range=Adicionar Faixa de Endere\u00e7os IPs Port\u00e1veis -label.add.port.forwarding.rule=Adicionar regra de encaminhamento de porta -label.add.primary.storage=Adicionar Storage Prim\u00e1rio -label.add.private.gateway=Adicionar Gateway Privado -label.add.region=Adicionar Regi\u00e3o -label.add.resources=Adicionar Recursos -label.add.route=Adicionar rota -label.add.rule=Adicionar regra -label.add.secondary.storage=Adicionar Storage Secund\u00e1rio -label.add.security.group=Adicionar Security Group -label.add.service.offering=Adicionar Plano -label.add.SRX.device=Adicionar dispositivo SRX -label.add.static.nat.rule=Adicionar regra de NAT est\u00e1tico -label.add.static.route=Adicionar rota est\u00e1tica -label.add.system.service.offering=Adicionar Plano para VM de Sistema -label.add.template=Adicionar Template -label.add.to.group=Adicionar ao grupo -label.add.ucs.manager=Adiciona Gerenciador UCS -label.add.user=Adicionar Usu\u00e1rio -label.add.userdata=Userdata -label.add.vlan=Adicionar VLAN -label.add.vm=Adicionar VM -label.add.vms=Adicionar VMs -label.add.vms.to.lb=Add VM(s) na regra de balanceamento de carga -label.add.VM.to.tier=Adicionar m\u00e1quina virtual \u00e0 camada -label.add.vmware.datacenter=Adicionar Datacerter VMware -label.add.vnmc.device=Adiciona dispositivo VNMC -label.add.vnmc.provider=Adicione provedor VNMC -label.add.volume=Adicionar Disco -label.add.vpc=Adicionar VPC -label.add.vpc.offering=Adicionar Oferta VPC -label.add.vpn.customer.gateway=Adicionar Gateway de VPN de usu\u00e1rio -label.add.VPN.gateway=Adicionar gateway de VPN -label.add.vpn.user=Adicionar usu\u00e1rio VPN -label.add.vxlan=Adicionar VXLAN -label.add.zone=Adicionar Zona -label.admin.accounts=Contas Administrativas -label.admin=Administrador -label.advanced=Avan\u00e7ado -label.advanced.mode=Modo Avan\u00e7ado -label.advanced.search=Busca Avan\u00e7ada -label.affinity=Afinidade -label.affinity.group=Grupo de Afinidade -label.affinity.groups=Grupos de Afinidade -label.agent.password=Senha do Agente -label.agent.port=Porta do Agente -label.agent.state=Estado do Agente -label.agent.username=Usu\u00e1rio do Agente -label.agree=Concordo -label.alert=Alerta -label.alert.archived=Alerta Arquivado -label.alert.deleted=Alerta Apagado -label.alert.details=Detalhes de alerta -label.algorithm=Algoritmo -label.allocated=Alocado -label.allocation.state=Status da Aloca\u00e7\u00e3o -label.allow=Pertitir -label.anti.affinity=Anti-afinidade -label.anti.affinity.group=Grupo de Anti-afinidade -label.anti.affinity.groups=Grupos de Anti-afinidade -label.api.key=API Key -label.api.version=Ver\u00e3o da API -label.apply=Aplicar -label.app.name=CloudStack -label.archive.alerts=Guardar alertas -label.archive=Arquivo -label.archive.events=Guardar eventos -label.assign=Atribuir -label.assigned.vms=VMs designadas -label.assign.instance.another=Atribuir Inst\u00e2ncia para outra Conta -label.assign.to.load.balancer=Atribuindo Inst\u00e2ncia ao balanceador de carga -label.assign.vms=Atribuir VMs -label.associated.network.id=ID de Rede Associado -label.associated.network=Rede associada -label.associated.profile=Perfil Associado -label.associate.public.ip=Associa IP P\u00fablico -label.attached.iso=Imagem ISO Plugada -label.author.email=E-mail do autor -label.author.name=Nome do autor -label.autoscale.configuration.wizard=Assistente de configura\u00e7\u00e3o de AutoScale -label.autoscale=Escalonamento Autom\u00e1tico -label.availability=Availability -label.availabilityZone=availabilityZone -label.availability.zone=Datacenter -label.available=Dispon\u00edvel -label.available.public.ips=IP P\u00fablico Dispon\u00edvel -label.back=Voltar -label.bandwidth=Bandwidth -label.baremetal.dhcp.devices=Dispositivos DHCP Baremetal -label.baremetal.dhcp.provider=Provedor DHCP Baremetal -label.baremetal.pxe.device=Adiciona Dispositivo PXE Baremetal -label.baremetal.pxe.devices=Dispositivo PXE Baremetal -label.baremetal.pxe.provider=Provedor PXE Baremetal -label.baremetal.rack.configuration=Configura\u00e7\u00e3o do Rack de Baremetal -label.basic=B\u00e1sico -label.basic.mode=Modo B\u00e1sico -label.bigswitch.bcf.details=Detalhes do BigSwitch BCF -label.bigswitch.bcf.nat=Habilitar BigSwitch BCF NAT -label.bigswitch.controller.address=Endere\u00e7o do BigSwitch BCF Controller -label.blade.id=ID da L\u00e2mina -label.blades=L\u00e2minas -label.bootable=Inicializ\u00e1vel -label.broadcast.domain.range=Range do dom\u00ednio de Broadcast -label.broadcast.domain.type=Tipo de Dom\u00ednio Broadcast -label.broadcast.uri=URI de broadcast -label.broadcasturi=url de broadcast -label.broadcat.uri=URI de broadcast -label.brocade.vcs.address=Endere\u00e7o do Vcs Switch -label.brocade.vcs.details=Detalhes do Brocade Vcs Switch -label.by.account=por Conta -label.by.alert.type=Por tipo de alerta -label.by.availability=By Availability -label.by.date.end=Por data (final) -label.by.date.start=Por data (in\u00edcio) -label.by.domain=por Dom\u00ednio -label.by.end.date=por Data Final -label.by.event.type=Por tipo de evento -label.by.level=por N\u00edvel -label.by.pod=por Pod -label.by.role=por Fun\u00e7\u00e3o -label.by.start.date=por Data Inicial -label.by.state=por estado -label.bytes.received=Bytes Recebidos -label.bytes.sent=Bytes Enviados -label.by.traffic.type=por Tipo de Tr\u00e1fego -label.by.type.id=por Tipo de ID -label.by.type=Por Tipo -label.by.zone=por Zona -label.cache.mode=Tipo do cache de escrita -label.cancel=Cancelar -label.capacity.bytes=Capacidade de Bytes -label.capacity=Capacidade -label.capacity.iops=Capacidade de IOPS -label.certificate=Certificado -label.change.affinity=Muda Afinidade -label.change.ipaddress=Mudan\u00e7a de endere\u00e7o IP para NIC -label.change.service.offering=Alterar oferta de servi\u00e7o -label.change.value=Alterar valor -label.character=Caracter -label.chassis=Chassis -label.checksum=checksum -label.cidr.account=CIDR ou Conta/Security Group -label.cidr=CIDR -label.cidr.list=CIDR de Origem -label.CIDR.list=Lista CIDR -label.CIDR.of.destination.network=CIDR da rede de destino -label.cisco.nexus1000v.ip.address=Endere\u00e7o IP do Nexus 1000v -label.cisco.nexus1000v.password=Senha do Nexus 1000v -label.cisco.nexus1000v.username=Usu\u00e1rio do Nexus 1000v -label.ciscovnmc.resource.details=Detalhes de recurso CiscoVNMC -label.clean.up=Limpar -label.clear.list=Limpar lista -label.close=Fechar -label.cloud.console=Console de Gerenciamento da Nuvem -label.cloud.managed=Cloud.com Managed -label.cluster=Cluster -label.cluster.name=Nome do Cluster -label.clusters=Clusters -label.cluster.type=Tipo de Cluster -label.clvm=CLVM -label.code=C\u00f3digo -label.community=Comunidade -label.compute.and.storage=Processamento e Armazenamento -label.compute=Computa\u00e7\u00e3o -label.compute.offering=Oferta de Computa\u00e7\u00e3o -label.compute.offerings=Oferta de Computa\u00e7\u00e3o -label.configuration=Configura\u00e7\u00e3o -label.configure=Configurar -label.configure.ldap=Configurar LDAP -label.configure.network.ACLs=Configure ACLs de rede -label.configure.sticky.policy=Configurar Pol\u00edtica Fixa -label.configure.vpc=Configurar VPC -label.confirmation=Confirma\u00e7\u00e3o -label.confirm.password=Confirme a senha -label.congratulations=Parab\u00e9ns\! -label.conserve.mode=Modo Conservativo -label.console.proxy=Console proxy -label.console.proxy.vm=VM da Console Proxy -label.continue.basic.install=Continuar com a instala\u00e7\u00e3o b\u00e1sica -label.continue=Continuar -label.copying.iso=Copiando ISO -label.corrections.saved=Altera\u00e7\u00f5es salvas -label.counter=Contador -label.cpu.allocated=CPU Alocada -label.cpu.allocated.for.VMs=CPU Alocada por VMs -label.CPU.cap=CPU Cap -label.cpu=CPU -label.cpu.limits=Limite de CPU -label.cpu.mhz=CPU (em MHz) -label.cpu.utilized=CPU Utilizada -label.created.by.system=Criado pelo sistema -label.created=Criado -label.create.nfs.secondary.staging.storage=Cria Armazenamento NFS de Est\u00e1gio Secund\u00e1rio -label.create.nfs.secondary.staging.store=Criar storage staging secund\u00e1rio NFS -label.create.project=Criar um projeto -label.create.ssh.key.pair=Criar par de chaves SSH -label.create.template=Criar template -label.create.VPN.connection=Criar uma conex\u00e3o VPN -label.cross.zones=Inter Zonas -label.custom=Customizado -label.custom.disk.iops=IOPS personalizado -label.custom.disk.offering=Oferta de Disco customizado -label.custom.disk.size=Tamanho Customizado -label.daily=Di\u00e1rio -label.data.disk.offering=Oferta de Disco Adicional -label.date=Data -label.day=Dia -label.day.of.month=Dia do M\u00eas -label.day.of.week=Dia da Semana -label.dc.name=Nome do DC -label.dead.peer.detection=Detec\u00e7\u00e3o de correspondente morto -label.decline.invitation=Rejeitar convite -label.dedicate.cluster=Cluster Dedicado -label.dedicated=Dedicado -label.dedicate=Dedicado -label.dedicated.vlan.vni.ranges=Range(s) de VLAN/VNI Dedicados -label.dedicate.host=Dedica Host -label.dedicate.pod=Pod Dedicado -label.dedicate.vlan.vni.range=Range de VLAN/VNI Dedicado -label.dedicate.zone=Zona Dedicada -label.default.egress.policy=Pol\u00edtica padr\u00e3o de egress\u00e3o -label.default=Padr\u00e3o -label.default.use=Uso padr\u00e3o -label.default.view=Vis\u00e3o Padr\u00e3o -label.delete.acl.list=Apagar Lista ACL -label.delete.affinity.group=Deletar Grupo de Afinidade -label.delete.alerts=Remover alertas -label.delete.baremetal.rack.configuration=Deletar Configura\u00e7\u00e3o de Rack de Baremetal -label.delete.BigSwitchBcf=Remover BigSwitch BCF Controller -label.delete.BrocadeVcs=Remover Brocade Vcs Switch -label.delete.ciscoASA1000v=Apaga CiscoASA1000v -label.delete.ciscovnmc.resource=Apaga recurso CiscoVNMC -label.delete.events=Remover eventos -label.delete.F5=Remover F5 -label.delete.gateway=delete gateway -label.delete.internal.lb=Apaga LB Interno -label.delete.NetScaler=Remover NetScaler -label.delete.NiciraNvp=Remover Controlador Nvp -label.delete.NuageVsp=Remover Nuage VSD -label.delete.OpenDaylight.device=Apaga Controladora OpenDaylight -label.delete.PA=Remover Palo Alto -label.delete.portable.ip.range=Deletar Endere\u00e7os IPs Port\u00e1teis -label.delete.profile=Apaga Perfil -label.delete.project=Deletar projeto -label.delete=Remover -label.delete.secondary.staging.store=Apaga Armazenamento de Est\u00e1gio Secund\u00e1rio -label.delete.SRX=Remover SRX -label.delete.ucs.manager=Apaga Gerenciador UCS -label.delete.VPN.connection=deletar a conex\u00e3o VPN -label.delete.VPN.customer.gateway=deletar gateway de VPN de usu\u00e1rio -label.delete.VPN.gateway=deletar um gateway de VPN -label.delete.vpn.user=Deletar usu\u00e1rio VPN -label.deleting.failed=Falha ao remover -label.deleting.processing=Removendo.... -label.deny=Negar -label.deployment.planner=Deployment planejado -label.description=Descri\u00e7\u00e3o -label.destination.physical.network.id=ID de destino da rede f\u00edsica -label.destination.zone=Zona de Destino -label.destroy=Apagar -label.destroy.router=Destruir roteador -label.destroy.vm.graceperiod=Destruir Grace Period da VM -label.detaching.disk=Desplugando Disco -label.details=Detalhes -label.device.id=ID do Dispositivo -label.devices=Dispositivos -label.dhcp=DHCP -label.DHCP.server.type=Tipo de Servidor DHCP -label.direct.attached.public.ip=IP P\u00fablico COnectado Diretamente -label.direct.ips=IPs Diretos -label.disable.autoscale=Desabilita Auto-escala -label.disabled=Desativado -label.disable.host=Desabilita Host -label.disable.network.offering=Desabilita oferta de rede -label.disable.provider=Desabilitar Provider -label.disable.vnmc.provider=Habilita provedor VNMC -label.disable.vpc.offering=Desabilitar oferta VPC -label.disable.vpn=Desabilitar VPN -label.disabling.vpn.access=Desativando Acesso VPN -label.disassociate.profile.blade=Desassocia Perfil de L\u00e2mina -label.disbale.vnmc.device=Desabilita dispositivo VNMC -label.disk.allocated=Disco Alocado -label.disk.bytes.read.rate=Taxa de Leitura do Disco (BPS) -label.disk.bytes.write.rate=Taxa de Escrita no Disco (BPS) -label.disk.iops.max=M\u00e1x IOPS -label.disk.iops.min=M\u00edn IOPS -label.disk.iops.read.rate=Taxa de Leitura do Disco (IOPS) -label.disk.iops.total=IOPS Total -label.disk.iops.write.rate=Taxa de Escrita no Disco (IOPS) -label.disk.offering.details=Detalhes da oferta de disco -label.diskoffering=diskoffering -label.disk.offering=Oferta de Disco -label.disk.provisioningtype=Tipo de Provisionamento -label.disk.read.bytes=Leitura do Disco (Bytes) -label.disk.read.io=Leitura do Disk (I/O) -label.disk.size.gb=Tamanho (em GB) -label.disk.size=Tamanho do Disco -label.disk.total=Disco Total -label.disk.volume=Disco -label.disk.write.bytes=Escrita no Disco (Bytes) -label.disk.write.io=Escrita no Disco (I/O) -label.display.name=Mostrar Nome -label.display.text=Descri\u00e7\u00e3o -label.distributedrouter=Roteador Distribuido -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=Dom\u00ednio DNS para redes h\u00f3spedes -label.domain.admin=Administrador de Dom\u00ednio -label.domain.details=Detalhes do dom\u00ednio -label.domain=Dom\u00ednio -label.domain.id=ID do Dom\u00ednio -label.domain.lower=dom\u00ednio -label.domain.name=Nome do Dom\u00ednio -label.domain.router=Roteador do Dom\u00ednio -label.domain.suffix=Sufixo de Dom\u00ednio DNS (ex. xyz.com) -label.done=Pronto -label.double.quotes.are.not.allowed=Aspas duplas n\u00e3o s\u00e3o permitidas -label.download.progress=Status do Download -label.drag.new.position=Arrastar para uma nova posi\u00e7\u00e3o -label.duration.in.sec=Dura\u00e7\u00e3o (em seg) -label.dynamically.scalable=Dinamicamente Escal\u00e1vel -label.edit.acl.rule=Edita regra ACL -label.edit.affinity.group=Editar Grupo de Afinidade -label.edit=Editar -label.edit.lb.rule=Editar regra de LB -label.edit.network.details=Editar detalhes de rede -label.edit.project.details=Editar detalhes do projeto -label.edit.region=Editar Regi\u00e3o -label.edit.rule=Editar regra -label.edit.secondary.ips=Editar IPs secund\u00e1rios -label.edit.tags=Edite etiquetas -label.edit.traffic.type=Editar tipo de tr\u00e1fego -label.edit.vpc=Editar VPC -label.egress.default.policy=Pol\u00edtica de Entrada Padr\u00e3o -label.egress.rule=Regra Egress -label.egress.rules=Regras de sa\u00edda -label.elastic=El\u00e1stico -label.elastic.IP=IP El\u00e1stico -label.elastic.LB=LB El\u00e1stico -label.email=Email -label.email.lower=email -label.enable.autoscale=Habilita Auto-escala -label.enable.host=Habilita Host -label.enable.network.offering=Habilita oferta de rede -label.enable.provider=Habilitar provider -label.enable.s3=Habilita storage secund\u00e1ria fornecida por S3 -label.enable.swift=Habilitar Swift -label.enable.vnmc.device=Habilita dispositivo VNMC -label.enable.vnmc.provider=Habilita provedor VNMC -label.enable.vpc.offering=Habilitar oferta VPC -label.enable.vpn=Habilitar VPN -label.enabling.vpn.access=Ativando Acesso VPN -label.enabling.vpn=Ativando VPN -label.end.IP=IP do fim -label.endpoint.or.operation=Endpoint or Operation -label.endpoint=Ponto de acesso -label.end.port=Porta Final -label.end.reserved.system.IP=Fim dos IPs reservados para o sistema -label.end.vlan=VLAN final -label.end.vxlan=VXLAN final -label.enter.token=Digite o token -label.error.code=C\u00f3digo de Erro -label.error=Erro -label.error.upper=ERRO -label.ESP.encryption=Encripta\u00e7\u00e3o ESP -label.ESP.hash=Hash ESP -label.ESP.lifetime=Tempo de vida do ESP (segundos) -label.ESP.policy=Pol\u00edtica ESP -label.esx.host=ESX/ESXi Host -label.event.archived=Evento Arquivado -label.event.deleted=Evento Detectado -label.event=Eventos -label.every=Cada -label.example=Examplo -label.expunge=Eliminar -label.external.link=Link externo -label.extractable=Extra\u00edvel -label.extractable.lower=extra\u00edvel -label.f5.details=Detalhes do F5 -label.f5=F5 -label.failed=Falhou -label.featured=Featured -label.fetch.latest=Obter \u00faltimos -label.filterBy=Filtrar por -label.fingerprint=Impress\u00e3o Digital -label.firewall=Firewall -label.firstname.lower=primeiro nome -label.first.name=Primeiro Nome -label.format=Formato -label.format.lower=formato -label.friday=Sexta-feira -label.full=Full -label.full.path=Path completo -label.gateway=Gateway -label.general.alerts=Alertas Gerais -label.generating.url=Criando URL -label.globo.dns.configuration=Configurar GloboDNS -label.globo.dns=GloboDNS -label.gluster.volume=Disco -label.go.step.2=V\u00e1 para passo 2 -label.go.step.3=V\u00e1 para passo 3 -label.go.step.4=V\u00e1 para passo 4 -label.go.step.5=V\u00e1 para passo 5 -label.gpu=CPU -label.group.by.account=Agrupamento por conta -label.group.by.cluster=Grupo por cluster -label.group.by.pod=Grupo por pod -label.group.by.zone=Grupo por Zona -label.group=Grupo -label.group.optional=Grupo (Opcional) -label.gslb.assigned.lb=Balanceamento de carga designado -label.gslb.assigned.lb.more=Designe mais balanceamento de carga -label.gslb.delete=Apaga GSLB -label.gslb.details=Detalhes do GSLB -label.gslb.domain.name=Nome do Dom\u00ednio GSLB -label.gslb=GSLB -label.gslb.lb.details=Detalhes de balanceamento de carga -label.gslb.lb.remove=Remova balanceamento de carga deste GSLB -label.gslb.lb.rule=Regra de balanceamento de carga -label.gslb.service.private.ip=Servi\u00e7o GSLB - IP Privado -label.gslb.service.public.ip=GSLB atende IP P\u00fablico -label.gslb.service=Servi\u00e7o GSLB -label.gslb.servicetype=Tipo do Servi\u00e7o -label.guest.cidr=CIDR de rede Convidado -label.guest.end.ip=IP do fim do guest -label.guest.gateway=Gateway de rede Convidado -label.guest=Guest -label.guest.ip=Endere\u00e7o IP Convidado -label.guest.ip.range=Intervalo de rede convidado -label.guest.netmask=M\u00e1scara de rede Guest -label.guest.network.details=Detalhes de rede convidada -label.guest.networks=Redes Guest -label.guest.start.ip=IP de in\u00edcio do guest -label.guest.traffic=Tr\u00e1fego de h\u00f3spedes -label.guest.traffic.vswitch.name=Nome do vSwitch de Tr\u00e1fego Convidado -label.guest.traffic.vswitch.type=Tipo de vSwitch de Tr\u00e1fego Convidado -label.guest.type=Tipo de Guest -label.ha.enabled=HA Ativado -label.health.check.advanced.options=Op\u00e7\u00f5es avan\u00e7adas\: -label.health.check=Checagem de Sa\u00fade -label.health.check.configurations.options=Op\u00e7\u00f5es de configura\u00e7\u00e3o\: -label.health.check.interval.in.sec=Intervalo de Health Check (em seg) -label.health.check.message.desc=Seu balanceador de carga realizar\u00e1 automaticamente verifica\u00e7\u00f5es da sa\u00fade das suas inst\u00e2ncias no Cloudstack e ir\u00e1 rotear tr\u00e1fego somente para as inst\u00e2ncias que passarem nas verifica\u00e7\u00f5es. -label.health.check.wizard=Assistente de configura\u00e7\u00e3o de Health Check -label.healthy.threshold=Limiar de Sanidade -label.help=Ajuda -label.hide.ingress.rule=Ocultar Regra de Entrada -label.hints=Dicas -label.home=Home -label.host=Host -label.host.MAC=Host MAC -label.host.name=Host Name -label.hosts=Hosts -label.host.tags=Tags de Host -label.host.tag=Tag de host -label.hourly=A cada hora -label.hvm=HVM -label.hypervisor.capabilities=Recursos de Virtualizador -label.hypervisor=Hipervisor -label.hypervisors=Hypervisors -label.hypervisor.snapshot.reserve=Reserva de Snapshot do Hypervisor -label.hypervisor.type=Tipo do Hypervisor -label.hypervisor.version=Vers\u00e3o de Virtualizador -label.hyperv.traffic.label=R\u00f3tulo de tr\u00e1fego HyperV -label.id=ID -label.IKE.DH=DH IKE -label.IKE.encryption=Encripta\u00e7\u00e3o IKE -label.IKE.hash=Hash IKE -label.IKE.lifetime=Tempo de vida IKE (segundos) -label.IKE.policy=Pol\u00edtica IKE -label.info=Info -label.info.upper=INFO -label.ingress.rule=Regra de Entrada -label.initiated.by=Iniciado por -label.inside.port.profile=Perfil de Porta Interna -label.installWizard.addClusterIntro.subtitle=O que \u00e9 um cluster? -label.installWizard.addClusterIntro.title=Vamos adicionar um cluster -label.installWizard.addHostIntro.subtitle=O que \u00e9 um Host ? -label.installWizard.addHostIntro.title=Vamos adicionar um host -label.installWizard.addPodIntro.subtitle=O que \u00e9 um pod ? -label.installWizard.addPodIntro.title=Vamos adicionar um pod -label.installWizard.addPrimaryStorageIntro.subtitle=Qual \u00e9 o storage prim\u00e1rio ? -label.installWizard.addPrimaryStorageIntro.title=Vamos adicionar o storage prim\u00e1rio -label.installWizard.addSecondaryStorageIntro.subtitle=Qual \u00e9 o storage secund\u00e1rio ? -label.installWizard.addSecondaryStorageIntro.title=Vamos adicionar o storage secund\u00e1rio -label.installWizard.addZoneIntro.subtitle=O que \u00e9 uma zona? -label.installWizard.addZoneIntro.title=Vamos adicionar uma zona -label.installWizard.addZone.title=Adicionar zona -label.installWizard.click.launch=Click no bot\u00e3o executar. -label.installWizard.subtitle=Este tour vai auxiliar voc\u00ea na configura\u00e7\u00e3o da sua instala\u00e7\u00e3o de CloudStack&\#8482 -label.installWizard.title=Ol\u00e1, seja bem vindo ao CloudStack&\#8482 -label.instance=Inst\u00e2ncia -label.instance.limits=Limites da Inst\u00e2ncia -label.instance.name=Nome da Inst\u00e2ncia -label.instance.port=Instanciar Porta -label.instance.scaled.up=Inst\u00e2ncia escalada para a oferta solicitada -label.instances=Inst\u00e2ncias -label.instanciate.template.associate.profile.blade=Instancia Template e Associa Perfil \u00e0 L\u00e2mina -label.intermediate.certificate=Certificado intermedi\u00e1rio {0} -label.internal.dns.1=DNS 1 Interno -label.internal.dns.2=DNS 2 Interno -label.internal.lb.details=Detalhes de LB Interno -label.internal.lb=LB interno -label.internallbvm=LbVm Interno -label.internal.name=Nome interno -label.interval.type=Tipo de Intervalo -label.introduction.to.cloudstack=Introdu\u00e7\u00e3o ao CloudStack&\#8482 -label.invalid.integer=Invalid Integer -label.invalid.number=N\u00famero inv\u00e1lido -label.invitations=Convites -label.invite=Convidar -label.invited.accounts=Contas convidadas -label.invite.to=Convidar para -label.ip.address=Endere\u00e7o IP -label.ipaddress=Endere\u00e7o IP -label.ip.allocations=Aloca\u00e7\u00f5es de IP -label.ip=IP -label.ip.limits=Limites de IP P\u00fablico -label.ip.or.fqdn=IP ou FQDN -label.ip.range=Range de IP -label.ip.ranges=Ranges de IP -label.IPsec.preshared.key=Chave IPSec pr\u00e9 compartilhada -label.ips=IPs -label.ipv4.cidr=CIDR IPv4 -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.ipv4.end.ip=IP FInal IPv4 -label.ipv4.gateway=Gateway IPV4 -label.ipv4.netmask=M\u00e1scara de Rede IPv4 -label.ipv4.start.ip=IP Inicial IPv4 -label.ipv6.address=Endere\u00e7o IPv6 -label.ipv6.CIDR=CIDR IPv6 -label.ipv6.dns1=IPv6 DNS1 -label.ipv6.dns2=IPv6 DNS2 -label.ipv6.end.ip=IP FInal IPv6 -label.ipv6.gateway=Gateway IPv6 -label.ipv6.start.ip=IP Inicial IPv6 -label.iscsi=iSCSI -label.is.default=\u00c9\u0089 Padr\u00e3o -label.iso.boot=ISO de Boot -label.iso=ISO -label.isolated.networks=Redes Isoladas -label.isolation.method=M\u00e9todo de isolamento -label.isolation.mode=Modo Isolado -label.isolation.uri=URI de isolamento -label.is.redundant.router=Redundante -label.is.shared=\u00c9 Compartilhado -label.is.system=\u00e9 um sistema -label.item.listing=Listar items -label.japanese.keyboard=Japanese keyboard -label.keep.colon=Manter -label.keep=Manter -label.keyboard.language=Linguagem do teclado -label.keyboard.type=Tipo de Teclado -label.key=Chave -label.kvm.traffic.label=Etiqueta de tr\u00e1fego KVM -label.label=Etiqueta -label.lang.arabic=Arabe -label.lang.brportugese=Portugu\u00eas brasileiro -label.lang.catalan=Catal\u00e3o -label.lang.chinese=Chinese (Simplified) -label.lang.dutch=Holand\u00eas (Holanda) -label.lang.english=English -label.lang.french=Franc\u00eas -label.lang.german=Alem\u00e3o -label.lang.hungarian=H\u00fangaro -label.lang.italian=Italiano -label.lang.japanese=Japanese -label.lang.korean=Coreano -label.lang.norwegian=Noruegu\u00eas -label.lang.polish=Polon\u00eas -label.lang.russian=Russo -label.lang.spanish=Spanish -label.last.disconnected=Last Disconnected -label.lastname.lower=\u00faltimo nome -label.last.name=\u00daltimo Nome -label.latest.events=\u00daltimos eventos -label.launch=Executar -label.launch.vm=Executar VM -label.launch.zone=Executar zona. -label.lb.algorithm.leastconn=Least connections -label.lb.algorithm.roundrobin=Round-robin -label.lb.algorithm.source=Origem -label.LB.isolation=Isolamento de LB -label.ldap.configuration=Configura\u00e7\u00e3o do LDAP -label.ldap.group.name=Grupo LDAP -label.ldap.link.type=Tipo -label.ldap.port=Porta do LDAP -label.level=N\u00edvel -label.link.domain.to.ldap=Link Dom\u00ednio para LDAP -label.linklocal.ip=Endere\u00e7o IP do Link Local -label.load.balancer=Load Balancer -label.load.balancer.type=Tipo de Balanceamento de Carga -label.load.balancing=Balanceamento de Carga -label.load.balancing.policies=Pol\u00edticas de balanceamento de carga -label.loading=Carregando -label.local.file=Arquivo local -label.local=Local -label.local.storage.enabled=Habilitar storage local para VMs de usu\u00e1rios -label.local.storage.enabled.system.vms=Habilitar storage local para VMs de Sistema -label.local.storage=Storage Local -label.login=Entrar -label.logout=Sair -label.lun=LUN -label.LUN.number=LUN \# -label.lxc.traffic.label=R\u00f3tulo de tr\u00e1fego LXC -label.make.project.owner=Criar propriet\u00e1rio de conta de projeto -label.make.redundant=Deixar redundante -label.managed=Gerenciado -label.manage=Gerenciar -label.management=Gerenciamento -label.management.ips=Gerenciamento de Endere\u00e7os IP -label.management.server=Servidor de Gerenciamento -label.manage.resources=Gerenciar Recursos -label.max.cpus=M\u00e1ximo de cores de CPU -label.max.guest.limit=Limite m\u00e1x. de guest -label.maximum=M\u00e1ximo -label.max.instances=Inst\u00e2ncias Max -label.max.memory=M\u00e1x. de mem\u00f3ria (MiB) -label.max.networks=M\u00e1x. de redes -label.max.primary.storage=M\u00e1x. prim\u00e1rio (GiB) -label.max.public.ips=M\u00e1x. IPs p\u00fablicos -label.max.secondary.storage=Max. Secund\u00e1rio (GiB) -label.max.snapshots=Max. snapshots -label.max.templates=M\u00e1x. templates -label.max.vms=M\u00e1x. VMs de usu\u00e1rio -label.max.volumes=M\u00e1x. volumes -label.max.vpcs=M\u00e1x. VPCs -label.may.continue=Voc\u00ea pode continuar agora -label.md5.checksum=MD5 checksum -label.memory.allocated=Mem\u00f3ria Alocada -label.memory.limits=Limites de mem\u00f3ria (MiB) -label.memory.mb=Mem\u00f3ria (em MB) -label.memory=Mem\u00f3ria (em MB) -label.memory.total=Mem\u00f3ria Total -label.memory.used=Mem\u00f3ria Usada -label.menu.accounts=Contas -label.menu.alerts=Alertas -label.menu.all.accounts=Todas as Contas -label.menu.all.instances=Todas Inst\u00e2ncias -label.menu.community.isos=ISOs P\u00fablicas -label.menu.community.templates=Templates P\u00fablicos -label.menu.configuration=Configura\u00e7\u00e3o -label.menu.dashboard=Dashboard -label.menu.destroyed.instances=Inst\u00e2ncias Apagadas -label.menu.disk.offerings=Oferta de Discos -label.menu.domains=Dom\u00ednios -label.menu.events=Eventos -label.menu.featured.isos=ISOs Customizada -label.menu.featured.templates=Templates Customizados -label.menu.global.settings=Configura\u00e7\u00f5es Globais -label.menu.infrastructure=Infra-estrutura -label.menu.instances=Inst\u00e2ncias -label.menu.ipaddresses=Endere\u00e7os IP -label.menu.isos=ISOs -label.menu.my.accounts=Minhas Contas -label.menu.my.instances=Minhas Inst\u00e2ncias -label.menu.my.isos=Minhas ISOs -label.menu.my.templates=Meus Templates -label.menu.network.offerings=Oferta de Rede -label.menu.network=Rede -label.menu.physical.resources=Recursos B\u00e1\u00adsicos -label.menu.regions=Regi\u00f5es -label.menu.running.instances=Inst\u00e2ncias Rodando -label.menu.security.groups=Grupos de seguran\u00e7a -label.menu.service.offerings=Oferta de Servi\u00e7os -label.menu.snapshots=Snapshots -label.menu.sshkeypair=SSH KeyPair -label.menu.stopped.instances=Inst\u00e2ncias Paradas -label.menu.storage=Storage -label.menu.system.service.offerings=Ofertas do Sistema -label.menu.system=Sistema -label.menu.system.vms=VM de Sistemas -label.menu.templates=Templates -label.menu.virtual.appliances=Appliance Virtual -label.menu.virtual.resources=Recursos Virtuais -label.menu.volumes=Discos -label.menu.vpc.offerings=Ofertas VPC -label.metrics.allocated=Alocado -label.metrics.clusters=Clusters -label.metrics.cpu.allocated=Aloca\u00e7\u00e3o de CPU -label.metrics.cpu.max.dev=Desvio -label.metrics.cpu.total=Total -label.metrics.cpu.usage=Utiliza\u00e7\u00e3o de -label.metrics.cpu.used.avg=Usado -label.metrics.disk.allocated=Alocado -label.metrics.disk=Disco -label.metrics.disk.iops.total=IOPS -label.metrics.disk.read=Leitura -label.metrics.disk.size=Tamanho -label.metrics.disk.storagetype=Tipo -label.metrics.disk.total=Total -label.metrics.disk.unallocated=N\u00e3o alocado -label.metrics.disk.usage=Utiliza\u00e7\u00e3o do Disco -label.metrics.disk.used=Usado -label.metrics.disk.write=Escrita -label.metrics.hosts=Hosts -label.metrics.memory.allocated=Aloca\u00e7\u00e3o de Mem\u00f3ria -label.metrics.memory.max.dev=Desvio -label.metrics.memory.total=Total -label.metrics.memory.usage=Utiliza\u00e7\u00e3o de Mem\u00f3ria -label.metrics.memory.used.avg=Usado -label.metrics=Metricas -label.metrics.name=Nome -label.metrics.network.read=Leitura -label.metrics.network.usage=Utiliza\u00e7\u00e3o de Rede -label.metrics.network.write=Escrita -label.metrics.num.cpu.cores=N\u00facleos -label.metrics.property=Propriedade -label.metrics.scope=Escopo -label.metrics.state=Estado -label.metrics.storagepool=Pool de Armazanamento -label.metrics.vm.name=Nome da VM -label.migrate.instance.to.host=Migrar inst\u00e2ncia para outro host -label.migrate.instance.to=Migrar Inst\u00e2ncia para -label.migrate.instance.to.ps=Migrar inst\u00e2ncia para outro storage prim\u00e1rio -label.migrate.lb.vm=Migre LB VM -label.migrate.router.to=Migrar Roteador para -label.migrate.systemvm.to=Migrar VM de sistema para -label.migrate.to.host=Migrar para outro host -label.migrate.to.storage=Migrar para storage -label.migrate.volume=Migrar Volume -label.migrate.volume.to.primary.storage=Migrar volume para outro storage prim\u00e1rio -label.minimum=M\u00ed\u00adnimo -label.min.instances=Inst\u00e2ncias Min -label.min.past.the.hr=minutos passados da \u00faltima hora -label.minute.past.hour=minuto(s) passado(s) da \u00faltima hora -label.minutes.past.hour=minuto(s) passados da \u00faltima hora -label.mode=Modo -label.monday=Segunda -label.monthly=Mensal -label.more.templates=Mais Templates -label.move.down.row=Mover uma c\u00e9lula para baixo -label.move.to.bottom=Mover para baixo -label.move.to.top=Mover para o topo -label.move.up.row=Mover uma c\u00e9lula para cima -label.my.account=Minha Conta -label.my.network=Minha rede -label.my.templates=Meus templates -label.name.lower=Nome -label.name=Nome -label.name.optional=Nome (Opcional) -label.na=N/D -label.nat.port.range=Range de Portas NAT -label.netmask=M\u00e1scara de Rede -label.netscaler.details=Detalhes do NetScaler -label.netScaler=NetScaler -label.network.ACL=ACL de rede -label.network.ACLs=Network ACLs -label.network.ACL.total=Total de rede ACL -label.network.addVM=Adicionar rede para VM -label.network.cidr=CIDR da Rede -label.network.desc=Descri\u00e7\u00e3o de Rede -label.network.details=Detalhes da rede -label.network.device=Dispositivo de Rede -label.network.device.type=Tipo de Dispositivo de Rede -label.network.domain=Dom\u00ednio de Rede -label.network.domain.text=Texto do dom\ufffdnio de rede -label.network.id=ID de Rede -label.networking.and.security=Rede e seguran\u00e7a -label.network.label.display.for.blank.value=Utilizar gateway default -label.network.limits=Limites de rede -label.network.name=Nome da Rede -label.network.offering.details=Detalhes da oferta de rede -label.network.offering.display.text=Network Offering Display Text -label.network.offering.id=Network Offering ID -label.network.offering.name=Network Offering Name -label.network.offering=Network Offering -label.network.rate.megabytes=Taxa de Rede (MB/s) -label.network.rate=Taxa de Transfer\u00eancia -label.network.read=Network Read -label.network=Rede -label.network.service.providers=Provedores de Servi\u00e7os de Rede -label.networks=Redes -label.network.type=Tipo de Rede -label.network.write=Network Write -label.new=Novo -label.new.password=Nova Senha -label.new.project=Novo Projeto -label.new.ssh.key.pair=Novo par de chaves SSH -label.new.vm=Nova VM -label.next=Pr\u00f3ximo -label.nexusVswitch=Nexus Vswitch -label.nfs=NFS -label.nfs.server=Servidor NFS -label.nfs.storage=Storage NFS -label.nic.adapter.type=Tipo de adaptador de Rede -label.nicira.controller.address=Endere\u00e7o do Controlador -label.nicira.l2gatewayserviceuuid=Uuid do Servi\u00e7o de Gateway L2 -label.nicira.l3gatewayserviceuuid=Uuid do Servi\u00e7o de Gateway L3 -label.nicira.nvp.details=Detalhes do Nicira NVP -label.nicira.transportzoneuuid=Uuid da Zona de Transporte -label.nics=Adaptadores de Rede -label.no.actions=Sem A\u00e7\u00f5es Dispon\u00edveis -label.no.alerts=Sem Alertas Recentes -label.no.data=Sem dados para mostrar -label.no.errors=Sem Erros Recentes -label.no.grouping=(sem agrupamento) -label.no.isos=Sem ISO Dispon\u00edvel -label.no.items=Sem Itens Dispon\u00edveis -label.none=Nenhum -label.no=N\u00e3o -label.no.security.groups=Sem Security Groups Dispon\u00edveis -label.not.found=N\u00e3o Encontrado -label.no.thanks=N\u00e3o obrigado -label.notifications=Notifica\u00e7\u00f5es -label.number.of.clusters=N\u00famero de Clusters -label.number.of.cpu.sockets=O N\u00famero de Sockets de CPU -label.number.of.hosts=N\u00famero de Hosts -label.number.of.pods=N\u00famero de Pods -label.number.of.system.vms=N\u00famero de VMs de sistema -label.number.of.virtual.routers=N\u00famero de Roteadores Virtuais -label.number.of.zones=N\u00famero de Zonas -label.num.cpu.cores=\# de Core CPU -label.numretries=N\u00famero de Tentativas -label.ocfs2=OCFS2 -label.offer.ha=Offer HA -label.of.month=do m\u00eas -label.ok=OK -label.opendaylight.controller=Controlador OpenDaylight -label.opendaylight.controllerdetail=Detalhes do Controlador OpenDaylight -label.opendaylight.controllers=Controladores OpenDaylight -label.openDaylight=OpenDaylight -label.operator=Operador -label.optional=Opcional -label.order=Ordenar -label.os.preference=Prefer\u00eancia de SO -label.os.type=Tipo de SO -label.other=Outro -label.outofbandmanagement.action=A\u00e7\u00e3o -label.outofbandmanagement.address=Endere\u00e7o -label.outofbandmanagement.password=Senha -label.outofbandmanagement.port=Porta -label.outofbandmanagement.username=Nome de usu\u00e1rio -label.override.guest.traffic=Anula Tr\u00e1fego Convidado -label.override.public.traffic=Sobrep\u00f5e Tr\u00e1fego P\u00fablico -label.ovm3.cluster=Native Clustering -label.ovm3.pool=Native Pooling -label.ovm3.traffic.label=Label de trafego OVM3 -label.ovm3.vip=IP principal do Vip -label.ovm.traffic.label=R\u00f3tulo de tr\u00e1fego OVM -label.ovs=OVS -label.owned.public.ips=IP P\u00fablico Utilizado -label.owner.account=Dono da Conta -label.owner.domain=Dono do Dom\u00ednio -label.palo.alto.details=Detalhes do Palo Alto -label.PA.log.profile=Palo Alto Log Profile -label.PA=Palo Alto -label.parent.domain=Dom\u00ednio Principal -label.passive=Passivo -label.password.enabled=Senha Ativada -label.password.lower=senha -label.password.reset.confirm=A senha foi recuperada para -label.password=Senha -label.path=Caminho (Path) -label.PA.threat.profile=Palo Alto Threat Profile -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.permission=Permiss\u00e3o -label.persistent=Persistente -label.physical.network.ID=ID da rede f\u00edsica -label.physical.network.name=Nome da rede f\u00edsica -label.physical.network=Rede F\u00edsica -label.PING.CIFS.password=PING CIFS password -label.PING.CIFS.username=PING CIFS username -label.PING.dir=PING Directory -label.ping.path=Caminho do Ping -label.PING.storage.IP=Disparar PING para IP do Storage -label.planner.mode=Modo planejado -label.please.complete.the.following.fields=Por favor, preencha os seguintes campos -label.please.specify.netscaler.info=Por favor especifique as informa\u00e7\u00f5es do Netscaler -label.please.wait=Por Favor Aguarde -label.plugin.details=Detalhes do plugin -label.plugins=Plugins -label.pod.dedicated=Pod Dedicado -label.pod.name=Nome do Pod -label.pod=POD -label.pods=Pods -label.polling.interval.sec=Intervalo de Polling (em seg) -label.portable.ip=IP Port\u00e1vel -label.portable.ip.range.details=Detalhes de Range de IP Port\u00e1veis -label.portable.ip.ranges=Faixa de endere\u00e7os IPs Port\u00e1vel -label.portable.ips=IPs Port\u00e1veis -label.port.forwarding=Encaminhamento de Porta -label.port.forwarding.policies=Pol\u00edticas de redirecionamento de portas -label.port=Porta -label.port.range=Range de Porta -label.PreSetup=PreSetup -label.previous=Anterior -label.prev=Prev -label.primary.allocated=Aloca\u00e7\u00e3o do Storage Prim\u00e1rio -label.primary.network=Rede Prim\u00e1ria -label.primary.storage.count=Pools de Storage Prim\u00e1rios -label.primary.storage.limits=Limites do Storage Prim\u00e1rio (GiB) -label.primary.storage=Storage Prim\u00e1rio -label.primary.used=Uso do Storage Prim\u00e1rio -label.private.Gateway=Gateway privado -label.private.interface=Interface Privada -label.private.ip=Endere\u00e7o IP Privado -label.private.ip.range=Range de IP Privado -label.private.ips=IPs Privados -label.private.key=Chave privada -label.privatekey=PKCS\#8 Private Key -label.private.network=Rede Privada -label.private.port=Porta Privada -label.private.zone=Zona Privada -label.profile=Perfil -label.project.dashboard=Dashboard do Projeto -label.project.id=ID de Projeto -label.project.invite=Convidar para o projeto -label.project.name=Nome de projeto -label.project=Projeto -label.projects=Projetos -label.project.view=Vis\u00e3o de Projeto -label.protocol.number=N\u00famero do Protocolo -label.protocol=Protocolo -label.provider=Provedor -label.providers=Providers -label.public.interface=Interface P\u00fablica -label.public.ip=Endere\u00e7o IP P\u00fablico -label.public.ips=IPs P\u00fablicos -label.public.key=Chave p\u00fablica -label.public.lb=LB p\u00fablico -label.public.load.balancer.provider=Provedor P\u00fablico de Balanceamento de Carga -label.public.network=Rede P\u00fablica -label.public.port=Porta P\u00fablica -label.public=P\u00fablico -label.public.traffic=Tr\u00e1fego P\u00fablico -label.public.traffic.vswitch.name=Nome do vSwitch de Tr\u00e1fego P\u00fablico -label.public.traffic.vswitch.type=Tipo de vSwitch de Tr\u00e1fego P\u00fablico -label.public.zone=Zona P\u00fablica -label.purpose=Prop\u00f3sito -label.Pxe.server.type=Tipo de Servidor PXE -label.qos.type=Tipo de QoS -label.quickview=Visualiza\u00e7\u00e3o r\u00e1pida -label.quiesce.vm=Quiesce VM -label.quiet.time.sec=Tempo Silencioso (em seg) -label.quota.add.credits=Adicionar Cr\\u00e9ditos -label.quota.balance=Saldo -label.quota.configuration=Configura\\u00e7\\u00e3o da Tarifa -label.quota.configure=Configure a Cota -label.quota.credit=Cr\\u00e9dito -label.quota.credits=Cr\\u00e9ditos -label.quota.date=Data -label.quota.dates=Atualizar Data -label.quota.description=Descri\\u00e7\\u00e3o -label.quota.email.body=Corpo do Email -label.quota.email.lastupdated=\\u00daltima atualiza\\u00e7\\u00e3o -label.quota.email.subject=Assunto -label.quota.email.template=Template de Email -label.quota.enddate=Data de Fim -label.quota.endquota=Fim -label.quota.enforcequota=Bloquear Conta p\\u00f3s Limite -label.quota.fullsummary=Todas as Contas -label.quota.minbalance=Saldo M\\u00ednimo -label.quota.remove=Remover Cota -label.quota.startdate=Data de In\\u00edcio -label.quota.startquota=In\\u00edcio -label.quota.state=Estado -label.quota.statement.balance=Saldo -label.quota.statement.bydates=Demonstrativo -label.quota.statement=Demonstrativo -label.quota.statement.quota=Utiliza\\u00e7\\u00e3o -label.quota.statement.tariff=Tarifa -label.quota.summary=Sum\\u00e1rio -label.quota.tariff.edit=Editar Tarifa -label.quota.tariff.effectivedate=Data Efetiva -label.quota.tariff=Tarifa -label.quota.tariff.value=Valor da Tarifa -label.quota.total=Total -label.quota.totalusage=Uso Total -label.quota.type.name=Tipo -label.quota.type.unit=Unidade -label.quota.usage=Consumo da Cota -label.quota.value=Valor -label.rbd.id=Usu\u00e1rio Ceph -label.rbd.monitor=Monitor Ceph -label.rbd.pool=Pool Ceph -label.rbd=RDB -label.rbd.secret=Cephx secret -label.reboot=Reiniciar -label.recent.errors=Erros Recentes -label.recover.vm=Recuperar VM -label.redundant.router.capability=Recurso de roteador redundante -label.redundant.router=Roteador Redundantee -label.redundant.state=Estado redundante -label.redundant.vpc=VPC Redundante -label.refresh=Atualizar -label.refresh.blades=Atualizar L\u00e2minas -label.region.details=Detalhes da regi\u00e3o -label.regionlevelvpc=VPC a N\u00edvel de Regi\u00e3o -label.region=Regi\u00e3o -label.reinstall.vm=Reinstalar VM -label.related=Relacionado -label.release.account=Liberar de Conta -label.release.account.lowercase=LIberar de conta -label.release.dedicated.cluster=Libera Cluster Dedicado -label.release.dedicated.host=Libera Host Dedicado -label.release.dedicated.pod=LIberar Pod Dedicado -label.release.dedicated.vlan.range=Liberar range de VLAN dedicado -label.release.dedicated.zone=Liberar Zona Dedicada -label.remind.later=Me lembre depois -label.remove.ACL=Remove ACL -label.remove.egress.rule=Remover regra egress -label.remove.from.load.balancer=Removendo Inst\u00e2ncia do balanceador de carga -label.remove.ingress.rule=Remover regra ingress -label.remove.ip.range=Remover range de IP -label.remove.ldap=Remover LDAP -label.remove.network.offering=Remove oferta de rede -label.remove.pf=Remover regra de redirecionamento de porta -label.remove.project.account=Remover conta de projeto -label.remove.region=Remover Regi\u00e3o -label.remove.rule=Remover regra -label.remove.ssh.key.pair=Remover par de chaves SSH -label.remove.static.nat.rule=Remover regra de NAT est\u00e1tico -label.remove.static.route=Remover rota est\u00e1tica -label.remove.this.physical.network=Remover esta rede f\u00edsica -label.remove.tier=Remover camada -label.remove.vm.from.lb=Remover VM da regra de balanceamento de carga -label.remove.vm.load.balancer=Remover VM do balanceamento de carga -label.remove.vmware.datacenter=Remover Datacenter VMware -label.remove.vpc.offering=Remover oferta VPC -label.remove.vpc=remover a VPC -label.removing=Removendo -label.removing.user=Removendo Usu\u00e1rio -label.reource.id=ID do Recurso -label.replace.acl.list=Substituir Lista ACL -label.replace.acl=Substituir ACL -label.required=Obrigat\u00f3rio -label.requires.upgrade=Requer Atualiza\u00e7\u00e3o -label.reserved.ip.range=Faixa de IP Reservada -label.reserved.system.gateway=Gateway de sistema reservado -label.reserved.system.ip=IP de Sistema Reservado -label.reserved.system.netmask=M\u00e1scara de rede reservada do sistema -label.reset.ssh.key.pair.on.vm=Recriar par de chaves SSH na VM -label.reset.ssh.key.pair=Recriar par de chaves SSH -label.resetVM=Restabelecer VM -label.reset.VPN.connection=Resetar a conex\u00e3o VPN -label.resize.new.offering.id=New Offering -label.resize.new.size=Novo Tamanho (GB) -label.resize.shrink.ok=Shrink OK -label.resource.limit.exceeded=Limite de Recurso Excedido -label.resource.limits=Limite de Recursos -label.resource.name=Nome do Recurso -label.resource=Recurso -label.resources=Recursos -label.resource.state=Estado do Recurso -label.response.timeout.in.sec=Timeout de Resposta (em seg) -label.restart.network=Reiniciar rede -label.restart.required=Reiniciar obrigat\u00f3rio -label.restart.vpc=reiniciar a VPC -label.restore=Restaurar -label.retry.interval=Intervalo de repeti\u00e7\u00e3o -label.review=Revisar -label.revoke.project.invite=Revogar convite -label.role=Fun\u00e7\u00e3o -label.root.certificate=Certificado Root -label.root.disk.controller=Controlador do disco Root -label.root.disk.offering=Oferta de Disco ROOT -label.root.disk.size=Tamanho do disco root (GB) -label.router.vm.scaled.up=VM do Roteador Escalonada -label.routing.host=Host de Roteamento -label.routing=Roteamento -label.rule.number=Regra N\u00famero -label.rule=Regra -label.rules=Regras -label.running.vms=VMs Rodando -label.s3.access_key=Chave de acesso -label.s3.bucket=Balde -label.s3.connection_timeout=Tempo limite de conex\u00e3o -label.s3.endpoint=Ponto de acesso -label.s3.max_error_retry=Limite de tentativas de recupera\u00e7\u00e3o de erro -label.s3.nfs.path=Caminho NFS S3 -label.s3.nfs.server=Servidor NFS S3 -label.s3.secret_key=Chave Secreta -label.s3.socket_timeout=Tempo limite no socket -label.s3.use_https=Use HTTPS -label.saml.enable=Autorizar SAML SSO -label.saml.entity=Provedor de Identidade -label.saturday=S\u00e1bado -label.save.and.continue=Salvar e continuar -label.save.changes=Salvar altera\u00e7\u00f5es -label.save=Salvar -label.saving.processing=Salvando.... -label.scaledown.policy=Pol\u00edtica de redu\u00e7\u00e3o -label.scaleup.policy=Pol\u00edtica de amplia\u00e7\u00e3o -label.scale.up.policy=Pol\u00edtica de Escalonamento -label.scope=Escopo -label.search=Pesquisar -label.secondary.ips=IPs secund\u00e1rios -label.secondary.isolated.vlan.id=ID de VLAN Secund\u00e1ria Isolada -label.secondary.staging.store=Armazenamento de Est\u00e1gio Secund\u00e1rio -label.secondary.staging.store.details=Detalhes do Armazenamento de Est\u00e1gio Secund\u00e1rio -label.secondary.storage.count=Pools de Storage secund\u00e1rios -label.secondary.storage.details=Detalhes de armazenamento secund\u00e1rio -label.secondary.storage.limits=Limites do Storage Secund\u00e1rio (GiB) -label.secondary.storage=Storage Secund\u00e1rio -label.secondary.storage.vm=VM de storage secund\u00e1rio -label.secondary.used=Uso do Storage Secund\u00c3\u00a1rio -label.secret.key=Chave Secreta -label.security.group.name=Nome do Security Group -label.security.group=Security Group -label.security.groups.enabled=Security Groups Ativado -label.security.groups=Grupos de seguran\u00e7a -label.select.a.template=Selecione um template -label.select.a.zone=Selecione uma zona -label.select.instance=Selecionar inst\u00e2ncia -label.select.instance.to.attach.volume.to=Escolha uma inst\u00e2ncia para conectar o volume -label.select.iso.or.template=Selecione ISO ou template -label.select.offering=Selecionar Oferta -label.select.project=Selecionar Projeto -label.select.region=Selecione Regi\u00e3o -label.select=Selecionar -label.select.template=Seleciona Template -label.select.tier=Selecione camada -label.select-view=Selecionar visualiza\u00e7\u00e3o -label.select.vm.for.static.nat=Selecionar VM para NAT est\u00e1tico -label.sent=Enviado -label.server=Servidor -label.service.capabilities=Recursos de servi\u00e7os -label.service.offering.details=Detalhes da oferta de servi\u00e7o -label.service.offering=Plano -label.services=Servi\u00e7os -label.service.state=Estado do Servi\u00e7o -label.session.expired=Sess\u00e3o Expirada -label.set.default.NIC=Configurar para NIC padr\u00e3o -label.settings=Ajustes -label.setup=Configura\u00e7\u00e3o -label.setup.network=Configurar Rede -label.setup.zone=Configurar Zona -label.set.up.zone.type=Configurar tipo de zona -label.shared=Compatilhado -label.SharedMountPoint=SharedMountPoint -label.show.advanced.settings=Mostra ajustes avan\u00e7ados -label.show.ingress.rule=Mostrar Regra de Entrada -label.shutdown.provider=Desabilitar provider -label.simplified.chinese.keyboard=Simplified Chinese keyboard -label.site.to.site.VPN=Site-to-site VPN -label.size=Tamanho -label.skip.guide=Eu utilizei o CloudStack antes, pular este guia -label.smb.domain=Dom\u00ednio SMB -label.smb.password=Senha SMB -label.smb.username=Usu\u00e1rio SMB -label.snapshot.limits=Limites de Snapshot -label.snapshot.name=Nome do Snapshot -label.snapshot.schedule=Configurar Snapshot Recorrente -label.snapshot=Snapshot -label.snapshot.s=Snapshots -label.snapshots=Snapshots -label.SNMP.community=Comunidade SNMP -label.SNMP.port=Porta SNMP -label.sockets=Sockets -label.source.ip.address=Endere\u00e7o IP de origem -label.source.nat=Source NAT -label.source.nat.supported=SourceNAT Supportado -label.source.port=Porta de origem -label.specify.IP.ranges=Especifique range de IP -label.specify.vlan=Especificar VLAN -label.specify.vxlan=Especificar VXLAN -label.SR.name=SR Name-Label -label.srx.details=Detalhes do SRX -label.srx=SRX -label.ssh.key.pair.details=Detalhes do par de chaves SSH -label.ssh.key.pair=Par de chaves SSH -label.ssh.key.pairs=Par de chaves SSH -label.standard.us.keyboard=Standard (US) keyboard -label.start.IP=IP do in\u00edcio -label.start.lb.vm=Iniciar LB VM -label.start.port=Porta de In\u00edcio -label.start.reserved.system.IP=In\u00edcio dos IPs reservados para o sistema -label.start.vlan=VLAN Inicial -label.start.vxlan=VXLAN Inicial -label.state=Estado -label.static.nat.enabled=NAT est\u00e1tico Habilitado -label.static.nat=NAT Est\u00e1tico -label.static.nat.to=NAT Est\u00e1tico para -label.static.nat.vm.details=Detalhes de NAT est\u00e1tico da VM -label.static.routes=Rotas est\u00e1ticas -label.statistics=Estat\u00edsticas -label.status=Estado -label.step.1=Passo 1 -label.step.1.title=Passo 1\: Selecione o Template -label.step.2=Passo 2 -label.step.2.title=Passo 2\: Plano -label.step.3=Passo 3 -label.step.3.title=Passo 3\: Selecione o Disco Adicional -label.step.4=Passo 4 -label.step.4.title=Passo 4\: Rede -label.step.5=Passo 5 -label.step.5.title=Passo 5\: Revisar -label.stickiness=Ader\u00eancia -label.stickiness.method=M\u00e9todo de Stickness -label.sticky.cookie-name=Nome do Cookie -label.sticky.domain=Dom\u00ednio -label.sticky.expire=Expires -label.sticky.holdtime=Tempo de espera -label.sticky.indirect=Indireto -label.sticky.length=Tamanho -label.sticky.mode=Modo -label.sticky.name=Nome Sticky -label.sticky.nocache=Sem Cache -label.sticky.postonly=Apenas publicar -label.sticky.prefix=Prefixo -label.sticky.request-learn=Solicitar para aprender -label.sticky.tablesize=Tamanho da Tabela -label.stop.lb.vm=Pare LB VM -label.stop=Parar -label.stopped.vms=VMs Paradas -label.storage.pool=Pool de Armazanamento -label.storage=Storage -label.storage.tags=Tags de Storage -label.storage.traffic=Tr\u00e1fego do Storage -label.storage.type=Tipo de Storage -label.subdomain.access=Acesso ao subdom\u00ednio -label.submit=Enviar -label.submitted.by=[Enviado por\: ] -label.succeeded=Sucedido -label.sunday=Domingo -label.super.cidr.for.guest.networks=Super CIDR para redes h\u00f3spedes -label.supported.services=Servi\u00e7os Suportados -label.supported.source.NAT.type=Tipo de Source NAT Suportado -label.supportsstrechedl2subnet=Suporte \u00e0 Streched L2 Subnet -label.suspend.project=Suspender Projeto -label.switch.type=Tipo de Switch -label.system.capacity=Capacidade do Sistema -label.system.offering.for.router=Oferta do Sistema para Roteador -label.system.offering=Ofertas de Sistema -label.system.service.offering.details=Detalhes da oferta de servi\u00e7o de sistema -label.system.service.offering=System Service Offering -label.system.vm.details=Detalhes do System VM -label.system.vm.scaled.up=System VM Escalonada -label.system.vms=VM de Sistemas -label.system.vm.type=Tipo de VM de Sistema -label.system.vm=VM de Sistema -label.system.wide.capacity=Capacidade Total do Sistema -label.tagged=Tagged -label.tag.key=Chave -label.tags=Tags -label.tag.value=Valor -label.target.iqn=Target IQN -label.task.completed=Tarefa completa -label.template.limits=Limites do Template -label.template=Template -label.TFTP.dir=TFTP Directory -label.tftp.root.directory=Diret\u00f3rio raiz do tftp -label.theme.default=Tema Padr\u00e3o -label.theme.grey=Custom - Grey -label.theme.lightblue=Custom - Light Blue -label.threshold=Limiar -label.thursday=Quinta -label.tier=Camada -label.tier.details=Detalhes da camada -label.time.colon=Tempo\: -label.timeout.in.second = Timeout (segundos) -label.timeout=Timeout -label.time=Time -label.timezone.colon=Fuso Hor\u00e1rio -label.time.zone=Fuso Hor\u00e1rio -label.timezone=Fuso Hor\u00e1rio -label.token=Token -label.total.cpu=CPU TOTAL -label.total.CPU=CPU TOTAL -label.total.hosts=Total de Hosts -label.total.memory=Total de Mem\u00f3ria -label.total.of.ip=Total de Endere\u00e7os IPs -label.total.of.vm=Total VMs -label.total.storage=Totam de Storage -label.total.virtual.routers=Total de Roteadores Virtuais -label.total.virtual.routers.upgrade=Total de Roteadores Virtuais que requerem atualiza\u00e7\u00e3o -label.total.vms=Total VMs -label.traffic.label=Etiqueta de tr\u00e1fego -label.traffic.types=Tipos de Tr\u00e1fego -label.traffic.type=Tipo de Tr\u00e1fego -label.tuesday=Ter\u00e7a -label.type.id=Tipo do ID -label.type.lower=tipo -label.type=Tipo -label.ucs=UCS -label.uk.keyboard=UK keyboard -label.unavailable=Indispon\u00edvel -label.unhealthy.threshold=Limiar de Insalubridade -label.unlimited=Ilimitado -label.untagged=N\u00e3o Marcado -label.update.project.resources=Atualizar recursos de projeto -label.update.ssl= Atualizar Certificado SSL -label.update.ssl.cert= Atualizar Certificado SSL -label.updating=Atualizando -label.upgrade.required=Atualiza\u00e7\u00e3o \u00e9 necess\u00e1ria -label.upgrade.router.newer.template=Atualize Roteador Para Usar Template Mais Novo -label.upload=Enviar -label.upload.from.local=Fazer upload local -label.upload.template.from.local=Upload de Template Local -label.upload.volume=Enviar o Volume -label.upload.volume.from.local=Upload de Volume Local -label.upload.volume.from.url=Upload de volume por URL -label.url=URL -label.usage.interface=Usage Interface -label.usage.sanity.result=Resultado de Sanidade de Uso -label.usage.server=Uso do Servidor -label.usage.type=Uso Tipo -label.usage.unit=Unidade -label.used=Usado -label.user.data=Dados de Usu\u00e1rio -label.user.details=Detalhes do usu\u00e1rio -label.username.lower=nome do usu\u00e1rio -label.username=Nome de usu\u00e1rio -label.users=Usu\u00e1rios -label.user=Usu\u00e1rio -label.user.vm=VM do Usu\u00e1rio -label.use.vm.ips=Usa IPs da VM -label.use.vm.ip=Usar IP da VM\: -label.value=Valor -label.vcdcname=Nome do vCenter DC -label.vcenter.cluster=vCenter Cluster -label.vcenter.datacenter=vCenter Datacenter -label.vcenter.datastore=vCenter Datastore -label.vcenter.host=vCenter Host -label.vcenter.password=vCenter Password -label.vcenter.username=vCenter Username -label.vcenter=vcenter -label.vcipaddress=Endere\u00e7o IP do vCenter -label.version=Vers\u00e3o -label.vgpu.max.resolution=Resulo\u00e7\u00e3o max -label.vgpu.max.vgpu.per.gpu=vGPU por GPU -label.vgpu.remaining.capacity=Capacidade restante -label.vgpu.type=Tipo de vGPU -label.vgpu=VGPU -label.vgpu.video.ram=RAM de v\u00eddeo -label.view.all=Visualizar tudo -label.view.console=Visualizar Console -label.viewing=Visualizar -label.view.more=Ver mais -label.view.secondary.ips=Visualizar os IPs secund\u00e1rios -label.view=Visualizar -label.virtual.appliance=Appliance Virtual -label.virtual.appliance.details=Detalhes de appliance virtual -label.virtual.appliances=Appliance Virtual -label.virtual.machine=Maquina Virtual -label.virtual.machines=Maquinas Virtuais -label.virtual.networking=Rede Virtual -label.virtual.network=Rede Virtual -label.virtual.router=Roteador Virtual -label.virtual.routers.group.account=Grupo de Roteadores Virtuais por conta -label.virtual.routers.group.cluster=Grupo de Roteadores Virtuais por cluster -label.virtual.routers.group.pod=Grupo de Roteadores Virtuais por pod -label.virtual.routers.group.zone=Grupo de Roteadores Virtuais por Zona -label.virtual.routers=Roteadores Virtuais -label.vlan.id=VLAN ID -label.vlan.only=VLAN -label.vlan.range.details=Detalhes de range VLAN -label.vlan.range=Intervalo de VLAN -label.vlan.ranges=Range(s) de VLAN -label.vlan=VLAN -label.vlan.vni.range=Intervalo de VLAN -label.vlan.vni.ranges=Range(s) de VLAN/VNI -label.vm.add=Adicionar Inst\u00e2ncia -label.vm.destroy=Apagar -label.vm.display.name=Nome de exibi\u00e7\u00e3o da VM -label.VMFS.datastore=VMFS datastore -label.vmfs=VMFS -label.vm.id=ID da VM -label.vm.ip=Endere\u00e7o IP da VM -label.vm.name=Nome da VM -label.vm.password=Senha para a VM \u00e9 -label.vm.reboot=Reiniciar -label.VMs.in.tier=M\u00e1quinas virtuais em camadas -label.vmsnapshot.current=isCurrent -label.vmsnapshot.memory=Snapshot da mem\u00f3ria -label.vmsnapshot.parentname=Pai -label.vmsnapshot=Snapshot da VM -label.vmsnapshot.type=Tipo -label.vm.start=In\u00edcio -label.vm.state=Estado da VM -label.vm.stop=Parar -label.vms=VMs -label.vmware.datacenter.id=ID do datacenter VMware -label.vmware.datacenter.name=Nome do datacenter VMware -label.vmware.datacenter.vcenter=Vcednter do datacenter VMware -label.vmware.traffic.label=Etiqueta de tr\u00e1fego VMware -label.vnet.id=VLAN ID -label.vnet=VLAN -label.vnmc.devices=Dispositivos VNMC -label.vnmc=VNMC -label.volatile=Vol\u00e1til -label.volgroup=Grupo de Volume -label.volume.details=Detalhe do volume -label.volume=Disco -label.volume.limits=Limites de Disco -label.volume.migrated=Volume migrado -label.volume.name=Nome do Disco -label.volumes=Discos -label.vpc.distributedvpcrouter=Roteador VPC Distribuido -label.vpc.id=VPC ID -label.VPC.limits=Limites VPC -label.vpc.offering.details=Detalhes da oferta VPC -label.vpc.offering=Oferta VPC -label.VPC.router.details=Detalhes de roteador de VPC -label.vpc.router.details=Detalhes do roteador da VPC -label.vpc.supportsregionlevelvpc=Suporta VPC em N\u00edvel de Regi\u00e3o -label.vpc.virtual.router=Roteador Virtual VPC -label.vpc=VPC -label.VPN.connection=Conex\u00e3o VPN -label.vpn.customer.gateway=Gateway de VPN de usu\u00e1rio -label.VPN.customer.gateway=Gateway de VPN de usu\u00e1rio -label.vpn.force.encapsulation=For\u00e7ar encapsulamento UDP de pacotes ESP -label.VPN.gateway=Gateway de VPN -label.vpn=VPN -label.vsmctrlvlanid=Control VLAN ID -label.vsmpktvlanid=Packet VLAN ID -label.vsmstoragevlanid=Storage VLAN ID -label.vsphere.managed=vSphere Managed -label.vswitch.name=Nome do vSwitch -label.vSwitch.type=Tipo do vSwitch -label.vxlan.id=VXLAN ID -label.vxlan.range=Intervalo de VXLAN -label.vxlan=VXLAN -label.waiting=Aguardando -label.warn=Avisar -label.warning=Aten\u00e7\u00e3o -label.warn.upper=AVISO -label.wednesday=Quarta-Feira -label.weekly=Semanal -label.welcome=Bem-Vindo -label.welcome.cloud.console=Painel de Controle -label.what.is.cloudstack=O que \u00e9 o CloudStack&\#8482? -label.xenserver.tools.version.61.plus=Vers\u00e3o original do XS \u00e9 6.1\\+ -label.Xenserver.Tools.Version61plus=Vers\u00e3o original do XS \u00e9 6.1\\+ -label.xenserver.traffic.label=Etiqueta de tr\u00e1fego XenServer -label.yes=Sim -label.zone.dedicated=Zona Dedicada -label.zone.details=Detalhes de zona -label.zone.id=ID da Zona -label.zone.lower=Zona -label.zone.name=Nome da zona -label.zone.step.1.title=Passo 1\: Selecionar a Rede -label.zone.step.2.title=Passo 2\: Adicionar a Zona -label.zone.step.3.title=Passo 3\: Adicionar o POD -label.zone.step.4.title=Passo 4\: Adicionar um Intervalo de IP -label.zones=Zonas -label.zone.type=Tipo de Zona -label.zone.wide=Zone-Wide -label.zoneWizard.trafficType.guest=H\u00f3spede\: tr\u00e1fego entre m\u00e1quinas virtuais de usu\u00e1rios finais -label.zoneWizard.trafficType.management=Ger\u00eancia\: Tr\u00e1fego entre recursos internos do CloudStack incluindo quaisquer componentes que se comunicam com o servidor de gerenciamento tais como hosts e m\u00e1quinas virtuais de sistema do CloudStack -label.zoneWizard.trafficType.public=P\u00fablico\: tr\u00e1fego entre a internet e m\u00e1quinas virtuais na nuvem. -label.zoneWizard.trafficType.storage=Storage\: tr\u00e1fego entre servidores de storage prim\u00e1ria e secund\u00e1ria, tais como templates de m\u00e1quinas virtuais e snapshots -label.zone=Zona -managed.state=Status do Gerenciamento -message.acquire.ip.nic=Por favor, confirme que voc\u00ea deseja adquirir um novo IP secund\u00e1rio para esta Interface de Rede.
NOTA\: Voc\u00ea precisa configurar manualmente o novo IP secund\u00e1rio dentro da maquinas virtual. -message.acquire.new.ip=Por favor confirme que voc\u00ea gostaria de adquirir um novo IP para esta rede. -message.acquire.new.ip.vpc=Por favor confirme que voc\u00ea gostaria de adquirir um novo IP para esta VPC. -message.acquire.public.ip=Selecione a zona de onde voc\u00ea deseja adquirir o novo IP -message.action.cancel.maintenance=A Manuten\u00e7\u00e3o do seu HOST foi cancelada com sucesso -message.action.cancel.maintenance.mode=Confirme que voc\u00ea deseja cancelar esta Manuten\u00e7\u00e3o -message.action.change.service.warning.for.instance=Sua inst\u00e2ncia deve ser desligada antes de tentar alterar a oferta de servi\u00e7os utilizada. -message.action.change.service.warning.for.router=O roteador precisa ser desligado antes de trocar o plano/tamanho. -message.action.delete.cluster=Confirme que voc\u00ea deseja excluir este HOST -message.action.delete.disk.offering=Confirme que voc\u00ea deseja excluir esta oferta de disco -message.action.delete.domain=Confirme que voc\u00ea deseja excluir este Dom\u00ednio -message.action.delete.external.firewall=Confirme que voc\u00ea gostaria de remover este Firewall externo. Aviso\: Se voc\u00ea Est\u00e1 planejando adicionar novamente este mesmo Firewall, \u00e9 necess\u00e1rio apagar os contadores do dispositivo. -message.action.delete.external.load.balancer=Confirme que voc\u00ea gostaria de remover este Load Balancer Externo. Aviso\: Se voc\u00ea Est\u00e1 planejando adicionar novamente este mesmo Load Balancer, \u00e9 necess\u00e1rio apagar os contadores do dispositivo. -message.action.delete.ingress.rule=Confirme que voc\u00ea deseja excluir esta regra de entrada. -message.action.delete.ISO=Confirme que voc\u00ea deseja excluir esta ISO -message.action.delete.ISO.for.all.zones=Esta ISO \u00e9 usada por todas as Zonas. Confirme se voc\u00ea deseja excluir a ISO de todas as Zonas -message.action.delete.network=Confirme que voc\u00ea deseja remover esta rede. -message.action.delete.nexusVswitch=Por favor confirme que voc\ufffd deseja remover este nexusVswitch. -message.action.delete.nic=Por favor, confirme que deseja remover esta Interface de Rede, esta a\u00e7\u00e3o tamb\u00e9m ir\u00e1 remover a rede associada \u00e0 VM. -message.action.delete.physical.network=Por favor confirme que voc\u00ea deseja deletar esta rede f\u00edsica -message.action.delete.pod=Confirme que voc\u00ea deseja remover este POD. -message.action.delete.primary.storage=Confirme que voc\u00ea deseja remover este Storage Prim\u00e1rio. -message.action.delete.secondary.storage=Confirme que voc\u00ea deseja remover este Storage Secund\u00e1rio. -message.action.delete.security.group=Confirme que voc\u00ea deseja remover este Security Group. -message.action.delete.service.offering=Confirme que voc\u00ea deseja remover este Plano. -message.action.delete.snapshot=Confirme que voc\u00ea deseja remover este Snapshot. -message.action.delete.system.service.offering=Por favor confirme que voc\u00ea deseja deletar esta oferta de servi\u00e7o de sistema. -message.action.delete.template=Confirme que voc\u00ea deseja remover este Template. -message.action.delete.template.for.all.zones=Este Template \u00e9 usado por todas as zonas. Confirme que voc\u00ea deseja remover o Template de todas as zonas. -message.action.delete.volume=Confirme que voc\u00ea deseja remover este Disco. -message.action.delete.zone=Confirme que voc\u00ea deseja remover esta Zona. -message.action.destroy.instance=Por favor, confirme que voc\u00ea deseja excluir esta Inst\u00e2ncia. -message.action.destroy.systemvm=Confirme que voc\u00ea deseja excluir esta VM de Sistema. -message.action.disable.cluster=Confirma a desativa\u00e7\u00e3o do cluster. -message.action.disable.nexusVswitch=Por favor confirme que voc\ufffd deseja desabilitar este nexusVswitch -message.action.disable.physical.network=Por favor confirme que voc\u00ea deseja desabilitar esta rede f\u00edsica. -message.action.disable.pod=Confirma a desativa\u00e7\u00e3o do POD. -message.action.disable.static.NAT=Confirme que voc\u00ea deseja desativar o NAT Est\u00e1tico. -message.action.disable.zone=Confirma a desativa\u00e7\u00e3o da zona. -message.action.downloading.template=Baixando template -message.action.download.iso=Por favor confirme que voc\u00ea deseja baixar esta ISO. -message.action.download.template=Por favor confirme que voc\u00ea deseja baixar este template. -message.action.enable.cluster=Confirma a ativa\u00e7\u00e3o do cluster. -message.action.enable.maintenance=O Host foi preparado com sucesso para Manuten\u00e7\u00e3o. Este processo poder\u00e1 levar alguns minutos ou mais dependendo do n\u00famero de VMs hospedadas neste Host. -message.action.enable.nexusVswitch=Por favor confirme que voc\ufffd deseja habilitar este nexusVswitch. -message.action.enable.physical.network=Por favor confirme que voc\u00ea deseja habilitar esta rede f\u00edsica. -message.action.enable.pod=Confirma a ativa\u00e7\u00e3o do POD. -message.action.enable.zone=Confirma a ativa\u00e7\u00e3o da zona. -message.action.expunge.instance=Por favor, confirme que voc\u00ea deseja eliminar esta inst\u00e2ncia. -message.action.force.reconnect=O procedimento de reconex\u00e3o for\u00e7ada foi preparado com sucesso. Este processo poder\u00e1 levar alguns minutos. -message.action.host.enable.maintenance.mode=Ativar o modo de Manuten\u00e7\u00e3o ir\u00e1 causar o live migration de todas as Inst\u00e2ncias hospedadas neste Host para o pr\u00f3ximo dispon\u00edvel. -message.action.instance.reset.password=Por favor confirme que voc\u00ea deseja alterar a senha de ROOT para est\u00e1 m\u00e1quina virtual. -message.action.manage.cluster=Confirma a vincula\u00e7\u00e3o do cluster. -message.action.primarystorage.enable.maintenance.mode=Aviso\: Colocar o Storage prim\u00e1rio em modo de Manuten\u00e7\u00e3o ir\u00e1 causar a parada de todas as VMs hospedadas nesta unidade. Deseja continuar? -message.action.reboot.instance=Por favor, confirme que voc\u00ea deseja reiniciar esta inst\u00e2ncia. -message.action.reboot.router=Confirme que voc\ufffd deseja reiniciar este roteador. -message.action.reboot.systemvm=Confirme que voc\u00ea deseja reiniciar esta VM de sistema. -message.action.release.ip=Confirme que voc\u00ea deseja liberar este IP. -message.action.remove.host=Favor confirmar que voc\u00ea deseja remover este host. -message.action.reset.password.off=Sua Inst\u00e2ncia n\u00e3o suporta esta funcionalidade. -message.action.reset.password.warning=Para recuperar a senha \u00e9 necess\u00e1rio parar a Inst\u00e2ncia. -message.action.restore.instance=Por favor, confirme que voc\u00ea deseja restaurar esta Inst\u00e2ncia. -message.action.revert.snapshot=Por favor, confirme que voc\u00ea deseja reverter o seu volume deste snapshot. -message.action.start.instance=Por favor, confirme que voc\u00ea deseja iniciar esta Inst\u00e2ncia. -message.action.start.router=Confirme que voc\u00ea deseja inciar este roteador. -message.action.start.systemvm=Confirme que voc\u00ea deseja iniciar esta VM de sistema. -message.action.stop.instance=Por favor, confirme que voc\u00ea deseja parar esta inst\u00e2ncia. -message.action.stop.router=Confirme que voc\ufffd deseja parar este roteador. -message.action.stop.systemvm=Confirme que voc\u00ea deseja parar esta VM de Sistema. -message.action.take.snapshot=Por favor confirme que voc\u00ea deseja criar um snapshot deste volume. -message.action.unmanage.cluster=Confirma a desvincula\u00e7\u00e3o do cluster. -message.action.vmsnapshot.delete=Por favor, confirme que voc\u00ea deseja excluir este snapshot da VM. -message.action.vmsnapshot.revert=Reverter snapshot da VM -message.activate.project=Voc\u00ea tem certeza que deseja ativar este projeto ? -message.add.cluster=Add a hypervisor managed cluster for zone , pod -message.add.cluster.zone=Add a hypervisor managed cluster for zone -message.add.disk.offering=Especifique o seguintes par\u00e2metros para adicionar uma nova oferta de disco. -message.add.domain=Por favor especifique o subdom\u00ednio que voc\u00ea deseja criar neste dom\u00ednio -message.added.new.nuage.vsp.controller=Adicionada nova Controladora Nuage Vsp -message.added.vpc.offering=Adicionada oferta VPC -message.add.firewall=Adicionar Firewall \u00e0\u00a0 zona. -message.add.guest.network=Por favor confirme que voc\u00ea gostaria de adicionar uma rede guest. -message.add.host=Especifique os seguintes par\u00e2metros para adicionar um novo host. -message.adding.host=Adicionando host -message.adding.Netscaler.device=Adicionando dispositivo Nescaler -message.adding.Netscaler.provider=Adicionando Netscaler provider -message.add.ip.range=Add an IP range to public network in zone -message.add.ip.range.direct.network=Add an IP range to direct network in zone -message.add.ip.range.to.pod=

Add an IP range to pod\:

-message.additional.networks.desc=Por favor, selecione a(s) rede(s) adicionais que sua inst\u00e2ncia virtual estar\u00e1 conectada. -message.add.load.balancer=Add a load balancer to zone -message.add.load.balancer.under.ip=A regra do balanceador de carga foi adicionada para o IP\: -message.add.network=Add a new network for zone\: -message.add.new.gateway.to.vpc=Favor especificar a informa\u00e7\u00e3o para adicionar um novo gateway a esta VPC. -message.add.pod=Add a new pod for zone -message.add.pod.during.zone.creation=Cada zona deve conter um ou mais pods e iremos adicionar o primeiro pod agora. Um pod cont\u00e9m hosts e servidores de storage prim\u00e1rio que ser\u00e3o adicionados em uma etapa posterior. Inicialmente, configure um intervalo de endere\u00e7os IP reservados para o tr\u00e1fego de gerenciamento interno do CloudStack. A faixa de IP reservados devem ser \u00fanicos para cada zona na nuvem. -message.add.primary=Especifique os seguintes par\u00e2metros para adicionar um novo Storage prim\u00e1rio. -message.add.primary.storage=Adicionar novo Storage prim\u00e1rio \u00c3\u00a0 zona , pod -message.add.region=Por favor, especifique as informa\u00e7\u00f5es necess\u00e1rias para adicionar uma nova regi\u00e3o. -message.add.secondary.storage=Add a new storage for zone -message.add.service.offering=Por favor preencha os dados abaixo para adicionar uma nova oferta de computa\u00e7\u00e3o. -message.add.system.service.offering=Por favor preencha os dados abaixo para adicionar uma nova oferta de servi\u00e7o de sistema. -message.add.template=Entre com os dados para criar um novo template. -message.add.volume=Entre com os dados para criar um novo disco. -message.add.VPN.gateway=Favor confirmar que voc\u00ea deseja adicionar um gateway de VPN -message.admin.guide.read=Para VMs baseadas em VMware, por favor leia a sess\u00e3o sobre escalonamento din\u00e2mico no guia do administrador antes de escalonar. Voc\u00ea gostaria de continuar?\\, -message.advanced.mode.desc=Escolhe este modelo de rede se deseja ter habilitar o suporte a VLAN. Este modelo permite maior flexibilidade ao administrador ao permitir ofertas de rede customizada, firewall, vpn ou load balancer bem como acesso via rede virtual ou acesso direto. -message.advanced.security.group=Escolha esta op\u00e7\u00e3o se desejar utilizar Security Groups para isolamento das VMs guest. -message.advanced.virtual=Escolha esta op\u00e7\u00e3o se desejar utilizar VLANs para isolamento das VMs guest. -message.after.enable.s3=Storage secund\u00e1ria fornecida por S3 configurada. Nota\: ao deixar esta p\u00e1gina, voc\u00ea n\u00e3o ser\u00e1 capaz de reconfigurar S3 novamente. -message.after.enable.swift=Swift Configurado. Nota\: Ap\u00f3s deixar esta p\u00e1gina, voc\u00ea n\u00e3o ser\u00e1 capaz de reconfigurar o Swift novamente. -message.alert.state.detected=Alerta de estado detectado -message.allow.vpn.access=Entre com nome de Usu\u00e1rio e senha do Usu\u00e1rio que ter\u00e1 acesso VPN. -message.apply.snapshot.policy=Voc\u00ea atualizou com sucesso sua pol\u00edtica de Snapshot. -message.attach.iso.confirm=Por favor, confirme que voc\u00ea deseja conectar o ISO \u00e0 esta inst\u00e2ncia virtual. -message.attach.volume=Preencha os seguintes dados para conectar o novo disco. Se voc\u00ea Est\u00e1 conectando um disco a uma maquina virtual Windows, ser\u00e1 necess\u00e1rio reiniciar a Inst\u00e2ncia para visualizar o novo disco. -message.basic.mode.desc=Escolha este modelo de rede se voc\u00ea *n\u00e3o* quer suporte a VLAN. Toda Inst\u00e2ncia criada neste modelo de rede estar\u00e1 ligado diretamente a um IP da rede e ser\u00e1 usado Security Groups para prover seguran\u00e7a e segrega\u00e7\u00e3o. -message.change.ipaddress=Por favor, confirme que voc\u00ea gostaria de mudar o endere\u00e7o IP da NIC em VM. -message.change.offering.confirm=Por favor, confirme que voc\u00ea deseja mudar a oferta de servi\u00e7o desta inst\u00e2ncia virtual. -message.change.password=Por favor, troque sua senha. -message.cluster.dedicated=Cluster Dedicado -message.cluster.dedication.released=Cluster dedicado liberado -message.configure.all.traffic.types=Voc\u00ea tem m\u00faltiplas redes f\u00edsicas; favor configurar etiquetas para cada tipo de tr\u00e1fego clicando no bot\u00e3o Edit. -message.configure.firewall.rules.allow.traffic=Configure as regras para permitir o Tr\u00e1fego -message.configure.firewall.rules.block.traffic=Configurar as regras para bloquear o Tr\u00e1fego -message.configure.ldap=Por favor, confirme que voc\u00ea deseja configurar o LDAP. -message.configuring.guest.traffic=Configurando tr\u00e1fego do guest -message.configuring.physical.networks=Configurando redes f\u00edsicas -message.configuring.public.traffic=Configurando tr\u00e1fego p\u00fablico -message.configuring.storage.traffic=Configurando tr\u00e1fego de storage -message.confirm.action.force.reconnect=Por favor confirme que voc\u00ea deseja for\u00e7ar a reconex\u00e3o com este host. -message.confirm.add.vnmc.provider=Por favor confirme que voc\u00ea gostaria de adicionar este provedor VNMC. -message.confirm.archive.alert=Por favor confirme que voc\u00ea deseja arquivar este alerta. -message.confirm.archive.event=Por favor confirme que voc\u00ea deseja arquivar este evento -message.confirm.archive.selected.alerts=Por favor confirme que voc\u00ea deseja arquivar os alertas selecionados -message.confirm.archive.selected.events=Por favor confirme que voc\u00ea deseja arquivar os eventos selecionados -message.confirm.attach.disk=Voc\u00ea tem certeza que deseja conectar este disco? -message.confirm.create.volume=Voc\u00ea tem certeza que deseja criar o volume? -message.confirm.current.guest.CIDR.unchanged=Gostaria de manter o CIDR da rede convidado inalterado? -message.confirm.dedicate.cluster.domain.account=Voc\u00ea realmente quer dedicar este cluster ao dom\u00ednio/conta? -message.confirm.dedicate.host.domain.account=Voc\u00ea realmente quer dedicar este host ao dom\u00ednio/conta? -message.confirm.dedicate.pod.domain.account=Voc\u00ea realmente quer dedicar este pod ao dom\u00ednio/conta? -message.confirm.dedicate.zone=Voc\u00ea realmente quer dedicar esta zona ao dom\u00ednio/conta? -message.confirm.delete.acl.list=Voc\u00ea tem certeza que deseja apagar esta lista ACL? -message.confirm.delete.alert=Voc\u00ea tem certeza que deseja apagar este alerta? -message.confirm.delete.baremetal.rack.configuration=Por favor, confirme que voc\u00ea deseja remover a Configura\u00e7\u00e3o de Rack de Baremetal -message.confirm.delete.BigSwitchBcf=Por favor, confirme que voc\u00ea deseja deletar este BigSwitch BCF Controller -message.confirm.delete.BrocadeVcs=Por favor confirme que voc\u00ea deseja remover o Brocade Vcs Switch -message.confirm.delete.ciscoASA1000v=Favor confirmar que voc\u00ea deseja apagar este CiscoASA1000v -message.confirm.delete.ciscovnmc.resource=Por favor confirme que voc\u00ea deseja apagar este recurso CiscoVNMC -message.confirm.delete.F5=Por favor confirme que voc\u00ea deseja remover o F5 -message.confirm.delete.internal.lb=Por favor confirme que voc\u00ea deseja remover este LB interno -message.confirm.delete.NetScaler=Por favor confirme que voc\u00ea deseja remover o NetScaler -message.confirm.delete.NuageVsp=Por favor confirme que voc\u00ea deseja remover o -message.confirm.delete.PA=Por favor, confirme que voc\u00ea deseja remover Palo Alto -message.confirm.delete.secondary.staging.store=Por favor confirme que deseja apagar Armazenamento de Est\u00e1gio Secund\u00e1rio -message.confirm.delete.SRX=Por favor confirme que voc\u00ea deseja remover o SRX -message.confirm.delete.ucs.manager=Confirme se voc\u00ea deseja excluir o Gerente UCS. -message.confirm.destroy.router=Por favor confirme que voc\u00ea gostaria de destruir este roteador -message.confirm.disable.host=Favor confirmar que voc\u00ea deseja desabilitar este host. -message.confirm.disable.network.offering=Voc\u00ea tem certeza que deseja deshabilitar esta oferta de rede? -message.confirm.disable.provider=Por favor confirme que voc\u00ea gostaria de desabilitar este provider -message.confirm.disable.vnmc.provider=Por favor confirme que voc\u00ea gostaria de desabilitar este provedor VNMC. -message.confirm.disable.vpc.offering=Voc\u00ea tem certeza que deseja desabilitar esta oferta de VPC? -message.confirm.enable.host=Por favor confirme que voc\u00ea deseja habilitar este host. -message.confirm.enable.network.offering=Voc\u00ea tem certeza que deseja habilitar esta oferta de rede? -message.confirm.enable.provider=Por favor confirme que voc\u00ea gostaria de habilitar este provider -message.confirm.enable.vnmc.provider=Por favor confirme que voc\u00ea gostaria de habilitar este provedor VNMC. -message.confirm.enable.vpc.offering=Voc\u00ea tem certeza que deseja habilitar esta oferta de VPC? -message.confirm.join.project=Por favor confirme que voc\u00ea deseja entrar neste projeto -message.confirm.migrate.volume=Voc\u00ea quer migrar este volume? -message.confirm.refresh.blades=Por favor confirme que voc\u00ea deseja renovar as l\u00e2minas. -message.confirm.release.dedicated.cluster=Voc\u00ea deseja liberar este cluster dedicado? -message.confirm.release.dedicated.host=Voc\u00ea deseja liberar esta host dedicado? -message.confirm.release.dedicated.pod=Voc\u00ea deseja liberar esta pod dedicado? -message.confirm.release.dedicated.zone=Voc\u00ea deseja liberar esta zona dedicada? -message.confirm.release.dedicate.vlan.range=Confirme que voc\u00ea deseja liberar esta faixa de VLAN dedicada. -message.confirm.remove.event=Voc\u00ea tem certeza que deseja remover este evento? -message.confirm.remove.IP.range=Por favor confirme que voc\u00ea deseja remover este range de IP. -message.confirm.remove.load.balancer=Por favor, confirme que voc\u00ea quer remover a VM do Balanceador de Carga -message.confirm.remove.network.offering=Voc\u00ea tem certeza que deseja remover esta oferta de rede? -message.confirm.remove.selected.alerts=Por favor confirme que voc\u00ea deseja remover os alertas selecionados -message.confirm.remove.selected.events=Por favor confirme que voc\u00ea deseja remover os eventos selecionados -message.confirm.remove.vmware.datacenter=Por favor, confirme que voc\u00ea quer remover este VMware datacenter -message.confirm.remove.vpc.offering=Voc\u00ea tem certeza que deseja remover esta oferta de VPC? -message.confirm.replace.acl.new.one=Voc\u00ea deseja substituir a ACL com uma nova? -message.confirm.scale.up.router.vm=Voc\u00ea realmente quer escalonar a VM do Roteador? -message.confirm.scale.up.system.vm=Voc\u00ea realmente quer escalonar a VM do sistema? -message.confirm.shutdown.provider=Por favor confirme que voc\u00ea deseja desligar este provider -message.confirm.start.lb.vm=Confirme que voc\u00ea deseja iniciar esta LB VM -message.confirm.stop.lb.vm=Confirme que voc\u00ea deseja parar esta LB VM -message.confirm.upgrade.router.newer.template=Por favor confirme que voc\u00ea deseja atualizar o roteador para usar template mais recente. -message.confirm.upgrade.routers.account.newtemplate=Por favor confirme que voc\u00ea deseja atualizar todos os roteadores desta conta para o template mais novo. -message.confirm.upgrade.routers.cluster.newtemplate=Por favor confirme que voc\u00ea deseja atualizar todos os roteadores deste cluster para o template mais novo. -message.confirm.upgrade.routers.newtemplate=Por favor confirme que voc\u00ea deseja atualizar todos os roteadores desta zona para o template mais novo. -message.confirm.upgrade.routers.pod.newtemplate=Por favor confirme que voc\u00ea deseja atualizar todos os roteadores neste pod para o template mais novo. -message.copy.iso.confirm=Confirme se voc\u00ea deseja copiar a ISO para -message.copy.template.confirm=Voc\u00ea tem certeza que deseja copiar o template ? -message.copy.template=Copiar template XXX da zona para -message.create.template.vm=Criar VM do template -message.create.template=Voc\u00ea tem certeza que deseja criar um template ? -message.create.template.volume=Especifique as seguintes informa\u00e7\u00f5es antes de criar o template a partir do disco\: . A cria\u00e7\u00e3o de um template a partir de um disco pode levar alguns minutos ou mais dependendo do tamnho do disco. -message.creating.cluster=Criando cluster -message.creating.guest.network=Criando rede guest -message.creating.physical.networks=Criando redes fisicas -message.creating.pod=Criando pod -message.creating.primary.storage=Criando storage prim\u00e1rio -message.creating.secondary.storage=Criando storage secund\u00e1rio -message.creating.systemVM=Criando VMs do sistema (isso pode levar algum tempo) -message.creating.zone=Criando zona. -message.decline.invitation=Voc\u00ea tem certeza que quer rejeitar este convite de projeto ? -message.dedicated.zone.released=Zona dedicada lioberada -message.dedicate.zone=Zona dedicada -message.delete.account=Confirme se voc\u00ea deseja excluir esta conta. -message.delete.affinity.group=Por favor, confirme que voc\u00ea deseja remover este grupo de afinidade -message.delete.gateway=Favor confirmar que voc\u00ea deseja deleta o gateway -message.delete.project=Voc\u00ea tem certeza que deseja deletar este projeto ? -message.delete.user=Por favor confirme que voc\u00ea deseja deletar este usu\u00e1rio. -message.delete.VPN.connection=Favor confirmar que voc\u00ea deseja deletar esta conex\u00e3o VPN -message.delete.VPN.customer.gateway=Favor confirmar que voc\u00ea deseja deletar este gateway de VPN de usu\u00e1rio -message.delete.VPN.gateway=Favor confirmar que voc\u00ea deseja deletar este gateway de VPN -message.desc.add.new.lb.sticky.rule=Adicionar nova regra fixa de LB -message.desc.advanced.zone=Para topologias de rede mais sofisticadas. Este modelo fornece maior flexibilidade na defini\u00e7\u00e3o de redes de clientes e fornece ofertas de rede personalizadas, tais como firewall, VPN ou de balanceamento de carga. -message.desc.basic.zone=Fornece uma \u00fanica rede onde em cada inst\u00e2ncia de VM \u00e9 atribu\u00eddo um IP diretamente na rede. O isolamento Guest podem ser fornecidos atrav\u00e9s de camada-3 da rede com grupos de seguran\u00e7a (filtragem da fonte de endere\u00e7os IP). -message.desc.cluster=Cada pod deve conter um ou mais clusters, e iremos adicionar o primeiro cluster agora. Um cluster fornece uma maneira de agrupamento de hosts. Os hosts de um cluster t\u00eam hardware id\u00eantico, executam o mesmo hypervisor, est\u00e3o na mesma sub-rede e acessam o mesmo storage compartilhado. Cada cluster \u00e9 constitu\u00eddo por um ou mais hosts e um ou mais servidores de storage prim\u00e1rio. -message.desc.created.ssh.key.pair=Par de chaves SSH criado -message.desc.create.ssh.key.pair=Por favor, preencha os seguintes dados para criar ou registar um par de chaves ssh.

(1) Se a chave p\u00fablica est\u00e1 definida, CloudStack ir\u00e1 registrar a chave p\u00fablica. Voc\u00ea pode us\u00e1-la atrav\u00e9s de sua chave privada.

(2) Se a chave p\u00fablica n\u00e3o est\u00e1 definida, CloudStack ir\u00e1 criar um novo par de chaves SSH. Neste caso, copie e salve a chave privada. CloudStack n\u00e3o ir\u00e1 mant\u00ea-la.
-message.desc.host=Cada cluster deve conter pelo menos um host (computador) para as VMs guest serem executadas e iremos adicionar o primeira host agora. Para um host funcionar no CloudStack, voc\u00ea deve instalar um hypervisor no host, atribuir um endere\u00e7o IP e garantir que o host est\u00e1 conectado ao servidor de gerenciamento do CloudStack.

Forne\u00e7a o hostname ou o endere\u00e7o IP do host, o nome de usu\u00e1rio (geralmente root) e a senha e qualquer label que voc\u00ea utiliza para categorizar os hosts. -message.desc.primary.storage=Cada cluster deve conter um ou mais servidores de storage prim\u00e1rio e iremos adicionar o primeiro agora. Um storage prim\u00e1rio, cont\u00e9m os volumes de disco para todas as VMs em execu\u00e7\u00e3o nos hosts do cluster. Utiliza qualquer protocolo compat\u00edvel com os padr\u00f5es que \u00e9 suportado pelo hypervisor utilizado. -message.desc.reset.ssh.key.pair=Por favor, especifique um par de chaves SSH que voc\u00ea deseja adicionar a esta VM. Por favor, note que a senha de root ser\u00e1 alterada por esta opera\u00e7\u00e3o caso a senha esteja ativada. -message.desc.secondary.storage=Cada zona deve ter pelo menos um NFS ou servidor de storage secund\u00e1rio e iremos adicionar o primeiro agora. Um storage secund\u00e1rios armazena templates de VM, imagens ISO e snapshots do volume de disco da VM. Esse servidor deve estar dispon\u00edvel para todos os hosts na zona.

Fornecer o endere\u00e7o IP e o caminho exportados. -message.desc.zone=Uma zona \u00e9 a maior unidade organizacional no CloudStack e normalmente corresponde \u00e0 um \u00fanico datacenter. As Zonas disponibilizam isolamento f\u00edsico e redund\u00e2ncia. Uma zona \u00e9 composta por um ou mais pods (cada um dos quais cont\u00e9m os hosts e servidores de storage prim\u00e1rio) e um servidor de storage secund\u00e1rio que \u00e9 compartilhado por todos os pods na zona. -message.detach.disk=Voc\u00ea tem certeza que deseja desconectar este disco ? -message.detach.iso.confirm=Confirme se voc\u00ea deseja desconectar o ISO da inst\u00e2ncia virtual. -message.disable.account=Por favor confirme que voc\u00ea deseja desabilitar esta conta. Ap\u00f3s desabilitar uma conta, todos os usu\u00e1rios desta conta n\u00e3o ir\u00e3o possuir mais acesso aos seus recursos da cloud. Todas as m\u00e1quinas virtuais ser\u00e3o automaticamente desligadas. -message.disable.snapshot.policy=Voc\u00ea desativou com sucesso sua pol\u00edtica de Snapshot. -message.disable.user=Por favor confirme que voc\u00ea deseja desabilitar este usu\u00e1rio. -message.disable.vpn.access=Confirme se voc\u00ea deseja desativar o acesso VPN. -message.disable.vpn=Voc\u00ea tem certeza que deseja desabilitar a VPN? -message.disabling.network.offering=Desabilita oferta de rede -message.disabling.vpc.offering=Desabilitando oferta VPC -message.disallowed.characters=Caracteres n\u00e3o-permitidos\: \\<\\,\\> -message.download.ISO=Por favor clique 00000 para baixar o ISO -message.download.template=Por favor clique 00000 para baixar o template -message.download.volume=Clique 00000 para baixar o disco -message.download.volume.confirm=Por favor confirme que voc\u00ea quer baixar este volume -message.edit.account=Editar ("-1" indica que n\u00e3o haver\u00e1 limites para a quantidade de recursos criado) -message.edit.confirm=Por favor, confirme as altera\u00e7\u00f5es antes de clicar em "Salvar". -message.edit.limits=Especifique os limites para os seguintes recursos. "-1" indica sem limite para o total de recursos criados. -message.edit.traffic.type=Favor especificar a etiqueta de tr\u00e1fego que voc\u00ea deseja associar com este tipo de tr\u00e1fego. -message.enable.account=Confirme se voc\u00ea deseja ativar a conta. -message.enabled.vpn.ip.sec=Sua chave IPSec (pre-shared) \u00e9 -message.enabled.vpn=Seu acesso VPN Est\u00e1 ativado e pode ser acessado atrav\u00e9s do IP -message.enable.user=Por favor confirme que voc\u00ea deseja habilitar este usu\u00e1rio. -message.enable.vpn.access=VPN Est\u00e1 desativada para este endere\u00e7o IP. Gostaria de ativar o acesso VPN? -message.enable.vpn=Por favor confirme que voc\u00ea deseja acesso VPN habilitado para este endere\u00e7o IP. -message.enabling.network.offering=Habilitando oferta de rede -message.enabling.security.group.provider=Habilitar provider de grupo de seguran\u00e7a -message.enabling.vpc.offering=Habilitando oferta VPC -message.enabling.zone.dots=Habilitando Zona.... -message.enabling.zone=Habilitando zona -message.enter.seperated.list.multiple.cidrs=Por favor entre a de CIDRs separadas por v\u00edrgula, se houver mais de uma -message.enter.token=Por favor entre o token que voc\u00ea recebeu no e-mail privado. -message.generate.keys=Por favor confirme que voc\u00ea deseja gerar novas chaves para este usu\u00e1rio. -message.gslb.delete.confirm=Confirme que voc\u00ea deseja apagar este GSLB -message.gslb.lb.remove.confirm=Confirme que voc\u00ea deseja remover o balanceamento de carga deste GSLB -message.guest.traffic.in.advanced.zone=O tr\u00e1fego de rede guest \u00e9 para comunica\u00e7\u00e3o entre m\u00e1quinas virtuais do usu\u00e1rio final. Especifique um intervalo de IDs de VLAN para transportar o tr\u00e1fego do guest para cada rede f\u00edsica. -message.guest.traffic.in.basic.zone=O tr\u00e1fego de rede guest \u00e9 para comunica\u00e7\u00e3o entre m\u00e1quinas virtuais do usu\u00e1rio final. Especifique um intervalo de endere\u00e7os IP para que CloudStack possa atribuir \u00e0s VMs. Certifique-se que este intervalo n\u00e3o se sobreponha o range de IPs reservados do sistema. -message.host.dedicated=Host dedicado -message.host.dedication.released=Host dedicado liberado -message.installWizard.click.retry=Click no bot\u00e3o para tentar executar novamente. -message.installWizard.copy.whatIsACluster=Um cluster prov\u00ea uma maneira de agrupar hosts. Os hosts em um cluster tem hardware id\u00eantico, rodam o mesmo hypervisor, est\u00e3o na mesma subnet, acessam o mesmo storage compartilhado. Inst\u00e2ncias de m\u00e1quinas virtuais (VMs) podem ser migradas a quente - live migration - de um host para outro host no mesmo cluster, sem interromper o servi\u00e7o para o usu\u00e1rio. Um Cluster \u00e9 a terceira maior unidade organizacional em uma instala\u00e7\u00e3o CloudStack&\#8482; . Clusters est\u00e3o contidos em pods e pods est\u00e3o contidos em zonas.

O CloudStack&\#8482; permite m\u00faltiplos clusters em uma mesma cloud, entretanto para a instala\u00e7\u00e3o b\u00e1sica, n\u00f3s iremos precisar apenas de um cluster. -message.installWizard.copy.whatIsAHost=Um host \u00e9 um \u00fanico computador. Os Hosts prov\u00eaem os recursos computacionais para executar as m\u00e1quinas virtuais. Cada host possu\u00ed o software do hypervisor instalado nele para gerenciar as guest VMs (Exceto os hosts bare metal, que s\u00e3o um caso especial discutido no Guia Avan\u00e7ado de Instala\u00e7\u00e3o). Por exemplo, um servidor Linux com KVM habilitado, um servidor Citrix XenServer e um servidor ESXi s\u00e3o hosts. Na Instala\u00e7\u00e3o B\u00e1sica, n\u00f3s utilizamos um \u00fanico host rodando XenServer ou KVM.

O host \u00e9 a menor unidade organizacional dentro de uma instala\u00e7\u00e3o CloudStack&\#8482; . Hosts est\u00e3o contidos dentro de Clusters, clusters est\u00e3o contidos dentro de pods e pods est\u00e3o contidos dentro de zonas. -message.installWizard.copy.whatIsAPod=Um pod normalmente representa um \u00fanico rack. Hosts no mesmo pod est\u00e3o na mesma subrede.

Um pod \u00e9 a segunda maior unidade organizacional de uma instala\u00e7\u00e3o CloudStack&\#8482; . Pods est\u00e3o contidos dentro de zonas. Cada zona, pode conter um ou mais pods; Na instala\u00e7\u00e3o b\u00e1sica, voc\u00ea ir\u00e1 ter apenas um pod na sua zona. -message.installWizard.copy.whatIsAZone=Uma zona \u00e9 a maior unidade organizacional em uma instala\u00e7\u00e3o CloudStack&\#8482; . Uma zona tipicamente corresponde a um \u00fanico datacenter, apesar de ser poss\u00edvel ter m\u00faltiplas zonas no mesmo datacenter. O benef\u00edcio de se organizar a infra-estrutura em zonas \u00e9 permitir o isolamento f\u00edsico e redund\u00e2ncia. Por exemplo, cada zona pode possuir sua pr\u00f3pria alimenta\u00e7\u00e3o de energia e link de sa\u00edda de internet e zonas podem estar geograficamente separadas (apesar de n\u00e3o ser obrigat\u00f3rio). -message.installWizard.copy.whatIsCloudStack=O CloudStack&\#8482 \u00e9 uma plataforma de software que agrega recursos computacionais para construir uma Cloud de Infra-estrutura como Servi\u00e7o (IaaS) p\u00fablica, privada ou h\u00edbrida. O CloudStack&\#8482 ger\u00eancia a rede, o storage e os recursos computacionais que comp\u00f5em a infra-estrutura de cloud. Utilize o CloudStack&\#8482 para instalar, gerenciar e configurar os ambientes de cloud computing.

Indo al\u00e9m de imagens de m\u00e1quinas virtuais individuais rodando em hardware commodity, CloudStack&\#8482 prov\u00ea uma solu\u00e7\u00e3o completa de software de infra-estrutura de cloud para entregar datacenters virtuais como um servi\u00e7o - possuindo todos os componentes essenciais para contruir, instalar e gerenciar aplica\u00e7\u00f5es na cloud multi-camadas e multi-tenant. Ambas as vers\u00f5es open-source e premium est\u00e3o dispon\u00edveis, com a vers\u00e3o opensource oferecendo praticamente os mesmos recursos. -message.installWizard.copy.whatIsPrimaryStorage=Uma infraestrutura de Cloud CloudStack; utiliza dois tipos de storage\: storage prim\u00e1rio e storage secund\u00e1rio. Ambos os tipos podem ser iSCSI, NFS servers, ou disco local.

O Storage prim\u00e1rio est\u00e1 associado com um cluster, e armazena os volumes de disco de cada guest VM para todas as VMs em execu\u00e7\u00e3o nos hosts deste cluster. O servidor de storage prim\u00e1rio tipicamente encontra-se localizado perto dos hosts. -message.installWizard.copy.whatIsSecondaryStorage=O storage secund\u00e1rio est\u00e1 associado a uma zona, ele \u00e9 respons\u00e1vel por armazenar o seguinte\:
  • Imagens de Templates do SO - que podem ser utilizadas para boot das VMs e podem incluir configura\u00e7\u00f5es adicionais, como por exemplo as aplica\u00e7\u00f5es instaladas
  • Imagens ISO - Imagens de sistema operacional que podem ser boot\u00e1veis ou n\u00e3o
  • Snapshots do volume de discos - c\u00f3pias salvas dos dados de uma VM que pode ser utilizada para recupera\u00e7\u00e3o de dados ou cria\u00e7\u00e3o de novos templates
-message.installWizard.now.building=Construindo sua cloud agora... -message.installWizard.tooltip.addCluster.name=Um nome para o cluster. Este nome pode ser um nome de sua escolha e n\u00e3o \u00e9 usado pelo CloudStack. -message.installWizard.tooltip.addHost.hostname=O nome DNS ou endere\u00e7o IP do host. -message.installWizard.tooltip.addHost.password=Este \u00e9 a senha do usu\u00e1rio especificado acima (da sua instala\u00e7\u00e3o do XenServer) -message.installWizard.tooltip.addHost.username=Usualmente root. -message.installWizard.tooltip.addPod.name=O nome para o pod -message.installWizard.tooltip.addPod.reservedSystemEndIp=Este \u00e9 o range de IP na rede privada que o CloudStack utiliza para gerenciar o storage secund\u00e1rio das VMs e Proxy Console das VMs. Estes endere\u00e7os IP s\u00e3o obtidos da mesma subrede dos servidores hosts. -message.installWizard.tooltip.addPod.reservedSystemGateway=O gateway para os hosts neste pod. -message.installWizard.tooltip.addPod.reservedSystemNetmask=A m\u00e1scara de rede est\u00e1 em uso na subrede que os guests ir\u00e3o utilizar. -message.installWizard.tooltip.addPod.reservedSystemStartIp=Este \u00e9 o range de IP na rede privada que o CloudStack utiliza para gerenciar o storage secund\u00e1rio das VMs e Proxy Console das VMs. Estes endere\u00e7os IP s\u00e3o obtidos da mesma subrede dos servidores hosts. -message.installWizard.tooltip.addPrimaryStorage.name=O Nome do dispositivo de storage. -message.installWizard.tooltip.addPrimaryStorage.path=(para NFS) No NFS este \u00e9 o path exportado pelo servidor. Path (para SharedMountPoint). Com o KVM este \u00e9 o path em cada host onde o storage prim\u00e1rio est\u00e1 montado. Por exemplo, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(para NFS, iSCSI ou PreSetup) O Endere\u00e7o IP ou nome DNS do dispositivo de storage. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=O endere\u00e7o IP do servidor NFS hospedando o storage secund\u00e1rio -message.installWizard.tooltip.addSecondaryStorage.path=Path exportado, localizado no servidor que voc\u00ea especificou acima -message.installWizard.tooltip.addZone.dns1=Estes s\u00e3o os servidores DNS utilizados pelas guest VMs na zona. Estes servidores DNS ser\u00e3o acessados pela interface de rede p\u00fablica que voc\u00ea ir\u00e1 adicionar posteriormente. O endere\u00e7o IP p\u00fablico da zona deve possuir uma rota para os servidores DNS configurados aqui. -message.installWizard.tooltip.addZone.dns2=Estes s\u00e3o os servidores DNS utilizados pelas guest VMs na zona. Estes servidores DNS ser\u00e3o acessados pela interface de rede p\u00fablica que voc\u00ea ir\u00e1 adicionar posteriormente. O endere\u00e7o IP p\u00fablico da zona deve possuir uma rota para os servidores DNS configurados aqui. -message.installWizard.tooltip.addZone.internaldns1=Estes s\u00e3o os servidores DNS utilizados pelas VMs de sistema nesta zona. Estes servidores DNS ser\u00e3o acessados atrav\u00e9s da interface de rede privada das VMs de sistema. O endere\u00e7o IP privado que voc\u00ea configurar para os pods deve possuir uma rota para os servidores DNS configurados aqui. -message.installWizard.tooltip.addZone.internaldns2=Estes s\u00e3o os servidores DNS utilizados pelas VMs de sistema nesta zona. Estes servidores DNS ser\u00e3o acessados atrav\u00e9s da interface de rede privada das VMs de sistema. O endere\u00e7o IP privado que voc\u00ea configurar para os pods deve possuir uma rota para os servidores DNS configurados aqui. -message.installWizard.tooltip.addZone.name=Um nome para a zona -message.installWizard.tooltip.configureGuestTraffic.description=Uma descri\u00e7\u00e3o da sua rede -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=O range de endere\u00e7os IP que estar\u00e1 dispon\u00edvel para aloca\u00e7\u00e3o para os guests nesta zona. Caso uma Interface de Rede seja utilizada, estes IPs devem estar no mesmo CIDR que o CIDR do pod. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=O gateway que os guests devem usar -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=A m\u00e1scara de rede da subrede que os guests devem usar -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=O range de endere\u00e7os IP que estar\u00e1 dispon\u00edvel para aloca\u00e7\u00e3o para os guests nesta zona. Caso uma Interface de Rede seja utilizada, estes IPs devem estar no mesmo CIDR que o CIDR do pod. -message.installWizard.tooltip.configureGuestTraffic.name=Um nome para sua rede -message.instance.scaled.up.confirm=Voc\u00ea realmente quer escalonar sua inst\u00e2ncia? -message.instanceWizard.noTemplates=Voc\u00ea n\u00e3o possui nenhum template dispon\u00edvel; por favor adicione um template compat\u00edvel e reinicie o wizard de inst\u00e2ncia. -message.ip.address.changed=Seu endere\u00e7o IP pode ter mudado; voc\u00ea gostaria de atualizar a listagem ? Note que neste caso o painel de detalhes ir\u00e1 fechar. -message.iso.desc=Imagem de disco contendo dados ou m\u00eddia de sistema operacional boot\u00e1vel -message.join.project=Voc\u00ea agora entrou em um projeto. Por favor troque para a vis\u00e3o de Projeto para visualizar o projeto. -message.launch.vm.on.private.network=Voc\u00ea deseja executar a sua inst\u00e2ncia na sua pr\u00f3pria rede privada dedicada? -message.launch.zone=A zona est\u00e1 pronta para ser executada; por favor, v\u00e1 para o pr\u00f3ximo passo. -message.ldap.group.import=Todos os usu\u00e1rios do grupo nome dado ser\u00e1 importado -message.link.domain.to.ldap=Ativar sincroniza\u00e7\u00e3o autom\u00e1tica para este dom\u00ednio em LDAP -message.listView.subselect.multi=(Ctrl/Cmd-click) -message.lock.account=Confirme se voc\u00ea deseja bloquear esta conta. Bloqueando a conta, todos os Usu\u00e1rios desta conta n\u00e3o estar\u00e3o mais habilitados a gerenciar os recursos na nuvem. Os recursos existentes (Cloud Server) ainda poder\u00e3o ser acessados. -message.migrate.instance.confirm=Confirme o host que voc\u00ea deseja migrar a inst\u00e2ncia virtual. -message.migrate.instance.to.host=Por favor confirme que voc\u00ea deseja migrar a inst\u00e2ncia para outro host. -message.migrate.instance.to.ps=Por favor confirme que voc\u00ea deseja migrar a inst\u00e2ncia para outro storage prim\u00e1rio. -message.migrate.router.confirm=Por favor confirme o host que voc\u00ea deseja migrar o roteador para\: -message.migrate.systemvm.confirm=Por favor confirme o host para o qual voc\u00ea deseja migrar a VM de sistema\: -message.migrate.volume=Por favor confirme que voc\u00ea deseja migrar o volume para outro storage prim\u00e1rio. -message.network.addVM.desc=Por favor especifique a rede onde voc\u00ea gostaria de adicionar esta VM. Uma nova NIC ser\u00e1 adicionada a esta rede. -message.network.addVMNIC=Por favor confirme que voc\u00ea gostaria de adicionar uma nova VM NIC para esta rede. -message.network.remote.access.vpn.configuration=A configura\u00e7\u00e3o de acesso remoto VPN foi gerada, mas falhou ao ser aplicada. Por favor, verifique a conectividade dos elementos de rede e depois tente novamente. -message.new.user=Especifique abaixo para adicionar novos usu\u00e1rios para a conta -message.no.affinity.groups=Voc\u00ea n\u00e3o tem nenhum grupo de afinidade. Por favor, v\u00e1 para o pr\u00f3ximo passo. -message.no.host.available=Sem hosts dispon\u00edveis para Migra\u00e7\u00e3o -message.no.network.support.configuration.not.true=Voc\u00ea n\u00e3o possui nenhuma zona com grupos de seguran\u00e7a habilitado. Assim sendo, n\u00e3o possui recursos adicionais de rede. Por favor continue para o passo 5. -message.no.network.support=O hypervisor escolhido, vSphere, n\u00e3o possui nenhum recurso de rede adicional. Por favor, v\u00e1 para o passo 5. -message.no.projects.adminOnly=Voc\u00ea n\u00e3o possui nenhum projeto.
Por favor solicite ao seu administrador a cria\u00e7\u00e3o de um novo projeto. -message.no.projects=Voc\u00ea n\u00e3o possui nenhum projeto.
Por favor crie um novo projeto \u00e0 partir da se\u00e7\u00e3o Projetos. -message.number.clusters=

Clusters

-message.number.hosts=

Hosts

-message.number.pods=

PODs

-message.number.storage=

Volumes do Storage Prim\u00e1rio

-message.number.zones=

Zonas

-message.password.has.been.reset.to=A senha foi redefinida para -message.password.of.the.vm.has.been.reset.to=A senha da VM foi redefinida para -message.pending.projects.1=Voc\u00ea possui convites de projetos pendentes\: -message.pending.projects.2=Para visualizar, por favor acesse a se\u00e7\u00e3o de projetos, depois selecione os convites no menu drop-down. -message.please.add.at.lease.one.traffic.range=Por favor adicione pelo menos um range de tr\u00e1fego. -message.please.confirm.remove.ssh.key.pair=Por favor, confirme que voc\u00ea deseja remover este par de chaves SSH -message.please.proceed=Por favor, v\u00e1 para o pr\u00f3ximo passo. -message.please.select.a.configuration.for.your.zone=Por favor selecione uma configuracao para sua zona. -message.please.select.a.different.public.and.management.network.before.removing=Por favor selecione uma rede p\u00fablica e de gerenciamento diferente antes de remover -message.please.select.networks=Por favor selecione as redes para sua m\u00e1quina virtual. -message.please.select.ssh.key.pair.use.with.this.vm=Por favor, selecione um par de chaves SSH que voc\u00ea deseja que esta VM utilize\: -message.please.wait.while.zone.is.being.created=Por favor, espere enquanto sua zona est\u00e1 sendo criada; isto pode demorar um pouco... -message.pod.dedication.released=Pod Dedicado liberado -message.portable.ip.delete.confirm=Favor confirmar que voc\u00ea deseja apagar esta Faixa de IPs Port\u00e1veis -message.project.invite.sent=Convite enviado para o usu\u00e1rio; Eles ser\u00e3o adicionados ao projeto ap\u00f3s aceitarem o convite -message.public.traffic.in.advanced.zone=O tr\u00e1fego p\u00fablico \u00e9 gerado quando as VMs na nuvem acessam a internet. Os IPs acess\u00edveis ao p\u00fablico devem ser alocados para essa finalidade. Os usu\u00e1rios finais podem usar a interface do usu\u00e1rio CloudStack para adquirir esses IPs afim de implementar NAT entre a sua rede de guests e sua rede p\u00fablica.

Forne\u00e7a pelo menos um intervalo de endere\u00e7os IP para o tr\u00e1fego de internet. -message.public.traffic.in.basic.zone=O tr\u00e1fego p\u00fablico \u00e9 gerado quando as VMs na nuvem acessam a Internet ou prestam servi\u00e7os aos clientes atrav\u00e9s da Internet. Os IPs acess\u00edveis ao p\u00fablico devem ser alocados para essa finalidade. Quando uma inst\u00e2ncia \u00e9 criada, um IP a partir deste conjunto de IPs p\u00fablicos ser\u00e3o destinados \u00e0 inst\u00e2ncia, al\u00e9m do endere\u00e7o IP guest. Um NAT est\u00e1tico 1-1 ser\u00e1 criada automaticamente entre o IP p\u00fablico e IP guest. Os usu\u00e1rios finais tamb\u00e9m podem usar a interface de usu\u00e1rio CloudStack para adquirir IPs adicionais afim de se implementar NAT est\u00e1tico entre suas inst\u00e2ncias e o IP p\u00fablico. -message.question.are.you.sure.you.want.to.add=Voc\u00ea tem certeza que deseja adicionar -message.read.admin.guide.scaling.up=Por favor leia a sess\u00e3o sobre escalonamento din\u00e2mico no guia do administrador antes de escalonar. -message.recover.vm=Por favor, confirme a recupera\u00e7\u00e3o desta VM. -message.redirecting.region=Redirecionando para regi\u00e3o... -message.reinstall.vm=NOTA\: Proceda com cuidado. Isso far\u00e1 com que a m\u00e1quina virtual seja re-instalada a partir do Template. Todos os datos do disco ROOT ser\u00e3o perdidos. Volumes de Dados adicionais, se houver, n\u00e3o ser\u00e3o alterados. -message.removed.ssh.key.pair=Par de chaves SSH removido -message.remove.ldap=Voc\u00ea tem certeza que deseja deletar a configura\u00e7\u00e3o LDAP? -message.remove.region=Voc\u00ea tem certeza que deseja remover esta regi\u00e3o deste servidor de gerenciamento? -message.remove.vpc=Favor confirmar que voc\u00ea deseja remover a VPC -message.remove.vpn.access=Confirme se voc\u00ea deseja remover acesso VPN do seguinte Usu\u00e1rio. -message.reset.password.warning.notPasswordEnabled=O template desta inst\u00e2ncia foi criado sem uma senha habilitada -message.reset.password.warning.notStopped=Sua inst\u00e2ncia deve estar parada antes de tentar trocar sua senha atual -message.reset.VPN.connection=Favor confirmar que voc\u00ea deseja resetar a conex\u00e3o VPN -message.restart.mgmt.server=Reinicie o(s) servidor(es) de gerenciamento para que a nova configura\u00c3\u00a7\u00c3\u00a3o tenha efeito. -message.restart.mgmt.usage.server=Por favor reinicie seu servidor(es) de gerenciamento e seu servidor(es) de utiliza\u00e7\u00e3o para as mudan\u00e7as entrarem em efeito. -message.restart.network=Por favor confirme que voc\ufffd deseja reiniciar a rede -message.restart.vpc=Favor confirmar que voc\u00ea deseja reiniciar a VPC -message.restart.vpc.remark=Por favor, confirme a reinicializa\u00e7\u00e3o do VPC

Observa\u00e7\u00e3o\: fazendo um VPC redundante n\u00e3o redundante ir\u00e1 for\u00e7ar uma limpeza. As redes n\u00e3o estar\u00e3o dispon\u00edveis por alguns minutos.

-message.restoreVM=Quer restaurar a VM? -message.security.group.usage=(Use Ctrl-clique para selecionar todos os Security Groups) -message.select.affinity.groups=Por favor, selecione quaisquer grupos de afinidade que voc\u00ea deseja que esta VM perten\u00e7a\: -message.select.a.zone=A zone tipicamente corresponde a um \u00fanico datacenter. M\u00faltiplas zonas auxiliam a cloud a ser mais confi\u00e1vel provendo isolamento f\u00edsico e redund\u00e2ncia. -message.select.instance=Por favor selecione uma inst\u00e2ncia. -message.select.iso=Por favor selecione um ISO para sua nova inst\u00e2ncia virtual -message.select.item=Por favor selecione um item. -message.select.security.groups=Por favor selecione o(s) grupo(s) de seguran\u00e7a para sua nova VM -message.select.template=Por favor selecione um template para sua nova inst\u00e2ncia virtual. -message.select.tier=Por favor, selecione um tier -message.set.default.NIC.manual=Por favor atualize manualmente o NIC padr\u00e3o desta VM agora. -message.set.default.NIC=Por favor confirme que voc\u00ea quer tornar este NIC o padr\u00e3o para esta VM, -message.setup.physical.network.during.zone.creation=Ao adicionar uma zona avan\u00e7ada, voc\u00ea precisa configurar uma ou mais redes f\u00edsicas. Cada rede corresponde \u00e0 uma Interface de Rede no hypervisor. Cada rede f\u00edsica pode ser utilizada para transportar um ou mais tipos de tr\u00e1fego, com certas restri\u00e7\u00f5es sobre como eles podem ser combinados.
Arraste e solte um ou mais tipos de tr\u00e1fego em cada rede f\u00edsica. -message.setup.physical.network.during.zone.creation.basic=Quando adicionar uma zona b\u00e1sica, voc\u00ea pode configurar uma rede f\u00edsica, que corresponde a uma Interface de Rede no hypervisor. A rede carrega diversos tipos de tr\u00e1fego.

Voc\u00ea pode adicionar e remover outros tipos de tr\u00e1fego na mesma interface de rede f\u00edsica. -message.setup.successful=Cloud configurada com sucesso\! -message.snapshot.schedule=Voc\u00ea pode configurar Snapshots recorrentes agendados selecionando as op\u00e7\u00f5es dispon\u00edveis abaixo e aplicando suas pol\u00edticas preferenciais -message.specifiy.tag.key.value=Por favor especifique chave e valor da tag -message.specify.url=Por favor especifique a URL -message.step.1.continue=Selecione o template ou ISO para continuar -message.step.1.desc=Por favor, selecione um template para a sua nova inst\u00e2ncia virtual. Voc\u00ea pode tamb\u00e9m escolher um template limpo e instalar a partir de uma imagem ISO. -message.step.2.continue=Selecione o plano -message.step.3.continue=Seleciona a oferta de disco -message.step.4.continue=Selecione pelo menos uma rede para continuar -message.step.4.desc=Selecione a rede principal que a sua inst\u00e2ncia virtual estar\u00e1 conectada. -message.storage.traffic=Tr\u00e1fego entre os recursos internos do CloudStack, incluindo todos os componentes que se comunicam com o servidor de gerenciamento tais como hosts e m\u00e1quinas virtuais de sistema CloudStack. Por favor, configure o tr\u00e1fego do storage aqui. -message.suspend.project=Voc\u00ea tem certeza que deseja suspender este projeto ? -message.systems.vms.ready=VM de Sistema prontas. -message.template.copying=O template est\u00e1 sendo copiado. -message.template.desc=Imagem de SO que pode ser utilizada para bootar VMs -message.tier.required=Tier \u00e9 obrigat\u00f3rio -message.tooltip.dns.1=Endere\u00e7o de um servidor DNS que ser\u00e1 utilizado por todas as VMs da Zone. A faixa de IPs p\u00fablicos para essa Zone deve possuir uma rota para o servidor configurado. -message.tooltip.dns.2=Um servidor DNS secund\u00e1rio para ser utilizado pelas VMs nesta zona. Os endere\u00e7os IP p\u00fablicos nesta zona devem ter rota para este servidor. -message.tooltip.internal.dns.1=Nome de um servidor DNS que ser\u00e1 utilizado pelas VMs internas de sistema do CloudStack nesta zona. Os endere\u00e7os privados dos pods devem ter uma rota para este servidor. -message.tooltip.internal.dns.2=Nome de um servidor DNS que ser\u00e1 utilizado pelas VMs internas de sistema do CloudStack nesta zona. Os endere\u00e7os privados dos pods devem ter uma rota para este servidor. -message.tooltip.network.domain=Um sufixo DNS que ir\u00e1 criar um nome de dom\u00ednio customizado para a rede que \u00e9 acessada pelas guest VMs. -message.tooltip.pod.name=Um nome para este pod. -message.tooltip.reserved.system.gateway=O gateway para os hosts neste pod. -message.tooltip.reserved.system.netmask=O prefixo de rede que define a subrede deste pod. Utilize a nota\u00e7\u00e3o CIDR. -message.tooltip.zone.name=Um nome para a zona. -message.update.os.preference=Escolha o SO de preferencia para este host. Todas Inst\u00e2ncias com preferencias similares ser\u00e3o alocadas neste host antes de tentar em outro. -message.update.resource.count=Por favor confirme que voc\u00ea quer atualizar a contagem de recursos para esta conta. -message.update.ssl=Envie o novo certificado SSL X.509 para ser atualizado em cada console proxy\: -message.update.ssl.failed=Atualiza\u00e7\u00e3o do Certificado SSL falhou -message.update.ssl.succeeded=Atualiza\u00e7\u00e3o do Certificado SSL feita com sucesso -message.validate.accept=Por favor entre com uma extens\u00e3o v\u00e1lida. -message.validate.creditcard=Por favor entre um n\u00famero de cart\u00e3o de cr\u00e9dito v\u00e1lido. -message.validate.date.ISO=Por favor entre com uma data v\u00e1lida (ISO). -message.validate.date=Por favor entre com uma data v\u00e1lida. -message.validate.digits=Por favor entre com d\u00edgitos apenas. -message.validate.email.address=Por favor entre um email v\u00e1lido. -message.validate.equalto=Por favor entre com o mesmo valor novamente. -message.validate.fieldrequired=Este campo \u00e9 obrigat\u00f3rio. -message.validate.fixfield=Por favor, arrume este campo. -message.validate.instance.name=Nomes de inst\u00e2ncias n\u00e3o podem ter mais de 63 caracteres. Somente letras ASCII a~z, A~Z, d\u00edgitos 0~9 e h\u00edfen s\u00e3o permitidos. Deve come\u00e7ar com uma letra e terminar com uma letra ou d\u00edgito. -message.validate.invalid.characters=Caracteres inv\u00e1lidos encontrados, por favor corrija. -message.validate.maxlength=Por favor entre com mais de [0] caracteres. -message.validate.max=Por favor entre com um valor menor que ou igual a {0}. -message.validate.minlength=Por favor entre com pelo menos [0] caracteres. -message.validate.number=Por favor entre um n\u00famero v\u00e1lido. -message.validate.range.length=Por favor entre com um valor com tamanho entre [0] e [1] caracteres. -message.validate.range=Por favor entre com um valor com valor entre [0] e [1]. -message.validate.URL=Por favor entre uma URL v\u00e1lida. -message.virtual.network.desc=Rede virtual dedicado para sua conta. O Dom\u00ednio de broadcast Est\u00e1 na VLAN e todo acesso a internet \u00e9 roteado atrav\u00e9s do virtual router. -message.vm.create.template.confirm=Criar Template reiniciar\u00e1 a VM automaticamente. -message.vm.review.launch=Por favor revise a informa\u00e7\u00e3o abaixo e confirme que sua inst\u00e2ncia virtual est\u00e1 correta antes de executa-la. -message.vnmc.available.list=VNMC n\u00e3o est\u00e1 dispon\u00edvel na lista de provedores. -message.vnmc.not.available.list=VNMC n\u00e3o est\u00e1 dispon\u00edvel na lista de provedores. -message.volume.create.template.confirm=Confirme se voc\u00ea deseja criar um template a partir deste disco. A cria\u00e7\u00e3o do template pode levar alguns minutos ou mais dependendo do tamanho do disco. -message.waiting.for.builtin.templates.to.load=Aguardando a carga dos templates integrados... -message.XSTools61plus.update.failed=A atualiza\u00e7\u00e3o do campo Original XS Version is 6.1\\+ falhou. Erro\: -message.you.must.have.at.least.one.physical.network=Voc\u00ea deve ter pelo menos uma rede f\u00edsica -message.your.cloudstack.is.ready=Seu CLoudStack est\u00e1 pronto\! -message.Zone.creation.complete=Cria\u00e7\u00e3o de zona completa -message.zone.creation.complete.would.you.like.to.enable.this.zone=Cria\u00e7\u00e3o de zona completa. Voc\u00ea gostaria de habilitar esta zona? -message.zone.no.network.selection=A zona que voc\u00ea selecionou n\u00e3o possui nenhuma rede para ser escolhida. -message.zone.step.1.desc=Seleciona o modelo de rede para a zona. -message.zone.step.2.desc=Entre a informa\u00e7\u00e3o a seguir para adicionar uma nova zona -message.zone.step.3.desc=Entre a informa\u00e7\u00e3o a seguir para adicionar um novo pod -message.zoneWizard.enable.local.storage=ALERTA\: se voc\u00ea habilitar storage local para esta zona, voc\u00ea deve fazer o seguinte, dependendo se voc\u00ea quiser que suas m\u00e1quinas virtuais de sistema inicializem\:

1. Se m\u00e1quinas virtuais de sistema precisam ser iniciadas em storage prim\u00e1ria, storage prim\u00e1ria precisa ser adicionada \u00e0 zona ap\u00f3s a cria\u00e7\u00e3o. Voc\u00ea tamb\u00e9m deve ativar a zona em um estado desabilitado.

2. Se m\u00e1quinas virtuais de sistema precisam ser iniciadas em storage local, system.vm.use.local.storage precisa ser estabelecida como verdadeira antes de voc\u00ea habilitar a zona.


Voc\u00ea quer continuar? -messgae.validate.min=Por favor entre com um valor maior que ou igual a {0}. -mode=Modo -network.rate=Taxa de Transfer\u00eancia -notification.reboot.instance=Reiniciar inst\u00e2ncia -notification.start.instance=Iniciar inst\u00e3ncia -notification.stop.instance=Parar inst\u00e2ncia -side.by.side=Lado a Lado -state.Accepted=Aceito -state.Active=Ativo -state.Allocated=Alocado -state.Allocating=Alocando -state.BackedUp=Back up realizado com sucesso -state.BackingUp=Realizando Back up -state.Completed=Completo -state.Creating=Criando -state.Declined=Recusado -state.Destroyed=Destru\u00eddo -state.detached=Desanexado -state.Disabled=Desativado -state.Enabled=Habilitado -state.Error=Erro -state.Expunging=Removendo -state.Migrating=Migrando -state.Pending=Pendente -state.Ready=Pronto -state.Running=Executando -state.Starting=Iniciando -state.Stopped=Parado -state.Stopping=Parando -state.Suspended=Suspendido -title.upload.volume=Upload Volume -ui.listView.filters.all=Todos -ui.listView.filters.mine=Meus diff --git a/client/WEB-INF/classes/resources/messages_ru_RU.properties b/client/WEB-INF/classes/resources/messages_ru_RU.properties deleted file mode 100644 index 05fe7181315e..000000000000 --- a/client/WEB-INF/classes/resources/messages_ru_RU.properties +++ /dev/null @@ -1,1656 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=\u041f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b -confirm.enable.s3=\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0433\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -confirm.enable.swift=\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u043d\u0438\u0436\u0435\u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438 Swift -error.could.not.enable.zone=\u041d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -error.installWizard.message=\u0427\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u043d\u0430\u0437\u0430\u0434 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. -error.invalid.username.password=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u0456\u0439 \u043b\u043e\u0433\u0438\u043d \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c -error.login=\u0412\u0430\u0448\u0435 \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438\u043b\u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043d\u0435 \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u043d\u0430\u0448\u0438\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c. -error.menu.select=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u0432\u044b\u043f\u043e\u043b\u043d\u0438\u0442\u044c \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0435 \u0438\u0437-\u0437\u0430 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u044f \u0432\u044b\u0431\u0440\u0430\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432. -error.mgmt.server.inaccessible=\u0421\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u043f\u0440\u043e\u0431\u0443\u0439\u0442\u0435 \u0435\u0449\u0435 \u0440\u0430\u0437 \u043f\u043e\u0437\u0436\u0435. -error.password.not.match=\u041f\u0430\u0440\u043e\u043b\u0438 \u043d\u0435 \u0441\u043e\u0432\u043f\u0430\u0434\u0430\u044e\u0442 -error.please.specify.physical.network.tags=\u041f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0438 \u043d\u0435\u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e, \u043f\u043e\u043a\u0430 \u0432\u044b \u043d\u0435 \u0443\u043a\u0430\u0436\u0435\u0442\u0435 \u0442\u0435\u0433\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438. -error.session.expired=\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u0435\u0441\u0441\u0438\u0438 \u0438\u0441\u0442\u0435\u043a\u043b\u043e. -error.something.went.wrong.please.correct.the.following=\u0427\u0442\u043e-\u0442\u043e \u043d\u0435 \u0442\u0430\u043a. \u0412\u0435\u0440\u043d\u0438\u0442\u0435\u0441\u044c \u043d\u0430\u0437\u0430\u0434 \u0438 \u0438\u0441\u043f\u0440\u0430\u0432\u044c\u0442\u0435 \u043e\u0448\u0438\u0431\u043a\u0438. -error.unable.to.reach.management.server=\u041d\u0435 \u0443\u0434\u0430\u0435\u0442\u0441\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0441\u0435\u0440\u0432\u0435\u0440\u0443 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f -error.unresolved.internet.name=\u0412\u0430\u0448\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0438\u043c\u044f \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u0440\u0430\u0437\u0440\u0435\u0448\u0438\u0442\u044c. -force.delete.domain.warning=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\: \u0412\u044b\u0431\u043e\u0440 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u044e \u0432\u0441\u0435\u0445 \u0434\u043e\u0447\u0435\u0440\u043d\u0438\u0445 \u0434\u043e\u043c\u0435\u043d\u043e\u0432 \u0438 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0438\u043c\u0438 \u0443\u0447\u0435\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439 \u0438 \u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -force.delete=\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 -force.remove.host.warning=\u0412\u044b\u0431\u043e\u0440 \u044d\u0442\u043e\u0439 \u043e\u043f\u0446\u0438\u0438 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d \u043f\u0435\u0440\u0435\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. -force.remove=\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435 -force.stop.instance.warning=\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435\: \u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043f\u0440\u0438\u043c\u0435\u043d\u044f\u0442\u044c\u0441\u044f \u0432 \u0441\u0430\u043c\u0443\u044e \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u044e\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u043e\u0442\u0435\u0440\u044f\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u043e\u0435 \u043f\u043e\u0432\u0435\u0434\u0435\u043d\u0438\u0435/\u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. -force.stop=\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c -ICMP.code=\u041a\u043e\u0434 ICMP -ICMP.type=\u0422\u0438\u043f ICMP -image.directory=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 \u0441 \u043e\u0431\u0440\u0430\u0437\u0430\u043c\u0438 -inline=\u0412\u0441\u0442\u0440\u043e\u0435\u043d\u043d\u044b\u0439 -instances.actions.reboot.label=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -label.about.app=\u041e CloudStack -label.about=\u041e \u0441\u0438\u0441\u0442\u0435\u043c\u0435 -label.accept.project.invitation=\u041f\u0440\u0438\u043d\u044f\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442 -label.account.and.security.group=\u0410\u043a\u043a\u0430\u0443\u043d\u0442, \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.account.id=ID \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 -label.account.lower=\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c -label.account.name=\u0418\u043c\u044f \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 -label.account.specific=\u0421\u043f\u0435\u0446\u0438\u0444\u0438\u043a\u0430 \u0430\u043a\u043a\u0430\u0443\u043d\u043d\u0442\u0430 -label.accounts=\u0423\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.account=\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c -label.acquire.new.ip=\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 IP -label.acquire.new.secondary.ip=\u0417\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441 -label.action.attach.disk.processing=\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430... -label.action.attach.disk=\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0438\u0441\u043a -label.action.attach.iso.processing=\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 ISO... -label.action.attach.iso=\u041f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c ISO -label.action.cancel.maintenance.mode.processing=\u0412\u044b\u0445\u043e\u0434 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f... -label.action.cancel.maintenance.mode=\u0412\u044b\u0439\u0442\u0438 \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. -label.action.change.password=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c -label.action.change.service.processing=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0431\u044b... -label.action.change.service=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443 -label.action.copy.ISO.processing=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ISO... -label.action.copy.ISO=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c ISO -label.action.copy.template.processing=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430... -label.action.copy.template=\u0421\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d -label.action.create.template.from.vm=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0437 \u0412\u041c -label.action.create.template.from.volume=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0437 \u0442\u043e\u043c\u0430 -label.action.create.template.processing=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430... -label.action.create.template=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d -label.action.create.vm.processing=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b... -label.action.create.vm=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.create.volume.processing=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430... -label.action.create.volume=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0434\u0438\u0441\u043a -label.action.delete.account.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438... -label.action.delete.account=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c -label.action.delete.cluster.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430... -label.action.delete.cluster=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 -label.action.delete.disk.offering.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430... -label.action.delete.disk.offering=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.action.delete.domain.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043c\u0435\u043d\u0430... -label.action.delete.domain=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d -label.action.delete.firewall.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u044d\u043a\u0440\u0430\u043d\u0430... -label.action.delete.firewall=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0444\u0430\u0435\u0440\u0432\u043e\u043b\u0430 -label.action.delete.ingress.rule.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0433\u043e \u043f\u0440\u0430\u0432\u0438\u043b\u0430... -label.action.delete.ingress.rule=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.action.delete.IP.range.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432... -label.action.delete.IP.range=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.action.delete.ISO.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 ISO... -label.action.delete.ISO=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ISO -label.action.delete.load.balancer.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438.... -label.action.delete.load.balancer=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.action.delete.network.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0435\u0442\u0438... -label.action.delete.network=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0442\u044c -label.action.delete.nexusVswitch=\u0423\u0434\u0430\u043b\u0438\u0442\u044c NexusVswitch -label.action.delete.nic=\u0423\u0434\u0430\u043b\u0438\u0442\u044c NIC -label.action.delete.physical.network=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438 -label.action.delete.pod.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430... -label.action.delete.pod=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434 -label.action.delete.primary.storage.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430... -label.action.delete.primary.storage=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.action.delete.secondary.storage.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430... -label.action.delete.secondary.storage=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.action.delete.security.group.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 Security Group.... -label.action.delete.security.group=\u0423\u0434\u0430\u043b\u0438\u0442\u044c Security Group -label.action.delete.service.offering.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430... -label.action.delete.service.offering=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 -label.action.delete.snapshot.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u043a\u0430... -label.action.delete.snapshot=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a -label.action.delete.system.service.offering=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 -label.action.delete.template.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430... -label.action.delete.template=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d -label.action.delete.user.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f... -label.action.delete.user=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.action.delete.volume.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0442\u043e\u043c\u0430... -label.action.delete.volume=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u043e\u043c -label.action.delete.zone.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b... -label.action.delete.zone=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -label.action.destroy.instance.processing=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b... -label.action.destroy.instance=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.destroy.systemvm.processing=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c.... -label.action.destroy.systemvm=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c -label.action.detach.disk.processing=\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430.... -label.action.detach.disk=\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u0434\u0438\u0441\u043a -label.action.detach.iso.processing=\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 ISO.... -label.action.detach.iso=\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c ISO -label.action.disable.account.processing=\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0443\u0447\u0451\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 -label.action.disable.account=\u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c -label.action.disable.cluster.processing=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430... -label.action.disable.cluster=\u041e\u0442\u043a\u043b\u044e\u0447\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 -label.action.disable.nexusVswitch=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c Nexus 1000v -label.action.disable.physical.network=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c -label.action.disable.pod.processing=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430... -label.action.disable.pod=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434. -label.action.disable.static.NAT.processing=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.... -label.action.disable.static.NAT=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c Static NAT -label.action.disable.user.processing=\u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.... -label.action.disable.user=\u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.action.disable.zone.processing=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b... -label.action.disable.zone=\u041e\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -label.action.download.ISO=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c ISO -label.action.download.template=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d -label.action.download.volume.processing=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u0438\u0441\u043a\u0430.... -label.action.download.volume=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0438\u0441\u043a -label.action.edit.account=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c -label.action.edit.disk.offering=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.action.edit.domain=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d -label.action.edit.global.setting=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -label.action.edit.host=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0437\u0435\u043b -label.action.edit.instance=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.edit.ISO=\u0418\u0437\u043c\u0435\u043d\u0438\u0438\u0442\u044c ISO -label.action.edit.network.offering=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0438\u0441\u0430 -label.action.edit.network.processing=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0441\u0435\u0442\u0438.... -label.action.edit.network=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0441\u0435\u0442\u044c -label.action.edit.pod=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0435\u043d\u0434 -label.action.edit.primary.storage=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.action.edit.resource.limits=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043d\u044b\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f -label.action.edit.service.offering=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f -label.action.edit.template=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d -label.action.edit.user=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.action.edit.zone=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -label.action.enable.account.processing=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.... -label.action.enable.account=\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c -label.action.enable.cluster.processing=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430... -label.action.enable.cluster=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 -label.action.enable.maintenance.mode.processing=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f..... -label.action.enable.maintenance.mode=\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f -label.action.enable.nexusVswitch=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c Nexus 1000v -label.action.enable.physical.network=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c -label.action.enable.pod.processing=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430.. -label.action.enable.pod=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434 -label.action.enable.static.NAT.processing=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u0438 \u0430\u0434\u0440\u0435\u0441\u043e\u0432.... -label.action.enable.static.NAT=\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c Static NAT -label.action.enable.user.processing=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f.... -label.action.enable.user=\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.action.enable.zone.processing=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0437\u043e\u043d\u044b... -label.action.enable.zone=\u0410\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0437\u043e\u043d\u0443 -label.action.expunge.instance=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u0412\u041c -label.action.force.reconnect.processing=\u041f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435... -label.action.force.reconnect=\u041f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c -label.action.generate.keys.processing=\u0413\u0435\u043d\u0435\u0440\u0430\u0446\u0438\u044f \u043a\u043b\u044e\u0447\u0435\u0439... -label.action.generate.keys=\u0413\u0435\u043d\u0435\u0440\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043a\u043b\u044e\u0447\u0438 -label.action.list.nexusVswitch=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 Nexus 1000v -label.action.lock.account.processing=\u0411\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438.... -label.action.lock.account=\u0417\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c -label.action.manage.cluster.processing=\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f... -label.action.manage.cluster=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c -label.action.migrate.instance.processing=\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f \u043c\u0430\u0448\u0438\u043d\u044b.... -label.action.migrate.instance=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.migrate.router.processing=\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0440\u043e\u0443\u0442\u0435\u0440\u0430... -label.action.migrate.router=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0440\u043e\u0443\u0442\u0435\u0440 -label.action.migrate.systemvm.processing=\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c... -label.action.migrate.systemvm=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c -label.action.reboot.instance.processing=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u043c\u0430\u0448\u0438\u043d\u044b... -label.action.reboot.instance=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.reboot.router.processing=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430... -label.action.reboot.router=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440 -label.action.reboot.systemvm.processing=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c -label.action.reboot.systemvm=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c -label.action.recurring.snapshot=\u041f\u043e\u0432\u0442\u043e\u0440\u044f\u0435\u043c\u044b\u0435 \u0441\u043d\u0438\u043c\u043a\u0438 -label.action.register.iso=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f ISO -label.action.register.template=\u0420\u0435\u0433\u0438\u0441\u0442\u0440\u0430\u0446\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u043e URL -label.action.release.ip.processing=\u041e\u0441\u0432\u043e\u0431\u043e\u0436\u0434\u0435\u043d\u0438\u0435 IP... -label.action.release.ip=\u041e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c IP -label.action.remove.host.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430... -label.action.remove.host=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0437\u0435\u043b -label.action.reset.password.processing=\u0421\u0431\u0440\u043e\u0441 \u043f\u0430\u0440\u043e\u043b\u044f... -label.action.reset.password=\u0421\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c -label.action.resize.volume.processing=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0434\u0438\u0441\u043a\u0430.... -label.action.resize.volume=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430 -label.action.resource.limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0440\u0435\u0441\u0443\u0440\u043e\u0432 -label.action.restore.instance.processing=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b... -label.action.restore.instance=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.revert.snapshot.processing=\u0412\u043e\u0437\u0432\u0440\u0430\u0449\u0435\u043d\u0438\u0435 \u043a \u0441\u043d\u0438\u043c\u043a\u0443... -label.action.revert.snapshot=\u0412\u043e\u0437\u0432\u0440\u0430\u0442 \u043a \u0441\u043d\u0438\u043c\u043a\u0443 -label.action.start.instance.processing=\u0417\u0430\u043f\u0443\u0441\u043a \u043c\u0430\u0448\u0438\u043d\u044b... -label.action.start.instance=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.start.router.processing=\u0417\u0430\u043f\u0443\u0441\u043a \u0440\u043e\u0443\u0442\u0435\u0440\u0430.... -label.action.start.router=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440 -label.action.start.systemvm.processing=\u0417\u0430\u043f\u0443\u0441\u043a \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c... -label.action.start.systemvm=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c -label.action.stop.instance.processing=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043c\u0430\u0448\u0438\u043d\u044b... -label.action.stop.instance=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -label.action.stop.router.processing=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0440\u043e\u0443\u0442\u0435\u0440\u0430... -label.action.stop.router=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440 -label.action.stop.systemvm.processing=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c... -label.action.stop.systemvm=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c -label.actions=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f -label.action.take.snapshot.processing=\u041f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0435 \u0441\u043d\u0438\u043c\u043a\u0430... -label.action.take.snapshot=\u041f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a... -label.action=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f -label.action.unmanage.cluster.processing=\u041f\u0435\u0440\u0435\u0445\u043e\u0434 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c... -label.action.unmanage.cluster=\u041f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c -label.action.update.OS.preference.processing=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u041e\u0421... -label.action.update.OS.preference=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u041e\u0421 -label.action.update.resource.count.processing=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0447\u0435\u0442\u0430 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -label.action.update.resource.count=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0443\u0447\u0435\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -label.action.vmsnapshot.create=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c -label.action.vmsnapshot.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c -label.action.vmsnapshot.revert=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c -label.activate.project=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 -label.active.sessions=\u0410\u043a\u0442\u0438\u0432\u043d\u044b\u0435 \u0441\u0435\u0441\u0441\u0438\u0438 -label.add.accounts.to=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.add.accounts=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.add.account.to.project=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 -label.add.account=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c -label.add.ACL=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c ACL -label.add.affinity.group=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e affinity group -label.add.by.cidr=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a CIDR -label.add.by.group=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a \u0433\u0440\u0443\u043f\u043f\u0435 -label.add.by=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c -label.add.cluster=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 -label.add.compute.offering=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0432\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f -label.add.direct.iprange=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0445 IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.add.disk.offering=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.add.domain=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043c\u0435\u043d -label.added.network.offering=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 -label.add.egress.rule=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.add.F5.device=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c F5 \u0443\u0441\u0442\u0440\u043e\u0439\u0432\u043e -label.add.firewall=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0444\u0430\u0435\u0440\u0432\u043e\u043b\u0430. -label.add.guest.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c -label.add.host=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0437\u0435\u043b -label.adding.cluster=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 -label.adding.failed=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c -label.adding.pod=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430 -label.adding.processing=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435... -label.add.ingress.rule=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.adding.succeeded=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e \u0443\u0441\u043f\u0435\u0448\u043d\u043e -label.adding=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b -label.adding.user=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.adding.zone=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0437\u043e\u043d\u044b -label.add.ip.range=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.add.isolated.guest.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c -label.add.isolated.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c -label.additional.networks=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 -label.add.ldap.account=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c LDAP \u0430\u043a\u043a\u0430\u0443\u043d\u0442 -label.add.load.balancer=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.add.more=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0447\u0442\u043e-\u0442\u043e \u0435\u0449\u0435 -label.add.netScaler.device=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c Netscaler \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e -label.add.network.ACL=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u0443\u044e ACL -label.add.network.device=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e -label.add.network.offering=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b -label.add.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u044c -label.add.new.F5=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 F5 -label.add.new.gateway=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0448\u043b\u044e\u0437 -label.add.new.NetScaler=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 NetScaler -label.add.new.PA=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c Palo Alto -label.add.new.SRX=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 SRX -label.add.new.tier=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 Tier -label.add.NiciraNvp.device=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 Nvp -label.add.PA.device=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e Palo Alto -label.add.physical.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c -label.add.pod=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0435\u043d\u0434 -label.add.port.forwarding.rule=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430 -label.add.primary.storage=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u0430\u043d\u043d\u044b\u0445 -label.add.region=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d -label.add.resources=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -label.add.route=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 -label.add.rule=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.add.secondary.storage=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.add.security.group=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u0440\u0443\u043f\u043f\u0443 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.add.service.offering=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u043b\u0443\u0436\u0431\u0443 -label.add.SRX.device=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c SRX \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e -label.add.static.nat.rule=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u043e\u0433\u043e NAT -label.add.static.route=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 -label.add.system.service.offering=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0431 -label.add.template=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d -label.add.to.group=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u0433\u0440\u0443\u043f\u043f\u0443 -label.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c -label.add.user=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.add.vlan=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VLAN -label.add.vms.to.lb=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c \u0432 \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.add.vms=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c-\u044b -label.add.VM.to.tier=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c \u043a tier -label.add.vm=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0412\u041c -label.add.volume=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0441\u043a -label.add.vpc.offering=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC -label.add.vpc=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPC -label.add.vpn.customer.gateway=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 -label.add.VPN.gateway=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437 -label.add.vpn.user=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f VPN -label.add.vxlan=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c VXLAN -label.add.zone=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -label.admin.accounts=\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u0438\u0432\u043d\u044b\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.admin=\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 -label.advanced.mode=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c -label.advanced.search=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 \u043f\u043e\u0438\u0441\u043a -label.advanced=\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u044b\u0439 -label.affinity=\ \u0421\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0441\u0442\u044c -label.agent.password=\u041f\u0430\u0440\u043e\u043b\u044c \u0430\u0433\u0435\u043d\u0442\u0430 -label.agent.username=\u0418\u043c\u044f \u0430\u0433\u0435\u043d\u0442\u0430 -label.agree=\u0421\u043e\u0433\u043b\u0430\u0441\u0435\u043d -label.alert=\u0422\u0440\u0435\u0432\u043e\u0433\u0430 -label.algorithm=\u0410\u043b\u0433\u043e\u0440\u0438\u0442\u043c -label.allocated=\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e -label.allocation.state=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f -label.api.key=\u041a\u043b\u044e\u0447 API -label.api.version=\u0412\u0435\u0440\u0441\u0438\u044f API -label.apply=\u041f\u0440\u0438\u043c\u0435\u043d\u0438\u0442\u044c -label.app.name=CloudStack -label.archive.alerts=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u0440\u0435\u0432\u043e\u0433\u0438 -label.archive.events=\u0410\u0440\u0445\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f -label.assign.to.load.balancer=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0443 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.assign=\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043e -label.associated.network.id=ID \u0421\u0432\u044f\u0437\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 -label.associated.network=\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u0430\u044f \u0441\u0435\u0442\u044c -label.associate.public.ip=\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0435 IP -label.attached.iso=\u041f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043d\u044b\u0439 ISO -label.author.email=E-mail \u0430\u0432\u0442\u043e\u0440\u0430 -label.author.name=\u0418\u043c\u044f \u0430\u0432\u0442\u043e\u0440\u0430 -label.availability=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c -label.availability.zone=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u044c \u0437\u043e\u043d\u044b -label.available.public.ips=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 IP \u0430\u0434\u0440\u0435\u0441\u0430 -label.available=\u0414\u043e\u0441\u0442\u0443\u043f\u043d\u043e -label.back=\u041d\u0430\u0437\u0430\u0434 -label.bandwidth=\u041f\u0440\u043e\u043f\u0443\u0441\u043a\u043d\u0430\u044f \u0441\u043f\u043e\u0441\u043e\u0431\u043d\u043e\u0441\u0442\u044c -label.basic.mode=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0440\u0435\u0436\u0438\u043c -label.basic=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 -label.bootable=\u0417\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u044b\u0439 -label.broadcast.domain.range=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 -label.broadcast.domain.type=\u0422\u0438\u043f \u0448\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u0430 -label.broadcast.uri=\u0428\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URI -label.broadcat.uri=\u0428\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 URI -label.by.account=\u041f\u043e \u0443\u0447\u0435\u0442\u043d\u044b\u043c \u0437\u0430\u043f\u0438\u0441\u044f\u043c -label.by.alert.type=\u041f\u043e \u0442\u0438\u043f\u0443 \u0442\u0440\u0435\u0432\u043e\u0433\u0438 -label.by.availability=\u041f\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e\u0441\u0442\u0438 -label.by.date.end=\u041f\u043e \u0434\u0430\u0442\u0435(\u043a\u043e\u043d\u0435\u0446) -label.by.date.start=\u041f\u043e \u0434\u0430\u0442\u0435(\u043d\u0430\u0447\u0430\u043b\u043e) -label.by.domain=\u0414\u043e \u0434\u043e\u043c\u0435\u043d\u0443 -label.by.end.date=\u041f\u043e \u0434\u0430\u0442\u0435 \u043e\u043a\u043e\u043d\u0447\u0430\u043d\u0438\u044f -label.by.event.type=\u041f\u043e \u0442\u0438\u043f\u0443 \u0441\u043e\u0431\u044b\u0442\u0438\u044f -label.by.level=\u041f\u043e \u0443\u0440\u043e\u0432\u043d\u044e -label.by.pod=\u041f\u043e \u0441\u0442\u0435\u043d\u0434\u0443 -label.by.role=\u041f\u043e \u0440\u043e\u043b\u044f\u043c -label.by.start.date=\u041f\u043e \u0434\u0430\u0442\u0435 \u043d\u0430\u0447\u0430\u043b\u0430 -label.by.state=\u041f\u043e \u0441\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u044e -label.bytes.received=\u0411\u0430\u0439\u0442 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e -label.bytes.sent=\u0411\u0430\u0439\u0442\u043e\u0432 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e -label.by.traffic.type=\u041f\u043e \u0442\u0438\u043f\u0443 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 -label.by.type.id=\u041f\u043e \u0442\u0438\u043f\u0443 ID -label.by.type=\u041f\u043e \u0442\u0438\u043f\u0443 -label.by.zone=\u041f\u043e \u0437\u043e\u043d\u0435 -label.cancel=\u041e\u0442\u043c\u0435\u043d\u0430 -label.capacity.bytes=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0411\u0430\u0439\u0442 -label.capacity.iops=\u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e IOPS -label.capacity=\u041c\u043e\u0449\u043d\u043e\u0441\u0442\u044c -label.certificate=\u0421\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 -label.change.service.offering=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f -label.change.value=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 -label.character=\u0421\u0438\u043c\u0432\u043e\u043b\u043e\u0432 -label.cidr.account=CIDR \u0438\u043b\u0438 \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c/\u0433\u0440\u0443\u043f\u043f\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.cidr=CIDR -label.cidr.list=CIDR \u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 -label.CIDR.list=\u0421\u043f\u0438\u0441\u043e\u043a CIDR -label.CIDR.of.destination.network=CIDR \u0441\u0435\u0442\u0438 \u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f -label.clean.up=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c -label.clear.list=\u041e\u0447\u0438\u0441\u0442\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a -label.close=\u0417\u0430\u043a\u0440\u044b\u0442\u044c -label.cloud.console=\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043e\u0431\u043b\u0430\u043a\u043e\u043c -label.cloud.managed=\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f -label.cluster.name=\u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 -label.clusters=\u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b -label.cluster.type=\u0422\u0438\u043f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 -label.cluster=\u041a\u043b\u0430\u0441\u0442\u0435\u0440 -label.clvm=CLVM -label.code=\u041a\u043e\u0434 -label.community=\u0421\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e -label.compute.and.storage=\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u044f \u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.compute.offerings=\u0423\u0441\u043b\u0443\u0433\u0438 \u0432\u044b\u0447\u0435\u0441\u043b\u0435\u043d\u0438\u044f -label.compute.offering=\u0423\u0441\u043b\u0443\u0433\u0430 \u0432\u044b\u0447\u0435\u0441\u043b\u0435\u043d\u0438\u044f -label.compute=\u0412\u044b\u0447\u0438\u0441\u043b\u0435\u043d\u0438\u0435 -label.configuration=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f -label.configure.network.ACLs=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 ACL \u0441\u0435\u0442\u0438 -label.configure=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c -label.configure.vpc=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c VPC -label.confirmation=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u0435 -label.confirm.password=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0430\u0440\u043e\u043b\u044c -label.congratulations=\u041f\u043e\u0437\u0434\u0440\u0430\u0432\u043b\u044f\u0435\u043c\! -label.conserve.mode=\u042d\u043a\u043e\u043d\u043e\u043c\u0438\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c -label.console.proxy=\u041f\u0440\u043e\u043a\u0441\u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u0438 -label.continue.basic.install=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c \u043f\u0440\u043e\u0441\u0442\u0443\u044e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0443 -label.continue=\u041f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c -label.copying.iso=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ISO -label.corrections.saved=\u0418\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u044b -label.cpu.allocated.for.VMs=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430\u043c CPU -label.cpu.allocated=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 CPU -label.CPU.cap=CPU Cap -label.cpu=CPU -label.cpu.limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f CPU -label.cpu.mhz=CPU (\u0432 \u041c\u0433\u0446) -label.cpu.utilized=\u0417\u0430\u0433\u0440\u0443\u0436\u0435\u043d\u043e CPU -label.created.by.system=\u0421\u043e\u0437\u0434\u0430\u043d\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043e\u0439 -label.created=\u0421\u043e\u0437\u0434\u0430\u043d\u043e -label.create.project=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 -label.create.template=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d -label.create.VPN.connection=\u0421\u043e\u0437\u0434\u0430\u0442\u044c VPN \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435 -label.cross.zones=\u041e\u0431\u0449\u0438\u0435 \u0434\u043b\u044f \u0437\u043e\u043d -label.custom.disk.iops=\u0421\u0432\u043e\u0435 \u043a\u043e\u043b-\u0432\u043e IPOS -label.custom.disk.size=\u041f\u0440\u043e\u0438\u0437\u0432\u043e\u043b\u044c\u043d\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430 -label.daily=\u0415\u0436\u0435\u0434\u043d\u0435\u0432\u043d\u043e -label.data.disk.offering=\u0423\u0441\u043b\u0443\u0433\u0430 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.date=\u0414\u0430\u0442\u0430 -label.day.of.month=\u0414\u0435\u043d\u044c \u043c\u0435\u0441\u044f\u0446\u0430 -label.day.of.week=\u0414\u0435\u043d\u044c \u043d\u0435\u0434\u0435\u043b\u0438 -label.dead.peer.detection=Dead Peer Detection -label.decline.invitation=\u041e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 -label.dedicated=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0439 -label.default.egress.policy=\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e -label.default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e -label.default.use=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e -label.default.view=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u044b\u0439 \u0432\u0438\u0434 -label.delete.affinity.group=\u0423\u0434\u0430\u043b\u0438\u0442\u044c affinity group -label.delete.alerts=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0442\u0440\u0435\u0432\u043e\u0433\u0438 -label.delete.events=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u043e\u0431\u044b\u0442\u0438\u044f -label.delete.F5=\u0423\u0434\u0430\u043b\u0438\u0442\u044c F5 -label.delete.gateway=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0448\u043b\u044e\u0437 -label.delete.NetScaler=\u0423\u0434\u0430\u043b\u0438\u0442\u044c NetScaler -label.delete.NiciraNvp=\u0423\u0434\u0430\u043b\u0438\u0442\u044c Nvp \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 -label.delete.PA=\u0423\u0434\u0430\u043b\u0438\u0442\u044c Palo Alto -label.delete.profile=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0444\u0438\u043b\u044c -label.delete.project=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 -label.delete.SRX=\u0423\u0434\u0430\u043b\u0438\u0442\u044c SRX -label.delete=\u0423\u0434\u0430\u043b\u0438\u0442\u044c -label.delete.VPN.connection=\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPN \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435 -label.delete.VPN.customer.gateway=\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 -label.delete.VPN.gateway=\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437 -label.delete.vpn.user=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f VPN -label.deleting.failed=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c -label.deleting.processing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435... -label.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 -label.destination.physical.network.id=ID \u0446\u0435\u043b\u0435\u0432\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438 -label.destination.zone=\u0426\u0435\u043b\u0435\u0432\u0430\u044f \u0437\u043e\u043d\u0430 -label.destroy.router=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440 -label.destroy=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c -label.detaching.disk=\u041e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u0438\u0441\u043a\u0430 -label.details=\u0414\u0435\u0442\u0430\u043b\u0438 -label.device.id=ID \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 -label.devices=\u0423\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e -label.dhcp=DHCP -label.DHCP.server.type=\u0422\u0438\u043f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DHCP -label.direct.attached.public.ip=\u0412\u044b\u0434\u0430\u043d\u043d\u044b\u0435 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP -label.direct.ips=\u041f\u0440\u044f\u043c\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 -label.disable.autoscale=\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 -label.disabled=\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e -label.disable.host=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u043e\u0441\u0442 -label.disable.network.offering=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 -label.disable.provider=\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 -label.disable.vpc.offering=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC -label.disable.vpn=\u0412\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN -label.disabling.vpn.access=\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a VPN -label.disk.allocated=\u0417\u0430\u043d\u044f\u0442\u043e \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0435 \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.disk.bytes.read.rate=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0447\u0442\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0430 (BPS) -label.disk.bytes.write.rate=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0438\u0441\u043a\u0430 (BPS) -label.disk.iops.max=\u041c\u0430\u043a\u0441. IOPS -label.disk.iops.min=\u041c\u0438\u043d. IOPS -label.disk.iops.read.rate=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0438\u0441\u043a\u0430 (IOPS) -label.disk.iops.total=\u0412\u0441\u0435\u0433\u043e IOPS -label.disk.iops.write.rate=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0437\u0430\u043f\u0438\u0441\u0438 \u0434\u0438\u0441\u043a\u0430 (IOPS) -label.disk.offering=\u0423\u0441\u043b\u0443\u0433\u0430 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.disk.read.bytes=\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0441 \u0434\u0438\u0441\u043a\u0430 (\u0411\u0430\u0439\u0442) -label.disk.read.io=\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0441 \u0434\u0438\u0441\u043a\u0430 (IO) -label.disk.size.gb=\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430 (\u0432 \u0413\u0411) -label.disk.size=\u0420\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430 -label.disk.total=\u0412\u0441\u0435\u0433\u043e \u0432 \u0434\u0438\u0441\u043a\u0430\u0445 -label.disk.volume=\u041e\u0431\u044a\u0435\u043c \u0434\u0438\u0441\u043a\u0430 -label.disk.write.bytes=\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u0434\u0438\u0441\u043a (\u0411\u0430\u0439\u0442) -label.disk.write.io=\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u043d\u0430 \u0434\u0438\u0441\u043a (IO) -label.display.text=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=DNS \u0434\u043e\u043c\u0435\u043d \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 -label.domain.admin=\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 \u0434\u043e\u043c\u0435\u043d\u0430 -label.domain.id=ID \u0434\u043e\u043c\u0435\u043d\u0430 -label.domain.lower=\u0414\u043e\u043c\u0435\u043d -label.domain.name=\u0418\u043c\u044f \u0434\u043e\u043c\u0435\u043d\u0430 -label.domain.router=\u041c\u0430\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440 -label.domain.suffix=\u0421\u0443\u0444\u0444\u0438\u043a\u0441 \u0434\u043e\u043c\u0435\u043d\u0430 DNS (\u043d\u043f\u0440. xyz.com) -label.domain=\u0414\u043e\u043c\u0435\u043d -label.done=\u0413\u043e\u0442\u043e\u0432\u043e -label.double.quotes.are.not.allowed=\u0414\u0432\u043e\u0439\u043d\u044b\u0435 \u043a\u0430\u0432\u044b\u0447\u043a\u0438 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u044e\u0442\u0441\u044f -label.download.progress=\u0421\u0442\u0430\u0442\u0443\u0441 \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.drag.new.position=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043d\u043e\u0432\u0443\u044e \u043f\u043e\u0437\u0438\u0446\u0438\u044e -label.dynamically.scalable=\u0414\u0438\u043d\u0430\u043c\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 -label.edit.affinity.group=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c affinity group -label.edit.lb.rule=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c LB \u043f\u0440\u0430\u0432\u0438\u043b\u0430 -label.edit.network.details=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -label.edit.project.details=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0438 \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -label.edit.region=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d -label.edit.secondary.ips=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 -label.edit.tags=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0442\u044d\u0433\u0438 -label.edit.traffic.type=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0442\u0438\u043f \u0442\u0440\u0430\u0444\u0438\u043a\u0430 -label.edit=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c -label.edit.vpc=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c VPC -label.egress.default.policy=\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0430\u044f \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e -label.egress.rules=\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 -label.egress.rule=\u0418\u0441\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.elastic.IP=\u0413\u0438\u0431\u043a\u0438\u0439 IP -label.elastic.LB=\u0413\u0438\u0431\u043a\u0438\u0439 LB -label.elastic=\u0413\u0438\u0431\u043a\u0438\u0439 -label.email=E-mail -label.email.lower=E-mail -label.enable.autoscale=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0435 \u043c\u0430\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 -label.enable.host=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0445\u043e\u0441\u0442 -label.enable.network.offering=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0443\u0441\u043b\u0443\u0433\u0443 -label.enable.provider=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 -label.enable.s3=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.enable.swift=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c Swift -label.enable.vpc.offering=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC -label.enable.vpn=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN -label.enabling.vpn.access=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043f\u043e VPN -label.enabling.vpn=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f VPN -label.end.IP=\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 IP -label.endpoint.or.operation=\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 \u0438\u043b\u0438 \u043e\u043f\u0435\u0440\u0430\u0446\u0438\u044f -label.endpoint=\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 -label.end.port=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0439 \u043f\u043e\u0440\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 -label.end.reserved.system.IP=\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441 -label.enter.token=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0442\u043e\u043a\u0435\u043d -label.error.code=\u041a\u043e\u0434 \u043e\u0448\u0438\u0431\u043a\u0438 -label.error=\u041e\u0448\u0438\u0431\u043a\u0430 -label.ESP.encryption=\u0448\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 ESP -label.ESP.hash=\u0445\u044d\u0448 ESP -label.ESP.lifetime=\u0412\u0440\u0435\u043c\u044f \u0436\u0438\u0437\u043d\u0438 ESP (\u0432 \u0441\u0435\u043a\u0443\u043d\u0434\u0430\u0445) -label.ESP.policy=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 ESP -label.esx.host=\u0423\u0437\u0435\u043b ESX/ESXi -label.example=\u041f\u0440\u0438\u043c\u0435\u0440 -label.expunge=\u0423\u0434\u0430\u043b\u0451\u043d -label.external.link=\u0412\u043d\u0435\u0448\u043d\u0435\u0435 \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435 -label.extractable=\u0418\u0437\u0432\u043b\u0435\u043a\u0430\u0435\u043c\u044b\u0439 -label.f5=F5 -label.failed=\u041d\u0435\u0443\u0434\u0430\u0447\u043d\u043e -label.featured=\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0439 -label.fetch.latest=\u0412\u044b\u0431\u043e\u0440\u043a\u0430 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0445 -label.filterBy=\u0424\u0438\u043b\u044c\u0442\u0440\u043e\u0432\u0430\u0442\u044c -label.firewall=\u0424\u0430\u0435\u0440\u0432\u043e\u043b -label.firstname.lower=\u0418\u043c\u044f -label.first.name=\u0418\u043c\u044f -label.format=\u0424\u043e\u0440\u043c\u0430\u0442 -label.friday=\u041f\u044f\u0442\u043d\u0438\u0446\u0430 -label.full.path=\u041f\u043e\u043b\u043d\u044b\u0439 \u043f\u0443\u0442\u044c -label.full=\u041f\u043e\u043b\u043d\u044b\u0439 -label.gateway=\u0428\u043b\u044e\u0437 -label.general.alerts=\u041e\u0431\u0449\u0438\u0435 \u0442\u0440\u0435\u0432\u043e\u0433\u0438 -label.generating.url=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 URL -label.gluster.volume=\u0422\u043e\u043c -label.go.step.2=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 2 -label.go.step.3=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 3 -label.go.step.4=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 4 -label.go.step.5=\u041f\u0435\u0440\u0435\u0439\u0442\u0438 \u043a \u0448\u0430\u0433\u0443 5 -label.gpu=GPU -label.group.optional=\u0413\u0440\u0443\u043f\u043f\u0430 (\u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e) -label.group=\u0413\u0440\u0443\u043f\u043f\u0430 -label.gslb.lb.details=\u0414\u0435\u0442\u0430\u043b\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.gslb.lb.rule=\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.guest.cidr=\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 CIDR -label.guest.end.ip=\u041a\u043e\u043d\u0435\u0447\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 IP. -label.guest.gateway=\u0428\u043b\u044e\u0437 -label.guest.ip.range=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.guest.ip=\u0413\u043e\u0441\u0442\u0435\u0432\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 -label.guest.netmask=\u0413\u043e\u0441\u0442\u0435\u0432\u0430\u044f \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 -label.guest.networks=\u0413\u043e\u0441\u0442\u0435\u0432\u044b\u0435 \u0441\u0435\u0442\u0438 -label.guest.start.ip=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 IP -label.guest.traffic=\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a -label.guest.type=\u0422\u0438\u043f \u0433\u043e\u0441\u0442\u044f -label.guest=\u0413\u043e\u0441\u0442\u044c -label.ha.enabled=\u041e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u0430 -label.help=\u041f\u043e\u043c\u043e\u0449\u044c -label.hide.ingress.rule=\u0421\u043a\u0440\u044b\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.hints=\u041f\u043e\u0434\u0441\u043a\u0430\u0437\u043a\u0438 -label.home=\u0413\u043b\u0430\u0432\u043d\u0430\u044f -label.host.MAC=MAC \u0443\u0437\u043b\u0430 -label.host.name=\u0418\u043c\u044f \u0443\u0437\u043b\u0430 -label.hosts=\u0423\u0437\u043b\u044b -label.host.tags=\u041c\u0435\u0442\u043a\u0438 \u0443\u0437\u043b\u0430 -label.host=\u0423\u0437\u0435\u043b -label.hourly=\u0415\u0436\u0435\u0447\u0430\u0441\u043d\u043e -label.hypervisor.capabilities=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 -label.hypervisors=\u0413\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u044b -label.hypervisor.type=\u0422\u0438\u043f \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 -label.hypervisor=\u0413\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 -label.hypervisor.version=\u0412\u0435\u0440\u0441\u0438\u044f \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 -label.id=ID -label.IKE.DH=IKE DH -label.IKE.encryption=\u0428\u0438\u0444\u0440\u043e\u0432\u0430\u043d\u0438\u0435 IKE -label.IKE.hash=IKE Hash -label.IKE.lifetime=IKE lifetime (second) -label.IKE.policy=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0430 IKE -label.info=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f -label.ingress.rule=\u0412\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.initiated.by=\u0418\u043d\u0438\u0446\u0438\u0438\u0440\u043e\u0432\u0430\u043d\u043e -label.installWizard.addClusterIntro.subtitle=\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 "\u041a\u043b\u0430\u0441\u0442\u0435\u0440"? -label.installWizard.addClusterIntro.title=\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 -label.installWizard.addHostIntro.subtitle=\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 "\u0423\u0437\u0435\u043b"? -label.installWizard.addHostIntro.title=\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0443\u0437\u0435\u043b -label.installWizard.addPodIntro.subtitle=\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 "\u0421\u0442\u0435\u043d\u0434"? -label.installWizard.addPodIntro.title=\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0441\u0442\u0435\u043d\u0434 -label.installWizard.addPrimaryStorageIntro.subtitle=\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 "\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435"? -label.installWizard.addPrimaryStorageIntro.title=\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.installWizard.addSecondaryStorageIntro.subtitle=\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 "\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435"? -label.installWizard.addSecondaryStorageIntro.title=\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0434\u043e\u043f\u043e\u043b\u044c\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. -label.installWizard.addZoneIntro.subtitle=\u0427\u0442\u043e \u0442\u0430\u043a\u043e\u0435 "\u0417\u043e\u043d\u0430"? -label.installWizard.addZoneIntro.title=\u0414\u0430\u0432\u0430\u0439\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u0437\u043e\u043d\u0443 -label.installWizard.addZone.title=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -label.installWizard.click.launch=\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0437\u0430\u043f\u0443\u0441\u043a\u0430 -label.installWizard.subtitle=\u042d\u0442\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442 \u0432\u0430\u0448 CloudStack. -label.installWizard.title=\u0417\u0434\u0440\u0430\u0432\u0441\u0442\u0432\u0443\u0439\u0442\u0435 \u0438 \u0434\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 CloudStack\! -label.instance.limits=\u041b\u0438\u043c\u0438\u0442 \u043c\u0430\u0448\u0438\u043d -label.instance.name=\u0418\u043c\u044f \u043c\u0430\u0448\u0438\u043d\u044b -label.instances=\u041c\u0430\u0448\u0438\u043d\u044b -label.instance=\u041c\u0430\u0448\u0438\u043d\u0430 -label.internal.dns.1=\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 1 -label.internal.dns.2=\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0439 DNS 2 -label.internal.name=\u0412\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0435 \u0438\u043c\u044f -label.interval.type=\u0422\u0438\u043f \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 -label.introduction.to.cloudstack=\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 CloudStack -label.invalid.integer=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0446\u0435\u043b\u043e\u0435 \u0447\u0438\u0441\u043b\u043e -label.invalid.number=\u041d\u0435\u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e\u0435 \u0447\u0438\u0441\u043b\u043e -label.invitations=\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f -label.invited.accounts=\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0451\u043d\u043d\u044b\u0435 \u0443\u0447\u0435\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.invite.to=\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c -label.invite=\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c -label.ip.address=IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430 -label.ipaddress=IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430 -label.ip.allocations=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u044b\u0435 IP -label.ip=IP -label.ip.limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0445 IP -label.ip.or.fqdn=IP \u0438\u043b\u0438 FQDN -label.ip.ranges=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.ip.range=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.IPsec.preshared.key=IPsec Preshared-Key -label.ips=IP -label.iscsi=iSCSI -label.is.default=\u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e -label.iso.boot=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 ISO -label.iso=ISO -label.isolated.networks=\u0418\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 -label.isolation.method=\u041c\u0435\u0442\u043e\u0434 \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 -label.isolation.mode=\u0420\u0435\u0436\u0438\u043c \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 -label.isolation.uri=\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f URI -label.is.redundant.router=\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0439 -label.is.shared=\u041e\u0431\u0449\u0438\u0439 -label.is.system=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 -label.item.listing=\u0421\u043f\u0438\u0441\u043e\u043a \u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u0432 -label.keep=\u0425\u0440\u0430\u043d\u0438\u0442\u044c -label.keyboard.type=\u0422\u0438\u043f \u043a\u043b\u0430\u0432\u0438\u0430\u0442\u0443\u0440\u044b -label.key=\u041a\u043b\u044e\u0447 -label.kvm.traffic.label=\u041c\u0435\u0442\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 KVM -label.label=\u041c\u0435\u0442\u043a\u0430 -label.lang.chinese=\u041a\u0438\u0442\u0430\u0439\u0441\u043a\u0438\u0439 (\u0443\u043f\u0440\u043e\u0449\u0451\u043d\u043d\u044b\u0439) -label.lang.english=\u0410\u043d\u0433\u043b\u0438\u0439\u0441\u043a\u0438\u0439 -label.lang.japanese=\u042f\u043f\u043e\u043d\u0441\u043a\u0438\u0439 -label.lang.korean=\u043a\u043e\u0440\u0435\u0439\u0441\u043a\u0438\u0439 -label.lang.russian=\u0420\u0443\u0441\u0441\u043a\u0438\u0439 -label.lang.spanish=\u0418\u0441\u043f\u0430\u043d\u0441\u043a\u0438\u0439 -label.last.disconnected=\u0412\u0440\u0435\u043c\u044f \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e \u043e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f -label.lastname.lower=\u0424\u0430\u043c\u0438\u043b\u0438\u044f -label.last.name=\u0424\u0430\u043c\u0438\u043b\u0438\u044f -label.latest.events=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0438 \u0441\u043e\u0431\u044b\u0442\u0438\u044f -label.launch=\u0417\u0430\u043f\u0443\u0441\u043a -label.launch.vm=\u0417\u0430\u043f\u0443\u0441\u043a \u0412\u041c -label.launch.zone=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -label.lb.algorithm.leastconn=Least connections -label.lb.algorithm.roundrobin=Round-robin -label.lb.algorithm.source=\u0418\u0441\u0442\u043e\u0447\u043d\u0438\u043a -label.LB.isolation=\u0418\u0437\u043e\u043b\u044f\u0446\u0438\u044f LB -label.ldap.link.type=\u0422\u0438\u043f -label.level=\u0423\u0440\u043e\u0432\u0435\u043d\u044c -label.linklocal.ip=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 IP \u0430\u0434\u0440\u0435\u0441 -label.load.balancer=\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.load.balancing.policies=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.load.balancing=\u0411\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.loading=\u0417\u0430\u0433\u0440\u0443\u0437\u043a\u0430 -label.local.storage.enabled=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0412\u041c -label.local.storage=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.local=\u041b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 -label.login=\u0412\u043e\u0439\u0442\u0438 -label.logout=\u0412\u044b\u0439\u0442\u0438 -label.lun=LUN -label.LUN.number=LUN \# -label.make.project.owner=\u0421\u0434\u0435\u043b\u0430\u0442\u044c \u0430\u043a\u043a\u0430\u0443\u043d\u0442 \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0435\u043c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -label.managed=\u0423\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c\u044b\u0439 -label.management.ips=\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f IP \u0430\u0434\u0440\u0435\u0441\u0441\u0430\u043c\u0438 -label.management.server=\u0421\u0435\u0440\u0432\u0435\u0440 \u0443\u043f\u0440\u0430\u043b\u0435\u043d\u0438\u044f -label.management=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 -label.manage.resources=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 -label.manage=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 -label.max.cpus=\u041c\u0430\u043a\u0441. \u044f\u0434\u0435\u0440 \u0426\u041f -label.max.guest.limit=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0433\u043e\u0441\u0442\u0435\u0439 -label.maximum=\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c -label.max.memory=\u041c\u0430\u043a\u0441. \u043f\u0430\u043c\u044f\u0442\u0438 (\u0432 \u041c\u0438\u0411) -label.max.networks=\u041c\u0430\u043a\u0441\u0438\u043c\u0443\u043c \u0441\u0435\u0442\u0435\u0439 -label.max.primary.storage=\u041c\u0430\u043a\u0441. \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (\u0432 \u0413\u0438\u0411) -label.max.public.ips=\u041c\u0430\u043a\u0441. \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 IP -label.max.secondary.storage=\u041c\u0430\u043a\u0441. \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (\u0432 \u0413\u0438\u0411) -label.max.snapshots=\u041c\u0430\u043a\u0441. \u0441\u043d\u0438\u043c\u043a\u043e\u0432 -label.max.templates=\u041c\u0430\u043a\u0441. \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 -label.max.vms=\u041c\u0430\u043a\u0441. \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0445 \u0412\u041c -label.max.volumes=\u041c\u0430\u043a\u0441. \u0434\u0438\u0441\u043a\u043e\u0432 -label.max.vpcs=\u041c\u0430\u043a\u0441. VPC -label.may.continue=\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c. -label.md5.checksum=\u041f\u0440\u043e\u0432\u0435\u0440\u0438\u0442\u044c MD5 \u0441\u0443\u043c\u043c\u0443 -label.memory.allocated=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438 -label.memory.limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u043f\u0430\u043c\u044f\u0442\u0438 (\u0432 \u041c\u0438\u0411) -label.memory.mb=\u041f\u0430\u043c\u044f\u0442\u044c (\u0432 \u041c\u0411) -label.memory.total=\u0412\u0441\u0435\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 -label.memory=\u041f\u0430\u043c\u044f\u0442\u044c -label.memory.used=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u043f\u0430\u043c\u044f\u0442\u0438 -label.menu.accounts=\u0423\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.menu.alerts=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u044f -label.menu.all.accounts=\u0412\u0441\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.menu.all.instances=\u0412\u0441\u0435 \u043c\u0430\u0448\u0438\u043d\u044b -label.menu.community.isos=ISO-\u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 -label.menu.community.templates=\u0428\u0430\u0431\u043b\u043e\u043d\u044b \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u0430 -label.menu.configuration=\u041a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044f -label.menu.dashboard=\u041f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f -label.menu.destroyed.instances=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b -label.menu.disk.offerings=\u0423\u0441\u043b\u0443\u0433\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.menu.domains=\u0414\u043e\u043c\u0435\u043d\u044b -label.menu.events=\u0421\u043e\u0431\u044b\u0442\u0438\u044f -label.menu.featured.isos=\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 ISO -label.menu.featured.templates=\u0420\u0435\u043a\u043e\u043c\u0435\u043d\u0434\u0443\u0435\u043c\u044b\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b -label.menu.global.settings=\u041e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -label.menu.infrastructure=\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 -label.menu.instances=\u041c\u0430\u0448\u0438\u043d\u044b -label.menu.ipaddresses=IP-\u0430\u0434\u0440\u0435\u0441\u0430 -label.menu.isos=ISO -label.menu.my.accounts=\u041c\u043e\u0438 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.menu.my.instances=\u041c\u043e\u0438 \u043c\u0430\u0448\u0438\u043d\u044b -label.menu.my.isos=\u041c\u043e\u0438 ISO -label.menu.my.templates=\u041c\u043e\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b -label.menu.network.offerings=\u0423\u0441\u043b\u0443\u0433\u0438 \u0441\u0435\u0442\u0438 -label.menu.network=\u0421\u0435\u0442\u044c -label.menu.physical.resources=\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b -label.menu.regions=\u0420\u0435\u0433\u0438\u043e\u043d -label.menu.running.instances=\u0420\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u043c\u0430\u0448\u0438\u043d\u044b -label.menu.security.groups=\u0413\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.menu.service.offerings=\u0423\u0441\u043b\u0443\u0433\u0438 \u0441\u043b\u0443\u0436\u0431 -label.menu.snapshots=\u0421\u043d\u0438\u043c\u043a\u0438 -label.menu.sshkeypair=SSH KeyPair -label.menu.stopped.instances=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b -label.menu.storage=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.menu.system.service.offerings=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b -label.menu.system=\u0421\u0438\u0441\u0442\u0435\u043c\u0430 -label.menu.system.vms=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0412\u041c -label.menu.templates=\u0428\u0430\u0431\u043b\u043e\u043d\u044b -label.menu.virtual.appliances=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 -label.menu.virtual.resources=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b -label.menu.volumes=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f -label.menu.vpc.offerings=\u0423\u0441\u043b\u0443\u0433\u0438 VPS -label.metrics.allocated=\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e -label.metrics.clusters=\u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b -label.metrics.cpu.used.avg=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e -label.metrics.disk.allocated=\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e -label.metrics.disk.size=\u0420\u0430\u0437\u043c\u0435\u0440 -label.metrics.disk.storagetype=\u0422\u0438\u043f -label.metrics.disk.used=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e -label.metrics.hosts=\u0423\u0437\u043b\u044b -label.metrics.memory.used.avg=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e -label.metrics.name=\u0418\u043c\u044f -label.metrics.scope=\u041e\u0445\u0432\u0430\u0442 -label.metrics.state=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 -label.metrics.storagepool=\u041f\u0443\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.migrate.instance.to.host=\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0437\u0435\u043b -label.migrate.instance.to.ps=\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.migrate.instance.to=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 \u0432 -label.migrate.router.to=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0440\u043e\u0443\u0442\u0435\u0440 \u0432 -label.migrate.systemvm.to=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c \u0432 -label.migrate.to.host=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u0443\u0437\u0435\u043b -label.migrate.to.storage=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043d\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.migrate.volume.to.primary.storage=\u041f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0434\u0438\u0441\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.migrate.volume=\u041f\u0435\u0440\u0435\u043d\u043e\u0441 \u0434\u0438\u0441\u043a\u0430 -label.minimum=\u041c\u0438\u043d\u0438\u043c\u0443\u043c -label.minute.past.hour=\u041c\u0438\u043d\u0443\u0442 -label.mode=\u0420\u0435\u0436\u0438\u043c -label.monday=\u041f\u043e\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u0438\u043a -label.monthly=\u041a\u0430\u0436\u0434\u044b\u0439 \u043c\u0435\u0441\u044f\u0446 -label.more.templates=\u0415\u0449\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u044b -label.move.down.row=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u043d\u0438\u0436\u0435 -label.move.to.bottom=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u0432\u043d\u0438\u0437 -label.move.to.top=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u0441\u0430\u043c\u044b\u0439 \u0432\u0435\u0440\u0445 -label.move.up.row=\u041f\u0435\u0440\u0435\u043c\u0435\u0441\u0442\u0438\u0442\u044c \u043d\u0430 \u043e\u0434\u043d\u0443 \u0441\u0442\u0440\u043e\u043a\u0443 \u0432\u044b\u0448\u0435 -label.my.account=\u041c\u043e\u044f \u0443\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c -label.my.network=\u041c\u043e\u044f \u0441\u0435\u0442\u044c -label.my.templates=\u041c\u043e\u0438 \u0448\u0430\u0431\u043b\u043e\u043d\u044b -label.name.lower=\u0418\u043c\u044f -label.name.optional=\u0418\u043c\u044f (\u043f\u043e \u0436\u0435\u043b\u0430\u043d\u0438\u044e) -label.name=\u0418\u043c\u044f -label.nat.port.range=\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0440\u0442\u043e\u0432 NAT -label.netmask=\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 -label.netScaler=NetScaler -label.network.ACLs=\u0421\u0435\u0442\u0435\u0432\u044b\u0435 ACL -label.network.ACL.total=\u0412\u0441\u0435\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u044b\u0445 ACL -label.network.ACL=\u0421\u0435\u0442\u0435\u0432\u044b\u0435 ACL -label.network.addVM=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0441\u0435\u0442\u044c \u0432 \u0412\u041c -label.network.desc=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0438 -label.network.device.type=\u0422\u0438\u043f \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 -label.network.device=\u0421\u0435\u0442\u0435\u0432\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e -label.network.domain.text=\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d -label.network.domain=\u0421\u0435\u0442\u0435\u0432\u043e\u0439 \u0434\u043e\u043c\u0435\u043d -label.network.id=ID \u0441\u0435\u0442\u0438 -label.networking.and.security=\u0421\u0435\u0442\u044c \u0438 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u044c -label.network.label.display.for.blank.value=\u0418\u0441\u043f. \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0439 \u0448\u043b\u044e\u0437 -label.network.limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0441\u0435\u0442\u0438 -label.network.name=\u0418\u043c\u044f \u0441\u0435\u0442\u0438 -label.network.offering.display.text=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u044b\u0439 \u0442\u0435\u043a\u0441\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438 -label.network.offering.id=ID \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438 -label.network.offering.name=\u041d\u0430\u0437\u0432\u0430\u043d\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438 -label.network.offering=\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0443\u0441\u043b\u0443\u0433\u0438 -label.network.rate.megabytes=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0438 (MB/s) -label.network.rate=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0438 -label.network.read=\u041f\u0440\u043e\u0447\u0438\u0442\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c -label.network.service.providers=\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0441\u043b\u0443\u0436\u0431 -label.networks=\u0421\u0435\u0442\u0438 -label.network.type=\u0422\u0438\u043f \u0441\u0435\u0442\u0438 -label.network=\u0421\u0435\u0442\u044c -label.network.write=\u0417\u0430\u043f\u0438\u0441\u0430\u043d\u043e \u0447\u0435\u0440\u0435\u0437 \u0441\u0435\u0442\u044c -label.new.password=\u041d\u043e\u0432\u044b\u0439 \u043f\u0430\u0440\u043e\u043b\u044c -label.new.project=\u041d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 -label.new=\u0421\u043e\u0437\u0434\u0430\u0442\u044c -label.new.vm=\u041d\u043e\u0432\u0430\u044f \u0412\u041c -label.next=\u0421\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439 -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=\u0421\u0435\u0440\u0432\u0435\u0440 NFS -label.nfs.storage=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 NFS -label.nic.adapter.type=\u0422\u0438\u043f \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b (NIC) -label.nicira.controller.address=\u0410\u0434\u0440\u0435\u0441 \u043a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440\u0430 -label.nicira.l3gatewayserviceuuid=L3 Gateway Service Uuid -label.nicira.transportzoneuuid=Transport Zone Uuid -label.nics=\u0421\u0435\u0442\u0435\u0432\u044b\u0435 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u044b -label.no.actions=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0439 -label.no.alerts=\u0422\u0440\u0435\u0432\u043e\u0433 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e -label.no.data=\u041d\u0435\u0442 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438 \u0434\u043b\u044f \u043f\u043e\u043a\u0430\u0437\u0430 -label.no.errors=\u041e\u0448\u0438\u0431\u043e\u043a \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043e -label.no.isos=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 ISO -label.no.items=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u043f\u0443\u043d\u043a\u0442\u043e\u0432 -label.none=\u041d\u0435\u0442 -label.no.security.groups=\u041d\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0433\u0440\u0443\u043f\u043f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.not.found=\u041d\u0435 \u043d\u0430\u0439\u0434\u0435\u043d\u043e -label.no.thanks=\u041d\u0435\u0442, \u0441\u043f\u0430\u0441\u0438\u0431\u043e -label.notifications=\u041e\u043f\u043e\u0432\u0435\u0449\u0435\u043d\u0438\u044f -label.no=\u041d\u0435\u0442 -label.number.of.clusters=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432 -label.number.of.hosts=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0443\u0437\u043b\u043e\u0432 -label.number.of.pods=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432 -label.number.of.system.vms=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0412\u041c -label.number.of.virtual.routers=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 -label.number.of.zones=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0437\u043e\u043d -label.num.cpu.cores=\u041a\u043e\u043b-\u0432\u043e \u044f\u0434\u0435\u0440 CPU -label.numretries=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u043f\u043e\u043f\u044b\u0442\u043e\u043a -label.ocfs2=OCFS2 -label.offer.ha=\u0423\u0441\u043b\u0443\u0433\u0430 \u043f\u043e\u0432\u044b\u0448\u0435\u043d\u043d\u043e\u0439 \u043e\u0442\u043a\u0430\u0437\u043e\u0443\u0441\u0442\u043e\u0439\u0447\u0438\u0432\u043e\u0441\u0442\u0438 -label.ok=OK -label.optional=\u041d\u0435\u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e -label.order=\u041e\u0447\u0435\u0440\u0435\u0434\u044c -label.os.preference=\u041f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u041e\u0421 -label.os.type=\u0422\u0438\u043f \u041e\u0421 -label.outofbandmanagement.action=\u0414\u0435\u0439\u0441\u0442\u0432\u0438\u044f -label.outofbandmanagement.password=\u041f\u0430\u0440\u043e\u043b\u044c -label.outofbandmanagement.username=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.owned.public.ips=\u041f\u0440\u0438\u0441\u0432\u043e\u0435\u043d\u043d\u044b\u0435 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0435 IP \u0430\u0434\u0440\u0435\u0441\u0430 -label.owner.account=\u0423\u0447\u0451\u0442\u043d\u0430\u044f \u0437\u0430\u043f\u0438\u0441\u044c \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 -label.owner.domain=\u0414\u043e\u043c\u0435\u043d \u0432\u043b\u0430\u0434\u0435\u043b\u044c\u0446\u0430 -label.parent.domain=\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0434\u043e\u043c\u0435\u043d -label.password.enabled=\u041f\u0430\u0440\u043e\u043b\u044c \u0432\u043a\u043b\u044e\u0447\u0435\u043d -label.password.lower=\u041f\u0430\u0440\u043e\u043b\u044c -label.password.reset.confirm=\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d \u0432 -label.password=\u041f\u0430\u0440\u043e\u043b\u044c -label.PA=static NAT -label.path=\u041f\u0443\u0442\u044c -label.perfect.forward.secrecy=Perfect Forward Secrecy -label.physical.network.ID=ID \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438 -label.physical.network=\u0424\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0442\u0438 -label.PING.CIFS.password=\u041f\u0430\u0440\u043e\u043b\u044c PING CIFS -label.PING.CIFS.username=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f PING CIFS -label.PING.dir=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 PING -label.PING.storage.IP=IP \u0430\u0434\u0440\u0435\u0441 PING-\u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.please.specify.netscaler.info=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 NetScaler -label.please.wait=\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435 -label.plugin.details=\u0414\u0435\u0442\u0430\u043b\u0438 \u043f\u043b\u0430\u0433\u0438\u043d\u0430 -label.plugins=\u041f\u043b\u0430\u0433\u0438\u043d\u044b -label.pod.name=\u0418\u043c\u044f \u0441\u0442\u0435\u043d\u0434\u0430 -label.pods=\u0421\u0442\u0435\u043d\u0434\u044b -label.pod=\u0421\u0442\u0435\u043d\u0434 -label.port.forwarding.policies=\u041f\u043e\u043b\u0438\u0442\u0438\u043a\u0438 \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043f\u043e\u0440\u0442\u043e\u0432 -label.port.forwarding=\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u043e\u0432 -label.port.range=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043f\u043e\u0440\u0442\u043e\u0432 -label.PreSetup=\u041f\u0440\u0435\u0434\u0432\u0430\u0440\u0438\u0442\u0435\u043b\u044c\u043d\u0430\u044f \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 -label.previous=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0449\u0438\u0439 -label.prev=\u041f\u0440\u0435\u0434\u044b\u0434\u0443\u0448\u0438\u0439 -label.primary.allocated=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.primary.network=\u041e\u0441\u043d\u043e\u0432\u043d\u0430\u044f \u0441\u0435\u0442\u044c -label.primary.storage.count=\u041f\u0443\u043b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.primary.storage.limits=\u041b\u0438\u043c\u0438\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (GiB) -label.primary.storage=\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.primary.used=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.private.Gateway=\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u0448\u043b\u044e\u0437 -label.private.interface=\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 -label.private.ip.range=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0447\u0430\u0441\u0442\u043d\u044b\u0445 IP \u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.private.ips=\u0427\u0430\u0441\u0442\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 -label.private.ip=\u0427\u0430\u0441\u0442\u043d\u044b\u0439 IP \u0430\u0434\u0440\u0435\u0441 -label.privatekey=\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 PKCS\#8 -label.private.network=\u0427\u0430\u0441\u0442\u043d\u0430\u044f \u0441\u0435\u0442\u044c -label.private.port=\u0427\u0430\u0441\u0442\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 -label.private.zone=\u0427\u0430\u0441\u0442\u043d\u0430\u044f \u0437\u043e\u043d\u0430 -label.profile=\u041f\u0440\u043e\u0444\u0438\u043b\u044c -label.project.dashboard=\u041f\u0430\u043d\u0435\u043b\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -label.project.id=ID \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -label.project.invite=\u041f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u044c \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 -label.project.name=\u0418\u043c\u044f \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -label.projects=\u041f\u0440\u043e\u0435\u043a\u0442\u044b -label.project=\u041f\u0440\u043e\u0435\u043a\u0442 -label.project.view=\u041f\u0440\u043e\u0435\u043a\u0442\u044b -label.protocol=\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b -label.providers=\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438 -label.provider=\u041f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0438 -label.public.interface=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 -label.public.ips=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 -label.public.ip=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441 -label.public.network=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0441\u0435\u0442\u044c -label.public.port=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 -label.public.traffic=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a -label.public=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 -label.public.zone=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u0430\u044f \u0437\u043e\u043d\u0430 -label.purpose=\u041d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 -label.Pxe.server.type=\u0422\u0438\u043f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 PXE -label.qos.type=\u0422\u0438\u043f QoS -label.quickview=\u0411\u044b\u0441\u0442\u0440\u044b\u0439 \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 -label.quota.date=\u0414\u0430\u0442\u0430 -label.quota.fullsummary=\u0412\u0441\u0435 \u0443\u0447\u0451\u0442\u043d\u044b\u0435 \u0437\u0430\u043f\u0438\u0441\u0438 -label.quota.state=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 -label.reboot=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c -label.recent.errors=\u041f\u043e\u0441\u043b\u0435\u0434\u043d\u0438\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 -label.recover.vm=\u0412\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0412\u041c -label.redundant.router.capability=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0433\u043e \u0440\u043e\u0443\u0442\u0435\u0440\u0430 -label.redundant.router=\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0439 \u0440\u043e\u0443\u0442\u0435\u0440 -label.redundant.state=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0437\u0435\u0440\u0432\u0430 -label.refresh=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c -label.region=\u0420\u0435\u0433\u0438\u043e\u043d -label.reinstall.vm=\u041f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0412\u041c -label.related=\u0421\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0439 -label.remind.later=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0438\u0442\u044c \u043f\u043e\u0437\u0436\u0435 -label.remove.ACL=\u0423\u0434\u0430\u043b\u0438\u0442\u044c ACL -label.remove.egress.rule=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.remove.from.load.balancer=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.remove.ingress.rule=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.remove.ip.range=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP -label.remove.network.offering=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u0443\u0441\u043b\u0443\u0433\u0443 -label.remove.pf=\u0414\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e \u043f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0440\u0442\u0430 -label.remove.project.account=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -label.remove.region=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d -label.remove.rule=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.remove.static.nat.rule=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e static NAT -label.remove.static.route=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 \u043c\u0430\u0440\u0448\u0440\u0443\u0442 -label.remove.tier=\u0423\u0434\u0430\u043b\u0438\u0442\u044c tier -label.remove.vm.from.lb=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0412\u041c \u0441 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.remove.vm.load.balancer=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0412\u041c \u0441 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a\u0430 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -label.remove.vpc.offering=\u0423\u0434\u0430\u043b\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0443 VPC -label.remove.vpc=\u0423\u0434\u0430\u043b\u0438\u0442\u044c VPC -label.removing=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 -label.removing.user=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f -label.reserved.ip.range=\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 IP \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d -label.reserved.system.gateway=\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0448\u043b\u044e\u0437 -label.reserved.system.ip=\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP -label.reserved.system.netmask=\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u0430\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u043c\u0430\u0441\u043a\u0430 -label.resetVM=\u0421\u0431\u0440\u043e\u0441 \u0412\u041c -label.reset.VPN.connection=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c VPN \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 -label.resize.new.offering.id=\u041d\u043e\u0432\u0430\u044f \u0443\u0441\u043b\u0443\u0433\u0430 -label.resize.new.size=\u041d\u043e\u0432\u044b\u0439 \u0440\u0430\u0437\u043c\u0435\u0440 (GB) -label.resize.shrink.ok=Shrink OK -label.resource.limit.exceeded=\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d \u043b\u0438\u043c\u0438\u0442 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -label.resource.limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -label.resource.state=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 -label.resources=\u0420\u0435\u0441\u0443\u0440\u0441\u044b -label.resource=\u0420\u0435\u0441\u0443\u0440\u0441 -label.restart.network=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0442\u044c -label.restart.required=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a -label.restart.vpc=\u041f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c VPC -label.restore=\u0412\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c -label.review=\u041e\u0431\u0437\u043e\u0440 -label.revoke.project.invite=\u041e\u0442\u043e\u0437\u0432\u0430\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 -label.role=\u0420\u043e\u043b\u044c -label.root.disk.controller=\u041a\u043e\u043d\u0442\u0440\u043e\u043b\u043b\u0435\u0440 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 -label.root.disk.offering=\u0423\u0441\u043b\u0443\u0433\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 -label.routing=\u041c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0446\u0438\u044f -label.rule.number=\u041d\u043e\u043c\u0435\u0440 \u043f\u0440\u0430\u0432\u0438\u043b\u0430 -label.rules=\u041f\u0440\u0430\u0432\u0438\u043b\u0430 -label.running.vms=\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u044b\u0435 \u0412\u041c -label.s3.access_key=\u041a\u043b\u044e\u0447 \u0434\u043e\u0441\u0442\u0443\u043f\u0430 -label.s3.bucket=Bucket -label.s3.connection_timeout=\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u044f -label.s3.endpoint=\u041a\u043e\u043d\u0435\u0447\u043d\u0430\u044f \u0442\u043e\u0447\u043a\u0430 -label.s3.nfs.path=S3 NFS \u043f\u0443\u0442\u044c -label.s3.nfs.server=S3 NFS \u0421\u0435\u0440\u0432\u0435\u0440 -label.s3.secret_key=\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 -label.s3.socket_timeout=\u041f\u0440\u0435\u0432\u044b\u0448\u0435\u043d\u0438\u0435 \u0432\u0440\u0435\u043c\u0435\u043d\u0438 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u043a\u0435\u0442\u0430 -label.s3.use_https=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 HTTPS -label.saturday=\u0421\u0443\u0431\u0431\u043e\u0442\u0430 -label.save.and.continue=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c \u0438 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c -label.save=\u0421\u043e\u0445\u0440\u0430\u043d\u0438\u0442\u044c -label.saving.processing=\u0421\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u0438\u0435... -label.scope=\u041e\u0445\u0432\u0430\u0442 -label.search=\u041f\u043e\u0438\u0441\u043a -label.secondary.ips=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 -label.secondary.storage.count=\u041f\u0443\u043b \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.secondary.storage.limits=\u041b\u0438\u043c\u0438\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 (GiB) -label.secondary.storage=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.secondary.storage.vm=\u0412\u041c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.secondary.used=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.secret.key=\u0421\u0435\u043a\u0440\u0435\u0442\u043d\u044b\u0439 \u043a\u043b\u044e\u0447 -label.security.group.name=\u0418\u043c\u044f \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.security.groups.enabled=\u0413\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u044b -label.security.groups=\u0413\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.security.group=\u0413\u0440\u0443\u043f\u043f\u0430 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -label.select.a.template=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d -label.select.a.zone=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043e\u043d\u0443 -label.select.instance.to.attach.volume.to=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043c\u0430\u0448\u0438\u043d\u0443 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0438\u0441\u043a\u0430 -label.select.instance=\u0412\u044b\u0431\u0438\u0440\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 -label.select.iso.or.template=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 ISO \u0438\u043b\u0438 \u0448\u0430\u0431\u043b\u043e\u043d -label.select.offering=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043b\u043e\u0436\u0435\u043d\u0438\u0435 -label.select.project=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u043e\u0435\u043a\u0442 -label.select.region=\u0412\u044b\u0431\u0440\u0430\u0442\u044c \u0440\u0435\u0433\u0438\u043e\u043d -label.select.template=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d -label.select.tier=\u0412\u044b\u0431\u0440\u0430\u0442\u044c Tier -label.select=\u0412\u044b\u0431\u0440\u0430\u0442\u044c -label.select-view=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0432\u0438\u0434 -label.select.vm.for.static.nat=\u0412\u044b\u0431\u043e\u0440 VM \u0434\u043b\u044f NAT -label.sent=\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e -label.server=\u0421\u0435\u0440\u0432\u0435\u0440 -label.service.capabilities=\u0412\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0441\u043b\u0443\u0436\u0431\u044b -label.service.offering=\u0421\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 -label.service.state=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 \u0441\u043b\u0443\u0436\u0431 -label.session.expired=\u0421\u0435\u0430\u043d\u0441 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d -label.set.default.NIC=\u0423\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c NIC \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e -label.settings=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -label.setup=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 -label.set.up.zone.type=\u041d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0442\u0438\u043f \u0437\u043e\u043d\u044b -label.SharedMountPoint=\u041e\u0442\u043a\u0440\u044b\u0442\u0430\u044f\u0422\u043e\u0447\u043a\u0430\u0414\u043e\u0441\u0442\u0443\u043f\u0430 -label.shared=\u041e\u0431\u0449\u0438\u0439 -label.show.advanced.settings=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 -label.show.ingress.rule=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u0432\u0445\u043e\u0434\u044f\u0449\u0435\u0435 \u043f\u0440\u0430\u0432\u0438\u043b\u043e -label.shutdown.provider=\u041e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 -label.site.to.site.VPN=Site-to-site VPN -label.size=\u0420\u0430\u0437\u043c\u0435\u0440 -label.skip.guide=\u042f \u0443\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043b CloudStack, \u043f\u0440\u043e\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u043e -label.snapshot.limits=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0441\u043d\u0438\u043c\u043a\u043e\u0432 -label.snapshot.name=\u0418\u043c\u044f \u0441\u043d\u0438\u043c\u043a\u0430 -label.snapshot.s=\u0421\u043d\u0438\u043c\u043a\u0438 -label.snapshots=\u0421\u043d\u0438\u043c\u043a\u0438 -label.snapshot=\u0421\u043d\u0438\u043c\u043e\u043a -label.source.nat=Source NAT -label.specify.IP.ranges=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.specify.vlan=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 VLAN -label.specify.vxlan=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 VXLAN -label.SR.name=SR Name-Label -label.srx=SRX -label.start.IP=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 IP -label.start.port=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u043f\u043e\u0440\u0442 -label.start.reserved.system.IP=\u041d\u0430\u0447\u0430\u043b\u044c\u043d\u044b\u0439 \u0437\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0439 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441 -label.state=\u0421\u043e\u0441\u0442\u043e\u044f\u043d\u0438\u0435 -label.static.nat.enabled=\u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 NAT \u0432\u043a\u043b\u044e\u0447\u0435\u043d -label.static.nat.to=\u0421\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 NAT \u043a -label.static.nat=\u0421\u0442\u0430\u0442\u0438\u0447\u043d\u044b\u0439 NAT -label.static.nat.vm.details=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 NAT \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d -label.statistics=\u0421\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0430 -label.status=\u0421\u0442\u0430\u0442\u0443\u0441 -label.step.1.title=\u0428\u0430\u0433 1\: \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d -label.step.1=\u0428\u0430\u0433 1 -label.step.2.title=\u0428\u0430\u0433 2\: \u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441 -label.step.2=\u0428\u0430\u0433 2 -label.step.3.title=Step 3\: \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -label.step.3=\u0428\u0430\u0433 3 -label.step.4.title=Step 4\: \u0421\u0435\u0442\u044c -label.step.4=\u0428\u0430\u0433 4 -label.step.5.title=Step 5\: \u041e\u0431\u0437\u043e\u0440 -label.step.5=\u0428\u0430\u0433 5 -label.stickiness=\u041b\u0438\u043f\u043a\u0438\u0439 -label.sticky.cookie-name=Cookie name -label.sticky.domain=\u0414\u043e\u043c\u0435\u043d -label.sticky.expire=\u0418\u0441\u0442\u0435\u043a\u0430\u0435\u0442 -label.sticky.holdtime=\u0432\u0440\u0435\u043c\u044f \u0443\u0434\u0435\u0440\u0436\u0430\u043d\u0438\u044f -label.sticky.indirect=\u041a\u043e\u0441\u0432\u0435\u043d\u043d\u044b\u0439 -label.sticky.length=\u0414\u043b\u0438\u043d\u0430 -label.sticky.mode=\u0420\u0435\u0436\u0438\u043c -label.sticky.nocache=\u041d\u0435\u0442 \u043a\u044d\u0448\u0430 -label.sticky.postonly=\u0422\u043e\u043b\u044c\u043a\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 -label.sticky.prefix=\u041f\u0440\u0435\u0444\u0438\u043a\u0441 -label.sticky.request-learn=\u0422\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u0438\u0437\u0443\u0447\u0435\u043d\u0438\u0435. -label.sticky.tablesize=\u0420\u0430\u0437\u043c\u0435\u0440 \u0442\u0430\u0431\u043b\u0438\u0446\u044b -label.stopped.vms=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0412\u041c -label.stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c -label.storage.pool=\u041f\u0443\u043b \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.storage.tags=\u041c\u0435\u0442\u043a\u0438 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.storage.traffic=\u0422\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.storage.type=\u0422\u0438\u043f \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -label.storage=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -label.subdomain.access=\u0414\u043e\u0441\u0442\u0443\u043f \u043a \u043f\u043e\u0434\u0434\u043e\u043c\u0435\u043d\u0443 -label.submitted.by=[\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u043d\u043e\: ] -label.submit=\u041e\u043f\u0443\u0431\u043b\u0438\u043a\u043e\u0432\u0430\u0442\u044c -label.succeeded=\u0423\u0441\u043f\u0435\u0448\u043d\u043e -label.sunday=\u0412\u043e\u0441\u043a\u0440\u0435\u0441\u0435\u043d\u044c\u0435 -label.super.cidr.for.guest.networks=Super CIDR \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 -label.supported.services=\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0441\u043b\u0443\u0436\u0431\u044b -label.supported.source.NAT.type=\u041f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u043c\u044b\u0435 \u0442\u0438\u043f\u044b NAT-\u0438\u0441\u0442\u043e\u0447\u043d\u0438\u043a\u0430 -label.suspend.project=\u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442 -label.switch.type=\u0422\u0438\u043f \u0441\u0432\u0438\u0447\u0430 -label.system.capacity=\u041c\u043e\u0449\u043d\u043e\u0441\u0442\u044c \u0441\u0438\u0441\u0442\u0435\u043c\u044b -label.system.offering=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b -label.system.service.offering=\u0423\u0441\u043b\u0443\u0433\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0441\u043b\u0443\u0436\u0431 -label.system.vm.details=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0441\u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0439 \u0412\u041c -label.system.vms=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0412\u041c -label.system.vm.type=\u0422\u0438\u043f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c -label.system.vm=\u0421\u0438\u0441\u0442\u0435\u043c\u043d\u0430\u044f \u0412\u041c -label.system.wide.capacity=\u041e\u0431\u0449\u0435\u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0442\u0435\u043d\u0446\u0438\u0430\u043b\u0430 -label.tagged=\u0421 \u043c\u0435\u0442\u043a\u043e\u0439 -label.tags=\u041c\u0435\u0442\u043a\u0438 -label.target.iqn=\u0426\u0435\u043b\u0435\u0432\u043e\u0439 IQN -label.task.completed=\u0417\u0430\u0434\u0430\u0447\u0430 \u0432\u044b\u043f\u043e\u043b\u043d\u0435\u043d\u0430 -label.template.limits=\u041f\u0440\u0435\u0434\u0435\u043b\u044b \u0448\u0430\u0431\u043b\u043e\u043d\u0430 -label.template=\u0428\u0430\u0431\u043b\u043e\u043d -label.TFTP.dir=\u041a\u0430\u0442\u0430\u043b\u043e\u0433 TFTP -label.theme.default=\u0421\u0442\u0430\u043d\u0434\u0430\u0440\u0442\u043d\u0430\u044f \u0442\u0435\u043c\u0430 -label.theme.grey=\u0421\u0435\u0440\u0430\u044f \u0442\u0435\u043c\u0430 -label.theme.lightblue=\u0413\u043e\u043b\u0443\u0431\u0430\u044f \u0442\u0435\u043c\u0430 -label.thursday=\u0427\u0435\u0442\u0432\u0435\u0440\u0433 -label.tier.details=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 Tier -label.timeout=\u0412\u0440\u0435\u043c\u044f \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u044f -label.time=\u0412\u0440\u0435\u043c\u044f -label.time.zone=\u0427\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441 -label.timezone=\u0427\u0430\u0441\u043e\u0432\u043e\u0439 \u043f\u043e\u044f\u0441 -label.token=\u0422\u043e\u043a\u0435\u043d -label.total.cpu=\u0412\u0441\u0435\u0433\u043e CPU -label.total.CPU=\u0412\u0441\u0435\u0433\u043e CPU -label.total.hosts=\u0412\u0441\u0435\u0433\u043e \u0443\u0437\u043b\u043e\u0432 -label.total.memory=\u0412\u0441\u0435\u0433\u043e \u043f\u0430\u043c\u044f\u0442\u0438 -label.total.of.ip=\u0412\u0441\u0435\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.total.of.vm=\u0412\u0441\u0435\u0433\u043e \u0412\u041c -label.total.storage=\u0412\u0441\u0435\u0433\u043e \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f -label.total.virtual.routers=\u041a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u0432 -label.total.vms=\u0412\u0441\u0435\u0433\u043e \u0412\u041c -label.traffic.label=\u0422\u0440\u0430\u0444\u0438\u043a -label.traffic.types=\u0422\u0438\u043f\u044b \u0442\u0440\u0430\u0444\u0438\u043a\u0430 -label.traffic.type=\u0422\u0438\u043f \u0442\u0440\u0430\u0444\u0438\u043a\u0430 -label.tuesday=\u0412\u0442\u043e\u0440\u043d\u0438\u043a -label.type.id=ID \u0442\u0438\u043f\u0430 -label.type.lower=\u0422\u0438\u043f -label.type=\u0422\u0438\u043f -label.unavailable=\u041d\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u043e -label.unlimited=\u0411\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e -label.untagged=\u0411\u0435\u0437 \u043c\u0435\u0442\u043a\u0438 -label.update.project.resources=\u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043f\u0440\u043e\u0435\u043a\u0442\u0430 -label.update.ssl.cert= \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b SSL -label.update.ssl= \u041e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u044b SSL -label.updating=\u041e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u0435 -label.upload=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c -label.upload.volume=\u0417\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u0434\u0438\u0441\u043a -label.url=URL -label.usage.interface=\u0418\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f -label.usage.server=\u0421\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 -label.used=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u043e -label.username.lower=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.username=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f -label.users=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 -label.user=\u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c -label.use.vm.ips=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0435 \u0412\u041c IPs -label.use.vm.ip=\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 IP \u0412\u041c\: -label.value=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u0435 -label.vcdcname=\u0418\u043c\u044f vCenter DC -label.vcenter.cluster=\u041a\u043b\u0430\u0441\u0442\u0435\u0440 vCenter -label.vcenter.datacenter=\u0426\u041e\u0414 vCenter -label.vcenter.datastore=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 vCenter -label.vcenter.host=\u0423\u0437\u0435\u043b vCenter -label.vcenter.password=\u041f\u0430\u0440\u043e\u043b\u044c vCenter -label.vcenter.username=\u0418\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f vCenter -label.vcipaddress=vCenter IP \u0410\u0434\u0440\u0435\u0441\u0441 -label.version=\u0412\u0435\u0440\u0441\u0438\u044f -label.vgpu.remaining.capacity=\u041e\u0441\u0442\u0430\u0448\u0438\u0435\u0441\u044f \u0435\u043c\u043a\u043e\u0441\u0442\u044c -label.view.all=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432\u0441\u0451 -label.view.console=\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c \u043a\u043e\u043d\u0441\u043e\u043b\u044c -label.viewing=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 -label.view.more=\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0431\u043e\u043b\u044c\u0448\u0435 -label.view.secondary.ips=\u041e\u0431\u0437\u043e\u0440 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.view=\u0412\u0438\u0434 -label.virtual.appliances=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 -label.virtual.appliance=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u043e -label.virtual.machines=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b -label.virtual.machine=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430 -label.virtual.networking=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430t \u0441\u0435\u0442\u0438 -label.virtual.network=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0442\u044c -label.virtual.routers=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0443\u0442\u0435\u0440 -label.virtual.router=\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0439 \u0440\u043e\u0443\u0442\u0435\u0440 -label.vlan.id=ID VLAN -label.vlan.only=VLAN -label.vlan.range=VLAN/VNI Range -label.vlan=VLAN -label.vlan.vni.range=VLAN/VNI Range -label.vm.add=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u044b -label.vm.destroy=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c -label.vm.display.name=\u041e\u0442\u043e\u0431\u0440\u0430\u0436\u0430\u0435\u043c\u043e\u0435 \u0438\u043c\u044f \u0412\u041c -label.VMFS.datastore=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 VMFS -label.vmfs=VMFS -label.vm.ip=\u0412\u041c IP-\u0430\u0434\u0440\u0435\u0441 -label.vm.name=\u0418\u043c\u044f VM -label.vm.reboot=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c -label.VMs.in.tier=Tier \u0412\u041c -label.vmsnapshot.current=\u0422\u0435\u043a\u0443\u0449\u0435\u0439 -label.vmsnapshot.memory=\u0421\u043d\u0438\u043c\u043e\u043a \u043f\u0430\u043c\u044f\u0442\u0438 -label.vmsnapshot.parentname=\u0420\u043e\u0434\u0438\u0442\u0435\u043b\u044c -label.vmsnapshot.type=\u0422\u0438\u043f -label.vmsnapshot=\u0421\u043d\u0438\u043c\u043e\u043a \u0412\u041c -label.vm.start=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c -label.vm.state=\u0421\u0442\u0430\u0442\u0443\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 -label.vm.stop=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c -label.vms=\u0412\u041c -label.vmware.traffic.label=\u041c\u0435\u0442\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 VMware -label.vnet.id=ID VLAN -label.vnet=VLAN -label.volgroup=\u0413\u0440\u0443\u043f\u043f\u0430 \u0434\u0438\u0441\u043a\u0430 -label.volume.details=\u0418\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044f \u043e \u0434\u0438\u0441\u043a\u0435 -label.volume.limits=\u041a\u043e\u043b\u0438\u0447\u0435\u0442\u0441\u0432\u043e \u0434\u0438\u0441\u043a\u043e\u0432 -label.volume.migrated=\u0414\u0438\u0441\u043a \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0451\u043d -label.volume.name=\u0418\u043c\u044f \u0442\u043e\u043c\u0430 -label.volumes=\u0417\u043d\u0430\u0447\u0435\u043d\u0438\u044f -label.volume=\u0422\u043e\u043c -label.vpc.id=VPC ID -label.VPC.limits=\u041e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f VPC -label.vpc.offering.details=\u0414\u0435\u0442\u0430\u043b\u0438 \u0443\u0441\u043b\u0443\u0433\u0438 VPC -label.vpc.offering=\u0423\u0441\u043b\u0443\u0433\u0430 VPC -label.VPC.router.details=\u0414\u0435\u0442\u0430\u043b\u0438 \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u0430 VPC -label.vpc=VPC -label.VPN.connection=VPN \u043f\u043e\u0434\u043b\u044e\u0447\u0435\u043d\u0438\u0435 -label.vpn.customer.gateway=VPN \u0448\u043b\u044e\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 -label.VPN.customer.gateway=VPN \u0448\u043b\u044e\u0437 \u043a\u043b\u0438\u0435\u043d\u0442\u0430 -label.VPN.gateway=VPN \u0448\u043b\u044e\u0437 -label.vpn=VPN -label.vsmctrlvlanid=Control VLAN ID -label.vsmpktvlanid=Packet VLAN ID -label.vsmstoragevlanid=Storage VLAN ID -label.vsphere.managed=vSphere Managed -label.vxlan.id=VXLAN ID -label.vxlan.range=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d Range -label.vxlan=VXLAN -label.waiting=\u041e\u0436\u0438\u0434\u0430\u043d\u0438\u0435 -label.warn=\u0412\u043d\u0438\u043c\u0430\u043d\u0438\u0435 -label.wednesday=\u0421\u0440\u0435\u0434\u0430 -label.weekly=\u0415\u0436\u0435\u043d\u0435\u0434\u0435\u043b\u044c\u043d\u043e -label.welcome.cloud.console=\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c \u0432 \u043f\u0430\u043d\u0435\u043b\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f -label.welcome=\u0414\u043e\u0431\u0440\u043e \u043f\u043e\u0436\u0430\u043b\u043e\u0432\u0430\u0442\u044c -label.what.is.cloudstack=\u0412\u0432\u0435\u0434\u0435\u043d\u0438\u0435 \u0432 CloudStack&\#8482? -label.xenserver.traffic.label=\u041c\u0435\u0442\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 XenServer -label.yes=\u0414\u0430 -label.zone.details=\u041f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0441\u0442\u0438 \u0437\u043e\u043d\u044b -label.zone.id=ID \u0437\u043e\u043d\u044b -label.zone.lower=\u0417\u043e\u043d\u0430 -label.zone.step.1.title=\u0428\u0430\u0433 1\: \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0442\u044c -label.zone.step.2.title=Step 2\: \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0437\u043e\u043d\u0443 -label.zone.step.3.title=Step 3\: \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u0442\u0435\u043d\u0434 -label.zone.step.4.title=Step 4\: \u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 -label.zones=\u0417\u043e\u043d\u044b -label.zone.type=\u0422\u0438\u043f \u0437\u043e\u043d\u044b -label.zone=\u0417\u043e\u043d\u0430 -label.zone.wide=\u0412\u0441\u0435\u0439 \u0437\u043e\u043d\u044b -label.zoneWizard.trafficType.guest=\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439\: \u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 -label.zoneWizard.trafficType.management=\u0423\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435\: \u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c CloudStack, \u0432 \u0442\u043e\u043c \u0447\u0438\u0441\u043b\u0435 \u043b\u044e\u0431\u044b\u0445 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0443\u0437\u043b\u044b \u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b. -label.zoneWizard.trafficType.public=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439\: \u0442\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u043e\u043c \u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u0432 \u043e\u0431\u043b\u0430\u043a\u0435 -label.zoneWizard.trafficType.storage=\u0425\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\: \u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u043c\u0438 \u0438 \u0432\u0442\u043e\u0440\u0438\u0447\u043d\u044b\u043c\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c\u0438 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u0448\u0430\u0431\u043b\u043e\u043d\u044b \u0438 \u0441\u043d\u0438\u043c\u043a\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. -managed.state=\u0420\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f -message.acquire.ip.nic=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0435\u043b\u0438 \u0431\u044b \u0437\u0430\u043f\u0440\u043e\u0441\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u0438\u0432\u0430\u0442\u043d\u044b\u0439 IP \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043a\u0430\u0440\u0442\u044b.
\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435\: \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0432\u0440\u0443\u0447\u043d\u0443\u044e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043d\u0435\u0434\u0430\u0432\u043d\u043e \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u043d\u044b\u0439 IP \u0432\u043d\u0443\u0442\u0440\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. -message.acquire.new.ip=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c "\u0431\u0435\u043b\u044b\u0439" IP \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438. -message.acquire.new.ip.vpc=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c "\u0431\u0435\u043b\u044b\u0439" IP \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e VPC. -message.acquire.public.ip=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0437\u043e\u043d\u0443, \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043e\u0431\u0440\u0435\u0441\u0442\u0438 \u043d\u043e\u0432\u044b\u0439 IP. -message.action.cancel.maintenance.mode=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. -message.action.cancel.maintenance=\u0423\u0437\u0435\u043b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0432\u044b\u0448\u0435\u043b \u0438\u0437 \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0434\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442. -message.action.change.service.warning.for.instance=\u041f\u0435\u0440\u0435\u0434 \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u0435\u043c \u043d\u0430\u0431\u043e\u0440\u0430 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u0412\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 -message.action.change.service.warning.for.router=\u0414\u043b\u044f \u0441\u043c\u0435\u043d\u044b \u043d\u0430\u0431\u043e\u0440\u0430 \u0443\u0441\u043b\u0443\u0433 \u0412\u0430\u0448 \u0440\u043e\u0443\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d -message.action.delete.cluster=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. -message.action.delete.disk.offering=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u042b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -message.action.delete.domain=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u043e\u043c\u0435\u043d. -message.action.delete.external.firewall=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0444\u0430\u0435\u0440\u0432\u043e\u043b. \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0435\u043d\u0438\u0435\: \u0415\u0441\u043b\u0438 \u0412\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0444\u0430\u0435\u0440\u0432\u043e\u043b, \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435. -message.action.delete.external.load.balancer=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. \u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0434\u0435\u043d\u0438\u0435\: \u0415\u0441\u043b\u0438 \u0412\u044b \u0432 \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u043c \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u043e\u0431\u0440\u0430\u0442\u043d\u043e \u044d\u0442\u043e\u0442 \u0436\u0435 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0444\u0430\u0435\u0440\u0432\u043e\u043b, \u0412\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u0443\u0434\u0435\u0442\u0435 \u0441\u0431\u0440\u043e\u0441\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u044d\u0442\u043e\u043c \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0435 -message.action.delete.ingress.rule=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u043f\u0440\u0430\u0432\u0438\u043b\u043e. -message.action.delete.ISO.for.all.zones=ISO \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u0441\u0435\u043c\u0438 \u0437\u043e\u043d\u0430\u043c\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0438\u0437 \u0432\u0441\u0435\u0445 \u0437\u043e\u043d. -message.action.delete.ISO=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 ISO. -message.action.delete.network=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0435\u0442\u044c. -message.action.delete.nexusVswitch=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e nexus 1000v -message.action.delete.nic=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 NIC, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0442\u0430\u043a\u0436\u0435 \u0443\u0434\u0430\u043b\u0438\u0442 \u0432\u0441\u0435 \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u0438\u0437 \u0412\u041c. -message.action.delete.physical.network=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c -message.action.delete.pod=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434. -message.action.delete.primary.storage=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. -message.action.delete.secondary.storage=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -message.action.delete.security.group=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 security group. -message.action.delete.service.offering=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u042b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0443\u0441\u043b\u0443\u0433\u0443 \u0441\u043b\u0443\u0436\u0431 -message.action.delete.snapshot=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043d\u0438\u043c\u043e\u043a. -message.action.delete.system.service.offering=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0439 \u0440\u0435\u0441\u0443\u0440\u0441. -message.action.delete.template.for.all.zones=\u042d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0432\u043e \u0432\u0441\u0435\u0445 \u0437\u043e\u043d\u0430\u0445. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0435\u0433\u043e \u0432\u043e \u0432\u0441\u0435\u0445 \u0437\u043e\u043d\u0430\u0445. -message.action.delete.template=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u043a \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d. -message.action.delete.volume=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0442\u044c \u044d\u0442\u043e\u0442 \u0442\u043e\u043c. -message.action.delete.zone=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0442\u044c \u044d\u0442\u0443 \u0437\u043e\u043d\u0443. -message.action.destroy.instance=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443. -message.action.destroy.systemvm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c. -message.action.disable.cluster=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. -message.action.disable.nexusVswitch=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e nexusVswitch. -message.action.disable.physical.network=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c. -message.action.disable.pod=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434. -message.action.disable.static.NAT=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0442\u0440\u0430\u043d\u0441\u043b\u044f\u0446\u0438\u044e \u0430\u0434\u0440\u0435\u0441\u043e\u0432. -message.action.disable.zone=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u0443\u044e \u0437\u043e\u043d\u0443. -message.action.download.iso=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 ISO. -message.action.download.template=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u0430\u0431\u043b\u043e\u043d. -message.action.enable.cluster=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0434\u0430\u043d\u043d\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440. -message.action.enable.maintenance=\u0412\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440 \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043f\u043e\u0434\u0433\u043e\u0442\u043e\u0432\u043b\u0435\u043d \u0434\u043b\u044f \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u043d\u0435\u043c \u0432 \u0434\u0430\u043d\u043d\u043e\u0435 \u0432\u0440\u0435\u043c\u044f. -message.action.enable.nexusVswitch=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e nexus 1000v. -message.action.enable.physical.network=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c. -message.action.enable.pod=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u0442\u0435\u043d\u0434. -message.action.enable.zone=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0437\u043e\u043d\u0443. -message.action.force.reconnect=\u0412\u0430\u0448 \u0441\u0435\u0440\u0432\u0435\u0440 \u043f\u043e\u043b\u0443\u0447\u0438\u043b \u043a\u043e\u043c\u0430\u043d\u0434\u0443 \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u043e\u0433\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f. \u042d\u0442\u043e\u0442 \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u0434\u043e \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u043c\u0438\u043d\u0443\u0442. -message.action.host.enable.maintenance.mode=\u0410\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0440\u0435\u0436\u0438\u043c\u0430 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043f\u0440\u0438\u043d\u0443\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0439 \u043c\u0438\u0433\u0440\u0430\u0446\u0438\u0438 \u0432\u0441\u0435\u0445 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0434\u0430\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. -message.action.instance.reset.password=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430 \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. -message.action.manage.cluster=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f. -message.action.primarystorage.enable.maintenance.mode=\u041f\u0440\u0435\u0434\u0443\u043f\u0440\u0435\u0436\u0434\u0435\u043d\u0438\u0435\: \u043f\u0435\u0440\u0435\u0432\u043e\u0434 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0432 \u0440\u0435\u0436\u0438\u043c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u044f \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432\u0441\u0435\u0445 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0438\u0445 \u0435\u0433\u043e \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0438\u0442\u044c? -message.action.reboot.instance=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443. -message.action.reboot.router=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440. -message.action.reboot.systemvm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c. -message.action.release.ip=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0441\u0432\u043e\u0431\u043e\u0434\u0438\u0442\u044c \u044d\u0442\u043e\u0442 IP \u0430\u0434\u0440\u0435\u0441. -message.action.remove.host=\u0423\u0434\u0430\u043b\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0433\u043e/\u0435\u0434\u0438\u043d\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438 \u043f\u043e\u0432\u0442\u043e\u0440\u043d\u0430\u044f \u0435\u0433\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u0438\u044e \u0440\u0430\u0431\u043e\u0447\u0435\u0433\u043e \u043e\u043a\u0440\u0443\u0436\u0435\u043d\u0438\u044f/\u0431\u0430\u0437\u044b \u0434\u0430\u043d\u043d\u044b\u0445 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435 \u0438 \u0441\u0434\u0435\u043b\u0430\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u043d\u0435\u043f\u0440\u0438\u0433\u043e\u0434\u043d\u044b\u043c\u0438 \u043a \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044e. -message.action.reset.password.off=\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0435 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u0434\u0430\u043d\u043d\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e -message.action.reset.password.warning=\u041f\u0435\u0440\u0435\u0434 \u043f\u043e\u043f\u044b\u0442\u043a\u043e\u0439 \u0441\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0430\u0440\u043e\u043b\u044c \u0412\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0431\u044b\u0442\u044c \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430. -message.action.restore.instance=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443. -message.action.revert.snapshot=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u0435\u0440\u043d\u0443\u0442\u044c \u0434\u0438\u0441\u043a \u043a \u044d\u0442\u043e\u043c\u0443 \u0442\u043e\u043c \u0441\u043d\u0438\u043c\u043a\u0443 -message.action.start.instance=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443. -message.action.start.router=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440. -message.action.start.systemvm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u0443\u044e \u0412\u041c. -message.action.stop.instance=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u043c\u0430\u0448\u0438\u043d\u0443. -message.action.stop.router=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u043e\u0443\u0442\u0435\u0440. -message.action.stop.systemvm=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443. -message.action.take.snapshot=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u044d\u0442\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430. -message.action.unmanage.cluster=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0432\u0435\u0441\u0442\u0438 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432 \u043e\u0431\u044b\u0447\u043d\u044b\u0439 \u0440\u0435\u0436\u0438\u043c. -message.action.vmsnapshot.delete=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c. -message.action.vmsnapshot.revert=\u0412\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043d\u0438\u043c\u043e\u043a \u0412\u041c -message.activate.project=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442? -message.add.cluster=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u043e\u0432 \u0432 \u0437\u043e\u043d\u0435 , pod -message.add.cluster.zone=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u043e\u0432 \u0432 \u0437\u043e\u043d\u0435 -message.add.disk.offering=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0443\u0441\u043b\u0443\u0433\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0441\u0442\u0440\u0430\u043d\u0441\u0442\u0432\u0430 -message.add.domain=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043f\u043e\u0434\u0434\u043e\u043c\u0435\u043d, \u0433\u0434\u0435 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0432\u0430\u0448 \u0434\u043e\u043c\u0435\u043d -message.add.firewall=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0444\u0430\u0435\u0440\u0432\u043e\u043b \u0432 \u0437\u043e\u043d\u0443 -message.add.guest.network=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c -message.add.host=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0443\u0437\u043b\u0430. -message.adding.host=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 -message.adding.Netscaler.device=\u0414\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 NetScaler -message.adding.Netscaler.provider=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c Netscaler -message.add.ip.range.direct.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c IP-\u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u0441\u0435\u0442\u0438 \u0432 \u0437\u043e\u043d\u0435 -message.add.ip.range.to.pod=

\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432 \u0441\u0442\u0435\u043d\u0434\:

-message.add.ip.range=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u0437\u043e\u043d\u044b -message.additional.networks.desc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0438 \u043a \u043a\u043e\u0442\u043e\u0440\u044b\u043c \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0412\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430. -message.add.load.balancer=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0443 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0432 \u0437\u043e\u043d\u0443 -message.add.load.balancer.under.ip=\u041f\u0440\u0430\u0432\u0438\u043b\u043e \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0431\u044b\u043b \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 IP\: -message.add.network=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u0443\u044e \u0441\u0435\u0442\u044c \u0434\u043b\u044f \u0437\u043e\u043d\u044b\: -message.add.new.gateway.to.vpc=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0448\u043b\u044e\u0437\u0430 \u0432 VPC -message.add.pod.during.zone.creation=\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u0435\u0440\u0432\u044b\u043c. \u0421\u0442\u0435\u043d\u0434 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0443\u0437\u043b\u044b \u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u044b \u0432 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u043c \u0448\u0430\u0433\u0435. \u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 IP \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0435\u0439 \u0441\u0435\u0442\u0438 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f. \u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 IP \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0443\u043d\u0438\u043a\u0430\u043b\u044c\u043d\u044b\u043c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0437\u043e\u043d\u044b \u043e\u0431\u043b\u0430\u043a\u0430. -message.add.pod=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043d\u043e\u0432\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0434\u043b\u044f \u0437\u043e\u043d\u044b -message.add.primary.storage=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0434\u043b\u044f \u0437\u043e\u043d\u044b , \u0441\u0442\u0435\u043d\u0434\u0430 -message.add.primary=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0437\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -message.add.region=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0440\u0435\u0433\u0438\u043e\u043d\u0430. -message.add.secondary.storage=\u0414\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0432 \u0437\u043e\u043d\u0443 -message.add.service.offering=\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0440\u0435\u0441\u0443\u0440\u0441\u0430. -message.add.system.service.offering=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u044b \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0435\u0440\u0432\u0438\u0441\u043d\u043e\u0439 \u0443\u0441\u043b\u0443\u0433\u0438 -message.add.template=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430 -message.add.volume=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430. -message.add.VPN.gateway=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c VPN \u0448\u043b\u044e\u0437 -message.advanced.mode.desc=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0435\u0441\u043b\u0438 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0442\u0435\u0445\u043d\u043e\u043b\u043e\u0433\u0438\u044e VLAN. \u042d\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0435\u0442 \u043d\u0430\u0438\u0431\u043e\u043b\u044c\u0448\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c, \u043f\u043e\u0437\u0432\u043e\u043b\u044f\u044f \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0430\u043c \u043f\u0440\u0435\u0434\u043b\u0430\u0433\u0430\u0442\u044c \u0442\u0430\u043a\u0438\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0441\u0435\u0440\u0432\u0438\u0441\u044b, \u043a\u0430\u043a \u0444\u0430\u0435\u0440\u0432\u043e\u043b, \u0412\u041f\u041d, \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u0449\u0438\u043a \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438, \u0430 \u0442\u0430\u043a \u0436\u0435 \u0432\u044b\u0431\u0438\u0440\u0430\u0442\u044c \u043f\u0440\u044f\u043c\u043e\u0435 \u0438\u043b\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0447\u0435\u0440\u0435\u0437 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0447\u0430\u0441\u0442\u043d\u044b\u0435 \u0441\u0435\u0442\u0438. -message.advanced.security.group=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u043e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c security groups \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. -message.advanced.virtual=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u043e, \u0435\u0441\u043b\u0438 \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c VLAN \u0434\u043b\u044f \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. -message.after.enable.s3=S3-\u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u043e\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u043e. \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435\: \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043a\u0438\u043d\u0435\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0432\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c S3 \u0441\u043d\u043e\u0432\u0430. -message.after.enable.swift=Swift \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d. \u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435\: \u0415\u0441\u043b\u0438 \u0432\u044b \u043f\u043e\u043a\u0438\u043d\u0435\u0442\u0435 \u044d\u0442\u0443 \u0441\u0442\u0440\u0430\u043d\u0438\u0446\u0443, \u0432\u0430\u043c \u043d\u0435 \u043f\u0440\u0438\u0434\u0435\u0442\u0441\u044f \u043d\u0430\u0441\u0442\u0440\u0430\u0438\u0432\u0430\u0442\u044c Swift \u0441\u043d\u043e\u0432\u0430 -message.alert.state.detected=\u041e\u0431\u043d\u0430\u0440\u0443\u0436\u0435\u043d \u0441\u0438\u0433\u043d\u0430\u043b \u0442\u0440\u0435\u0432\u043e\u0433\u0438 -message.allow.vpn.access=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043c\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f, \u043a\u043e\u0442\u043e\u0440\u043e\u043c\u0443 \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u0438\u0442\u044c VPN \u0434\u043e\u0441\u0442\u0443\u043f. -message.apply.snapshot.policy=\u0412\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u043e\u0431\u043d\u043e\u0432\u0438\u043b\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439. -message.attach.iso.confirm=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c ISO \u043a \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435. -message.attach.volume=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0437\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u0434\u0430\u043d\u043d\u044b\u0435 \u0434\u043b\u044f \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u0438\u043d\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430. \u0415\u0441\u043b\u0438 \u0412\u044b \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0435\u0442\u0435 \u0434\u0438\u0441\u043a \u043a \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u0435 Windows, \u043f\u043e\u0442\u0440\u0435\u0431\u0443\u0435\u0442\u0441\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0430 \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u044b \u0434\u0438\u0441\u043a \u0431\u044b\u043b \u043e\u043a\u043e\u043d\u0447\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d. -message.basic.mode.desc=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u0442\u0443 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c, \u0435\u0441\u043b\u0438 \u0412\u044b *\u043d\u0435* \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0443 VLAN. \u0412\u0441\u0435\u043c \u0441\u043e\u0437\u0434\u0430\u043d\u043d\u044b\u043c \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u043c\u043e\u0434\u0435\u043b\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0448\u0438\u043d\u0430\u043c \u0431\u0443\u0434\u0435\u0442 \u043d\u0430\u043f\u0440\u044f\u043c\u0443\u044e \u043f\u0440\u0438\u0441\u0432\u043e\u0435\u043d \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0438\u0440\u0443\u0435\u043c\u044b\u0439 IP \u0430\u0434\u0440\u0435\u0441. \u0414\u043b\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u044f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0444\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b Security groups. -message.change.offering.confirm=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0438\u0437\u043c\u0435\u043d\u0438\u0442\u044c \u0443\u0441\u043b\u0443\u0433\u0438 \u0441\u043b\u0443\u0436\u0431 \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. -message.change.password=\u0418\u0437\u043c\u0435\u043d\u0438\u0442\u0435 \u0432\u0430\u0448 \u043f\u0430\u0440\u043e\u043b\u044c. -message.configure.all.traffic.types=\u0423 \u0432\u0430\u0441 \u0435\u0441\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c \u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0442\u0438\u043f\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430, \u043d\u0430\u0436\u0430\u0432 \u043d\u0430 \u043a\u043d\u043e\u043f\u043a\u0443 \u0418\u0437\u043c\u0435\u043d\u0438\u0442\u044c. -message.configuring.guest.traffic=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 -message.configuring.physical.networks=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439 -message.configuring.public.traffic=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0433\u043e \u0442\u0440\u0430\u0444\u0438\u043a\u0430 -message.configuring.storage.traffic=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -message.confirm.action.force.reconnect=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a \u0443\u0437\u043b\u0443 -message.confirm.delete.F5=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c F5 -message.confirm.delete.NetScaler=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c NetScaler -message.confirm.delete.PA=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c Palo Alto -message.confirm.delete.SRX=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c SRX -message.confirm.destroy.router=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u0440\u043e\u0443\u0442\u0435\u0440 -message.confirm.disable.provider=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 -message.confirm.enable.provider=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 -message.confirm.join.project=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443. -message.confirm.remove.IP.range=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP. -message.confirm.shutdown.provider=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 -message.copy.iso.confirm=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0441\u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0412\u0430\u0448 ISO \u0432 -message.copy.template=\u041a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d XXX \u0438\u0437 \u0437\u043e\u043d\u044b \u0432 -message.create.template=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d\u043d? -message.create.template.vm=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 -message.create.template.volume=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u043f\u0435\u0440\u0435\u0434 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0435\u043c \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u0438\u0437 \u0412\u0430\u0448\u0435\u0433\u043e \u0434\u0438\u0441\u043a\u0430\: . \u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0438 \u0431\u043e\u043b\u0435\u0435 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0412\u0430\u0448\u0435\u0433\u043e \u0434\u0438\u0441\u043a\u0430. -message.creating.cluster=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430 -message.creating.guest.network=\u0421\u043e\u0437\u0434\u0430\u0442\u044c \u0433\u043e\u0441\u0442\u0435\u0432\u0443\u044e \u0441\u0435\u0442\u044c -message.creating.physical.networks=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439 -message.creating.pod=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0441\u0442\u0435\u043d\u0434\u0430 -message.creating.primary.storage=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -message.creating.secondary.storage=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 -message.creating.zone=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b -message.decline.invitation=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043c\u0435\u043d\u0438\u0442\u044c \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u043d\u0430 \u043f\u0440\u043e\u0435\u043a\u0442. -message.dedicate.zone=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0437\u043e\u043d\u0430 -message.delete.account=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. -message.delete.affinity.group=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u0443 affinity group -message.delete.gateway=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u043b\u044e\u0437. -message.delete.project=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u0440\u043e\u0435\u043a\u0442? -message.delete.user=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. -message.delete.VPN.connection=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e VPN \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. -message.delete.VPN.customer.gateway=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u0439 \u0448\u043b\u044e\u0437 VPN. -message.delete.VPN.gateway=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0448\u043b\u044e\u0437 VPN. -message.desc.advanced.zone=\u0414\u043b\u044f \u0431\u043e\u043b\u0435\u0435 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0441\u0435\u0442\u0435\u0432\u044b\u0445 \u0442\u043e\u043f\u043e\u043b\u043e\u0433\u0438\u0439. \u042d\u0442\u0430 \u0441\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u043e\u0434\u0435\u043b\u044c \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u0435\u0442 \u043c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u0443\u044e \u0433\u0438\u0431\u043a\u043e\u0441\u0442\u044c \u0432 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0443\u0441\u043b\u0443\u0433, \u0442\u0430\u043a\u0438\u0445 \u043a\u0430\u043a \u043c\u0435\u0436\u0441\u0435\u0442\u0435\u0432\u043e\u0439 \u044d\u043a\u0440\u0430\u043d, VPN, \u0438\u043b\u0438 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u043a\u0430 \u0431\u0430\u043b\u0430\u043d\u0441\u0438\u0440\u043e\u0432\u043a\u0438 \u043d\u0430\u0433\u0440\u0443\u0437\u043a\u0438. -message.desc.basic.zone=\u041f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0435\u0434\u0438\u0441\u0442\u0432\u0435\u043d\u043d\u0443\u044e \u0441\u0435\u0442\u044c, \u0433\u0434\u0435 \u043a\u0430\u0436\u0434\u0430\u044f \u0412\u041c \u0438\u043c\u0435\u0435\u0442 \u00ab\u0431\u0435\u043b\u044b\u0439\u00bb IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0442\u0438. \u0418\u0437\u043e\u043b\u044f\u0446\u0438\u0438 \u0433\u043e\u0441\u0442\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0434\u043e\u0431\u0438\u0442\u044c\u0441\u044f \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435\u043c \u0441\u0435\u0442\u0438 3-\u0433\u043e \u0443\u0440\u043e\u0432\u043d\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u0433\u0440\u0443\u043f\u043f\u044b \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 (\u0444\u0438\u043b\u044c\u0442\u0440\u0430\u0446\u0438\u044f IP-\u0432\u0434\u0440\u0435\u0441\u043e\u0432) -message.desc.cluster=\u041a\u0430\u0436\u0434\u044b\u0439 \u0441\u0442\u0435\u043d\u0434 \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432\u044b \u0441\u0435\u0439\u0447\u0430\u0441 \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443 \u0443\u0437\u043b\u043e\u0432. \u0423\u0437\u043b\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f \u0447\u0435\u0440\u0435\u0437 \u043e\u0434\u0438\u043d \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u0441\u0435\u0442\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u0438 \u0442\u043e\u043c\u0443 \u0436\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u043e\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443. \u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u0431\u043e\u043b\u0435\u0435 \u0443\u0437\u043b\u043e\u0432, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0438\u0435\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0445 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449. -message.desc.host=\u041a\u0430\u0436\u0434\u044b\u0439 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b (\u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440) \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0412\u041c, \u043f\u0435\u0440\u0432\u044b\u0439 \u0438\u0437 \u043a\u043b\u0430\u0441\u0442\u0435\u0440 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u0441\u0435\u0439\u0447\u0430\u0441. \u0414\u043b\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u0443\u0437\u043b\u0430 \u0432 CloudStack \u0432\u0430\u0436\u043d\u0430 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430 \u043d\u0430 \u0443\u0437\u0435\u043b, \u043f\u0440\u0438\u0432\u044f\u0437\u043a\u0430 IP \u043a \u0443\u0437\u043b\u0443 \u0438 \u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0435 \u0443\u0437\u043b\u0430 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f CloudStack.

\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0438\u043c\u044f DNS \u0438\u043b\u0438 \u0430\u0434\u0440\u0435\u0441 IP, \u0438\u043c\u044f \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0438 \u043f\u0430\u0440\u043e\u043b\u044c \u043a \u041e\u0421 (\u043e\u0431\u044b\u0447\u043d\u043e root), \u0430 \u0442\u0430\u043a\u0436\u0435 \u043c\u0435\u0442\u043a\u0438 \u0434\u043b\u044f \u0433\u0440\u0443\u043f\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0443\u0437\u043b\u043e\u0432. -message.desc.primary.storage=\u041a\u0430\u0436\u0434\u0430\u044f \u0433\u0440\u0443\u043f\u043f\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0438\u0447\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432 \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445, \u0438 \u043c\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u043c \u043f\u0435\u0440\u0432\u044b\u0439 \u0441\u0435\u0439\u0447\u0430\u0441. \u041f\u0435\u0440\u0432\u0438\u0447\u043d\u0430\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u043b\u043e\u0433\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0440\u0430\u0437\u0434\u0435\u043b\u044b \u0436\u0435\u0441\u0442\u043a\u043e\u0433\u043e \u0434\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0445 \u043d\u0430 \u0443\u0437\u043b\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 \u043b\u044e\u0431\u043e\u0439 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043e\u0441\u043d\u043e\u0432\u043d\u044b\u0435 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430. -message.desc.secondary.storage=\u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u0434\u043e\u043b\u0436\u043d\u0430 \u043e\u0431\u043b\u0430\u0434\u0430\u0442\u044c \u0445\u043e\u0442\u044f \u0431\u044b \u043e\u0434\u043d\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c NFS \u0438\u043b\u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0438 \u0438\u0445 \u043d\u0430\u0434\u043e \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u044c \u0432 \u043f\u0435\u0440\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u0440\u0435\u0434\u043d\u0430\u0437\u043d\u0430\u0447\u0435\u043d\u043e \u0434\u043b\u044f \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432 \u0412\u041c, \u043e\u0431\u0440\u0430\u0437\u043e\u0432 ISO \u0438 \u0441\u043d\u0438\u043c\u043a\u043e\u0432 \u0412\u041c. \u042d\u0442\u043e\u0442 \u0441\u0435\u0440\u0432\u0435\u0440 \u0434\u043e\u043b\u0436\u0435\u043d \u0431\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f\u0435\u043d \u0434\u043b\u044f \u0432\u0441\u0435\u0445 \u0443\u0437\u043b\u043e\u0432 \u0437\u043e\u043d\u044b.

\u0417\u0430\u043f\u043e\u043b\u043d\u0438\u0442\u0435 IP-\u0430\u0434\u0440\u0435\u0441 \u0438 \u043f\u0443\u0442\u044c. -message.desc.zone=layer 3 -message.detach.disk=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0434\u0438\u0441\u043a? -message.detach.iso.confirm=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c ISO \u043e\u0442 \u044d\u0442\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. -message.disable.account=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. \u0414\u0435\u0430\u043a\u0442\u0438\u0432\u0430\u0446\u0438\u044f \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u0443\u0435\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u0432\u0441\u0435\u0445 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u0439 \u043a \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c \u041e\u0431\u043b\u0430\u043a\u0430. \u0412\u0441\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0435 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0431\u0443\u0434\u0443\u0442 \u043d\u0435\u0437\u0430\u043c\u0435\u0434\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u044b. -message.disable.snapshot.policy=\u0412\u044b \u0443\u0441\u043f\u0435\u0448\u043d\u043e \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u043b\u0438\u0442\u0438\u043a\u0443 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u043a\u043e\u043f\u0438\u0439. -message.disable.user=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. -message.disable.vpn.access=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0434\u0435\u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c VPN \u0434\u043e\u0441\u0442\u0443\u043f. -message.disable.vpn=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u044b\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN? -message.download.ISO=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043d\u0430\u0436\u043c\u0438\u0442\u0435 00000 \u0441\u043a\u0430\u0447\u0430\u0442\u044c \u043e\u0431\u0440\u0430\u0437 -message.download.template=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 00000\u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 -message.download.volume.confirm=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043d\u0430\u0436\u043c\u0438\u0442\u0435 00000 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0438\u0441\u043a\u0430 -message.download.volume=\u041d\u0430\u0436\u043c\u0438\u0442\u0435 00000 \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0434\u0438\u0441\u043a\u0430 -message.edit.account=\u0420\u0435\u0434\u0430\u043a\u0442\u0438\u0440\u043e\u0432\u0430\u0442\u044c (\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 "-1" \u043f\u043e\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439 \u0434\u043b\u044f \u0440\u0435\u0441\u0443\u0440\u0441\u0430) -message.edit.limits=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u0438\u0442\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0445 \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432. "-1" \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0430\u0435\u0442 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0438\u0435 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0439. -message.edit.traffic.type=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u043a\u0430\u0436\u0438\u0442\u0435 \u043c\u0435\u0442\u043a\u0438 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0432\u044b \u0445\u043e\u0442\u0438\u0442\u0435, \u0441\u0432\u044f\u0437\u0430\u043d\u043d\u044b\u0445 \u0441 \u044d\u0442\u0438\u043c \u0442\u0438\u043f\u043e\u043c \u0442\u0440\u0430\u0444\u0438\u043a\u0430. -message.enable.account=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0435\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. -message.enabled.vpn.ip.sec=\u0412\u0430\u0448 IPSec pre-shared \u043a\u043b\u044e\u0447 -message.enabled.vpn=\u0412\u0430\u0448 VPN \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d. \u0414\u043e\u0441\u0442\u0443\u043f \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u0435\u043d \u0447\u0435\u0440\u0435\u0437 IP \u0430\u0434\u0440\u0435\u0441 -message.enable.user=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. -message.enable.vpn.access=VPN \u0432 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e IP \u0430\u0434\u0440\u0435\u0441\u0430. \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u0442\u044c VPN? -message.enable.vpn=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0442\u043a\u0440\u044b\u0442\u044c \u0434\u043e\u0441\u0442\u0443\u043f \u043a VPN \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e IP-\u0430\u0434\u0440\u0435\u0441\u0430. -message.enabling.security.group.provider=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u043f\u043e\u0441\u0442\u0430\u0432\u0449\u0438\u043a\u0430 \u0433\u0440\u0443\u043f\u043f \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 -message.enabling.zone=\u0412\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u0437\u043e\u043d\u0443 -message.enter.token=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u043a\u043b\u044e\u0447, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u043f\u043e\u043b\u0443\u0447\u0438\u043b\u0438 \u0432 \u043f\u0440\u0438\u0433\u043b\u0430\u0441\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u043c \u043f\u0438\u0441\u044c\u043c\u0435 -message.generate.keys=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043d\u043e\u0432\u044b\u0435 \u043a\u043b\u044e\u0447\u0438 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f. -message.guest.traffic.in.advanced.zone=\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0434\u043b\u044f \u0441\u0432\u044f\u0437\u0438 \u043c\u0435\u0436\u0434\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c\u0441\u043a\u0438\u043c\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0438\u0442 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0438\u0434\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0442\u043e\u0440\u043e\u0432 VLAN \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438. -message.guest.traffic.in.basic.zone=\u0413\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043e\u0431\u0449\u0435\u043d\u0438\u0438 \u043c\u0435\u0436\u0434\u0443 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c\u0438 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438. \u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0430\u0434\u0440\u0435\u0441\u043e\u0432 IP, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 CloudStack \u0441\u043c\u043e\u0436\u0435\u0442 \u0432\u044b\u0434\u0435\u043b\u0438\u0442\u044c \u0434\u043b\u044f \u0412\u041c. \u0423\u0431\u0435\u0434\u0438\u0442\u0435\u0441\u044c, \u0447\u0442\u043e \u044d\u0442\u043e\u0442 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u043d\u0435 \u043f\u0435\u0440\u0435\u043a\u0440\u0435\u0449\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u043e\u043c \u0440\u0435\u0437\u0435\u0440\u0432\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432. -message.installWizard.click.retry=\u041a\u043b\u0438\u043a\u043d\u0438\u0442\u0435, \u0447\u0442\u043e\u0431\u044b \u043f\u043e\u0432\u0442\u043e\u0440\u0438\u0442\u044c \u0437\u0430\u043f\u0443\u0441\u043a. -message.installWizard.copy.whatIsACluster=\u041a\u043b\u0430\u0441\u0442\u0435\u0440 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u0433\u0440\u0443\u043f\u043f\u0443 \u0443\u0437\u043b\u043e\u0432. \u0423\u0437\u043b\u044b \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0435 \u0438\u043c\u0435\u044e\u0442 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u0435 \u043e\u0431\u043e\u0440\u0443\u0434\u043e\u0432\u0430\u043d\u0438\u0435, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u044b \u0432 \u043e\u0434\u0438\u043d\u0430\u043a\u043e\u0432\u043e\u043c \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u0435\u0440\u0435, \u043d\u0430\u0445\u043e\u0434\u044f\u0442\u0441\u044f \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0438 \u0438\u043c\u0435\u044e\u0442 \u0434\u043e\u0441\u0442\u0443\u043f \u043a \u043e\u0434\u043d\u043e\u043c\u0443 \u043e\u0431\u0449\u0435\u043c\u0443 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0443. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b (\u0412\u041c) \u043c\u043e\u0433\u0443\u0442 \u0431\u044b\u0442\u044c \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0435\u043d\u044b "\u0432\u0436\u0438\u0432\u0443\u044e" \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0443\u0437\u043b\u0430 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430, \u0431\u0435\u0437 \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0435\u0440\u0432\u0438\u0441\u043e\u0432 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0435\u043c. \u041a\u043b\u0430\u0441\u0442\u0435\u0440 - \u0442\u0440\u0435\u0442\u044c\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&\#8482. \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u0430\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u0441\u0442\u0435\u043d\u0434\u0430\u0445, \u0430 \u0441\u0442\u0435\u043d\u0434\u044b - \u0432 \u0437\u043e\u043d\u0430\u0445.

CloudStack&\#8482; \u0440\u0430\u0437\u0440\u0435\u0448\u0430\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u0432, \u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u044d\u0442\u0430 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u0435\u0442. -message.installWizard.copy.whatIsAHost=\u0423\u0437\u0435\u043b - \u044d\u0442\u043e \u043e\u0442\u0434\u0435\u043b\u044c\u043d\u044b\u0439 \u043a\u043e\u043c\u043f\u044c\u044e\u0442\u0435\u0440. \u0423\u0437\u043b\u044b \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u044e\u0442 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u0434\u043b\u044f \u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d. \u041a\u0430\u0436\u0434\u044b\u0439 \u0443\u0437\u0435\u043b \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 \u0434\u043b\u044f \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0412\u041c (\u043a\u0440\u043e\u043c\u0435 \u0443\u0437\u043b\u043e\u0432 BareMetal, \u043e\u043d\u0438 \u044f\u0432\u043b\u044f\u044e\u0442\u0441\u044f \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435\u043c \u0438\u0437 \u043f\u0440\u0430\u0432\u0438\u043b \u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432 \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u043c \u0440\u0443\u043a\u043e\u0432\u043e\u0434\u0441\u0442\u0432\u0435 \u043f\u043e \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435). \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u044d\u0442\u043e Linux-\u0441\u0435\u0440\u0432\u0435\u0440 \u0441 KVM, \u0441\u0435\u0440\u0432\u0435\u0440 Citrix XenServer \u0438\u043b\u0438 \u0441\u0435\u0440\u0432\u0435\u0440 ESXI. \u041f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0443\u0437\u0435\u043b \u0441 XenServer.

\u0423\u0437\u0435\u043b - \u044d\u0442\u043e \u043d\u0430\u0438\u043c\u0435\u043d\u044c\u0448\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&\#8482;, \u0434\u0430\u043b\u0435\u0435 \u0443\u0437\u043b\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430\u0445, \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u044b - \u0432 \u0441\u0442\u0435\u043d\u0434\u0430\u0445, \u0441\u0442\u0435\u043d\u0434\u044b - \u0432 \u0437\u043e\u043d\u0430\u0445. -message.installWizard.copy.whatIsAPod=\u0421\u0442\u0435\u043d\u0434, \u043a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0435\u0442 \u043e\u0434\u043d\u0443 \u0441\u0442\u043e\u0439\u043a\u0443 \u0441 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438. \u0423\u0437\u043b\u044b \u0432 \u043e\u0434\u043d\u043e\u043c \u0441\u0442\u0435\u043d\u0434\u0435 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0432 \u043e\u0434\u043d\u043e\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u0438.

\u0421\u0442\u0435\u043d\u0434 - \u0432\u0442\u043e\u0440\u0430\u044f \u043f\u043e \u0440\u0430\u0437\u043c\u0435\u0440\u043d\u043e\u0441\u0442\u0438 \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&\#8482;. \u0421\u0442\u0435\u043d\u0434\u044b \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0433\u0430\u044e\u0442\u0441\u044f \u0432 \u0437\u043e\u043d\u0430\u0445. \u041a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u0442\u0435\u043d\u0434\u043e\u0432, \u043d\u043e \u043f\u0440\u0438 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0435 \u0432 \u0437\u043e\u043d\u0435 \u043c\u043e\u0436\u043d\u043e \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043b\u0438\u0448\u044c \u043e\u0434\u0438\u043d \u0441\u0442\u0435\u043d\u0434. -message.installWizard.copy.whatIsAZone=\u0417\u043e\u043d\u0430 - \u044d\u0442\u043e \u043d\u0430\u0438\u0431\u043e\u043b\u0435\u0435 \u043a\u0440\u0443\u043f\u043d\u0430\u044f \u043e\u0440\u0433\u0430\u043d\u0438\u0437\u0430\u0446\u0438\u043e\u043d\u043d\u0430\u044f \u0435\u0434\u0438\u043d\u0438\u0446\u0430 \u0432 \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0435 CloudStack&\#8482;. \u0417\u043e\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u043c\u0443 \u0426\u041e\u0414, \u0445\u043e\u0442\u044f \u0438\u043c\u0435\u0435\u0442\u0441\u044f \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043e\u043d \u0432 \u043f\u0440\u0435\u0434\u0435\u043b\u0430\u0445 \u043e\u0434\u043d\u043e\u0433\u043e \u0426\u041e\u0414. \u041e\u0441\u043d\u043e\u0432\u043d\u044b\u043c \u043f\u0440\u0435\u0438\u043c\u0443\u0449\u0435\u0441\u0442\u0432\u043e\u043c \u043f\u043e\u0441\u0442\u0440\u043e\u0435\u043d\u0438\u044f \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0441 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0435 \u0437\u043e\u043d \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0435\u043d\u0438\u0435 \u0438\u0437\u043e\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u0438. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043a\u0430\u0436\u0434\u0430\u044f \u0437\u043e\u043d\u0430 \u043c\u043e\u0436\u0435\u0442 \u0438\u043c\u0435\u0442\u044c \u0441\u0432\u043e\u0439 \u0431\u043b\u043e\u043a \u043f\u0438\u0442\u0430\u043d\u0438\u044f \u0438 \u0441\u0435\u0442\u044c, \u0430 \u0441\u0430\u043c\u0438 \u0437\u043e\u043d\u044b \u043c\u043e\u0433\u0443\u0442 \u0448\u0438\u0440\u043e\u043a\u043e \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u044b \u0433\u0435\u043e\u0433\u0440\u0430\u0444\u0438\u0447\u0435\u0441\u043a\u0438. -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482 - \u044d\u0442\u043e \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u043d\u0430\u044f \u043f\u043b\u0430\u0444\u0442\u043e\u0440\u043c\u0430 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445, \u0447\u0430\u0441\u0442\u043d\u044b\u0445 \u0438 \u0433\u0438\u0431\u0440\u0438\u0434\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u043a\u043e\u0432 \u043f\u043e \u0441\u0445\u0435\u043c\u0435 \u00ab\u0418\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0430 \u043a\u0430\u043a \u0441\u0435\u0440\u0432\u0438\u0441\u00bb (IaaS). CloudStack&\#8482 \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0441\u0435\u0442\u044c\u044e, \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435\u043c \u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0443\u0437\u043b\u0430\u043c\u0438, \u0432\u0445\u043e\u0434\u044f\u0449\u0438\u0435 \u0432 \u043e\u0431\u043b\u0430\u0447\u043d\u0443\u044e \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443. \u0413\u043b\u0430\u0432\u043d\u044b\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c, CloudStack&\#8482 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0440\u0430\u0437\u0432\u0435\u0440\u0442\u044b\u0432\u0430\u043d\u0438\u044f, \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u043e\u0439 \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u0445 \u0440\u0435\u0448\u0435\u043d\u0438\u0439.

CloudStack&\#8482 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u043a\u0430\u043a \u0443\u0441\u043b\u0443\u0433\u0438 \u0446\u0435\u043b\u043e\u0433\u043e \u0446\u0435\u043d\u0442\u0440\u0430 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0441 \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u044b\u043c\u0438 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u0430\u043c\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043b\u043e\u0436\u043d\u044b\u0445 \u0438\u043d\u0444\u0440\u0430\u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u043e\u0431\u043b\u0430\u043a\u0430. \u041c\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043c\u0435\u0436\u0434\u0443 \u0441\u0432\u043e\u0431\u043e\u0434\u043d\u043e\u0439 \u0438 \u0411\u0435\u0437\u043d\u0435\u0441-\u0432\u0435\u0440\u0441\u0438\u044f\u043c\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043f\u043e\u0447\u0442\u0438 \u043d\u0438\u0447\u0435\u043c \u043d\u0435 \u043e\u0442\u043b\u0438\u0447\u0430\u044e\u0442\u0441\u044f. -message.installWizard.copy.whatIsPrimaryStorage=CloudStack&\#8482; - \u044d\u0442\u043e \u043e\u0431\u043b\u0430\u0447\u043d\u0430\u044f \u043f\u043b\u0430\u0442\u0444\u043e\u0440\u043c\u0430, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u044e\u0449\u0430\u044f \u0434\u0432\u0430 \u0442\u0438\u043f\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430\: \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0438 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435. \u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0445\u0440\u0430\u043d\u0438\u0442\u0435\u043b\u0435\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c iSCSI \u0438\u043b\u0438 NFS-\u0441\u0435\u0440\u0432\u0435\u0440 \u0438\u043b\u0438 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u0438\u0441\u043a.

\u041e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u0432\u044f\u0437\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u0441 \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u043e\u043c \u0438 \u0442\u0430\u043c \u0445\u0440\u0430\u043d\u044f\u0442\u0441\u044f \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0435 \u0442\u043e\u043c\u0430 \u043a\u0430\u0436\u0434\u043e\u0439 \u0412\u041c, \u0437\u0430\u043f\u0443\u0449\u0435\u043d\u043d\u043e\u0439 \u0432 \u0443\u0437\u043b\u0430\u0445 \u044d\u0442\u043e\u0433\u043e \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u041a\u0430\u043a \u043f\u0440\u0430\u0432\u0438\u043b\u043e, \u0441\u043e\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0440\u044f\u0434\u043e\u043c \u0441 \u0443\u0437\u043b\u043e\u043c. -message.installWizard.copy.whatIsSecondaryStorage=\u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043f\u0440\u0438\u0432\u044f\u0437\u0430\u043d\u043e \u043a \u0437\u043e\u043d\u0435 \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0438\u0442 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u0435\:
  • \u0428\u0430\u0431\u043b\u043e\u043d\u044b - \u043e\u0431\u0440\u0430\u0437\u044b \u041e\u0421, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0438 \u0412\u041c \u0438 \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0435 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e, \u0442\u0430\u043a\u0443\u044e \u043a\u0430\u043a \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u044f.
  • \u041e\u0431\u0440\u0430\u0437\u044b ISO - \u044d\u0442\u043e \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0435 \u0438\u043b\u0438 \u043d\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0435 \u043e\u0431\u0440\u0430\u0437\u044b \u041e\u0421
  • \u0421\u043d\u0438\u043c\u043a\u0438 \u0434\u0438\u0441\u043a\u043e\u0432\u044b\u0445 \u0442\u043e\u043c\u043e\u0432 - \u0441\u043e\u0445\u0440\u0430\u043d\u0435\u043d\u043d\u044b\u0435 \u043a\u043e\u043f\u0438\u0438 \u0434\u0430\u043d\u043d\u044b\u0445 \u0412\u041c, \u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0434\u043b\u044f \u0432\u043e\u0441\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u0430\u043d\u043d\u044b\u0445 \u0438\u043b\u0438 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u0448\u0430\u0431\u043b\u043e\u043d\u0430
-message.installWizard.now.building=\u0412\u0430\u0448\u0435 \u043e\u0431\u043b\u0430\u043a\u043e \u0441\u043e\u0437\u0434\u0430\u0451\u0442\u0441\u044f... -message.installWizard.tooltip.addCluster.name=\u0418\u043c\u044f \u043a\u043b\u0430\u0441\u0442\u0435\u0440\u0430. \u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0441\u0430\u043c\u0438 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u0438\u043c\u044f, \u043d\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 Cloudstack. -message.installWizard.tooltip.addHost.hostname=\u0418\u043c\u044f DNS \u0438\u043b\u0438 IP-\u0430\u0434\u0440\u0435\u0441 \u0443\u0437\u043b\u0430. -message.installWizard.tooltip.addHost.password=\u042d\u0442\u043e\u0442 \u043f\u0430\u0440\u043e\u043b\u044c \u0434\u043b\u044f \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f (\u0441 \u0432\u0430\u0448\u0435\u0433\u043e XenServer) -message.installWizard.tooltip.addHost.username=\u041e\u0431\u044b\u0447\u043d\u043e root. -message.installWizard.tooltip.addPod.name=\u0418\u043c\u044f \u0441\u0442\u0435\u043d\u0434\u0430 -message.installWizard.tooltip.addPod.reservedSystemEndIp=\u042d\u0442\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0447\u0430\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f CloudStack \u0434\u043b\u044f \u0412\u041c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438. \u042d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0441\u0435\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. -message.installWizard.tooltip.addPod.reservedSystemGateway=\u0428\u043b\u044e\u0437 \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430. -message.installWizard.tooltip.addPod.reservedSystemNetmask=\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439. -message.installWizard.tooltip.addPod.reservedSystemStartIp=\u042d\u0442\u043e \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP \u0447\u0430\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f CloudStack \u0434\u043b\u044f \u0412\u041c \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430 \u0438 \u043a\u043e\u043d\u0441\u043e\u043b\u044c\u043d\u043e\u0433\u043e \u043f\u0440\u043e\u043a\u0441\u0438. \u042d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u044e\u0442\u0441\u044f \u0438\u0437 \u0441\u0435\u0442\u0438 \u0432\u044b\u0447\u0438\u0441\u043b\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u0432. -message.installWizard.tooltip.addPrimaryStorage.name=\u0418\u043c\u044f \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. -message.installWizard.tooltip.addPrimaryStorage.path=(\u0434\u043b\u044f NFS) \u0412 NFS \u044d\u0442\u043e \u043f\u0443\u0442\u044c \u044d\u043a\u043f\u043e\u0440\u0442\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u041f\u0443\u0442\u044c (\u0434\u043b\u044f SharedMountPoint). \u0412 KVM \u044d\u0442\u043e \u043f\u0443\u0442\u044c \u0434\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u0443\u0437\u043b\u0430, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0443\u043a\u0430\u0437\u044b\u0432\u0430\u0435\u0442 \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u0438\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, "/mnt/primary". -message.installWizard.tooltip.addPrimaryStorage.server=(\u0434\u043b\u044f NFS, iSCSI \u0438\u043b\u0438 PreSetup) IP-\u0430\u0434\u0440\u0435\u0441 \u0438\u043b\u0438 \u0438\u043c\u044f DNS \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430. -message.installWizard.tooltip.addSecondaryStorage.nfsServer=IP-\u0430\u0434\u0440\u0435\u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 NFS, \u0433\u0434\u0435 \u043d\u0430\u0445\u043e\u0434\u0438\u0442\u0441\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 -message.installWizard.tooltip.addSecondaryStorage.path=\u041f\u0443\u0442\u044c \u044d\u043a\u0441\u043f\u043e\u0440\u0442\u0430, \u0440\u0430\u0441\u043f\u043e\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0439 \u043d\u0430 \u0432\u044b\u0448\u0435\u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. -message.installWizard.tooltip.addZone.dns1=\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0437\u0436\u0435. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0437\u043e\u043d\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS. -message.installWizard.tooltip.addZone.dns2=\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0432\u044b \u0434\u043e\u0431\u0430\u0432\u0438\u0442\u0435 \u043f\u043e\u0437\u0436\u0435. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0435 \u0432 \u0437\u043e\u043d\u0435, \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS. -message.installWizard.tooltip.addZone.internaldns1=\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c. \u0427\u0430\u0441\u0442\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0435\u043d\u0434\u0435, \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS. -message.installWizard.tooltip.addZone.internaldns2=\u042d\u0442\u043e c\u0435\u0440\u0432\u0435\u0440\u044b DNS \u0434\u043b\u044f \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0445 \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u042d\u0442\u0438 \u0441\u0435\u0440\u0432\u0435\u0440\u044b \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0447\u0435\u0440\u0435\u0437 \u0447\u0430\u0441\u0442\u043d\u044b\u0439 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u043e\u0439 \u0412\u041c. \u0427\u0430\u0441\u0442\u043d\u044b\u0439 IP-\u0430\u0434\u0440\u0435\u0441, \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u043d\u044b\u0439 \u0432 \u0441\u0442\u0435\u043d\u0434\u0435, \u0434\u043e\u043b\u0436\u0435\u043d \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u043a \u044d\u0442\u0438\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0430\u043c DNS. -message.installWizard.tooltip.addZone.name=\u0418\u043c\u044f \u0437\u043e\u043d\u044b -message.installWizard.tooltip.configureGuestTraffic.description=\u041e\u043f\u0438\u0441\u0430\u043d\u0438\u0435 \u044d\u0442\u043e\u0439 \u0441\u0435\u0442\u0438 -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (NIC) \u044d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 (CIDR) \u0441\u0442\u0435\u043d\u0434\u0430. -message.installWizard.tooltip.configureGuestTraffic.guestGateway=\u0428\u043b\u044e\u0437, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0433\u043e\u0441\u0442\u044f\u043c\u0438 -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=\u0421\u0435\u0442\u0435\u0432\u0430\u044f \u043c\u0430\u0441\u043a\u0430 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439. -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=\u0414\u0438\u0430\u043f\u0430\u0437\u043e\u043d IP-\u0430\u0434\u0440\u0435\u0441\u043e\u0432, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0431\u0443\u0434\u0443\u0442 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0433\u043e\u0441\u0442\u0435\u0439 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0440\u0438 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u0438 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u0435\u0442\u0435\u0432\u043e\u0433\u043e \u0443\u0441\u0442\u0440\u043e\u0439\u0441\u0442\u0432\u0430 (NIC) \u044d\u0442\u0438 \u0430\u0434\u0440\u0435\u0441\u0430 \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u0432 \u043f\u043e\u0434\u0441\u0435\u0442\u0438 (CIDR) \u0441\u0442\u0435\u043d\u0434\u0430. -message.installWizard.tooltip.configureGuestTraffic.name=\u0418\u043c\u044f \u0434\u043b\u044f \u0432\u0430\u0448\u0435\u0439 \u0441\u0435\u0442\u0438 -message.instanceWizard.noTemplates=\u0412\u044b \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435 \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0445 \u0448\u0430\u0431\u043b\u043e\u043d\u043e\u0432; \u0434\u043b\u044f \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u043a\u0430 \u043c\u0430\u0448\u0438\u043d\u044b \u0434\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u0432\u044b\u0439 \u0448\u0430\u0431\u043b\u043e\u043d. -message.ip.address.changed=\u0412\u0430\u0448\u0438 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u043c\u043e\u0433\u043b\u0438 \u0431\u044b\u0442\u044c \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u044b, \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u043f\u0438\u0441\u043e\u043a \u0430\u0434\u0440\u0435\u0441\u043e\u0432? \u041f\u043e\u043c\u043d\u0438\u0442\u0435, \u0447\u0442\u043e \u0432 \u044d\u0442\u043e\u043c \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0431\u043b\u0430\u0441\u0442\u044c \u0434\u0435\u0442\u0430\u043b\u0435\u0439 \u0431\u0443\u0434\u0435\u0442 \u0437\u0430\u043a\u0440\u044b\u0442\u0430. -message.iso.desc=\u041e\u0431\u0440\u0430\u0437 \u0434\u0438\u0441\u043a\u0430, \u0441\u043e\u0434\u0435\u0440\u0436\u0430\u0449\u0438\u0439 \u0434\u0430\u043d\u043d\u044b\u0435 \u0438\u043b\u0438 \u0437\u0430\u0433\u0440\u0443\u0437\u043e\u0447\u043d\u044b\u0439 \u043d\u043e\u0441\u0438\u0442\u0435\u043b\u044c \u0434\u043b\u044f \u041e\u0421 -message.join.project=\u0422\u0435\u043f\u0435\u0440\u044c \u0432\u044b \u043f\u0440\u0438\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u044b \u043a \u043f\u0440\u043e\u0435\u043a\u0442\u0443. \u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 "\u041f\u0440\u043e\u0441\u043c\u043e\u0442\u0440 \u043f\u0440\u043e\u0435\u043a\u0442\u0430". -message.launch.vm.on.private.network=\u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0432\u043e\u044e \u043c\u0430\u0448\u0438\u043d\u0443 \u0432 \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u043e\u0439 \u0412\u0430\u043c \u0447\u0430\u0441\u0442\u043d\u043e\u0439 \u0441\u0435\u0442\u0438? -message.launch.zone=\u0417\u043e\u043d\u0430 \u0433\u043e\u0442\u043e\u0432\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443, \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443. -message.listView.subselect.multi=(Ctrl/Cmd-click) -message.lock.account=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0437\u0430\u0431\u043b\u043e\u043a\u0438\u0440\u043e\u0432\u0430\u0442\u044c \u044d\u0442\u0443 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. \u0412\u0441\u0435 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u0438 \u0432 \u0442\u0430\u043a\u0438\u0445 \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u044f\u0445 \u043f\u043e\u0442\u0435\u0440\u044f\u044e\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0443\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0441\u0432\u043e\u0438\u043c\u0438 \u043e\u0431\u043b\u0430\u0447\u043d\u044b\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438. \u042d\u0442\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u044b \u043e\u0441\u0442\u0430\u043d\u0443\u0442\u0441\u044f \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b \u0434\u043b\u044f \u0434\u0440\u0443\u0433\u0438\u0445 \u0443\u0447\u0451\u0442\u043d\u044b\u0445 \u0437\u0430\u043f\u0438\u0441\u0435\u0439. -message.migrate.instance.confirm=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0443\u044e \u043c\u0430\u0448\u0438\u043d\u0443. -message.migrate.instance.to.host=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0439 \u0443\u0437\u0435\u043b. -message.migrate.instance.to.ps=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u043c\u0430\u0448\u0438\u043d\u0443 \u043d\u0430 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. -message.migrate.router.confirm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0440\u043e\u0443\u0442\u0435\u0440 \u0432 \u0443\u0437\u0435\u043b\: -message.migrate.systemvm.confirm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0412\u041c \u0432 \u0443\u0437\u0435\u043b -message.migrate.volume=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u043d\u0435\u0441\u0442\u0438 \u0434\u0438\u0441\u043a \u0432 \u0434\u0440\u0443\u0433\u043e\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435. -message.new.user=\u0412\u0432\u0435\u0434\u0438\u0442\u0435 \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044f \u0432 \u0443\u0447\u0451\u0442\u043d\u0443\u044e \u0437\u0430\u043f\u0438\u0441\u044c. -message.no.affinity.groups=\u0412\u044b \u043d\u0435 \u0438\u043c\u0435\u0435\u0442\u0435 affinity groups. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443. -message.no.network.support.configuration.not.true=\u0424\u0443\u043d\u043a\u0446\u0438\u043e\u043d\u0430\u043b security group \u043d\u0435 \u0430\u043a\u0442\u0438\u0432\u0438\u0440\u043e\u0432\u0430\u043d \u043d\u0438 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0437\u043e\u043d\u0435. \u041f\u043e\u044d\u0442\u043e\u043c\u0443 \u043e\u0442\u0441\u0443\u0442\u0441\u0442\u0432\u0443\u044e\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0441\u0435\u0442\u0435\u0432\u044b\u0435 \u0444\u0443\u043d\u043a\u0446\u0438\u0438. \u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0448\u0430\u0433\u0443 5. -message.no.network.support=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u044b\u0439 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440 (vSphere) \u043d\u0435 \u043e\u0431\u043b\u0430\u0434\u0430\u0435\u0442 \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u043c\u0438 \u0441\u0435\u0442\u0435\u0432\u044b\u043c\u0438 \u0432\u043e\u0437\u043c\u043e\u0434\u043d\u043e\u0441\u0442\u044f\u043c\u0438. \u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0448\u0430\u0433\u0443 5. -message.no.projects.adminOnly=\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.
\u041e\u0431\u0440\u0430\u0442\u0438\u0442\u0435\u0441\u044c \u043a \u0432\u0430\u0448\u0435\u043c\u0443 \u0430\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440\u0443 \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u0440\u043e\u0435\u043a\u0442\u0430. -message.no.projects=\u0423 \u0432\u0430\u0441 \u043d\u0435\u0442 \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432.
\u0421\u043e\u0437\u0434\u0430\u0439\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0435\u043a\u0442 \u0432 \u0441\u0435\u043a\u0446\u0438\u0438 "\u041f\u0440\u043e\u0435\u043a\u0442\u044b" -message.number.clusters=

\# of \u041a\u043b\u0430\u0441\u0442\u0435\u0440\u044b

-message.number.hosts=

\# of \u0423\u0437\u043b\u044b

-message.number.pods=

\# of \u0421\u0442\u0435\u043d\u0434\u044b

-message.number.storage=

\# of \u0422\u043e\u043c\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u0433\u043e \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0430

-message.number.zones=

\# of \u0417\u043e\u043d\u044b

-message.password.has.been.reset.to=\u041f\u0430\u0440\u043e\u043b\u044c \u0431\u044b\u043b \u0441\u0431\u0440\u043e\u0448\u0435\u043d \u0432 -message.pending.projects.1=\u0412 \u043e\u0436\u0438\u0434\u0430\u043d\u0438\u0438 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f\: -message.pending.projects.2=\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u043c\u043e\u0442\u0440\u0430 \u043f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0440\u0430\u0437\u0434\u0435\u043b \u043f\u0440\u043e\u0435\u043a\u0442\u043e\u0432, \u0434\u0430\u043b\u0435\u0435 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f \u0438\u0437 \u0432\u044b\u043f\u0430\u0434\u0430\u044e\u0449\u0435\u0433\u043e \u043c\u0435\u043d\u044e. -message.please.add.at.lease.one.traffic.range=\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0434\u043b\u044f \u0442\u0440\u0430\u0444\u0438\u043a\u0430 -message.please.proceed=\u041f\u0435\u0440\u0435\u0439\u0434\u0438\u0442\u0435 \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u0448\u0430\u0433\u0443 -message.please.select.a.configuration.for.your.zone=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u0432\u0430\u0448\u0435\u0439 \u0437\u043e\u043d\u044b -message.please.select.a.different.public.and.management.network.before.removing=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0434\u0440\u0443\u0433\u0443\u044e \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0438 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u044e\u0449\u0443\u044e \u0441\u0435\u0442\u044c \u043f\u0435\u0440\u0435\u0434 \u0443\u0434\u0430\u043b\u0435\u043d\u0438\u0435\u043c -message.please.select.networks=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0442\u0438 \u0434\u043b\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b -message.please.wait.while.zone.is.being.created=\u041f\u043e\u0434\u043e\u0436\u0434\u0438\u0442\u0435, \u0441\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f \u0437\u043e\u043d\u0430. \u042d\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0437\u0430\u043d\u044f\u0442\u044c \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u043e\u0435 \u0432\u0440\u0435\u043c\u044f... -message.project.invite.sent=\u041f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u0435 \u0431\u044b\u043b\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u043e \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e; \u043e\u043d \u0431\u0443\u0434\u0435\u0442 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d \u0432 \u043f\u0440\u043e\u0435\u043a\u0442 \u043f\u043e\u0441\u043b\u0435 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0436\u0434\u0435\u043d\u0438\u044f \u043f\u0440\u0438\u0433\u043b\u0430\u0448\u0435\u043d\u0438\u044f. -message.public.traffic.in.advanced.zone=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0412\u041c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 IP \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CloudStack UI \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f IP \u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f NAT, \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u043c\u044b\u0439 \u0434\u043b\u044f \u043e\u0431\u0449\u0435\u043d\u0438\u044f \u043c\u0435\u0436\u0434\u0443 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0442\u044c\u044e.

\u0423\u043a\u0430\u0436\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u0438\u043d \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0434\u043b\u044f \u0438\u043d\u0442\u0435\u0440\u043d\u0435\u0442-\u0442\u0440\u0430\u0444\u0438\u043a\u0430. -message.public.traffic.in.basic.zone=\u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0439 \u0442\u0440\u0430\u0444\u0438\u043a \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u043f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0412\u041c \u0434\u043e\u0441\u0442\u0443\u043f\u0430 \u043a \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442\u0443 \u0438\u043b\u0438 \u043f\u0440\u0438 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u0435\u043d\u0438\u0438 \u043a\u043b\u0438\u0435\u043d\u0442\u0430\u043c \u0441\u043b\u0443\u0436\u0431 \u0447\u0435\u0440\u0435\u0437 \u0418\u043d\u0442\u0435\u0440\u043d\u0435\u0442. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u043e \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0435 IP \u0434\u043e\u043b\u0436\u043d\u044b \u0431\u044b\u0442\u044c \u043e\u0431\u044f\u0437\u0430\u0442\u0435\u043b\u044c\u043d\u043e \u0432\u044b\u0434\u0435\u043b\u0435\u043d\u044b. \u041f\u0440\u0438 \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u0438 \u0412\u041c, \u0430\u0434\u0440\u0435\u0441 \u0438\u0437 \u0434\u0438\u0430\u043f\u0430\u0437\u043e\u043d\u0430 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0445 Ip \u043f\u0440\u0438\u0432\u044f\u0436\u0435\u0442\u0441\u044f \u043a \u043c\u0430\u0448\u0438\u043d\u0435 \u0432 \u0434\u043e\u043f\u043e\u043b\u043d\u0435\u043d\u0438\u0435 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0433\u043e \u0430\u0434\u0440\u0435\u0441\u0430 IP. \u0421\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438\u0439 1-1 NAT \u0434\u043e\u043b\u0436\u0435\u043d \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u0438 \u043d\u0430\u0441\u0442\u0440\u043e\u0438\u0442\u044c\u0441\u044f \u043d\u0430 \u0440\u0430\u0431\u043e\u0442\u0443 \u043c\u0435\u0436\u0434\u0443 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0438 \u0433\u043e\u0441\u0442\u0435\u0432\u043e\u0439 \u0441\u0435\u0442\u044c\u044e. \u041f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044c \u0442\u0430\u043a\u0436\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c CloudStack UI \u0434\u043b\u044f \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u044f \u0434\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0445 \u0430\u0434\u0440\u0435\u0441\u043e\u0432 \u0434\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0441\u0442\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0433\u043e NAT \u043c\u0435\u0436\u0434\u0443 \u043c\u0430\u0448\u0438\u043d\u0430\u043c\u0438 \u0438 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u043e\u0439 \u0441\u0435\u0442\u044c\u044e. -message.recover.vm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0432\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u044d\u0442\u0443 \u0412\u041c -message.redirecting.region=\u041f\u0435\u0440\u0435\u043d\u0430\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u0435 \u0432 \u0440\u0435\u0433\u0438\u043e\u043d -message.reinstall.vm=\u041f\u0440\u0438\u043c\u0435\u0447\u0430\u043d\u0438\u0435\: C\u043e\u0431\u043b\u044e\u0434\u0430\u0439\u0442\u0435 \u043e\u0441\u0442\u043e\u0440\u043e\u0436\u043d\u043e\u0441\u0442\u044c. \u0412\u041c \u0431\u0443\u0434\u0435\u0442 \u043f\u0435\u0440\u0435\u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u0430 \u0438\u0437 \u0448\u0430\u0431\u043b\u043e\u043d\u0430; \u0434\u0430\u043d\u043d\u044b\u0435 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u043d\u043e\u043c \u0434\u0438\u0441\u043a\u0435 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e\u0442\u0435\u0440\u044f\u043d\u044b. \u0414\u043e\u043f\u043e\u043b\u043d\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0435 \u0434\u0438\u0441\u043a\u0438, \u0435\u0441\u043b\u0438 \u0442\u0430\u043a\u043e\u0432\u044b\u0435 \u0438\u043c\u0435\u044e\u0442\u0441\u044f, \u043d\u0435 \u0431\u0443\u0434\u0443\u0442 \u0437\u0430\u0442\u0440\u043e\u043d\u0443\u0442\u044b. -message.remove.region=\u0412\u044b \u0443\u0432\u0435\u0440\u0435\u043d\u044b, \u0447\u0442\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 \u0440\u0435\u0433\u0438\u043e\u043d \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f? -message.remove.vpc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u0443\u0434\u0430\u043b\u0438\u0442\u044c \u044d\u0442\u043e\u0442 VPC -message.remove.vpn.access=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u043e\u0442\u043a\u043b\u044e\u0447\u0438\u0442\u044c VPN \u0434\u043e\u0441\u0442\u0443\u043f \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u0435\u043b\u044e. -message.reset.password.warning.notPasswordEnabled=\u0428\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u044d\u0442\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b \u0441\u043e\u0437\u0434\u0430\u043d \u0431\u0435\u0437 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f -message.reset.password.warning.notStopped=\u0414\u043b\u044f \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u043f\u0430\u0440\u043e\u043b\u044f \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -message.reset.VPN.connection=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0412\u044b \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u044d\u0442\u043e VPN \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435. -message.restart.mgmt.server=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440(\u044b) \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0434\u043b\u044f \u0442\u043e\u0433\u043e, \u0447\u0442\u043e\u0431\u044b \u0438\u0437\u043c\u0435\u043d\u0435\u043d\u0438\u044f \u0432\u0441\u0442\u0443\u043f\u0438\u043b\u0438 \u0432 \u0441\u0438\u043b\u0443. -message.restart.mgmt.usage.server=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440 \u0438 \u0441\u0435\u0440\u0432\u0435\u0440 \u0441\u0442\u0430\u0442\u0438\u0441\u0442\u0438\u043a\u0438 \u0434\u043b\u044f \u0432\u0441\u0442\u0443\u043f\u043b\u0435\u043d\u0438\u044f \u043d\u043e\u0432\u044b\u0445 \u043f\u0430\u0440\u0430\u043c\u0435\u0442\u0440\u043e\u0432 \u0432 \u0441\u0438\u043b\u0443. -message.restart.network=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0441\u0435\u0442\u044c. -message.restart.vpc=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0435\u0440\u0435\u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c VPC -message.security.group.usage=(\u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0439\u0442\u0435 Ctrl-click \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0432\u0441\u0435\u0445 \u043f\u0440\u0438\u043c\u0435\u043d\u0438\u043c\u044b\u0445 security groups) -message.select.affinity.groups=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043b\u044e\u0431\u044b\u0435 affinity groups, \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043f\u0440\u0438\u043d\u0430\u0434\u043b\u0435\u0436\u0438\u0442 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430\: -message.select.a.zone=\u0417\u043e\u043d\u0430 \u043e\u0431\u044b\u0447\u043d\u043e \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0435\u0434\u0438\u043d\u0438\u0447\u043d\u043e\u043c\u0443 \u0446\u0435\u043d\u0442\u0440\u0443 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u0430\u043d\u043d\u044b\u0445. \u041d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0437\u043e\u043d \u043f\u043e\u043c\u043e\u0433\u0430\u044e\u0442 \u0441\u043e\u0437\u0434\u0430\u0432\u0430\u0442\u044c \u0431\u043e\u043b\u0435\u0435 \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0435 \u043e\u0431\u043b\u0430\u043a\u0430, \u043e\u0431\u0435\u0441\u043f\u0435\u0447\u0438\u0432\u0430\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0438\u0437\u043e\u043b\u044f\u0446\u0438\u044e \u0438 \u0438\u0437\u0431\u044b\u0442\u043e\u0447\u043d\u043e\u0441\u0442\u044c. -message.select.instance=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0440\u0432\u0435\u0440. -message.select.iso=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0431\u0440\u0430\u0437 ISO \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0412\u041c -message.select.item=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u044d\u043b\u0435\u043c\u0435\u043d\u0442 -message.select.security.groups=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0433\u0440\u0443\u043f\u043f\u0443(\u044b) \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0412\u041c -message.select.template=\u0412\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u043d\u043e\u0432\u043e\u0439 \u0412\u041c -message.setup.physical.network.during.zone.creation.basic=\u041f\u0440\u0438 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0432 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0437\u043e\u043d\u0443, \u0432\u044b \u043c\u043e\u0436\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u043e\u0434\u043d\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c, \u043a\u043e\u0442\u043e\u0440\u0430\u044f \u0441\u043e\u043e\u0442\u0432\u0435\u0441\u0442\u0432\u0443\u0435\u0442 NIC \u043d\u0430 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440. \u0421\u0435\u0442\u044c \u043e\u0441\u0443\u0449\u0435\u0441\u0442\u0432\u043b\u044f\u0435\u0442 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430.

\u0412\u044b \u043c\u043e\u0436\u0435\u0442\u0435 \u0442\u0430\u043a\u0436\u0435 \u043f\u0435\u0440\u0435\u0442\u0430\u0441\u043a\u0438\u0432\u0430\u0442\u044c drag and drop \u0434\u0440\u0443\u0433\u0438\u0435 \u0442\u0438\u043f\u044b \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043d\u0430 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0435 \u0441\u0435\u0442\u0438. -message.setup.physical.network.during.zone.creation=\u0412\u043e \u0432\u0440\u0435\u043c\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0439 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0438 \u0437\u043e\u043d\u044b, \u0432\u0430\u043c \u043d\u0435\u043e\u0431\u0445\u043e\u0434\u0438\u043c\u043e \u0443\u043a\u0430\u0437\u0430\u0442\u044c \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0438\u0445 \u0441\u0435\u0442\u0435\u0439. \u041a\u0430\u0436\u0434\u0430\u044f \u0441\u0435\u0442\u044c \u0441\u043e\u043e\u0442\u0432\u0435\u0442\u0441\u0442\u0432\u0443\u0435\u0442 \u0441\u0435\u0442\u0435\u0432\u043e\u043c\u0443 \u0438\u043d\u0442\u0435\u0440\u0444\u0435\u0439\u0441\u0443 \u0433\u0438\u043f\u0435\u0440\u0432\u0438\u0437\u043e\u0440\u0430. \u041a\u0430\u043a\u0436\u0434\u0430\u044f \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u0441\u0435\u0442\u044c \u043c\u043e\u0436\u0435\u0442 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c\u0441\u044f \u0434\u043b\u044f \u043e\u0434\u043d\u043e\u0433\u043e \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u0438\u0445 \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u0441 \u043d\u0435\u043a\u043e\u0442\u043e\u0440\u044b\u043c\u0438 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u044f\u043c\u0438 \u043f\u0440\u0438 \u043e\u0431\u044a\u0435\u0434\u0438\u043d\u0435\u043d\u0438\u0438 \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430.

\u041f\u0435\u0440\u0435\u0442\u0430\u0449\u0438\u0442\u0435 \u043e\u0434\u0438\u043d \u0438\u043b\u0438 \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0432\u0438\u0434\u043e\u0432 \u0442\u0440\u0430\u0444\u0438\u043a\u0430 \u043a \u043a\u0430\u0436\u0434\u043e\u0439 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u0441\u0435\u0442\u0438. -message.setup.successful=\u041d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430 \u043e\u0431\u043b\u0430\u043a\u0430 \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0430\! -message.specify.url=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u0443\u043a\u0430\u0436\u0438\u0442\u0435 URL -message.step.1.continue=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0438\u043b\u0438 ISO \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f. -message.step.1.desc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u043d\u043e\u0432\u043e\u0439 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b. \u0412\u044b \u0442\u0430\u043a \u0436\u0435 \u043c\u043e\u0436\u0435\u0442\u0435 \u0432\u044b\u0431\u0440\u0430\u0442\u044c \u043f\u0443\u0441\u0442\u043e\u0439 \u0448\u0430\u0431\u043b\u043e\u043d \u0434\u043b\u044f \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u043a\u0438 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0438\u0437 \u043e\u0431\u0440\u0430\u0437\u0430 ISO. -message.step.2.continue=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0443\u0441\u043b\u0443\u0433\u0443 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f -message.step.3.continue=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0440\u0430\u0437\u043c\u0435\u0440 \u0434\u0438\u0441\u043a\u0430 \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f -message.step.4.continue=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u0441\u0435\u0442\u044c \u0434\u043b\u044f \u043f\u0440\u043e\u0434\u043e\u043b\u0436\u0435\u043d\u0438\u044f. -message.step.4.desc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043e\u0441\u043d\u043e\u0432\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u043a \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0430 \u0412\u0430\u0448\u0430 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u043c\u0430\u0448\u0438\u043d\u0430. -message.storage.traffic=\u0422\u0440\u0430\u0444\u0438\u043a \u043c\u0435\u0436\u0434\u0443 \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u043c\u0438 \u0440\u0435\u0441\u0443\u0440\u0441\u0430\u043c\u0438 CloudStack, \u0432\u043a\u043b\u044e\u0447\u0430\u044f \u0432\u0441\u0435 \u043a\u043e\u043c\u043f\u043e\u043d\u0435\u043d\u0442\u044b, \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0432\u0437\u0430\u0438\u043c\u043e\u0434\u0435\u0439\u0441\u0442\u0432\u0443\u044e\u0442 \u0441 \u0441\u0435\u0440\u0432\u0435\u0440\u043e\u043c \u0443\u043f\u0440\u0430\u0432\u043b\u0435\u043d\u0438\u044f, \u0442\u0430\u043a\u0438\u0435 \u043a\u0430\u043a \u0443\u0437\u043b\u044b \u0438 CloudStack \u0441\u0438\u0441\u0442\u0435\u043c\u043d\u044b\u0435 \u0412\u041c. \u041d\u0430\u0441\u0442\u0440\u043e\u0439\u0442\u0435 \u0442\u0440\u0430\u0444\u0438\u043a \u0445\u0440\u0430\u043d\u0435\u043d\u0438\u044f \u0437\u0434\u0435\u0441\u044c. -message.suspend.project=\u0412\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043f\u0440\u043e\u0435\u043a\u0442? -message.template.desc=\u041e\u0431\u0440\u0430\u0437 \u041e\u0421, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u043c\u043e\u0436\u043d\u043e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0432 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0433\u0440\u0443\u0436\u0430\u0435\u043c\u043e\u0439 \u0432 \u0412\u041c -message.tooltip.dns.1=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. -message.tooltip.dns.2=\u0418\u043c\u044f \u0432\u0442\u043e\u0440\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0412\u041c \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u041f\u0443\u0431\u043b\u0438\u0447\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. -message.tooltip.internal.dns.1=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0412\u041c CloudStack \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u0427\u0430\u0441\u0442\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. -message.tooltip.internal.dns.2=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 DNS \u0434\u043b\u044f \u0432\u043d\u0443\u0442\u0440\u0435\u043d\u043d\u0438\u0445 \u0412\u041c CloudStack \u044d\u0442\u043e\u0439 \u0437\u043e\u043d\u044b. \u0427\u0430\u0441\u0442\u043d\u044b\u0435 IP-\u0430\u0434\u0440\u0435\u0441\u0430 \u0441\u0442\u0435\u043d\u0434\u043e\u0432 \u0434\u043e\u043b\u0436\u043d\u044b \u0438\u043c\u0435\u0442\u044c \u043c\u0430\u0440\u0448\u0440\u0443\u0442 \u0434\u043e \u044d\u0442\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. -message.tooltip.network.domain=\u0421\u0443\u0444\u0444\u0438\u043a\u0441 DNS \u0434\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u0441\u043e\u0431\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0433\u043e \u0434\u043e\u043c\u0435\u043d\u043d\u043e\u0433\u043e \u0438\u043c\u0435\u043d\u0438 \u0441\u0435\u0442\u0438, \u0434\u043e\u0441\u0442\u0443\u043f\u043d\u044b\u0439 \u0433\u043e\u0441\u0442\u0435\u0432\u044b\u043c\u0438 \u0412\u041c. -message.tooltip.pod.name=\u0418\u043c\u044f \u0434\u043b\u044f \u0441\u0442\u0435\u043d\u0434\u0430 -message.tooltip.reserved.system.gateway=\u0428\u043b\u044e\u0437 \u0434\u043b\u044f \u0443\u0437\u043b\u043e\u0432 \u044d\u0442\u043e\u0433\u043e \u0441\u0442\u0435\u043d\u0434\u0430 -message.tooltip.reserved.system.netmask=\u041f\u0440\u0435\u0444\u0438\u043a\u0441 \u0441\u0435\u0442\u0438, \u043e\u043f\u0440\u0435\u0434\u0435\u043b\u044f\u044e\u0449\u0438\u0439 \u043f\u043e\u0434\u0441\u0435\u0442\u044c \u0441\u0442\u0435\u043d\u0434\u0430. \u0418\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u043e\u0431\u043e\u0437\u043d\u0430\u0447\u0435\u043d\u0438\u0435 CIDR. -message.tooltip.zone.name=\u0418\u043c\u044f \u0434\u043b\u044f \u0437\u043e\u043d\u044b -message.update.os.preference=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u043f\u0440\u0435\u0434\u043f\u043e\u0447\u0442\u0438\u0442\u0435\u043b\u044c\u043d\u0443\u044e \u041e\u0421 \u0434\u043b\u044f \u0434\u0430\u043d\u043d\u043e\u0433\u043e \u0441\u0435\u0440\u0432\u0435\u0440\u0430. \u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u043c\u0430\u0448\u0438\u043d\u044b \u0441 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u043e\u0439 \u041e\u0421 \u0431\u0443\u0434\u0443\u0442 \u043f\u043e \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u0438 \u0438\u0437\u043d\u0430\u0447\u0430\u043b\u044c\u043d\u043e \u0437\u0430\u043f\u0443\u0441\u043a\u0430\u0442\u044c\u0441\u044f \u043d\u0430 \u044d\u0442\u043e\u043c \u0441\u0435\u0440\u0432\u0435\u0440\u0435. -message.update.resource.count=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u043e\u0431\u043d\u043e\u0432\u0438\u0442\u044c \u0441\u0447\u0435\u0442\u0447\u0438\u043a \u0440\u0435\u0441\u0443\u0440\u0441\u043e\u0432 \u0434\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u0430\u043a\u043a\u0430\u0443\u043d\u0442\u0430. -message.update.ssl=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u043f\u0440\u0435\u0434\u043e\u0441\u0442\u0432\u044c\u0442\u0435 \u043d\u043e\u0432\u044b\u0439 X.509 \u0441\u043e\u0432\u043c\u0435\u0441\u0442\u0438\u043c\u044b\u0439 SSL \u0441\u0435\u0440\u0442\u0438\u0444\u0438\u043a\u0430\u0442 \u0434\u043b\u044f \u043e\u0431\u043d\u043e\u0432\u043b\u0435\u043d\u0438\u044f \u043d\u0430 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u044b\u0445 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0445 \u043c\u0430\u0448\u0438\u043d\u0430\u0445, \u043e\u0442\u0432\u0435\u0447\u0430\u044e\u0449\u0438\u0445 \u0437\u0430 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u0441\u0442\u0443\u043f\: -message.validate.instance.name=\u0418\u043c\u044f \u0441\u0435\u0440\u0432\u0435\u0440\u0430 \u043d\u0435 \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u0434\u043b\u0438\u043d\u0435\u0435 63 \u0441\u0438\u043c\u0432\u043e\u043b\u0430. \u0422\u043e\u043b\u044c\u043a\u043e ASCII, \u0431\u0443\u043a\u0432\u044b a~z, A~Z, \u0446\u044b\u0444\u0440\u044b 0~9, \u0434\u0435\u0444\u0438\u0441 \u043d\u0435 \u0434\u043e\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f. \u0414\u043e\u043b\u0436\u043d\u0430 \u043d\u0430\u0447\u0438\u043d\u0430\u0442\u044c\u0441\u044f \u0441 \u0431\u0443\u043a\u0432\u044b \u0438 \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0442\u044c\u0441\u044f \u0431\u0443\u043a\u0432\u043e\u0439 \u0438\u043b\u0438 \u0446\u0438\u0444\u0440\u043e\u0439. -message.validate.invalid.characters=\u041d\u0430\u0439\u0434\u0435\u043d\u044b \u043d\u0435\u0434\u043e\u043f\u0443\u0441\u0442\u0438\u043c\u044b\u0435 \u0441\u0438\u043c\u0432\u043e\u043b\u044b; \u043f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430, \u043f\u043e\u043f\u0440\u0430\u0432\u044c\u0442\u0435. -message.virtual.network.desc=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u043d\u0430\u044f \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u0443\u0447\u0435\u0442\u043d\u043e\u0439 \u0437\u0430\u043f\u0438\u0441\u0438 \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u0430\u044f \u0441\u0435\u0442\u044c. \u0428\u0438\u0440\u043e\u043a\u043e\u0432\u0435\u0449\u0430\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0434\u043e\u043c\u0435\u043d \u0412\u0430\u0448\u0435\u0433\u043e VLAN \u0438 \u0434\u043e\u0441\u0442\u0443\u043f \u0432 \u043f\u0443\u0431\u043b\u0438\u0447\u043d\u0443\u044e \u0441\u0435\u0442\u044c \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f \u0432\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u0430\u0440\u0448\u0440\u0443\u0442\u0438\u0437\u0430\u0442\u043e\u0440\u043e\u043c. -message.vm.create.template.confirm=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0448\u0430\u0431\u043b\u043e\u043d\u0430 \u043f\u0440\u0438\u0432\u0435\u0434\u0435\u0442 \u043a \u0430\u0432\u0442\u043e\u043c\u0430\u0442\u0438\u0447\u0435\u0441\u043a\u043e\u0439 \u043f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u043a\u0435 \u0432\u0438\u0440\u0443\u0430\u043b\u044c\u043d\u043e\u0439 \u043c\u0430\u0448\u0438\u043d\u044b -message.vm.review.launch=\u041f\u0440\u043e\u0432\u0435\u0440\u044c\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0438 \u0443\u0434\u043e\u0441\u0442\u043e\u0432\u0435\u0440\u044c\u0442\u0435\u0441\u044c \u0432 \u0442\u043e\u043c, \u0447\u0442\u043e \u0432\u0430\u0448\u0430 \u043c\u0430\u0448\u0438\u043d\u0430 \u043d\u0430\u0441\u0442\u0440\u043e\u0435\u043d\u0430 \u043f\u0440\u0430\u0432\u0438\u043b\u044c\u043d\u043e. -message.volume.create.template.confirm=\u041f\u043e\u0434\u0442\u0432\u0435\u0440\u0434\u0438\u0442\u0435, \u0447\u0442\u043e \u0432\u044b \u0434\u0435\u0439\u0441\u0442\u0432\u0438\u0442\u0435\u043b\u044c\u043d\u043e \u0445\u043e\u0442\u0438\u0442\u0435 \u0441\u043e\u0437\u0434\u0430\u0442\u044c \u0448\u0430\u0431\u043b\u043e\u043d \u044d\u0442\u043e\u0433\u043e \u0442\u043e\u043c\u0430. \u042d\u0442\u043e \u043f\u0440\u043e\u0446\u0435\u0441\u0441 \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u043e\u0434\u043b\u0438\u0442\u044c\u0441\u044f \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u043c\u0438\u043d\u0443\u0442 \u0432 \u0437\u0430\u0432\u0438\u0441\u0438\u043c\u043e\u0441\u0442\u0438 \u043e\u0442 \u0440\u0430\u0437\u043c\u0435\u0440\u0430 \u0442\u043e\u043c\u0430. -message.you.must.have.at.least.one.physical.network=\u0414\u043e\u0431\u0430\u0432\u044c\u0442\u0435 \u043a\u0430\u043a \u043c\u0438\u043d\u0438\u043c\u0443\u043c \u043e\u0434\u043d\u0443 \u0444\u0438\u0437\u0438\u0447\u0435\u0441\u043a\u0443\u044e \u0441\u0435\u0442\u044c -message.Zone.creation.complete=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e -message.zone.creation.complete.would.you.like.to.enable.this.zone=\u0421\u043e\u0437\u0434\u0430\u043d\u0438\u0435 \u0437\u043e\u043d\u044b \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e. \u0425\u043e\u0442\u0438\u0442\u0435 \u0432\u043a\u043b\u044e\u0447\u0438\u0442\u044c \u044d\u0442\u0443 \u0437\u043e\u043d\u0443? -message.zone.no.network.selection=\u0412\u044b\u0431\u0440\u0430\u043d\u043d\u0430\u044f \u0437\u043e\u043d\u0430 \u043d\u0435 \u0438\u043c\u0435\u0435\u0442 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u043e\u0432 \u0434\u043b\u044f \u0432\u044b\u0431\u043e\u0440\u0430 \u0441\u0435\u0442\u0438. -message.zone.step.1.desc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u044b\u0431\u0435\u0440\u0438\u0442\u0435 \u0441\u0435\u0442\u0435\u0432\u0443\u044e \u043c\u043e\u0434\u0435\u043b\u044c \u0434\u043b\u044f \u0412\u0430\u0448\u0435\u0439 \u0437\u043e\u043d\u044b. -message.zone.step.2.desc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u043e\u043d\u044b -message.zone.step.3.desc=\u041f\u043e\u0436\u0430\u043b\u0443\u0439\u0441\u0442\u0430 \u0432\u0432\u0435\u0434\u0438\u0442\u0435 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u044e \u0434\u043b\u044f \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0421\u0442\u0435\u043d\u0434\u0430 -mode=\u0420\u0435\u0436\u0438\u043c -network.rate=\u0421\u043a\u043e\u0440\u043e\u0441\u0442\u044c \u0441\u0435\u0442\u0438 -notification.reboot.instance=\u041f\u0435\u0440\u0435\u0437\u0430\u0433\u0440\u0443\u0437\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -notification.start.instance=\u0417\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -notification.stop.instance=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c \u043c\u0430\u0448\u0438\u043d\u0443 -side.by.side=\u0411\u043e\u043a-\u043e-\u0411\u043e\u043a -state.Accepted=\u041f\u0440\u0438\u043d\u044f\u0442\u043e -state.Active=\u0412\u043a\u043b\u044e\u0447\u0435\u043d -state.Allocated=\u0420\u0430\u0441\u043f\u0440\u0435\u0434\u0435\u043b\u0435\u043d\u043e -state.Allocating=\u0412\u044b\u0434\u0435\u043b\u0435\u043d\u0438\u0435 -state.BackedUp=\u0417\u0430\u0440\u0435\u0437\u0435\u0440\u0432\u0438\u0440\u043e\u0432\u0430\u043d\u043e -state.BackingUp=\u0420\u0435\u0437\u0435\u0440\u0432\u043d\u043e\u0435 \u043a\u043e\u043f\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 -state.Completed=\u0417\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u043e -state.Creating=\u0421\u043e\u0437\u0434\u0430\u0435\u0442\u0441\u044f -state.Declined=\u041e\u0442\u043a\u043b\u043e\u043d\u0435\u043d\u043e -state.Destroyed=\u0423\u043d\u0438\u0447\u0442\u043e\u0436\u0435\u043d\u043e -state.detached=\u041e\u0442\u0441\u043e\u0435\u0434\u0438\u043d\u0435\u043d\u043e -state.Disabled=\u0412\u044b\u043a\u043b\u044e\u0447\u0435\u043d\u043e -state.Enabled=\u0412\u043a\u043b\u044e\u0447\u0435\u043d\u043e -state.Error=\u041e\u0448\u0438\u0431\u043a\u0430 -state.Expunging=\u0423\u0434\u0430\u043b\u0451\u043d -state.Migrating=\u041c\u0438\u0433\u0440\u0430\u0446\u0438\u044f -state.Pending=\u041e\u0436\u0438\u0434\u0430\u0435\u0442\u0441\u044f -state.Ready=\u0413\u043e\u0442\u043e\u0432 -state.Running=\u0417\u0430\u043f\u0443\u0449\u0435\u043d\u043e -state.Starting=\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u0442\u0441\u044f -state.Stopped=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e -state.Stopping=\u041e\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u0442\u044c -state.Suspended=\u041f\u0440\u0438\u043e\u0441\u0442\u0430\u043d\u043e\u0432\u043b\u0435\u043d\u043e -ui.listView.filters.all=\u0412\u0441\u0435 -ui.listView.filters.mine=\u041c\u043e\u0438 diff --git a/client/WEB-INF/classes/resources/messages_zh_CN.properties b/client/WEB-INF/classes/resources/messages_zh_CN.properties deleted file mode 100644 index 7b2419b7bc83..000000000000 --- a/client/WEB-INF/classes/resources/messages_zh_CN.properties +++ /dev/null @@ -1,2194 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -changed.item.properties=\u66f4\u6539\u9879\u76ee\u5c5e\u6027 -confirm.enable.s3=\u8bf7\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u542f\u7528\u5bf9 S3 \u652f\u6301\u7684\u4e8c\u7ea7\u5b58\u50a8\u7684\u652f\u6301 -confirm.enable.swift=\u8bf7\u586b\u5199\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u542f\u7528\u5bf9 SWIFT \u7684\u652f\u6301 -error.could.not.change.your.password.because.ldap.is.enabled=\u9519\u8bef\u3002LDAP \u5904\u4e8e\u542f\u7528\u72b6\u6001\uff0c\u65e0\u6cd5\u66f4\u6539\u60a8\u7684\u5bc6\u7801\u3002 -error.could.not.enable.zone=\u65e0\u6cd5\u542f\u7528\u8d44\u6e90\u57df -error.installWizard.message=\u51fa\u73b0\u95ee\u9898\uff1b\u8bf7\u8fd4\u56de\u5e76\u66f4\u6b63\u4efb\u4f55\u9519\u8bef -error.invalid.username.password=\u7528\u6237\u540d\u6216\u5bc6\u7801\u65e0\u6548 -error.login=\u60a8\u7684\u7528\u6237\u540d/\u5bc6\u7801\u4e0e\u6211\u4eec\u7684\u8bb0\u5f55\u4e0d\u4e00\u81f4\u3002 -error.menu.select=\u6b63\u5728\u9009\u62e9\u9879\u76ee\uff0c\u65e0\u6cd5\u6267\u884c\u64cd\u4f5c\u3002 -error.mgmt.server.inaccessible=\u65e0\u6cd5\u8bbf\u95ee\u7ba1\u7406\u670d\u52a1\u5668\u3002\u8bf7\u7a0d\u540e\u518d\u8bd5\u3002 -error.password.not.match=\u5bc6\u7801\u5b57\u6bb5\u4e0d\u4e00\u81f4 -error.please.specify.physical.network.tags=\u7f51\u7edc\u65b9\u6848\u5728\u60a8\u4e3a\u6b64\u7269\u7406\u7f51\u7edc\u6307\u5b9a\u6807\u7b7e\u4e4b\u540e\u624d\u53ef\u7528\u3002 -error.session.expired=\u60a8\u7684\u4f1a\u8bdd\u5df2\u8fc7\u671f\u3002 -error.something.went.wrong.please.correct.the.following=\u51fa\u73b0\u95ee\u9898\uff1b\u8bf7\u66f4\u6b63\u4ee5\u4e0b\u5404\u9879 -error.unable.to.reach.management.server=\u65e0\u6cd5\u8bbf\u95ee\u7ba1\u7406\u670d\u52a1\u5668 -error.unresolved.internet.name=\u65e0\u6cd5\u89e3\u6790\u60a8\u7684 Internet \u540d\u79f0\u3002 -force.delete.domain.warning=\u8b66\u544a\: \u9009\u62e9\u6b64\u9009\u9879\u5c06\u5bfc\u81f4\u5220\u9664\u6240\u6709\u5b50\u57df\u4ee5\u53ca\u6240\u6709\u76f8\u5173\u8054\u7684\u5e10\u6237\u53ca\u5176\u8d44\u6e90\u3002 -force.delete=\u5f3a\u5236\u5220\u9664 -force.remove.host.warning=\u8b66\u544a\: \u9009\u62e9\u6b64\u9009\u9879\u5c06\u5bfc\u81f4 CloudStack \u5728\u4ece\u7fa4\u96c6\u4e2d\u79fb\u9664\u6b64\u4e3b\u673a\u4e4b\u524d\uff0c\u5f3a\u5236\u505c\u6b62\u6240\u6709\u6b63\u5728\u8fd0\u884c\u7684\u865a\u62df\u673a\u3002 -force.remove=\u5f3a\u5236\u79fb\u9664 -force.stop.instance.warning=\u8b66\u544a\: \u9664\u975e\u4e07\u4e0d\u5f97\u5df2\uff0c\u5426\u5219\u4e0d\u5e94\u5f3a\u5236\u505c\u6b62\u6b64\u5b9e\u4f8b\u3002\u505c\u6b62\u6b64\u5b9e\u4f8b\u53ef\u80fd\u4f1a\u5bfc\u81f4\u6570\u636e\u4e22\u5931\u4ee5\u53ca\u81f4\u4f7f\u865a\u62df\u673a\u72b6\u6001\u4e0d\u4e00\u81f4\u3002 -force.stop=\u5f3a\u5236\u505c\u6b62 -hint.no.host.tags=\u672a\u627e\u5230\u4e3b\u673a\u6807\u7b7e -hint.no.storage.tags=\u672a\u627e\u5230\u5b58\u50a8\u6807\u7b7e -hint.type.part.host.tag=\u4e3b\u673a\u6807\u7b7e\u7c7b\u578b -hint.type.part.storage.tag=\u5b58\u50a8\u6807\u8bb0\u7c7b\u578b -ICMP.code=ICMP \u4ee3\u7801 -ICMP.type=ICMP \u7c7b\u578b -image.directory=\u56fe\u7247\u76ee\u5f55 -inline=\u5185\u8054 -instances.actions.reboot.label=\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b -label.about.app=\u5173\u4e8e CloudStack -label.about=\u5173\u4e8e -label.accept.project.invitation=\u63a5\u53d7\u9879\u76ee\u9080\u8bf7 -label.account.and.security.group=\u5e10\u6237\u3001\u5b89\u5168\u7ec4 -label.account.details=\u8d26\u53f7\u8be6\u60c5 -label.account.id=\u5e10\u6237 ID -label.account.lower=\u5e10\u6237 -label.account.name=\u5e10\u6237\u540d\u79f0 -label.account.specific=\u5e10\u6237\u4e13\u7528 -label.accounts=\u5e10\u6237 -label.account.type=\u5e10\u53f7\u7c7b\u578b -label.account=\u5e10\u6237 -label.acl=ACL -label.acl.id=ACL ID -label.acl.list.rules=ACL\u5217\u8868\u7b56\u7565 -label.acl.name=ACL \u540d\u79f0 -label.acl.replaced=ACL \u5df2\u66ff\u6362 -label.acquire.new.ip=\u83b7\u53d6\u65b0 IP -label.acquire.new.secondary.ip=\u83b7\u53d6\u65b0\u4e8c\u7ea7 IP -label.action.attach.disk.processing=\u6b63\u5728\u9644\u52a0\u78c1\u76d8... -label.action.attach.disk=\u9644\u52a0\u78c1\u76d8 -label.action.attach.iso.processing=\u6b63\u5728\u9644\u52a0 ISO... -label.action.attach.iso=\u9644\u52a0 ISO -label.action.cancel.maintenance.mode.processing=\u6b63\u5728\u53d6\u6d88\u7ef4\u62a4\u6a21\u5f0f... -label.action.cancel.maintenance.mode=\u53d6\u6d88\u7ef4\u62a4\u6a21\u5f0f -label.action.change.password=\u66f4\u6539\u5bc6\u7801 -label.action.change.service.processing=\u6b63\u5728\u66f4\u6539\u670d\u52a1... -label.action.change.service=\u66f4\u6539\u670d\u52a1 -label.action.configure.samlauthorization=\u914d\u7f6e SAML SSO \u8ba4\u8bc1 -label.action.copy.ISO.processing=\u6b63\u5728\u590d\u5236ISO\u955c\u50cf -label.action.copy.ISO=\u590d\u5236 ISO -label.action.copy.template.processing=\u6b63\u5728\u590d\u5236\u6a21\u677f -label.action.copy.template=\u590d\u5236\u6a21\u677f -label.action.create.template.from.vm=\u57fa\u4e8e VM \u521b\u5efa\u6a21\u677f -label.action.create.template.from.volume=\u57fa\u4e8e\u5377\u521b\u5efa\u6a21\u677f -label.action.create.template.processing=\u6b63\u5728\u521b\u5efa\u6a21\u677f... -label.action.create.template=\u521b\u5efa\u6a21\u677f -label.action.create.vm.processing=\u6b63\u5728\u521b\u5efa VM... -label.action.create.vm=\u521b\u5efa VM -label.action.create.volume.processing=\u6b63\u5728\u521b\u5efa\u5377... -label.action.create.volume=\u521b\u5efa\u5377 -label.action.delete.account.processing=\u6b63\u5728\u5220\u9664\u5e10\u6237... -label.action.delete.account=\u5220\u9664\u5e10\u6237 -label.action.delete.cluster.processing=\u6b63\u5728\u5220\u9664\u7fa4\u96c6... -label.action.delete.cluster=\u5220\u9664\u7fa4\u96c6 -label.action.delete.disk.offering.processing=\u6b63\u5728\u5220\u9664\u78c1\u76d8\u65b9\u6848... -label.action.delete.disk.offering=\u5220\u9664\u78c1\u76d8\u65b9\u6848 -label.action.delete.domain.processing=\u6b63\u5728\u5220\u9664\u57df... -label.action.delete.domain=\u5220\u9664\u57df -label.action.delete.firewall.processing=\u6b63\u5728\u5220\u9664\u9632\u706b\u5899... -label.action.delete.firewall=\u5220\u9664\u9632\u706b\u5899\u89c4\u5219 -label.action.delete.ingress.rule.processing=\u6b63\u5728\u5220\u9664\u5165\u53e3\u89c4\u5219... -label.action.delete.ingress.rule=\u5220\u9664\u5165\u53e3\u89c4\u5219 -label.action.delete.IP.range.processing=\u6b63\u5728\u5220\u9664 IP \u8303\u56f4... -label.action.delete.IP.range=\u5220\u9664 IP \u8303\u56f4 -label.action.delete.ISO.processing=\u6b63\u5728\u5220\u9664 ISO... -label.action.delete.ISO=\u5220\u9664 ISO -label.action.delete.load.balancer.processing=\u6b63\u5728\u5220\u9664\u8d1f\u8f7d\u5e73\u8861\u5668... -label.action.delete.load.balancer=\u5220\u9664\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219 -label.action.delete.network.processing=\u6b63\u5728\u5220\u9664\u7f51\u7edc... -label.action.delete.network=\u5220\u9664\u7f51\u7edc -label.action.delete.nexusVswitch=\u5220\u9664 Nexus 1000v -label.action.delete.nic=\u79fb\u9664 NIC -label.action.delete.physical.network=\u5220\u9664\u7269\u7406\u7f51\u7edc -label.action.delete.pod.processing=\u6b63\u5728\u5220\u9664\u63d0\u4f9b\u70b9... -label.action.delete.pod=\u5220\u9664\u63d0\u4f9b\u70b9 -label.action.delete.primary.storage.processing=\u6b63\u5728\u5220\u9664\u4e3b\u5b58\u50a8... -label.action.delete.primary.storage=\u5220\u9664\u4e3b\u5b58\u50a8 -label.action.delete.secondary.storage.processing=\u6b63\u5728\u5220\u9664\u4e8c\u7ea7\u5b58\u50a8... -label.action.delete.secondary.storage=\u5220\u9664\u4e8c\u7ea7\u5b58\u50a8 -label.action.delete.security.group.processing=\u6b63\u5728\u5220\u9664\u5b89\u5168\u7ec4... -label.action.delete.security.group=\u5220\u9664\u5b89\u5168\u7ec4 -label.action.delete.service.offering.processing=\u6b63\u5728\u5220\u9664\u670d\u52a1\u65b9\u6848... -label.action.delete.service.offering=\u5220\u9664\u670d\u52a1\u65b9\u6848 -label.action.delete.snapshot.processing=\u6b63\u5728\u5220\u9664\u5feb\u7167... -label.action.delete.snapshot=\u5220\u9664\u5feb\u7167 -label.action.delete.system.service.offering=\u5220\u9664\u7cfb\u7edf\u670d\u52a1\u65b9\u6848 -label.action.delete.template.processing=\u6b63\u5728\u5220\u9664\u6a21\u677f... -label.action.delete.template=\u5220\u9664\u6a21\u677f -label.action.delete.user.processing=\u6b63\u5728\u5220\u9664\u7528\u6237... -label.action.delete.user=\u5220\u9664\u7528\u6237 -label.action.delete.volume.processing=\u6b63\u5728\u5220\u9664\u5377... -label.action.delete.volume=\u5220\u9664\u5377 -label.action.delete.zone.processing=\u6b63\u5728\u5220\u9664\u8d44\u6e90\u57df... -label.action.delete.zone=\u5220\u9664\u8d44\u6e90\u57df -label.action.destroy.instance.processing=\u6b63\u5728\u9500\u6bc1\u5b9e\u4f8b... -label.action.destroy.instance=\u9500\u6bc1\u5b9e\u4f8b -label.action.destroy.systemvm.processing=\u6b63\u5728\u9500\u6bc1\u7cfb\u7edf VM... -label.action.destroy.systemvm=\u9500\u6bc1\u7cfb\u7edf VM -label.action.detach.disk.processing=\u6b63\u5728\u53d6\u6d88\u9644\u52a0\u78c1\u76d8... -label.action.detach.disk=\u53d6\u6d88\u9644\u52a0\u78c1\u76d8 -label.action.detach.iso.processing=\u6b63\u5728\u53d6\u6d88\u9644\u52a0 ISO... -label.action.detach.iso=\u53d6\u6d88\u9644\u52a0 ISO -label.action.disable.account.processing=\u6b63\u5728\u7981\u7528\u5e10\u6237... -label.action.disable.account=\u7981\u7528\u5e10\u6237 -label.action.disable.cluster.processing=\u6b63\u5728\u7981\u7528\u7fa4\u96c6... -label.action.disable.cluster=\u7981\u7528\u7fa4\u96c6 -label.action.disable.nexusVswitch=\u7981\u7528 Nexus 1000v -label.action.disable.physical.network=\u7981\u7528\u7269\u7406\u7f51\u7edc -label.action.disable.pod.processing=\u6b63\u5728\u7981\u7528\u63d0\u4f9b\u70b9... -label.action.disable.pod=\u7981\u7528\u63d0\u4f9b\u70b9 -label.action.disable.static.NAT.processing=\u6b63\u5728\u7981\u7528\u9759\u6001 NAT... -label.action.disable.static.NAT=\u7981\u7528\u9759\u6001 NAT -label.action.disable.user.processing=\u6b63\u5728\u7981\u7528\u7528\u6237... -label.action.disable.user=\u7981\u7528\u7528\u6237 -label.action.disable.zone.processing=\u6b63\u5728\u7981\u7528\u8d44\u6e90\u57df... -label.action.disable.zone=\u7981\u7528\u8d44\u6e90\u57df -label.action.download.ISO=\u4e0b\u8f7d ISO -label.action.download.template=\u4e0b\u8f7d\u6a21\u677f -label.action.download.volume.processing=\u6b63\u5728\u4e0b\u8f7d\u5377... -label.action.download.volume=\u4e0b\u8f7d\u5377 -label.action.edit.account=\u7f16\u8f91\u5e10\u6237 -label.action.edit.disk.offering=\u7f16\u8f91\u78c1\u76d8\u65b9\u6848 -label.action.edit.domain=\u7f16\u8f91\u57df -label.action.edit.global.setting=\u7f16\u8f91\u5168\u5c40\u8bbe\u7f6e -label.action.edit.host=\u7f16\u8f91\u4e3b\u673a -label.action.edit.instance=\u7f16\u8f91\u5b9e\u4f8b -label.action.edit.ISO=\u7f16\u8f91 ISO -label.action.edit.network.offering=\u7f16\u8f91\u7f51\u7edc\u65b9\u6848 -label.action.edit.network.processing=\u6b63\u5728\u7f16\u8f91\u7f51\u7edc... -label.action.edit.network=\u7f16\u8f91\u7f51\u7edc -label.action.edit.pod=\u7f16\u8f91\u63d0\u4f9b\u70b9 -label.action.edit.primary.storage=\u7f16\u8f91\u4e3b\u5b58\u50a8 -label.action.edit.resource.limits=\u7f16\u8f91\u8d44\u6e90\u9650\u5236 -label.action.edit.service.offering=\u7f16\u8f91\u670d\u52a1\u65b9\u6848 -label.action.edit.template=\u7f16\u8f91\u6a21\u677f -label.action.edit.user=\u7f16\u8f91\u7528\u6237 -label.action.edit.zone=\u7f16\u8f91\u8d44\u6e90\u57df -label.action.enable.account.processing=\u6b63\u5728\u542f\u7528\u5e10\u6237... -label.action.enable.account=\u542f\u7528\u5e10\u6237 -label.action.enable.cluster.processing=\u6b63\u5728\u542f\u7528\u7fa4\u96c6... -label.action.enable.cluster=\u542f\u7528\u7fa4\u96c6 -label.action.enable.maintenance.mode.processing=\u6b63\u5728\u542f\u7528\u7ef4\u62a4\u6a21\u5f0f... -label.action.enable.maintenance.mode=\u542f\u7528\u7ef4\u62a4\u6a21\u5f0f -label.action.enable.nexusVswitch=\u542f\u7528 Nexus 1000v -label.action.enable.physical.network=\u542f\u7528\u7269\u7406\u7f51\u7edc -label.action.enable.pod.processing=\u6b63\u5728\u542f\u7528\u63d0\u4f9b\u70b9... -label.action.enable.pod=\u542f\u7528\u63d0\u4f9b\u70b9 -label.action.enable.static.NAT.processing=\u6b63\u5728\u542f\u7528\u9759\u6001 NAT... -label.action.enable.static.NAT=\u542f\u7528\u9759\u6001 NAT -label.action.enable.user.processing=\u6b63\u5728\u542f\u7528\u7528\u6237... -label.action.enable.user=\u542f\u7528\u7528\u6237 -label.action.enable.zone.processing=\u6b63\u5728\u542f\u7528\u8d44\u6e90\u57df... -label.action.enable.zone=\u542f\u7528\u8d44\u6e90\u57df -label.action.expunge.instance.processing=\u6b63\u5728\u5220\u9664\u5b9e\u4f8b... -label.action.expunge.instance=\u5220\u9664\u5b9e\u4f8b -label.action.force.reconnect.processing=\u6b63\u5728\u91cd\u65b0\u8fde\u63a5... -label.action.force.reconnect=\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5 -label.action.generate.keys.processing=\u6b63\u5728\u751f\u6210\u5bc6\u94a5... -label.action.generate.keys=\u751f\u6210\u5bc6\u94a5 -label.action.list.nexusVswitch=\u5217\u51fa Nexus 1000v -label.action.lock.account.processing=\u6b63\u5728\u9501\u5b9a\u5e10\u6237... -label.action.lock.account=\u9501\u5b9a\u5e10\u6237 -label.action.manage.cluster.processing=\u6b63\u5728\u6258\u7ba1\u7fa4\u96c6... -label.action.manage.cluster=\u6258\u7ba1\u7fa4\u96c6 -label.action.migrate.instance.processing=\u6b63\u5728\u8fc1\u79fb\u5b9e\u4f8b... -label.action.migrate.instance=\u8fc1\u79fb\u5b9e\u4f8b -label.action.migrate.router.processing=\u6b63\u5728\u8fc1\u79fb\u8def\u7531\u5668... -label.action.migrate.router=\u8fc1\u79fb\u8def\u7531\u5668 -label.action.migrate.systemvm.processing=\u6b63\u5728\u8fc1\u79fb\u7cfb\u7edf VM... -label.action.migrate.systemvm=\u8fc1\u79fb\u7cfb\u7edf VM -label.action.reboot.instance.processing=\u6b63\u5728\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b... -label.action.reboot.instance=\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b -label.action.reboot.router.processing=\u6b63\u5728\u91cd\u65b0\u542f\u52a8\u8def\u7531\u5668... -label.action.reboot.router=\u91cd\u65b0\u542f\u52a8\u8def\u7531\u5668 -label.action.reboot.systemvm.processing=\u6b63\u5728\u91cd\u65b0\u542f\u52a8\u7cfb\u7edf VM... -label.action.reboot.systemvm=\u91cd\u65b0\u542f\u52a8\u7cfb\u7edf VM -label.action.recurring.snapshot=\u91cd\u73b0\u5feb\u7167 -label.action.register.iso=\u6ce8\u518c ISO -label.action.register.template=\u4f7f\u7528URL\u6ce8\u518c\u6a21\u677f -label.action.release.ip.processing=\u6b63\u5728\u91ca\u653e IP... -label.action.release.ip=\u91ca\u653e IP -label.action.remove.host.processing=\u6b63\u5728\u5220\u9664\u4e3b\u673a... -label.action.remove.host=\u5220\u9664\u4e3b\u673a -label.action.reset.password.processing=\u6b63\u5728\u91cd\u7f6e\u5bc6\u7801... -label.action.reset.password=\u91cd\u7f6e\u5bc6\u7801 -label.action.resize.volume.processing=\u6b63\u5728\u8c03\u6574\u5377\u5927\u5c0f.... -label.action.resize.volume=\u8c03\u6574\u5377\u5927\u5c0f -label.action.resource.limits=\u8d44\u6e90\u9650\u5236 -label.action.restore.instance.processing=\u6b63\u5728\u8fd8\u539f\u5b9e\u4f8b... -label.action.restore.instance=\u8fd8\u539f\u5b9e\u4f8b -label.action.revert.snapshot.processing=\u6b63\u5728\u8fd8\u539f\u5230\u5feb\u7167... -label.action.revert.snapshot=\u8fd8\u539f\u5230\u5feb\u7167 -label.action.start.instance.processing=\u6b63\u5728\u542f\u52a8\u5b9e\u4f8b... -label.action.start.instance=\u542f\u52a8\u5b9e\u4f8b -label.action.start.router.processing=\u6b63\u5728\u542f\u52a8\u8def\u7531\u5668... -label.action.start.router=\u542f\u52a8\u8def\u7531\u5668 -label.action.start.systemvm.processing=\u6b63\u5728\u542f\u52a8\u7cfb\u7edf VM... -label.action.start.systemvm=\u542f\u52a8\u7cfb\u7edf VM -label.action.stop.instance.processing=\u6b63\u5728\u505c\u6b62\u5b9e\u4f8b... -label.action.stop.instance=\u505c\u6b62\u5b9e\u4f8b -label.action.stop.router.processing=\u6b63\u5728\u505c\u6b62\u8def\u7531\u5668... -label.action.stop.router=\u505c\u6b62\u8def\u7531\u5668 -label.action.stop.systemvm.processing=\u6b63\u5728\u505c\u6b62\u7cfb\u7edf VM... -label.action.stop.systemvm=\u505c\u6b62\u7cfb\u7edf VM -label.actions=\u64cd\u4f5c -label.action.take.snapshot.processing=\u6b63\u5728\u521b\u5efa\u5feb\u7167... -label.action.take.snapshot=\u521b\u5efa\u5feb\u7167 -label.action=\u64cd\u4f5c -label.action.unmanage.cluster.processing=\u6b63\u5728\u53d6\u6d88\u6258\u7ba1\u7fa4\u96c6... -label.action.unmanage.cluster=\u53d6\u6d88\u6258\u7ba1\u7fa4\u96c6 -label.action.update.OS.preference.processing=\u6b63\u5728\u66f4\u65b0\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879... -label.action.update.OS.preference=\u66f4\u65b0\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879 -label.action.update.resource.count.processing=\u6b63\u5728\u66f4\u65b0\u8d44\u6e90\u6570\u91cf... -label.action.update.resource.count=\u66f4\u65b0\u8d44\u6e90\u6570\u91cf -label.action.vmsnapshot.create=\u521b\u5efa VM \u5feb\u7167 -label.action.vmsnapshot.delete=\u5220\u9664 VM \u5feb\u7167 -label.action.vmsnapshot.revert=\u8fd8\u539f\u5230 VM \u5feb\u7167 -label.activate.project=\u6fc0\u6d3b\u9879\u76ee -label.active.sessions=\u6d3b\u52a8\u4f1a\u8bdd -label.add.accounts.to=\u6dfb\u52a0\u5e10\u6237\u81f3 -label.add.accounts=\u6dfb\u52a0\u5e10\u6237 -label.add.account.to.project=\u5411\u9879\u76ee\u4e2d\u6dfb\u52a0\u5e10\u6237 -label.add.account=\u6dfb\u52a0\u5e10\u6237 -label.add.acl.list=\u6dfb\u52a0 ACL \u5217\u8868 -label.add.ACL=\u6dfb\u52a0 ACL -label.add.affinity.group=\u6dfb\u52a0\u65b0\u5173\u8054\u6027\u7ec4 -label.add.baremetal.dhcp.device=\u6dfb\u52a0\u88f8\u673a DHCP \u8bbe\u5907 -label.add.baremetal.rack.configuration=\u6dfb\u52a0 Baremetal Rack \u914d\u7f6e -label.add.BigSwitchBcf.device=\u6dfb\u52a0 BigSwitch BCF \u63a7\u5236\u5668 -label.add.BrocadeVcs.device=\u6dfb\u52a0 Brocade Vcs \u4ea4\u6362\u673a -label.add.by.cidr=\u6309 CIDR \u6dfb\u52a0 -label.add.by.group=\u6309\u7ec4\u6dfb\u52a0 -label.add.by=\u6dfb\u52a0\u65b9\u5f0f -label.add.ciscoASA1000v=\u6dfb\u52a0 CiscoASA1000v \u8d44\u6e90 -label.add.cluster=\u6dfb\u52a0\u7fa4\u96c6 -label.add.compute.offering=\u6dfb\u52a0\u8ba1\u7b97\u65b9\u6848 -label.add.direct.iprange=\u6dfb\u52a0\u76f4\u63a5 IP \u8303\u56f4 -label.add.disk.offering=\u6dfb\u52a0\u78c1\u76d8\u65b9\u6848 -label.add.domain=\u6dfb\u52a0\u57df -label.added.brocade.vcs.switch=\u5df2\u6dfb\u52a0\u65b0 Brocade Vcs \u4ea4\u6362\u673a -label.added.network.offering=\u5df2\u6dfb\u52a0\u7f51\u7edc\u65b9\u6848 -label.added.new.bigswitch.bcf.controller=\u6dfb\u52a0\u65b0\u7684 BigSwitch BCF \u63a7\u5236\u5668 -label.added.nicira.nvp.controller=\u5df2\u6dfb\u52a0\u65b0 Nicira NVP \u63a7\u5236\u5668 -label.add.egress.rule=\u6dfb\u52a0\u51fa\u53e3\u89c4\u5219 -label.addes.new.f5=\u5df2\u6dfb\u52a0\u65b0 F5 -label.add.F5.device=\u6dfb\u52a0 F5 \u8bbe\u5907 -label.add.firewall=\u6dfb\u52a0\u9632\u706b\u5899\u89c4\u5219 -label.add.globo.dns=\u6dfb\u52a0\u5168\u5c40DNS -label.add.gslb=\u6dfb\u52a0 GSLB -label.add.guest.network=\u6dfb\u52a0\u6765\u5bbe\u7f51\u7edc -label.add.host=\u6dfb\u52a0\u4e3b\u673a -label.adding.cluster=\u6b63\u5728\u6dfb\u52a0\u7fa4\u96c6 -label.adding.failed=\u6dfb\u52a0\u5931\u8d25 -label.adding.pod=\u6b63\u5728\u6dfb\u52a0\u63d0\u4f9b\u70b9 -label.adding.processing=\u6b63\u5728\u6dfb\u52a0... -label.add.ingress.rule=\u6dfb\u52a0\u5165\u53e3\u89c4\u5219 -label.adding.succeeded=\u5df2\u6210\u529f\u6dfb\u52a0 -label.adding=\u6b63\u5728\u6dfb\u52a0 -label.adding.user=\u6b63\u5728\u6dfb\u52a0\u7528\u6237 -label.adding.zone=\u6b63\u5728\u6dfb\u52a0\u8d44\u6e90\u57df -label.add.intermediate.certificate=\u6dfb\u52a0\u4e2d\u95f4\u8bc1\u4e66 -label.add.internal.lb=\u6dfb\u52a0\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668 -label.add.ip.range=\u6dfb\u52a0 IP \u8303\u56f4 -label.add.isolated.guest.network=\u6dfb\u52a0\u9694\u79bb\u7684\u6765\u5bbe\u7f51\u7edc -label.add.isolated.guest.network.with.sourcenat=\u6dfb\u52a0\u9694\u79bb\u7684\u6765\u5bbe\u7f51\u7edc\u5e76\u542f\u7528 SourceNat -label.add.isolated.network=\u6dfb\u52a0\u9694\u79bb\u7f51\u7edc -label.additional.networks=\u5176\u4ed6\u7f51\u7edc -label.add.ldap.account=\u6dfb\u52a0 LDAP \u8d26\u6237 -label.add.LDAP.account=\u6dfb\u52a0LDAP\u8d26\u6237 -label.add.list.name=ACL \u5217\u8868\u540d\u79f0 -label.add.load.balancer=\u6dfb\u52a0\u8d1f\u8f7d\u5e73\u8861\u5668 -label.add.more=\u6dfb\u52a0\u66f4\u591a -label.add.netScaler.device=\u6dfb\u52a0 Netscaler \u8bbe\u5907 -label.add.network.acl.list=\u6dfb\u52a0\u7f51\u7edc ACL \u5217\u8868 -label.add.network.ACL=\u6dfb\u52a0\u7f51\u7edc ACL -label.add.network.device=\u6dfb\u52a0\u7f51\u7edc\u8bbe\u5907 -label.add.network.offering=\u6dfb\u52a0\u7f51\u7edc\u65b9\u6848 -label.add.network=\u6dfb\u52a0\u7f51\u7edc -label.add.new.F5=\u6dfb\u52a0\u65b0 F5 -label.add.new.gateway=\u6dfb\u52a0\u65b0\u7f51\u5173 -label.add.new.NetScaler=\u6dfb\u52a0\u65b0 NetScaler -label.add.new.PA=\u6dfb\u52a0\u65b0 Palo Alto -label.add.new.SRX=\u6dfb\u52a0\u65b0 SRX -label.add.new.tier=\u6dfb\u52a0\u65b0\u5c42 -label.add.nfs.secondary.staging.store=\u6dfb\u52a0 NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8 -label.add.NiciraNvp.device=\u6dfb\u52a0 Nvp \u63a7\u5236\u5668 -label.add.NuageVsp.device=\u6dfb\u52a0 Nuage \u865a\u62df\u670d\u52a1\u76ee\u5f55(VSD) -label.add.OpenDaylight.device=\u6dfb\u52a0 OpenDaylight \u63a7\u5236\u5668 -label.add.PA.device=\u6dfb\u52a0 Palo Alto \u8bbe\u5907 -label.add.physical.network=\u6dfb\u52a0\u7269\u7406\u7f51\u7edc -label.add.pod=\u6dfb\u52a0\u63d0\u4f9b\u70b9 -label.add.portable.ip.range=\u6dfb\u52a0\u53ef\u79fb\u690d IP \u8303\u56f4 -label.add.port.forwarding.rule=\u6dfb\u52a0\u7aef\u53e3\u8f6c\u53d1\u89c4\u5219 -label.add.primary.storage=\u6dfb\u52a0\u4e3b\u5b58\u50a8 -label.add.private.gateway=\u6dfb\u52a0\u79c1\u6709\u7f51\u5173 -label.add.region=\u6dfb\u52a0\u5730\u7406\u533a\u57df -label.add.resources=\u6dfb\u52a0\u8d44\u6e90 -label.add.route=\u6dfb\u52a0\u8def\u7531 -label.add.rule=\u6dfb\u52a0\u89c4\u5219 -label.add.secondary.storage=\u6dfb\u52a0\u4e8c\u7ea7\u5b58\u50a8 -label.add.security.group=\u6dfb\u52a0\u5b89\u5168\u7ec4 -label.add.service.offering=\u6dfb\u52a0\u670d\u52a1\u65b9\u6848 -label.add.SRX.device=\u6dfb\u52a0 SRX \u8bbe\u5907 -label.add.static.nat.rule=\u6dfb\u52a0\u9759\u6001 NAT \u89c4\u5219 -label.add.static.route=\u6dfb\u52a0\u9759\u6001\u8def\u7531 -label.add.system.service.offering=\u6dfb\u52a0\u7cfb\u7edf\u670d\u52a1\u65b9\u6848 -label.add.template=\u6dfb\u52a0\u6a21\u677f -label.add.to.group=\u6dfb\u52a0\u5230\u7ec4 -label.add=\u6dfb\u52a0 -label.add.ucs.manager=\u6dfb\u52a0 UCS \u7ba1\u7406\u5668 -label.add.userdata=\u7528\u6237\u6570\u636e -label.add.user=\u6dfb\u52a0\u7528\u6237 -label.add.vlan=\u6dfb\u52a0 VLAN -label.add.vms.to.lb=\u5411\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219\u4e2d\u6dfb\u52a0 VM -label.add.vms=\u6dfb\u52a0 VM -label.add.VM.to.tier=\u5411\u5c42\u4e2d\u6dfb\u52a0 VM -label.add.vm=\u6dfb\u52a0 VM -label.add.vmware.datacenter=\u6dfb\u52a0 VMware \u6570\u636e\u4e2d\u5fc3 -label.add.vnmc.device=\u6dfb\u52a0 VNMC \u8bbe\u5907 -label.add.vnmc.provider=\u6dfb\u52a0 VNMC \u63d0\u4f9b\u7a0b\u5e8f -label.add.volume=\u6dfb\u52a0\u5377 -label.add.vpc.offering=\u6dfb\u52a0 VPC \u65b9\u6848 -label.add.vpc=\u6dfb\u52a0 VPC -label.add.vpn.customer.gateway=\u6dfb\u52a0 VPN \u5ba2\u6237\u7f51\u5173 -label.add.VPN.gateway=\u6dfb\u52a0 VPN \u7f51\u5173 -label.add.vpn.user=\u6dfb\u52a0 VPN \u7528\u6237 -label.add.vxlan=\u6dfb\u52a0 VXLAN -label.add.zone=\u6dfb\u52a0\u8d44\u6e90\u57df -label.admin.accounts=\u7ba1\u7406\u5458\u5e10\u6237 -label.admin=\u7ba1\u7406\u5458 -label.advanced.mode=\u9ad8\u7ea7\u6a21\u5f0f -label.advanced.search=\u9ad8\u7ea7\u641c\u7d22 -label.advanced=\u9ad8\u7ea7 -label.affinity.groups=\u5173\u8054\u6027\u7ec4 -label.affinity.group=\u5173\u8054\u6027\u7ec4 -label.affinity=\u5173\u8054\u6027 -label.agent.password=\u4ee3\u7406\u5bc6\u7801 -label.agent.port=\u4ee3\u7406\u7aef\u53e3 -label.agent.state=\u4ee3\u7406\u72b6\u6001 -label.agent.username=\u4ee3\u7406\u7528\u6237\u540d -label.agree=\u540c\u610f -label.alert.archived=\u8b66\u62a5\u5df2\u5b58\u6863 -label.alert.deleted=\u8b66\u62a5\u5df2\u5220\u9664 -label.alert.details=\u8b66\u62a5\u8be6\u7ec6\u4fe1\u606f -label.alert=\u8b66\u62a5 -label.algorithm=\u7b97\u6cd5 -label.allocated=\u5df2\u5206\u914d -label.allocation.state=\u5206\u914d\u72b6\u6001 -label.allow=\u5141\u8bb8 -label.anti.affinity.groups=\u53cd\u5173\u8054\u6027\u7ec4 -label.anti.affinity.group=\u53cd\u5173\u8054\u6027\u7ec4 -label.anti.affinity=\u53cd\u5173\u8054\u6027 -label.api.key=API \u5bc6\u94a5 -label.api.version=API \u7248\u672c -label.apply=\u5e94\u7528 -label.app.name=CloudStack -label.archive.alerts=\u5b58\u6863\u8b66\u62a5 -label.archive.events=\u5b58\u6863\u4e8b\u4ef6 -label.archive=\u5b58\u6863 -label.assigned.vms=\u5df2\u5206\u914d\u7684 VM -label.assign.instance.another=\u5c06\u5b9e\u4f8b\u5206\u914d\u7ed9\u5176\u4ed6\u5e10\u6237 -label.assign.to.load.balancer=\u6b63\u5728\u5c06\u5b9e\u4f8b\u5206\u914d\u7ed9\u8d1f\u8f7d\u5e73\u8861\u5668 -label.assign=\u5206\u914d -label.assign.vms=\u5206\u914d\u5b9e\u4f8b -label.associated.network.id=\u5df2\u5173\u8054\u7f51\u7edc ID -label.associated.network=\u5173\u8054\u7f51\u7edc -label.associated.profile=\u5df2\u5173\u8054\u914d\u7f6e\u6587\u4ef6 -label.associate.public.ip=\u5173\u8054\u516c\u7528 IP -label.attached.iso=\u5df2\u9644\u52a0 ISO -label.author.email=\u4f5c\u8005\u7535\u5b50\u90ae\u4ef6 -label.author.name=\u4f5c\u8005\u59d3\u540d -label.autoscale.configuration.wizard=\u81ea\u52a8\u6269\u5c55\u914d\u7f6e\u5411\u5bfc -label.autoscale=\u81ea\u52a8\u6269\u5c55 -label.availability=\u53ef\u7528\u6027 -label.availabilityZone=\u53ef\u7528\u533a\u57df -label.availability.zone=\u53ef\u7528\u8d44\u6e90\u57df -label.available.public.ips=\u53ef\u7528\u516c\u7528 IP \u5730\u5740 -label.available=\u53ef\u7528 -label.back=\u540e\u9000 -label.bandwidth=\u5e26\u5bbd -label.baremetal.dhcp.devices=\u88f8\u673a DHCP \u8bbe\u5907 -label.baremetal.dhcp.provider=\u88f8\u673a DHCP \u63d0\u4f9b\u7a0b\u5e8f -label.baremetal.pxe.devices=\u88f8\u673a PXE \u8bbe\u5907 -label.baremetal.pxe.device=\u6dfb\u52a0\u88f8\u673a PXE \u8bbe\u5907 -label.baremetal.pxe.provider=\u88f8\u673a PXE \u63d0\u4f9b\u7a0b\u5e8f -label.baremetal.rack.configuration=Baremetal Rack \u914d\u7f6e -label.basic.mode=\u57fa\u672c\u6a21\u5f0f -label.basic=\u57fa\u672c -label.bigswitch.bcf.details=\ BigSwitch BCF \u8be6\u60c5 -label.bigswitch.bcf.nat=BigSwitch BCF NAT \u5df2\u542f\u7528 -label.bigswitch.controller.address=BigSwitch BCF \u63a7\u5236\u5668\u5730\u5740 -label.blade.id=\u5200\u7247\u5f0f\u670d\u52a1\u5668 ID -label.blades=\u5200\u7247\u5f0f\u670d\u52a1\u5668 -label.bootable=\u53ef\u542f\u52a8 -label.broadcast.domain.range=\u5e7f\u64ad\u57df\u8303\u56f4 -label.broadcast.domain.type=\u5e7f\u64ad\u57df\u7c7b\u578b -label.broadcast.uri=\u5e7f\u64ad URI -label.broadcasturi=\u5e7f\u64ad URI -label.broadcat.uri=\u5e7f\u64ad URI -label.brocade.vcs.address=Vcs \u4ea4\u6362\u673a\u5730\u5740 -label.brocade.vcs.details=Brocade Vcs \u4ea4\u6362\u673a\u8be6\u7ec6\u4fe1\u606f -label.by.account=\u6309\u5e10\u6237 -label.by.alert.type=\u6309\u8b66\u62a5\u7c7b\u578b -label.by.availability=\u6309\u53ef\u7528\u6027 -label.by.date.end=\u6309\u65e5\u671f(\u7ed3\u675f\u65e5\u671f) -label.by.date.start=\u6309\u65e5\u671f(\u5f00\u59cb\u65e5\u671f) -label.by.domain=\u6309\u57df -label.by.end.date=\u6309\u7ed3\u675f\u65e5\u671f -label.by.event.type=\u6309\u4e8b\u4ef6\u7c7b\u578b -label.by.level=\u6309\u7ea7\u522b -label.by.pod=\u6309\u63d0\u4f9b\u70b9 -label.by.role=\u6309\u89d2\u8272 -label.by.start.date=\u6309\u5f00\u59cb\u65e5\u671f -label.by.state=\u6309\u72b6\u6001 -label.bytes.received=\u63a5\u6536\u7684\u5b57\u8282\u6570 -label.bytes.sent=\u53d1\u9001\u7684\u5b57\u8282\u6570 -label.by.traffic.type=\u6309\u6d41\u91cf\u7c7b\u578b -label.by.type.id=\u6309\u7c7b\u578b ID -label.by.type=\u6309\u7c7b\u578b -label.by.zone=\u6309\u8d44\u6e90\u57df -label.cache.mode=\u5199\u5165\u7f13\u5b58\u7c7b\u578b -label.cancel=\u53d6\u6d88 -label.capacity.bytes=\u5bb9\u91cf(\u5b57\u8282) -label.capacity.iops=\u5bb9\u91cf IOPS -label.capacity=\u5bb9\u91cf -label.certificate=\u670d\u52a1\u5668\u8bc1\u4e66 -label.change.affinity=\u66f4\u6539\u5173\u8054\u6027 -label.change.service.offering=\u66f4\u6539\u670d\u52a1\u65b9\u6848 -label.change.value=\u66f4\u6539\u503c -label.character=\u5b57\u7b26 -label.chassis=\u673a\u7bb1 -label.checksum=\u6821\u9a8c -label.cidr.account=CIDR \u6216\u5e10\u6237/\u5b89\u5168\u7ec4 -label.cidr=CIDR -label.CIDR.list=CIDR \u5217\u8868 -label.cidr.list=\u6e90 CIDR -label.CIDR.of.destination.network=\u76ee\u7684\u5730\u7f51\u7edc\u7684 CIDR -label.cisco.nexus1000v.ip.address=Nexus 1000v IP \u5730\u5740 -label.cisco.nexus1000v.password=Nexus 1000v \u5bc6\u7801 -label.cisco.nexus1000v.username=Nexus 1000v \u7528\u6237\u540d -label.ciscovnmc.resource.details=CiscoVNMC \u8d44\u6e90\u8be6\u7ec6\u4fe1\u606f -label.clean.up=\u6e05\u7406 -label.clear.list=\u6e05\u9664\u5217\u8868 -label.close=\u5173\u95ed -label.cloud.console=\u4e91\u7ba1\u7406\u63a7\u5236\u53f0 -label.cloud.managed=\u7531 Cloud.com \u7ba1\u7406 -label.cluster.name=\u7fa4\u96c6\u540d\u79f0 -label.clusters=\u7fa4\u96c6 -label.cluster.type=\u7fa4\u96c6\u7c7b\u578b -label.cluster=\u7fa4\u96c6 -label.clvm=CLVM -label.code=\u4ee3\u7801 -label.community=\u793e\u533a -label.compute.and.storage=\u8ba1\u7b97\u4e0e\u5b58\u50a8 -label.compute.offerings=\u8ba1\u7b97\u65b9\u6848 -label.compute.offering=\u8ba1\u7b97\u65b9\u6848 -label.compute=\u8ba1\u7b97 -label.configuration=\u914d\u7f6e -label.configure.ldap=\u914d\u7f6e LDAP -label.configure.network.ACLs=\u914d\u7f6e\u7f51\u7edc ACL -label.configure.sticky.policy=\u914d\u7f6e\u7c98\u6ede\u7b56\u7565 -label.configure=\u914d\u7f6e -label.configure.vpc=\u914d\u7f6e VPC -label.confirmation=\u786e\u8ba4 -label.confirm.password=\u786e\u8ba4\u5bc6\u7801 -label.congratulations=\u795d\u8d3a\u60a8\! -label.conserve.mode=\u8282\u80fd\u6a21\u5f0f -label.console.proxy=\u63a7\u5236\u53f0\u4ee3\u7406 -label.console.proxy.vm=\u63a7\u5236\u53f0\u4ee3\u7406 VM -label.continue.basic.install=\u7ee7\u7eed\u6267\u884c\u57fa\u672c\u5b89\u88c5 -label.continue=\u7ee7\u7eed -label.copying.iso=\u6b63\u5728\u590d\u5236 ISO -label.corrections.saved=\u5df2\u4fdd\u5b58\u4fee\u6b63 -label.counter=\u8ba1\u6570\u5668 -label.cpu.allocated.for.VMs=\u5df2\u5206\u914d\u7ed9 VM \u7684 CPU -label.cpu.allocated=\u5df2\u5206\u914d\u7684 CPU -label.CPU.cap=CPU \u4e0a\u9650 -label.cpu=CPU -label.cpu.limits=CPU \u9650\u5236 -label.cpu.mhz=CPU (MHz) -label.cpu.utilized=CPU \u5229\u7528\u7387 -label.created.by.system=\u7531\u7cfb\u7edf\u521b\u5efa -label.created=\u521b\u5efa\u65e5\u671f -label.create.nfs.secondary.staging.storage=\u521b\u5efa NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8 -label.create.nfs.secondary.staging.store=\u521b\u5efa NFS \u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8 -label.create.project=\u521b\u5efa\u9879\u76ee -label.create.ssh.key.pair=\u751f\u6210SSH\u5bc6\u94a5\u5bf9 -label.create.template=\u521b\u5efa\u6a21\u677f -label.create.VPN.connection=\u521b\u5efa VPN \u8fde\u63a5 -label.cross.zones=\u8de8\u8d44\u6e90\u57df -label.custom.disk.iops=\u81ea\u5b9a\u4e49 IOPS -label.custom.disk.offering=\u81ea\u5b9a\u4e49\u78c1\u76d8\u65b9\u6848 -label.custom.disk.size=\u81ea\u5b9a\u4e49\u78c1\u76d8\u5927\u5c0f -label.custom=\u81ea\u5b9a\u4e49 -label.daily=\u6bcf\u5929 -label.data.disk.offering=\u6570\u636e\u78c1\u76d8\u65b9\u6848 -label.date=\u65e5\u671f -label.day.of.month=\u65e5\u671f -label.day.of.week=\u661f\u671f -label.day=\u5929 -label.dc.name=\u6570\u636e\u4e2d\u5fc3\u540d\u79f0 -label.dead.peer.detection=\u5931\u6548\u5bf9\u7b49\u4f53\u68c0\u6d4b -label.decline.invitation=\u62d2\u7edd\u9080\u8bf7 -label.dedicate.cluster=\u5c06\u7fa4\u96c6\u4e13\u7528 -label.dedicated=\u4e13\u7528 -label.dedicated.vlan.vni.ranges=VLAN/VNI \u8303\u56f4\u5df2\u4e13\u7528 -label.dedicate.host=\u5c06\u4e3b\u673a\u4e13\u7528 -label.dedicate.pod=\u5c06\u63d0\u4f9b\u70b9\u4e13\u7528 -label.dedicate=\u4e13\u7528 -label.dedicate.vlan.vni.range=\u5c06 VLAN/VNI \u8303\u56f4\u4e13\u7528 -label.dedicate.zone=\u5c06\u8d44\u6e90\u57df\u4e13\u7528 -label.default.egress.policy=\u9ed8\u8ba4\u51fa\u53e3\u89c4\u5219 -label.default=\u9ed8\u8ba4\u8bbe\u7f6e -label.default.use=\u9ed8\u8ba4\u4f7f\u7528 -label.default.view=\u9ed8\u8ba4\u89c6\u56fe -label.delete.acl.list=\u5220\u9664 ACL \u5217\u8868 -label.delete.affinity.group=\u5220\u9664\u5173\u8054\u6027\u7ec4 -label.delete.alerts=\u5220\u9664\u8b66\u62a5 -label.delete.baremetal.rack.configuration=\u5220\u9664 Baremetal Rack \u914d\u7f6e -label.delete.BigSwitchBcf=\u79fb\u9664 BigSwitch BCF \u63a7\u5236\u5668 -label.delete.BrocadeVcs=\u5220\u9664 Brocade Vcs \u4ea4\u6362\u673a -label.delete.ciscoASA1000v=\u5220\u9664 CiscoASA1000v -label.delete.ciscovnmc.resource=\u5220\u9664 CiscoVNMC \u8d44\u6e90 -label.delete.events=\u5220\u9664\u4e8b\u4ef6 -label.delete.F5=\u5220\u9664 F5 -label.delete.gateway=\u5220\u9664\u7f51\u5173 -label.delete.internal.lb=\u5220\u9664\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668 -label.delete.NetScaler=\u5220\u9664 NetScaler -label.delete.NiciraNvp=\u5220\u9664 Nvp \u63a7\u5236\u5668 -label.delete.NuageVsp=\u5220\u9664 Nuage VSD -label.delete.OpenDaylight.device=\u5220\u9664 OpenDaylight \u63a7\u5236\u5668 -label.delete.PA=\u5220\u9664 Palo Alto -label.delete.portable.ip.range=\u5220\u9664\u53ef\u79fb\u690d IP \u8303\u56f4 -label.delete.profile=\u5220\u9664\u914d\u7f6e\u6587\u4ef6 -label.delete.project=\u5220\u9664\u9879\u76ee -label.delete.secondary.staging.store=\u5220\u9664\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8 -label.delete.SRX=\u5220\u9664 SRX -label.delete=\u5220\u9664 -label.delete.ucs.manager=\u5220\u9664 UCS Manager -label.delete.VPN.connection=\u5220\u9664 VPN \u8fde\u63a5 -label.delete.VPN.customer.gateway=\u5220\u9664 VPN \u5ba2\u6237\u7f51\u5173 -label.delete.VPN.gateway=\u5220\u9664 VPN \u7f51\u5173 -label.delete.vpn.user=\u5220\u9664 VPN \u7528\u6237 -label.deleting.failed=\u5220\u9664\u5931\u8d25 -label.deleting.processing=\u6b63\u5728\u5220\u9664... -label.deny=\u62d2\u7edd -label.deployment.planner=\u90e8\u7f72\u89c4\u5212\u5668 -label.description=\u8bf4\u660e -label.destination.physical.network.id=\u76ee\u6807\u7269\u7406\u7f51\u7edc ID -label.destination.zone=\u76ee\u6807\u8d44\u6e90\u57df -label.destroy.router=\u9500\u6bc1\u8def\u7531\u5668 -label.destroy=\u9500\u6bc1 -label.destroy.vm.graceperiod=\u9500\u6bc1 VM \u5bbd\u9650\u671f -label.detaching.disk=\u6b63\u5728\u53d6\u6d88\u9644\u52a0\u78c1\u76d8 -label.details=\u8be6\u7ec6\u4fe1\u606f -label.device.id=\u8bbe\u5907 ID -label.devices=\u8bbe\u5907 -label.dhcp=DHCP -label.DHCP.server.type=DHCP \u670d\u52a1\u5668\u7c7b\u578b -label.direct.attached.public.ip=\u76f4\u8fde\u516c\u7528 IP -label.direct.ips=\u5171\u4eab\u7f51\u7edc IP -label.disable.autoscale=\u7981\u7528\u81ea\u52a8\u7f29\u653e -label.disabled=\u5df2\u7981\u7528 -label.disable.host=\u7981\u7528\u4e3b\u673a -label.disable.network.offering=\u7981\u7528\u7f51\u7edc\u65b9\u6848 -label.disable.provider=\u7981\u7528\u63d0\u4f9b\u7a0b\u5e8f -label.disable.vnmc.provider=\u7981\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f -label.disable.vpc.offering=\u7981\u7528 VPC \u65b9\u6848 -label.disable.vpn=\u7981\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN -label.disabling.vpn.access=\u6b63\u5728\u7981\u7528 VPN \u8bbf\u95ee -label.disassociate.profile.blade=\u53d6\u6d88\u5c06\u914d\u7f6e\u6587\u4ef6\u4e0e\u5200\u7247\u5f0f\u670d\u52a1\u5668\u5173\u8054 -label.disbale.vnmc.device=\u7981\u7528 VNMC \u8bbe\u5907 -label.disk.allocated=\u5df2\u5206\u914d\u7684\u78c1\u76d8 -label.disk.bytes.read.rate=\u78c1\u76d8\u8bfb\u53d6\u901f\u5ea6(BPS) -label.disk.bytes.write.rate=\u78c1\u76d8\u5199\u5165\u901f\u5ea6(BPS) -label.disk.iops.max=\u6700\u5927 IOPS -label.disk.iops.min=\u6700\u5c0f IOPS -label.disk.iops.read.rate=\u78c1\u76d8\u8bfb\u53d6\u901f\u5ea6(IOPS) -label.disk.iops.total=\u603b IOPS -label.disk.iops.write.rate=\u78c1\u76d8\u5199\u5165\u901f\u5ea6(IOPS) -label.disk.offering.details=\u78c1\u76d8\u65b9\u6848\u8be6\u60c5 -label.disk.offering=\u78c1\u76d8\u65b9\u6848 -label.diskoffering=\u78c1\u76d8\u65b9\u6848 -label.disk.provisioningtype=\u7f6e\u5907\u7c7b\u578b -label.disk.read.bytes=\u78c1\u76d8\u8bfb\u53d6(\u5b57\u8282) -label.disk.read.io=\u78c1\u76d8\u8bfb\u53d6(IO) -label.disk.size.gb=\u78c1\u76d8\u5927\u5c0f(GB) -label.disk.size=\u78c1\u76d8\u5927\u5c0f -label.disk.total=\u78c1\u76d8\u603b\u91cf -label.disk.volume=\u78c1\u76d8\u5377 -label.disk.write.bytes=\u78c1\u76d8\u5199\u5165(\u5b57\u8282) -label.disk.write.io=\u78c1\u76d8\u5199\u5165(IO) -label.display.name=\u663e\u793a\u540d\u79f0 -label.display.text=\u663e\u793a\u6587\u672c -label.distributedrouter=\u5206\u5e03\u5f0f\u8def\u7531\u5668 -label.dns.1=DNS 1 -label.dns.2=DNS 2 -label.dns=DNS -label.DNS.domain.for.guest.networks=\u6765\u5bbe\u7f51\u7edc\u7684 DNS \u57df -label.domain.admin=\u57df\u7ba1\u7406\u5458 -label.domain.details=\u57df\u8be6\u60c5 -label.domain.id=\u57df ID -label.domain.lower=\u57df -label.domain.name=\u57df\u540d -label.domain.router=\u57df\u8def\u7531\u5668 -label.domain.suffix=DNS \u57df\u540e\u7f00(\u4f8b\u5982 xyz.com) -label.domain=\u57df -label.done=\u5b8c\u6210 -label.double.quotes.are.not.allowed=\u4e0d\u5141\u8bb8\u4f7f\u7528\u53cc\u5f15\u53f7 -label.download.progress=\u4e0b\u8f7d\u8fdb\u5ea6 -label.drag.new.position=\u62d6\u52a8\u5230\u65b0\u4f4d\u7f6e -label.duration.in.sec=\u6301\u7eed\u65f6\u95f4 (\u79d2) -label.dynamically.scalable=\u53ef\u52a8\u6001\u6269\u5c55 -label.edit.acl.rule=\u7f16\u8f91 ACL \u89c4\u5219 -label.edit.affinity.group=\u7f16\u8f91\u5173\u8054\u6027\u7ec4 -label.edit.lb.rule=\u7f16\u8f91\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219 -label.edit.network.details=\u7f16\u8f91\u7f51\u7edc\u8be6\u60c5 -label.edit.project.details=\u7f16\u8f91\u9879\u76ee\u8be6\u60c5 -label.edit.region=\u7f16\u8f91\u5730\u7406\u533a\u57df -label.edit.rule=\u7f16\u8f91\u89c4\u5219 -label.edit.secondary.ips=\u7f16\u8f91\u4e8c\u7ea7 IPs -label.edit.tags=\u7f16\u8f91\u6807\u7b7e -label.edit.traffic.type=\u7f16\u8f91\u6d41\u91cf\u7c7b\u578b -label.edit=\u7f16\u8f91 -label.edit.vpc=\u7f16\u8f91 VPC -label.egress.default.policy=\u51fa\u53e3\u9ed8\u8ba4\u7b56\u7565 -label.egress.rules=\u51fa\u53e3\u89c4\u5219 -label.egress.rule=\u51fa\u53e3\u89c4\u5219 -label.elastic.IP=\u5f39\u6027 IP -label.elastic.LB=\u5f39\u6027\u8d1f\u8f7d\u5e73\u8861\u5668 -label.elastic=\u5f39\u6027 -label.email.lower=\u7535\u5b50\u90ae\u4ef6 -label.email=\u7535\u5b50\u90ae\u4ef6 -label.enable.autoscale=\u542f\u7528\u81ea\u52a8\u7f29\u653e -label.enable.host=\u542f\u7528\u4e3b\u673a -label.enable.network.offering=\u542f\u7528\u7f51\u7edc\u65b9\u6848 -label.enable.provider=\u542f\u7528\u63d0\u4f9b\u7a0b\u5e8f -label.enable.s3=\u542f\u7528 S3 \u652f\u6301\u7684\u4e8c\u7ea7\u5b58\u50a8 -label.enable.swift=\u542f\u7528 SWIFT -label.enable.vnmc.device=\u542f\u7528 VNMC \u8bbe\u5907 -label.enable.vnmc.provider=\u542f\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f -label.enable.vpc.offering=\u542f\u7528 VPC \u65b9\u6848 -label.enable.vpn=\u542f\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN -label.enabling.vpn.access=\u6b63\u5728\u542f\u7528 VPN \u8bbf\u95ee -label.enabling.vpn=\u6b63\u5728\u542f\u7528 VPN -label.end.IP=\u7ed3\u675f IP -label.endpoint.or.operation=\u7aef\u70b9\u6216\u64cd\u4f5c -label.endpoint=\u7aef\u70b9 -label.end.port=\u7ed3\u675f\u7aef\u53e3 -label.end.reserved.system.IP=\u7ed3\u675f\u9884\u7559\u7cfb\u7edf IP -label.end.vlan=\u7ed3\u675f VLAN -label.end.vxlan=\u7ed3\u675f VXLAN -label.enter.token=\u8f93\u5165\u4ee4\u724c -label.error.code=\u9519\u8bef\u4ee3\u7801 -label.error=\u9519\u8bef -label.error.upper=\u9519\u8bef -label.ESP.encryption=ESP \u52a0\u5bc6\u7b97\u6cd5 -label.ESP.hash=ESP \u54c8\u5e0c\u7b97\u6cd5 -label.ESP.lifetime=ESP \u4f7f\u7528\u671f\u9650(\u7b2c\u4e8c\u9636\u6bb5) -label.ESP.policy=ESP \u7b56\u7565 -label.esx.host=ESX/ESXi \u4e3b\u673a -label.event.archived=\u4e8b\u4ef6\u5df2\u5b58\u6863 -label.event.deleted=\u4e8b\u4ef6\u5df2\u5220\u9664 -label.event=\u4e8b\u4ef6 -label.every=\u6bcf -label.example=\u793a\u4f8b -label.expunge=\u5220\u9664 -label.external.link=\u5916\u90e8\u94fe\u63a5 -label.extractable.lower=\u53ef\u63d0\u53d6 -label.extractable=\u53ef\u63d0\u53d6 -label.f5.details=F5 \u8be6\u7ec6\u4fe1\u606f -label.f5=F5 -label.failed=\u5931\u8d25 -label.featured=\u7cbe\u9009 -label.fetch.latest=\u63d0\u53d6\u6700\u65b0\u5185\u5bb9 -label.filterBy=\u8fc7\u6ee4\u4f9d\u636e -label.fingerprint=\u6307\u7eb9 -label.firewall=\u9632\u706b\u5899 -label.firstname.lower=\u540d\u5b57 -label.first.name=\u540d\u5b57 -label.format.lower=\u683c\u5f0f -label.format=\u683c\u5f0f -label.friday=\u661f\u671f\u4e94 -label.full.path=\u5b8c\u6574\u8def\u5f84 -label.full=\u6ee1\u8f7d -label.gateway=\u7f51\u5173 -label.general.alerts=\u5e38\u89c4\u8b66\u62a5 -label.generating.url=\u6b63\u5728\u751f\u6210 URL -label.globo.dns.configuration=\u5168\u5c40 DNS \u914d\u7f6e -label.globo.dns=\u5168\u5c40DNS -label.gluster.volume=\u5377 -label.go.step.2=\u8f6c\u81f3\u6b65\u9aa4 2 -label.go.step.3=\u8f6c\u81f3\u6b65\u9aa4 3 -label.go.step.4=\u8f6c\u81f3\u6b65\u9aa4 4 -label.go.step.5=\u8f6c\u81f3\u6b65\u9aa4 5 -label.gpu=GPU -label.group.by.account=\u6309\u5e10\u6237\u5206\u7ec4 -label.group.by.cluster=\u6309\u7fa4\u96c6\u5206\u7ec4 -label.group.by.pod=\u6309\u63d0\u4f9b\u70b9\u5206\u7ec4 -label.group.by.zone=\u6309\u8d44\u6e90\u57df\u5206\u7ec4 -label.group.optional=\u7ec4(\u53ef\u9009) -label.group=\u7ec4 -label.gslb.assigned.lb.more=\u5206\u914d\u66f4\u591a\u8d1f\u8f7d\u5e73\u8861 -label.gslb.assigned.lb=\u5df2\u5206\u914d\u8d1f\u8f7d\u5e73\u8861 -label.gslb.delete=\u5220\u9664 GSLB -label.gslb.details=GSLB \u8be6\u7ec6\u4fe1\u606f -label.gslb.domain.name=GSLB \u57df\u540d -label.gslb=GSLB -label.gslb.lb.details=\u8d1f\u8f7d\u5e73\u8861\u8be6\u7ec6\u4fe1\u606f -label.gslb.lb.remove=\u4ece\u6b64 GSLB \u4e2d\u5220\u9664\u8d1f\u8f7d\u5e73\u8861 -label.gslb.lb.rule=\u8d1f\u8f7d\u5e73\u8861\u89c4\u5219 -label.gslb.service=GSLB \u670d\u52a1 -label.gslb.service.private.ip=GSLB \u670d\u52a1\u4e13\u7528 IP -label.gslb.service.public.ip=GSLB \u670d\u52a1\u516c\u7528 IP -label.gslb.servicetype=\u670d\u52a1\u7c7b\u578b -label.guest.cidr=\u6765\u5bbe CIDR -label.guest.end.ip=\u6765\u5bbe\u7ed3\u675f IP -label.guest.gateway=\u6765\u5bbe\u7f51\u5173 -label.guest.ip.range=\u6765\u5bbe IP \u8303\u56f4 -label.guest.ip=\u6765\u5bbe IP \u5730\u5740 -label.guest.netmask=\u6765\u5bbe\u7f51\u7edc\u63a9\u7801 -label.guest.network.details=\u6765\u5bbe\u7f51\u7edc\u8be6\u7ec6\u4fe1\u606f -label.guest.networks=\u6765\u5bbe\u7f51\u7edc -label.guest.start.ip=\u6765\u5bbe\u8d77\u59cb IP -label.guest.traffic=\u6765\u5bbe\u6d41\u91cf -label.guest.traffic.vswitch.name=\u6765\u5bbe\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u540d\u79f0 -label.guest.traffic.vswitch.type=\u6765\u5bbe\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u7c7b\u578b -label.guest.type=\u6765\u5bbe\u7c7b\u578b -label.guest=\u6765\u5bbe -label.ha.enabled=\u5df2\u542f\u7528\u9ad8\u53ef\u7528\u6027 -label.health.check.advanced.options=\u9ad8\u7ea7\u9009\u9879\: -label.health.check.configurations.options=\u914d\u7f6e\u9009\u9879\: -label.health.check.interval.in.sec=\u8fd0\u884c\u72b6\u51b5\u68c0\u67e5\u65f6\u95f4\u95f4\u9694(\u79d2) -label.health.check.message.desc=\u8d1f\u8f7d\u5747\u8861\u5668\u4f1a\u81ea\u52a8\u5bf9\u5b9e\u4f8b\u8fdb\u884c\u72b6\u51b5\u68c0\u67e5\u5e76\u4e14\u53ea\u6709\u8def\u7531\u5668\u81f3\u5b9e\u4f8b\u7684\u94fe\u8def\u6b63\u5e38\u624d\u80fd\u901a\u8fc7\u68c0\u67e5 -label.health.check=\u8fd0\u884c\u72b6\u51b5\u68c0\u67e5 -label.health.check.wizard=\u8fd0\u884c\u68c0\u67e5\u5411\u5bfc -label.healthy.threshold=\u6b63\u5e38\u9608\u503c -label.help=\u5e2e\u52a9 -label.hide.ingress.rule=\u9690\u85cf\u5165\u53e3\u89c4\u5219 -label.hints=\u63d0\u793a -label.home=\u9996\u9875 -label.host.MAC=\u4e3b\u673a MAC -label.host.name=\u4e3b\u673a\u540d\u79f0 -label.hosts=\u4e3b\u673a -label.host.tags=\u4e3b\u673a\u6807\u7b7e -label.host.tag=\u5bbf\u4e3b\u673a\u6807\u7b7e -label.host=\u4e3b\u673a -label.hourly=\u6bcf\u5c0f\u65f6 -label.hvm=HVM -label.hypervisor.capabilities=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u529f\u80fd -label.hypervisor.snapshot.reserve=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u5feb\u7167\u9884\u7559 -label.hypervisors=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f -label.hypervisor.type=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u7c7b\u578b -label.hypervisor=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f -label.hypervisor.version=\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u7248\u672c -label.hyperv.traffic.label=HyperV \u6d41\u91cf\u6807\u7b7e -label.id=ID -label.IKE.DH=IKE DH \u7b97\u6cd5 -label.IKE.encryption=IKE \u52a0\u5bc6\u7b97\u6cd5 -label.IKE.hash=IKE \u54c8\u5e0c\u7b97\u6cd5 -label.IKE.lifetime=IKE \u4f7f\u7528\u671f\u9650(\u7b2c\u4e8c\u9636\u6bb5) -label.IKE.policy=IKE \u7b56\u7565 -label.info=\u4fe1\u606f -label.info.upper=\u4fe1\u606f -label.ingress.rule=\u5165\u53e3\u89c4\u5219 -label.initiated.by=\u542f\u52a8\u8005 -label.inside.port.profile=\u5185\u90e8\u7aef\u53e3\u914d\u7f6e\u6587\u4ef6 -label.installWizard.addClusterIntro.subtitle=\u4ec0\u4e48\u662f\u7fa4\u96c6? -label.installWizard.addClusterIntro.title=\u6dfb\u52a0\u4e00\u4e2a\u7fa4\u96c6 -label.installWizard.addHostIntro.subtitle=\u4ec0\u4e48\u662f\u4e3b\u673a? -label.installWizard.addHostIntro.title=\u6dfb\u52a0\u4e00\u4e2a\u4e3b\u673a -label.installWizard.addPodIntro.subtitle=\u4ec0\u4e48\u662f\u63d0\u4f9b\u70b9? -label.installWizard.addPodIntro.title=\u6dfb\u52a0\u4e00\u4e2a\u63d0\u4f9b\u70b9 -label.installWizard.addPrimaryStorageIntro.subtitle=\u4ec0\u4e48\u662f\u4e3b\u5b58\u50a8? -label.installWizard.addPrimaryStorageIntro.title=\u6dfb\u52a0\u4e00\u4e2a\u4e3b\u5b58\u50a8 -label.installWizard.addSecondaryStorageIntro.subtitle=\u4ec0\u4e48\u662f\u4e8c\u7ea7\u5b58\u50a8? -label.installWizard.addSecondaryStorageIntro.title=\u6dfb\u52a0\u4e00\u4e2a\u4e8c\u7ea7\u5b58\u50a8 -label.installWizard.addZoneIntro.subtitle=\u4ec0\u4e48\u662f\u8d44\u6e90\u57df? -label.installWizard.addZoneIntro.title=\u6dfb\u52a0\u4e00\u4e2a\u8d44\u6e90\u57df -label.installWizard.addZone.title=\u6dfb\u52a0\u8d44\u6e90\u57df -label.installWizard.click.launch=\u8bf7\u5355\u51fb\u201c\u542f\u52a8\u201d\u6309\u94ae\u3002 -label.installWizard.subtitle=\u6b64\u6559\u7a0b\u5c06\u5e2e\u52a9\u60a8\u8bbe\u7f6e CloudStack&\#8482 \u5b89\u88c5 -label.installWizard.title=\u60a8\u597d\uff0c\u6b22\u8fce\u4f7f\u7528 CloudStack&\#8482 -label.instance.limits=\u5b9e\u4f8b\u9650\u5236 -label.instance.name=\u5b9e\u4f8b\u540d\u79f0 -label.instance.port=\u5b9e\u4f8b\u7aef\u53e3 -label.instance.scaled.up=\u63d0\u4f9b\u9700\u8981\u6269\u5c55\u7684\u5b9e\u4f8b -label.instances=\u5b9e\u4f8b -label.instance=\u5b9e\u4f8b -label.instanciate.template.associate.profile.blade=\u5c06\u6a21\u677f\u5b9e\u4f8b\u5316\u5e76\u5c06\u914d\u7f6e\u6587\u4ef6\u4e0e\u5200\u7247\u5f0f\u670d\u52a1\u5668\u5173\u8054 -label.intermediate.certificate=\u4e2d\u95f4\u8bc1\u4e66 {0} -label.internal.dns.1=\u5185\u90e8 DNS 1 -label.internal.dns.2=\u5185\u90e8 DNS 2 -label.internal.lb.details=\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668\u8be6\u7ec6\u4fe1\u606f -label.internal.lb=\u5185\u90e8\u8d1f\u8f7d\u5747\u8861\u5668 -label.internallbvm=InternalLbVm -label.internal.name=\u5185\u90e8\u540d\u79f0 -label.interval.type=\u95f4\u9694\u7c7b\u578b -label.introduction.to.cloudstack=CloudStack&\#8482 \u7b80\u4ecb -label.invalid.integer=\u65e0\u6548\u6574\u6570 -label.invalid.number=\u65e0\u6548\u6570\u5b57 -label.invitations=\u9080\u8bf7 -label.invited.accounts=\u5df2\u9080\u8bf7\u7684\u5e10\u6237 -label.invite.to=\u9080\u8bf7\u52a0\u5165 -label.invite=\u9080\u8bf7 -label.ip.address=IP \u5730\u5740 -label.ipaddress=IP \u5730\u5740 -label.ip.allocations=IP \u5206\u914d -label.ip=IP -label.ip.limits=\u516c\u7528 IP \u9650\u5236 -label.ip.or.fqdn=IP \u6216 FQDN -label.ip.range=IP \u8303\u56f4 -label.ip.ranges=IP \u8303\u56f4 -label.IPsec.preshared.key=IPsec \u9884\u5171\u4eab\u5bc6\u94a5 -label.ips=IP -label.ipv4.cidr=IPv4 CIDR -label.ipv4.dns1=IPv4 DNS1 -label.ipv4.dns2=IPv4 DNS2 -label.ipv4.end.ip=IPv4 \u7ed3\u675f IP -label.ipv4.gateway=IPv4 \u7f51\u5173 -label.ipv4.netmask=IPv4 \u7f51\u7edc\u63a9\u7801 -label.ipv4.start.ip=IPv4 \u8d77\u59cb IP -label.ipv6.address=IPv6 IP \u5730\u5740 -label.ipv6.CIDR=IPv6 CIDR -label.ipv6.dns1=IPv6 DNS1 -label.ipv6.dns2=IPv6 DNS2 -label.ipv6.end.ip=IPv6 \u7ed3\u675f IP -label.ipv6.gateway=IPv6 \u7f51\u5173 -label.ipv6.start.ip=IPv6 \u8d77\u59cb IP -label.iscsi=iSCSI -label.is.default=\u662f\u5426\u4e3a\u9ed8\u8ba4\u8bbe\u7f6e -label.iso.boot=ISO \u542f\u52a8 -label.iso=ISO -label.isolated.networks=\u9694\u79bb\u7f51\u7edc -label.isolation.method=\u9694\u79bb\u65b9\u6cd5 -label.isolation.mode=\u9694\u79bb\u6a21\u5f0f -label.isolation.uri=\u9694\u79bb URI -label.is.redundant.router=\u5197\u4f59 -label.is.shared=\u662f\u5426\u5171\u4eab -label.is.system=\u662f\u5426\u4e3a\u7cfb\u7edf -label.item.listing=\u9879\u76ee\u5217\u8868 -label.japanese.keyboard=\u65e5\u5f0f\u952e\u76d8 -label.keep.colon=\u4fdd\u7559 -label.keep=\u4fdd\u7559 -label.keyboard.language=\u952e\u76d8\u8bed\u8a00 -label.keyboard.type=\u952e\u76d8\u7c7b\u578b -label.key=\u5bc6\u94a5 -label.kvm.traffic.label=KVM \u6d41\u91cf\u6807\u7b7e -label.label=\u6807\u7b7e -label.lang.arabic=\u963f\u62c9\u4f2f\u8bed -label.lang.brportugese=\u8461\u8404\u7259\u8bed(\u5df4\u897f) -label.lang.catalan=\u52a0\u6cf0\u7f57\u5c3c\u4e9a\u8bed -label.lang.chinese=\u7b80\u4f53\u4e2d\u6587 -label.lang.dutch=\u8377\u5170\u8bed(\u8377\u5170) -label.lang.english=\u82f1\u8bed -label.lang.french=\u6cd5\u8bed -label.lang.german=\u5fb7\u8bed -label.lang.hungarian=\u5308\u7259\u5229 -label.lang.italian=\u610f\u5927\u5229\u8bed -label.lang.japanese=\u65e5\u8bed -label.lang.korean=\u97e9\u8bed -label.lang.norwegian=\u632a\u5a01\u8bed -label.lang.polish=\u6ce2\u5170\u8bed -label.lang.russian=\u4fc4\u8bed -label.lang.spanish=\u897f\u73ed\u7259\u8bed -label.last.disconnected=\u4e0a\u6b21\u65ad\u5f00\u8fde\u63a5\u65f6\u95f4 -label.lastname.lower=\u59d3\u6c0f -label.last.name=\u59d3\u6c0f -label.latest.events=\u6700\u65b0\u4e8b\u4ef6 -label.launch=\u542f\u52a8 -label.launch.vm=\u542f\u52a8 VM -label.launch.zone=\u542f\u52a8\u8d44\u6e90\u57df -label.lb.algorithm.leastconn=\u6700\u5c11\u8fde\u63a5\u7b97\u6cd5 -label.lb.algorithm.roundrobin=\u8f6e\u5faa -label.lb.algorithm.source=\u6e90\u7b97\u6cd5 -label.LB.isolation=\u8d1f\u8f7d\u5e73\u8861\u5668\u9694\u79bb -label.ldap.configuration=LDAP \u914d\u7f6e -label.ldap.group.name=LDAP \u7ec4 -label.ldap.link.type=\u7c7b\u578b -label.ldap.port=LDAP \u7aef\u53e3 -label.level=\u7ea7\u522b -label.link.domain.to.ldap=\u57df\u94fe\u63a5\u81f3 LDAP -label.linklocal.ip=\u94fe\u63a5\u672c\u5730 IP \u5730\u5740 -label.load.balancer.type=\u8d1f\u8f7d\u5e73\u8861\u5668\u7c7b\u578b -label.load.balancer=\u8d1f\u8f7d\u5e73\u8861\u5668 -label.load.balancing.policies=\u8d1f\u8f7d\u5e73\u8861\u7b56\u7565 -label.load.balancing=\u8d1f\u8f7d\u5e73\u8861 -label.loading=\u6b63\u5728\u52a0\u8f7d -label.local.file=\u672c\u5730\u6587\u4ef6 -label.local.storage.enabled.system.vms=\u4e3a\u7cfb\u7edf\u5b9e\u4f8b\u5f00\u542f\u672c\u5730\u5b58\u50a8 -label.local.storage.enabled=\u4e3a\u7528\u6237\u5b9e\u4f8b\u5f00\u542f\u672c\u5730\u5b58\u50a8 -label.local.storage=\u672c\u5730\u5b58\u50a8 -label.local=\u672c\u5730 -label.login=\u767b\u5f55 -label.logout=\u6ce8\u9500 -label.lun=LUN -label.LUN.number=LUN \u53f7 -label.lxc.traffic.label=LXC \u6d41\u91cf\u6807\u7b7e -label.make.project.owner=\u8bbe\u4e3a\u5e10\u6237\u9879\u76ee\u6240\u6709\u8005 -label.make.redundant=\u5197\u4f59 -label.managed=\u6258\u7ba1 -label.management.ips=\u7ba1\u7406\u7c7b IP \u5730\u5740 -label.management.server=\u7ba1\u7406\u670d\u52a1\u5668 -label.management=\u7ba1\u7406 -label.manage.resources=\u7ba1\u7406\u8d44\u6e90 -label.manage=\u6258\u7ba1 -label.max.cpus=\u6700\u5927 CPU \u5185\u6838\u6570 -label.max.guest.limit=\u6700\u5927\u6765\u5bbe\u6570\u9650\u5236 -label.maximum=\u6700\u5927\u503c -label.max.instances=\u6700\u5927\u5b9e\u4f8b\u6570 -label.max.memory=\u6700\u5927\u5185\u5b58(MiB) -label.max.networks=\u6700\u5927\u7f51\u7edc\u6570 -label.max.primary.storage=\u6700\u5927\u4e3b\u5b58\u50a8(GiB) -label.max.public.ips=\u6700\u5927\u516c\u7528 IP \u6570 -label.max.secondary.storage=\u6700\u5927\u4e8c\u7ea7\u5b58\u50a8(GiB) -label.max.snapshots=\u6700\u5927\u5feb\u7167\u6570 -label.max.templates=\u6700\u5927\u6a21\u677f\u6570 -label.max.vms=\u6700\u5927\u7528\u6237 VM \u6570 -label.max.volumes=\u6700\u5927\u5377\u6570 -label.max.vpcs=\u6700\u5927 VPC \u6570 -label.may.continue=\u60a8\u73b0\u5728\u53ef\u4ee5\u7ee7\u7eed\u8fdb\u884c\u64cd\u4f5c\u3002 -label.md5.checksum=MD5 \u6821\u9a8c\u548c -label.memory.allocated=\u5df2\u5206\u914d\u7684\u5185\u5b58 -label.memory.limits=\u5185\u5b58\u9650\u5236(MiB) -label.memory.mb=\u5185\u5b58(MB) -label.memory.total=\u5185\u5b58\u603b\u91cf -label.memory=\u5185\u5b58 -label.memory.used=\u5df2\u4f7f\u7528\u7684\u5185\u5b58 -label.menu.accounts=\u5e10\u6237 -label.menu.alerts=\u8b66\u62a5 -label.menu.all.accounts=\u6240\u6709\u5e10\u6237 -label.menu.all.instances=\u6240\u6709\u5b9e\u4f8b -label.menu.community.isos=\u793e\u533a ISO -label.menu.community.templates=\u793e\u533a\u6a21\u677f -label.menu.configuration=\u914d\u7f6e -label.menu.dashboard=\u63a7\u5236\u677f -label.menu.destroyed.instances=\u5df2\u9500\u6bc1\u7684\u5b9e\u4f8b -label.menu.disk.offerings=\u78c1\u76d8\u65b9\u6848 -label.menu.domains=\u57df -label.menu.events=\u4e8b\u4ef6 -label.menu.featured.isos=\u7cbe\u9009 ISO -label.menu.featured.templates=\u7cbe\u9009\u6a21\u677f -label.menu.global.settings=\u5168\u5c40\u8bbe\u7f6e -label.menu.infrastructure=\u57fa\u7840\u67b6\u6784 -label.menu.instances=\u5b9e\u4f8b -label.menu.ipaddresses=IP \u5730\u5740 -label.menu.isos=ISO -label.menu.my.accounts=\u6211\u7684\u5e10\u6237 -label.menu.my.instances=\u6211\u7684\u5b9e\u4f8b -label.menu.my.isos=\u6211\u7684 ISO -label.menu.my.templates=\u6211\u7684\u6a21\u677f -label.menu.network.offerings=\u7f51\u7edc\u65b9\u6848 -label.menu.network=\u7f51\u7edc -label.menu.physical.resources=\u7269\u7406\u8d44\u6e90 -label.menu.regions=\u5730\u7406\u533a\u57df -label.menu.running.instances=\u6b63\u5728\u8fd0\u884c\u7684\u5b9e\u4f8b -label.menu.security.groups=\u5b89\u5168\u7ec4 -label.menu.service.offerings=\u670d\u52a1\u65b9\u6848 -label.menu.snapshots=\u5feb\u7167 -label.menu.sshkeypair=SSH \u5bc6\u94a5\u5bf9 -label.menu.stopped.instances=\u5df2\u505c\u6b62\u7684\u5b9e\u4f8b -label.menu.storage=\u5b58\u50a8 -label.menu.system.service.offerings=\u7cfb\u7edf\u65b9\u6848 -label.menu.system=\u7cfb\u7edf -label.menu.system.vms=\u7cfb\u7edf VM -label.menu.templates=\u6a21\u677f -label.menu.virtual.appliances=\u865a\u62df\u8bbe\u5907 -label.menu.virtual.resources=\u865a\u62df\u8d44\u6e90 -label.menu.volumes=\u5377 -label.menu.vpc.offerings=VPC \u65b9\u6848 -label.metrics.allocated=\u5df2\u5206\u914d -label.metrics.clusters=\u7fa4\u96c6 -label.metrics.cpu.used.avg=\u5df2\u4f7f\u7528 -label.metrics.disk.allocated=\u5df2\u5206\u914d -label.metrics.disk.size=\u5927\u5c0f -label.metrics.disk.storagetype=\u7c7b\u578b -label.metrics.disk.used=\u5df2\u4f7f\u7528 -label.metrics.hosts=\u4e3b\u673a -label.metrics.memory.used.avg=\u5df2\u4f7f\u7528 -label.metrics.name=\u540d\u79f0 -label.metrics.scope=\u8303\u56f4 -label.metrics.state=\u72b6\u6001 -label.metrics.storagepool=\u5b58\u50a8\u6c60 -label.migrate.instance.to.host=\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u673a -label.migrate.instance.to.ps=\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8 -label.migrate.instance.to=\u8fc1\u79fb\u5b9e\u4f8b\u81f3 -label.migrate.lb.vm=\u8fc1\u79fb LB VM -label.migrate.router.to=\u8fc1\u79fb\u8def\u7531\u5668\u81f3 -label.migrate.systemvm.to=\u8fc1\u79fb\u7cfb\u7edf VM \u81f3 -label.migrate.to.host=\u8fc1\u79fb\u5230\u4e3b\u673a -label.migrate.to.storage=\u8fc1\u79fb\u5230\u5b58\u50a8 -label.migrate.volume.to.primary.storage=\u5c06\u5377\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8 -label.migrate.volume=\u8fc1\u79fb\u5377 -label.minimum=\u6700\u5c0f\u503c -label.min.instances=\u6700\u5c0f\u5b9e\u4f8b\u6570 -label.min.past.the.hr=\u5206 \u6bcf\u5c0f\u65f6 -label.minute.past.hour=\u5206\u949f\u65f6 -label.minutes.past.hour=\u5206 (\u6bcf\u5c0f\u65f6) -label.mode=\u6a21\u5f0f -label.monday=\u661f\u671f\u4e00 -label.monthly=\u6bcf\u6708 -label.more.templates=\u66f4\u591a\u6a21\u677f -label.move.down.row=\u5411\u4e0b\u79fb\u52a8\u4e00\u884c -label.move.to.bottom=\u79fb\u81f3\u5e95\u90e8 -label.move.to.top=\u79fb\u81f3\u9876\u90e8 -label.move.up.row=\u5411\u4e0a\u79fb\u52a8\u4e00\u884c -label.my.account=\u6211\u7684\u5e10\u6237 -label.my.network=\u6211\u7684\u7f51\u7edc -label.my.templates=\u6211\u7684\u6a21\u677f -label.name.lower=\u540d\u79f0 -label.name.optional=\u540d\u79f0(\u53ef\u9009) -label.name=\u540d\u79f0 -label.nat.port.range=NAT \u7aef\u53e3\u8303\u56f4 -label.na=\u65e0 -label.netmask=\u7f51\u7edc\u63a9\u7801 -label.netscaler.details=NetScaler \u8be6\u7ec6\u4fe1\u606f -label.netScaler=NetScaler -label.network.ACLs=\u7f51\u7edc ACL -label.network.ACL.total=\u7f51\u7edc ACL \u603b\u6570 -label.network.ACL=\u7f51\u7edc ACL -label.network.addVM=\u5c06\u7f51\u7edc\u6dfb\u52a0\u5230 VM -label.network.cidr=\u7f51\u7edc CIDR -label.network.desc=\u7f51\u7edc\u63cf\u8ff0 -label.network.details=\u7f51\u7edc\u8be6\u60c5 -label.network.device.type=\u7f51\u7edc\u8bbe\u5907\u7c7b\u578b -label.network.device=\u7f51\u7edc\u8bbe\u5907 -label.network.domain.text=\u7f51\u7edc\u57df -label.network.domain=\u7f51\u7edc\u57df -label.network.id=\u7f51\u7edc ID -label.networking.and.security=\u7f51\u7edc\u8fde\u63a5\u4e0e\u5b89\u5168 -label.network.label.display.for.blank.value=\u4f7f\u7528\u9ed8\u8ba4\u7f51\u5173 -label.network.limits=\u7f51\u7edc\u9650\u5236 -label.network.name=\u7f51\u7edc\u540d\u79f0 -label.network.offering.details=\u7f51\u7edc\u65b9\u6848\u8be6\u60c5 -label.network.offering.display.text=\u7f51\u7edc\u65b9\u6848\u663e\u793a\u6587\u672c -label.network.offering.id=\u7f51\u7edc\u65b9\u6848 ID -label.network.offering.name=\u7f51\u7edc\u65b9\u6848\u540d\u79f0 -label.network.offering=\u7f51\u7edc\u65b9\u6848 -label.network.rate.megabytes=\u7f51\u7edc\u901f\u7387(MB/\u79d2) -label.network.rate=\u7f51\u7edc\u901f\u7387(MB/\u79d2) -label.network.read=\u7f51\u7edc\u8bfb\u53d6\u91cf -label.network.service.providers=\u7f51\u7edc\u670d\u52a1\u63d0\u4f9b\u7a0b\u5e8f -label.networks=\u7f51\u7edc -label.network.type=\u7f51\u7edc\u7c7b\u578b -label.network=\u7f51\u7edc -label.network.write=\u7f51\u7edc\u5199\u5165\u91cf -label.new.password=\u65b0\u5bc6\u7801 -label.new.project=\u65b0\u5efa\u9879\u76ee -label.new.ssh.key.pair=\u65b0SSH\u5bc6\u94a5\u5bf9 -label.new=\u65b0\u5efa -label.new.vm=\u65b0\u5efa VM -label.next=\u4e0b\u4e00\u6b65 -label.nexusVswitch=Nexus 1000v -label.nfs=NFS -label.nfs.server=NFS \u670d\u52a1\u5668 -label.nfs.storage=NFS \u5b58\u50a8 -label.nic.adapter.type=NIC \u9002\u914d\u5668\u7c7b\u578b -label.nicira.controller.address=\u63a7\u5236\u5668\u5730\u5740 -label.nicira.l3gatewayserviceuuid=L3 Gateway Service UUID -label.nicira.nvp.details=Nicira NVP \u8be6\u7ec6\u4fe1\u606f -label.nicira.transportzoneuuid=\u4f20\u8f93\u8d44\u6e90\u57df UUID -label.nics=NIC -label.no.actions=\u65e0\u53ef\u7528\u64cd\u4f5c -label.no.alerts=\u65e0\u6700\u8fd1\u53d1\u51fa\u7684\u8b66\u62a5 -label.no.data=\u65e0\u53ef\u663e\u793a\u7684\u6570\u636e -label.no.errors=\u65e0\u6700\u8fd1\u51fa\u73b0\u7684\u9519\u8bef -label.no.grouping=(\u672a\u5206\u7ec4) -label.no.isos=\u65e0\u53ef\u7528 ISO -label.no.items=\u65e0\u53ef\u7528\u9879\u76ee -label.none=\u65e0 -label.no.security.groups=\u65e0\u53ef\u7528\u5b89\u5168\u7ec4 -label.not.found=\u672a\u627e\u5230 -label.no.thanks=\u4e0d\uff0c\u8c22\u8c22 -label.notifications=\u901a\u77e5 -label.no=\u5426 -label.number.of.clusters=\u7fa4\u96c6\u6570\u91cf -label.number.of.cpu.sockets=CPU \u63d2\u69fd\u6570 -label.number.of.hosts=\u4e3b\u673a\u6570\u91cf -label.number.of.pods=\u63d0\u4f9b\u70b9\u6570\u91cf -label.number.of.system.vms=\u7cfb\u7edf VM \u6570 -label.number.of.virtual.routers=\u865a\u62df\u8def\u7531\u5668\u6570 -label.number.of.zones=\u8d44\u6e90\u57df\u6570\u91cf -label.num.cpu.cores=CPU \u5185\u6838\u6570 -label.numretries=\u91cd\u8bd5\u6b21\u6570 -label.ocfs2=OCFS2 -label.offer.ha=\u63d0\u4f9b\u9ad8\u53ef\u7528\u6027 -label.of.month=\u6708 -label.ok=\u786e\u5b9a -label.opendaylight.controllerdetail=OpenDaylight \u63a7\u5236\u5668\u8be6\u7ec6\u4fe1\u606f -label.opendaylight.controller=OpenDaylight \u63a7\u5236\u5668 -label.opendaylight.controllers=OpenDaylight \u63a7\u5236\u5668 -label.openDaylight=OpenDaylight -label.operator=\u8fd0\u7b97\u7b26 -label.optional=\u53ef\u9009 -label.order=\u6392\u5e8f -label.os.preference=\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879 -label.os.type=\u64cd\u4f5c\u7cfb\u7edf\u7c7b\u578b -label.other=\u5176\u4ed6 -label.outofbandmanagement.action=\u64cd\u4f5c -label.outofbandmanagement.password=\u5bc6\u7801 -label.outofbandmanagement.port=\u7aef\u53e3 -label.outofbandmanagement.username=\u7528\u6237\u540d -label.override.guest.traffic=\u66ff\u4ee3\u6765\u5bbe\u6d41\u91cf -label.override.public.traffic=\u66ff\u4ee3\u516c\u5171\u6d41\u91cf -label.ovm3.cluster=\u672c\u5730\u96c6\u7fa4 -label.ovm3.pool=\u539f\u751f\u6c60 -label.ovm3.vip=\u4e3b\u865a\u62dfIP -label.ovm.traffic.label=OVM \u6d41\u91cf\u6807\u7b7e -label.ovs=OVS -label.owned.public.ips=\u62e5\u6709\u7684\u516c\u7528 IP \u5730\u5740\u6570 -label.owner.account=\u6240\u6709\u8005\u5e10\u6237 -label.owner.domain=\u6240\u6709\u8005\u57df -label.palo.alto.details=Palo Alto \u8be6\u7ec6\u4fe1\u606f -label.PA.log.profile=Palo Alto \u65e5\u5fd7\u914d\u7f6e\u6587\u4ef6 -label.PA=Palo Alto -label.parent.domain=\u7236\u57df -label.passive=\u88ab\u52a8 -label.password.enabled=\u5df2\u542f\u7528\u5bc6\u7801 -label.password.lower=\u5bc6\u7801 -label.password.reset.confirm=\u5bc6\u7801\u5df2\u91cd\u7f6e\u4e3a -label.password=\u5bc6\u7801 -label.PA.threat.profile=Palo Alto \u5a01\u80c1\u914d\u7f6e\u6587\u4ef6 -label.path=\u8def\u5f84 -label.perfect.forward.secrecy=\u5b8c\u5168\u6b63\u5411\u4fdd\u5bc6 -label.persistent=\u6c38\u4e45 -label.physical.network.ID=\u7269\u7406\u7f51\u7edc ID -label.physical.network.name=\u7269\u7406\u7f51\u7edc\u540d\u79f0 -label.physical.network=\u7269\u7406\u7f51\u7edc -label.PING.CIFS.password=PING CIFS \u5bc6\u7801 -label.PING.CIFS.username=PING CIFS \u7528\u6237\u540d -label.PING.dir=PING \u76ee\u5f55 -label.ping.path=Ping \u8def\u5f84 -label.PING.storage.IP=PING \u5b58\u50a8 IP -label.planner.mode=\u89c4\u5212\u5668\u6a21\u5f0f -label.please.complete.the.following.fields=\u8bf7\u5b8c\u6210\u4ee5\u4e0b\u5185\u5bb9 -label.please.specify.netscaler.info=\u8bf7\u6307\u5b9a NetScaler \u4fe1\u606f -label.please.wait=\u8bf7\u7a0d\u5019 -label.plugin.details=\u63d2\u4ef6\u8be6\u7ec6\u4fe1\u606f -label.plugins=\u63d2\u4ef6 -label.pod.dedicated=\u63d0\u4f9b\u70b9\u5df2\u4e13\u7528 -label.pod.name=\u63d0\u4f9b\u70b9\u540d\u79f0 -label.pods=\u63d0\u4f9b\u70b9 -label.pod=\u63d0\u4f9b\u70b9 -label.polling.interval.sec=\u8f6e\u8be2\u65f6\u95f4\u95f4\u9694(\u79d2) -label.portable.ip.range.details=\u53ef\u79fb\u690d IP \u8303\u56f4\u8be6\u7ec6\u4fe1\u606f -label.portable.ip.ranges=\u53ef\u79fb\u690d IP \u8303\u56f4 -label.portable.ips=\u53ef\u79fb\u690d IP -label.portable.ip=\u53ef\u79fb\u690d IP -label.port.forwarding.policies=\u7aef\u53e3\u8f6c\u53d1\u7b56\u7565 -label.port.forwarding=\u7aef\u53e3\u8f6c\u53d1 -label.port.range=\u7aef\u53e3\u8303\u56f4 -label.port=\u7aef\u53e3 -label.PreSetup=PreSetup -label.previous=\u4e0a\u4e00\u6b65 -label.prev=\u4e0a\u4e00\u9875 -label.primary.allocated=\u5df2\u5206\u914d\u7684\u4e3b\u5b58\u50a8 -label.primary.network=\u4e3b\u7f51\u7edc -label.primary.storage.count=\u4e3b\u5b58\u50a8\u6c60 -label.primary.storage.limits=\u4e3b\u5b58\u50a8\u9650\u5236(GiB) -label.primary.storage=\u4e3b\u5b58\u50a8 -label.primary.used=\u5df2\u4f7f\u7528\u7684\u4e3b\u5b58\u50a8 -label.private.Gateway=\u4e13\u7528\u7f51\u5173 -label.private.interface=\u4e13\u7528\u63a5\u53e3 -label.private.ip.range=\u4e13\u7528 IP \u8303\u56f4 -label.private.ips=\u4e13\u7528 IP \u5730\u5740 -label.private.ip=\u4e13\u7528 IP \u5730\u5740 -label.privatekey=PKCS\#8 \u79c1\u94a5 -label.private.key=\u79c1\u94a5 -label.private.network=\u4e13\u7528\u7f51\u7edc -label.private.port=\u4e13\u7528\u7aef\u53e3 -label.private.zone=\u4e13\u7528\u8d44\u6e90\u57df -label.profile=\u914d\u7f6e\u6587\u4ef6 -label.project.dashboard=\u9879\u76ee\u63a7\u5236\u677f -label.project.id=\u9879\u76ee ID -label.project.invite=\u9080\u8bf7\u52a0\u5165\u9879\u76ee -label.project.name=\u9879\u76ee\u540d\u79f0 -label.projects=\u9879\u76ee -label.project=\u9879\u76ee -label.project.view=\u9879\u76ee\u89c6\u56fe -label.protocol.number=\u534f\u8bae\u7f16\u53f7 -label.protocol=\u534f\u8bae -label.providers=\u63d0\u4f9b\u7a0b\u5e8f -label.provider=\u63d0\u4f9b\u7a0b\u5e8f -label.public.interface=\u516c\u7528\u63a5\u53e3 -label.public.ips=\u516c\u7528 IP \u5730\u5740 -label.public.ip=\u516c\u7528 IP \u5730\u5740 -label.public.key=\u516c\u94a5 -label.public.lb=\u516c\u5171\u8d1f\u8f7d\u5747\u8861\u5668 -label.public.load.balancer.provider=\u516c\u7528\u8d1f\u8f7d\u5e73\u8861\u5668\u63d0\u4f9b\u7a0b\u5e8f -label.public.network=\u516c\u7528\u7f51\u7edc -label.public.port=\u516c\u7528\u7aef\u53e3 -label.public.traffic=\u516c\u5171\u6d41\u91cf -label.public.traffic.vswitch.name=\u516c\u5171\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u540d\u79f0 -label.public.traffic.vswitch.type=\u516c\u5171\u6d41\u91cf\u865a\u62df\u4ea4\u6362\u673a\u7c7b\u578b -label.public=\u516c\u7528 -label.public.zone=\u516c\u7528\u8d44\u6e90\u57df -label.purpose=\u76ee\u7684 -label.Pxe.server.type=Pxe \u670d\u52a1\u5668\u7c7b\u578b -label.qos.type=QoS \u7c7b\u578b -label.quickview=\u5feb\u901f\u67e5\u770b -label.quiesce.vm=\u9759\u9ed8 VM -label.quiet.time.sec=\u5b89\u9759\u65f6\u95f4(\u79d2) -label.quota.date=\u65e5\u671f -label.quota.fullsummary=\u6240\u6709\u5e10\u6237 -label.quota.state=\u72b6\u6001 -label.rbd.id=Cephx \u7528\u6237 -label.rbd.monitor=Ceph \u76d1\u89c6\u5668 -label.rbd.pool=Ceph \u6c60 -label.rbd=RBD -label.rbd.secret=Cephx \u5bc6\u94a5 -label.reboot=\u91cd\u65b0\u542f\u52a8 -label.recent.errors=\u6700\u8fd1\u51fa\u73b0\u7684\u9519\u8bef -label.recover.vm=\u6062\u590d VM -label.redundant.router.capability=\u5197\u4f59\u8def\u7531\u5668\u529f\u80fd -label.redundant.router=\u5197\u4f59\u8def\u7531\u5668 -label.redundant.state=\u5197\u4f59\u72b6\u6001 -label.redundant.vpc=\u5197\u4f59VPC -label.refresh.blades=\u5237\u65b0\u5200\u7247\u5f0f\u670d\u52a1\u5668 -label.refresh=\u5237\u65b0 -label.region.details=\u5730\u7406\u533a\u57df\u8be6\u60c5 -label.regionlevelvpc=\u5730\u7406\u533a\u57df\u7ea7 VPC -label.region=\u5730\u7406\u533a\u57df -label.reinstall.vm=\u91cd\u65b0\u5b89\u88c5 VM -label.related=\u76f8\u5173\u8054 -label.release.account.lowercase=\u4ece\u5e10\u6237\u4e2d\u91ca\u653e -label.release.account=\u4ece\u5e10\u6237\u4e2d\u91ca\u653e -label.release.dedicated.cluster=\u91ca\u653e\u4e13\u7528\u7fa4\u96c6 -label.release.dedicated.host=\u91ca\u653e\u4e13\u7528\u4e3b\u673a -label.release.dedicated.pod=\u91ca\u653e\u4e13\u7528\u63d0\u4f9b\u70b9 -label.release.dedicated.vlan.range=\u91ca\u653e\u4e13\u7528 VLAN \u8303\u56f4 -label.release.dedicated.zone=\u91ca\u653e\u4e13\u7528\u8d44\u6e90\u57df -label.remind.later=\u4ee5\u540e\u63d0\u9192\u6211 -label.remove.ACL=\u5220\u9664 ACL -label.remove.egress.rule=\u5220\u9664\u51fa\u53e3\u89c4\u5219 -label.remove.from.load.balancer=\u6b63\u5728\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u4e2d\u5220\u9664\u5b9e\u4f8b -label.remove.ingress.rule=\u5220\u9664\u5165\u53e3\u89c4\u5219 -label.remove.ip.range=\u5220\u9664 IP \u8303\u56f4 -label.remove.ldap=\u5220\u9664 LDAP -label.remove.network.offering=\u5220\u9664\u7f51\u7edc\u65b9\u6848 -label.remove.pf=\u5220\u9664\u7aef\u53e3\u8f6c\u53d1\u89c4\u5219 -label.remove.project.account=\u4ece\u9879\u76ee\u4e2d\u5220\u9664\u5e10\u6237 -label.remove.region=\u5220\u9664\u5730\u7406\u533a\u57df -label.remove.rule=\u5220\u9664\u89c4\u5219 -label.remove.ssh.key.pair=\u5220\u9664\u5bc6\u94a5\u5bf9 -label.remove.static.nat.rule=\u5220\u9664\u9759\u6001 NAT \u89c4\u5219 -label.remove.static.route=\u5220\u9664\u9759\u6001\u8def\u7531 -label.remove.this.physical.network=\u5220\u9664\u6b64\u7269\u7406\u7f51\u7edc -label.remove.tier=\u5220\u9664\u5c42 -label.remove.vm.from.lb=\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219\u4e2d\u5220\u9664 VM -label.remove.vm.load.balancer=\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u4e2d\u5220\u9664 VM -label.remove.vmware.datacenter=\u5220\u9664 VMware \u6570\u636e\u4e2d\u5fc3 -label.remove.vpc.offering=\u5220\u9664 VPC \u65b9\u6848 -label.remove.vpc=\u5220\u9664 VPC -label.removing=\u6b63\u5728\u5220\u9664 -label.removing.user=\u6b63\u5728\u5220\u9664\u7528\u6237 -label.reource.id=\u8d44\u6e90 ID -label.replace.acl.list=\u66ff\u6362 ACL \u5217\u8868 -label.replace.acl=\u66ff\u6362 ACL -label.required=\u5fc5\u586b\u9879 -label.requires.upgrade=\u9700\u8981\u5347\u7ea7 -label.reserved.ip.range=\u9884\u7559 IP \u8303\u56f4 -label.reserved.system.gateway=\u9884\u7559\u7684\u7cfb\u7edf\u7f51\u5173 -label.reserved.system.ip=\u9884\u7559\u7684\u7cfb\u7edf IP -label.reserved.system.netmask=\u9884\u7559\u7684\u7cfb\u7edf\u7f51\u7edc\u63a9\u7801 -label.reset.ssh.key.pair.on.vm=\u91cd\u7f6e\u5b9e\u4f8b\u7684SSH\u5bc6\u94a5\u5bf9 -label.reset.ssh.key.pair=\u91cd\u7f6eSSH\u5bc6\u94a5\u5bf9 -label.resetVM=\u91cd\u7f6e VM -label.reset.VPN.connection=\u91cd\u7f6e VPN \u8fde\u63a5 -label.resize.new.offering.id=\u65b0\u65b9\u6848 -label.resize.new.size=\u65b0\u5efa\u5927\u5c0f(GB) -label.resize.shrink.ok=\u662f\u5426\u786e\u5b9e\u8981\u7f29\u5c0f\u5377\u5927\u5c0f -label.resource.limit.exceeded=\u5df2\u8d85\u51fa\u8d44\u6e90\u9650\u5236 -label.resource.limits=\u8d44\u6e90\u9650\u5236 -label.resource.name=\u8d44\u6e90\u540d\u79f0 -label.resource.state=\u8d44\u6e90\u72b6\u6001 -label.resources=\u8d44\u6e90 -label.resource=\u8d44\u6e90 -label.response.timeout.in.sec=\u54cd\u5e94\u8d85\u65f6(\u79d2) -label.restart.network=\u91cd\u65b0\u542f\u52a8\u7f51\u7edc -label.restart.required=\u9700\u8981\u91cd\u65b0\u542f\u52a8 -label.restart.vpc=\u91cd\u65b0\u542f\u52a8 VPC -label.restore=\u8fd8\u539f -label.retry.interval=\u91cd\u8bd5\u65f6\u95f4\u95f4\u9694 -label.review=\u6838\u5bf9 -label.revoke.project.invite=\u64a4\u9500\u9080\u8bf7 -label.roles=\u89d2\u8272 -label.role=\u89d2\u8272 -label.root.certificate=\u6839\u8bc1\u4e66 -label.root.disk.controller=\u6839\u78c1\u76d8\u63a7\u5236\u5668 -label.root.disk.offering=\u6839\u78c1\u76d8\u65b9\u6848 -label.router.vm.scaled.up=\u5df2\u6269\u5c55\u8def\u7531\u5668 VM -label.routing.host=\u6b63\u5728\u8def\u7531\u4e3b\u673a -label.routing=\u6b63\u5728\u8def\u7531 -label.rule.number=\u89c4\u5219\u7f16\u53f7 -label.rules=\u89c4\u5219 -label.rule=\u89c4\u5219 -label.running.vms=\u6b63\u5728\u8fd0\u884c\u7684 VM -label.s3.access_key=\u8bbf\u95ee\u5bc6\u94a5 -label.s3.bucket=\u5b58\u50a8\u6876 -label.s3.connection_timeout=\u8fde\u63a5\u8d85\u65f6 -label.s3.endpoint=\u7aef\u70b9 -label.s3.max_error_retry=\u6700\u5927\u9519\u8bef\u91cd\u8bd5\u6b21\u6570 -label.s3.nfs.path=S3 NFS \u8def\u5f84 -label.s3.nfs.server=S3 NFS \u670d\u52a1\u5668 -label.s3.secret_key=\u5bc6\u94a5 -label.s3.socket_timeout=\u5957\u63a5\u5b57\u8d85\u65f6 -label.s3.use_https=\u4f7f\u7528 HTTPS -label.saml.enable=\u6279\u51c6 SAML SSO -label.saml.entity=\u8ba4\u8bc1\u65b9\u5f0f -label.saturday=\u661f\u671f\u516d -label.save.and.continue=\u4fdd\u5b58\u5e76\u7ee7\u7eed -label.save.changes=\u4fdd\u5b58\u4fee\u6539 -label.save=\u4fdd\u5b58 -label.saving.processing=\u6b63\u5728\u4fdd\u5b58... -label.scaledown.policy=\u51cf\u7f29\u7b56\u7565 -label.scale.up.policy=\u6269\u5c55\u7b56\u7565 -label.scaleup.policy=\u6269\u5c55\u7b56\u7565 -label.scope=\u8303\u56f4 -label.search=\u641c\u7d22 -label.secondary.ips=\u4e8c\u7ea7 IPs -label.secondary.isolated.vlan.id=\u4e8c\u7ea7\u9694\u79bb VLAN ID -label.secondary.staging.store.details=\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8\u8be6\u7ec6\u4fe1\u606f -label.secondary.staging.store=\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8 -label.secondary.storage.count=\u4e8c\u7ea7\u5b58\u50a8\u6c60 -label.secondary.storage.details=\u4e8c\u7ea7\u5b58\u50a8\u8be6\u7ec6\u4fe1\u606f -label.secondary.storage.limits=\u4e8c\u7ea7\u5b58\u50a8\u9650\u5236(GiB) -label.secondary.storage=\u4e8c\u7ea7\u5b58\u50a8 -label.secondary.storage.vm=\u4e8c\u7ea7\u5b58\u50a8 VM -label.secondary.used=\u5df2\u4f7f\u7528\u7684\u4e8c\u7ea7\u5b58\u50a8 -label.secret.key=\u5bc6\u94a5 -label.security.group.name=\u5b89\u5168\u7ec4\u540d\u79f0 -label.security.groups.enabled=\u5df2\u542f\u7528\u5b89\u5168\u7ec4 -label.security.groups=\u5b89\u5168\u7ec4 -label.security.group=\u5b89\u5168\u7ec4 -label.select.a.template=\u9009\u62e9\u4e00\u4e2a\u6a21\u677f -label.select.a.zone=\u9009\u62e9\u4e00\u4e2a\u8d44\u6e90\u57df -label.select.instance.to.attach.volume.to=\u9009\u62e9\u8981\u5c06\u5377\u9644\u52a0\u5230\u7684\u5b9e\u4f8b -label.select.instance=\u9009\u62e9\u5b9e\u4f8b -label.select.iso.or.template=\u9009\u62e9 ISO \u6216\u6a21\u677f -label.select.offering=\u9009\u62e9\u65b9\u6848 -label.select.project=\u9009\u62e9\u9879\u76ee -label.select.region=\u9009\u62e9\u5730\u7406\u533a\u57df -label.select.template=\u9009\u62e9\u6a21\u677f -label.select.tier=\u9009\u62e9\u5c42 -label.select=\u9009\u62e9 -label.select-view=\u9009\u62e9\u89c6\u56fe -label.select.vm.for.static.nat=\u4e3a\u9759\u6001 NAT \u9009\u62e9 VM -label.sent=\u5df2\u53d1\u9001 -label.server=\u670d\u52a1\u5668 -label.service.capabilities=\u670d\u52a1\u529f\u80fd -label.service.offering.details=\u670d\u52a1\u65b9\u6848\u8be6\u60c5 -label.service.offering=\u670d\u52a1\u65b9\u6848 -label.service.state=\u670d\u52a1\u72b6\u6001 -label.services=\u670d\u52a1 -label.session.expired=\u4f1a\u8bdd\u5df2\u8fc7\u671f -label.set.default.NIC=\u8bbe\u7f6e\u9ed8\u8ba4 NIC -label.settings=\u8bbe\u7f6e -label.setup.network=\u914d\u7f6e\u7f51\u7edc -label.setup=\u8bbe\u7f6e -label.set.up.zone.type=\u8bbe\u7f6e\u8d44\u6e90\u57df\u7c7b\u578b -label.setup.zone=\u914d\u7f6e\u533a\u57df -label.SharedMountPoint=SharedMountPoint -label.shared=\u5df2\u5171\u4eab -label.show.advanced.settings=\u663e\u793a\u9ad8\u7ea7\u8bbe\u7f6e -label.show.ingress.rule=\u663e\u793a\u5165\u53e3\u89c4\u5219 -label.shutdown.provider=\u5173\u95ed\u63d0\u4f9b\u7a0b\u5e8f -label.simplified.chinese.keyboard=\u7b80\u4f53\u4e2d\u6587\u952e\u76d8 -label.site.to.site.VPN=\u70b9\u5bf9\u70b9 VPN -label.size=\u5927\u5c0f -label.skip.guide=\u6211\u4ee5\u524d\u4f7f\u7528\u8fc7 CloudStack\uff0c\u8df3\u8fc7\u6b64\u6307\u5357 -label.smb.domain=SMB \u57df -label.smb.password=SMB \u5bc6\u7801 -label.smb.username=SMB \u7528\u6237\u540d -label.snapshot.limits=\u5feb\u7167\u9650\u5236 -label.snapshot.name=\u5feb\u7167\u540d\u79f0 -label.snapshot.schedule=\u8bbe\u7f6e\u91cd\u73b0\u5feb\u7167 -label.snapshot.s=\u5feb\u7167 -label.snapshots=\u5feb\u7167 -label.snapshot=\u5feb\u7167 -label.SNMP.community=SNMP \u793e\u533a -label.SNMP.port=SNMP \u7aef\u53e3 -label.sockets=CPU \u63d2\u69fd -label.source.ip.address=\u6e90 IP \u5730\u5740 -label.source.nat.supported=\u652f\u6301 SourceNAT -label.source.nat=\u6e90 NAT -label.source.port=\u6e90\u7aef\u53e3 -label.specify.IP.ranges=\u6307\u5b9a IP \u8303\u56f4 -label.specify.vlan=\u6307\u5b9a VLAN -label.specify.vxlan=\u6307\u5b9a VXLAN -label.SR.name=SR \u540d\u79f0\u6807\u7b7e -label.srx.details=SRX \u8be6\u7ec6\u4fe1\u606f -label.srx=SRX -label.ssh.key.pair.details=SSH\u5bc6\u94a5\u5bf9\u8be6\u60c5 -label.ssh.key.pair=SSH\u5bc6\u94a5\u5bf9 -label.ssh.key.pairs=SSH\u5bc6\u94a5\u5bf9 -label.standard.us.keyboard=\u6807\u51c6(US)\u952e\u76d8 -label.start.IP=\u8d77\u59cb IP -label.start.lb.vm=\u542f\u52a8 LB VM -label.start.port=\u8d77\u59cb\u7aef\u53e3 -label.start.reserved.system.IP=\u8d77\u59cb\u9884\u7559\u7cfb\u7edf IP -label.start.vlan=\u8d77\u59cb VLAN -label.start.vxlan=\u8d77\u59cb VXLAN -label.state=\u72b6\u6001 -label.static.nat.enabled=\u5df2\u542f\u7528\u9759\u6001 NAT -label.static.nat.to=\u9759\u6001 NAT \u76ee\u6807 -label.static.nat=\u9759\u6001 NAT -label.static.nat.vm.details=\u9759\u6001 NAT VM \u8be6\u60c5 -label.static.routes=\u9759\u6001\u8def\u7531\u5668 -label.statistics=\u7edf\u8ba1\u6570\u636e -label.status=\u72b6\u6001 -label.step.1.title=\u6b65\u9aa4 1\: \u9009\u62e9\u4e00\u4e2a\u6a21\u677f -label.step.1=\u6b65\u9aa4 1 -label.step.2.title=\u6b65\u9aa4 2\: \u670d\u52a1\u65b9\u6848 -label.step.2=\u6b65\u9aa4 2 -label.step.3.title=\u6b65\u9aa4 3\: \u9009\u62e9\u4e00\u79cd\u78c1\u76d8\u65b9\u6848 -label.step.3=\u6b65\u9aa4 3 -label.step.4.title=\u6b65\u9aa4 4\: \u7f51\u7edc -label.step.4=\u6b65\u9aa4 4 -label.step.5.title=\u6b65\u9aa4 5\: \u6838\u5bf9 -label.step.5=\u6b65\u9aa4 5 -label.stickiness.method=\u7c98\u6027\u65b9\u6cd5 -label.stickiness=\u7c98\u6027 -label.sticky.cookie-name=Cookie \u540d\u79f0 -label.sticky.domain=\u57df -label.sticky.expire=\u8fc7\u671f\u65e5\u671f -label.sticky.holdtime=\u6301\u7eed\u65f6\u95f4 -label.sticky.indirect=indirect -label.sticky.length=\u957f\u5ea6 -label.sticky.mode=\u6a21\u5f0f -label.sticky.name=\u7c98\u6027\u540d\u79f0 -label.sticky.nocache=nocache -label.sticky.postonly=postonly -label.sticky.prefix=prefix -label.sticky.request-learn=request-learn -label.sticky.tablesize=\u8868\u5927\u5c0f -label.stop.lb.vm=\u505c\u6b62 LB VM -label.stopped.vms=\u5df2\u505c\u6b62\u7684 VM -label.stop=\u505c\u6b62 -label.storage.pool=\u5b58\u50a8\u6c60 -label.storage.tags=\u5b58\u50a8\u6807\u7b7e -label.storage.traffic=\u5b58\u50a8\u6d41\u91cf -label.storage.type=\u5b58\u50a8\u7c7b\u578b -label.storage=\u5b58\u50a8 -label.subdomain.access=\u5b50\u57df\u8bbf\u95ee -label.submitted.by=[\u63d0\u4ea4\u8005\: ] -label.submit=\u63d0\u4ea4 -label.succeeded=\u6210\u529f -label.sunday=\u661f\u671f\u65e5 -label.super.cidr.for.guest.networks=\u6765\u5bbe\u7f51\u7edc\u7684\u8d85\u7ea7 CIDR -label.supported.services=\u652f\u6301\u7684\u670d\u52a1 -label.supported.source.NAT.type=\u652f\u6301\u7684\u6e90 NAT \u7c7b\u578b -label.supportsstrechedl2subnet=\u652f\u6301\u6269\u5c55\u4e8c\u7ea7\u5b50\u7f51 -label.suspend.project=\u6682\u505c\u9879\u76ee -label.switch.type=\u4ea4\u6362\u673a\u7c7b\u578b -label.system.capacity=\u7cfb\u7edf\u5bb9\u91cf -label.system.offering.for.router=\u8def\u7531\u5668\u7684\u7cfb\u7edf\u65b9\u6848 -label.system.offering=\u7cfb\u7edf\u65b9\u6848 -label.system.service.offering.details=\u7cfb\u7edf\u670d\u52a1\u65b9\u6848\u8be6\u60c5 -label.system.service.offering=\u7cfb\u7edf\u670d\u52a1\u65b9\u6848 -label.system.vm.details=\u7cfb\u7edf VM \u8be6\u7ec6\u4fe1\u606f -label.system.vm.scaled.up=\u5df2\u6269\u5c55\u7cfb\u7edf VM -label.system.vms=\u7cfb\u7edf VM -label.system.vm.type=\u7cfb\u7edf VM \u7c7b\u578b -label.system.vm=\u7cfb\u7edf VM -label.system.wide.capacity=\u6574\u4e2a\u7cfb\u7edf\u7684\u5bb9\u91cf -label.tagged=\u5df2\u6807\u8bb0 -label.tag.key=\u6807\u8bb0\u5bc6\u94a5 -label.tags=\u6807\u7b7e -label.tag.value=\u6807\u8bb0\u503c -label.target.iqn=\u76ee\u6807 IQN -label.task.completed=\u5df2\u5b8c\u6210\u4efb\u52a1 -label.template.limits=\u6a21\u677f\u9650\u5236 -label.template=\u6a21\u677f -label.TFTP.dir=TFTP \u76ee\u5f55 -label.tftp.root.directory=Tftp \u6839\u76ee\u5f55 -label.theme.default=\u9ed8\u8ba4\u4e3b\u9898 -label.theme.grey=\u81ea\u5b9a\u4e49 - \u7070\u8272 -label.theme.lightblue=\u81ea\u5b9a\u4e49 - \u6de1\u84dd\u8272 -label.threshold=\u9608\u503c -label.thursday=\u661f\u671f\u56db -label.tier.details=\u5c42\u8be6\u7ec6\u4fe1\u606f -label.tier=\u5c42 -label.time.colon=\u65f6\u95f4\: -label.timeout.in.second = \u8d85\u65f6(\u79d2) -label.timeout=\u8d85\u65f6 -label.time=\u65f6\u95f4 -label.timezone.colon=\u65f6\u533a -label.time.zone=\u65f6\u533a -label.timezone=\u65f6\u533a -label.token=\u4ee4\u724c -label.total.cpu=CPU \u603b\u91cf -label.total.CPU=CPU \u603b\u91cf -label.total.hosts=\u603b\u4e3b\u673a\u6570 -label.total.memory=\u5185\u5b58\u603b\u91cf -label.total.of.ip=IP\u5730\u5740\u603b\u6570 -label.total.of.vm=\u603b VM \u6570 -label.total.storage=\u5b58\u50a8\u603b\u91cf -label.total.virtual.routers=\u865a\u62df\u8def\u7531\u5668\u603b\u6570 -label.total.virtual.routers.upgrade=\u9700\u8981\u5347\u7ea7\u7684\u865a\u62df\u8def\u7531\u5668\u603b\u6570 -label.total.vms=\u603b VM \u6570 -label.traffic.label=\u6d41\u91cf\u6807\u7b7e -label.traffic.types=\u6d41\u91cf\u7c7b\u578b -label.traffic.type=\u6d41\u91cf\u7c7b\u578b -label.tuesday=\u661f\u671f\u4e8c -label.type.id=\u7c7b\u578b ID -label.type.lower=\u7c7b\u578b -label.type=\u7c7b\u578b -label.ucs=UCS -label.uk.keyboard=\u7f8e\u5f0f\u952e\u76d8 -label.unavailable=\u4e0d\u53ef\u7528 -label.unhealthy.threshold=\u4e0d\u6b63\u5e38\u9608\u503c -label.unlimited=\u65e0\u9650\u5236 -label.untagged=\u5df2\u53d6\u6d88\u6807\u8bb0 -label.update.project.resources=\u66f4\u65b0\u9879\u76ee\u8d44\u6e90 -label.update.ssl.cert= SSL \u8bc1\u4e66 -label.update.ssl= SSL \u8bc1\u4e66 -label.updating=\u6b63\u5728\u66f4\u65b0 -label.upgrade.required=\u9700\u8981\u5347\u7ea7 -label.upgrade.router.newer.template=\u5347\u7ea7\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f -label.upload.from.local=\u901a\u8fc7\u672c\u5730\u4e0a\u4f20 -label.upload.template.from.local=\u901a\u8fc7\u672c\u5730\u4e0a\u4f20\u6a21\u677f -label.upload=\u4e0a\u8f7d -label.upload.volume.from.local=\u901a\u8fc7\u672c\u5730\u4e0a\u4f20\u5377 -label.upload.volume.from.url=\u901a\u8fc7URL\u4e0a\u4f20\u5377 -label.upload.volume=\u4e0a\u8f7d\u5377 -label.url=URL -label.usage.interface=\u4f7f\u7528\u754c\u9762 -label.usage.sanity.result=\u4f7f\u7528\u5065\u5168\u6027\u68c0\u67e5\u7ed3\u679c -label.usage.server=\u4f7f\u7528\u670d\u52a1\u5668 -label.used=\u5df2\u4f7f\u7528 -label.user.data=\u7528\u6237\u6570\u636e -label.user.details=\u7528\u6237\u8be6\u60c5 -label.username.lower=\u7528\u6237\u540d -label.username=\u7528\u6237\u540d -label.users=\u7528\u6237 -label.user=\u7528\u6237 -label.user.vm=\u7528\u6237 VM -label.use.vm.ips=\u4f7f\u7528 VM IP -label.use.vm.ip=\u4f7f\u7528 VM IP\: -label.value=\u503c -label.vcdcname=vCenter DC \u540d\u79f0 -label.vcenter.cluster=vCenter \u7fa4\u96c6 -label.vcenter.datacenter=vCenter \u6570\u636e\u4e2d\u5fc3 -label.vcenter.datastore=vCenter \u6570\u636e\u5b58\u50a8 -label.vcenter.host=vCenter \u4e3b\u673a -label.vcenter.password=vCenter \u5bc6\u7801 -label.vcenter.username=vCenter \u7528\u6237\u540d -label.vcenter=vCenter -label.vcipaddress=vCenter IP \u5730\u5740 -label.version=\u7248\u672c -label.vgpu.max.resolution=\u6700\u5927\u5206\u8fa8\u7387 -label.vgpu.max.vgpu.per.gpu=\u6bcf\u4e2a GPU \u7684 vGPU \u6570 -label.vgpu.remaining.capacity=\u5269\u4f59\u5bb9\u91cf -label.vgpu.type=vGPU \u7c7b\u578b -label.vgpu=VGPU -label.vgpu.video.ram=\u89c6\u9891 RAM -label.view.all=\u67e5\u770b\u5168\u90e8 -label.view.console=\u67e5\u770b\u63a7\u5236\u53f0 -label.viewing=\u67e5\u770b -label.view.more=\u67e5\u770b\u66f4\u591a -label.view.secondary.ips=\u67e5\u770b\u4e8c\u7ea7 IP -label.view=\u67e5\u770b -label.virtual.appliance.details=\u865a\u62df\u8bbe\u5907\u8be6\u7ec6\u4fe1\u606f -label.virtual.appliances=\u865a\u62df\u8bbe\u5907 -label.virtual.appliance=\u865a\u62df\u8bbe\u5907 -label.virtual.machines=\u865a\u62df\u673a -label.virtual.machine=\u865a\u62df\u673a -label.virtual.networking=\u865a\u62df\u7f51\u7edc\u8fde\u63a5 -label.virtual.network=\u865a\u62df\u7f51\u7edc -label.virtual.routers.group.account=\u865a\u62df\u8def\u7531\u5668(\u6309\u5e10\u6237\u5206\u7ec4) -label.virtual.routers.group.cluster=\u865a\u62df\u8def\u7531\u5668(\u6309\u7fa4\u96c6\u5206\u7ec4) -label.virtual.routers.group.pod=\u865a\u62df\u8def\u7531\u5668(\u6309\u63d0\u4f9b\u70b9\u5206\u7ec4) -label.virtual.routers.group.zone=\u865a\u62df\u8def\u7531\u5668(\u6309\u8d44\u6e90\u57df\u5206\u7ec4) -label.virtual.routers=\u865a\u62df\u8def\u7531\u5668 -label.virtual.router=\u865a\u62df\u8def\u7531\u5668 -label.vlan.id=VLAN/VNI ID -label.vlan.only=VLAN -label.vlan.range.details=VLAN \u8303\u56f4\u8be6\u7ec6\u4fe1\u606f -label.vlan.ranges=VLAN \u8303\u56f4 -label.vlan.range=VLAN/VNI \u8303\u56f4 -label.vlan=VLAN/VNI -label.vlan.vni.ranges=VLAN/VNI \u8303\u56f4 -label.vlan.vni.range=VLAN/VNI \u8303\u56f4 -label.vm.add=\u6dfb\u52a0\u5b9e\u4f8b -label.vm.destroy=\u9500\u6bc1 -label.vm.display.name=VM \u663e\u793a\u540d\u79f0 -label.VMFS.datastore=VMFS \u6570\u636e\u5b58\u50a8 -label.vmfs=VMFS -label.vm.id=VM ID -label.vm.ip=VM IP \u5730\u5740 -label.vm.name=VM \u540d\u79f0 -label.vm.password=VM \u7684\u5bc6\u7801 -label.vm.reboot=\u91cd\u65b0\u542f\u52a8 -label.VMs.in.tier=\u5c42\u4e2d\u7684 VM -label.vmsnapshot.current=\u6700\u65b0\u7248\u672c -label.vmsnapshot.memory=\u5feb\u7167\u5185\u5b58 -label.vmsnapshot.parentname=\u7236\u540d\u79f0 -label.vmsnapshot.type=\u7c7b\u578b -label.vmsnapshot=VM \u5feb\u7167 -label.vm.start=\u542f\u52a8 -label.vm.state=VM \u72b6\u6001 -label.vm.stop=\u505c\u6b62 -label.vms=VM -label.vmware.datacenter.id=VMware \u6570\u636e\u4e2d\u5fc3 ID -label.vmware.datacenter.name=VMware \u6570\u636e\u4e2d\u5fc3\u540d\u79f0 -label.vmware.datacenter.vcenter=VMware \u6570\u636e\u4e2d\u5fc3 vCenter -label.vmware.traffic.label=VMware \u6d41\u91cf\u6807\u7b7e -label.vnet.id=VLAN/VNI ID -label.vnet=VLAN/VNI -label.vnmc.devices=VNMC \u8bbe\u5907 -label.vnmc=VNMC -label.volatile=\u53ef\u53d8 -label.volgroup=\u5377\u7ec4 -label.volume.details=\u5377\u8be6\u7ec6\u4fe1\u606f -label.volume.limits=\u5377\u9650\u5236 -label.volume.migrated=\u5377\u5df2\u8fc1\u79fb -label.volume.name=\u5377\u540d\u79f0 -label.volumes=\u5377 -label.volume=\u5377 -label.vpc.distributedvpcrouter=\u5206\u5e03\u5f0f VPC \u8def\u7531\u5668 -label.vpc.id=VPC ID -label.VPC.limits=VPC \u9650\u5236 -label.vpc.offering.details=VPC \u65b9\u6848\u8be6\u7ec6\u4fe1\u606f -label.vpc.offering=VPC \u65b9\u6848 -label.vpc.router.details=VPC \u8def\u7531\u5668\u8be6\u7ec6\u4fe1\u606f -label.VPC.router.details=VPC \u8def\u7531\u5668\u8be6\u7ec6\u4fe1\u606f -label.vpc.supportsregionlevelvpc=\u652f\u6301\u5730\u7406\u533a\u57df\u7ea7 VPC -label.vpc.virtual.router=VPC \u865a\u62df\u8def\u7531\u5668 -label.vpc=VPC -label.VPN.connection=VPN \u8fde\u63a5 -label.vpn.customer.gateway=VPN \u5ba2\u6237\u7f51\u5173 -label.VPN.customer.gateway=VPN \u5ba2\u6237\u7f51\u5173 -label.VPN.gateway=VPN \u7f51\u5173 -label.vpn=VPN -label.vsmctrlvlanid=\u63a7\u5236 VLAN ID -label.vsmpktvlanid=\u6570\u636e\u5305 VLAN ID -label.vsmstoragevlanid=\u5b58\u50a8 VLAN ID -label.vsphere.managed=\u7531 vSphere \u7ba1\u7406 -label.vswitch.name=vSwitch \u540d\u79f0 -label.vSwitch.type=vSwitch \u7c7b\u578b -label.vxlan.id=VXLAN ID -label.vxlan.range=VXLAN \u8303\u56f4 -label.vxlan=VXLAN -label.waiting=\u6b63\u5728\u7b49\u5f85 -label.warning=\u8b66\u544a -label.warn=\u8b66\u544a -label.warn.upper=\u8b66\u544a -label.wednesday=\u661f\u671f\u4e09 -label.weekly=\u6bcf\u5468 -label.welcome.cloud.console=\u6b22\u8fce\u4f7f\u7528\u7ba1\u7406\u63a7\u5236\u53f0 -label.welcome=\u6b22\u8fce -label.what.is.cloudstack=\u4ec0\u4e48\u662f CloudStack&\#8482? -label.xenserver.tools.version.61.plus=\u539f\u59cb XS \u7248\u672c\u4e3a 6.1+ -label.Xenserver.Tools.Version61plus=\u539f\u59cb XS \u7248\u672c\u4e3a 6.1+ -label.xenserver.traffic.label=XenServer \u6d41\u91cf\u6807\u7b7e -label.yes=\u662f -label.zone.dedicated=\u8d44\u6e90\u57df\u5df2\u4e13\u7528 -label.zone.details=\u8d44\u6e90\u57df\u8be6\u7ec6\u4fe1\u606f -label.zone.id=\u8d44\u6e90\u57df ID -label.zone.lower=\u8d44\u6e90\u57df -label.zone.name=\u533a\u57df\u540d\u79f0 -label.zone.step.1.title=\u6b65\u9aa4 1\: \u9009\u62e9\u4e00\u4e2a\u7f51\u7edc -label.zone.step.2.title=\u6b65\u9aa4 2\: \u6dfb\u52a0\u4e00\u4e2a\u8d44\u6e90\u57df -label.zone.step.3.title=\u6b65\u9aa4 3\: \u6dfb\u52a0\u4e00\u4e2a\u63d0\u4f9b\u70b9 -label.zone.step.4.title=\u6b65\u9aa4 4\: \u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4 -label.zones=\u8d44\u6e90\u57df -label.zone.type=\u8d44\u6e90\u57df\u7c7b\u578b -label.zone=\u8d44\u6e90\u57df -label.zone.wide=\u6574\u4e2a\u8d44\u6e90\u57df -label.zoneWizard.trafficType.guest=\u6765\u5bbe\: \u6700\u7ec8\u7528\u6237\u865a\u62df\u673a\u4e4b\u95f4\u7684\u6d41\u91cf -label.zoneWizard.trafficType.management=\u7ba1\u7406\: CloudStack \u7684\u5185\u90e8\u8d44\u6e90(\u5305\u62ec\u4e0e\u7ba1\u7406\u670d\u52a1\u5668\u901a\u4fe1\u7684\u4efb\u4f55\u7ec4\u4ef6\uff0c\u4f8b\u5982\u4e3b\u673a\u548c CloudStack \u7cfb\u7edf VM)\u4e4b\u95f4\u7684\u6d41\u91cf -label.zoneWizard.trafficType.public=\u516c\u7528\: \u4e91\u4e2d Internet \u4e0e\u865a\u62df\u673a\u4e4b\u95f4\u7684\u6d41\u91cf\u3002 -label.zoneWizard.trafficType.storage=\u5b58\u50a8\: \u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u4e0e\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668(\u4f8b\u5982 VM \u6a21\u677f\u4e0e\u5feb\u7167)\u4e4b\u95f4\u7684\u6d41\u91cf -managed.state=\u6258\u7ba1\u72b6\u6001 -message.acquire.ip.nic=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u83b7\u53d6\u6b64 NIC \u7684\u65b0\u4e8c\u7ea7 IP\u3002
\u6ce8\u610f\: \u60a8\u9700\u8981\u5728\u865a\u62df\u673a\u5185\u90e8\u624b\u52a8\u914d\u7f6e\u65b0\u83b7\u53d6\u7684\u4e8c\u7ea7 IP\u3002 -message.acquire.new.ip=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u7f51\u7edc\u83b7\u53d6\u4e00\u4e2a\u65b0 IP\u3002 -message.acquire.new.ip.vpc=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64 VPC \u83b7\u53d6\u4e00\u4e2a\u65b0 IP\u3002 -message.acquire.public.ip=\u8bf7\u9009\u62e9\u4e00\u4e2a\u8981\u4ece\u4e2d\u83b7\u53d6\u65b0 IP \u7684\u8d44\u6e90\u57df\u3002 -message.action.cancel.maintenance.mode=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u53d6\u6d88\u6b64\u7ef4\u62a4\u6a21\u5f0f\u3002 -message.action.cancel.maintenance=\u5df2\u6210\u529f\u53d6\u6d88\u7ef4\u62a4\u60a8\u7684\u4e3b\u673a\u3002\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u957f\u8fbe\u51e0\u5206\u949f\u65f6\u95f4\u3002 -message.action.change.service.warning.for.instance=\u5fc5\u987b\u5148\u7981\u7528\u60a8\u7684\u5b9e\u4f8b\uff0c\u7136\u540e\u518d\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u7684\u670d\u52a1\u65b9\u6848\u3002 -message.action.change.service.warning.for.router=\u5fc5\u987b\u5148\u505c\u6b62\u60a8\u7684\u8def\u7531\u5668\uff0c\u7136\u540e\u518d\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u7684\u670d\u52a1\u65b9\u6848\u3002 -message.action.delete.cluster=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7fa4\u96c6\u3002 -message.action.delete.disk.offering=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u78c1\u76d8\u65b9\u6848\u3002 -message.action.delete.domain=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u57df\u3002 -message.action.delete.external.firewall=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5916\u90e8\u9632\u706b\u5899\u3002\u8b66\u544a\: \u5982\u679c\u60a8\u8ba1\u5212\u91cd\u65b0\u6dfb\u52a0\u540c\u4e00\u4e2a\u5916\u90e8\u9632\u706b\u5899\uff0c\u5219\u5fc5\u987b\u5728\u8bbe\u5907\u4e0a\u91cd\u7f6e\u4f7f\u7528\u6570\u636e\u3002 -message.action.delete.external.load.balancer=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5916\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668\u3002\u8b66\u544a\: \u5982\u679c\u60a8\u8ba1\u5212\u91cd\u65b0\u6dfb\u52a0\u540c\u4e00\u4e2a\u5916\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668\uff0c\u5219\u5fc5\u987b\u5728\u8bbe\u5907\u4e0a\u91cd\u7f6e\u4f7f\u7528\u6570\u636e\u3002 -message.action.delete.ingress.rule=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5165\u53e3\u89c4\u5219\u3002 -message.action.delete.ISO.for.all.zones=\u6b64 ISO \u7531\u6240\u6709\u8d44\u6e90\u57df\u4f7f\u7528\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5176\u4ece\u6240\u6709\u8d44\u6e90\u57df\u4e2d\u5220\u9664\u3002 -message.action.delete.ISO=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 ISO\u3002 -message.action.delete.network=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7f51\u7edc\u3002 -message.action.delete.nexusVswitch=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 Nexus 1000v -message.action.delete.nic=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u79fb\u9664\u6b64 NIC\uff0c\u6b64\u64cd\u4f5c\u8fd8\u5c06\u4ece VM \u4e2d\u79fb\u9664\u5173\u8054\u7684\u7f51\u7edc\u3002 -message.action.delete.physical.network=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7269\u7406\u7f51\u7edc -message.action.delete.pod=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u63d0\u4f9b\u70b9\u3002 -message.action.delete.primary.storage=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e3b\u5b58\u50a8\u3002 -message.action.delete.secondary.storage=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e8c\u7ea7\u5b58\u50a8\u3002 -message.action.delete.security.group=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5b89\u5168\u7ec4\u3002 -message.action.delete.service.offering=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u670d\u52a1\u65b9\u6848\u3002 -message.action.delete.snapshot=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5feb\u7167\u3002 -message.action.delete.system.service.offering=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7cfb\u7edf\u670d\u52a1\u65b9\u6848\u3002 -message.action.delete.template.for.all.zones=\u6b64\u6a21\u677f\u7531\u6240\u6709\u8d44\u6e90\u57df\u4f7f\u7528\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5176\u4ece\u6240\u6709\u8d44\u6e90\u57df\u4e2d\u5220\u9664\u3002 -message.action.delete.template=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u6a21\u677f\u3002 -message.action.delete.volume=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5377\u3002 -message.action.delete.zone=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u8d44\u6e90\u57df\u3002 -message.action.destroy.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9500\u6bc1\u6b64\u5b9e\u4f8b\u3002 -message.action.destroy.systemvm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9500\u6bc1\u6b64\u7cfb\u7edf VM\u3002 -message.action.disable.cluster=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7fa4\u96c6\u3002 -message.action.disable.nexusVswitch=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64 Nexus 1000v -message.action.disable.physical.network=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7269\u7406\u7f51\u7edc\u3002 -message.action.disable.pod=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u63d0\u4f9b\u70b9\u3002 -message.action.disable.static.NAT=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u9759\u6001 NAT\u3002 -message.action.disable.zone=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u8d44\u6e90\u57df\u3002 -message.action.downloading.template=\u6b63\u5728\u4e0b\u8f7d\u6a21\u677f\u3002 -message.action.download.iso=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e0b\u8f7d\u6b64 ISO\u3002 -message.action.download.template=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e0b\u8f7d\u6b64\u6a21\u677f\u3002 -message.action.enable.cluster=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7fa4\u96c6\u3002 -message.action.enable.maintenance=\u5df2\u6210\u529f\u51c6\u5907\u597d\u7ef4\u62a4\u60a8\u7684\u4e3b\u673a\u3002\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u957f\u8fbe\u51e0\u5206\u949f\u6216\u66f4\u957f\u65f6\u95f4\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u5f53\u524d\u6b64\u4e3b\u673a\u4e0a\u7684 VM \u6570\u91cf\u3002 -message.action.enable.nexusVswitch=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64 Nexus 1000v -message.action.enable.physical.network=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7269\u7406\u7f51\u7edc\u3002 -message.action.enable.pod=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u63d0\u4f9b\u70b9\u3002 -message.action.enable.zone=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u8d44\u6e90\u57df\u3002 -message.action.expunge.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5b9e\u4f8b\u3002 -message.action.force.reconnect=\u5df2\u6210\u529f\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5\u60a8\u7684\u4e3b\u673a\u3002\u6b64\u8fc7\u7a0b\u53ef\u80fd\u9700\u8981\u957f\u8fbe\u51e0\u5206\u949f\u65f6\u95f4\u3002 -message.action.host.enable.maintenance.mode=\u542f\u7528\u7ef4\u62a4\u6a21\u5f0f\u4f1a\u5bfc\u81f4\u5c06\u6b64\u4e3b\u673a\u4e0a\u6b63\u5728\u8fd0\u884c\u7684\u6240\u6709\u5b9e\u4f8b\u5b9e\u65f6\u8fc1\u79fb\u5230\u4efb\u4f55\u53ef\u7528\u7684\u4e3b\u673a\u3002 -message.action.instance.reset.password=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u66f4\u6539\u6b64\u865a\u62df\u673a\u7684 ROOT \u7528\u6237\u5bc6\u7801\u3002 -message.action.manage.cluster=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6258\u7ba1\u6b64\u7fa4\u96c6\u3002 -message.action.primarystorage.enable.maintenance.mode=\u8b66\u544a\: \u5c06\u4e3b\u5b58\u50a8\u7f6e\u4e8e\u7ef4\u62a4\u6a21\u5f0f\u5c06\u5bfc\u81f4\u4f7f\u7528\u4e3b\u5b58\u50a8\u4e2d\u7684\u5377\u7684\u6240\u6709 VM \u505c\u6b62\u8fd0\u884c\u3002\u662f\u5426\u8981\u7ee7\u7eed? -message.action.reboot.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u5b9e\u4f8b\u3002 -message.action.reboot.router=\u6b64\u865a\u62df\u8def\u7531\u5668\u63d0\u4f9b\u7684\u6240\u6709\u670d\u52a1\u90fd\u5c06\u4e2d\u65ad\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u8def\u7531\u5668\u3002 -message.action.reboot.systemvm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u7cfb\u7edf VM\u3002 -message.action.release.ip=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91ca\u653e\u6b64 IP\u3002 -message.action.remove.host=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e3b\u673a\u3002 -message.action.reset.password.off=\u60a8\u7684\u5b9e\u4f8b\u5f53\u524d\u4e0d\u652f\u6301\u6b64\u529f\u80fd\u3002 -message.action.reset.password.warning=\u5fc5\u987b\u5148\u505c\u6b62\u60a8\u7684\u5b9e\u4f8b\uff0c\u7136\u540e\u518d\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u7684\u5bc6\u7801\u3002 -message.action.restore.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u8fd8\u539f\u6b64\u5b9e\u4f8b\u3002 -message.action.revert.snapshot=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u62e5\u6709\u7684\u5377\u8fd8\u539f\u4e3a\u6b64\u5feb\u7167\u3002 -message.action.start.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8\u6b64\u5b9e\u4f8b\u3002 -message.action.start.router=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8\u6b64\u8def\u7531\u5668\u3002 -message.action.start.systemvm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8\u6b64\u7cfb\u7edf VM\u3002 -message.action.stop.instance=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u5b9e\u4f8b\u3002 -message.action.stop.router=\u6b64\u865a\u62df\u8def\u7531\u5668\u63d0\u4f9b\u7684\u6240\u6709\u670d\u52a1\u90fd\u5c06\u4e2d\u65ad\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u8def\u7531\u5668\u3002 -message.action.stop.systemvm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62\u6b64\u7cfb\u7edf VM\u3002 -message.action.take.snapshot=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u521b\u5efa\u6b64\u5377\u7684\u5feb\u7167\u3002 -message.action.unmanage.cluster=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u53d6\u6d88\u6258\u7ba1\u6b64\u7fa4\u96c6\u3002 -message.action.vmsnapshot.delete=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 VM \u5feb\u7167\u3002 -message.action.vmsnapshot.revert=\u8fd8\u539f VM \u5feb\u7167 -message.activate.project=\u662f\u5426\u786e\u5b9e\u8981\u6fc0\u6d3b\u6b64\u9879\u76ee? -message.add.cluster=\u5411\u8d44\u6e90\u57df \u3001\u63d0\u4f9b\u70b9 \u4e2d\u6dfb\u52a0\u4e00\u4e2a\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u6258\u7ba1\u7684\u7fa4\u96c6 -message.add.cluster.zone=\u5411\u8d44\u6e90\u57df \u4e2d\u6dfb\u52a0\u4e00\u4e2a\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u6258\u7ba1\u7684\u7fa4\u96c6 -message.add.disk.offering=\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u53c2\u6570\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u78c1\u76d8\u65b9\u6848 -message.add.domain=\u8bf7\u6307\u5b9a\u8981\u5728\u6b64\u57df\u4e0b\u521b\u5efa\u7684\u5b50\u57df -message.added.new.nuage.vsp.controller=\u6dfb\u52a0\u65b0 Nuage Vsp \u63a7\u5236\u5668 -message.added.vpc.offering=\u6dfb\u52a0 VPC \u65b9\u6848 -message.add.firewall=\u5411\u8d44\u6e90\u57df\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u9632\u706b\u5899 -message.add.guest.network=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6dfb\u52a0\u4e00\u4e2a\u6765\u5bbe\u7f51\u7edc -message.add.host=\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u53c2\u6570\u4ee5\u6dfb\u52a0\u4e00\u53f0\u65b0\u4e3b\u673a -message.adding.host=\u6b63\u5728\u6dfb\u52a0\u4e3b\u673a -message.adding.Netscaler.device=\u6b63\u5728\u6dfb\u52a0 NetScaler \u8bbe\u5907 -message.adding.Netscaler.provider=\u6b63\u5728\u6dfb\u52a0 NetScaler \u63d0\u4f9b\u7a0b\u5e8f -message.add.ip.range.direct.network=\u5411\u8d44\u6e90\u57df \u4e2d\u7684\u76f4\u63a5\u7f51\u7edc \u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4 -message.add.ip.range.to.pod=

\u5411\u63d0\u4f9b\u70b9\u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4\:

-message.add.ip.range=\u5411\u8d44\u6e90\u57df\u4e2d\u7684\u516c\u7528\u7f51\u7edc\u6dfb\u52a0\u4e00\u4e2a IP \u8303\u56f4 -message.additional.networks.desc=\u8bf7\u9009\u62e9\u865a\u62df\u673a\u8981\u8fde\u63a5\u5230\u7684\u5176\u4ed6\u7f51\u7edc\u3002 -message.add.load.balancer=\u5411\u8d44\u6e90\u57df\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u8d1f\u8f7d\u5e73\u8861\u5668 -message.add.load.balancer.under.ip=\u5df2\u5728\u4ee5\u4e0b IP \u4e0b\u6dfb\u52a0\u8d1f\u8f7d\u5e73\u8861\u5668\u89c4\u5219\: -message.add.network=\u4e3a\u8d44\u6e90\u57df \u6dfb\u52a0\u4e00\u4e2a\u65b0\u7f51\u7edc -message.add.new.gateway.to.vpc=\u8bf7\u6307\u5b9a\u5c06\u65b0\u7f51\u5173\u6dfb\u52a0\u5230\u6b64 VPC \u6240\u9700\u7684\u4fe1\u606f\u3002 -message.add.pod.during.zone.creation=\u6bcf\u4e2a\u8d44\u6e90\u57df\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u63d0\u4f9b\u70b9\u3002\u63d0\u4f9b\u70b9\u4e2d\u5305\u542b\u4e3b\u673a\u548c\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u60a8\u5c06\u5728\u968f\u540e\u7684\u67d0\u4e2a\u6b65\u9aa4\u4e2d\u6dfb\u52a0\u8fd9\u4e9b\u4e3b\u673a\u548c\u670d\u52a1\u5668\u3002\u9996\u5148\uff0c\u8bf7\u4e3a CloudStack \u7684\u5185\u90e8\u7ba1\u7406\u6d41\u91cf\u914d\u7f6e\u4e00\u4e2a\u9884\u7559 IP \u5730\u5740\u8303\u56f4\u3002\u9884\u7559\u7684 IP \u8303\u56f4\u5bf9\u4e91\u4e2d\u7684\u6bcf\u4e2a\u8d44\u6e90\u57df\u6765\u8bf4\u5fc5\u987b\u552f\u4e00\u3002 -message.add.pod=\u4e3a\u8d44\u6e90\u57df \u6dfb\u52a0\u4e00\u4e2a\u65b0\u63d0\u4f9b\u70b9 -message.add.primary.storage=\u4e3a\u8d44\u6e90\u57df \u3001\u63d0\u4f9b\u70b9 \u6dfb\u52a0\u4e00\u4e2a\u65b0\u4e3b\u5b58\u50a8 -message.add.primary=\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u53c2\u6570\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u4e3b\u5b58\u50a8 -message.add.region=\u8bf7\u6307\u5b9a\u6dfb\u52a0\u65b0\u5730\u7406\u533a\u57df\u6240\u9700\u7684\u4fe1\u606f\u3002 -message.add.secondary.storage=\u4e3a\u8d44\u6e90\u57df \u6dfb\u52a0\u4e00\u4e2a\u65b0\u5b58\u50a8 -message.add.service.offering=\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u8ba1\u7b97\u65b9\u6848\u3002 -message.add.system.service.offering=\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7684\u7cfb\u7edf\u670d\u52a1\u65b9\u6848\u3002 -message.add.template=\u8bf7\u8f93\u5165\u4ee5\u4e0b\u6570\u636e\u4ee5\u521b\u5efa\u65b0\u6a21\u677f -message.add.volume=\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u5377\u3002 -message.add.VPN.gateway=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6dfb\u52a0 VPN \u7f51\u5173 -message.admin.guide.read=\u5bf9\u4e8e\u57fa\u4e8e VMware \u7684 VM\uff0c\u8bf7\u5148\u9605\u8bfb\u7ba1\u7406\u6307\u5357\u4e2d\u7684\u52a8\u6001\u6269\u5c55\u90e8\u5206\uff0c\u7136\u540e\u518d\u8fdb\u884c\u6269\u5c55\u3002\u662f\u5426\u8981\u7ee7\u7eed?\\, -message.advanced.mode.desc=\u5982\u679c\u8981\u542f\u7528 VLAN \u652f\u6301\uff0c\u8bf7\u9009\u62e9\u6b64\u7f51\u7edc\u6a21\u5f0f\u3002\u6b64\u7f51\u7edc\u6a21\u5f0f\u5728\u5141\u8bb8\u7ba1\u7406\u5458\u63d0\u4f9b\u9632\u706b\u5899\u3001VPN \u6216\u8d1f\u8f7d\u5e73\u8861\u5668\u652f\u6301\u7b49\u81ea\u5b9a\u4e49\u7f51\u7edc\u65b9\u6848\u4ee5\u53ca\u542f\u7528\u76f4\u63a5\u7f51\u7edc\u8fde\u63a5\u4e0e\u865a\u62df\u7f51\u7edc\u8fde\u63a5\u7b49\u65b9\u9762\u63d0\u4f9b\u4e86\u6700\u5927\u7684\u7075\u6d3b\u6027\u3002 -message.advanced.security.group=\u5982\u679c\u8981\u4f7f\u7528\u5b89\u5168\u7ec4\u63d0\u4f9b\u6765\u5bbe VM \u9694\u79bb\uff0c\u8bf7\u9009\u62e9\u6b64\u6a21\u5f0f\u3002 -message.advanced.virtual=\u5982\u679c\u8981\u4f7f\u7528\u6574\u4e2a\u8d44\u6e90\u57df\u7684 VLAN \u63d0\u4f9b\u6765\u5bbe VM \u9694\u79bb\uff0c\u8bf7\u9009\u62e9\u6b64\u6a21\u5f0f\u3002 -message.after.enable.s3=\u5df2\u914d\u7f6e S3 \u652f\u6301\u7684\u4e8c\u7ea7\u5b58\u50a8\u3002\u6ce8\u610f\: \u9000\u51fa\u6b64\u9875\u9762\u540e\uff0c\u60a8\u5c06\u65e0\u6cd5\u518d\u6b21\u91cd\u65b0\u914d\u7f6e S3\u3002 -message.after.enable.swift=\u5df2\u914d\u7f6e SWIFT\u3002\u6ce8\u610f\: \u9000\u51fa\u6b64\u9875\u9762\u540e\uff0c\u60a8\u5c06\u65e0\u6cd5\u518d\u6b21\u91cd\u65b0\u914d\u7f6e SWIFT\u3002 -message.alert.state.detected=\u68c0\u6d4b\u5230\u8b66\u62a5\u72b6\u6001 -message.allow.vpn.access=\u8bf7\u8f93\u5165\u8981\u5141\u8bb8\u8fdb\u884c VPN \u8bbf\u95ee\u7684\u7528\u6237\u7684\u7528\u6237\u540d\u548c\u5bc6\u7801\u3002 -message.apply.snapshot.policy=\u60a8\u5df2\u6210\u529f\u66f4\u65b0\u5f53\u524d\u7684\u5feb\u7167\u7b56\u7565\u3002 -message.attach.iso.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u6b64 ISO \u9644\u52a0\u5230\u6b64\u865a\u62df\u5b9e\u4f8b\u3002 -message.attach.volume=\u8bf7\u586b\u5199\u4ee5\u4e0b\u6570\u636e\u4ee5\u9644\u52a0\u4e00\u4e2a\u65b0\u5377\u3002\u5982\u679c\u8981\u5c06\u78c1\u76d8\u5377\u9644\u52a0\u5230\u57fa\u4e8e Windows \u7684\u865a\u62df\u673a\uff0c\u9700\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u5b9e\u4f8b\u624d\u80fd\u663e\u793a\u5df2\u8fde\u63a5\u7684\u78c1\u76d8\u3002 -message.basic.mode.desc=\u5982\u679c\u60a8*\u4e0d*\u5e0c\u671b\u542f\u7528\u4efb\u4f55 VLAN \u652f\u6301\uff0c\u8bf7\u9009\u62e9\u6b64\u7f51\u7edc\u6a21\u5f0f\u3002\u5c06\u76f4\u63a5\u4ece\u6b64\u7f51\u7edc\u4e2d\u4e3a\u5728\u6b64\u7f51\u7edc\u6a21\u5f0f\u4e0b\u521b\u5efa\u7684\u6240\u6709\u865a\u62df\u673a\u5b9e\u4f8b\u5206\u914d\u4e00\u4e2a IP\uff0c\u5e76\u4f7f\u7528\u5b89\u5168\u7ec4\u63d0\u4f9b\u5b89\u5168\u6027\u548c\u9694\u79bb\u3002 -message.change.offering.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u66f4\u6539\u6b64\u865a\u62df\u5b9e\u4f8b\u7684\u670d\u52a1\u65b9\u6848\u3002 -message.change.password=\u8bf7\u66f4\u6539\u60a8\u7684\u5bc6\u7801\u3002 -message.cluster.dedicated=\u7fa4\u96c6\u5df2\u4e13\u7528 -message.cluster.dedication.released=\u5df2\u91ca\u653e\u4e13\u7528\u7fa4\u96c6 -message.configure.all.traffic.types=\u60a8\u6709\u591a\u4e2a\u7269\u7406\u7f51\u7edc\uff0c\u8bf7\u5355\u51fb\u201c\u7f16\u8f91\u201d\u6309\u94ae\u4e3a\u6bcf\u79cd\u6d41\u91cf\u7c7b\u578b\u914d\u7f6e\u6807\u7b7e\u3002 -message.configure.firewall.rules.allow.traffic=\u914d\u7f6e\u5141\u8bb8\u901a\u4fe1\u7684\u89c4\u5219 -message.configure.firewall.rules.block.traffic=\u914d\u7f6e\u62d2\u7edd\u901a\u4fe1\u7684\u89c4\u5219 -message.configure.ldap=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u914d\u7f6e LDAP\u3002 -message.configuring.guest.traffic=\u6b63\u5728\u914d\u7f6e\u6765\u5bbe\u6d41\u91cf -message.configuring.physical.networks=\u6b63\u5728\u914d\u7f6e\u7269\u7406\u7f51\u7edc -message.configuring.public.traffic=\u6b63\u5728\u914d\u7f6e\u516c\u5171\u6d41\u91cf -message.configuring.storage.traffic=\u6b63\u5728\u914d\u7f6e\u5b58\u50a8\u6d41\u91cf -message.confirm.action.force.reconnect=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5f3a\u5236\u91cd\u65b0\u8fde\u63a5\u6b64\u4e3b\u673a\u3002 -message.confirm.add.vnmc.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6dfb\u52a0 VNMC \u63d0\u4f9b\u7a0b\u5e8f\u3002 -message.confirm.archive.alert=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u6b64\u8b66\u62a5\u3002 -message.confirm.archive.event=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u6b64\u4e8b\u4ef6\u3002 -message.confirm.archive.selected.alerts=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u9009\u5b9a\u8b66\u62a5 -message.confirm.archive.selected.events=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5b58\u6863\u9009\u5b9a\u4e8b\u4ef6 -message.confirm.attach.disk=\u662f\u5426\u786e\u5b9e\u8981\u9644\u52a0\u78c1\u76d8? -message.confirm.create.volume=\u662f\u5426\u786e\u5b9e\u8981\u521b\u5efa\u5377? -message.confirm.current.guest.CIDR.unchanged=\u662f\u5426\u8981\u4f7f\u5f53\u524d\u6765\u5bbe\u7f51\u7edc CIDR \u4fdd\u6301\u4e0d\u53d8? -message.confirm.dedicate.cluster.domain.account=\u662f\u5426\u786e\u5b9e\u8981\u5c06\u6b64\u7fa4\u96c6\u4e13\u7528\u4e8e\u57df/\u5e10\u6237? -message.confirm.dedicate.host.domain.account=\u662f\u5426\u786e\u5b9e\u8981\u5c06\u6b64\u4e3b\u673a\u4e13\u7528\u4e8e\u57df/\u5e10\u6237? -message.confirm.dedicate.pod.domain.account=\u662f\u5426\u786e\u5b9e\u8981\u5c06\u6b64\u63d0\u4f9b\u70b9\u4e13\u7528\u4e8e\u57df/\u5e10\u6237? -message.confirm.dedicate.zone=\u662f\u5426\u8981\u5c06\u6b64\u8d44\u6e90\u57df\u4e13\u7528\u4e8e\u57df/\u5e10\u6237? -message.confirm.delete.acl.list=\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64 ACL \u5217\u8868? -message.confirm.delete.alert=\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u8b66\u62a5? -message.confirm.delete.baremetal.rack.configuration=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Baremetal Rack \u914d\u7f6e -message.confirm.delete.BigSwitchBcf=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64BigSwitch BCF \u63a7\u5236\u5668 -message.confirm.delete.BrocadeVcs=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Brocade Vcs \u4ea4\u6362\u673a -message.confirm.delete.ciscoASA1000v=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 CiscoASA1000v -message.confirm.delete.ciscovnmc.resource=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Cisco VNMC \u8d44\u6e90 -message.confirm.delete.F5=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 F5 -message.confirm.delete.internal.lb=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u5185\u90e8\u8d1f\u8f7d\u5e73\u8861\u5668 -message.confirm.delete.NetScaler=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 NetScaler -message.confirm.delete.NuageVsp=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Nuage \u865a\u62df\u670d\u52a1\u76ee\u5f55 -message.confirm.delete.PA=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 Palo Alto -message.confirm.delete.secondary.staging.store=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u4e8c\u7ea7\u6682\u5b58\u5b58\u50a8\u3002 -message.confirm.delete.SRX=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 SRX -message.confirm.delete.ucs.manager=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 UCS Manager -message.confirm.destroy.router=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9500\u6bc1\u6b64\u8def\u7531\u5668 -message.confirm.disable.host=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u4e3b\u673a -message.confirm.disable.network.offering=\u662f\u5426\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7f51\u7edc\u65b9\u6848? -message.confirm.disable.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u63d0\u4f9b\u7a0b\u5e8f -message.confirm.disable.vnmc.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f\u3002 -message.confirm.disable.vpc.offering=\u662f\u5426\u786e\u5b9e\u8981\u7981\u7528\u6b64 VPC \u65b9\u6848? -message.confirm.enable.host=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u4e3b\u673a -message.confirm.enable.network.offering=\u662f\u5426\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7f51\u7edc\u65b9\u6848? -message.confirm.enable.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u63d0\u4f9b\u7a0b\u5e8f -message.confirm.enable.vnmc.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528 VNMC \u63d0\u4f9b\u7a0b\u5e8f\u3002 -message.confirm.enable.vpc.offering=\u662f\u5426\u786e\u5b9e\u8981\u542f\u7528\u6b64 VPC \u65b9\u6848? -message.confirm.join.project=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u52a0\u5165\u6b64\u9879\u76ee\u3002 -message.confirm.migrate.volume=\u662f\u5426\u8981\u8fc1\u79fb\u6b64\u5377? -message.confirm.refresh.blades=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5237\u65b0\u5200\u7247\u5f0f\u670d\u52a1\u5668\u3002 -message.confirm.release.dedicated.cluster=\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u7fa4\u96c6? -message.confirm.release.dedicated.host=\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u4e3b\u673a? -message.confirm.release.dedicated.pod=\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u63d0\u4f9b\u70b9? -message.confirm.release.dedicated.zone=\u662f\u5426\u8981\u91ca\u653e\u6b64\u4e13\u7528\u8d44\u6e90\u57df? -message.confirm.release.dedicate.vlan.range=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91ca\u653e\u4e13\u7528 VLAN \u8303\u56f4 -message.confirm.remove.event=\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u4e8b\u4ef6? -message.confirm.remove.IP.range=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 IP \u8303\u56f4\u3002 -message.confirm.remove.load.balancer=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4ece\u8d1f\u8f7d\u5e73\u8861\u5668\u4e2d\u5220\u9664 VM -message.confirm.remove.network.offering=\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7f51\u7edc\u65b9\u6848? -message.confirm.remove.selected.alerts=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u9009\u5b9a\u8b66\u62a5 -message.confirm.remove.selected.events=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u9009\u5b9a\u4e8b\u4ef6 -message.confirm.remove.vmware.datacenter=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 VMware \u6570\u636e\u4e2d\u5fc3 -message.confirm.remove.vpc.offering=\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64 VPC \u65b9\u6848? -message.confirm.replace.acl.new.one=\u662f\u5426\u8981\u5c06\u6b64 ACL \u66ff\u6362\u4e3a\u65b0 ACL? -message.confirm.scale.up.router.vm=\u662f\u5426\u786e\u5b9e\u8981\u6269\u5c55\u8def\u7531\u5668 VM? -message.confirm.scale.up.system.vm=\u662f\u5426\u786e\u5b9e\u8981\u6269\u5c55\u7cfb\u7edf VM? -message.confirm.shutdown.provider=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5173\u95ed\u6b64\u63d0\u4f9b\u7a0b\u5e8f -message.confirm.start.lb.vm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u52a8 LB VM -message.confirm.stop.lb.vm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u505c\u6b62 LB VM -message.confirm.upgrade.router.newer.template=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f -message.confirm.upgrade.routers.account.newtemplate=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u5e10\u6237\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f -message.confirm.upgrade.routers.cluster.newtemplate=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u7fa4\u96c6\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f -message.confirm.upgrade.routers.newtemplate=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f -message.confirm.upgrade.routers.pod.newtemplate=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5347\u7ea7\u6b64\u63d0\u4f9b\u70b9\u4e2d\u7684\u6240\u6709\u8def\u7531\u5668\u4ee5\u4f7f\u7528\u66f4\u65b0\u7684\u6a21\u677f -message.copy.iso.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06 ISO \u590d\u5236\u5230 -message.copy.template.confirm=\u662f\u5426\u786e\u5b9e\u8981\u590d\u5236\u6a21\u677f? -message.copy.template=\u5c06\u6a21\u677f XXX \u4ece\u8d44\u6e90\u57df \u590d\u5236\u5230 -message.create.template=\u662f\u5426\u786e\u5b9e\u8981\u521b\u5efa\u6a21\u677f? -message.create.template.vm=\u57fa\u4e8e\u6a21\u677f \u521b\u5efa VM -message.create.template.volume=\u8bf7\u5148\u6307\u5b9a\u4ee5\u4e0b\u4fe1\u606f\uff0c\u7136\u540e\u518d\u521b\u5efa\u78c1\u76d8\u5377 \u7684\u6a21\u677f\u3002\u521b\u5efa\u6a21\u677f\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u5230\u66f4\u957f\u7684\u65f6\u95f4\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u78c1\u76d8\u5377\u7684\u5927\u5c0f\u3002 -message.creating.cluster=\u6b63\u5728\u521b\u5efa\u7fa4\u96c6 -message.creating.guest.network=\u6b63\u5728\u521b\u5efa\u6765\u5bbe\u7f51\u7edc -message.creating.physical.networks=\u6b63\u5728\u521b\u5efa\u7269\u7406\u7f51\u7edc -message.creating.pod=\u6b63\u5728\u521b\u5efa\u63d0\u4f9b\u70b9 -message.creating.primary.storage=\u6b63\u5728\u521b\u5efa\u4e3b\u5b58\u50a8 -message.creating.secondary.storage=\u6b63\u5728\u521b\u5efa\u4e8c\u7ea7\u5b58\u50a8 -message.creating.systemVM=\u6b63\u5728\u521b\u5efa\u7cfb\u7edf VM (\u6b64\u64cd\u4f5c\u53ef\u80fd\u9700\u8981\u4e00\u4e9b\u65f6\u95f4) -message.creating.zone=\u6b63\u5728\u521b\u5efa\u8d44\u6e90\u57df -message.decline.invitation=\u662f\u5426\u786e\u5b9e\u8981\u62d2\u7edd\u6b64\u9879\u76ee\u9080\u8bf7? -message.dedicated.zone.released=\u5df2\u91ca\u653e\u4e13\u7528\u8d44\u6e90\u57df -message.dedicate.zone=\u6b63\u5728\u5c06\u8d44\u6e90\u57df\u4e13\u7528 -message.delete.account=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5e10\u6237\u3002 -message.delete.affinity.group=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u5173\u8054\u6027\u7ec4\u3002 -message.delete.gateway=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7f51\u5173 -message.delete.project=\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664\u6b64\u9879\u76ee? -message.delete.user=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64\u7528\u6237\u3002 -message.delete.VPN.connection=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 VPN \u8fde\u63a5 -message.delete.VPN.customer.gateway=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 VPN \u5ba2\u6237\u7f51\u5173 -message.delete.VPN.gateway=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 VPN \u7f51\u5173 -message.desc.add.new.lb.sticky.rule=\u6dfb\u52a0\u65b0\u8d1f\u8f7d\u5747\u8861\u7c98\u6ede\u89c4\u5219 -message.desc.advanced.zone=\u9002\u7528\u4e8e\u66f4\u52a0\u590d\u6742\u7684\u7f51\u7edc\u62d3\u6251\u3002\u6b64\u7f51\u7edc\u6a21\u5f0f\u5728\u5b9a\u4e49\u6765\u5bbe\u7f51\u7edc\u5e76\u63d0\u4f9b\u9632\u706b\u5899\u3001VPN \u6216\u8d1f\u8f7d\u5e73\u8861\u5668\u652f\u6301\u7b49\u81ea\u5b9a\u4e49\u7f51\u7edc\u65b9\u6848\u65b9\u9762\u63d0\u4f9b\u4e86\u6700\u5927\u7684\u7075\u6d3b\u6027\u3002 -message.desc.basic.zone=\u63d0\u4f9b\u4e00\u4e2a\u7f51\u7edc\uff0c\u5c06\u76f4\u63a5\u4ece\u6b64\u7f51\u7edc\u4e2d\u4e3a\u6bcf\u4e2a VM \u5b9e\u4f8b\u5206\u914d\u4e00\u4e2a IP\u3002\u53ef\u4ee5\u901a\u8fc7\u5b89\u5168\u7ec4\u7b49\u7b2c 3 \u5c42\u65b9\u5f0f\u63d0\u4f9b\u6765\u5bbe\u9694\u79bb(IP \u5730\u5740\u6e90\u8fc7\u6ee4)\u3002 -message.desc.cluster=\u6bcf\u4e2a\u63d0\u4f9b\u70b9\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u7fa4\u96c6\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u7fa4\u96c6\u3002\u7fa4\u96c6\u63d0\u4f9b\u4e86\u4e00\u79cd\u7f16\u7ec4\u4e3b\u673a\u7684\u65b9\u6cd5\u3002\u7fa4\u96c6\u4e2d\u7684\u6240\u6709\u4e3b\u673a\u90fd\u5177\u6709\u76f8\u540c\u7684\u786c\u4ef6\uff0c\u8fd0\u884c\u76f8\u540c\u7684\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\uff0c\u4f4d\u4e8e\u76f8\u540c\u7684\u5b50\u7f51\u4e2d\uff0c\u5e76\u8bbf\u95ee\u76f8\u540c\u7684\u5171\u4eab\u5b58\u50a8\u3002\u6bcf\u4e2a\u7fa4\u96c6\u7531\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u673a\u4ee5\u53ca\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u7ec4\u6210\u3002 -message.desc.created.ssh.key.pair=\u5df2\u751f\u6210\u7684SSH\u5bc6\u94a5\u5bf9 -message.desc.create.ssh.key.pair=\u8bf7\u586b\u5199\u4ee5\u4e0b\u5185\u5bb9\u4ee5\u521b\u5efa\u6216\u751f\u6210\u4e00\u4e2assh\u5bc6\u94a5\u5bf9.

(1) \u5982\u679c\u516c\u94a5\u5df2\u914d\u7f6e, cloudstack \u5c06\u6ce8\u518c\u6b64\u516c\u94a5. \u60a8\u53ef\u4ee5\u901a\u8fc7\u60a8\u7684\u79c1\u94a5\u6765\u8bbf\u95ee.

(2)\u5982\u679c\u516c\u94a5\u672a\u914d\u7f6e,cloudstack\u5c06\u521b\u5efa\u65b0\u7684\u5bc6\u94a5\u5bf9,\u8bf7\u590d\u5236\u5e76\u4fdd\u5b58\u79c1\u94a5,cloudstack\u5c06\u4e0d\u4f1a\u66ff\u60a8\u4fdd\u5b58
-message.desc.host=\u6bcf\u4e2a\u7fa4\u96c6\u4e2d\u5fc5\u987b\u81f3\u5c11\u5305\u542b\u4e00\u4e2a\u4e3b\u673a\u4ee5\u4f9b\u6765\u5bbe VM \u5728\u4e0a\u9762\u8fd0\u884c\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u4e3b\u673a\u3002\u8981\u4f7f\u4e3b\u673a\u5728 CloudStack \u4e2d\u8fd0\u884c\uff0c\u5fc5\u987b\u5728\u6b64\u4e3b\u673a\u4e0a\u5b89\u88c5\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u8f6f\u4ef6\uff0c\u4e3a\u5176\u5206\u914d\u4e00\u4e2a IP \u5730\u5740\uff0c\u5e76\u786e\u4fdd\u5c06\u5176\u8fde\u63a5\u5230 CloudStack \u7ba1\u7406\u670d\u52a1\u5668\u3002

\u8bf7\u63d0\u4f9b\u4e3b\u673a\u7684 DNS \u6216 IP \u5730\u5740\u3001\u7528\u6237\u540d(\u901a\u5e38\u4e3a root)\u548c\u5bc6\u7801\uff0c\u4ee5\u53ca\u7528\u4e8e\u5bf9\u4e3b\u673a\u8fdb\u884c\u5206\u7c7b\u7684\u4efb\u4f55\u6807\u7b7e\u3002 -message.desc.primary.storage=\u6bcf\u4e2a\u7fa4\u96c6\u4e2d\u5fc5\u987b\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u3002\u4e3b\u5b58\u50a8\u4e2d\u5305\u542b\u5728\u7fa4\u96c6\u4e2d\u7684\u4e3b\u673a\u4e0a\u8fd0\u884c\u7684\u6240\u6709 VM \u7684\u78c1\u76d8\u5377\u3002\u8bf7\u4f7f\u7528\u5e95\u5c42\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u652f\u6301\u7684\u7b26\u5408\u6807\u51c6\u7684\u534f\u8bae\u3002 -message.desc.reset.ssh.key.pair=\u8bf7\u6307\u5b9a\u60a8\u60f3\u6dfb\u52a0\u5230\u8fd9\u4e2aVM\u4e2d\u7684SSH\u5bc6\u94a5\u5bf9.\u8bf7\u6ce8\u610f,\u5982\u679c\u542f\u7528\u4e86\u5bc6\u7801\u7ba1\u7406,\u8d85\u7ea7\u7528\u6237\u53e3\u4ee4\u5c06\u4f1a\u88ab\u91cd\u7f6e\u3002 -message.desc.secondary.storage=\u6bcf\u4e2a\u8d44\u6e90\u57df\u4e2d\u5fc5\u987b\u81f3\u5c11\u5305\u542b\u4e00\u4e2a NFS \u6216\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668\uff0c\u73b0\u5728\u6211\u4eec\u5c06\u6dfb\u52a0\u7b2c\u4e00\u4e2a NFS \u6216\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668\u3002\u4e8c\u7ea7\u5b58\u50a8\u7528\u4e8e\u5b58\u50a8 VM \u6a21\u677f\u3001ISO \u6620\u50cf\u548c VM \u78c1\u76d8\u5377\u5feb\u7167\u3002\u6b64\u670d\u52a1\u5668\u5fc5\u987b\u5bf9\u8d44\u6e90\u57df\u4e2d\u7684\u6240\u6709\u670d\u52a1\u5668\u53ef\u7528\u3002

\u8bf7\u63d0\u4f9b IP \u5730\u5740\u548c\u5bfc\u51fa\u8def\u5f84\u3002 -message.desc.zone=\u8d44\u6e90\u57df\u662f CloudStack \u4e2d\u6700\u5927\u7684\u7ec4\u7ec7\u5355\u4f4d\uff0c\u4e00\u4e2a\u8d44\u6e90\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u8d44\u6e90\u57df\u53ef\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\u3002\u4e00\u4e2a\u8d44\u6e90\u57df\u7531\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\u4ee5\u53ca\u7531\u8d44\u6e90\u57df\u4e2d\u7684\u6240\u6709\u63d0\u4f9b\u70b9\u5171\u4eab\u7684\u4e00\u4e2a\u4e8c\u7ea7\u5b58\u50a8\u670d\u52a1\u5668\u7ec4\u6210\uff0c\u5176\u4e2d\u6bcf\u4e2a\u63d0\u4f9b\u70b9\u4e2d\u5305\u542b\u591a\u4e2a\u4e3b\u673a\u548c\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u3002 -message.detach.disk=\u662f\u5426\u786e\u5b9e\u8981\u53d6\u6d88\u9644\u52a0\u6b64\u78c1\u76d8? -message.detach.iso.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4ece\u6b64\u865a\u62df\u673a\u4e2d\u53d6\u6d88\u9644\u52a0\u6b64 ISO\u3002 -message.disable.account=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u5e10\u6237\u3002\u7981\u7528\u540e\uff0c\u6b64\u5e10\u6237\u7684\u6240\u6709\u7528\u6237\u5c06\u4e0d\u518d\u6709\u6743\u8bbf\u95ee\u5404\u81ea\u7684\u4e91\u8d44\u6e90\u3002\u6240\u6709\u6b63\u5728\u8fd0\u884c\u7684\u865a\u62df\u673a\u5c06\u7acb\u5373\u5173\u95ed\u3002 -message.disable.snapshot.policy=\u60a8\u5df2\u6210\u529f\u7981\u7528\u5f53\u524d\u7684\u5feb\u7167\u7b56\u7565\u3002 -message.disable.user=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u6b64\u7528\u6237\u3002 -message.disable.vpn.access=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u7981\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN\u3002 -message.disable.vpn=\u662f\u5426\u786e\u5b9e\u8981\u7981\u7528 VPN? -message.disabling.network.offering=\u6b63\u5728\u7981\u7528\u7f51\u7edc\u65b9\u6848 -message.disabling.vpc.offering=\u6b63\u5728\u7981\u7528 VPC \u65b9\u6848 -message.disallowed.characters=\u7981\u7528\u5b57\u7b26\: <,> -message.download.ISO=\u8bf7\u5355\u51fb 00000 \u4e0b\u8f7d ISO -message.download.template=\u8bf7\u5355\u51fb 00000 \u4e0b\u8f7d\u6a21\u677f -message.download.volume.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e0b\u8f7d\u6b64\u5377 -message.download.volume=\u8bf7\u5355\u51fb 00000 \u4e0b\u8f7d\u5377 -message.edit.account=\u7f16\u8f91(\u201c-1\u201d\u8868\u793a\u5bf9\u8981\u521b\u5efa\u7684\u8d44\u6e90\u6570\u91cf\u6ca1\u6709\u4efb\u4f55\u9650\u5236) -message.edit.confirm=\u5728\u70b9\u51fb\u201c\u4fdd\u5b58\u201d\u524d\u8bf7\u5148\u786e\u8ba4\u60a8\u6240\u505a\u7684\u66f4\u6539\u3002 -message.edit.limits=\u8bf7\u6307\u5b9a\u5bf9\u4ee5\u4e0b\u8d44\u6e90\u7684\u9650\u5236\u3002\u201c-1\u201d\u8868\u793a\u4e0d\u9650\u5236\u8981\u521b\u5efa\u7684\u8d44\u6e90\u6570\u3002 -message.edit.traffic.type=\u8bf7\u6307\u5b9a\u60a8\u5e0c\u671b\u4e0e\u6b64\u6d41\u91cf\u7c7b\u578b\u5173\u8054\u7684\u6d41\u91cf\u6807\u7b7e\u3002 -message.enable.account=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u5e10\u6237\u3002 -message.enabled.vpn.ip.sec=\u60a8\u7684 IPSec \u9884\u5171\u4eab\u5bc6\u94a5 -message.enabled.vpn=\u60a8\u7684\u8fdc\u7a0b\u8bbf\u95ee VPN \u5f53\u524d\u5df2\u542f\u7528\uff0c\u53ef\u4ee5\u901a\u8fc7 IP \u8fdb\u884c\u8bbf\u95ee -message.enable.user=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u542f\u7528\u6b64\u7528\u6237\u3002 -message.enable.vpn.access=\u5f53\u524d\u5df2\u5bf9\u6b64 IP \u5730\u5740\u7981\u7528\u4e86 VPN\u3002\u662f\u5426\u8981\u542f\u7528 VPN \u8bbf\u95ee? -message.enable.vpn=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5bf9\u6b64 IP \u5730\u5740\u542f\u7528\u8fdc\u7a0b\u8bbf\u95ee VPN\u3002 -message.enabling.network.offering=\u6b63\u5728\u542f\u7528\u7f51\u7edc\u65b9\u6848 -message.enabling.security.group.provider=\u6b63\u5728\u542f\u7528\u5b89\u5168\u7ec4\u63d0\u4f9b\u7a0b\u5e8f -message.enabling.vpc.offering=\u6b63\u5728\u542f\u7528 VPC \u65b9\u6848 -message.enabling.zone.dots=\u6b63\u5728\u542f\u7528\u8d44\u6e90\u57df... -message.enabling.zone=\u6b63\u5728\u542f\u7528\u8d44\u6e90\u57df -message.enter.seperated.list.multiple.cidrs=\u5982\u679c\u5b58\u5728\u591a\u4e2a CIDR\uff0c\u8bf7\u8f93\u5165\u7528\u9017\u53f7\u5206\u9694\u7684 CIDR \u5217\u8868 -message.enter.token=\u8bf7\u8f93\u5165\u60a8\u5728\u9080\u8bf7\u7535\u5b50\u90ae\u4ef6\u4e2d\u6536\u5230\u7684\u4ee4\u724c\u3002 -message.generate.keys=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u7528\u6237\u751f\u6210\u65b0\u5bc6\u94a5\u3002 -message.gslb.delete.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64 GSLB -message.gslb.lb.remove.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4ece GSLB \u4e2d\u5220\u9664\u8d1f\u8f7d\u5e73\u8861 -message.guest.traffic.in.advanced.zone=\u6765\u5bbe\u7f51\u7edc\u6d41\u91cf\u662f\u6307\u6700\u7ec8\u7528\u6237\u865a\u62df\u673a\u4e4b\u95f4\u7684\u901a\u4fe1\u3002\u6307\u5b9a\u4e00\u4e2a VLAN ID \u8303\u56f4\u53ef\u4f20\u9001\u6bcf\u4e2a\u7269\u7406\u7f51\u7edc\u7684\u6765\u5bbe\u6d41\u91cf\u3002 -message.guest.traffic.in.basic.zone=\u6765\u5bbe\u7f51\u7edc\u6d41\u91cf\u662f\u6307\u6700\u7ec8\u7528\u6237\u865a\u62df\u673a\u4e4b\u95f4\u7684\u901a\u4fe1\u3002\u5e94\u6307\u5b9a\u4e00\u4e2a CloudStack \u53ef\u4ee5\u5206\u914d\u7ed9\u6765\u5bbe VM \u7684 IP \u5730\u5740\u8303\u56f4\u3002\u8bf7\u786e\u4fdd\u6b64\u8303\u56f4\u4e0e\u9884\u7559\u7684\u7cfb\u7edf IP \u8303\u56f4\u4e0d\u91cd\u53e0\u3002 -message.host.dedicated=\u4e3b\u673a\u5df2\u4e13\u7528 -message.host.dedication.released=\u5df2\u91ca\u653e\u4e13\u7528\u4e3b\u673a -message.installWizard.click.retry=\u8bf7\u5355\u51fb\u6b64\u6309\u94ae\u91cd\u65b0\u5c1d\u8bd5\u542f\u52a8\u3002 -message.installWizard.copy.whatIsACluster=\u7fa4\u96c6\u63d0\u4f9b\u4e86\u4e00\u79cd\u7f16\u7ec4\u4e3b\u673a\u7684\u65b9\u6cd5\u3002\u7fa4\u96c6\u4e2d\u7684\u6240\u6709\u4e3b\u673a\u90fd\u5177\u6709\u76f8\u540c\u7684\u786c\u4ef6\uff0c\u8fd0\u884c\u76f8\u540c\u7684\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\uff0c\u4f4d\u4e8e\u540c\u4e00\u5b50\u7f51\u4e2d\uff0c\u5e76\u8bbf\u95ee\u76f8\u540c\u7684\u5171\u4eab\u5b58\u50a8\u3002\u53ef\u4ee5\u5b9e\u65f6\u5c06\u865a\u62df\u673a\u5b9e\u4f8b(VM)\u4ece\u4e00\u53f0\u4e3b\u673a\u8fc1\u79fb\u5230\u540c\u4e00\u7fa4\u96c6\u5185\u7684\u5176\u4ed6\u4e3b\u673a\uff0c\u800c\u65e0\u9700\u4e2d\u65ad\u5411\u7528\u6237\u63d0\u4f9b\u670d\u52a1\u3002\u7fa4\u96c6\u662f CloudStack&\#8482; \u90e8\u7f72\u4e2d\u7684\u7b2c\u4e09\u5927\u7ec4\u7ec7\u5355\u4f4d\u3002\u7fa4\u96c6\u5305\u542b\u5728\u63d0\u4f9b\u70b9\u4e2d\uff0c\u63d0\u4f9b\u70b9\u5305\u542b\u5728\u8d44\u6e90\u57df\u4e2d\u3002

CloudStack&\#8482; \u5141\u8bb8\u4e91\u90e8\u7f72\u4e2d\u5b58\u5728\u591a\u4e2a\u7fa4\u96c6\uff0c\u4f46\u5bf9\u4e8e\u57fa\u672c\u5b89\u88c5\uff0c\u6211\u4eec\u53ea\u9700\u8981\u4e00\u4e2a\u7fa4\u96c6\u3002 -message.installWizard.copy.whatIsAHost=\u4e3b\u673a\u662f\u6307\u4e00\u53f0\u8ba1\u7b97\u673a\u3002\u4e3b\u673a\u63d0\u4f9b\u8fd0\u884c\u6765\u5bbe\u865a\u62df\u673a\u7684\u8ba1\u7b97\u8d44\u6e90\u3002\u6bcf\u53f0\u4e3b\u673a\u4e0a\u90fd\u5b89\u88c5\u6709\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u8f6f\u4ef6\uff0c\u7528\u4e8e\u7ba1\u7406\u6765\u5bbe VM (\u88f8\u673a\u4e3b\u673a\u9664\u5916\uff0c\u5c06\u5728\u201c\u9ad8\u7ea7\u5b89\u88c5\u6307\u5357\u201d\u4e2d\u8ba8\u8bba\u8fd9\u4e00\u7279\u6b8a\u6848\u4f8b)\u3002\u4f8b\u5982\uff0c\u542f\u7528\u4e86 KVM \u7684 Linux \u670d\u52a1\u5668\u3001Citrix XenServer \u670d\u52a1\u5668\u548c ESXi \u670d\u52a1\u5668\u90fd\u53ef\u7528\u4f5c\u4e3b\u673a\u3002\u5728\u57fa\u672c\u5b89\u88c5\u4e2d\uff0c\u6211\u4eec\u5c06\u4f7f\u7528\u4e00\u53f0\u8fd0\u884c XenServer \u7684\u4e3b\u673a\u3002

\u4e3b\u673a\u662f CloudStack&\#8482; \u90e8\u7f72\u4e2d\u6700\u5c0f\u7684\u7ec4\u7ec7\u5355\u4f4d\u3002\u4e3b\u673a\u5305\u542b\u5728\u7fa4\u96c6\u4e2d\uff0c\u7fa4\u96c6\u5305\u542b\u5728\u63d0\u4f9b\u70b9\u4e2d\uff0c\u63d0\u4f9b\u70b9\u5305\u542b\u5728\u8d44\u6e90\u57df\u4e2d\u3002 -message.installWizard.copy.whatIsAPod=\u4e00\u4e2a\u63d0\u4f9b\u70b9\u901a\u5e38\u4ee3\u8868\u4e00\u4e2a\u673a\u67b6\u3002\u540c\u4e00\u63d0\u4f9b\u70b9\u4e2d\u7684\u4e3b\u673a\u4f4d\u4e8e\u540c\u4e00\u5b50\u7f51\u4e2d\u3002

\u63d0\u4f9b\u70b9\u662f CloudStack&\#8482; \u90e8\u7f72\u4e2d\u7684\u7b2c\u4e8c\u5927\u7ec4\u7ec7\u5355\u4f4d\u3002\u63d0\u4f9b\u70b9\u5305\u542b\u5728\u8d44\u6e90\u57df\u4e2d\u3002\u6bcf\u4e2a\u8d44\u6e90\u57df\u4e2d\u53ef\u4ee5\u5305\u542b\u4e00\u4e2a\u6216\u591a\u4e2a\u63d0\u4f9b\u70b9\uff1b\u5728\u57fa\u672c\u5b89\u88c5\u4e2d\uff0c\u60a8\u7684\u8d44\u6e90\u57df\u4e2d\u5c06\u4ec5\u5305\u542b\u4e00\u4e2a\u63d0\u4f9b\u70b9\u3002 -message.installWizard.copy.whatIsAZone=\u8d44\u6e90\u57df\u662f CloudStack&\#8482; \u90e8\u7f72\u4e2d\u6700\u5927\u7684\u7ec4\u7ec7\u5355\u4f4d\u3002\u867d\u7136\u5141\u8bb8\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u4e2d\u5b58\u5728\u591a\u4e2a\u8d44\u6e90\u57df\uff0c\u4f46\u662f\u4e00\u4e2a\u8d44\u6e90\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u5c06\u57fa\u7840\u67b6\u6784\u7f16\u7ec4\u5230\u8d44\u6e90\u57df\u4e2d\u7684\u597d\u5904\u662f\u53ef\u4ee5\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\u3002\u4f8b\u5982\uff0c\u6bcf\u4e2a\u8d44\u6e90\u57df\u90fd\u53ef\u4ee5\u62e5\u6709\u5404\u81ea\u7684\u7535\u6e90\u4f9b\u5e94\u548c\u7f51\u7edc\u4e0a\u884c\u65b9\u6848\uff0c\u5e76\u4e14\u5404\u8d44\u6e90\u57df\u53ef\u4ee5\u5728\u5730\u7406\u4f4d\u7f6e\u4e0a\u76f8\u9694\u5f88\u8fdc(\u867d\u7136\u5e76\u975e\u5fc5\u987b\u76f8\u9694\u5f88\u8fdc)\u3002 -message.installWizard.copy.whatIsCloudStack=CloudStack&\#8482 \u662f\u4e00\u4e2a\u8f6f\u4ef6\u5e73\u53f0\uff0c\u53ef\u5c06\u8ba1\u7b97\u8d44\u6e90\u96c6\u4e2d\u5728\u4e00\u8d77\u4ee5\u6784\u5efa\u516c\u6709\u3001\u79c1\u6709\u548c\u6df7\u5408\u57fa\u7840\u8bbe\u65bd\u5373\u670d\u52a1(IaaS)\u4e91\u3002CloudStack&\#8482 \u8d1f\u8d23\u7ba1\u7406\u7ec4\u6210\u4e91\u57fa\u7840\u67b6\u6784\u7684\u7f51\u7edc\u3001\u5b58\u50a8\u548c\u8ba1\u7b97\u8282\u70b9\u3002\u4f7f\u7528 CloudStack&\#8482 \u53ef\u4ee5\u90e8\u7f72\u3001\u7ba1\u7406\u548c\u914d\u7f6e\u4e91\u8ba1\u7b97\u73af\u5883\u3002

CloudStack&\#8482 \u901a\u8fc7\u6269\u5c55\u5546\u7528\u786c\u4ef6\u4e0a\u8fd0\u884c\u7684\u6bcf\u4e2a\u865a\u62df\u673a\u6620\u50cf\u7684\u8303\u56f4\uff0c\u63d0\u4f9b\u4e86\u4e00\u4e2a\u5b9e\u65f6\u53ef\u7528\u7684\u4e91\u57fa\u7840\u67b6\u6784\u8f6f\u4ef6\u5806\u6808\u7528\u4e8e\u4ee5\u670d\u52a1\u65b9\u5f0f\u4ea4\u4ed8\u865a\u62df\u6570\u636e\u4e2d\u5fc3\uff0c\u5373\u4ea4\u4ed8\u6784\u5efa\u3001\u90e8\u7f72\u548c\u7ba1\u7406\u591a\u5c42\u6b21\u548c\u591a\u79df\u6237\u4e91\u5e94\u7528\u7a0b\u5e8f\u5fc5\u9700\u7684\u6240\u6709\u7ec4\u4ef6\u3002\u5f00\u6e90\u7248\u672c\u548c Premium \u7248\u672c\u90fd\u5df2\u53ef\u7528\uff0c\u4e14\u63d0\u4f9b\u7684\u529f\u80fd\u51e0\u4e4e\u5b8c\u5168\u76f8\u540c\u3002 -message.installWizard.copy.whatIsPrimaryStorage=CloudStack&\#8482; \u4e91\u57fa\u7840\u67b6\u6784\u4f7f\u7528\u4ee5\u4e0b\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\: \u4e3b\u5b58\u50a8\u548c\u4e8c\u7ea7\u5b58\u50a8\u3002\u8fd9\u4e24\u79cd\u7c7b\u578b\u7684\u5b58\u50a8\u53ef\u4ee5\u662f iSCSI \u6216 NFS \u670d\u52a1\u5668\uff0c\u4e5f\u53ef\u4ee5\u662f\u672c\u5730\u78c1\u76d8\u3002

\u4e3b\u5b58\u50a8\u4e0e\u7fa4\u96c6\u76f8\u5173\u8054\uff0c\u7528\u4e8e\u5b58\u50a8\u8be5\u7fa4\u96c6\u4e2d\u7684\u4e3b\u673a\u4e0a\u6b63\u5728\u8fd0\u884c\u7684\u6240\u6709 VM \u5bf9\u5e94\u7684\u6bcf\u4e2a\u6765\u5bbe VM \u7684\u78c1\u76d8\u5377\u3002\u4e3b\u5b58\u50a8\u670d\u52a1\u5668\u901a\u5e38\u4f4d\u4e8e\u9760\u8fd1\u4e3b\u673a\u7684\u4f4d\u7f6e\u3002 -message.installWizard.copy.whatIsSecondaryStorage=\u4e8c\u7ea7\u5b58\u50a8\u4e0e\u8d44\u6e90\u57df\u76f8\u5173\u8054\uff0c\u7528\u4e8e\u5b58\u50a8\u4ee5\u4e0b\u9879\u76ee\:
  • \u6a21\u677f - \u53ef\u7528\u4e8e\u542f\u52a8 VM \u5e76\u53ef\u4ee5\u5305\u542b\u5176\u4ed6\u914d\u7f6e\u4fe1\u606f(\u4f8b\u5982\uff0c\u5df2\u5b89\u88c5\u7684\u5e94\u7528\u7a0b\u5e8f)\u7684\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf
  • ISO \u6620\u50cf - \u53ef\u91cd\u65b0\u542f\u52a8\u6216\u4e0d\u53ef\u91cd\u65b0\u542f\u52a8\u7684\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf
  • \u78c1\u76d8\u5377\u5feb\u7167 - \u5df2\u4fdd\u5b58\u7684 VM \u6570\u636e\u526f\u672c\uff0c\u53ef\u7528\u4e8e\u6267\u884c\u6570\u636e\u6062\u590d\u6216\u521b\u5efa\u65b0\u6a21\u677f
-message.installWizard.now.building=\u73b0\u5728\u6b63\u5728\u6784\u5efa\u60a8\u7684\u4e91... -message.installWizard.tooltip.addCluster.name=\u7fa4\u96c6\u7684\u540d\u79f0\u3002\u6b64\u540d\u79f0\u53ef\u4ee5\u662f\u60a8\u9009\u62e9\u7684\u6587\u672c\uff0c\u4e14\u672a\u7531 CloudStack \u4f7f\u7528\u3002 -message.installWizard.tooltip.addHost.hostname=\u4e3b\u673a\u7684 DNS \u540d\u79f0\u6216 IP \u5730\u5740\u3002 -message.installWizard.tooltip.addHost.password=\u6b64\u4e3a\u4e0a\u8ff0\u7528\u6237\u7684\u5bc6\u7801(\u6765\u81ea XenServer \u5b89\u88c5)\u3002 -message.installWizard.tooltip.addHost.username=\u901a\u5e38\u4e3a root\u3002 -message.installWizard.tooltip.addPod.name=\u63d0\u4f9b\u70b9\u7684\u540d\u79f0 -message.installWizard.tooltip.addPod.reservedSystemEndIp=\u6b64\u4e3a CloudStack \u7528\u4e8e\u7ba1\u7406\u4e8c\u7ea7\u5b58\u50a8 VM \u548c\u63a7\u5236\u53f0\u4ee3\u7406 VM \u7684\u4e13\u7528\u7f51\u7edc\u4e2d\u7684 IP \u8303\u56f4\u3002\u8fd9\u4e9b IP \u5730\u5740\u6765\u81ea\u4e0e\u8ba1\u7b97\u670d\u52a1\u5668\u76f8\u540c\u7684\u5b50\u7f51\u3002 -message.installWizard.tooltip.addPod.reservedSystemGateway=\u8be5\u63d0\u4f9b\u70b9\u4e2d\u7684\u4e3b\u673a\u7f51\u5173\u3002 -message.installWizard.tooltip.addPod.reservedSystemNetmask=\u6765\u5bbe\u5c06\u8981\u4f7f\u7528\u7684\u5b50\u7f51\u4e0a\u6b63\u5728\u4f7f\u7528\u7684\u7f51\u7edc\u63a9\u7801\u3002 -message.installWizard.tooltip.addPod.reservedSystemStartIp=\u6b64\u4e3a CloudStack \u7528\u4e8e\u7ba1\u7406\u4e8c\u7ea7\u5b58\u50a8 VM \u548c\u63a7\u5236\u53f0\u4ee3\u7406 VM \u7684\u4e13\u7528\u7f51\u7edc\u4e2d\u7684 IP \u8303\u56f4\u3002\u8fd9\u4e9b IP \u5730\u5740\u6765\u81ea\u4e0e\u8ba1\u7b97\u670d\u52a1\u5668\u76f8\u540c\u7684\u5b50\u7f51\u3002 -message.installWizard.tooltip.addPrimaryStorage.name=\u5b58\u50a8\u8bbe\u5907\u7684\u540d\u79f0\u3002 -message.installWizard.tooltip.addPrimaryStorage.path=(\u9002\u7528\u4e8e NFS)\u5728 NFS \u4e2d\uff0c\u6b64\u8def\u5f84\u4e3a\u670d\u52a1\u5668\u7684\u5bfc\u51fa\u8def\u5f84\u3002\u8def\u5f84(\u9488\u5bf9 SharedMountPoint)\u3002\u5bf9\u4e8e KVM\uff0c\u6b64\u8def\u5f84\u4e3a\u88c5\u8f7d\u4e86\u4e8c\u7ea7\u5b58\u50a8\u7684\u6bcf\u4e2a\u4e3b\u673a\u4e0a\u7684\u8def\u5f84\u3002\u4f8b\u5982\uff0c/mnt/primary\u3002 -message.installWizard.tooltip.addPrimaryStorage.server=(\u9002\u7528\u4e8e NFS\u3001iSCSI \u6216 PreSetup)\u5b58\u50a8\u8bbe\u5907\u7684 IP \u5730\u5740\u6216 DNS \u540d\u79f0\u3002 -message.installWizard.tooltip.addSecondaryStorage.nfsServer=\u6258\u7ba1\u4e8c\u7ea7\u5b58\u50a8\u7684 NFS \u670d\u52a1\u5668\u7684 IP \u5730\u5740 -message.installWizard.tooltip.addSecondaryStorage.path=\u5bfc\u51fa\u8def\u5f84(\u4f4d\u4e8e\u4e0a\u8ff0\u6307\u5b9a\u670d\u52a1\u5668\u4e0a) -message.installWizard.tooltip.addZone.dns1=\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u60a8\u7a0d\u540e\u8981\u6dfb\u52a0\u7684\u516c\u7528\u7f51\u7edc\u8fdb\u884c\u8bbf\u95ee\u3002\u6b64\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002 -message.installWizard.tooltip.addZone.dns2=\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u60a8\u7a0d\u540e\u8981\u6dfb\u52a0\u7684\u516c\u7528\u7f51\u7edc\u8fdb\u884c\u8bbf\u95ee\u3002\u6b64\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002 -message.installWizard.tooltip.addZone.internaldns1=\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u7cfb\u7edf VM \u7684\u4e13\u7528\u7f51\u7edc\u63a5\u53e3\u8fdb\u884c\u8bbf\u95ee\u3002\u60a8\u4e3a\u63d0\u4f9b\u70b9\u63d0\u4f9b\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002 -message.installWizard.tooltip.addZone.internaldns2=\u8fd9\u4e9b\u670d\u52a1\u5668\u662f\u4f9b\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\uff0c\u5c06\u901a\u8fc7\u7cfb\u7edf VM \u7684\u4e13\u7528\u7f51\u7edc\u63a5\u53e3\u8fdb\u884c\u8bbf\u95ee\u3002\u60a8\u4e3a\u63d0\u4f9b\u70b9\u63d0\u4f9b\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u5728\u6b64\u5904\u6307\u5b9a\u7684 DNS \u670d\u52a1\u5668\u3002 -message.installWizard.tooltip.addZone.name=\u8d44\u6e90\u57df\u540d\u79f0 -message.installWizard.tooltip.configureGuestTraffic.description=\u60a8\u7684\u7f51\u7edc\u8bf4\u660e -message.installWizard.tooltip.configureGuestTraffic.guestEndIp=\u80fd\u591f\u5206\u914d\u7ed9\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe\u7684 IP \u5730\u5740\u8303\u56f4\u3002\u5982\u679c\u4f7f\u7528\u4e00\u4e2a NIC\uff0c\u8fd9\u4e9b IP \u5e94\u4f4d\u4e8e\u4e0e\u63d0\u4f9b\u70b9 CIDR \u76f8\u540c\u7684 CIDR \u4e2d\u3002 -message.installWizard.tooltip.configureGuestTraffic.guestGateway=\u6765\u5bbe\u5e94\u4f7f\u7528\u7684\u7f51\u5173 -message.installWizard.tooltip.configureGuestTraffic.guestNetmask=\u6765\u5bbe\u5e94\u4f7f\u7528\u7684\u5b50\u7f51\u4e0a\u6b63\u5728\u4f7f\u7528\u7684\u7f51\u7edc\u63a9\u7801 -message.installWizard.tooltip.configureGuestTraffic.guestStartIp=\u80fd\u591f\u5206\u914d\u7ed9\u6b64\u8d44\u6e90\u57df\u4e2d\u7684\u6765\u5bbe\u7684 IP \u5730\u5740\u8303\u56f4\u3002\u5982\u679c\u4f7f\u7528\u4e00\u4e2a NIC\uff0c\u8fd9\u4e9b IP \u5e94\u4f4d\u4e8e\u4e0e\u63d0\u4f9b\u70b9 CIDR \u76f8\u540c\u7684 CIDR \u4e2d\u3002 -message.installWizard.tooltip.configureGuestTraffic.name=\u60a8\u7684\u7f51\u7edc\u540d\u79f0 -message.instance.scaled.up.confirm=\u662f\u5426\u786e\u5b9e\u8981\u6269\u5c55\u60a8\u7684\u5b9e\u4f8b? -message.instanceWizard.noTemplates=\u60a8\u6ca1\u6709\u4efb\u4f55\u53ef\u7528\u6a21\u677f\uff1b\u8bf7\u6dfb\u52a0\u4e00\u4e2a\u517c\u5bb9\u7684\u6a21\u677f\uff0c\u7136\u540e\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b\u5411\u5bfc\u3002 -message.ip.address.changed=\u60a8\u7684 IP \u5730\u5740\u53ef\u80fd\u5df2\u53d1\u751f\u53d8\u5316\uff1b\u662f\u5426\u8981\u5237\u65b0\u6b64\u5217\u8868? \u8bf7\u6ce8\u610f\uff0c\u5237\u65b0\u6b64\u5217\u8868\u65f6\uff0c\u201c\u8be6\u7ec6\u4fe1\u606f\u201d\u7a97\u683c\u5c06\u5173\u95ed\u3002 -message.iso.desc=\u78c1\u76d8\u6620\u50cf\uff0c\u5176\u4e2d\u5305\u542b\u64cd\u4f5c\u7cfb\u7edf\u7684\u6570\u636e\u6216\u53ef\u542f\u52a8\u4ecb\u8d28 -message.join.project=\u60a8\u73b0\u5728\u5df2\u52a0\u5165\u4e86\u4e00\u4e2a\u9879\u76ee\u3002\u8bf7\u5207\u6362\u5230\u201c\u9879\u76ee\u89c6\u56fe\u201d\u4ee5\u67e5\u770b\u9879\u76ee\u3002 -message.launch.vm.on.private.network=\u662f\u5426\u8981\u5728\u60a8\u7684\u79c1\u4eba\u4e13\u7528\u7f51\u7edc\u4e2d\u542f\u52a8\u5b9e\u4f8b? -message.launch.zone=\u8d44\u6e90\u57df\u5df2\u51c6\u5907\u5c31\u7eea\uff0c\u53ef\u968f\u65f6\u542f\u52a8\uff1b\u8bf7\u7ee7\u7eed\u6267\u884c\u4e0b\u4e00\u6b65\u9aa4\u3002 -message.link.domain.to.ldap=\u4e3a\u6b64\u57df\u5f00\u542f LDAP \u540c\u6b65 -message.listView.subselect.multi=(\u6309\u4f4f Ctrl/Cmd \u5e76\u5355\u51fb) -message.lock.account=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u9501\u5b9a\u6b64\u5e10\u6237\u3002\u901a\u8fc7\u9501\u5b9a\u6b64\u5e10\u6237\uff0c\u6b64\u5e10\u6237\u7684\u6240\u6709\u7528\u6237\u5c06\u4e0d\u518d\u80fd\u591f\u7ba1\u7406\u5404\u81ea\u7684\u4e91\u8d44\u6e90\uff0c\u4f46\u4ecd\u7136\u53ef\u4ee5\u8bbf\u95ee\u73b0\u6709\u8d44\u6e90\u3002 -message.migrate.instance.confirm=\u8bf7\u786e\u8ba4\u8981\u5c06\u865a\u62df\u5b9e\u4f8b\u8fc1\u79fb\u5230\u7684\u4e3b\u673a\u3002 -message.migrate.instance.to.host=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u673a\u3002 -message.migrate.instance.to.ps=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5b9e\u4f8b\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8\u3002 -message.migrate.router.confirm=\u8bf7\u786e\u8ba4\u60a8\u8981\u5c06\u8def\u7531\u5668\u8fc1\u79fb\u5230\u7684\u4e3b\u673a\: -message.migrate.systemvm.confirm=\u8bf7\u786e\u8ba4\u60a8\u8981\u5c06\u7cfb\u7edf VM \u8fc1\u79fb\u5230\u7684\u4e3b\u673a\: -message.migrate.volume=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u5377\u8fc1\u79fb\u5230\u5176\u4ed6\u4e3b\u5b58\u50a8\u3002 -message.network.addVM.desc=\u8bf7\u6307\u5b9a\u8981\u5c06\u6b64 VM \u6dfb\u52a0\u5230\u7684\u7f51\u7edc\u3002\u5c06\u4e3a\u6b64\u7f51\u7edc\u6dfb\u52a0\u4e00\u4e2a\u65b0 NIC\u3002 -message.network.addVMNIC=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u7f51\u7edc\u6dfb\u52a0\u4e00\u4e2a\u65b0 VM NIC\u3002 -message.network.remote.access.vpn.configuration=\u8fdc\u7a0b\u8bbf\u95eeVPN\u914d\u7f6e\u5df2\u7ecf\u4ea7\u751f\uff0c\u4f46\u65e0\u6cd5\u5e94\u7528\u3002\u8bf7\u68c0\u67e5\u7f51\u7edc\u8fde\u63a5\u72b6\u51b5\uff0c\u7136\u540e\u91cd\u65b0\u5c1d\u8bd5\u3002 -message.new.user=\u8bf7\u6307\u5b9a\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u5411\u5e10\u6237\u4e2d\u6dfb\u52a0\u4e00\u4e2a\u65b0\u7528\u6237 -message.no.affinity.groups=\u60a8\u6ca1\u6709\u4efb\u4f55\u5173\u8054\u6027\u7ec4\u3002\u8bf7\u7ee7\u7eed\u6267\u884c\u4e0b\u4e00\u6b65\u64cd\u4f5c\u3002 -message.no.host.available=\u6ca1\u6709\u53ef\u7528\u4e8e\u8fc1\u79fb\u7684\u4e3b\u673a -message.no.network.support.configuration.not.true=\u60a8\u7684\u6240\u6709\u8d44\u6e90\u57df\u90fd\u672a\u542f\u7528\u5b89\u5168\u7ec4\uff0c\u56e0\u6b64\u65e0\u5176\u4ed6\u7f51\u7edc\u529f\u80fd\u3002\u8bf7\u7ee7\u7eed\u6267\u884c\u6b65\u9aa4 5\u3002 -message.no.network.support=\u60a8\u9009\u62e9\u7684\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f vSphere \u6ca1\u6709\u4efb\u4f55\u5176\u4ed6\u7f51\u7edc\u529f\u80fd\u3002\u8bf7\u7ee7\u7eed\u6267\u884c\u6b65\u9aa4 5\u3002 -message.no.projects.adminOnly=\u60a8\u6ca1\u6709\u4efb\u4f55\u9879\u76ee\u3002
\u8bf7\u8981\u6c42\u7ba1\u7406\u5458\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\u3002 -message.no.projects=\u60a8\u6ca1\u6709\u4efb\u4f55\u9879\u76ee\u3002
\u8bf7\u4ece\u201c\u9879\u76ee\u201d\u90e8\u5206\u4e2d\u521b\u5efa\u4e00\u4e2a\u65b0\u9879\u76ee\u3002 -message.number.clusters=

\u7fa4\u96c6\u6570

-message.number.hosts=

\u4e3b\u673a\u6570

-message.number.pods=

\u63d0\u4f9b\u70b9\u6570

-message.number.storage=

\u4e3b\u5b58\u50a8\u5377\u6570

-message.number.zones=

\u8d44\u6e90\u57df\u6570

-message.password.has.been.reset.to=\u5bc6\u7801\u5df2\u91cd\u7f6e\u4e3a -message.password.of.the.vm.has.been.reset.to=\u5b9e\u4f8b\u7684\u5bc6\u7801\u4ee5\u91cd\u7f6e\u4e3a -message.pending.projects.1=\u60a8\u6709\u5f85\u5b9a\u9879\u76ee\u9080\u8bf7\: -message.pending.projects.2=\u8981\u67e5\u770b\uff0c\u8bf7\u8f6c\u81f3\u201c\u9879\u76ee\u201d\u90e8\u5206\uff0c\u7136\u540e\u4ece\u4e0b\u62c9\u5217\u8868\u4e2d\u9009\u62e9\u201c\u9080\u8bf7\u201d\u3002 -message.please.add.at.lease.one.traffic.range=\u8bf7\u81f3\u5c11\u6dfb\u52a0\u4e00\u4e2a\u6d41\u91cf\u8303\u56f4\u3002 -message.please.confirm.remove.ssh.key.pair=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u6b64SSH\u5bc6\u94a5\u5bf9 -message.please.proceed=\u8bf7\u7ee7\u7eed\u6267\u884c\u4e0b\u4e2a\u6b65\u9aa4\u3002 -message.please.select.a.configuration.for.your.zone=\u8bf7\u4e3a\u60a8\u7684\u8d44\u6e90\u57df\u9009\u62e9\u4e00\u79cd\u914d\u7f6e\u3002 -message.please.select.a.different.public.and.management.network.before.removing=\u8bf7\u5148\u9009\u62e9\u5176\u4ed6\u516c\u7528\u7ba1\u7406\u7f51\u7edc\uff0c\u7136\u540e\u518d\u5220\u9664 -message.please.select.networks=\u8bf7\u4e3a\u60a8\u7684\u865a\u62df\u673a\u9009\u62e9\u7f51\u7edc\u3002 -message.please.select.ssh.key.pair.use.with.this.vm=\u8bf7\u4e3a\u6b64\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a\u5bc6\u94a5\u5bf9 -message.please.wait.while.zone.is.being.created=\u6b63\u5728\u521b\u5efa\u8d44\u6e90\u57df\uff0c\u8bf7\u7a0d\u5019\uff1b\u6b64\u64cd\u4f5c\u53ef\u80fd\u9700\u8981\u4e00\u6bb5\u65f6\u95f4\u624d\u80fd\u5b8c\u6210... -message.pod.dedication.released=\u5df2\u91ca\u653e\u4e13\u7528\u63d0\u4f9b\u70b9 -message.portable.ip.delete.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u53ef\u79fb\u690d IP \u8303\u56f4 -message.project.invite.sent=\u53d1\u9001\u7ed9\u7528\u6237\u7684\u9080\u8bf7\uff1b\u7528\u6237\u63a5\u53d7\u9080\u8bf7\u540e\uff0c\u5c06\u52a0\u5165\u5230\u9879\u76ee\u4e2d -message.public.traffic.in.advanced.zone=\u4e91\u4e2d\u7684 VM \u8bbf\u95ee Internet \u65f6\u5c06\u751f\u6210\u516c\u5171\u6d41\u91cf\uff0c\u4f46\u5fc5\u987b\u5206\u914d\u53ef\u516c\u5f00\u8bbf\u95ee\u7684 IP \u624d\u80fd\u5b9e\u73b0\u3002\u6700\u7ec8\u7528\u6237\u53ef\u4ee5\u4f7f\u7528 CloudStack UI \u83b7\u53d6\u8fd9\u4e9b IP\uff0c\u4ee5\u5728\u5176\u6765\u5bbe\u7f51\u7edc\u4e0e\u516c\u7528\u7f51\u7edc\u4e4b\u95f4\u6267\u884c NAT\u3002

\u8bf7\u81f3\u5c11\u4e3a Internet \u6d41\u91cf\u63d0\u4f9b\u4e00\u4e2a IP \u5730\u5740\u8303\u56f4\u3002 -message.public.traffic.in.basic.zone=\u4e91\u4e2d\u7684 VM \u8bbf\u95ee Internet \u6216\u901a\u8fc7 Internet \u5411\u5ba2\u6237\u7aef\u63d0\u4f9b\u670d\u52a1\u65f6\u5c06\u751f\u6210\u516c\u5171\u6d41\u91cf\uff0c\u4f46\u5fc5\u987b\u5206\u914d\u53ef\u516c\u5f00\u8bbf\u95ee\u7684 IP \u624d\u80fd\u5b9e\u73b0\u3002\u521b\u5efa\u5b9e\u4f8b\u65f6\uff0c\u5c06\u628a\u8fd9\u4e00\u7ec4\u516c\u7528 IP \u4e2d\u7684 IP (\u6765\u5bbe IP \u5730\u5740\u9664\u5916)\u5206\u914d\u7ed9\u6b64\u5b9e\u4f8b\u3002\u9759\u6001 1-1 NAT \u5c06\u5728\u516c\u7528 IP \u4e0e\u6765\u5bbe IP \u4e4b\u95f4\u81ea\u52a8\u8bbe\u7f6e\u3002\u6700\u7ec8\u7528\u6237\u8fd8\u53ef\u4ee5\u4f7f\u7528 CloudStack UI \u83b7\u53d6\u5176\u4ed6 IP\uff0c\u4ee5\u5728\u5176\u5b9e\u4f8b\u4e0e\u516c\u7528 IP \u4e4b\u95f4\u6267\u884c\u9759\u6001 NAT\u3002 -message.question.are.you.sure.you.want.to.add=\u60a8\u786e\u5b9a\u8981\u6dfb\u52a0 -message.read.admin.guide.scaling.up=\u5f00\u59cb\u6269\u5c55\u4e4b\u524d\uff0c\u8bf7\u9605\u8bfb\u7ba1\u7406\u6307\u5357\u4e2d\u7684\u52a8\u6001\u6269\u5c55\u90e8\u5206\u3002 -message.recover.vm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u6062\u590d\u6b64 VM\u3002 -message.redirecting.region=\u6b63\u5728\u91cd\u5b9a\u5411\u5230\u5730\u7406\u533a\u57df... -message.reinstall.vm=\u6ce8\u610f\: \u8bf7\u8c28\u614e\u64cd\u4f5c\u3002\u8fd9\u5c06\u5bfc\u81f4\u4ece\u6a21\u677f\u91cd\u65b0\u5b89\u88c5 VM\uff0c\u5e76\u4e14\u5f15\u5bfc\u78c1\u76d8\u4e0a\u5b58\u50a8\u7684\u6570\u636e\u5c06\u4e22\u5931\u3002\u989d\u5916\u7684\u6570\u636e\u5377(\u5982\u679c\u5b58\u5728)\u5c06\u65e0\u6cd5\u8bbf\u95ee\u3002 -message.removed.ssh.key.pair=\u5df2\u79fb\u9664\u7684SSH\u5bc6\u94a5\u5bf9 -message.remove.ldap=\u662f\u5426\u786e\u5b9e\u8981\u5220\u9664 LDAP \u914d\u7f6e? -message.remove.region=\u662f\u5426\u786e\u5b9e\u8981\u4ece\u6b64\u7ba1\u7406\u670d\u52a1\u5668\u4e2d\u5220\u9664\u6b64\u5730\u7406\u533a\u57df? -message.remove.vpc=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664 VPC -message.remove.vpn.access=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5220\u9664\u4ee5\u4e0b\u7528\u6237\u7684 VPN \u8bbf\u95ee\u3002 -message.reset.password.warning.notPasswordEnabled=\u521b\u5efa\u6b64\u5b9e\u4f8b\u7684\u6a21\u677f\u65f6\u672a\u542f\u7528\u5bc6\u7801 -message.reset.password.warning.notStopped=\u5fc5\u987b\u5148\u505c\u6b62\u60a8\u7684\u5b9e\u4f8b\uff0c\u624d\u80fd\u5c1d\u8bd5\u66f4\u6539\u5176\u5f53\u524d\u5bc6\u7801 -message.reset.VPN.connection=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u7f6e VPN \u8fde\u63a5 -message.restart.mgmt.server=\u8bf7\u91cd\u65b0\u542f\u52a8\u7ba1\u7406\u670d\u52a1\u5668\u4ee5\u4f7f\u60a8\u7684\u65b0\u8bbe\u7f6e\u751f\u6548\u3002 -message.restart.mgmt.usage.server=\u8bf7\u91cd\u65b0\u542f\u52a8\u7ba1\u7406\u670d\u52a1\u5668\u548c\u4f7f\u7528\u670d\u52a1\u5668\u4ee5\u4f7f\u60a8\u7684\u65b0\u8bbe\u7f6e\u751f\u6548\u3002 -message.restart.network=\u6b64\u7f51\u7edc\u63d0\u4f9b\u7684\u6240\u6709\u670d\u52a1\u90fd\u5c06\u4e2d\u65ad\u3002\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8\u6b64\u7f51\u7edc\u3002 -message.restart.vpc.remark=\u8bf7\u786e\u5b9a\u60a8\u8981\u91cd\u542fVPC

\u8b66\u544a\: \u91cd\u542f\u975e\u5197\u4f59\u7684VPC\u5c06\u4f1a\u5bfc\u81f4\u7f51\u7edc\u4e2d\u65ad,\u76f4\u81f3VPC\u91cd\u542f\u5b8c\u6210.

-message.restart.vpc=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u91cd\u65b0\u542f\u52a8 VPC -message.restoreVM=\u662f\u5426\u8981\u8fd8\u539f\u6b64 VM? -message.security.group.usage=(\u6309\u4f4f Ctrl \u952e\u5e76\u5355\u51fb\u9f20\u6807\u53ef\u9009\u62e9\u6240\u6709\u9002\u7528\u7684\u5b89\u5168\u7ec4) -message.select.affinity.groups=\u8bf7\u9009\u62e9\u60a8\u5e0c\u671b\u6b64 VM \u6240\u5c5e\u7684\u4efb\u4f55\u5173\u8054\u6027\u7ec4\: -message.select.a.zone=\u4e00\u4e2a\u8d44\u6e90\u57df\u901a\u5e38\u4e0e\u4e00\u4e2a\u6570\u636e\u4e2d\u5fc3\u76f8\u5bf9\u5e94\u3002\u591a\u4e2a\u8d44\u6e90\u57df\u53ef\u4ee5\u63d0\u4f9b\u7269\u7406\u9694\u79bb\u548c\u5197\u4f59\uff0c\u6709\u52a9\u4e8e\u4f7f\u4e91\u66f4\u52a0\u53ef\u9760\u3002 -message.select.instance=\u8bf7\u9009\u62e9\u4e00\u4e2a\u5b9e\u4f8b\u3002 -message.select.iso=\u8bf7\u4e3a\u60a8\u7684\u65b0\u865a\u62df\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a ISO\u3002 -message.select.item=\u8bf7\u9009\u62e9\u4e00\u4e2a\u9879\u76ee\u3002 -message.select.security.groups=\u8bf7\u4e3a\u60a8\u7684\u65b0 VM \u9009\u62e9\u5b89\u5168\u7ec4 -message.select.template=\u8bf7\u4e3a\u60a8\u7684\u65b0\u865a\u62df\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a\u6a21\u677f\u3002 -message.select.tier=\u8bf7\u9009\u62e9\u4e00\u4e2a\u5c42 -message.set.default.NIC.manual=\u8bf7\u7acb\u5373\u624b\u52a8\u66f4\u65b0\u6b64 VM \u4e0a\u7684\u9ed8\u8ba4 NIC\u3002 -message.set.default.NIC=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u5c06\u6b64 NIC \u8bbe\u7f6e\u4e3a\u6b64 VM \u7684\u9ed8\u8ba4 NIC\u3002 -message.setup.physical.network.during.zone.creation.basic=\u6dfb\u52a0\u57fa\u7840\u8d44\u6e90\u57df\u65f6\uff0c\u53ef\u4ee5\u8bbe\u7f6e\u4e00\u4e2a\u7269\u7406\u7f51\u7edc\uff0c\u6b64\u7f51\u7edc\u5e94\u4e0e\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u4e2d\u7684 NIC \u76f8\u5bf9\u5e94\u3002\u6b64\u7f51\u7edc\u53ef\u4ee5\u627f\u8f7d\u591a\u79cd\u6d41\u91cf\u7c7b\u578b\u3002

\u6b64\u5916\uff0c\u8fd8\u53ef\u4ee5\u5c06\u5176\u4ed6\u6d41\u91cf\u7c7b\u578b\u62d6\u653e\u5230\u6b64\u7269\u7406\u7f51\u7edc\u3002 -message.setup.physical.network.during.zone.creation=\u6dfb\u52a0\u9ad8\u7ea7\u8d44\u6e90\u57df\u65f6\uff0c\u9700\u8981\u8bbe\u7f6e\u4e00\u4e2a\u6216\u591a\u4e2a\u7269\u7406\u7f51\u7edc\u3002\u6bcf\u4e2a\u7f51\u7edc\u90fd\u4e0e\u865a\u62df\u673a\u7ba1\u7406\u7a0b\u5e8f\u4e2d\u7684\u4e00\u4e2a NIC \u76f8\u5bf9\u5e94\u3002\u6bcf\u4e2a\u7269\u7406\u7f51\u7edc\u4e2d\u53ef\u4ee5\u5305\u542b\u4e00\u79cd\u6216\u591a\u79cd\u6d41\u91cf\u7c7b\u578b\uff0c\u5e76\u5bf9\u8fd9\u4e9b\u6d41\u91cf\u7c7b\u578b\u53ef\u80fd\u7684\u7ec4\u5408\u65b9\u5f0f\u8bbe\u7f6e\u4e86\u67d0\u4e9b\u9650\u5236\u3002

\u53ef\u4ee5\u5c06\u4e00\u79cd\u6216\u591a\u79cd\u6d41\u91cf\u7c7b\u578b\u62d6\u653e\u5230\u6bcf\u4e2a\u7269\u7406\u7f51\u7edc\u4e2d\u3002 -message.setup.successful=\u5df2\u6210\u529f\u8bbe\u7f6e\u4e91\! -message.snapshot.schedule=\u53ef\u4ee5\u901a\u8fc7\u4ece\u4ee5\u4e0b\u53ef\u7528\u9009\u9879\u4e2d\u8fdb\u884c\u9009\u62e9\u5e76\u5e94\u7528\u60a8\u7684\u7b56\u7565\u9996\u9009\u9879\u6765\u8bbe\u7f6e\u91cd\u73b0\u5feb\u7167\u8ba1\u5212 -message.specifiy.tag.key.value=\u8bf7\u6307\u5b9a\u6807\u8bb0\u5bc6\u94a5\u548c\u503c -message.specify.url=\u8bf7\u6307\u5b9a URL -message.step.1.continue=\u8bf7\u9009\u62e9\u4e00\u4e2a\u6a21\u677f\u6216 ISO \u4ee5\u7ee7\u7eed -message.step.1.desc=\u8bf7\u4e3a\u60a8\u7684\u65b0\u865a\u62df\u5b9e\u4f8b\u9009\u62e9\u4e00\u4e2a\u6a21\u677f\u3002\u8fd8\u53ef\u4ee5\u9009\u62e9\u4e00\u4e2a\u53ef\u5c06 ISO \u6620\u50cf\u5b89\u88c5\u5230\u5176\u4e2d\u7684\u7a7a\u6a21\u677f\u3002 -message.step.2.continue=\u8bf7\u9009\u62e9\u4e00\u79cd\u670d\u52a1\u65b9\u6848\u4ee5\u7ee7\u7eed -message.step.3.continue=\u8bf7\u9009\u62e9\u4e00\u4e2a\u78c1\u76d8\u65b9\u6848\u4ee5\u7ee7\u7eed -message.step.4.continue=\u8bf7\u81f3\u5c11\u9009\u62e9\u4e00\u4e2a\u7f51\u7edc\u4ee5\u7ee7\u7eed -message.step.4.desc=\u8bf7\u9009\u62e9\u865a\u62df\u5b9e\u4f8b\u8981\u8fde\u63a5\u5230\u7684\u4e3b\u7f51\u7edc\u3002 -message.storage.traffic=CloudStack \u5185\u90e8\u8d44\u6e90(\u5305\u62ec\u4e0e\u7ba1\u7406\u670d\u52a1\u5668\u901a\u4fe1\u7684\u4efb\u4f55\u7ec4\u4ef6\uff0c\u4f8b\u5982\u4e3b\u673a\u548c CloudStack \u7cfb\u7edf VM)\u4e4b\u95f4\u7684\u6d41\u91cf\u3002\u8bf7\u5728\u6b64\u5904\u914d\u7f6e\u5b58\u50a8\u6d41\u91cf\u3002 -message.suspend.project=\u662f\u5426\u786e\u5b9e\u8981\u6682\u505c\u6b64\u9879\u76ee? -message.systems.vms.ready=\u7cfb\u7edf VM \u5df2\u5c31\u7eea\u3002 -message.template.copying=\u6b63\u5728\u590d\u5236\u6a21\u677f\u3002 -message.template.desc=\u64cd\u4f5c\u7cfb\u7edf\u6620\u50cf\uff0c\u53ef\u7528\u4e8e\u542f\u52a8 VM -message.tier.required=\u201c\u5c42\u201d\u4e3a\u5fc5\u586b\u9879 -message.tooltip.dns.1=\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002 -message.tooltip.dns.2=\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 VM \u4f7f\u7528\u7684\u4e8c\u7ea7 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u8d44\u6e90\u57df\u7684\u516c\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002 -message.tooltip.internal.dns.1=\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 CloudStack \u5185\u90e8\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u63d0\u4f9b\u70b9\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002 -message.tooltip.internal.dns.2=\u4f9b\u8d44\u6e90\u57df\u4e2d\u7684 CloudStack \u5185\u90e8\u7cfb\u7edf VM \u4f7f\u7528\u7684 DNS \u670d\u52a1\u5668\u540d\u79f0\u3002\u63d0\u4f9b\u70b9\u7684\u4e13\u7528 IP \u5730\u5740\u5fc5\u987b\u8def\u7531\u5230\u6b64\u670d\u52a1\u5668\u3002 -message.tooltip.network.domain=DNS \u540e\u7f00\uff0c\u5c06\u4e3a\u7531\u6765\u5bbe VM \u8bbf\u95ee\u7684\u7f51\u7edc\u521b\u5efa\u4e00\u4e2a\u81ea\u5b9a\u4e49\u57df\u540d\u3002 -message.tooltip.pod.name=\u6b64\u63d0\u4f9b\u70b9\u7684\u540d\u79f0\u3002 -message.tooltip.reserved.system.gateway=\u63d0\u4f9b\u70b9\u4e2d\u7684\u4e3b\u673a\u7f51\u5173\u3002 -message.tooltip.reserved.system.netmask=\u7528\u4e8e\u5b9a\u4e49\u63d0\u4f9b\u70b9\u5b50\u7f51\u7684\u7f51\u7edc\u524d\u7f00\u3002\u8bf7\u4f7f\u7528 CIDR \u7b26\u53f7\u3002 -message.tooltip.zone.name=\u8d44\u6e90\u57df\u540d\u79f0\u3002 -message.update.os.preference=\u8bf7\u4e3a\u6b64\u4e3b\u673a\u9009\u62e9\u4e00\u4e2a\u64cd\u4f5c\u7cfb\u7edf\u9996\u9009\u9879\u3002\u9996\u5148\u5c06\u5177\u6709\u76f8\u4f3c\u9996\u9009\u9879\u7684\u6240\u6709\u865a\u62df\u5b9e\u4f8b\u5206\u914d\u81f3\u6b64\u4e3b\u673a\uff0c\u7136\u540e\u518d\u9009\u62e9\u5176\u4ed6\u5b9e\u4f8b\u3002 -message.update.resource.count=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u66f4\u65b0\u6b64\u5e10\u6237\u7684\u8d44\u6e90\u6570\u3002 -message.update.ssl.failed=\u65e0\u6cd5\u66f4\u65b0 SSL \u8bc1\u4e66\u3002 -message.update.ssl.succeeded=\u5df2\u6210\u529f\u66f4\u65b0 SSL \u8bc1\u4e66 -message.update.ssl=\u8bf7\u63d0\u4ea4\u4e00\u4e2a X.509 \u517c\u5bb9\u7684\u65b0 SSL \u8bc1\u4e66\uff0c\u4ee5\u4fbf\u5c06\u5176\u66f4\u65b0\u5230\u6bcf\u4e2a\u63a7\u5236\u53f0\u4ee3\u7406\u548c\u4e8c\u7ea7\u5b58\u50a8\u865a\u62df\u5b9e\u4f8b\: -message.validate.accept=\u8bf7\u8f93\u5165\u4e00\u4e2a\u5e26\u6709\u6709\u6548\u6269\u5c55\u540d\u7684\u503c\u3002 -message.validate.creditcard=\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u4fe1\u7528\u5361\u5361\u53f7\u3002 -message.validate.date.ISO=\u8bf7\u8f93\u5165\u6709\u6548\u7684\u65e5\u671f(ISO)\u3002 -message.validate.date=\u8bf7\u8f93\u5165\u6709\u6548\u7684\u65e5\u671f\u3002 -message.validate.digits=\u8bf7\u4ec5\u8f93\u5165\u6570\u5b57\u3002 -message.validate.email.address=\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u7684\u7535\u5b50\u90ae\u4ef6\u5730\u5740\u3002 -message.validate.equalto=\u8bf7\u91cd\u65b0\u8f93\u5165\u76f8\u540c\u7684\u503c\u3002 -message.validate.fieldrequired=\u6b64\u5b57\u6bb5\u4e3a\u5fc5\u586b\u5b57\u6bb5\u3002 -message.validate.fixfield=\u8bf7\u4fee\u590d\u6b64\u5b57\u6bb5\u3002 -message.validate.instance.name=\u5b9e\u4f8b\u540d\u79f0\u4e0d\u5f97\u8d85\u8fc7 63 \u4e2a\u5b57\u7b26\u3002\u4ec5\u5141\u8bb8\u4f7f\u7528 ASCII \u5b57\u6bcd a - z \u6216 A - Z\u3001\u6570\u5b57 0 - 9 \u4ee5\u53ca\u8fde\u5b57\u7b26\u3002\u5b9e\u4f8b\u540d\u79f0\u5fc5\u987b\u4ee5\u5b57\u6bcd\u5f00\u5934\u5e76\u4ee5\u5b57\u6bcd\u6216\u6570\u5b57\u7ed3\u675f\u3002 -message.validate.invalid.characters=\u67e5\u627e\u5230\u65e0\u6548\u5b57\u7b26\uff0c\u8bf7\u66f4\u6b63\u3002 -message.validate.maxlength=\u8bf7\u6700\u591a\u8f93\u5165 {0} \u4e2a\u5b57\u7b26\u3002 -message.validate.max=\u8bf7\u8f93\u5165\u4e00\u4e2a\u5c0f\u4e8e\u6216\u7b49\u4e8e {0} \u7684\u503c\u3002 -message.validate.minlength=\u8bf7\u81f3\u5c11\u8f93\u5165 {0} \u4e2a\u5b57\u7b26\u3002 -message.validate.number=\u8bf7\u8f93\u5165\u4e00\u4e2a\u6709\u6548\u6570\u5b57\u3002 -message.validate.range.length=\u8bf7\u8f93\u5165\u4e00\u4e2a\u957f\u5ea6\u4ecb\u4e8e {0} \u5230 {1} \u4e4b\u95f4\u7684\u503c\u3002 -message.validate.range=\u8bf7\u8f93\u5165\u4e00\u4e2a\u4ecb\u4e8e {0} \u5230 {1} \u4e4b\u95f4\u7684\u503c\u3002 -message.validate.URL=\u8bf7\u8f93\u5165\u6709\u6548\u7684 URL\u3002 -message.virtual.network.desc=\u60a8\u7684\u5e10\u6237\u7684\u4e13\u7528\u865a\u62df\u7f51\u7edc\u3002\u5e7f\u64ad\u57df\u5305\u542b\u5728 VLAN \u4e2d\uff0c\u5e76\u4e14\u6240\u6709\u516c\u7528\u7f51\u7edc\u8bbf\u95ee\u90fd\u7531\u865a\u62df\u8def\u7531\u5668\u8def\u7531\u51fa\u53bb\u3002 -message.vm.create.template.confirm=\u521b\u5efa\u6a21\u677f\u5c06\u81ea\u52a8\u91cd\u65b0\u542f\u52a8 VM\u3002 -message.vm.review.launch=\u8bf7\u5148\u6838\u5bf9\u4ee5\u4e0b\u4fe1\u606f\uff0c\u786e\u8ba4\u60a8\u7684\u865a\u62df\u5b9e\u4f8b\u6b63\u786e\u65e0\u8bef\uff0c\u7136\u540e\u518d\u542f\u52a8\u3002 -message.vnmc.available.list=\u63d0\u4f9b\u7a0b\u5e8f\u5217\u8868\u4e2d\u672a\u63d0\u4f9b VNMC\u3002 -message.vnmc.not.available.list=\u63d0\u4f9b\u7a0b\u5e8f\u5217\u8868\u4e2d\u672a\u63d0\u4f9b VNMC\u3002 -message.volume.create.template.confirm=\u8bf7\u786e\u8ba4\u60a8\u786e\u5b9e\u8981\u4e3a\u6b64\u78c1\u76d8\u5377\u521b\u5efa\u4e00\u4e2a\u6a21\u677f\u3002\u521b\u5efa\u6a21\u677f\u53ef\u80fd\u9700\u8981\u51e0\u5206\u949f\u5230\u66f4\u957f\u7684\u65f6\u95f4\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u5377\u7684\u5927\u5c0f\u3002 -message.waiting.for.builtin.templates.to.load=\u6b63\u5728\u7b49\u5f85\u52a0\u8f7d\u5185\u7f6e\u6a21\u677f... -message.XSTools61plus.update.failed=\u65e0\u6cd5\u66f4\u65b0\u201c\u539f\u59cb XS \u7248\u672c\u4e3a 6.1+\u201d\u5b57\u6bb5\u3002\u9519\u8bef\: -message.you.must.have.at.least.one.physical.network=\u60a8\u5fc5\u987b\u81f3\u5c11\u62e5\u6709\u4e00\u4e2a\u7269\u7406\u7f51\u7edc -message.your.cloudstack.is.ready=\u60a8\u7684 CloudStack \u5df2\u5c31\u7eea\! -message.Zone.creation.complete=\u5df2\u5b8c\u6210\u521b\u5efa\u8d44\u6e90\u57df -message.zone.creation.complete.would.you.like.to.enable.this.zone=\u5df2\u5b8c\u6210\u521b\u5efa\u8d44\u6e90\u57df\u3002\u662f\u5426\u8981\u542f\u7528\u6b64\u8d44\u6e90\u57df? -message.zone.no.network.selection=\u6240\u9009\u8d44\u6e90\u57df\u65e0\u4efb\u4f55\u7f51\u7edc\u9009\u9879\u3002 -message.zone.step.1.desc=\u8bf7\u4e3a\u60a8\u7684\u8d44\u6e90\u57df\u9009\u62e9\u4e00\u79cd\u7f51\u7edc\u6a21\u5f0f\u3002 -message.zone.step.2.desc=\u8bf7\u8f93\u5165\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u8d44\u6e90\u57df -message.zone.step.3.desc=\u8bf7\u8f93\u5165\u4ee5\u4e0b\u4fe1\u606f\u4ee5\u6dfb\u52a0\u4e00\u4e2a\u65b0\u63d0\u4f9b\u70b9 -message.zoneWizard.enable.local.storage=\u8b66\u544a\: \u5982\u679c\u4e3a\u6b64\u8d44\u6e90\u57df\u542f\u7528\u4e86\u672c\u5730\u5b58\u50a8\uff0c\u5219\u5fc5\u987b\u6267\u884c\u4ee5\u4e0b\u64cd\u4f5c\uff0c\u5177\u4f53\u53d6\u51b3\u4e8e\u60a8\u5e0c\u671b\u542f\u52a8\u7cfb\u7edf VM \u7684\u4f4d\u7f6e\:

1. \u5982\u679c\u9700\u8981\u5728\u5171\u4eab\u4e3b\u5b58\u50a8\u4e2d\u542f\u52a8\u7cfb\u7edf VM\uff0c\u5219\u5fc5\u987b\u5728\u5b8c\u6210\u521b\u5efa\u540e\u5c06\u5171\u4eab\u4e3b\u5b58\u50a8\u6dfb\u52a0\u5230\u6b64\u8d44\u6e90\u57df\u3002

2. \u5982\u679c\u9700\u8981\u5728\u672c\u5730\u4e3b\u5b58\u50a8\u4e2d\u542f\u52a8\u7cfb\u7edf VM\uff0c\u5219\u5fc5\u987b\u5728\u542f\u7528\u6b64\u8d44\u6e90\u57df\u4e4b\u524d\u5c06 system.vm.use.local.storage \u8bbe\u7f6e\u4e3a true\u3002


\u662f\u5426\u8981\u7ee7\u7eed? -messgae.validate.min=\u8bf7\u8f93\u5165\u4e00\u4e2a\u5927\u4e8e\u6216\u7b49\u4e8e {0} \u7684\u503c\u3002 -mode=\u6a21\u5f0f -network.rate=\u7f51\u7edc\u901f\u7387 -notification.reboot.instance=\u91cd\u65b0\u542f\u52a8\u5b9e\u4f8b -notification.start.instance=\u542f\u52a8\u5b9e\u4f8b -notification.stop.instance=\u505c\u6b62\u5b9e\u4f8b -side.by.side=\u5e76\u884c -state.Accepted=\u5df2\u63a5\u53d7 -state.Active=\u6d3b\u52a8 -state.Allocated=\u5df2\u5206\u914d -state.Allocating=\u6b63\u5728\u5206\u914d -state.BackedUp=\u5df2\u5907\u4efd -state.BackingUp=\u6b63\u5728\u5907\u4efd -state.Completed=\u5df2\u5b8c\u6210 -state.Creating=\u6b63\u5728\u521b\u5efa -state.Declined=\u5df2\u62d2\u7edd -state.Destroyed=\u5df2\u9500\u6bc1 -state.detached=\u5df2\u53d6\u6d88\u9644\u52a0 -state.Disabled=\u5df2\u7981\u7528 -state.Enabled=\u5df2\u542f\u7528 -state.Error=\u9519\u8bef -state.Expunging=\u6b63\u5728\u5220\u9664 -state.Migrating=\u6b63\u5728\u8fc1\u79fb -state.Pending=\u5f85\u5b9a -state.Ready=\u5df2\u5c31\u7eea -state.Running=\u6b63\u5728\u8fd0\u884c -state.Starting=\u6b63\u5728\u542f\u52a8 -state.Stopped=\u5df2\u505c\u6b62 -state.Stopping=\u6b63\u5728\u505c\u6b62 -state.Suspended=\u5df2\u6682\u505c -title.upload.volume=\u4e0a\u4f20\u5377 -ui.listView.filters.all=\u5168\u90e8 -ui.listView.filters.mine=\u672c\u7528\u6237 diff --git a/client/WEB-INF/web.xml b/client/WEB-INF/web.xml index a384f0647946..03f7d15db62e 100644 --- a/client/WEB-INF/web.xml +++ b/client/WEB-INF/web.xml @@ -19,23 +19,20 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> - - - log4jConfigLocation - classpath:log4j-cloud.xml - - - org.springframework.web.util.Log4jConfigListener - - - - org.apache.cloudstack.spring.module.web.CloudStackContextLoaderListener - + - contextConfigLocation - classpath:META-INF/cloudstack/webApplicationContext.xml + log4jConfigLocation + classpath:log4j-cloud.xml - + + + org.apache.cloudstack.spring.module.web.CloudStackContextLoaderListener + + + contextConfigLocation + classpath:META-INF/cloudstack/webApplicationContext.xml + + cloudStartupServlet com.cloud.servlet.CloudStartupServlet @@ -47,40 +44,26 @@ com.cloud.api.ApiServlet 5 - + consoleServlet com.cloud.servlet.ConsoleProxyServlet 6 - - - staticResources - com.cloud.servlet.StaticResourceServlet - - apiServlet /api/* - - - consoleServlet - /console - - - staticResources - *.css - *.html - *.js + consoleServlet + /console - java.lang.Exception - /error.jsp + java.lang.Exception + /error.html diff --git a/client/bindir/cloud-setup-management.in b/client/bindir/cloud-setup-management.in index de76007fc807..94a08cb1e1fb 100755 --- a/client/bindir/cloud-setup-management.in +++ b/client/bindir/cloud-setup-management.in @@ -29,13 +29,13 @@ if __name__ == '__main__': parser = OptionParser() parser.add_option("--https", action="store_true", dest="https", help="Enable HTTPs connection of management server") - parser.add_option("--tomcat7", action="store_true", dest="tomcat7", help="Use Tomcat7 configuration files in Management Server") + parser.add_option("--tomcat7", action="store_true", dest="tomcat7", help="Depreciated option, don't use it") parser.add_option("--no-start", action="store_true", dest="nostart", help="Do not start management server after successful configuration") (options, args) = parser.parse_args() if options.https: glbEnv.svrMode = "HttpsServer" if options.tomcat7: - glbEnv.svrConf = "Tomcat7" + print "The --tomcat7 option is deprecated, CloudStack now uses embedded Jetty server." if options.nostart: glbEnv.noStart = True diff --git a/client/tomcatconf/commons-logging.properties.in b/client/conf/commons-logging.properties.in similarity index 97% rename from client/tomcatconf/commons-logging.properties.in rename to client/conf/commons-logging.properties.in index 1e570d65f3b2..febd7ba23aee 100644 --- a/client/tomcatconf/commons-logging.properties.in +++ b/client/conf/commons-logging.properties.in @@ -17,9 +17,9 @@ # under the License. # -# This is the logging properties that goes to the war, there are two logging conf kept at the +# This is the logging properties that goes to the war, there are two logging conf kept at the # svn, one for developement (one at src/test-resources) and other for producation - + # Uncomment the next line to disable all logging. #org.apache.commons.logging.Log=org.apache.commons.logging.impl.NoOpLog diff --git a/client/tomcatconf/db.properties.in b/client/conf/db.properties.in similarity index 97% rename from client/tomcatconf/db.properties.in rename to client/conf/db.properties.in index ab7d7c90c168..2f1dcf0d6b84 100644 --- a/client/tomcatconf/db.properties.in +++ b/client/conf/db.properties.in @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,7 +16,7 @@ # under the License. # management server clustering parameters, change cluster.node.IP to the machine IP address -# in which the management server(Tomcat) is running +# in which the management server is running cluster.node.IP=127.0.0.1 cluster.servlet.port=9090 region.id=1 @@ -47,7 +47,6 @@ db.cloud.keyStore= db.cloud.keyStorePassword= db.cloud.trustStore= db.cloud.trustStorePassword= -db.cloud.keyStorePassphrase=vmops.com # Encryption Settings db.cloud.encryption.type=none diff --git a/client/tomcatconf/ehcache.xml.in b/client/conf/ehcache.xml.in similarity index 98% rename from client/tomcatconf/ehcache.xml.in rename to client/conf/ehcache.xml.in index 9443d48b83b1..19bfd0f6967e 100755 --- a/client/tomcatconf/ehcache.xml.in +++ b/client/conf/ehcache.xml.in @@ -23,7 +23,7 @@ under the License. CacheManager Configuration ========================== An ehcache.xml corresponds to a single CacheManager. - + See instructions below or the ehcache schema (ehcache.xsd) on how to configure. System property tokens can be specified in this file which are replaced when the configuration is loaded. @@ -143,7 +143,7 @@ under the License. The hostname is the hostname of the remote CacheManager peer. The port is the listening port of the RMICacheManagerPeerListener of the remote CacheManager peer. - + Configuring JGroups replication: - This listener supports the same property than the RMICacheReplicationFactory. + replicateUpdates=true, replicateUpdatesViaCopy=false, + replicateRemovals=true,asynchronousReplicationIntervalMillis=1000"/> + This listener supports the same property than the RMICacheReplicationFactory. Cluster Bootstrapping @@ -435,7 +435,7 @@ under the License. disk cache, which in this configuration will go to wherever java.io.tmp is defined on your system. On a standard Linux system this will be /tmp" --> - - - - - - @@ -136,19 +136,19 @@ under the License. - + - + - + - + diff --git a/client/conf/server.properties.in b/client/conf/server.properties.in new file mode 100644 index 000000000000..f255128555c8 --- /dev/null +++ b/client/conf/server.properties.in @@ -0,0 +1,44 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +# The binding interface for the management server +bind.interface=:: + +# The service context path where URL requests should be served +context.path=/client + +# The HTTP port to be used by the management server +http.port=8080 + +# Max inactivity time in minutes for the session +session.timeout=30 + +# Options to configure and enable HTTPS on management server +# +# For management server to pickup these configuration settings, the configured +# keystore file should exists and be readable by the management server. +https.enable=false +https.port=8443 +# The keystore and manager passwords are assumed to be same. +https.keystore=/etc/cloudstack/management/cloud.jks +https.keystore.password=vmops.com + +# The path to webapp directory +webapp.dir=/usr/share/cloudstack-management/webapp + +# The path to access log file +access.log=/var/log/cloudstack/management/access.log diff --git a/client/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-management.in b/client/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-management.in deleted file mode 100755 index 03a9301f6c7d..000000000000 --- a/client/distro/centos/SYSCONFDIR/rc.d/init.d/cloud-management.in +++ /dev/null @@ -1,107 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# @PACKAGE@-management This shell script takes care of starting and stopping Tomcat -# -# chkconfig: - 80 20 -# -### BEGIN INIT INFO -# Provides: tomcat6 -# Required-Start: $network $syslog -# Required-Stop: $network $syslog -# Default-Start: -# Default-Stop: -# Description: Release implementation for Servlet 2.5 and JSP 2.1 -# Short-Description: start and stop tomcat -### END INIT INFO -# -# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot -# - heavily rewritten by Deepak Bhole and Jason Corley -# - -if [ -r /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -fi -if [ -r /lib/lsb/init-functions ]; then - . /lib/lsb/init-functions -fi - - -NAME="$(basename $0)" -stop() { - SHUTDOWN_WAIT="40" - count="0" - if [ -f /var/run/cloud-management.pid ]; then - pid=`cat /var/run/cloud-management.pid` - kill $pid &>/dev/null - until [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ] || \ - [ "$count" -gt "$SHUTDOWN_WAIT" ] - do - sleep 1 - let count="${count}+1" - done - if [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ]; then - log_success_msg "Stopping cloud-management:" - else - log_failure_msg "Stopping cloud-management:" - fi - else - echo "Cannot find PID file of Cloud-management" - log_failure_msg "Stopping cloud-management:" - fi -} - -set_ulimit() { - fd_limit=`ulimit -n` - if [ "$fd_limit" != "4096" ]; then - user=`whoami` - if [ $user == "root" ]; then - ulimit -n 4096 - fi - fi -} - -handle_pid_file() { - if [ "$1" -ne 0 ] ; then - echo "The pid file locates at /var/run/cloud-management.pid and lock file at /var/lock/subsys/cloud-management. - Starting cloud-management will take care of them or you can manually clean up." - fi -} - -# See how we were called. -case "$1" in - status) - status ${NAME} - RETVAL=$? - handle_pid_file $RETVAL - ;; - stop) - stop - ;; - restart) - stop - set start - set_ulimit - . /etc/rc.d/init.d/tomcat6 - ;; - *) - set_ulimit - . /etc/rc.d/init.d/tomcat6 -esac - -exit $RETVAL diff --git a/client/distro/centos/SYSCONFDIR/sysconfig/cloud-management.in b/client/distro/centos/SYSCONFDIR/sysconfig/cloud-management.in deleted file mode 100644 index d22a6d5adc24..000000000000 --- a/client/distro/centos/SYSCONFDIR/sysconfig/cloud-management.in +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This file is loaded in /etc/init.d/vmopsmanagement -# ATM we only do two things here: - -dummy=1 ; export TOMCAT_CFG=@MSCONF@/tomcat6.conf ; . @MSCONF@/tomcat6.conf -#-------------------------- - diff --git a/client/distro/fedora/SYSCONFDIR/rc.d/init.d/cloud-management.in b/client/distro/fedora/SYSCONFDIR/rc.d/init.d/cloud-management.in deleted file mode 100755 index bbc469327387..000000000000 --- a/client/distro/fedora/SYSCONFDIR/rc.d/init.d/cloud-management.in +++ /dev/null @@ -1,106 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# @PACKAGE@-management This shell script takes care of starting and stopping Tomcat -# -# chkconfig: - 80 20 -# -### BEGIN INIT INFO -# Provides: tomcat6 -# Required-Start: $network $syslog -# Required-Stop: $network $syslog -# Default-Start: -# Default-Stop: -# Description: Release implementation for Servlet 2.5 and JSP 2.1 -# Short-Description: start and stop tomcat -### END INIT INFO -# -# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot -# - heavily rewritten by Deepak Bhole and Jason Corley -# - -if [ -r /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -fi -if [ -r /lib/lsb/init-functions ]; then - . /lib/lsb/init-functions -fi - -set_ulimit() { - fd_limit=`ulimit -n` - if [ "$fd_limit" != "4096" ]; then - user=`whoami` - if [ $user == "root" ]; then - ulimit -n 4096 - fi - fi -} - -NAME="$(basename $0)" -stop() { - SHUTDOWN_WAIT="30" - count="0" - if [ -f /var/run/cloud-management.pid ]; then - pid=`cat /var/run/cloud-management.pid` - kill $pid &>/dev/null - until [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ] || \ - [ "$count" -gt "$SHUTDOWN_WAIT" ] - do - sleep 1 - let count="${count}+1" - done - if [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ]; then - log_success_msg "Stopping cloud-management:" - else - log_failure_msg "Stopping cloud-management:" - fi - else - echo "Cannot find PID file of Cloud-management" - log_failure_msg "Stopping cloud-management:" - fi -} - -handle_pid_file() { - if [ "$1" -ne 0 ] ; then - echo "The pid file locates at /var/run/cloud-management.pid and lock file at /var/lock/subsys/cloud-management. - Starting cloud-management will take care of them or you can manually clean up." - fi -} - -# See how we were called. -case "$1" in - status) - status ${NAME} - RETVAL=$? - handle_pid_file $RETVAL - ;; - stop) - stop - ;; - restart) - stop - set start - set_ulimit - . /etc/rc.d/init.d/tomcat6 - ;; - *) - set_ulimit - . /etc/rc.d/init.d/tomcat6 -esac - -exit $RETVAL diff --git a/client/distro/fedora/SYSCONFDIR/sysconfig/cloud-management.in b/client/distro/fedora/SYSCONFDIR/sysconfig/cloud-management.in deleted file mode 100644 index d22a6d5adc24..000000000000 --- a/client/distro/fedora/SYSCONFDIR/sysconfig/cloud-management.in +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This file is loaded in /etc/init.d/vmopsmanagement -# ATM we only do two things here: - -dummy=1 ; export TOMCAT_CFG=@MSCONF@/tomcat6.conf ; . @MSCONF@/tomcat6.conf -#-------------------------- - diff --git a/client/distro/opensuse/SYSCONFDIR/init.d/cloud-management.in b/client/distro/opensuse/SYSCONFDIR/init.d/cloud-management.in deleted file mode 100755 index d071b39d2e75..000000000000 --- a/client/distro/opensuse/SYSCONFDIR/init.d/cloud-management.in +++ /dev/null @@ -1,239 +0,0 @@ -#!/bin/sh -# -# /etc/init.d/tomcat6 -- startup script for the Tomcat 6 servlet engine - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -### BEGIN INIT INFO -# Provides: tomcat-vmops -# Required-Start: $local_fs $remote_fs $network -# Required-Stop: $local_fs $remote_fs $network -# Should-Start: $named -# Should-Stop: $named -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Start Tomcat (CloudStack). -# Description: Start the Tomcat servlet engine that runs the CloudStack Management Server. -### END INIT INFO - -PATH=/bin:/usr/bin:/sbin:/usr/sbin -NAME=cloud-management -DESC="CloudStack-specific Tomcat servlet engine" -DAEMON=/usr/bin/jsvc -CATALINA_HOME=@MSENVIRON@ -DEFAULT=@MSCONF@/tomcat6.conf -JVM_TMP=/tmp/$NAME-temp - -if [ `id -u` -ne 0 ]; then - echo "You need root privileges to run this script" - exit 1 -fi - -# Make sure tomcat is started with system locale -if [ -r /etc/default/locale ]; then - . /etc/default/locale - export LANG -fi - -. /lib/lsb/init-functions -. /etc/rc.status - - -# The following variables can be overwritten in $DEFAULT - -# Run Tomcat 6 as this user ID -TOMCAT6_USER=tomcat6 - -# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not -# defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun /usr/lib/jvm/java-1.5.0-sun /usr/lib/j2sdk1.5-sun /usr/lib/j2sdk1.5-ibm" - -# Look for the right JVM to use -for jdir in $JDK_DIRS; do - if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME="$jdir" - fi -done -export JAVA_HOME - -# Directory for per-instance configuration files and webapps -CATALINA_BASE=@MSENVIRON@ - -# Use the Java security manager? (yes/no) -TOMCAT6_SECURITY=no - -# Default Java options -# Set java.awt.headless=true if JAVA_OPTS is not set so the -# Xalan XSL transformer can work without X11 display on JDK 1.4+ -# It also looks like the default heap size of 64M is not enough for most cases -# so the maximum heap size is set to 128M -if [ -z "$JAVA_OPTS" ]; then - JAVA_OPTS="-Djava.awt.headless=true -Xmx128M" -fi - -# End of variables that can be overwritten in $DEFAULT - -# overwrite settings from default file -if [ -f "$DEFAULT" ]; then - . "$DEFAULT" -fi - -if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" ]; then - log_failure_msg "$NAME is not installed" - exit 1 -fi - -[ -f "$DAEMON" ] || exit 0 - -POLICY_CACHE="$CATALINA_BASE/work/catalina.policy" - -JAVA_OPTS="$JAVA_OPTS -Djava.endorsed.dirs=$CATALINA_HOME/endorsed -Dcatalina.base=$CATALINA_BASE -Dcatalina.home=$CATALINA_HOME -Djava.io.tmpdir=$JVM_TMP" - -# Set the JSP compiler if set in the tomcat6.default file -if [ -n "$JSP_COMPILER" ]; then - JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=$JSP_COMPILER" -fi - -if [ "$TOMCAT6_SECURITY" = "yes" ]; then - JAVA_OPTS="$JAVA_OPTS -Djava.security.manager -Djava.security.policy=$POLICY_CACHE" -fi - -# Set juli LogManager if logging.properties is provided -if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then - JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties" -fi - -# Define other required variables -CATALINA_PID="@PIDDIR@/$NAME.pid" -BOOTSTRAP_CLASS=org.apache.catalina.startup.Bootstrap -JSVC_CLASSPATH="/usr/share/java/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar" -JSVC_CLASSPATH=$CLASSPATH:$JSVC_CLASSPATH - -# Look for Java Secure Sockets Extension (JSSE) JARs -if [ -z "${JSSE_HOME}" -a -r "${JAVA_HOME}/jre/lib/jsse.jar" ]; then - JSSE_HOME="${JAVA_HOME}/jre/" -fi -export JSSE_HOME - -case "$1" in - start) - if [ -z "$JAVA_HOME" ]; then - log_failure_msg "no JDK found - please set JAVA_HOME" - exit 1 - fi - - if [ ! -d "$CATALINA_BASE/conf" ]; then - log_failure_msg "invalid CATALINA_BASE: $CATALINA_BASE" - exit 1 - fi - - log_daemon_msg "Starting $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - - # Regenerate POLICY_CACHE file - umask 022 - echo "// AUTO-GENERATED FILE from /etc/tomcat6/policy.d/" \ - > "$POLICY_CACHE" - echo "" >> "$POLICY_CACHE" - if ls $CATALINA_BASE/conf/policy.d/*.policy > /dev/null 2>&1 ; then - cat $CATALINA_BASE/conf/policy.d/*.policy \ - >> "$POLICY_CACHE" - fi - - # Remove / recreate JVM_TMP directory - rm -rf "$JVM_TMP" - mkdir "$JVM_TMP" || { - log_failure_msg "could not create JVM temporary directory" - exit 1 - } - chown $TOMCAT6_USER "$JVM_TMP" - cd "$JVM_TMP" - - - # fix storage issues on nfs mounts - umask 000 - $DAEMON -user "$TOMCAT6_USER" -cp "$JSVC_CLASSPATH" \ - -outfile SYSLOG -errfile SYSLOG \ - -pidfile "$CATALINA_PID" $JAVA_OPTS "$BOOTSTRAP_CLASS" - - sleep 5 - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_end_msg 1 - else - log_end_msg 0 - fi - else - log_progress_msg "(already running)" - log_end_msg 0 - fi - ;; - stop) - log_daemon_msg "Stopping $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user "$TOMCAT6_USER" --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_progress_msg "(not running)" - else - $DAEMON -cp "$JSVC_CLASSPATH" -pidfile "$CATALINA_PID" \ - -stop "$BOOTSTRAP_CLASS" - fi - rm -rf "$JVM_TMP" - log_end_msg 0 - ;; - status) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - - if [ -f "$CATALINA_PID" ]; then - log_success_msg "$DESC is not running, but pid file exists." - exit 1 - else - log_success_msg "$DESC is not running." - exit 3 - fi - else - log_success_msg "$DESC is running with pid `cat $CATALINA_PID`" - fi - ;; - restart|force-reload) - if start-stop-daemon --test --stop --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - $0 stop - sleep 1 - fi - $0 start - ;; - try-restart) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - $0 start - fi - ;; - *) - log_success_msg "Usage: $0 {start|stop|restart|try-restart|force-reload|status}" - exit 1 - ;; -esac - -exit 0 diff --git a/client/distro/opensuse/SYSCONFDIR/sysconfig/cloud-management.in b/client/distro/opensuse/SYSCONFDIR/sysconfig/cloud-management.in deleted file mode 100644 index d22a6d5adc24..000000000000 --- a/client/distro/opensuse/SYSCONFDIR/sysconfig/cloud-management.in +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This file is loaded in /etc/init.d/vmopsmanagement -# ATM we only do two things here: - -dummy=1 ; export TOMCAT_CFG=@MSCONF@/tomcat6.conf ; . @MSCONF@/tomcat6.conf -#-------------------------- - diff --git a/client/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-management.in b/client/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-management.in deleted file mode 100644 index b0be89e81863..000000000000 --- a/client/distro/rhel/SYSCONFDIR/rc.d/init.d/cloud-management.in +++ /dev/null @@ -1,108 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# @PACKAGE@-management This shell script takes care of starting and stopping Tomcat -# -# chkconfig: - 80 20 -# -### BEGIN INIT INFO -# Provides: tomcat6 -# Required-Start: $network $syslog -# Required-Stop: $network $syslog -# Default-Start: -# Default-Stop: -# Description: Release implementation for Servlet 2.5 and JSP 2.1 -# Short-Description: start and stop tomcat -### END INIT INFO -# -# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot -# - heavily rewritten by Deepak Bhole and Jason Corley -# - -if [ -r /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -fi -if [ -r /lib/lsb/init-functions ]; then - . /lib/lsb/init-functions -fi - - -NAME="$(basename $0)" -stop() { - SHUTDOWN_WAIT="30" - count="0" - if [ -f /var/run/cloud-management.pid ]; then - pid=`cat /var/run/cloud-management.pid` - kill $pid &>/dev/null - until [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ] || \ - [ "$count" -gt "$SHUTDOWN_WAIT" ] - do - sleep 1 - let count="${count}+1" - done - if [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ]; then - log_success_msg "Stopping cloud-management:" - else - log_failure_msg "Stopping cloud-management:" - fi - else - echo "Cannot find PID file of Cloud-management" - log_failure_msg "Stopping cloud-management:" - fi -} - -set_ulimit() { - fd_limit=`ulimit -n` - if [ "$fd_limit" != "4096" ]; then - user=`whoami` - if [ $user == "root" ]; then - ulimit -n 4096 - fi - fi -} - - -handle_pid_file() { - if [ "$1" -ne 0 ] ; then - echo "The pid file locates at /var/run/cloud-management.pid and lock file at /var/lock/subsys/cloud-management. - Starting cloud-management will take care of them or you can manually clean up." - fi -} - -# See how we were called. -case "$1" in - status) - status ${NAME} - RETVAL=$? - handle_pid_file $RETVAL - ;; - stop) - stop - ;; - restart) - stop - set start - set_ulimit - . /etc/rc.d/init.d/tomcat6 - ;; - *) - set_ulimit - . /etc/rc.d/init.d/tomcat6 -esac - -exit $RETVAL diff --git a/client/distro/rhel/SYSCONFDIR/sysconfig/cloud-management.in b/client/distro/rhel/SYSCONFDIR/sysconfig/cloud-management.in deleted file mode 100644 index d22a6d5adc24..000000000000 --- a/client/distro/rhel/SYSCONFDIR/sysconfig/cloud-management.in +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This file is loaded in /etc/init.d/vmopsmanagement -# ATM we only do two things here: - -dummy=1 ; export TOMCAT_CFG=@MSCONF@/tomcat6.conf ; . @MSCONF@/tomcat6.conf -#-------------------------- - diff --git a/client/distro/sles/SYSCONFDIR/init.d/cloud-management.in b/client/distro/sles/SYSCONFDIR/init.d/cloud-management.in deleted file mode 100755 index d071b39d2e75..000000000000 --- a/client/distro/sles/SYSCONFDIR/init.d/cloud-management.in +++ /dev/null @@ -1,239 +0,0 @@ -#!/bin/sh -# -# /etc/init.d/tomcat6 -- startup script for the Tomcat 6 servlet engine - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -### BEGIN INIT INFO -# Provides: tomcat-vmops -# Required-Start: $local_fs $remote_fs $network -# Required-Stop: $local_fs $remote_fs $network -# Should-Start: $named -# Should-Stop: $named -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Start Tomcat (CloudStack). -# Description: Start the Tomcat servlet engine that runs the CloudStack Management Server. -### END INIT INFO - -PATH=/bin:/usr/bin:/sbin:/usr/sbin -NAME=cloud-management -DESC="CloudStack-specific Tomcat servlet engine" -DAEMON=/usr/bin/jsvc -CATALINA_HOME=@MSENVIRON@ -DEFAULT=@MSCONF@/tomcat6.conf -JVM_TMP=/tmp/$NAME-temp - -if [ `id -u` -ne 0 ]; then - echo "You need root privileges to run this script" - exit 1 -fi - -# Make sure tomcat is started with system locale -if [ -r /etc/default/locale ]; then - . /etc/default/locale - export LANG -fi - -. /lib/lsb/init-functions -. /etc/rc.status - - -# The following variables can be overwritten in $DEFAULT - -# Run Tomcat 6 as this user ID -TOMCAT6_USER=tomcat6 - -# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not -# defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun /usr/lib/jvm/java-1.5.0-sun /usr/lib/j2sdk1.5-sun /usr/lib/j2sdk1.5-ibm" - -# Look for the right JVM to use -for jdir in $JDK_DIRS; do - if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME="$jdir" - fi -done -export JAVA_HOME - -# Directory for per-instance configuration files and webapps -CATALINA_BASE=@MSENVIRON@ - -# Use the Java security manager? (yes/no) -TOMCAT6_SECURITY=no - -# Default Java options -# Set java.awt.headless=true if JAVA_OPTS is not set so the -# Xalan XSL transformer can work without X11 display on JDK 1.4+ -# It also looks like the default heap size of 64M is not enough for most cases -# so the maximum heap size is set to 128M -if [ -z "$JAVA_OPTS" ]; then - JAVA_OPTS="-Djava.awt.headless=true -Xmx128M" -fi - -# End of variables that can be overwritten in $DEFAULT - -# overwrite settings from default file -if [ -f "$DEFAULT" ]; then - . "$DEFAULT" -fi - -if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" ]; then - log_failure_msg "$NAME is not installed" - exit 1 -fi - -[ -f "$DAEMON" ] || exit 0 - -POLICY_CACHE="$CATALINA_BASE/work/catalina.policy" - -JAVA_OPTS="$JAVA_OPTS -Djava.endorsed.dirs=$CATALINA_HOME/endorsed -Dcatalina.base=$CATALINA_BASE -Dcatalina.home=$CATALINA_HOME -Djava.io.tmpdir=$JVM_TMP" - -# Set the JSP compiler if set in the tomcat6.default file -if [ -n "$JSP_COMPILER" ]; then - JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=$JSP_COMPILER" -fi - -if [ "$TOMCAT6_SECURITY" = "yes" ]; then - JAVA_OPTS="$JAVA_OPTS -Djava.security.manager -Djava.security.policy=$POLICY_CACHE" -fi - -# Set juli LogManager if logging.properties is provided -if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then - JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties" -fi - -# Define other required variables -CATALINA_PID="@PIDDIR@/$NAME.pid" -BOOTSTRAP_CLASS=org.apache.catalina.startup.Bootstrap -JSVC_CLASSPATH="/usr/share/java/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar" -JSVC_CLASSPATH=$CLASSPATH:$JSVC_CLASSPATH - -# Look for Java Secure Sockets Extension (JSSE) JARs -if [ -z "${JSSE_HOME}" -a -r "${JAVA_HOME}/jre/lib/jsse.jar" ]; then - JSSE_HOME="${JAVA_HOME}/jre/" -fi -export JSSE_HOME - -case "$1" in - start) - if [ -z "$JAVA_HOME" ]; then - log_failure_msg "no JDK found - please set JAVA_HOME" - exit 1 - fi - - if [ ! -d "$CATALINA_BASE/conf" ]; then - log_failure_msg "invalid CATALINA_BASE: $CATALINA_BASE" - exit 1 - fi - - log_daemon_msg "Starting $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - - # Regenerate POLICY_CACHE file - umask 022 - echo "// AUTO-GENERATED FILE from /etc/tomcat6/policy.d/" \ - > "$POLICY_CACHE" - echo "" >> "$POLICY_CACHE" - if ls $CATALINA_BASE/conf/policy.d/*.policy > /dev/null 2>&1 ; then - cat $CATALINA_BASE/conf/policy.d/*.policy \ - >> "$POLICY_CACHE" - fi - - # Remove / recreate JVM_TMP directory - rm -rf "$JVM_TMP" - mkdir "$JVM_TMP" || { - log_failure_msg "could not create JVM temporary directory" - exit 1 - } - chown $TOMCAT6_USER "$JVM_TMP" - cd "$JVM_TMP" - - - # fix storage issues on nfs mounts - umask 000 - $DAEMON -user "$TOMCAT6_USER" -cp "$JSVC_CLASSPATH" \ - -outfile SYSLOG -errfile SYSLOG \ - -pidfile "$CATALINA_PID" $JAVA_OPTS "$BOOTSTRAP_CLASS" - - sleep 5 - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_end_msg 1 - else - log_end_msg 0 - fi - else - log_progress_msg "(already running)" - log_end_msg 0 - fi - ;; - stop) - log_daemon_msg "Stopping $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user "$TOMCAT6_USER" --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_progress_msg "(not running)" - else - $DAEMON -cp "$JSVC_CLASSPATH" -pidfile "$CATALINA_PID" \ - -stop "$BOOTSTRAP_CLASS" - fi - rm -rf "$JVM_TMP" - log_end_msg 0 - ;; - status) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - - if [ -f "$CATALINA_PID" ]; then - log_success_msg "$DESC is not running, but pid file exists." - exit 1 - else - log_success_msg "$DESC is not running." - exit 3 - fi - else - log_success_msg "$DESC is running with pid `cat $CATALINA_PID`" - fi - ;; - restart|force-reload) - if start-stop-daemon --test --stop --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - $0 stop - sleep 1 - fi - $0 start - ;; - try-restart) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - $0 start - fi - ;; - *) - log_success_msg "Usage: $0 {start|stop|restart|try-restart|force-reload|status}" - exit 1 - ;; -esac - -exit 0 diff --git a/client/distro/sles/SYSCONFDIR/sysconfig/cloud-management.in b/client/distro/sles/SYSCONFDIR/sysconfig/cloud-management.in deleted file mode 100644 index d22a6d5adc24..000000000000 --- a/client/distro/sles/SYSCONFDIR/sysconfig/cloud-management.in +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This file is loaded in /etc/init.d/vmopsmanagement -# ATM we only do two things here: - -dummy=1 ; export TOMCAT_CFG=@MSCONF@/tomcat6.conf ; . @MSCONF@/tomcat6.conf -#-------------------------- - diff --git a/client/distro/ubuntu/SYSCONFDIR/init.d/cloud-management.in b/client/distro/ubuntu/SYSCONFDIR/init.d/cloud-management.in deleted file mode 100755 index 4afa707a9e96..000000000000 --- a/client/distro/ubuntu/SYSCONFDIR/init.d/cloud-management.in +++ /dev/null @@ -1,244 +0,0 @@ -#!/bin/sh -# -# /etc/init.d/tomcat6 -- startup script for the Tomcat 6 servlet engine - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -### BEGIN INIT INFO -# Provides: tomcat-vmops -# Required-Start: $local_fs $remote_fs $network -# Required-Stop: $local_fs $remote_fs $network -# Should-Start: $named -# Should-Stop: $named -# Default-Start: 2 3 4 5 -# Default-Stop: 0 1 6 -# Short-Description: Start Tomcat (CloudStack). -# Description: Start the Tomcat servlet engine that runs the CloudStack Management Server. -### END INIT INFO - -PATH=/bin:/usr/bin:/sbin:/usr/sbin -NAME=cloud-management -DESC="CloudStack-specific Tomcat servlet engine" -DAEMON=/usr/bin/jsvc -CATALINA_HOME=@MSENVIRON@ -DEFAULT=@MSCONF@/tomcat6.conf -JVM_TMP=/tmp/$NAME-temp - -# We have to explicitly set the HOME variable to the homedir from the user "cloud" -# This is because various scripts run by the management server read the HOME variable -# and fail when this init script is run manually. -HOME=$(echo ~cloud) - -if [ `id -u` -ne 0 ]; then - echo "You need root privileges to run this script" - exit 1 -fi - -# Make sure tomcat is started with system locale -if [ -r /etc/default/locale ]; then - . /etc/default/locale - export LANG -fi - -. /lib/lsb/init-functions -. /etc/default/rcS - - -# The following variables can be overwritten in $DEFAULT - -# Run Tomcat 6 as this user ID -TOMCAT6_USER=tomcat6 - -# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not -# defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/java-1.6.0-openjdk-amd64/ /usr/lib/jvm/java-1.6.0-openjdk-i386/ /usr/lib/jvm/java-1.6.0-openjdk/ /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-sun" - -# Look for the right JVM to use -for jdir in $JDK_DIRS; do - if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME="$jdir" - fi -done -export JAVA_HOME - -# Directory for per-instance configuration files and webapps -CATALINA_BASE=@MSENVIRON@ - -# Use the Java security manager? (yes/no) -TOMCAT6_SECURITY=no - -# Default Java options -# Set java.awt.headless=true if JAVA_OPTS is not set so the -# Xalan XSL transformer can work without X11 display on JDK 1.4+ -# It also looks like the default heap size of 64M is not enough for most cases -# so the maximum heap size is set to 128M -if [ -z "$JAVA_OPTS" ]; then - JAVA_OPTS="-Djava.awt.headless=true -Xmx128M" -fi - -# End of variables that can be overwritten in $DEFAULT - -# overwrite settings from default file -if [ -f "$DEFAULT" ]; then - . "$DEFAULT" -fi - -if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" ]; then - log_failure_msg "$NAME is not installed" - exit 1 -fi - -[ -f "$DAEMON" ] || exit 0 - -POLICY_CACHE="$CATALINA_BASE/work/catalina.policy" - -JAVA_OPTS="$JAVA_OPTS -Djava.endorsed.dirs=$CATALINA_HOME/endorsed -Dcatalina.base=$CATALINA_BASE -Dcatalina.home=$CATALINA_HOME -Djava.io.tmpdir=$JVM_TMP" - -# Set the JSP compiler if set in the tomcat6.default file -if [ -n "$JSP_COMPILER" ]; then - JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=$JSP_COMPILER" -fi - -if [ "$TOMCAT6_SECURITY" = "yes" ]; then - JAVA_OPTS="$JAVA_OPTS -Djava.security.manager -Djava.security.policy=$POLICY_CACHE" -fi - -# Set juli LogManager if logging.properties is provided -if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then - JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties" -fi - -# Define other required variables -CATALINA_PID="@PIDDIR@/$NAME.pid" -BOOTSTRAP_CLASS=org.apache.catalina.startup.Bootstrap -JSVC_CLASSPATH="/usr/share/java/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar" -JSVC_CLASSPATH=$CLASSPATH:$JSVC_CLASSPATH - -# Look for Java Secure Sockets Extension (JSSE) JARs -if [ -z "${JSSE_HOME}" -a -r "${JAVA_HOME}/jre/lib/jsse.jar" ]; then - JSSE_HOME="${JAVA_HOME}/jre/" -fi -export JSSE_HOME - -case "$1" in - start) - if [ -z "$JAVA_HOME" ]; then - log_failure_msg "no JDK found - please set JAVA_HOME" - exit 1 - fi - - if [ ! -d "$CATALINA_BASE/conf" ]; then - log_failure_msg "invalid CATALINA_BASE: $CATALINA_BASE" - exit 1 - fi - - log_daemon_msg "Starting $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - - # Regenerate POLICY_CACHE file - umask 022 - echo "// AUTO-GENERATED FILE from /etc/tomcat6/policy.d/" \ - > "$POLICY_CACHE" - echo "" >> "$POLICY_CACHE" - if ls $CATALINA_BASE/conf/policy.d/*.policy > /dev/null 2>&1 ; then - cat $CATALINA_BASE/conf/policy.d/*.policy \ - >> "$POLICY_CACHE" - fi - - # Remove / recreate JVM_TMP directory - rm -rf "$JVM_TMP" - mkdir "$JVM_TMP" || { - log_failure_msg "could not create JVM temporary directory" - exit 1 - } - chown $TOMCAT6_USER "$JVM_TMP" - cd "$JVM_TMP" - - - # fix storage issues on nfs mounts - umask 000 - $DAEMON -user "$TOMCAT6_USER" -cp "$JSVC_CLASSPATH" \ - -outfile SYSLOG -errfile SYSLOG \ - -pidfile "$CATALINA_PID" $JAVA_OPTS "$BOOTSTRAP_CLASS" - - sleep 5 - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_end_msg 1 - else - log_end_msg 0 - fi - else - log_progress_msg "(already running)" - log_end_msg 0 - fi - ;; - stop) - log_daemon_msg "Stopping $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user "$TOMCAT6_USER" --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_progress_msg "(not running)" - else - $DAEMON -cp "$JSVC_CLASSPATH" -pidfile "$CATALINA_PID" \ - -stop "$BOOTSTRAP_CLASS" - fi - rm -rf "$JVM_TMP" - log_end_msg 0 - ;; - status) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - - if [ -f "$CATALINA_PID" ]; then - log_success_msg "$DESC is not running, but pid file exists." - exit 1 - else - log_success_msg "$DESC is not running." - exit 3 - fi - else - log_success_msg "$DESC is running with pid `cat $CATALINA_PID`" - fi - ;; - restart|force-reload) - if start-stop-daemon --test --stop --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - $0 stop - sleep 1 - fi - $0 start - ;; - try-restart) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - $0 start - fi - ;; - *) - log_success_msg "Usage: $0 {start|stop|restart|try-restart|force-reload|status}" - exit 1 - ;; -esac - -exit 0 diff --git a/client/pom.xml b/client/pom.xml index 38660a78ff4d..604027595764 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -13,14 +13,50 @@ 4.0.0 cloud-client-ui Apache CloudStack Client UI - war + jar org.apache.cloudstack cloudstack - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT + + + juniper-contrail + http://juniper.github.io/contrail-maven/snapshots + + + + + javax.servlet + javax.servlet-api + + + org.eclipse.jetty + jetty-server + + + org.eclipse.jetty + jetty-servlets + + + org.eclipse.jetty + jetty-webapp + + + org.eclipse.jetty + jetty-jmx + + + org.eclipse.jetty + jetty-util + + + mysql + mysql-connector-java + runtime + org.apache.cloudstack cloud-framework-spring-module @@ -56,6 +92,11 @@ cloud-plugin-acl-dynamic-role-based ${project.version} + + org.apache.cloudstack + cloud-plugin-ca-rootca + ${project.version} + org.apache.cloudstack cloud-plugin-dedicated-resources @@ -127,7 +168,7 @@ ${project.version} - org.apache.cloudstack + org.apache.cloudstack cloud-plugin-network-ovs ${project.version} @@ -141,11 +182,6 @@ cloud-plugin-network-bigswitch ${project.version}
- - org.apache.cloudstack - cloud-plugin-network-midonet - ${project.version} - org.apache.cloudstack cloud-plugin-network-ssp @@ -171,6 +207,11 @@ cloud-plugin-network-vcs ${project.version} + + org.apache.cloudstack + cloud-plugin-network-vsp + ${project.version} + org.apache.cloudstack cloud-plugin-hypervisor-xenserver @@ -252,6 +293,11 @@ cloud-plugin-outofbandmanagement-driver-ipmitool ${project.version} + + org.apache.cloudstack + cloud-plugin-outofbandmanagement-driver-nested-cloudstack + ${project.version} + org.apache.cloudstack cloud-mom-rabbitmq @@ -267,6 +313,21 @@ cloud-mom-kafka ${project.version} + + org.apache.cloudstack + cloud-framework-agent-lb + ${project.version} + + + org.apache.cloudstack + cloud-framework-ca + ${project.version} + + + org.apache.cloudstack + cloud-framework-direct-download + ${project.version} + org.apache.cloudstack cloud-framework-ipc @@ -317,6 +378,11 @@ cloud-engine-storage-cache ${project.version} + + org.apache.cloudstack + cloud-engine-storage-configdrive + ${project.version} + org.apache.cloudstack cloud-controller-secondary-storage @@ -377,6 +443,11 @@ cloud-plugin-host-anti-affinity ${project.version} + + org.apache.cloudstack + cloud-plugin-host-affinity + ${project.version} + org.apache.cloudstack cloud-plugin-api-solidfire-intg-test @@ -392,6 +463,16 @@ cloud-plugin-database-quota ${project.version} + + org.apache.cloudstack + cloud-plugin-integrations-cloudian-connector + ${project.version} + + + org.apache.cloudstack + cloud-plugin-integrations-prometheus-exporter + ${project.version} +
@@ -409,35 +490,18 @@ - - com.googlecode.todomap - maven-jettygzip-plugin - 0.0.4 - - ${project.build.directory}/generated-webapp - ${project.build.directory}/generated-webapp - - - - prepare-package - - process - - - - org.apache.maven.plugins - maven-war-plugin - 2.5 + maven-jar-plugin - ./target/generated-webapp/WEB-INF/web.xml - ./target/generated-webapp - true + org.apache.cloudstack.ServerDaemon + ${git.branch} + ${git.tag} + ${git.revision} ${git.revision} ${git.branch} @@ -447,14 +511,24 @@ org.eclipse.jetty jetty-maven-plugin - ${cs.jetty.version} - + ${cs.jetty-maven-plugin.version} + mysql mysql-connector-java ${cs.mysql.version} + + org.bouncycastle + bcprov-jdk15on + ${cs.bcprov.version} + + + org.bouncycastle + bcpkix-jdk15on + ${cs.bcprov.version} + 0 @@ -466,13 +540,13 @@ 60000 - ${project.build.directory}/generated-webapp/WEB-INF/web.xml - ${project.build.directory}/generated-webapp + ${project.build.directory}/classes/META-INF/webapp/WEB-INF/web.xml + ${project.build.directory}/classes/META-INF/webapp/ /client - ${project.build.directory}/utilities/scripts/db/;${project.build.directory}/utilities/scripts/db/db/ + ${project.build.directory}/conf/;${project.build.directory}/common;${project.build.directory}/utilities/scripts/db/;${project.build.directory}/utilities/scripts/db/db/ + .*/cloud.*jar$|.*/classes/.* - log4j.configuration @@ -481,15 +555,6 @@ - - org.apache.tomcat.maven - tomcat7-maven-plugin - - /client - ${basedir}/WEB-INF/web.xml - ${project.build.directory}/generated-webapp/ - - maven-antrun-plugin @@ -501,41 +566,20 @@ - + - + file="${project.build.directory}/common/scripts/**" type="both"/> + - - - - - - + - - - - - - - - - - - - - - - - @@ -560,7 +604,7 @@ - + @@ -569,7 +613,7 @@ - + @@ -580,7 +624,7 @@ - + @@ -597,7 +641,7 @@ test @@ -612,11 +656,11 @@ - + todir="${basedir}/target/common/scripts"> @@ -647,11 +691,16 @@ ${project.build.directory}/pythonlibs - org.jasypt - jasypt - 1.9.2 + org.bouncycastle + bcprov-jdk15on false - ${project.build.directory}/pythonlibs + ${project.build.directory}/lib + + + org.bouncycastle + bcpkix-jdk15on + false + ${project.build.directory}/lib @@ -669,6 +718,70 @@ + + org.apache.maven.plugins + maven-shade-plugin + 3.0.0 + + + rebuild-war + package + + shade + + + false + + + *:* + + + junit:junit + com.tngtech.java:junit-dataprovider + org.mockito:mockito-all + org.hamcrest:hamcrest-all + org.powermock:powermock-module-junit4 + org.powermock:powermock-api-mockito + org.springframework:spring-test + org.apache.tomcat.embed:tomcat-embed-core + org.apache.geronimo.specs:geronimo-servlet_3.0_spec + org.apache.geronimo.specs:geronimo-javamail_1.4_spec + org.bouncycastle:bcprov-jdk15on + org.bouncycastle:bcpkix-jdk15on + mysql:mysql-connector-java + + + + + + + org.apache.cloudstack.ServerDaemon + + + META-INF/spring.handlers + + + META-INF/spring.schemas + + + + + *:* + + META-INF/VERSION.txt + META-INF/LICENSE.txt + META-INF/*.SF + META-INF/*.DSA + META-INF/*.RSA + META-INF/MANIFEST.MF + META-INF/maven/** + + + + + + + @@ -703,9 +816,8 @@ - + - @@ -781,7 +893,6 @@ - @@ -1000,21 +1111,6 @@ - - nuagevsp - - - noredist - - - - - org.apache.cloudstack - cloud-plugin-network-vsp - ${project.version} - - - srx @@ -1070,6 +1166,21 @@ + + vmwaresioc + + + noredist + + + + + org.apache.cloudstack + cloud-plugin-api-vmware-sioc + ${project.version} + + + quickcloud diff --git a/client/resources/META-INF/cloudstack/webApplicationContext.xml b/client/resources/META-INF/cloudstack/webApplicationContext.xml index fea2709747b4..3b3c6dbe35c2 100644 --- a/client/resources/META-INF/cloudstack/webApplicationContext.xml +++ b/client/resources/META-INF/cloudstack/webApplicationContext.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/client/src/org/apache/cloudstack/ServerDaemon.java b/client/src/org/apache/cloudstack/ServerDaemon.java new file mode 100644 index 000000000000..985b67b755ae --- /dev/null +++ b/client/src/org/apache/cloudstack/ServerDaemon.java @@ -0,0 +1,317 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package org.apache.cloudstack; + +import java.io.File; +import java.io.IOException; +import java.lang.management.ManagementFactory; +import java.net.URL; +import java.util.Properties; + +import org.apache.commons.daemon.Daemon; +import org.apache.commons.daemon.DaemonContext; +import org.eclipse.jetty.jmx.MBeanContainer; +import org.eclipse.jetty.server.ForwardedRequestCustomizer; +import org.eclipse.jetty.server.HttpConfiguration; +import org.eclipse.jetty.server.HttpConnectionFactory; +import org.eclipse.jetty.server.NCSARequestLog; +import org.eclipse.jetty.server.RequestLog; +import org.eclipse.jetty.server.SecureRequestCustomizer; +import org.eclipse.jetty.server.Server; +import org.eclipse.jetty.server.ServerConnector; +import org.eclipse.jetty.server.SslConnectionFactory; +import org.eclipse.jetty.server.handler.HandlerCollection; +import org.eclipse.jetty.server.handler.MovedContextHandler; +import org.eclipse.jetty.server.handler.RequestLogHandler; +import org.eclipse.jetty.server.handler.gzip.GzipHandler; +import org.eclipse.jetty.util.ssl.SslContextFactory; +import org.eclipse.jetty.util.thread.QueuedThreadPool; +import org.eclipse.jetty.util.thread.ScheduledExecutorScheduler; +import org.eclipse.jetty.webapp.WebAppContext; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; + +import com.cloud.utils.PropertiesUtil; +import com.google.common.base.Strings; + +/*** + * The ServerDaemon class implements the embedded server, it can be started either + * using JSVC or directly from the JAR along with additional jars not shaded in the uber-jar. + * Configuration parameters are read from server.properties file available on the classpath. + */ +public class ServerDaemon implements Daemon { + private static final Logger LOG = LoggerFactory.getLogger(ServerDaemon.class); + private static final String WEB_XML = "META-INF/webapp/WEB-INF/web.xml"; + + ///////////////////////////////////////////////////// + /////////////// Server Properties /////////////////// + ///////////////////////////////////////////////////// + + private static final String BIND_INTERFACE = "bind.interface"; + private static final String CONTEXT_PATH = "context.path"; + private static final String SESSION_TIMEOUT = "session.timeout"; + private static final String HTTP_PORT = "http.port"; + private static final String HTTPS_ENABLE = "https.enable"; + private static final String HTTPS_PORT = "https.port"; + private static final String KEYSTORE_FILE = "https.keystore"; + private static final String KEYSTORE_PASSWORD = "https.keystore.password"; + private static final String WEBAPP_DIR = "webapp.dir"; + private static final String ACCESS_LOG = "access.log"; + + //////////////////////////////////////////////////////// + /////////////// Server Configuration /////////////////// + //////////////////////////////////////////////////////// + + private Server server; + + private int httpPort = 8080; + private int httpsPort = 8443; + private int sessionTimeout = 30; + private boolean httpsEnable = false; + private String accessLogFile = "access.log"; + private String bindInterface = ""; + private String contextPath = "/client"; + private String keystoreFile; + private String keystorePassword; + private String webAppLocation; + + ////////////////////////////////////////////////// + /////////////// Public methods /////////////////// + ////////////////////////////////////////////////// + + public static void main(final String... anArgs) throws Exception { + final ServerDaemon daemon = new ServerDaemon(); + daemon.init(null); + daemon.start(); + } + + @Override + public void init(final DaemonContext context) { + final File confFile = PropertiesUtil.findConfigFile("server.properties"); + if (confFile == null) { + LOG.warn(String.format("Server configuration file not found. Initializing server daemon on %s:%s, with https.enabled=%s, https.port=%s, context.path=%s", + bindInterface, httpPort, httpsEnable, httpsPort, contextPath)); + return; + } + + LOG.info("Server configuration file found: " + confFile.getAbsolutePath()); + + try { + final Properties properties = PropertiesUtil.loadFromFile(confFile); + if (properties == null) { + return; + } + setBindInterface(properties.getProperty(BIND_INTERFACE, "")); + setContextPath(properties.getProperty(CONTEXT_PATH, "/client")); + setHttpPort(Integer.valueOf(properties.getProperty(HTTP_PORT, "8080"))); + setHttpsEnable(Boolean.valueOf(properties.getProperty(HTTPS_ENABLE, "false"))); + setHttpsPort(Integer.valueOf(properties.getProperty(HTTPS_PORT, "8443"))); + setKeystoreFile(properties.getProperty(KEYSTORE_FILE)); + setKeystorePassword(properties.getProperty(KEYSTORE_PASSWORD)); + setWebAppLocation(properties.getProperty(WEBAPP_DIR)); + setAccessLogFile(properties.getProperty(ACCESS_LOG, "access.log")); + setSessionTimeout(Integer.valueOf(properties.getProperty(SESSION_TIMEOUT, "30"))); + } catch (final IOException e) { + LOG.warn("Failed to load configuration from server.properties file", e); + } + LOG.info(String.format("Initializing server daemon on %s:%s, with https.enabled=%s, https.port=%s, context.path=%s", + bindInterface, httpPort, httpsEnable, httpsPort, contextPath)); + } + + @Override + public void start() throws Exception { + // Thread pool + final QueuedThreadPool threadPool = new QueuedThreadPool(); + threadPool.setMinThreads(10); + threadPool.setMaxThreads(500); + + // Jetty Server + server = new Server(threadPool); + + // Setup Scheduler + server.addBean(new ScheduledExecutorScheduler()); + + // Setup JMX + final MBeanContainer mbeanContainer = new MBeanContainer(ManagementFactory.getPlatformMBeanServer()); + server.addBean(mbeanContainer); + + // HTTP config + final HttpConfiguration httpConfig = new HttpConfiguration(); + httpConfig.addCustomizer( new ForwardedRequestCustomizer() ); + httpConfig.setSecureScheme("https"); + httpConfig.setSecurePort(httpsPort); + httpConfig.setOutputBufferSize(32768); + httpConfig.setRequestHeaderSize(8192); + httpConfig.setResponseHeaderSize(8192); + httpConfig.setSendServerVersion(false); + httpConfig.setSendDateHeader(false); + + // HTTP Connector + final ServerConnector httpConnector = new ServerConnector(server, new HttpConnectionFactory(httpConfig)); + httpConnector.setPort(httpPort); + httpConnector.setHost(bindInterface); + httpConnector.setIdleTimeout(30000); + server.addConnector(httpConnector); + + // Setup handlers + server.setHandler(createHandlers()); + + // Extra config options + server.setStopAtShutdown(true); + + // Configure SSL + if (httpsEnable && !Strings.isNullOrEmpty(keystoreFile) && new File(keystoreFile).exists()) { + // SSL Context + final SslContextFactory sslContextFactory = new SslContextFactory(); + // Define keystore path and passwords + sslContextFactory.setKeyStorePath(keystoreFile); + sslContextFactory.setKeyStorePassword(keystorePassword); + sslContextFactory.setKeyManagerPassword(keystorePassword); + + // HTTPS config + final HttpConfiguration httpsConfig = new HttpConfiguration(httpConfig); + httpsConfig.addCustomizer(new SecureRequestCustomizer()); + + // HTTPS connector + final ServerConnector sslConnector = new ServerConnector(server, + new SslConnectionFactory(sslContextFactory, "http/1.1"), + new HttpConnectionFactory(httpsConfig)); + sslConnector.setPort(httpsPort); + sslConnector.setHost(bindInterface); + server.addConnector(sslConnector); + } + + server.start(); + server.join(); + } + + @Override + public void stop() throws Exception { + server.stop(); + } + + @Override + public void destroy() { + server.destroy(); + } + + /////////////////////////////////////////////////// + /////////////// Private methods /////////////////// + /////////////////////////////////////////////////// + + private HandlerCollection createHandlers() { + final WebAppContext webApp = new WebAppContext(); + webApp.setContextPath(contextPath); + webApp.setInitParameter("org.eclipse.jetty.servlet.Default.dirAllowed", "false"); + webApp.getSessionHandler().setMaxInactiveInterval(sessionTimeout * 60); + + // GZIP handler + final GzipHandler gzipHandler = new GzipHandler(); + gzipHandler.addIncludedMimeTypes("text/html", "text/xml", "text/css", "text/plain", "text/javascript", "application/javascript", "application/json", "application/xml"); + gzipHandler.setIncludedMethods("GET", "POST"); + gzipHandler.setCompressionLevel(9); + gzipHandler.setHandler(webApp); + + if (Strings.isNullOrEmpty(webAppLocation)) { + webApp.setWar(getShadedWarUrl()); + } else { + webApp.setWar(webAppLocation); + } + + // Request log handler + final RequestLogHandler log = new RequestLogHandler(); + log.setRequestLog(createRequestLog()); + + // Redirect root context handler + MovedContextHandler rootRedirect = new MovedContextHandler(); + rootRedirect.setContextPath("/"); + rootRedirect.setNewContextURL(contextPath); + rootRedirect.setPermanent(true); + + // Put rootRedirect at the end! + return new HandlerCollection(log, gzipHandler, rootRedirect); + } + + private RequestLog createRequestLog() { + final NCSARequestLog log = new NCSARequestLog(); + final File logPath = new File(accessLogFile); + final File parentFile = logPath.getParentFile(); + if (parentFile != null) { + parentFile.mkdirs(); + } + log.setFilename(logPath.getPath()); + log.setAppend(true); + log.setLogTimeZone("GMT"); + log.setLogLatency(true); + return log; + } + + private URL getResource(String aResource) { + return Thread.currentThread().getContextClassLoader().getResource(aResource); + } + + private String getShadedWarUrl() { + final String urlStr = getResource(WEB_XML).toString(); + return urlStr.substring(0, urlStr.length() - 15); + } + + /////////////////////////////////////////// + /////////////// Setters /////////////////// + /////////////////////////////////////////// + + public void setBindInterface(String bindInterface) { + this.bindInterface = bindInterface; + } + + public void setHttpPort(int httpPort) { + this.httpPort = httpPort; + } + + public void setHttpsPort(int httpsPort) { + this.httpsPort = httpsPort; + } + + public void setContextPath(String contextPath) { + this.contextPath = contextPath; + } + + public void setHttpsEnable(boolean httpsEnable) { + this.httpsEnable = httpsEnable; + } + + public void setKeystoreFile(String keystoreFile) { + this.keystoreFile = keystoreFile; + } + + public void setKeystorePassword(String keystorePassword) { + this.keystorePassword = keystorePassword; + } + + public void setAccessLogFile(String accessLogFile) { + this.accessLogFile = accessLogFile; + } + + public void setWebAppLocation(String webAppLocation) { + this.webAppLocation = webAppLocation; + } + + public void setSessionTimeout(int sessionTimeout) { + this.sessionTimeout = sessionTimeout; + } +} diff --git a/client/tomcatconf/catalina.policy.in b/client/tomcatconf/catalina.policy.in deleted file mode 100644 index 4bbfbf290585..000000000000 --- a/client/tomcatconf/catalina.policy.in +++ /dev/null @@ -1,180 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one or more -// contributor license agreements. See the NOTICE file distributed with -// this work for additional information regarding copyright ownership. -// The ASF licenses this file to You under the Apache License, Version 2.0 -// (the "License"); you may not use this file except in compliance with -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. - -// ============================================================================ -// catalina.corepolicy - Security Policy Permissions for Tomcat 6 -// -// This file contains a default set of security policies to be enforced (by the -// JVM) when Catalina is executed with the "-security" option. In addition -// to the permissions granted here, the following additional permissions are -// granted to the codebase specific to each web application: -// -// * Read access to the document root directory -// -// $Id: catalina.policy 899134 2010-01-14 09:44:28Z rjung $ -// ============================================================================ - - -// ========== SYSTEM CODE PERMISSIONS ========================================= - - -// These permissions apply to javac -grant codeBase "file:${java.home}/lib/-" { - permission java.security.AllPermission; -}; - -// These permissions apply to all shared system extensions -grant codeBase "file:${java.home}/jre/lib/ext/-" { - permission java.security.AllPermission; -}; - -// These permissions apply to javac when ${java.home] points at $JAVA_HOME/jre -grant codeBase "file:${java.home}/../lib/-" { - permission java.security.AllPermission; -}; - -// These permissions apply to all shared system extensions when -// ${java.home} points at $JAVA_HOME/jre -grant codeBase "file:${java.home}/lib/ext/-" { - permission java.security.AllPermission; -}; - - -// ========== CATALINA CODE PERMISSIONS ======================================= - - -// These permissions apply to the daemon code -grant codeBase "file:${catalina.home}/bin/commons-daemon.jar" { - permission java.security.AllPermission; -}; - -// These permissions apply to the logging API -grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" { - permission java.util.PropertyPermission "java.util.logging.config.class", "read"; - permission java.util.PropertyPermission "java.util.logging.config.file", "read"; - permission java.io.FilePermission "${java.home}${file.separator}lib${file.separator}logging.properties", "read"; - permission java.lang.RuntimePermission "shutdownHooks"; - permission java.io.FilePermission "${catalina.base}${file.separator}conf${file.separator}logging.properties", "read"; - permission java.util.PropertyPermission "catalina.base", "read"; - permission java.util.logging.LoggingPermission "control"; - permission java.io.FilePermission "${catalina.base}${file.separator}logs", "read, write"; - permission java.io.FilePermission "${catalina.base}${file.separator}logs${file.separator}*", "read, write"; - permission java.lang.RuntimePermission "getClassLoader"; - permission java.lang.RuntimePermission "setContextClassLoader"; - // To enable per context logging configuration, permit read access to the appropriate file. - // Be sure that the logging configuration is secure before enabling such access - // eg for the examples web application: - // permission java.io.FilePermission "${catalina.base}${file.separator}webapps${file.separator}examples${file.separator}WEB-INF${file.separator}classes${file.separator}logging.properties", "read"; -}; - -// These permissions apply to the server startup code -grant codeBase "file:${catalina.home}/bin/bootstrap.jar" { - permission java.security.AllPermission; -}; - -// These permissions apply to the servlet API classes -// and those that are shared across all class loaders -// located in the "lib" directory -grant codeBase "file:${catalina.home}/lib/-" { - permission java.security.AllPermission; -}; - - -// ========== WEB APPLICATION PERMISSIONS ===================================== - - -// These permissions are granted by default to all web applications -// In addition, a web application will be given a read FilePermission -// and JndiPermission for all files and directories in its document root. -grant { - // Required for JNDI lookup of named JDBC DataSource's and - // javamail named MimePart DataSource used to send mail - permission java.util.PropertyPermission "java.home", "read"; - permission java.util.PropertyPermission "java.naming.*", "read"; - permission java.util.PropertyPermission "javax.sql.*", "read"; - - // OS Specific properties to allow read access - permission java.util.PropertyPermission "os.name", "read"; - permission java.util.PropertyPermission "os.version", "read"; - permission java.util.PropertyPermission "os.arch", "read"; - permission java.util.PropertyPermission "file.separator", "read"; - permission java.util.PropertyPermission "path.separator", "read"; - permission java.util.PropertyPermission "line.separator", "read"; - - // JVM properties to allow read access - permission java.util.PropertyPermission "java.version", "read"; - permission java.util.PropertyPermission "java.vendor", "read"; - permission java.util.PropertyPermission "java.vendor.url", "read"; - permission java.util.PropertyPermission "java.class.version", "read"; - permission java.util.PropertyPermission "java.specification.version", "read"; - permission java.util.PropertyPermission "java.specification.vendor", "read"; - permission java.util.PropertyPermission "java.specification.name", "read"; - - permission java.util.PropertyPermission "java.vm.specification.version", "read"; - permission java.util.PropertyPermission "java.vm.specification.vendor", "read"; - permission java.util.PropertyPermission "java.vm.specification.name", "read"; - permission java.util.PropertyPermission "java.vm.version", "read"; - permission java.util.PropertyPermission "java.vm.vendor", "read"; - permission java.util.PropertyPermission "java.vm.name", "read"; - - // Required for OpenJMX - permission java.lang.RuntimePermission "getAttribute"; - - // Allow read of JAXP compliant XML parser debug - permission java.util.PropertyPermission "jaxp.debug", "read"; - - // Precompiled JSPs need access to these packages. - permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.el"; - permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime"; - permission java.lang.RuntimePermission "accessClassInPackage.org.apache.jasper.runtime.*"; - - // Precompiled JSPs need access to these system properties. - permission java.util.PropertyPermission "org.apache.jasper.runtime.BodyContentImpl.LIMIT_BUFFER", "read"; - permission java.util.PropertyPermission "org.apache.el.parser.COERCE_TO_ZERO", "read"; -}; - - -// You can assign additional permissions to particular web applications by -// adding additional "grant" entries here, based on the code base for that -// application, /WEB-INF/classes/, or /WEB-INF/lib/ jar files. -// -// Different permissions can be granted to JSP pages, classes loaded from -// the /WEB-INF/classes/ directory, all jar files in the /WEB-INF/lib/ -// directory, or even to individual jar files in the /WEB-INF/lib/ directory. -// -// For instance, assume that the standard "examples" application -// included a JDBC driver that needed to establish a network connection to the -// corresponding database and used the scrape taglib to get the weather from -// the NOAA web server. You might create a "grant" entries like this: -// -// The permissions granted to the context root directory apply to JSP pages. -// grant codeBase "file:${catalina.home}/webapps/examples/-" { -// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; -// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; -// }; -// -// The permissions granted to the context WEB-INF/classes directory -// grant codeBase "file:${catalina.home}/webapps/examples/WEB-INF/classes/-" { -// }; -// -// The permission granted to your JDBC driver -// grant codeBase "jar:file:${catalina.home}/webapps/examples/WEB-INF/lib/driver.jar!/-" { -// permission java.net.SocketPermission "dbhost.mycompany.com:5432", "connect"; -// }; -// The permission granted to the scrape taglib -// grant codeBase "jar:file:${catalina.home}/webapps/examples/WEB-INF/lib/scrape.jar!/-" { -// permission java.net.SocketPermission "*.noaa.gov:80", "connect"; -// }; - diff --git a/client/tomcatconf/catalina.properties.in b/client/tomcatconf/catalina.properties.in deleted file mode 100644 index e0baf61261de..000000000000 --- a/client/tomcatconf/catalina.properties.in +++ /dev/null @@ -1,81 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# List of comma-separated packages that start with or equal this string -# will cause a security exception to be thrown when -# passed to checkPackageAccess unless the -# corresponding RuntimePermission ("accessClassInPackage."+package) has -# been granted. -package.access=sun.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper.,sun.beans. -# -# List of comma-separated packages that start with or equal this string -# will cause a security exception to be thrown when -# passed to checkPackageDefinition unless the -# corresponding RuntimePermission ("defineClassInPackage."+package) has -# been granted. -# -# by default, no packages are restricted for definition, and none of -# the class loaders supplied with the JDK call checkPackageDefinition. -# -package.definition=sun.,java.,org.apache.catalina.,org.apache.coyote.,org.apache.tomcat.,org.apache.jasper. - -# -# -# List of comma-separated paths defining the contents of the "common" -# classloader. Prefixes should be used to define what is the repository type. -# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute. -# If left as blank,the JVM system loader will be used as Catalina's "common" -# loader. -# Examples: -# "foo": Add this folder as a class repository -# "foo/*.jar": Add all the JARs of the specified folder as class -# repositories -# "foo/bar.jar": Add bar.jar as a class repository -common.loader=${catalina.base}/lib,${catalina.base}/lib/*.jar,${catalina.home}/lib,${catalina.home}/lib/*.jar,/usr/share/java/mysql-connector-java.jar,/usr/share/cloudstack-mysql-ha/lib/*.jar - -# -# List of comma-separated paths defining the contents of the "server" -# classloader. Prefixes should be used to define what is the repository type. -# Path may be relative to the CATALINA_HOME or CATALINA_BASE path or absolute. -# If left as blank, the "common" loader will be used as Catalina's "server" -# loader. -# Examples: -# "foo": Add this folder as a class repository -# "foo/*.jar": Add all the JARs of the specified folder as class -# repositories -# "foo/bar.jar": Add bar.jar as a class repository -server.loader= - -# -# List of comma-separated paths defining the contents of the "shared" -# classloader. Prefixes should be used to define what is the repository type. -# Path may be relative to the CATALINA_BASE path or absolute. If left as blank, -# the "common" loader will be used as Catalina's "shared" loader. -# Examples: -# "foo": Add this folder as a class repository -# "foo/*.jar": Add all the JARs of the specified folder as class -# repositories -# "foo/bar.jar": Add bar.jar as a class repository -# Please note that for single jars, e.g. bar.jar, you need the URL form -# starting with file:. -shared.loader= - -# -# String cache configuration. -tomcat.util.buf.StringCache.byte.enabled=true -#tomcat.util.buf.StringCache.char.enabled=true -#tomcat.util.buf.StringCache.trainThreshold=500000 -#tomcat.util.buf.StringCache.cacheSize=5000 diff --git a/client/tomcatconf/classpath.conf.in b/client/tomcatconf/classpath.conf.in deleted file mode 100644 index e2c5da49a224..000000000000 --- a/client/tomcatconf/classpath.conf.in +++ /dev/null @@ -1,41 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -SYSTEMJARS="@SYSTEMJARS@" -SCP=$(build-classpath $SYSTEMJARS 2>/dev/null) ; if [ $? != 0 ] ; then export SCP="@SYSTEMCLASSPATH@" ; fi -MCP="@MSCLASSPATH@" -DCP="@DEPSCLASSPATH@" -CLASSPATH=$SCP:$DCP:$MCP:@MSCONF@:@SETUPDATADIR@ -for jarfile in "@PREMIUMJAVADIR@"/* ; do - if [ ! -e "$jarfile" ] ; then continue ; fi - CLASSPATH=$jarfile:$CLASSPATH -done -for plugin in "@PLUGINJAVADIR@"/* ; do - if [ ! -e "$plugin" ] ; then continue ; fi - CLASSPATH=$plugin:$CLASSPATH -done -for vendorconf in "@MSCONF@"/vendor/* ; do - if [ ! -d "$vendorconf" ] ; then continue ; fi - CLASSPATH=$vendorconf:$CLASSPATH -done -export CLASSPATH -if ([ -z "$JAVA_HOME" ] || [ ! -d "$JAVA_HOME" ]) && [ -d /usr/lib/jvm/jre-1.7.0 ]; then - export JAVA_HOME=/usr/lib/jvm/jre-1.7.0 -fi -PATH=$JAVA_HOME/bin:/sbin:/usr/sbin:$PATH -export PATH diff --git a/client/tomcatconf/cloudmanagementserver.keystore b/client/tomcatconf/cloudmanagementserver.keystore deleted file mode 100644 index 3ee4d13565af..000000000000 Binary files a/client/tomcatconf/cloudmanagementserver.keystore and /dev/null differ diff --git a/client/tomcatconf/context.xml.in b/client/tomcatconf/context.xml.in deleted file mode 100644 index a78215c7c215..000000000000 --- a/client/tomcatconf/context.xml.in +++ /dev/null @@ -1,35 +0,0 @@ - - - - - - - WEB-INF/web.xml - - - - - - - - diff --git a/client/tomcatconf/logging.properties.in b/client/tomcatconf/logging.properties.in deleted file mode 100644 index 68be2d7f4573..000000000000 --- a/client/tomcatconf/logging.properties.in +++ /dev/null @@ -1,64 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one or more -# contributor license agreements. See the NOTICE file distributed with -# this work for additional information regarding copyright ownership. -# The ASF licenses this file to You under the Apache License, Version 2.0 -# (the "License"); you may not use this file except in compliance with -# the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -handlers = 1catalina.org.apache.juli.FileHandler, 2localhost.org.apache.juli.FileHandler, 3manager.org.apache.juli.FileHandler, 4host-manager.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler - -.handlers = 1catalina.org.apache.juli.FileHandler, java.util.logging.ConsoleHandler - -############################################################ -# Handler specific properties. -# Describes specific configuration info for Handlers. -############################################################ - -1catalina.org.apache.juli.FileHandler.level = FINE -1catalina.org.apache.juli.FileHandler.directory = ${catalina.base}/logs -1catalina.org.apache.juli.FileHandler.prefix = catalina. - -2localhost.org.apache.juli.FileHandler.level = FINE -2localhost.org.apache.juli.FileHandler.directory = ${catalina.base}/logs -2localhost.org.apache.juli.FileHandler.prefix = localhost. - -3manager.org.apache.juli.FileHandler.level = FINE -3manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs -3manager.org.apache.juli.FileHandler.prefix = manager. - -4host-manager.org.apache.juli.FileHandler.level = FINE -4host-manager.org.apache.juli.FileHandler.directory = ${catalina.base}/logs -4host-manager.org.apache.juli.FileHandler.prefix = host-manager. - -java.util.logging.ConsoleHandler.level = FINE -java.util.logging.ConsoleHandler.formatter = java.util.logging.SimpleFormatter - - -############################################################ -# Facility specific properties. -# Provides extra control for each logger. -############################################################ - -org.apache.catalina.core.ContainerBase.[Catalina].[localhost].level = INFO -org.apache.catalina.core.ContainerBase.[Catalina].[localhost].handlers = 2localhost.org.apache.juli.FileHandler - -org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].level = INFO -org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/manager].handlers = 3manager.org.apache.juli.FileHandler - -org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].level = INFO -org.apache.catalina.core.ContainerBase.[Catalina].[localhost].[/host-manager].handlers = 4host-manager.org.apache.juli.FileHandler - -# For example, set the com.xyz.foo logger to only log SEVERE -# messages: -#org.apache.catalina.startup.ContextConfig.level = FINE -#org.apache.catalina.startup.HostConfig.level = FINE -#org.apache.catalina.session.ManagerBase.level = FINE -#org.apache.catalina.core.AprLifecycleListener.level=FINE diff --git a/client/tomcatconf/server-nonssl.xml.in b/client/tomcatconf/server-nonssl.xml.in deleted file mode 100755 index 4272a28428b4..000000000000 --- a/client/tomcatconf/server-nonssl.xml.in +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/tomcatconf/server-ssl.xml.in b/client/tomcatconf/server-ssl.xml.in deleted file mode 100755 index 595879fbfd10..000000000000 --- a/client/tomcatconf/server-ssl.xml.in +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/tomcatconf/server7-nonssl.xml.in b/client/tomcatconf/server7-nonssl.xml.in deleted file mode 100755 index 6e6a7b28bc95..000000000000 --- a/client/tomcatconf/server7-nonssl.xml.in +++ /dev/null @@ -1,149 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/tomcatconf/server7-ssl.xml.in b/client/tomcatconf/server7-ssl.xml.in deleted file mode 100755 index 2633bcad7601..000000000000 --- a/client/tomcatconf/server7-ssl.xml.in +++ /dev/null @@ -1,157 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/tomcatconf/tomcat-users.xml.in b/client/tomcatconf/tomcat-users.xml.in deleted file mode 100644 index 81422a02892e..000000000000 --- a/client/tomcatconf/tomcat-users.xml.in +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - diff --git a/client/tomcatconf/tomcat6-nonssl.conf.in b/client/tomcatconf/tomcat6-nonssl.conf.in deleted file mode 100644 index 3f08c9066603..000000000000 --- a/client/tomcatconf/tomcat6-nonssl.conf.in +++ /dev/null @@ -1,73 +0,0 @@ -#!/usr/bin/env bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - - -# System-wide configuration file for tomcat6 services -# This will be sourced by tomcat6 and any secondary service -# Values will be overridden by service-specific configuration -# files in /etc/sysconfig -# -# Use this one to change default values for all services -# Change the service specific ones to affect only one service -# (see, for instance, /etc/sysconfig/tomcat6) -# - -# Where your java installation lives -#JAVA_HOME="/usr/lib/jvm/java" - -# Where your tomcat installation lives -CATALINA_BASE="@MSENVIRON@" -CATALINA_HOME="@MSENVIRON@" -JASPER_HOME="@MSENVIRON@" -CATALINA_TMPDIR="@MSENVIRON@/temp" - -# You can pass some parameters to java here if you wish to -#JAVA_OPTS="-Xminf0.1 -Xmaxf0.3" - -# Use JAVA_OPTS to set java.library.path for libtcnative.so -#JAVA_OPTS="-Djava.library.path=/usr/lib64" -JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote=false -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=@MSLOGDIR@ -XX:PermSize=512M -XX:MaxPermSize=800m -Djava.security.properties=/etc/cloudstack/management/java.security.ciphers" - -# What user should run tomcat -TOMCAT_USER="@MSUSER@" -# Do not remove the following line -TOMCAT6_USER="$TOMCAT_USER" - -TOMCAT_LOG="@MSLOGDIR@/catalina.out" - -# You can change your tomcat locale here -#LANG="en_US" - -# Run tomcat under the Java Security Manager -SECURITY_MANAGER="false" - -# Time to wait in seconds, before killing process -SHUTDOWN_WAIT="30" - -# Whether to annoy the user with "attempting to shut down" messages or not -SHUTDOWN_VERBOSE="false" - -# Set the TOMCAT_PID location -CATALINA_PID="@PIDDIR@/@PACKAGE@-management.pid" - -# Connector port is 8080 for this tomcat6 instance -#CONNECTOR_PORT="8080" - -# We pick up the classpath in the next line - -dummy=1 ; . @MSCONF@/classpath.conf diff --git a/client/tomcatconf/tomcat6-ssl.conf.in b/client/tomcatconf/tomcat6-ssl.conf.in deleted file mode 100644 index e7c53ac9f8f4..000000000000 --- a/client/tomcatconf/tomcat6-ssl.conf.in +++ /dev/null @@ -1,72 +0,0 @@ -#!/usr/bin/env bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# System-wide configuration file for tomcat6 services -# This will be sourced by tomcat6 and any secondary service -# Values will be overridden by service-specific configuration -# files in /etc/sysconfig -# -# Use this one to change default values for all services -# Change the service specific ones to affect only one service -# (see, for instance, /etc/sysconfig/tomcat6) -# - -# Where your java installation lives -#JAVA_HOME="/usr/lib/jvm/java" - -# Where your tomcat installation lives -CATALINA_BASE="@MSENVIRON@" -CATALINA_HOME="@MSENVIRON@" -JASPER_HOME="@MSENVIRON@" -CATALINA_TMPDIR="@MSENVIRON@/temp" - -# You can pass some parameters to java here if you wish to -#JAVA_OPTS="-Xminf0.1 -Xmaxf0.3" - -# Use JAVA_OPTS to set java.library.path for libtcnative.so -#JAVA_OPTS="-Djava.library.path=/usr/lib64" -JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote=false -Djavax.net.ssl.trustStore=/etc/cloudstack/management/cloudmanagementserver.keystore -Djavax.net.ssl.trustStorePassword=vmops.com -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=@MSLOGDIR@ -XX:MaxPermSize=800m -XX:PermSize=512M -Djava.security.properties=/etc/cloudstack/management/java.security.ciphers" - -# What user should run tomcat -TOMCAT_USER="@MSUSER@" -# Do not remove the following line -TOMCAT6_USER="$TOMCAT_USER" - -TOMCAT_LOG="@MSLOGDIR@/catalina.out" - -# You can change your tomcat locale here -#LANG="en_US" - -# Run tomcat under the Java Security Manager -SECURITY_MANAGER="false" - -# Time to wait in seconds, before killing process -SHUTDOWN_WAIT="30" - -# Whether to annoy the user with "attempting to shut down" messages or not -SHUTDOWN_VERBOSE="false" - -# Set the TOMCAT_PID location -CATALINA_PID="@PIDDIR@/@PACKAGE@-management.pid" - -# Connector port is 8080 for this tomcat6 instance -#CONNECTOR_PORT="8080" - -# We pick up the classpath in the next line - -dummy=1 ; . @MSCONF@/classpath.conf diff --git a/client/tomcatconf/web.xml.in b/client/tomcatconf/web.xml.in deleted file mode 100644 index 44b6eab07fe4..000000000000 --- a/client/tomcatconf/web.xml.in +++ /dev/null @@ -1,1188 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - org.apache.catalina.servlets.DefaultServlet - - debug - 0 - - - listings - false - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - jsp - org.apache.jasper.servlet.JspServlet - - fork - false - - - xpoweredBy - false - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - / - - - - - - - - jsp - *.jsp - - - - jsp - *.jspx - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 30 - - - - - - - - - - - - abs - audio/x-mpeg - - - ai - application/postscript - - - aif - audio/x-aiff - - - aifc - audio/x-aiff - - - aiff - audio/x-aiff - - - aim - application/x-aim - - - art - image/x-jg - - - asf - video/x-ms-asf - - - asx - video/x-ms-asf - - - au - audio/basic - - - avi - video/x-msvideo - - - avx - video/x-rad-screenplay - - - bcpio - application/x-bcpio - - - bin - application/octet-stream - - - bmp - image/bmp - - - body - text/html - - - cdf - application/x-cdf - - - cer - application/x-x509-ca-cert - - - class - application/java - - - cpio - application/x-cpio - - - csh - application/x-csh - - - css - text/css - - - dib - image/bmp - - - doc - application/msword - - - dtd - application/xml-dtd - - - dv - video/x-dv - - - dvi - application/x-dvi - - - eps - application/postscript - - - etx - text/x-setext - - - exe - application/octet-stream - - - gif - image/gif - - - gtar - application/x-gtar - - - gz - application/x-gzip - - - hdf - application/x-hdf - - - hqx - application/mac-binhex40 - - - htc - text/x-component - - - htm - text/html - - - html - text/html - - - hqx - application/mac-binhex40 - - - ief - image/ief - - - jad - text/vnd.sun.j2me.app-descriptor - - - jar - application/java-archive - - - java - text/plain - - - jnlp - application/x-java-jnlp-file - - - jpe - image/jpeg - - - jpeg - image/jpeg - - - jpg - image/jpeg - - - js - text/javascript - - - jsf - text/plain - - - jspf - text/plain - - - kar - audio/x-midi - - - latex - application/x-latex - - - m3u - audio/x-mpegurl - - - mac - image/x-macpaint - - - man - application/x-troff-man - - - mathml - application/mathml+xml - - - me - application/x-troff-me - - - mid - audio/x-midi - - - midi - audio/x-midi - - - mif - application/x-mif - - - mov - video/quicktime - - - movie - video/x-sgi-movie - - - mp1 - audio/x-mpeg - - - mp2 - audio/x-mpeg - - - mp3 - audio/x-mpeg - - - mp4 - video/mp4 - - - mpa - audio/x-mpeg - - - mpe - video/mpeg - - - mpeg - video/mpeg - - - mpega - audio/x-mpeg - - - mpg - video/mpeg - - - mpv2 - video/mpeg2 - - - ms - application/x-wais-source - - - nc - application/x-netcdf - - - oda - application/oda - - - - odb - application/vnd.oasis.opendocument.database - - - - odc - application/vnd.oasis.opendocument.chart - - - - odf - application/vnd.oasis.opendocument.formula - - - - odg - application/vnd.oasis.opendocument.graphics - - - - odi - application/vnd.oasis.opendocument.image - - - - odm - application/vnd.oasis.opendocument.text-master - - - - odp - application/vnd.oasis.opendocument.presentation - - - - ods - application/vnd.oasis.opendocument.spreadsheet - - - - odt - application/vnd.oasis.opendocument.text - - - ogg - application/ogg - - - - otg - application/vnd.oasis.opendocument.graphics-template - - - - oth - application/vnd.oasis.opendocument.text-web - - - - otp - application/vnd.oasis.opendocument.presentation-template - - - - ots - application/vnd.oasis.opendocument.spreadsheet-template - - - - ott - application/vnd.oasis.opendocument.text-template - - - pbm - image/x-portable-bitmap - - - pct - image/pict - - - pdf - application/pdf - - - pgm - image/x-portable-graymap - - - pic - image/pict - - - pict - image/pict - - - pls - audio/x-scpls - - - png - image/png - - - pnm - image/x-portable-anymap - - - pnt - image/x-macpaint - - - ppm - image/x-portable-pixmap - - - ppt - application/vnd.ms-powerpoint - - - pps - application/vnd.ms-powerpoint - - - ps - application/postscript - - - psd - image/x-photoshop - - - qt - video/quicktime - - - qti - image/x-quicktime - - - qtif - image/x-quicktime - - - ras - image/x-cmu-raster - - - rdf - application/rdf+xml - - - rgb - image/x-rgb - - - rm - application/vnd.rn-realmedia - - - roff - application/x-troff - - - rtf - application/rtf - - - rtx - text/richtext - - - sh - application/x-sh - - - shar - application/x-shar - - - - smf - audio/x-midi - - - sit - application/x-stuffit - - - snd - audio/basic - - - src - application/x-wais-source - - - sv4cpio - application/x-sv4cpio - - - sv4crc - application/x-sv4crc - - - svg - image/svg+xml - - - svgz - image/svg+xml - - - swf - application/x-shockwave-flash - - - t - application/x-troff - - - tar - application/x-tar - - - tcl - application/x-tcl - - - tex - application/x-tex - - - texi - application/x-texinfo - - - texinfo - application/x-texinfo - - - tif - image/tiff - - - tiff - image/tiff - - - tr - application/x-troff - - - tsv - text/tab-separated-values - - - txt - text/plain - - - ulw - audio/basic - - - ustar - application/x-ustar - - - vxml - application/voicexml+xml - - - xbm - image/x-xbitmap - - - xht - application/xhtml+xml - - - xhtml - application/xhtml+xml - - - xls - application/vnd.ms-excel - - - xml - application/xml - - - xpm - image/x-xpixmap - - - xsl - application/xml - - - xslt - application/xslt+xml - - - xul - application/vnd.mozilla.xul+xml - - - xwd - image/x-xwindowdump - - - vsd - application/x-visio - - - wav - audio/x-wav - - - - wbmp - image/vnd.wap.wbmp - - - - wml - text/vnd.wap.wml - - - - wmlc - application/vnd.wap.wmlc - - - - wmls - text/vnd.wap.wmlscript - - - - wmlscriptc - application/vnd.wap.wmlscriptc - - - wmv - video/x-ms-wmv - - - wrl - x-world/x-vrml - - - wspolicy - application/wspolicy+xml - - - Z - application/x-compress - - - z - application/x-compress - - - zip - application/zip - - - - - - - - - - - - - - - - index.html - index.htm - index.jsp - - - diff --git a/core/pom.xml b/core/pom.xml index d15ad891ab81..acce153fceea 100644 --- a/core/pom.xml +++ b/core/pom.xml @@ -25,7 +25,7 @@ org.apache.cloudstack cloudstack - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT @@ -50,7 +50,7 @@ org.apache.commons commons-compress - 1.10 + 1.15 diff --git a/core/resources/META-INF/cloudstack/allocator/spring-core-allocator-context.xml b/core/resources/META-INF/cloudstack/allocator/spring-core-allocator-context.xml index 700b9060d501..0e00fda4af09 100644 --- a/core/resources/META-INF/cloudstack/allocator/spring-core-allocator-context.xml +++ b/core/resources/META-INF/cloudstack/allocator/spring-core-allocator-context.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/allocator/spring-core-lifecycle-allocator-context-inheritable.xml b/core/resources/META-INF/cloudstack/allocator/spring-core-lifecycle-allocator-context-inheritable.xml index e6ed961bbd42..cd98a636706f 100644 --- a/core/resources/META-INF/cloudstack/allocator/spring-core-lifecycle-allocator-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/allocator/spring-core-lifecycle-allocator-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/api/spring-core-lifecycle-api-context-inheritable.xml b/core/resources/META-INF/cloudstack/api/spring-core-lifecycle-api-context-inheritable.xml index 1a33fa21f53f..7ab5523732d1 100644 --- a/core/resources/META-INF/cloudstack/api/spring-core-lifecycle-api-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/api/spring-core-lifecycle-api-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context-inheritable.xml b/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context-inheritable.xml index 84c301caeb45..62826c8cc771 100644 --- a/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context.xml b/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context.xml index 7a586a24c0a2..6e78e2ece92a 100644 --- a/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context.xml +++ b/core/resources/META-INF/cloudstack/bootstrap/spring-bootstrap-context.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/tools/devcloud/src/deps/boxes/xenbox-build/puppet/modules/devcloudinitial/files/xen-defaults b/core/resources/META-INF/cloudstack/ca/module.properties similarity index 96% rename from tools/devcloud/src/deps/boxes/xenbox-build/puppet/modules/devcloudinitial/files/xen-defaults rename to core/resources/META-INF/cloudstack/ca/module.properties index 908396812fbd..1a6915aea90e 100644 --- a/tools/devcloud/src/deps/boxes/xenbox-build/puppet/modules/devcloudinitial/files/xen-defaults +++ b/core/resources/META-INF/cloudstack/ca/module.properties @@ -1,3 +1,4 @@ +# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -14,5 +15,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +# -TOOLSTACK=xapi +name=ca +parent=backend diff --git a/core/resources/META-INF/cloudstack/ca/spring-core-lifecycle-ca-context-inheritable.xml b/core/resources/META-INF/cloudstack/ca/spring-core-lifecycle-ca-context-inheritable.xml new file mode 100644 index 000000000000..1566a4b076b9 --- /dev/null +++ b/core/resources/META-INF/cloudstack/ca/spring-core-lifecycle-ca-context-inheritable.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/core/resources/META-INF/cloudstack/compute/spring-core-lifecycle-compute-context-inheritable.xml b/core/resources/META-INF/cloudstack/compute/spring-core-lifecycle-compute-context-inheritable.xml index f757e7ed0953..fb0e8780ecc7 100644 --- a/core/resources/META-INF/cloudstack/compute/spring-core-lifecycle-compute-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/compute/spring-core-lifecycle-compute-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > @@ -44,4 +44,9 @@ + + + + + diff --git a/core/resources/META-INF/cloudstack/core/spring-core-context.xml b/core/resources/META-INF/cloudstack/core/spring-core-context.xml index 242f72c12726..d6f7187db83c 100644 --- a/core/resources/META-INF/cloudstack/core/spring-core-context.xml +++ b/core/resources/META-INF/cloudstack/core/spring-core-context.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/core/spring-core-lifecycle-core-context-inheritable.xml b/core/resources/META-INF/cloudstack/core/spring-core-lifecycle-core-context-inheritable.xml index 515249dcb6e5..b754d6bfe621 100644 --- a/core/resources/META-INF/cloudstack/core/spring-core-lifecycle-core-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/core/spring-core-lifecycle-core-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml index d36f98d40405..1f70e5261473 100644 --- a/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml +++ b/core/resources/META-INF/cloudstack/core/spring-core-registry-core-context.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > - @@ -145,7 +144,6 @@ - @@ -250,7 +248,7 @@ class="org.apache.cloudstack.spring.lifecycle.registry.ExtensionRegistry"> + value="HostAntiAffinityProcessor,ExplicitDedicationProcessor,HostAffinityProcessor" /> @@ -307,9 +305,22 @@ + + + + + + + + + + diff --git a/packaging/centos63/tomcat.sh b/core/resources/META-INF/cloudstack/direct-download/module.properties similarity index 95% rename from packaging/centos63/tomcat.sh rename to core/resources/META-INF/cloudstack/direct-download/module.properties index 0908da4696e3..63e1a8b604f4 100644 --- a/packaging/centos63/tomcat.sh +++ b/core/resources/META-INF/cloudstack/direct-download/module.properties @@ -1,3 +1,4 @@ +# # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file # distributed with this work for additional information @@ -14,5 +15,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. +# -. /etc/rc.d/init.d/tomcat6 start +name=direct-download +parent=backend \ No newline at end of file diff --git a/core/resources/META-INF/cloudstack/direct-download/spring-lifecycle-direct-download-context-inheritable.xml b/core/resources/META-INF/cloudstack/direct-download/spring-lifecycle-direct-download-context-inheritable.xml new file mode 100644 index 000000000000..052a86b48118 --- /dev/null +++ b/core/resources/META-INF/cloudstack/direct-download/spring-lifecycle-direct-download-context-inheritable.xml @@ -0,0 +1,32 @@ + + + + + + + + + diff --git a/core/resources/META-INF/cloudstack/discoverer/spring-core-lifecycle-discoverer-context-inheritable.xml b/core/resources/META-INF/cloudstack/discoverer/spring-core-lifecycle-discoverer-context-inheritable.xml index 640d17e98ebf..1a0e6793d2bb 100644 --- a/core/resources/META-INF/cloudstack/discoverer/spring-core-lifecycle-discoverer-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/discoverer/spring-core-lifecycle-discoverer-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml b/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml index 1986777f2db2..8dbaf6105811 100644 --- a/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/network/spring-core-lifecycle-network-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/outofbandmanagement/spring-core-lifecycle-outofbandmanagement-context-inheritable.xml b/core/resources/META-INF/cloudstack/outofbandmanagement/spring-core-lifecycle-outofbandmanagement-context-inheritable.xml index 6a25a2e349fd..3a21e729e94b 100644 --- a/core/resources/META-INF/cloudstack/outofbandmanagement/spring-core-lifecycle-outofbandmanagement-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/outofbandmanagement/spring-core-lifecycle-outofbandmanagement-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml b/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml index 2548308f21e2..51da6626d59c 100644 --- a/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/planner/spring-core-lifecycle-planner-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml b/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml index 7b86e935ab2d..2771dfe415f8 100644 --- a/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/storage/spring-lifecycle-storage-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/core/resources/META-INF/cloudstack/system/spring-core-system-context-inheritable.xml b/core/resources/META-INF/cloudstack/system/spring-core-system-context-inheritable.xml index 2d454acdd7ed..4a59e95de35e 100644 --- a/core/resources/META-INF/cloudstack/system/spring-core-system-context-inheritable.xml +++ b/core/resources/META-INF/cloudstack/system/spring-core-system-context-inheritable.xml @@ -23,10 +23,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml b/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml index fd5299c8f70f..3ded395bb66f 100644 --- a/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml +++ b/engine/orchestration/resources/META-INF/cloudstack/core/spring-engine-orchestration-core-context.xml @@ -23,13 +23,13 @@ xmlns:util="http://www.springframework.org/schema/util" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd + http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/util - http://www.springframework.org/schema/util/spring-util-3.0.xsd" + http://www.springframework.org/schema/util/spring-util.xsd" > + diff --git a/engine/orchestration/src/com/cloud/agent/manager/AgentAttache.java b/engine/orchestration/src/com/cloud/agent/manager/AgentAttache.java index d5ec90098383..a3838e1e6efe 100644 --- a/engine/orchestration/src/com/cloud/agent/manager/AgentAttache.java +++ b/engine/orchestration/src/com/cloud/agent/manager/AgentAttache.java @@ -31,6 +31,7 @@ import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import com.cloud.agent.api.ModifySshKeysCommand; import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.log4j.Logger; @@ -114,7 +115,7 @@ public int compare(final Object o1, final Object o2) { StopCommand.class.toString(), CheckVirtualMachineCommand.class.toString(), PingTestCommand.class.toString(), CheckHealthCommand.class.toString(), ReadyCommand.class.toString(), ShutdownCommand.class.toString(), SetupCommand.class.toString(), CleanupNetworkRulesCmd.class.toString(), CheckNetworkCommand.class.toString(), PvlanSetupCommand.class.toString(), CheckOnHostCommand.class.toString(), - ModifyTargetsCommand.class.toString() }; + ModifyTargetsCommand.class.toString(), ModifySshKeysCommand.class.toString()}; protected final static String[] s_commandsNotAllowedInConnectingMode = new String[] { StartCommand.class.toString(), CreateCommand.class.toString() }; static { Arrays.sort(s_commandsAllowedInMaintenanceMode); diff --git a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java index ba90ede0f1d8..9626385c0fd1 100644 --- a/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java +++ b/engine/orchestration/src/com/cloud/agent/manager/AgentManagerImpl.java @@ -20,6 +20,7 @@ import java.lang.reflect.InvocationTargetException; import java.nio.channels.ClosedChannelException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; @@ -37,6 +38,9 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.cloudstack.agent.lb.IndirectAgentLB; +import org.apache.cloudstack.ca.CAManager; +import com.cloud.configuration.ManagementServiceConfiguration; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -114,6 +118,7 @@ import com.cloud.utils.nio.NioServer; import com.cloud.utils.nio.Task; import com.cloud.utils.time.InaccurateClock; +import com.google.common.base.Strings; /** * Implementation of the Agent Manager. This class controls the connection to the agents. @@ -134,6 +139,8 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl protected int _monitorId = 0; private final Lock _agentStatusLock = new ReentrantLock(); + @Inject + protected CAManager caService; @Inject protected EntityManager _entityMgr; @@ -159,6 +166,9 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl @Inject protected HypervisorGuruManager _hvGuruMgr; + @Inject + protected IndirectAgentLB indirectAgentLB; + protected int _retry = 2; protected long _nodeId = -1; @@ -177,13 +187,12 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl @Inject ResourceManager _resourceMgr; + @Inject + ManagementServiceConfiguration mgmtServiceConf; + protected final ConfigKey Workers = new ConfigKey("Advanced", Integer.class, "workers", "5", "Number of worker threads handling remote agent connections.", false); protected final ConfigKey Port = new ConfigKey("Advanced", Integer.class, "port", "8250", "Port to listen on for remote agent connections.", false); - protected final ConfigKey PingInterval = new ConfigKey("Advanced", Integer.class, "ping.interval", "60", - "Interval to send application level pings to make sure the connection is still working", false); - protected final ConfigKey PingTimeout = new ConfigKey("Advanced", Float.class, "ping.timeout", "2.5", - "Multiplier to ping.interval before announcing an agent has timed out", true); protected final ConfigKey AlertWait = new ConfigKey("Advanced", Integer.class, "alert.wait", "1800", "Seconds to wait before alerting on a disconnected agent", true); protected final ConfigKey DirectAgentLoadSize = new ConfigKey("Advanced", Integer.class, "direct.agent.load.size", "16", @@ -203,14 +212,14 @@ public class AgentManagerImpl extends ManagerBase implements AgentManager, Handl @Override public boolean configure(final String name, final Map params) throws ConfigurationException { - s_logger.info("Ping Timeout is " + PingTimeout.value()); + s_logger.info("Ping Timeout is " + mgmtServiceConf.getPingTimeout()); final int threads = DirectAgentLoadSize.value(); _nodeId = ManagementServerNode.getManagementServerId(); s_logger.info("Configuring AgentManagerImpl. management server node id(msid): " + _nodeId); - final long lastPing = (System.currentTimeMillis() >> 10) - (long) (PingTimeout.value() * PingInterval.value()); + final long lastPing = (System.currentTimeMillis() >> 10) - mgmtServiceConf.getTimeout(); _hostDao.markHostsAsDisconnected(_nodeId, lastPing); registerForHostEvents(new BehindOnPingListener(), true, true, false); @@ -223,7 +232,7 @@ public boolean configure(final String name, final Map params) th // allow core threads to time out even when there are no items in the queue _connectExecutor.allowCoreThreadTimeOut(true); - _connection = new NioServer("AgentManager", Port.value(), Workers.value() + 10, this); + _connection = new NioServer("AgentManager", Port.value(), Workers.value() + 10, this, caService); s_logger.info("Listening on " + Port.value() + " with " + Workers.value() + " workers"); // executes all agent commands other than cron and ping @@ -238,9 +247,6 @@ public boolean configure(final String name, final Map params) th return true; } - protected long getTimeout() { - return (long) (PingTimeout.value() * PingInterval.value()); - } @Override public Task create(final Task.Type type, final Link link, final byte[] data) { @@ -355,10 +361,6 @@ public Answer sendTo(final Long dcId, final HypervisorType type, final Command c return null; } - protected int getPingInterval() { - return PingInterval.value(); - } - @Override public Answer send(final Long hostId, final Command cmd) throws AgentUnavailableException, OperationTimedoutException { final Commands cmds = new Commands(Command.OnError.Stop); @@ -449,6 +451,7 @@ public Answer[] send(final Long hostId, final Commands commands, int timeout) th final Command[] cmds = checkForCommandsAndTag(commands); + //check what agent is returned. final AgentAttache agent = getAttache(hostId); if (agent == null || agent.isClosed()) { throw new AgentUnavailableException("agent not logged into this management server", hostId); @@ -619,7 +622,7 @@ public boolean start() { } } - _monitorExecutor.scheduleWithFixedDelay(new MonitorTask(), PingInterval.value(), PingInterval.value(), TimeUnit.SECONDS); + _monitorExecutor.scheduleWithFixedDelay(new MonitorTask(), mgmtServiceConf.getPingInterval(), mgmtServiceConf.getPingInterval(), TimeUnit.SECONDS); return true; } @@ -812,6 +815,7 @@ protected boolean handleDisconnectWithoutInvestigation(final AgentAttache attach s_logger.debug("The next status of agent " + hostId + "is " + nextStatus + ", current status is " + currentStatus); } } + caService.purgeHostCertificate(host); } if (s_logger.isDebugEnabled()) { @@ -1083,14 +1087,31 @@ private AgentAttache handleConnectedAgent(final Link link, final StartupCommand[ AgentAttache attache = null; ReadyCommand ready = null; try { + final List agentMSHostList = new ArrayList<>(); + if (startup != null && startup.length > 0) { + final String agentMSHosts = startup[0].getMsHostList(); + if (!Strings.isNullOrEmpty(agentMSHosts)) { + agentMSHostList.addAll(Arrays.asList(agentMSHosts.split(","))); + } + } + final HostVO host = _resourceMgr.createHostVOForConnectedAgent(startup); if (host != null) { ready = new ReadyCommand(host.getDataCenterId(), host.getId()); + + if (!indirectAgentLB.compareManagementServerList(host.getId(), host.getDataCenterId(), agentMSHostList)) { + final List newMSList = indirectAgentLB.getManagementServerList(host.getId(), host.getDataCenterId(), null); + ready.setMsHostList(newMSList); + ready.setLbAlgorithm(indirectAgentLB.getLBAlgorithmName()); + ready.setLbCheckInterval(indirectAgentLB.getLBPreferredHostCheckInterval(host.getClusterId())); + s_logger.debug("Agent's management server host list is not up to date, sending list update:" + newMSList); + } + attache = createAttacheForConnect(host, link); attache = notifyMonitorsOfConnection(attache, startup, false); } } catch (final Exception e) { - s_logger.debug("Failed to handle host connection: " + e.toString()); + s_logger.debug("Failed to handle host connection: ", e); ready = new ReadyCommand(null); ready.setDetails(e.toString()); } finally { @@ -1187,7 +1208,7 @@ protected void connectAgent(final Link link, final Command[] cmds, final Request cmd = cmds[i]; if (cmd instanceof StartupRoutingCommand || cmd instanceof StartupProxyCommand || cmd instanceof StartupSecondaryStorageCommand || cmd instanceof StartupStorageCommand) { - answers[i] = new StartupAnswer((StartupCommand) cmds[i], 0, getPingInterval()); + answers[i] = new StartupAnswer((StartupCommand) cmds[i], 0, mgmtServiceConf.getPingInterval()); break; } } @@ -1234,9 +1255,9 @@ protected void processRequest(final Link link, final Request request) { } else if (cmd instanceof PingCommand) { logD = false; s_logger.debug("Ping from " + hostId + "(" + hostName + ")"); - s_logger.trace("SeqA " + attache.getId() + "-" + request.getSequence() + ": Processing " + request); + s_logger.trace("SeqA " + hostId + "-" + request.getSequence() + ": Processing " + request); } else { - s_logger.debug("SeqA " + attache.getId() + "-" + request.getSequence() + ": Processing " + request); + s_logger.debug("SeqA " + hostId + "-" + request.getSequence() + ": Processing " + request); } } @@ -1247,16 +1268,16 @@ protected void processRequest(final Link link, final Request request) { try { if (cmd instanceof StartupRoutingCommand) { final StartupRoutingCommand startup = (StartupRoutingCommand) cmd; - answer = new StartupAnswer(startup, attache.getId(), getPingInterval()); + answer = new StartupAnswer(startup, attache.getId(), mgmtServiceConf.getPingInterval()); } else if (cmd instanceof StartupProxyCommand) { final StartupProxyCommand startup = (StartupProxyCommand) cmd; - answer = new StartupAnswer(startup, attache.getId(), getPingInterval()); + answer = new StartupAnswer(startup, attache.getId(), mgmtServiceConf.getPingInterval()); } else if (cmd instanceof StartupSecondaryStorageCommand) { final StartupSecondaryStorageCommand startup = (StartupSecondaryStorageCommand) cmd; - answer = new StartupAnswer(startup, attache.getId(), getPingInterval()); + answer = new StartupAnswer(startup, attache.getId(), mgmtServiceConf.getPingInterval()); } else if (cmd instanceof StartupStorageCommand) { final StartupStorageCommand startup = (StartupStorageCommand) cmd; - answer = new StartupAnswer(startup, attache.getId(), getPingInterval()); + answer = new StartupAnswer(startup, attache.getId(), mgmtServiceConf.getPingInterval()); } else if (cmd instanceof ShutdownCommand) { final ShutdownCommand shutdown = (ShutdownCommand) cmd; final String reason = shutdown.getReason(); @@ -1510,7 +1531,7 @@ public boolean handleDirectConnectAgent(final Host host, final StartupCommand[] attache = createAttacheForDirectConnect(host, resource); final StartupAnswer[] answers = new StartupAnswer[cmds.length]; for (int i = 0; i < answers.length; i++) { - answers[i] = new StartupAnswer(cmds[i], attache.getId(), PingInterval.value()); + answers[i] = new StartupAnswer(cmds[i], attache.getId(), mgmtServiceConf.getPingInterval()); } attache.process(answers); @@ -1620,7 +1641,7 @@ protected void runInContext() { protected List findAgentsBehindOnPing() { final List agentsBehind = new ArrayList(); - final long cutoffTime = InaccurateClock.getTimeInSeconds() - getTimeout(); + final long cutoffTime = InaccurateClock.getTimeInSeconds() - mgmtServiceConf.getTimeout(); for (final Map.Entry entry : _pingMap.entrySet()) { if (entry.getValue() < cutoffTime) { agentsBehind.add(entry.getKey()); @@ -1709,7 +1730,7 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] { CheckTxnBeforeSending, Workers, Port, PingInterval, PingTimeout, Wait, AlertWait, DirectAgentLoadSize, DirectAgentPoolSize, + return new ConfigKey[] { CheckTxnBeforeSending, Workers, Port, Wait, AlertWait, DirectAgentLoadSize, DirectAgentPoolSize, DirectAgentThreadCap }; } diff --git a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 9239adc0911f..7a9678e6a4ae 100644 --- a/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/engine/orchestration/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -42,6 +42,7 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; +import org.apache.cloudstack.ca.CAManager; import org.apache.cloudstack.framework.config.ConfigDepot; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -49,6 +50,8 @@ import org.apache.cloudstack.managed.context.ManagedContextTimerTask; import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.cloudstack.utils.security.SSLUtils; +import org.apache.cloudstack.ha.dao.HAConfigDao; +import org.apache.cloudstack.outofbandmanagement.dao.OutOfBandManagementDao; import org.apache.log4j.Logger; import com.cloud.agent.api.Answer; @@ -120,6 +123,12 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust ConfigurationDao _configDao; @Inject ConfigDepot _configDepot; + @Inject + private OutOfBandManagementDao outOfBandManagementDao; + @Inject + private HAConfigDao haConfigDao; + @Inject + private CAManager caService; protected ClusteredAgentManagerImpl() { super(); @@ -164,6 +173,7 @@ public boolean start() { // Schedule tasks for agent rebalancing if (isAgentRebalanceEnabled()) { + cleanupTransferMap(_nodeId); s_transferExecutor.scheduleAtFixedRate(getAgentRebalanceScanTask(), 60000, 60000, TimeUnit.MILLISECONDS); s_transferExecutor.scheduleAtFixedRate(getTransferScanTask(), 60000, ClusteredAgentRebalanceService.DEFAULT_TRANSFER_CHECK_INTERVAL, TimeUnit.MILLISECONDS); } @@ -188,7 +198,7 @@ private void scanDirectAgentToLoad() { } // for agents that are self-managed, threshold to be considered as disconnected after pingtimeout - final long cutSeconds = (System.currentTimeMillis() >> 10) - getTimeout(); + final long cutSeconds = (System.currentTimeMillis() >> 10) - mgmtServiceConf.getTimeout(); final List hosts = _hostDao.findAndUpdateDirectAgentToLoad(cutSeconds, LoadSize.value().longValue(), _nodeId); final List appliances = _hostDao.findAndUpdateApplianceToLoad(cutSeconds, _nodeId); @@ -491,6 +501,7 @@ public SocketChannel connectToPeer(final String peerName, final SocketChannel pr } final String ip = ms.getServiceIP(); InetAddress addr; + int port = Port.value(); try { addr = InetAddress.getByName(ip); } catch (final UnknownHostException e) { @@ -498,21 +509,21 @@ public SocketChannel connectToPeer(final String peerName, final SocketChannel pr } SocketChannel ch1 = null; try { - ch1 = SocketChannel.open(new InetSocketAddress(addr, Port.value())); + ch1 = SocketChannel.open(new InetSocketAddress(addr, port)); ch1.configureBlocking(false); ch1.socket().setKeepAlive(true); ch1.socket().setSoTimeout(60 * 1000); try { - final SSLContext sslContext = Link.initSSLContext(true); - sslEngine = sslContext.createSSLEngine(ip, Port.value()); + SSLContext sslContext = Link.initManagementSSLContext(caService); + sslEngine = sslContext.createSSLEngine(ip, port); sslEngine.setUseClientMode(true); sslEngine.setEnabledProtocols(SSLUtils.getSupportedProtocols(sslEngine.getEnabledProtocols())); sslEngine.beginHandshake(); - if (!Link.doHandshake(ch1, sslEngine, true)) { + if (!Link.doHandshake(ch1, sslEngine)) { ch1.close(); - throw new IOException("SSL handshake failed!"); + throw new IOException(String.format("SSL: Handshake failed with peer management server '%s' on %s:%d ", peerName, ip, port)); } - s_logger.info("SSL: Handshake done"); + s_logger.info(String.format("SSL: Handshake done with peer management server '%s' on %s:%d ", peerName, ip, port)); } catch (final Exception e) { ch1.close(); throw new IOException("SSL: Fail to init SSL! " + e); @@ -524,10 +535,12 @@ public SocketChannel connectToPeer(final String peerName, final SocketChannel pr _sslEngines.put(peerName, sslEngine); return ch1; } catch (final IOException e) { - try { - ch1.close(); - } catch (final IOException ex) { - s_logger.error("failed to close failed peer socket: " + ex); + if (ch1 != null) { + try { + ch1.close(); + } catch (final IOException ex) { + s_logger.error("failed to close failed peer socket: " + ex); + } } s_logger.warn("Unable to connect to peer management server: " + peerName + ", ip: " + ip + " due to " + e.getMessage(), e); return null; @@ -734,9 +747,10 @@ public void onManagementNodeJoined(final List no public void onManagementNodeLeft(final List nodeList, final long selfNodeId) { for (final ManagementServerHost vo : nodeList) { s_logger.info("Marking hosts as disconnected on Management server" + vo.getMsid()); - final long lastPing = (System.currentTimeMillis() >> 10) - getTimeout(); + final long lastPing = (System.currentTimeMillis() >> 10) - mgmtServiceConf.getTimeout(); _hostDao.markHostsAsDisconnected(vo.getMsid(), lastPing); - outOfBandManagementDao.expireOutOfBandManagementOwnershipByServer(vo.getMsid()); + outOfBandManagementDao.expireServerOwnership(vo.getMsid()); + haConfigDao.expireServerOwnership(vo.getMsid()); s_logger.info("Deleting entries from op_host_transfer table for Management server " + vo.getMsid()); cleanupTransferMap(vo.getMsid()); } diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java old mode 100644 new mode 100755 index f5bdf38740fa..6f2ae852e124 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -22,12 +22,14 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.Executors; @@ -37,14 +39,18 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.agent.api.AttachOrDettachConfigDriveCommand; +import org.apache.commons.collections.CollectionUtils; +import org.apache.log4j.Logger; + import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; +import org.apache.cloudstack.ca.CAManager; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; +import org.apache.cloudstack.framework.ca.Certificate; import org.apache.cloudstack.framework.config.ConfigDepot; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.Configurable; @@ -55,6 +61,7 @@ import org.apache.cloudstack.framework.jobs.Outcome; import org.apache.cloudstack.framework.jobs.dao.VmWorkJobDao; import org.apache.cloudstack.framework.jobs.impl.AsyncJobVO; +import org.apache.cloudstack.framework.jobs.impl.JobSerializerHelper; import org.apache.cloudstack.framework.jobs.impl.OutcomeImpl; import org.apache.cloudstack.framework.jobs.impl.VmWorkJobVO; import org.apache.cloudstack.framework.messagebus.MessageBus; @@ -66,25 +73,30 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.cloudstack.utils.identity.ManagementServerNode; -import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; import com.cloud.agent.api.AgentControlAnswer; import com.cloud.agent.api.AgentControlCommand; import com.cloud.agent.api.Answer; +import com.cloud.agent.api.AttachOrDettachConfigDriveCommand; import com.cloud.agent.api.CheckVirtualMachineAnswer; import com.cloud.agent.api.CheckVirtualMachineCommand; import com.cloud.agent.api.ClusterVMMetaDataSyncAnswer; import com.cloud.agent.api.ClusterVMMetaDataSyncCommand; import com.cloud.agent.api.Command; import com.cloud.agent.api.MigrateCommand; +import com.cloud.agent.api.ModifyTargetsCommand; import com.cloud.agent.api.PingRoutingCommand; import com.cloud.agent.api.PlugNicAnswer; import com.cloud.agent.api.PlugNicCommand; import com.cloud.agent.api.PrepareForMigrationCommand; import com.cloud.agent.api.RebootAnswer; import com.cloud.agent.api.RebootCommand; +import com.cloud.agent.api.ReplugNicAnswer; +import com.cloud.agent.api.ReplugNicCommand; +import com.cloud.agent.api.RestoreVMSnapshotAnswer; +import com.cloud.agent.api.RestoreVMSnapshotCommand; import com.cloud.agent.api.ScaleVmCommand; import com.cloud.agent.api.StartAnswer; import com.cloud.agent.api.StartCommand; @@ -95,6 +107,7 @@ import com.cloud.agent.api.UnPlugNicAnswer; import com.cloud.agent.api.UnPlugNicCommand; import com.cloud.agent.api.UnregisterVMCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.to.DiskTO; import com.cloud.agent.api.to.GPUDeviceTO; import com.cloud.agent.api.to.NicTO; @@ -103,6 +116,7 @@ import com.cloud.agent.manager.allocator.HostAllocator; import com.cloud.alert.AlertManager; import com.cloud.capacity.CapacityManager; +import com.cloud.configuration.Config; import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; import com.cloud.dc.DataCenter; @@ -149,16 +163,19 @@ import com.cloud.network.dao.NetworkVO; import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.RulesManager; +import com.cloud.offering.DiskOffering; import com.cloud.offering.DiskOfferingInfo; import com.cloud.offering.ServiceOffering; import com.cloud.org.Cluster; import com.cloud.resource.ResourceManager; +import com.cloud.resource.ResourceState; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.ScopeType; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StoragePool; +import com.cloud.storage.VMTemplateVO; import com.cloud.storage.Volume; import com.cloud.storage.Volume.Type; import com.cloud.storage.VolumeVO; @@ -201,7 +218,9 @@ import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; import com.cloud.vm.snapshot.VMSnapshotManager; +import com.cloud.vm.snapshot.VMSnapshotVO; import com.cloud.vm.snapshot.dao.VMSnapshotDao; +import com.google.common.base.Strings; public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMachineManager, VmWorkJobHandler, Listener, Configurable { private static final Logger s_logger = Logger.getLogger(VirtualMachineManagerImpl.class); @@ -233,6 +252,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Inject protected UserVmDao _userVmDao; @Inject + protected UserVmService _userVmService; + @Inject protected CapacityManager _capacityMgr; @Inject protected NicDao _nicsDao; @@ -279,7 +300,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Inject protected UserVmDetailsDao _vmDetailsDao; @Inject - ServiceOfferingDao _serviceOfferingDao = null; + protected ServiceOfferingDao _serviceOfferingDao = null; + @Inject + protected CAManager caManager; @Inject ConfigDepot _configDepot; @@ -359,6 +382,9 @@ public void setHostAllocators(final List hostAllocators) { Integer.class, "vm.job.report.interval", "60", "Interval to send application level pings to make sure the connection is still working", false); + static final ConfigKey HaVmRestartHostUp = new ConfigKey("Advanced", Boolean.class, "ha.vm.restart.hostup", "true", + "If an out-of-band stop of a VM is detected and its host is up, then power on the VM", true); + ScheduledExecutorService _executor = null; protected long _nodeId; @@ -374,7 +400,7 @@ public void registerGuru(final VirtualMachine.Type type, final VirtualMachineGur @DB public void allocate(final String vmInstanceName, final VirtualMachineTemplate template, final ServiceOffering serviceOffering, final DiskOfferingInfo rootDiskOfferingInfo, final List dataDiskOfferings, - final LinkedHashMap> auxiliaryNetworks, final DeploymentPlan plan, final HypervisorType hyperType) + final LinkedHashMap> auxiliaryNetworks, final DeploymentPlan plan, final HypervisorType hyperType, final Map> extraDhcpOptions, final Map datadiskTemplateToDiskOfferingMap) throws InsufficientCapacityException { final VMInstanceVO vm = _vmDao.findVMByInstanceName(vmInstanceName); @@ -401,7 +427,8 @@ public void doInTransactionWithoutResult(final TransactionStatus status) throws } try { - _networkMgr.allocate(vmProfile, auxiliaryNetworks); + if (!vmProfile.getBootArgs().contains("ExternalLoadBalancerVm")) + _networkMgr.allocate(vmProfile, auxiliaryNetworks, extraDhcpOptions); } catch (final ConcurrentOperationException e) { throw new CloudRuntimeException("Concurrent operation while trying to allocate resources for the VM", e); } @@ -412,7 +439,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) throws if (template.getFormat() == ImageFormat.ISO) { volumeMgr.allocateRawVolume(Type.ROOT, "ROOT-" + vmFinal.getId(), rootDiskOfferingInfo.getDiskOffering(), rootDiskOfferingInfo.getSize(), - rootDiskOfferingInfo.getMinIops(), rootDiskOfferingInfo.getMaxIops(), vmFinal, template, owner); + rootDiskOfferingInfo.getMinIops(), rootDiskOfferingInfo.getMaxIops(), vmFinal, template, owner, null); } else if (template.getFormat() == ImageFormat.BAREMETAL) { // Do nothing } else { @@ -423,7 +450,18 @@ public void doInTransactionWithoutResult(final TransactionStatus status) throws if (dataDiskOfferings != null) { for (final DiskOfferingInfo dataDiskOfferingInfo : dataDiskOfferings) { volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vmFinal.getId(), dataDiskOfferingInfo.getDiskOffering(), dataDiskOfferingInfo.getSize(), - dataDiskOfferingInfo.getMinIops(), dataDiskOfferingInfo.getMaxIops(), vmFinal, template, owner); + dataDiskOfferingInfo.getMinIops(), dataDiskOfferingInfo.getMaxIops(), vmFinal, template, owner, null); + } + } + if (datadiskTemplateToDiskOfferingMap != null && !datadiskTemplateToDiskOfferingMap.isEmpty()) { + int diskNumber = 1; + for (Entry dataDiskTemplateToDiskOfferingMap : datadiskTemplateToDiskOfferingMap.entrySet()) { + DiskOffering diskOffering = dataDiskTemplateToDiskOfferingMap.getValue(); + long diskOfferingSize = diskOffering.getDiskSize() / (1024 * 1024 * 1024); + VMTemplateVO dataDiskTemplate = _templateDao.findById(dataDiskTemplateToDiskOfferingMap.getKey()); + volumeMgr.allocateRawVolume(Type.DATADISK, "DATA-" + vmFinal.getId() + "-" + String.valueOf(diskNumber), diskOffering, diskOfferingSize, null, null, + vmFinal, dataDiskTemplate, owner, Long.valueOf(diskNumber)); + diskNumber++; } } } @@ -437,7 +475,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) throws @Override public void allocate(final String vmInstanceName, final VirtualMachineTemplate template, final ServiceOffering serviceOffering, final LinkedHashMap> networks, final DeploymentPlan plan, final HypervisorType hyperType) throws InsufficientCapacityException { - allocate(vmInstanceName, template, serviceOffering, new DiskOfferingInfo(serviceOffering), new ArrayList(), networks, plan, hyperType); + allocate(vmInstanceName, template, serviceOffering, new DiskOfferingInfo(serviceOffering), new ArrayList(), networks, plan, hyperType, null, null); } private VirtualMachineGuru getVmGuru(final VirtualMachine vm) { @@ -504,6 +542,8 @@ protected void advanceExpunge(VMInstanceVO vm) throws ResourceUnavailableExcepti final Long hostId = vm.getHostId() != null ? vm.getHostId() : vm.getLastHostId(); + List> targets = getTargets(hostId, vm.getId()); + if (volumeExpungeCommands != null && volumeExpungeCommands.size() > 0 && hostId != null) { final Commands cmds = new Commands(Command.OnError.Stop); @@ -531,6 +571,10 @@ protected void advanceExpunge(VMInstanceVO vm) throws ResourceUnavailableExcepti // Clean up volumes based on the vm's instance id volumeMgr.cleanupVolumes(vm.getId()); + if (hostId != null && CollectionUtils.isNotEmpty(targets)) { + removeDynamicTargets(hostId, targets); + } + final VirtualMachineGuru guru = getVmGuru(vm); guru.finalizeExpunge(vm); //remove the overcommit detials from the uservm details @@ -567,6 +611,64 @@ protected void advanceExpunge(VMInstanceVO vm) throws ResourceUnavailableExcepti } + private List> getTargets(Long hostId, long vmId) { + List> targets = new ArrayList<>(); + + HostVO hostVO = _hostDao.findById(hostId); + + if (hostVO == null || hostVO.getHypervisorType() != HypervisorType.VMware) { + return targets; + } + + List volumes = _volsDao.findByInstance(vmId); + + if (CollectionUtils.isEmpty(volumes)) { + return targets; + } + + for (VolumeVO volume : volumes) { + StoragePoolVO storagePoolVO = _storagePoolDao.findById(volume.getPoolId()); + + if (storagePoolVO != null && storagePoolVO.isManaged()) { + Map target = new HashMap<>(); + + target.put(ModifyTargetsCommand.STORAGE_HOST, storagePoolVO.getHostAddress()); + target.put(ModifyTargetsCommand.STORAGE_PORT, String.valueOf(storagePoolVO.getPort())); + target.put(ModifyTargetsCommand.IQN, volume.get_iScsiName()); + + targets.add(target); + } + } + + return targets; + } + + private void removeDynamicTargets(long hostId, List> targets) { + ModifyTargetsCommand cmd = new ModifyTargetsCommand(); + + cmd.setTargets(targets); + cmd.setApplyToAllHostsInCluster(true); + cmd.setAdd(false); + cmd.setTargetTypeToRemove(ModifyTargetsCommand.TargetTypeToRemove.DYNAMIC); + + sendModifyTargetsCommand(cmd, hostId); + } + + private void sendModifyTargetsCommand(ModifyTargetsCommand cmd, long hostId) { + Answer answer = _agentMgr.easySend(hostId, cmd); + + if (answer == null) { + String msg = "Unable to get an answer to the modify targets command"; + + s_logger.warn(msg); + } + else if (!answer.getResult()) { + String msg = "Unable to modify target on the following host: " + hostId; + + s_logger.warn(msg); + } + } + @Override public boolean start() { // TODO, initial delay is hardcoded @@ -821,6 +923,21 @@ public void advanceStart(final String vmUuid, final Map sshAccessDetails, final VirtualMachine vm) throws AgentUnavailableException, OperationTimedoutException { + final String csr = caManager.generateKeyStoreAndCsr(vmHost, sshAccessDetails); + if (!Strings.isNullOrEmpty(csr)) { + final Map ipAddressDetails = new HashMap<>(sshAccessDetails); + ipAddressDetails.remove(NetworkElementCommand.ROUTER_NAME); + final Certificate certificate = caManager.issueCertificate(csr, Arrays.asList(vm.getHostName(), vm.getInstanceName()), + new ArrayList<>(ipAddressDetails.values()), CAManager.CertValidityPeriod.value(), null); + final boolean result = caManager.deployCertificate(vmHost, certificate, false, sshAccessDetails); + if (!result) { + s_logger.error("Failed to setup certificate for system vm: " + vm.getInstanceName()); + } + } else { + s_logger.error("Failed to setup keystore and generate CSR for system vm: " + vm.getInstanceName()); + } + } @Override public void orchestrateStart(final String vmUuid, final Map params, final DeploymentPlan planToDeploy, final DeploymentPlanner planner) @@ -847,9 +964,6 @@ public void orchestrateStart(final String vmUuid, final Map sshAccessDetails = _networkMgr.getSystemVMAccessDetails(vm); + for (int retries = 3; retries > 0; retries--) { + try { + setupAgentSecurity(vmHost, sshAccessDetails, vm); + return; + } catch (final Exception e) { + s_logger.error("Retrying after catching exception while trying to secure agent for systemvm id=" + vm.getId(), e); + } + } + throw new CloudRuntimeException("Failed to setup and secure agent for systemvm id=" + vm.getId()); + } return; } else { if (s_logger.isDebugEnabled()) { s_logger.info("The guru did not like the answers so stopping " + vm); } - - final StopCommand cmd = new StopCommand(vm, getExecuteInSequence(vm.getHypervisorType()), false); + StopCommand stopCmd = new StopCommand(vm, getExecuteInSequence(vm.getHypervisorType()), false); + stopCmd.setControlIp(getControlNicIpForVM(vm)); + final StopCommand cmd = stopCmd; final Answer answer = _agentMgr.easySend(destHostId, cmd); if (answer != null && answer instanceof StopAnswer) { final StopAnswer stopAns = (StopAnswer)answer; @@ -1192,8 +1327,8 @@ private void handlePath(final DiskTO[] disks, final HypervisorType hypervisorTyp } // for managed storage on XenServer and VMware, need to update the DB with a path if the VDI/VMDK file was newly created - private void handlePath(final DiskTO[] disks, final Map iqnToPath) { - if (disks != null && iqnToPath != null) { + private void handlePath(final DiskTO[] disks, final Map> iqnToData) { + if (disks != null && iqnToData != null) { for (final DiskTO disk : disks) { final Map details = disk.getDetails(); final boolean isManaged = details != null && Boolean.parseBoolean(details.get(DiskTO.MANAGED)); @@ -1202,12 +1337,31 @@ private void handlePath(final DiskTO[] disks, final Map iqnToPat final Long volumeId = disk.getData().getId(); final VolumeVO volume = _volsDao.findById(volumeId); final String iScsiName = volume.get_iScsiName(); - final String path = iqnToPath.get(iScsiName); - if (path != null) { - volume.setPath(path); + boolean update = false; + + final Map data = iqnToData.get(iScsiName); + + if (data != null) { + final String path = data.get(StartAnswer.PATH); + + if (path != null) { + volume.setPath(path); + + update = true; + } + + final String imageFormat = data.get(StartAnswer.IMAGE_FORMAT); + + if (imageFormat != null) { + volume.setFormat(ImageFormat.valueOf(imageFormat)); + + update = true; + } - _volsDao.update(volumeId, volume); + if (update) { + _volsDao.update(volumeId, volume); + } } } } @@ -1269,9 +1423,38 @@ public boolean getExecuteInSequence(final HypervisorType hypervisorType) { } } + private List> getVolumesToDisconnect(VirtualMachine vm) { + List> volumesToDisconnect = new ArrayList<>(); + + List volumes = _volsDao.findByInstance(vm.getId()); + + if (CollectionUtils.isEmpty(volumes)) { + return volumesToDisconnect; + } + + for (VolumeVO volume : volumes) { + StoragePoolVO storagePool = _storagePoolDao.findById(volume.getPoolId()); + + if (storagePool != null && storagePool.isManaged()) { + Map info = new HashMap<>(3); + + info.put(DiskTO.STORAGE_HOST, storagePool.getHostAddress()); + info.put(DiskTO.STORAGE_PORT, String.valueOf(storagePool.getPort())); + info.put(DiskTO.IQN, volume.get_iScsiName()); + + volumesToDisconnect.add(info); + } + } + + return volumesToDisconnect; + } + protected boolean sendStop(final VirtualMachineGuru guru, final VirtualMachineProfile profile, final boolean force, final boolean checkBeforeCleanup) { final VirtualMachine vm = profile.getVirtualMachine(); - final StopCommand stop = new StopCommand(vm, getExecuteInSequence(vm.getHypervisorType()), checkBeforeCleanup); + StopCommand stpCmd = new StopCommand(vm, getExecuteInSequence(vm.getHypervisorType()), checkBeforeCleanup); + stpCmd.setControlIp(getControlNicIpForVM(vm)); + stpCmd.setVolumesToDisconnect(getVolumesToDisconnect(vm)); + final StopCommand stop = stpCmd; try { Answer answer = null; if(vm.getHostId() != null) { @@ -1492,6 +1675,12 @@ private void advanceStop(final VMInstanceVO vm, final boolean cleanUpEvenIfUnabl _workDao.update(work.getId(), work); } return; + } else { + HostVO host = _hostDao.findById(hostId); + if (!cleanUpEvenIfUnableToStop && vm.getState() == State.Running && host.getResourceState() == ResourceState.PrepareForMaintenance) { + s_logger.debug("Host is in PrepareForMaintenance state - Stop VM operation on the VM id: " + vm.getId() + " is not allowed"); + throw new CloudRuntimeException("Stop VM operation on the VM id: " + vm.getId() + " is not allowed as host is preparing for maintenance mode"); + } } final VirtualMachineGuru vmGuru = getVmGuru(vm); @@ -1540,6 +1729,7 @@ private void advanceStop(final VMInstanceVO vm, final boolean cleanUpEvenIfUnabl vmGuru.prepareStop(profile); final StopCommand stop = new StopCommand(vm, getExecuteInSequence(vm.getHypervisorType()), false, cleanUpEvenIfUnableToStop); + stop.setControlIp(getControlNicIpForVM(vm)); boolean stopped = false; Answer answer = null; @@ -1676,7 +1866,7 @@ public boolean stateTransitTo(final VirtualMachine vm1, final VirtualMachine.Eve } @Override - public void destroy(final String vmUuid) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { + public void destroy(final String vmUuid, final boolean expunge) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { VMInstanceVO vm = _vmDao.findByUuid(vmUuid); if (vm == null || vm.getState() == State.Destroyed || vm.getState() == State.Expunging || vm.getRemoved() != null) { if (s_logger.isDebugEnabled()) { @@ -1686,26 +1876,47 @@ public void destroy(final String vmUuid) throws AgentUnavailableException, Opera } if (s_logger.isDebugEnabled()) { - s_logger.debug("Destroying vm " + vm); + s_logger.debug("Destroying vm " + vm + ", expunge flag " + (expunge ? "on" : "off")); } advanceStop(vmUuid, VmDestroyForcestop.value()); - if (!_vmSnapshotMgr.deleteAllVMSnapshots(vm.getId(), null)) { - s_logger.debug("Unable to delete all snapshots for " + vm); - throw new CloudRuntimeException("Unable to delete vm snapshots for " + vm); - } + deleteVMSnapshots(vm, expunge); - // reload the vm object from db - vm = _vmDao.findByUuid(vmUuid); - try { - if (!stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { - s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); - throw new CloudRuntimeException("Unable to destroy " + vm); + Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { + public void doInTransactionWithoutResult(final TransactionStatus status) throws CloudRuntimeException { + VMInstanceVO vm = _vmDao.findByUuid(vmUuid); + try { + if (!stateTransitTo(vm, VirtualMachine.Event.DestroyRequested, vm.getHostId())) { + s_logger.debug("Unable to destroy the vm because it is not in the correct state: " + vm); + throw new CloudRuntimeException("Unable to destroy " + vm); + } + } catch (final NoTransitionException e) { + s_logger.debug(e.getMessage()); + throw new CloudRuntimeException("Unable to destroy " + vm, e); + } + } + }); + } + + /** + * Delete vm snapshots depending on vm's hypervisor type. For Vmware, vm snapshots removal is delegated to vm cleanup thread + * to reduce tasks sent to hypervisor (one tasks to delete vm snapshots and vm itself + * instead of one task for each vm snapshot plus another for the vm) + * @param vm vm + * @param expunge indicates if vm should be expunged + */ + private void deleteVMSnapshots(VMInstanceVO vm, boolean expunge) { + if (! vm.getHypervisorType().equals(HypervisorType.VMware)) { + if (!_vmSnapshotMgr.deleteAllVMSnapshots(vm.getId(), null)) { + s_logger.debug("Unable to delete all snapshots for " + vm); + throw new CloudRuntimeException("Unable to delete vm snapshots for " + vm); + } + } + else { + if (expunge) { + _vmSnapshotMgr.deleteVMSnapshotsFromDB(vm.getId()); } - } catch (final NoTransitionException e) { - s_logger.debug(e.getMessage()); - throw new CloudRuntimeException("Unable to destroy " + vm, e); } } @@ -1721,6 +1932,18 @@ protected boolean checkVmOnHost(final VirtualMachine vm, final long hostId) thro } } + UserVmVO userVm = _userVmDao.findById(vm.getId()); + if (userVm != null) { + List vmSnapshots = _vmSnapshotDao.findByVm(vm.getId()); + RestoreVMSnapshotCommand command = _vmSnapshotMgr.createRestoreCommand(userVm, vmSnapshots); + if (command != null) { + RestoreVMSnapshotAnswer restoreVMSnapshotAnswer = (RestoreVMSnapshotAnswer) _agentMgr.send(hostId, command); + if (restoreVMSnapshotAnswer == null || !restoreVMSnapshotAnswer.getResult()) { + s_logger.warn("Unable to restore the vm snapshot from image file after live migration of vm with vmsnapshots: " + restoreVMSnapshotAnswer.getDetails()); + } + } + } + return true; } @@ -1999,6 +2222,12 @@ protected void migrate(final VMInstanceVO vm, final long srcHostId, final Deploy try { final boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); final MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows, to, getExecuteInSequence(vm.getHypervisorType())); + + String autoConvergence = _configDao.getValue(Config.KvmAutoConvergence.toString()); + boolean kvmAutoConvergence = Boolean.parseBoolean(autoConvergence); + + mc.setAutoConvergence(kvmAutoConvergence); + mc.setHostGuid(dest.getHost().getGuid()); try { @@ -2069,62 +2298,90 @@ protected void migrate(final VMInstanceVO vm, final long srcHostId, final Deploy private Map getPoolListForVolumesForMigration(final VirtualMachineProfile profile, final Host host, final Map volumeToPool) { final List allVolumes = _volsDao.findUsableVolumesForInstance(profile.getId()); - final Map volumeToPoolObjectMap = new HashMap (); + final Map volumeToPoolObjectMap = new HashMap<>(); + for (final VolumeVO volume : allVolumes) { - final Long poolId = volumeToPool.get(Long.valueOf(volume.getId())); - final StoragePoolVO pool = _storagePoolDao.findById(poolId); + final Long poolId = volumeToPool.get(volume.getId()); + final StoragePoolVO destPool = _storagePoolDao.findById(poolId); final StoragePoolVO currentPool = _storagePoolDao.findById(volume.getPoolId()); final DiskOfferingVO diskOffering = _diskOfferingDao.findById(volume.getDiskOfferingId()); - if (pool != null) { - // Check if pool is accessible from the destination host and disk offering with which the volume was - // created is compliant with the pool type. - if (_poolHostDao.findByPoolHost(pool.getId(), host.getId()) == null || pool.isLocal() != diskOffering.getUseLocalStorage()) { - // Cannot find a pool for the volume. Throw an exception. - throw new CloudRuntimeException("Cannot migrate volume " + volume + " to storage pool " + pool + " while migrating vm to host " + host + - ". Either the pool is not accessible from the host or because of the offering with which the volume is created it cannot be placed on " + - "the given pool."); - } else if (pool.getId() == currentPool.getId()) { - // If the pool to migrate too is the same as current pool, the volume doesn't need to be migrated. - } else { - volumeToPoolObjectMap.put(volume, pool); + + if (destPool != null) { + if (currentPool.isManaged()) { + if (destPool.getId() == currentPool.getId()) { + volumeToPoolObjectMap.put(volume, currentPool); + } + else { + throw new CloudRuntimeException("Currently, a volume on managed storage can only be 'migrated' to itself."); + } } - } else { - // Find a suitable pool for the volume. Call the storage pool allocator to find the list of pools. - final DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType()); - final DataCenterDeployment plan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), host.getId(), null, null); - final ExcludeList avoid = new ExcludeList(); - boolean currentPoolAvailable = false; - - final List poolList = new ArrayList(); - for (final StoragePoolAllocator allocator : _storagePoolAllocators) { - final List poolListFromAllocator = allocator.allocateToPool(diskProfile, profile, plan, avoid, StoragePoolAllocator.RETURN_UPTO_ALL); - if (poolListFromAllocator != null && !poolListFromAllocator.isEmpty()) { - poolList.addAll(poolListFromAllocator); + else { + // Check if pool is accessible from the destination host and disk offering with which the volume was + // created is compliant with the pool type. + if (_poolHostDao.findByPoolHost(destPool.getId(), host.getId()) == null || destPool.isLocal() != diskOffering.getUseLocalStorage()) { + // Cannot find a pool for the volume. Throw an exception. + throw new CloudRuntimeException("Cannot migrate volume " + volume + " to storage pool " + destPool + " while migrating vm to host " + host + + ". Either the pool is not accessible from the host or because of the offering with which the volume is created it cannot be placed on " + + "the given pool."); + } else if (destPool.getId() == currentPool.getId()) { + // If the pool to migrate to is the same as current pool, the volume doesn't need to be migrated. + } else { + volumeToPoolObjectMap.put(volume, destPool); } } + } else { + if (currentPool.isManaged()) { + if (currentPool.getScope() == ScopeType.ZONE) { + volumeToPoolObjectMap.put(volume, currentPool); + } + else { + throw new CloudRuntimeException("Currently, you can only 'migrate' a volume on managed storage if its storage pool is zone wide."); + } + } else { + // Find a suitable pool for the volume. Call the storage pool allocator to find the list of pools. - if (poolList != null && !poolList.isEmpty()) { - // Volume needs to be migrated. Pick the first pool from the list. Add a mapping to migrate the - // volume to a pool only if it is required; that is the current pool on which the volume resides - // is not available on the destination host. - final Iterator iter = poolList.iterator(); - while (iter.hasNext()) { - if (currentPool.getId() == iter.next().getId()) { - currentPoolAvailable = true; - break; + final DiskProfile diskProfile = new DiskProfile(volume, diskOffering, profile.getHypervisorType()); + final DataCenterDeployment plan = new DataCenterDeployment(host.getDataCenterId(), host.getPodId(), host.getClusterId(), + host.getId(), null, null); + + final List poolList = new ArrayList<>(); + final ExcludeList avoid = new ExcludeList(); + + for (final StoragePoolAllocator allocator : _storagePoolAllocators) { + final List poolListFromAllocator = allocator.allocateToPool(diskProfile, profile, plan, avoid, StoragePoolAllocator.RETURN_UPTO_ALL); + + if (poolListFromAllocator != null && !poolListFromAllocator.isEmpty()) { + poolList.addAll(poolListFromAllocator); } } - if (!currentPoolAvailable) { - volumeToPoolObjectMap.put(volume, _storagePoolDao.findByUuid(poolList.get(0).getUuid())); - } - } + boolean currentPoolAvailable = false; + + if (poolList != null && !poolList.isEmpty()) { + // Volume needs to be migrated. Pick the first pool from the list. Add a mapping to migrate the + // volume to a pool only if it is required; that is the current pool on which the volume resides + // is not available on the destination host. + + final Iterator iter = poolList.iterator(); + + while (iter.hasNext()) { + if (currentPool.getId() == iter.next().getId()) { + currentPoolAvailable = true; + + break; + } + } + if (!currentPoolAvailable) { + volumeToPoolObjectMap.put(volume, _storagePoolDao.findByUuid(poolList.get(0).getUuid())); + } + } - if (!currentPoolAvailable && !volumeToPoolObjectMap.containsKey(volume)) { - // Cannot find a pool for the volume. Throw an exception. - throw new CloudRuntimeException("Cannot find a storage pool which is available for volume " + volume + " while migrating virtual machine " + - profile.getVirtualMachine() + " to host " + host); + if (!currentPoolAvailable && !volumeToPoolObjectMap.containsKey(volume)) { + // Cannot find a pool for the volume. Throw an exception. + throw new CloudRuntimeException("Cannot find a storage pool which is available for volume " + volume + " while migrating virtual machine " + + profile.getVirtualMachine() + " to host " + host); + } } } } @@ -2265,16 +2522,15 @@ private void orchestrateMigrateWithStorage(final String vmUuid, final long srcHo if (defaultNic != null) { UserVmVO userVm = _userVmDao.findById(vm.getId()); Map details = _vmDetailsDao.listDetailsKeyPairs(vm.getId()); - vm.setDetails(details); + userVm.setDetails(details); Network network = _networkModel.getNetwork(defaultNic.getNetworkId()); if (_networkModel.isSharedNetworkWithoutServices(network.getId())) { final String serviceOffering = _serviceOfferingDao.findByIdIncludingRemoved(vm.getId(), vm.getServiceOfferingId()).getDisplayText(); - final String zoneName = _dcDao.findById(vm.getDataCenterId()).getName(); boolean isWindows = _guestOSCategoryDao.findById(_guestOSDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); - vmData = _networkModel.generateVmData(userVm.getUserData(), serviceOffering, zoneName, vm.getInstanceName(), vm.getId(), - (String) profile.getParameter(VirtualMachineProfile.Param.VmSshPubKey), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows); + vmData = _networkModel.generateVmData(userVm.getUserData(), serviceOffering, vm.getDataCenterId(), vm.getInstanceName(), vm.getHostName(), vm.getId(), + vm.getUuid(), defaultNic.getMacAddress(), userVm.getDetail("SSH.PublicKey"), (String) profile.getParameter(VirtualMachineProfile.Param.VmPassword), isWindows); String vmName = vm.getInstanceName(); String configDriveIsoRootFolder = "/tmp"; String isoFile = configDriveIsoRootFolder + "/" + vmName + "/configDrive/" + vmName + ".iso"; @@ -2516,9 +2772,7 @@ protected void runInContext() { s_logger.trace("VM Operation Thread Running"); try { _workDao.cleanup(VmOpCleanupWait.value()); - - // TODO. hard-coded to one hour after job has been completed - final Date cutDate = new Date(new Date().getTime() - 3600000); + final Date cutDate = new Date(DateUtil.currentGMTTime().getTime() - VmOpCleanupInterval.value() * 1000); _workJobDao.expungeCompletedWorkJobs(cutDate); } catch (final Exception e) { s_logger.error("VM Operations failed due to ", e); @@ -2598,7 +2852,11 @@ public void advanceReboot(final String vmUuid, final Map params) throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException { final VMInstanceVO vm = _vmDao.findByUuid(vmUuid); - + // if there are active vm snapshots task, state change is not allowed + if(_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())){ + s_logger.error("Unable to reboot VM " + vm + " due to: " + vm.getInstanceName() + " has active VM snapshots tasks"); + throw new CloudRuntimeException("Unable to reboot VM " + vm + " due to: " + vm.getInstanceName() + " has active VM snapshots tasks"); + } final DataCenter dc = _entityMgr.findById(DataCenter.class, vm.getDataCenterId()); final Host host = _hostDao.findById(vm.getHostId()); if (host == null) { @@ -2627,12 +2885,24 @@ private void orchestrateReboot(final String vmUuid, final Map instances = _vmDao.findVMInTransition(new Date(new Date().getTime() - AgentManager.Wait.value() * 1000), State.Starting, State.Stopping); + final List instances = _vmDao.findVMInTransition(new Date(DateUtil.currentGMTTime().getTime() - AgentManager.Wait.value() * 1000), State.Starting, State.Stopping); for (final VMInstanceVO instance : instances) { final State state = instance.getState(); if (state == State.Stopping) { @@ -3382,7 +3652,7 @@ private void orchestrateMigrateForScale(final String vmUuid, final long srcHostI } if (fromHost.getClusterId().longValue() != dest.getCluster().getId()) { - s_logger.info("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId()); + s_logger.info("Source and destination host are not in same cluster, unable to migrate to host: " + dstHostId); throw new CloudRuntimeException("Source and destination host are not in same cluster, unable to migrate to host: " + dest.getHost().getId()); } @@ -3458,6 +3728,12 @@ private void orchestrateMigrateForScale(final String vmUuid, final long srcHostI try { final boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); final MigrateCommand mc = new MigrateCommand(vm.getInstanceName(), dest.getHost().getPrivateIpAddress(), isWindows, to, getExecuteInSequence(vm.getHypervisorType())); + + String autoConvergence = _configDao.getValue(Config.KvmAutoConvergence.toString()); + boolean kvmAutoConvergence = Boolean.parseBoolean(autoConvergence); + + mc.setAutoConvergence(kvmAutoConvergence); + mc.setHostGuid(dest.getHost().getGuid()); try { @@ -3528,6 +3804,36 @@ private void orchestrateMigrateForScale(final String vmUuid, final long srcHostI } } + @Override + public boolean replugNic(final Network network, final NicTO nic, final VirtualMachineTO vm, final ReservationContext context, final DeployDestination dest) throws ConcurrentOperationException, + ResourceUnavailableException, InsufficientCapacityException { + boolean result = true; + + final VMInstanceVO router = _vmDao.findById(vm.getId()); + if (router.getState() == State.Running) { + try { + final ReplugNicCommand replugNicCmd = new ReplugNicCommand(nic, vm.getName(), vm.getType(), vm.getDetails()); + final Commands cmds = new Commands(Command.OnError.Stop); + cmds.addCommand("replugnic", replugNicCmd); + _agentMgr.send(dest.getHost().getId(), cmds); + final ReplugNicAnswer replugNicAnswer = cmds.getAnswer(ReplugNicAnswer.class); + if (replugNicAnswer == null || !replugNicAnswer.getResult()) { + s_logger.warn("Unable to replug nic for vm " + vm.getName()); + result = false; + } + } catch (final OperationTimedoutException e) { + throw new AgentUnavailableException("Unable to plug nic for router " + vm.getName() + " in network " + network, dest.getHost().getId(), e); + } + } else { + s_logger.warn("Unable to apply ReplugNic, vm " + router + " is not in the right state " + router.getState()); + + throw new ResourceUnavailableException("Unable to apply ReplugNic on the backend," + " vm " + vm + " is not in the right state", DataCenter.class, + router.getDataCenterId()); + } + + return result; + } + public boolean plugNic(final Network network, final NicTO nic, final VirtualMachineTO vm, final ReservationContext context, final DeployDestination dest) throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { boolean result = true; @@ -3540,7 +3846,7 @@ public boolean plugNic(final Network network, final NicTO nic, final VirtualMach cmds.addCommand("plugnic", plugNicCmd); _agentMgr.send(dest.getHost().getId(), cmds); final PlugNicAnswer plugNicAnswer = cmds.getAnswer(PlugNicAnswer.class); - if (!(plugNicAnswer != null && plugNicAnswer.getResult())) { + if (plugNicAnswer == null || !plugNicAnswer.getResult()) { s_logger.warn("Unable to plug nic for vm " + vm.getName()); result = false; } @@ -3564,6 +3870,11 @@ public boolean unplugNic(final Network network, final NicTO nic, final VirtualMa final VMInstanceVO router = _vmDao.findById(vm.getId()); if (router.getState() == State.Running) { + // collect vm network statistics before unplug a nic + UserVmVO userVm = _userVmDao.findById(vm.getId()); + if (userVm != null && userVm.getType() == VirtualMachine.Type.User) { + _userVmService.collectVmNetworkStatistics(userVm); + } try { final Commands cmds = new Commands(Command.OnError.Stop); final UnPlugNicCommand unplugNicCmd = new UnPlugNicCommand(nic, vm.getName()); @@ -3571,7 +3882,7 @@ public boolean unplugNic(final Network network, final NicTO nic, final VirtualMa _agentMgr.send(dest.getHost().getId(), cmds); final UnPlugNicAnswer unplugNicAnswer = cmds.getAnswer(UnPlugNicAnswer.class); - if (!(unplugNicAnswer != null && unplugNicAnswer.getResult())) { + if (unplugNicAnswer == null || !unplugNicAnswer.getResult()) { s_logger.warn("Unable to unplug nic from router " + router); result = false; } @@ -3708,7 +4019,7 @@ public String getConfigComponentName() { public ConfigKey[] getConfigKeys() { return new ConfigKey[] {ClusterDeltaSyncInterval, StartRetry, VmDestroyForcestop, VmOpCancelInterval, VmOpCleanupInterval, VmOpCleanupWait, VmOpLockStateRetry, - VmOpWaitInterval, ExecuteInSequence, VmJobCheckInterval, VmJobTimeout, VmJobStateReportInterval, VmConfigDriveLabel}; + VmOpWaitInterval, ExecuteInSequence, VmJobCheckInterval, VmJobTimeout, VmJobStateReportInterval, VmConfigDriveLabel, VmConfigDriveOnPrimaryPool, HaVmRestartHostUp}; } public List getStoragePoolAllocators() { @@ -3853,7 +4164,7 @@ private void handlePowerOffReportWithNoPendingJobsOnVM(final VMInstanceVO vm) { case Stopped: case Migrating: s_logger.info("VM " + vm.getInstanceName() + " is at " + vm.getState() + " and we received a power-off report while there is no pending jobs on it"); - if(vm.isHaEnabled() && vm.getState() == State.Running && vm.getHypervisorType() != HypervisorType.VMware && vm.getHypervisorType() != HypervisorType.Hyperv) { + if(vm.isHaEnabled() && vm.getState() == State.Running && HaVmRestartHostUp.value() && vm.getHypervisorType() != HypervisorType.VMware && vm.getHypervisorType() != HypervisorType.Hyperv) { s_logger.info("Detected out-of-band stop of a HA enabled VM " + vm.getInstanceName() + ", will schedule restart"); if(!_haMgr.hasPendingHaWork(vm.getId())) { _haMgr.scheduleRestart(vm, true); @@ -4619,8 +4930,10 @@ private Pair orchestrateStart(final VmWorkStart work) th orchestrateStart(vm.getUuid(), work.getParams(), work.getPlan(), _dpMgr.getDeploymentPlannerByName(work.getDeploymentPlanner())); } catch (CloudRuntimeException e){ - s_logger.info("Caught CloudRuntimeException, returning job failed"); - return new Pair(JobInfo.Status.FAILED, null); + e.printStackTrace(); + s_logger.info("Caught CloudRuntimeException, returning job failed " + e); + CloudRuntimeException ex = new CloudRuntimeException("Unable to start VM instance"); + return new Pair(JobInfo.Status.FAILED, JobSerializerHelper.toObjectSerializedString(ex)); } return new Pair(JobInfo.Status.SUCCEEDED, null); } @@ -4630,8 +4943,8 @@ private Pair orchestrateStop(final VmWorkStop work) thro final VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, work.getVmId()); if (vm == null) { s_logger.info("Unable to find vm " + work.getVmId()); + throw new CloudRuntimeException("Unable to find VM id=" + work.getVmId()); } - assert vm != null; orchestrateStop(vm.getUuid(), work.isCleanup()); return new Pair(JobInfo.Status.SUCCEEDED, null); diff --git a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java index 3b9d6f596de1..60c0a994b4df 100644 --- a/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java +++ b/engine/orchestration/src/com/cloud/vm/VirtualMachinePowerStateSyncImpl.java @@ -24,7 +24,7 @@ import javax.inject.Inject; import org.apache.log4j.Logger; -import org.apache.cloudstack.framework.config.ConfigKey; +import com.cloud.configuration.ManagementServiceConfiguration; import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.PublishScope; @@ -39,9 +39,7 @@ public class VirtualMachinePowerStateSyncImpl implements VirtualMachinePowerStat @Inject MessageBus _messageBus; @Inject VMInstanceDao _instanceDao; @Inject VirtualMachineManager _vmMgr; - - protected final ConfigKey PingInterval = new ConfigKey(Integer.class, "ping.interval", "Advanced", "60", - "Interval to send application level pings to make sure the connection is still working", false); + @Inject ManagementServiceConfiguration mgmtServiceConf; public VirtualMachinePowerStateSyncImpl() { } @@ -107,7 +105,7 @@ private void processReport(long hostId, Map tra s_logger.debug("Run missing VM report. current time: " + currentTime.getTime()); // 2 times of sync-update interval for graceful period - long milliSecondsGracefullPeriod = PingInterval.value() * 2000L; + long milliSecondsGracefullPeriod = mgmtServiceConf.getPingInterval() * 2000L; for (VMInstanceVO instance : vmsThatAreMissingReport) { diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java index 0c357ca0313d..a87072e2d81a 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManager.java @@ -39,12 +39,12 @@ public interface VMEntityManager { String reserveVirtualMachine(VMEntityVO vmEntityVO, DeploymentPlanner plannerToUse, DeploymentPlan plan, ExcludeList exclude) throws InsufficientCapacityException, ResourceUnavailableException; - void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map params) + void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map params, boolean deployOnGivenHost) throws InsufficientCapacityException, ResourceUnavailableException; boolean stopvirtualmachine(VMEntityVO vmEntityVO, String caller) throws ResourceUnavailableException; boolean stopvirtualmachineforced(VMEntityVO vmEntityVO, String caller) throws ResourceUnavailableException; - boolean destroyVirtualMachine(VMEntityVO vmEntityVO, String caller) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException; + boolean destroyVirtualMachine(VMEntityVO vmEntityVO, String caller, boolean expunge) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException; } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java index a944b9373424..ef9c44ab26df 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VMEntityManagerImpl.java @@ -218,7 +218,7 @@ public String reserveVirtualMachine(VMEntityVO vmEntityVO, DeploymentPlanner pla } @Override - public void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map params) + public void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, String caller, Map params, boolean deployOnGivenHost) throws InsufficientCapacityException, ResourceUnavailableException { //grab the VM Id and destination using the reservationId. @@ -233,13 +233,17 @@ public void deployVirtualMachine(String reservationId, VMEntityVO vmEntityVO, St _itMgr.start(vm.getUuid(), params, reservedPlan, _planningMgr.getDeploymentPlannerByName(vmReservation.getDeploymentPlanner())); } catch (Exception ex) { // Retry the deployment without using the reservation plan - DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null); + // Retry is only done if host id is not passed in deploy virtual machine api. Otherwise + // the instance may be started on another host instead of the intended one. + if (!deployOnGivenHost) { + DataCenterDeployment plan = new DataCenterDeployment(0, null, null, null, null, null); - if (reservedPlan.getAvoids() != null) { - plan.setAvoids(reservedPlan.getAvoids()); - } + if (reservedPlan.getAvoids() != null) { + plan.setAvoids(reservedPlan.getAvoids()); + } - _itMgr.start(vm.getUuid(), params, plan, null); + _itMgr.start(vm.getUuid(), params, plan, null); + } } } else { // no reservation found. Let VirtualMachineManager retry @@ -261,10 +265,10 @@ public boolean stopvirtualmachineforced(VMEntityVO vmEntityVO, String caller) th } @Override - public boolean destroyVirtualMachine(VMEntityVO vmEntityVO, String caller) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { + public boolean destroyVirtualMachine(VMEntityVO vmEntityVO, String caller, boolean expunge) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { VMInstanceVO vm = _vmDao.findByUuid(vmEntityVO.getUuid()); - _itMgr.destroy(vm.getUuid()); + _itMgr.destroy(vm.getUuid(), expunge); return true; } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java index 2f4de36b05a0..598e61989d17 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/cloud/entity/api/VirtualMachineEntityImpl.java @@ -207,9 +207,9 @@ public void migrateTo(String reservationId, String caller) { } @Override - public void deploy(String reservationId, String caller, Map params) throws InsufficientCapacityException, + public void deploy(String reservationId, String caller, Map params, boolean deployOnGivenHost) throws InsufficientCapacityException, ResourceUnavailableException { - manager.deployVirtualMachine(reservationId, this.vmEntityVO, caller, params); + manager.deployVirtualMachine(reservationId, this.vmEntityVO, caller, params, deployOnGivenHost); } @Override @@ -229,8 +229,8 @@ public void cleanup() { } @Override - public boolean destroy(String caller) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { - return manager.destroyVirtualMachine(this.vmEntityVO, caller); + public boolean destroy(String caller, boolean expunge) throws AgentUnavailableException, OperationTimedoutException, ConcurrentOperationException { + return manager.destroyVirtualMachine(this.vmEntityVO, caller, expunge); } @Override diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineClusterVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineClusterVO.java index 0c34e3c52858..75965fe4bd1c 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineClusterVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineClusterVO.java @@ -16,8 +16,16 @@ // under the License. package org.apache.cloudstack.engine.datacenter.entity.api.db; -import java.util.Date; -import java.util.UUID; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.org.Cluster; +import com.cloud.org.Grouping; +import com.cloud.org.Managed.ManagedState; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.StateMachine; +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State; +import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event; import javax.persistence.Column; import javax.persistence.Entity; @@ -29,18 +37,8 @@ import javax.persistence.Table; import javax.persistence.Temporal; import javax.persistence.TemporalType; - -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State; -import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event; - -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.org.Cluster; -import com.cloud.org.Grouping; -import com.cloud.org.Managed.ManagedState; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.db.GenericDao; -import com.cloud.utils.db.StateMachine; +import java.util.Date; +import java.util.UUID; @Entity @Table(name = "cluster") @@ -243,4 +241,9 @@ public Date getLastUpdated() { public State getState() { return state; } + + @Override + public PartitionType partitionType() { + return PartitionType.Cluster; + } } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java index ca9ad50b3c1c..ba967be6210c 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineDataCenterVO.java @@ -16,9 +16,14 @@ // under the License. package org.apache.cloudstack.engine.datacenter.entity.api.db; -import java.util.Date; -import java.util.Map; -import java.util.UUID; +import com.cloud.network.Network.Provider; +import com.cloud.org.Grouping; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.StateMachine; +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State; +import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event; import javax.persistence.Column; import javax.persistence.Entity; @@ -32,16 +37,9 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; - -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State; -import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event; - -import com.cloud.network.Network.Provider; -import com.cloud.org.Grouping; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.db.GenericDao; -import com.cloud.utils.db.StateMachine; +import java.util.Date; +import java.util.Map; +import java.util.UUID; @Entity @Table(name = "data_center") @@ -501,4 +499,9 @@ public String getIp6Dns2() { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } + + @Override + public PartitionType partitionType() { + return PartitionType.Zone; + } } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostVO.java index efa34dfec981..be1484f0bde2 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostVO.java @@ -16,10 +16,16 @@ // under the License. package org.apache.cloudstack.engine.datacenter.entity.api.db; -import java.util.Date; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import com.cloud.host.Status; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.resource.ResourceState; +import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.StateMachine; +import org.apache.cloudstack.api.Identity; +import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State; +import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; @@ -36,18 +42,10 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; - -import org.apache.cloudstack.api.Identity; -import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State; -import org.apache.cloudstack.engine.datacenter.entity.api.DataCenterResourceEntity.State.Event; - -import com.cloud.host.Status; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.resource.ResourceState; -import com.cloud.storage.Storage.StoragePoolType; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.db.GenericDao; -import com.cloud.utils.db.StateMachine; +import java.util.Date; +import java.util.List; +import java.util.Map; +import java.util.UUID; @Entity @Table(name = "host") @@ -178,6 +176,11 @@ public Long getClusterId() { return clusterId; } + @Override + public ResourceType resourceType() { + return ResourceType.Host; + } + public void setClusterId(Long clusterId) { this.clusterId = clusterId; } @@ -720,6 +723,11 @@ public void setResourceState(ResourceState state) { resourceState = state; } + @Override + public boolean isDisabled() { + return (getResourceState() == ResourceState.Disabled); + } + @Override public boolean isInMaintenanceStates() { return (getResourceState() == ResourceState.Maintenance || getResourceState() == ResourceState.ErrorInMaintenance || getResourceState() == ResourceState.PrepareForMaintenance); @@ -758,4 +766,9 @@ public Date getLastUpdated() { public State getOrchestrationState() { return orchestrationState; } + + @Override + public PartitionType partitionType() { + return PartitionType.Host; + } } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java index 2b4995466b53..91e9b6f57bdb 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/CloudOrchestrator.java @@ -24,6 +24,7 @@ import java.util.LinkedHashMap; import java.util.List; import java.util.Map; +import java.util.Map.Entry; import javax.inject.Inject; @@ -45,6 +46,7 @@ import com.cloud.network.Network; import com.cloud.network.dao.NetworkDao; import com.cloud.network.dao.NetworkVO; +import com.cloud.offering.DiskOffering; import com.cloud.offering.DiskOfferingInfo; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; @@ -155,7 +157,7 @@ public void destroyVolume(String volumeEntity) { @Override public VirtualMachineEntity createVirtualMachine(String id, String owner, String templateId, String hostName, String displayName, String hypervisor, int cpu, int speed, long memory, Long diskSize, List computeTags, List rootDiskTags, Map networkNicMap, DeploymentPlan plan, - Long rootDiskSize) throws InsufficientCapacityException { + Long rootDiskSize, Map> extraDhcpOptionMap, Map dataDiskTemplateToDiskOfferingMap) throws InsufficientCapacityException { // VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, // vmEntityManager); @@ -233,15 +235,27 @@ public VirtualMachineEntity createVirtualMachine(String id, String owner, String dataDiskOfferings.add(dataDiskOfferingInfo); } + if (dataDiskTemplateToDiskOfferingMap != null && !dataDiskTemplateToDiskOfferingMap.isEmpty()) { + for (Entry datadiskTemplateToDiskOffering : dataDiskTemplateToDiskOfferingMap.entrySet()) { + DiskOffering diskOffering = datadiskTemplateToDiskOffering.getValue(); + if (diskOffering == null) { + throw new InvalidParameterValueException("Unable to find disk offering " + vm.getDiskOfferingId()); + } + if (diskOffering.getDiskSize() == 0) { // Custom disk offering is not supported for volumes created from datadisk templates + throw new InvalidParameterValueException("Disk offering " + diskOffering + " requires size parameter."); + } + } + } + _itMgr.allocate(vm.getInstanceName(), _templateDao.findById(new Long(templateId)), computeOffering, rootDiskOfferingInfo, dataDiskOfferings, networkIpMap, plan, - hypervisorType); + hypervisorType, extraDhcpOptionMap, dataDiskTemplateToDiskOfferingMap); return vmEntity; } @Override public VirtualMachineEntity createVirtualMachineFromScratch(String id, String owner, String isoId, String hostName, String displayName, String hypervisor, String os, - int cpu, int speed, long memory, Long diskSize, List computeTags, List rootDiskTags, Map networkNicMap, DeploymentPlan plan) + int cpu, int speed, long memory, Long diskSize, List computeTags, List rootDiskTags, Map networkNicMap, DeploymentPlan plan, Map> extraDhcpOptionMap) throws InsufficientCapacityException { // VirtualMachineEntityImpl vmEntity = new VirtualMachineEntityImpl(id, owner, hostName, displayName, cpu, speed, memory, computeTags, rootDiskTags, networks, vmEntityManager); @@ -299,7 +313,7 @@ public VirtualMachineEntity createVirtualMachineFromScratch(String id, String ow HypervisorType hypervisorType = HypervisorType.valueOf(hypervisor); - _itMgr.allocate(vm.getInstanceName(), _templateDao.findById(new Long(isoId)), computeOffering, rootDiskOfferingInfo, new ArrayList(), networkIpMap, plan, hypervisorType); + _itMgr.allocate(vm.getInstanceName(), _templateDao.findById(new Long(isoId)), computeOffering, rootDiskOfferingInfo, new ArrayList(), networkIpMap, plan, hypervisorType, extraDhcpOptionMap, null); return vmEntity; } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java index c4c344dddcc2..b5aca5d9f10e 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/NetworkOrchestrator.java @@ -25,6 +25,7 @@ import java.util.HashMap; import java.util.HashSet; import java.util.LinkedHashMap; +import java.util.LinkedList; import java.util.List; import java.util.Map; import java.util.Set; @@ -32,6 +33,7 @@ import java.util.concurrent.Executors; import java.util.concurrent.ScheduledExecutorService; import java.util.concurrent.TimeUnit; +import java.util.stream.Collectors; import javax.inject.Inject; import javax.naming.ConfigurationException; @@ -41,7 +43,6 @@ import org.apache.cloudstack.engine.cloud.entity.api.db.VMNetworkMapVO; import org.apache.cloudstack.engine.cloud.entity.api.db.dao.VMNetworkMapDao; import org.apache.cloudstack.engine.orchestration.service.NetworkOrchestrationService; -import org.apache.cloudstack.framework.config.ConfigDepot; import org.apache.cloudstack.framework.config.ConfigKey; import org.apache.cloudstack.framework.config.ConfigKey.Scope; import org.apache.cloudstack.framework.config.Configurable; @@ -49,7 +50,6 @@ import org.apache.cloudstack.framework.messagebus.MessageBus; import org.apache.cloudstack.framework.messagebus.PublishScope; import org.apache.cloudstack.managed.context.ManagedContextRunnable; -import org.apache.cloudstack.region.PortableIpDao; import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; @@ -62,6 +62,7 @@ import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupRoutingCommand; +import com.cloud.agent.api.routing.NetworkElementCommand; import com.cloud.agent.api.to.NicTO; import com.cloud.alert.AlertManager; import com.cloud.configuration.ConfigurationManager; @@ -81,7 +82,6 @@ import com.cloud.deploy.DeployDestination; import com.cloud.deploy.DeploymentPlan; import com.cloud.domain.Domain; -import com.cloud.event.dao.UsageEventDao; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ConnectionException; import com.cloud.exception.InsufficientAddressCapacityException; @@ -113,6 +113,7 @@ import com.cloud.network.PhysicalNetwork; import com.cloud.network.PhysicalNetworkSetupInfo; import com.cloud.network.RemoteAccessVpn; +import com.cloud.network.VpcVirtualNetworkApplianceService; import com.cloud.network.addr.PublicIp; import com.cloud.network.dao.AccountGuestVlanMapDao; import com.cloud.network.dao.AccountGuestVlanMapVO; @@ -132,16 +133,21 @@ import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; import com.cloud.network.dao.PhysicalNetworkVO; +import com.cloud.network.dao.RemoteAccessVpnDao; +import com.cloud.network.dao.RemoteAccessVpnVO; import com.cloud.network.element.AggregatedCommandExecutor; import com.cloud.network.element.DhcpServiceProvider; +import com.cloud.network.element.DnsServiceProvider; import com.cloud.network.element.IpDeployer; import com.cloud.network.element.LoadBalancingServiceProvider; import com.cloud.network.element.NetworkElement; +import com.cloud.network.element.RedundantResource; import com.cloud.network.element.StaticNatServiceProvider; import com.cloud.network.element.UserDataServiceProvider; import com.cloud.network.guru.NetworkGuru; import com.cloud.network.guru.NetworkGuruAdditionalFunctions; import com.cloud.network.lb.LoadBalancingRulesManager; +import com.cloud.network.router.VirtualRouter; import com.cloud.network.rules.FirewallManager; import com.cloud.network.rules.FirewallRule; import com.cloud.network.rules.FirewallRule.Purpose; @@ -170,6 +176,7 @@ import com.cloud.user.dao.AccountDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; +import com.cloud.utils.StringUtils; import com.cloud.utils.UuidUtils; import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.ManagerBase; @@ -188,9 +195,12 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; +import com.cloud.utils.net.Dhcp; import com.cloud.utils.net.NetUtils; +import com.cloud.vm.DomainRouterVO; import com.cloud.vm.Nic; import com.cloud.vm.Nic.ReservationStrategy; +import com.cloud.vm.NicExtraDhcpOptionVO; import com.cloud.vm.NicIpAlias; import com.cloud.vm.NicProfile; import com.cloud.vm.NicVO; @@ -201,13 +211,16 @@ import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.Type; import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.NicDao; +import com.cloud.vm.dao.NicExtraDhcpOptionDao; import com.cloud.vm.dao.NicIpAliasDao; import com.cloud.vm.dao.NicIpAliasVO; import com.cloud.vm.dao.NicSecondaryIpDao; import com.cloud.vm.dao.NicSecondaryIpVO; import com.cloud.vm.dao.UserVmDao; import com.cloud.vm.dao.VMInstanceDao; +import com.google.common.base.Strings; /** * NetworkManagerImpl implements NetworkManager. @@ -258,6 +271,8 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra @Inject protected NicIpAliasDao _nicIpAliasDao; @Inject + protected NicExtraDhcpOptionDao _nicExtraDhcpOptionDao; + @Inject protected IPAddressDao _publicIpAddressDao; @Inject protected IpAddressManager _ipAddrMgr; @@ -265,9 +280,16 @@ public class NetworkOrchestrator extends ManagerBase implements NetworkOrchestra MessageBus _messageBus; @Inject VMNetworkMapDao _vmNetworkMapDao; + @Inject + DomainRouterDao _routerDao; + @Inject + RemoteAccessVpnDao _remoteAccessVpnDao; + @Inject + VpcVirtualNetworkApplianceService _routerService; List networkGurus; + @Override public List getNetworkGurus() { return networkGurus; } @@ -341,15 +363,9 @@ public void setDhcpProviders(final List dhcpProviders) { @Inject NetworkACLManager _networkACLMgr; @Inject - UsageEventDao _usageEventDao; - @Inject NetworkModel _networkModel; @Inject NicSecondaryIpDao _nicSecondaryIpDao; - @Inject - PortableIpDao _portableIpDao; - @Inject - ConfigDepot _configDepot; protected StateMachine2 _stateMachine; ScheduledExecutorService _executor; @@ -426,7 +442,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { if (_networkOfferingDao.findByUniqueName(NetworkOffering.QuickCloudNoServices) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.QuickCloudNoServices, "Offering for QuickCloud with no services", TrafficType.Guest, null, true, Availability.Optional, null, new HashMap>(), true, Network.GuestType.Shared, false, null, true, null, true, - false, null, false, null, true); + false, null, false, null, true, false); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -435,7 +451,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOfferingWithSGService) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOfferingWithSGService, "Offering for Shared Security group enabled networks", TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, - null, true, false, null, false, null, true); + null, true, false, null, false, null, true, false); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -444,7 +460,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedNetworkOffering, "Offering for Shared networks", TrafficType.Guest, null, true, Availability.Optional, null, defaultSharedNetworkOfferingProviders, true, Network.GuestType.Shared, false, null, true, null, true, false, null, false, - null, true); + null, true, false); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -454,7 +470,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingWithSourceNatService, "Offering for Isolated networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Required, null, defaultIsolatedSourceNatEnabledNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, true, null, false, false, null, false, null, - true); + true, false); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); @@ -464,7 +480,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworks, "Offering for Isolated VPC networks with Source Nat service enabled", TrafficType.Guest, null, false, Availability.Optional, null, - defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); + defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -475,7 +491,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { defaultVPCOffProviders.remove(Service.Lb); offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksNoLB, "Offering for Isolated VPC networks with Source Nat service enabled and LB service disabled", TrafficType.Guest, null, false, Availability.Optional, - null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); + null, defaultVPCOffProviders, true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -484,7 +500,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOffering, "Offering for Isolated networks with no Source Nat service", TrafficType.Guest, null, true, Availability.Optional, null, defaultIsolatedNetworkOfferingProviders, true, Network.GuestType.Isolated, false, null, - true, null, true, false, null, false, null, true); + true, null, true, false, null, false, null, true, false); offering.setState(NetworkOffering.State.Enabled); _networkOfferingDao.update(offering.getId(), offering); } @@ -508,7 +524,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultIsolatedNetworkOfferingForVpcNetworksWithInternalLB, "Offering for Isolated VPC networks with Internal Lb support", TrafficType.Guest, null, false, Availability.Optional, null, internalLbOffProviders, - true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true); + true, Network.GuestType.Isolated, false, null, false, null, false, false, null, false, null, true, true); offering.setState(NetworkOffering.State.Enabled); offering.setInternalLb(true); offering.setPublicLb(false); @@ -540,11 +556,13 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { if (_networkOfferingDao.findByUniqueName(NetworkOffering.DefaultSharedEIPandELBNetworkOffering) == null) { offering = _configMgr.createNetworkOffering(NetworkOffering.DefaultSharedEIPandELBNetworkOffering, "Offering for Shared networks with Elastic IP and Elastic LB capabilities", TrafficType.Guest, null, true, Availability.Optional, null, - netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true); + netscalerServiceProviders, true, Network.GuestType.Shared, false, null, true, serviceCapabilityMap, true, false, null, false, null, true, false); offering.setState(NetworkOffering.State.Enabled); offering.setDedicatedLB(false); _networkOfferingDao.update(offering.getId(), offering); } + + _networkOfferingDao.persistDefaultL2NetworkOfferings(); } }); @@ -673,7 +691,7 @@ public List setupNetwork(final Account owner, final NetworkOf public void doInTransactionWithoutResult(final TransactionStatus status) { final NetworkVO vo = new NetworkVO(id, network, offering.getId(), guru.getName(), owner.getDomainId(), owner.getId(), relatedFile, name, displayText, predefined .getNetworkDomain(), offering.getGuestType(), plan.getDataCenterId(), plan.getPhysicalNetworkId(), aclType, offering.getSpecifyIpRanges(), - vpcId, offering.getRedundantRouter()); + vpcId, offering.getRedundantRouter(), predefined.getExternalId()); vo.setDisplayNetwork(isDisplayNetworkEnabled == null ? true : isDisplayNetworkEnabled); vo.setStrechedL2Network(offering.getSupportsStrechedL2()); final NetworkVO networkPersisted = _networksDao.persist(vo, vo.getGuestType() == Network.GuestType.Isolated, @@ -708,7 +726,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) { @Override @DB - public void allocate(final VirtualMachineProfile vm, final LinkedHashMap> networks) throws InsufficientCapacityException, + public void allocate(final VirtualMachineProfile vm, final LinkedHashMap> networks, final Map> extraDhcpOptions) throws InsufficientCapacityException, ConcurrentOperationException { Transaction.execute(new TransactionCallbackWithExceptionNoReturn() { @@ -780,6 +798,7 @@ public void doInTransactionWithoutResult(final TransactionStatus status) throws nics.add(vmNic); vm.addNic(vmNic); + saveExtraDhcpOptions(config.getUuid(), vmNic.getId(), extraDhcpOptions); } } if (nics.size() != size) { @@ -794,6 +813,24 @@ public void doInTransactionWithoutResult(final TransactionStatus status) throws }); } + @Override + public void saveExtraDhcpOptions(final String networkUuid, final Long nicId, final Map> extraDhcpOptionMap) { + + if(extraDhcpOptionMap != null) { + Map extraDhcpOption = extraDhcpOptionMap.get(networkUuid); + if(extraDhcpOption != null) { + List nicExtraDhcpOptionList = new LinkedList<>(); + + for (Integer code : extraDhcpOption.keySet()) { + Dhcp.DhcpOptionCode.valueOfInt(code); //check if code is supported or not. + NicExtraDhcpOptionVO nicExtraDhcpOptionVO = new NicExtraDhcpOptionVO(nicId, code, extraDhcpOption.get(code)); + nicExtraDhcpOptionList.add(nicExtraDhcpOptionVO); + } + _nicExtraDhcpOptionDao.saveExtraDhcpOptions(nicExtraDhcpOptionList); + } + } + } + @DB @Override public Pair allocateNic(final NicProfile requested, final Network network, final Boolean isDefaultNic, int deviceId, final VirtualMachineProfile vm) @@ -1098,26 +1135,13 @@ public void implementNetworkElementsAndResources(final DeployDestination dest, f } // get providers to implement final List providersToImplement = getNetworkProviders(network.getId()); - for (final NetworkElement element : networkElements) { - if (providersToImplement.contains(element.getProvider())) { - if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { - // The physicalNetworkId will not get translated into a uuid by the reponse serializer, - // because the serializer would look up the NetworkVO class's table and retrieve the - // network id instead of the physical network id. - // So just throw this exception as is. We may need to TBD by changing the serializer. - throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " - + network.getPhysicalNetworkId()); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Asking " + element.getName() + " to implemenet " + network); - } + implementNetworkElements(dest, context, network, offering, providersToImplement); - if (!element.implement(network, offering, dest, context)) { - final CloudRuntimeException ex = new CloudRuntimeException("Failed to implement provider " + element.getProvider().getName() + " for network with specified id"); - ex.addProxyObject(network.getUuid(), "networkId"); - throw ex; - } + //Reset the extra DHCP option that may have been cleared per nic. + List nicVOs = _nicDao.listByNetworkId(network.getId()); + for(NicVO nicVO : nicVOs) { + if(nicVO.getState() == Nic.State.Reserved) { + configureExtraDhcpOptions(network, nicVO.getId()); } } @@ -1159,6 +1183,32 @@ public void implementNetworkElementsAndResources(final DeployDestination dest, f } } + private void implementNetworkElements(final DeployDestination dest, final ReservationContext context, final Network network, final NetworkOffering offering, final List providersToImplement) + throws ConcurrentOperationException, ResourceUnavailableException, InsufficientCapacityException { + for (NetworkElement element : networkElements) { + if (providersToImplement.contains(element.getProvider())) { + if (!_networkModel.isProviderEnabledInPhysicalNetwork(_networkModel.getPhysicalNetworkId(network), element.getProvider().getName())) { + // The physicalNetworkId will not get translated into a uuid by the reponse serializer, + // because the serializer would look up the NetworkVO class's table and retrieve the + // network id instead of the physical network id. + // So just throw this exception as is. We may need to TBD by changing the serializer. + throw new CloudRuntimeException("Service provider " + element.getProvider().getName() + " either doesn't exist or is not enabled in physical network id: " + + network.getPhysicalNetworkId()); + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Asking " + element.getName() + " to implemenet " + network); + } + + if (!element.implement(network, offering, dest, context)) { + CloudRuntimeException ex = new CloudRuntimeException("Failed to implement provider " + element.getProvider().getName() + " for network with specified id"); + ex.addProxyObject(network.getUuid(), "networkId"); + throw ex; + } + } + } + } + // This method re-programs the rules/ips for existing network protected boolean reprogramNetworkRules(final long networkId, final Account caller, final Network network) throws ResourceUnavailableException { boolean success = true; @@ -1177,7 +1227,6 @@ protected boolean reprogramNetworkRules(final long networkId, final Account call success = false; } - // associate all ip addresses if (!_ipAddrMgr.applyIpAssociations(network, false)) { s_logger.warn("Failed to apply ip addresses as a part of network id" + networkId + " restart"); @@ -1249,9 +1298,7 @@ protected boolean prepareElement(final NetworkElement element, final Network net if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp) && _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dhcp, element.getProvider()) && element instanceof DhcpServiceProvider) { final DhcpServiceProvider sp = (DhcpServiceProvider)element; - final Map dhcpCapabilities = element.getCapabilities().get(Service.Dhcp); - final String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets); - if (supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets) && profile.getIPv6Address() == null) { + if (isDhcpAccrossMultipleSubnetsSupported(sp)) { if (!sp.configDhcpSupportForSubnet(network, profile, vmProfile, dest, context)) { return false; } @@ -1260,6 +1307,18 @@ protected boolean prepareElement(final NetworkElement element, final Network net return false; } } + if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dns) + && _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.Dns, element.getProvider()) && element instanceof DnsServiceProvider) { + final DnsServiceProvider sp = (DnsServiceProvider)element; + if (profile.getIPv6Address() == null) { + if (!sp.configDnsSupportForSubnet(network, profile, vmProfile, dest, context)) { + return false; + } + } + if(!sp.addDnsEntry(network, profile, vmProfile, dest, context)) { + return false; + } + } if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.UserData) && _networkModel.isProviderSupportServiceInNetwork(network.getId(), Service.UserData, element.getProvider()) && element instanceof UserDataServiceProvider) { final UserDataServiceProvider sp = (UserDataServiceProvider)element; @@ -1271,6 +1330,191 @@ protected boolean prepareElement(final NetworkElement element, final Network net return true; } + @Override + public boolean canUpdateInSequence(Network network, boolean forced){ + List providers = getNetworkProviders(network.getId()); + + //check if the there are no service provider other than virtualrouter. + for(Provider provider : providers) { + if (provider!=Provider.VirtualRouter) + throw new UnsupportedOperationException("Cannot update the network resources in sequence when providers other than virtualrouter are used"); + } + //check if routers are in correct state before proceeding with the update + List routers = _routerDao.listByNetworkAndRole(network.getId(), VirtualRouter.Role.VIRTUAL_ROUTER); + for (DomainRouterVO router : routers){ + if (router.getRedundantState() == VirtualRouter.RedundantState.UNKNOWN) { + if (!forced) { + throw new CloudRuntimeException("Domain router: "+router.getInstanceName()+" is in unknown state, Cannot update network. set parameter forced to true for forcing an update"); + } + } + } + return true; + } + + @Override + public List getServicesNotSupportedInNewOffering(Network network,long newNetworkOfferingId){ + NetworkOffering offering =_networkOfferingDao.findById(newNetworkOfferingId); + List services=_ntwkOfferingSrvcDao.listServicesForNetworkOffering(offering.getId()); + List serviceMap= _ntwkSrvcDao.getServicesInNetwork(network.getId()); + List servicesNotInNewOffering=new ArrayList<>(); + for(NetworkServiceMapVO serviceVO :serviceMap){ + boolean inlist=false; + for(String service: services){ + if(serviceVO.getService().equalsIgnoreCase(service)){ + inlist=true; + break; + } + } + if(!inlist){ + //ignore Gateway service as this has no effect on the + //behaviour of network. + if(!serviceVO.getService().equalsIgnoreCase(Service.Gateway.getName())) + servicesNotInNewOffering.add(serviceVO.getService()); + } + } + return servicesNotInNewOffering; + } + + @Override + public void cleanupConfigForServicesInNetwork(List services, final Network network){ + long networkId=network.getId(); + Account caller=_accountDao.findById(Account.ACCOUNT_ID_SYSTEM); + long userId=User.UID_SYSTEM; + //remove all PF/Static Nat rules for the network + s_logger.info("Services:"+services+" are no longer supported in network:"+network.getUuid()+ + " after applying new network offering:"+network.getNetworkOfferingId()+" removing the related configuration"); + if(services.contains(Service.StaticNat.getName())|| services.contains(Service.PortForwarding.getName())) { + try { + if (_rulesMgr.revokeAllPFStaticNatRulesForNetwork(networkId, userId, caller)) { + s_logger.debug("Successfully cleaned up portForwarding/staticNat rules for network id=" + networkId); + } else { + s_logger.warn("Failed to release portForwarding/StaticNat rules as a part of network id=" + networkId + " cleanup"); + } + if(services.contains(Service.StaticNat.getName())){ + //removing static nat configured on ips. + //optimizing the db operations using transaction. + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + List ips = _ipAddressDao.listStaticNatPublicIps(network.getId()); + for (IPAddressVO ip : ips) { + ip.setOneToOneNat(false); + ip.setAssociatedWithVmId(null); + ip.setVmIp(null); + _ipAddressDao.update(ip.getId(),ip); + } + } + }); + } + } catch (ResourceUnavailableException ex) { + s_logger.warn("Failed to release portForwarding/StaticNat rules as a part of network id=" + networkId + " cleanup due to resourceUnavailable ", ex); + } + } + if(services.contains(Service.SourceNat.getName())){ + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + List ips = _ipAddressDao.listByAssociatedNetwork(network.getId(),true); + //removing static nat configured on ips. + for (IPAddressVO ip : ips) { + ip.setSourceNat(false); + _ipAddressDao.update(ip.getId(),ip); + } + } + }); + } + if(services.contains(Service.Lb.getName())){ + //remove all LB rules for the network + if (_lbMgr.removeAllLoadBalanacersForNetwork(networkId, caller, userId)) { + s_logger.debug("Successfully cleaned up load balancing rules for network id=" + networkId); + } else { + s_logger.warn("Failed to cleanup LB rules as a part of network id=" + networkId + " cleanup"); + } + } + + if(services.contains(Service.Firewall.getName())){ + //revoke all firewall rules for the network + try { + if (_firewallMgr.revokeAllFirewallRulesForNetwork(networkId, userId, caller)) { + s_logger.debug("Successfully cleaned up firewallRules rules for network id=" + networkId); + } else { + s_logger.warn("Failed to cleanup Firewall rules as a part of network id=" + networkId + " cleanup"); + } + } catch (ResourceUnavailableException ex) { + s_logger.warn("Failed to cleanup Firewall rules as a part of network id=" + networkId + " cleanup due to resourceUnavailable ", ex); + } + } + + //do not remove vpn service for vpc networks. + if(services.contains(Service.Vpn.getName()) && network.getVpcId()==null){ + RemoteAccessVpnVO vpn = _remoteAccessVpnDao.findByAccountAndNetwork(network.getAccountId(),networkId); + try { + _vpnMgr.destroyRemoteAccessVpnForIp(vpn.getServerAddressId(), caller, true); + } catch (ResourceUnavailableException ex) { + s_logger.warn("Failed to cleanup remote access vpn resources of network:"+network.getUuid() + " due to Exception: ", ex); + } + } + } + + @Override + public void configureUpdateInSequence(Network network) { + List providers = getNetworkProviders(network.getId()); + for (NetworkElement element : networkElements) { + if (providers.contains(element.getProvider())) { + if (element instanceof RedundantResource) { + ((RedundantResource) element).configureResource(network); + } + } + } + } + + @Override + public int getResourceCount(Network network){ + List providers = getNetworkProviders(network.getId()); + int resourceCount=0; + for (NetworkElement element : networkElements) { + if (providers.contains(element.getProvider())) { + //currently only one element implements the redundant resource interface + if (element instanceof RedundantResource) { + resourceCount= ((RedundantResource) element).getResourceCount(network); + break; + } + } + } + return resourceCount; + } + + @Override + public void configureExtraDhcpOptions(Network network, long nicId, Map extraDhcpOptions) { + if(_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp)) { + if (_networkModel.getNetworkServiceCapabilities(network.getId(), Service.Dhcp).containsKey(Capability.ExtraDhcpOptions)) { + DhcpServiceProvider sp = getDhcpServiceProvider(network); + sp.setExtraDhcpOptions(network, nicId, extraDhcpOptions); + } + } + } + + @Override + public void configureExtraDhcpOptions(Network network, long nicId) { + Map extraDhcpOptions = getExtraDhcpOptions(nicId); + configureExtraDhcpOptions(network, nicId, extraDhcpOptions); + } + + @Override + public void finalizeUpdateInSequence(Network network, boolean success) { + List providers = getNetworkProviders(network.getId()); + for (NetworkElement element : networkElements) { + if (providers.contains(element.getProvider())) { + //currently only one element implements the redundant resource interface + if (element instanceof RedundantResource) { + ((RedundantResource) element).finalize(network,success); + break; + } + } + } + } + + @DB protected void updateNic(final NicVO nic, final long networkId, final int count) { Transaction.execute(new TransactionCallbackNoReturn() { @@ -1392,9 +1636,20 @@ public NicProfile prepareNic(final VirtualMachineProfile vmProfile, final Deploy profile.setSecurityGroupEnabled(_networkModel.isSecurityGroupSupportedInNetwork(network)); guru.updateNicProfile(profile, network); + + configureExtraDhcpOptions(network, nicId); return profile; } + @Override + public Map getExtraDhcpOptions(long nicId) { + List nicExtraDhcpOptionVOList = _nicExtraDhcpOptionDao.listByNicId(nicId); + return nicExtraDhcpOptionVOList + .stream() + .collect(Collectors.toMap(NicExtraDhcpOptionVO::getCode, NicExtraDhcpOptionVO::getValue)); + } + + @Override public void prepareNicForMigration(final VirtualMachineProfile vm, final DeployDestination dest) { if(vm.getType().equals(VirtualMachine.Type.DomainRouter) && (vm.getHypervisorType().equals(HypervisorType.KVM) || vm.getHypervisorType().equals(HypervisorType.VMware))) { @@ -1725,15 +1980,29 @@ protected void removeNic(final VirtualMachineProfile vm, final NicVO nic) { } if (vm.getType() == Type.User - && _networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp) && network.getTrafficType() == TrafficType.Guest && network.getGuestType() == GuestType.Shared && isLastNicInSubnet(nic)) { - // remove the dhcpservice ip if this is the last nic in subnet. - final DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network); - if (dhcpServiceProvider != null - && isDhcpAccrossMultipleSubnetsSupported(dhcpServiceProvider)) { - removeDhcpServiceInSubnet(nic); + if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dhcp)) { + // remove the dhcpservice ip if this is the last nic in subnet. + final DhcpServiceProvider dhcpServiceProvider = getDhcpServiceProvider(network); + if (dhcpServiceProvider != null + && isDhcpAccrossMultipleSubnetsSupported(dhcpServiceProvider)) { + removeDhcpServiceInSubnet(nic); + } + } + if (_networkModel.areServicesSupportedInNetwork(network.getId(), Service.Dns)){ + final DnsServiceProvider dnsServiceProvider = getDnsServiceProvider(network); + if (dnsServiceProvider != null) { + try { + if(!dnsServiceProvider.removeDnsSupportForSubnet(network)) { + s_logger.warn("Failed to remove the ip alias on the dns server"); + } + } catch (final ResourceUnavailableException e) { + //failed to remove the dnsconfig. + s_logger.info("Unable to delete the ip alias due to unable to contact the dns server."); + } + } } } @@ -1804,9 +2073,9 @@ public void expungeNics(final VirtualMachineProfile vm) { @Override @DB public Network createGuestNetwork(final long networkOfferingId, final String name, final String displayText, final String gateway, final String cidr, String vlanId, - String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, final long zoneId, final ACLType aclType, Boolean subdomainAccess, - final Long vpcId, final String ip6Gateway, final String ip6Cidr, final Boolean isDisplayNetworkEnabled, final String isolatedPvlan) - throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { + boolean bypassVlanOverlapCheck, String networkDomain, final Account owner, final Long domainId, final PhysicalNetwork pNtwk, + final long zoneId, final ACLType aclType, Boolean subdomainAccess, final Long vpcId, final String ip6Gateway, final String ip6Cidr, + final Boolean isDisplayNetworkEnabled, final String isolatedPvlan, String externalId) throws ConcurrentOperationException, InsufficientCapacityException, ResourceAllocationException { final NetworkOfferingVO ntwkOff = _networkOfferingDao.findById(networkOfferingId); // this method supports only guest network creation @@ -1839,16 +2108,12 @@ public Network createGuestNetwork(final long networkOfferingId, final String nam boolean ipv6 = false; - if (ip6Gateway != null && ip6Cidr != null) { + if (StringUtils.isNotBlank(ip6Gateway) && StringUtils.isNotBlank(ip6Cidr)) { ipv6 = true; } // Validate zone final DataCenterVO zone = _dcDao.findById(zoneId); if (zone.getNetworkType() == NetworkType.Basic) { - if (ipv6) { - throw new InvalidParameterValueException("IPv6 is not supported in Basic zone"); - } - // In Basic zone the network should have aclType=Domain, domainId=1, subdomainAccess=true if (aclType == null || aclType != ACLType.Domain) { throw new InvalidParameterValueException("Only AclType=Domain can be specified for network creation in Basic zone"); @@ -1911,6 +2176,10 @@ public Network createGuestNetwork(final long networkOfferingId, final String nam } } + if (ipv6 && !NetUtils.isValidIp6Cidr(ip6Cidr)) { + throw new InvalidParameterValueException("Invalid IPv6 cidr specified"); + } + //TODO(VXLAN): Support VNI specified // VlanId can be specified only when network offering supports it final boolean vlanSpecified = vlanId != null; @@ -1923,19 +2192,19 @@ public Network createGuestNetwork(final long networkOfferingId, final String nam } if (vlanSpecified) { + URI uri = BroadcastDomainType.fromString(vlanId); //don't allow to specify vlan tag used by physical network for dynamic vlan allocation - if (_dcDao.findVnet(zoneId, pNtwk.getId(), vlanId).size() > 0) { + if (!(bypassVlanOverlapCheck && ntwkOff.getGuestType() == GuestType.Shared) && _dcDao.findVnet(zoneId, pNtwk.getId(), BroadcastDomainType.getValue(uri)).size() > 0) { throw new InvalidParameterValueException("The VLAN tag " + vlanId + " is already being used for dynamic vlan allocation for the guest network in zone " + zone.getName()); } if (! UuidUtils.validateUUID(vlanId)){ - final String uri = BroadcastDomainType.fromString(vlanId).toString(); - // For Isolated networks, don't allow to create network with vlan that already exists in the zone - if (ntwkOff.getGuestType() == GuestType.Isolated) { - if (_networksDao.countByZoneAndUri(zoneId, uri) > 0) { - throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists in zone " + zoneId); + // For Isolated and L2 networks, don't allow to create network with vlan that already exists in the zone + if (ntwkOff.getGuestType() == GuestType.Isolated || ntwkOff.getGuestType() == GuestType.L2) { + if (_networksDao.listByZoneAndUriAndGuestType(zoneId, uri.toString(), null).size() > 0) { + throw new InvalidParameterValueException("Network with vlan " + vlanId + " already exists or overlaps with other network vlans in zone " + zoneId); } else { - final List dcVnets = _datacenterVnetDao.findVnet(zoneId, vlanId.toString()); + final List dcVnets = _datacenterVnetDao.findVnet(zoneId, BroadcastDomainType.getValue(uri)); //for the network that is created as part of private gateway, //the vnet is not coming from the data center vnet table, so the list can be empty if (!dcVnets.isEmpty()) { @@ -1964,8 +2233,8 @@ public Network createGuestNetwork(final long networkOfferingId, final String nam } else { // don't allow to creating shared network with given Vlan ID, if there already exists a isolated network or // shared network with same Vlan ID in the zone - if (_networksDao.countByZoneUriAndGuestType(zoneId, uri, GuestType.Isolated) > 0 ) { - throw new InvalidParameterValueException("There is a isolated/shared network with vlan id: " + vlanId + " already exists " + "in zone " + zoneId); + if (!bypassVlanOverlapCheck && _networksDao.listByZoneAndUriAndGuestType(zoneId, uri.toString(), GuestType.Isolated).size() > 0 ) { + throw new InvalidParameterValueException("There is an existing isolated/shared network that overlaps with vlan id:" + vlanId + " in zone " + zoneId); } } } @@ -2012,13 +2281,15 @@ public Network createGuestNetwork(final long networkOfferingId, final String nam // with different Cidrs for the same Shared network final boolean cidrRequired = zone.getNetworkType() == NetworkType.Advanced && ntwkOff.getTrafficType() == TrafficType.Guest - && (ntwkOff.getGuestType() == GuestType.Shared || ntwkOff.getGuestType() == GuestType.Isolated && !_networkModel.areServicesSupportedByNetworkOffering( - ntwkOff.getId(), Service.SourceNat)); + && (ntwkOff.getGuestType() == GuestType.Shared || (ntwkOff.getGuestType() == GuestType.Isolated + && !_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.SourceNat))); if (cidr == null && ip6Cidr == null && cidrRequired) { throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask are required when create network of" + " type " + Network.GuestType.Shared + " and network of type " + GuestType.Isolated + " with service " + Service.SourceNat.getName() + " disabled"); } + checkL2OfferingServices(ntwkOff); + // No cidr can be specified in Basic zone if (zone.getNetworkType() == NetworkType.Basic && cidr != null) { throw new InvalidParameterValueException("StartIp/endIp/gateway/netmask can't be specified for zone of type " + NetworkType.Basic); @@ -2050,19 +2321,22 @@ public Network doInTransaction(final TransactionStatus status) { userNetwork.setGateway(gateway); } - if (ip6Cidr != null && ip6Gateway != null) { + if (StringUtils.isNotBlank(ip6Gateway) && StringUtils.isNotBlank(ip6Cidr)) { userNetwork.setIp6Cidr(ip6Cidr); userNetwork.setIp6Gateway(ip6Gateway); } + if (externalId != null) { + userNetwork.setExternalId(externalId); + } + if (vlanIdFinal != null) { if (isolatedPvlan == null) { URI uri = null; if (UuidUtils.validateUUID(vlanIdFinal)){ //Logical router's UUID provided as VLAN_ID userNetwork.setVlanIdAsUUID(vlanIdFinal); //Set transient field - } - else { + } else { uri = BroadcastDomainType.fromString(vlanIdFinal); } userNetwork.setBroadcastUri(uri); @@ -2114,6 +2388,21 @@ public Network doInTransaction(final TransactionStatus status) { return network; } + /** + * Checks for L2 network offering services. Only 2 cases allowed: + * - No services + * - User Data service only, provided by ConfigDrive + * @param ntwkOff network offering + */ + protected void checkL2OfferingServices(NetworkOfferingVO ntwkOff) { + if (ntwkOff.getGuestType() == GuestType.L2 && !_networkModel.listNetworkOfferingServices(ntwkOff.getId()).isEmpty() && + (!_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.UserData) || + (_networkModel.areServicesSupportedByNetworkOffering(ntwkOff.getId(), Service.UserData) && + _networkModel.listNetworkOfferingServices(ntwkOff.getId()).size() > 1))) { + throw new InvalidParameterValueException("For L2 networks, only UserData service is allowed"); + } + } + @Override @DB public boolean shutdownNetwork(final long networkId, final ReservationContext context, final boolean cleanupElements) { @@ -2283,7 +2572,6 @@ public boolean destroyNetwork(final long networkId, final ReservationContext con s_logger.debug("Unable to find network with id: " + networkId); return false; } - // Make sure that there are no user vms in the network that are not Expunged/Error final List userVms = _userVmDao.listByNetworkIdAndStates(networkId); @@ -2367,7 +2655,9 @@ public boolean destroyNetwork(final long networkId, final ReservationContext con public void doInTransactionWithoutResult(final TransactionStatus status) { final NetworkGuru guru = AdapterBase.getAdapterByName(networkGurus, networkFinal.getGuruName()); - guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId())); + if (!guru.trash(networkFinal, _networkOfferingDao.findById(networkFinal.getNetworkOfferingId()))) { + throw new CloudRuntimeException("Failed to trash network."); + } if (!deleteVlansInNetwork(networkFinal.getId(), context.getCaller().getId(), callerAccount)) { s_logger.warn("Failed to delete network " + networkFinal + "; was unable to cleanup corresponding ip ranges"); @@ -2556,26 +2846,18 @@ public boolean restartNetwork(final Long networkId, final Account callerAccount, s_logger.debug("Restarting network " + networkId + "..."); final ReservationContext context = new ReservationContextImpl(null, null, callerUser, callerAccount); + final NetworkOffering offering = _networkOfferingDao.findByIdIncludingRemoved(network.getNetworkOfferingId()); + final DeployDestination dest = new DeployDestination(_dcDao.findById(network.getDataCenterId()), null, null, null); if (cleanup) { - // shutdown the network - s_logger.debug("Shutting down the network id=" + networkId + " as a part of network restart"); - - if (!shutdownNetworkElementsAndResources(context, true, network)) { - s_logger.debug("Failed to shutdown the network elements and resources as a part of network restart: " + network.getState()); + if (!rollingRestartRouters(network, offering, dest, context)) { setRestartRequired(network, true); return false; } - } else { - s_logger.debug("Skip the shutting down of network id=" + networkId); + return true; } - // implement the network elements and rules again - final DeployDestination dest = new DeployDestination(_dcDao.findById(network.getDataCenterId()), null, null, null); - - s_logger.debug("Implementing the network " + network + " elements and resources as a part of network restart"); - final NetworkOfferingVO offering = _networkOfferingDao.findById(network.getNetworkOfferingId()); - + s_logger.debug("Implementing the network " + network + " elements and resources as a part of network restart without cleanup"); try { implementNetworkElementsAndResources(dest, context, network, offering); setRestartRequired(network, true); @@ -2586,6 +2868,103 @@ public boolean restartNetwork(final Long networkId, final Account callerAccount, } } + @Override + public void destroyExpendableRouters(final List routers, final ReservationContext context) throws ResourceUnavailableException { + final List remainingRouters = new ArrayList<>(); + for (final VirtualRouter router : routers) { + if (router.getState() == VirtualMachine.State.Stopped || + router.getState() == VirtualMachine.State.Error || + router.getState() == VirtualMachine.State.Shutdowned || + router.getState() == VirtualMachine.State.Unknown) { + s_logger.debug("Destroying old router " + router); + _routerService.destroyRouter(router.getId(), context.getAccount(), context.getCaller().getId()); + } else { + remainingRouters.add(router); + } + } + + if (remainingRouters.size() < 2) { + return; + } + + VirtualRouter backupRouter = null; + for (final VirtualRouter router : remainingRouters) { + if (router.getRedundantState() == VirtualRouter.RedundantState.BACKUP) { + backupRouter = router; + } + } + if (backupRouter == null) { + backupRouter = routers.get(routers.size() - 1); + } + if (backupRouter != null) { + _routerService.destroyRouter(backupRouter.getId(), context.getAccount(), context.getCaller().getId()); + } + } + + @Override + public boolean areRoutersRunning(final List routers) { + for (final VirtualRouter router : routers) { + if (router.getState() != VirtualMachine.State.Running) { + s_logger.debug("Found new router " + router.getInstanceName() + " to be in non-Running state: " + router.getState() + ". Please try restarting network again."); + return false; + } + } + return true; + } + + /** + * rollingRestartRouters performs restart of routers of a network by first + * deploying a new VR and then destroying old VRs in rolling fashion. For + * non-redundant network, it will re-program the new router as final step + * otherwise deploys a backup router for the network. + * @param network network to be restarted + * @param offering network offering + * @param dest deployment destination + * @param context reservation context + * @return returns true when the rolling restart operation succeeds + * @throws ResourceUnavailableException + * @throws ConcurrentOperationException + * @throws InsufficientCapacityException + */ + private boolean rollingRestartRouters(final NetworkVO network, final NetworkOffering offering, final DeployDestination dest, final ReservationContext context) throws ResourceUnavailableException, ConcurrentOperationException, InsufficientCapacityException { + s_logger.debug("Performing rolling restart of routers of network " + network); + destroyExpendableRouters(_routerDao.findByNetwork(network.getId()), context); + + final List providersToImplement = getNetworkProviders(network.getId()); + final List oldRouters = _routerDao.findByNetwork(network.getId()); + + // Deploy a new router + if (oldRouters.size() > 0) { + network.setRollingRestart(true); + } + implementNetworkElements(dest, context, network, offering, providersToImplement); + if (oldRouters.size() > 0) { + network.setRollingRestart(false); + } + + // For redundant network wait for 3*advert_int+skew_seconds for VRRP to kick in + if (network.isRedundant() || (oldRouters.size() == 1 && oldRouters.get(0).getIsRedundantRouter())) { + try { + Thread.sleep(NetworkOrchestrationService.RVRHandoverTime); + } catch (final InterruptedException ignored) {} + } + + // Destroy old routers + for (final DomainRouterVO oldRouter : oldRouters) { + _routerService.destroyRouter(oldRouter.getId(), context.getAccount(), context.getCaller().getId()); + } + + if (network.isRedundant()) { + // Add a new backup router for redundant network + implementNetworkElements(dest, context, network, offering, providersToImplement); + } else { + // Re-apply rules for non-redundant network + implementNetworkElementsAndResources(dest, context, network, offering); + } + + return areRoutersRunning(_routerDao.findByNetwork(network.getId())); + } + private void setRestartRequired(final NetworkVO network, final boolean restartRequired) { s_logger.debug("Marking network " + network + " with restartRequired=" + restartRequired); network.setRestartRequired(restartRequired); @@ -2647,6 +3026,18 @@ public DhcpServiceProvider getDhcpServiceProvider(final Network network) { } } + @Override + public DnsServiceProvider getDnsServiceProvider(final Network network) { + final String dnsProvider = _ntwkSrvcDao.getProviderForServiceInNetwork(network.getId(), Service.Dns); + + if (dnsProvider == null) { + s_logger.debug("Network " + network + " doesn't support service " + Service.Dhcp.getName()); + return null; + } + + return (DnsServiceProvider) _networkModel.getElementImplementingProvider(dnsProvider); + } + protected boolean isSharedNetworkWithServices(final Network network) { assert network != null; final DataCenter zone = _entityMgr.findById(DataCenter.class, network.getDataCenterId()); @@ -2671,12 +3062,17 @@ protected boolean isSharedNetworkOfferingWithServices(final long networkOffering } @Override - public List listVmNics(final long vmId, final Long nicId, final Long networkId) { + public List listVmNics(final long vmId, final Long nicId, final Long networkId, String keyword) { List result = null; - if (nicId == null && networkId == null) { - result = _nicDao.listByVmId(vmId); + + if (keyword == null || keyword.isEmpty()) { + if (nicId == null && networkId == null) { + result = _nicDao.listByVmId(vmId); + } else { + result = _nicDao.listByVmIdAndNicIdAndNtwkId(vmId, nicId, networkId); + } } else { - result = _nicDao.listByVmIdAndNicIdAndNtwkId(vmId, nicId, networkId); + result = _nicDao.listByVmIdAndKeyword(vmId, keyword); } for (final NicVO nic : result) { @@ -2717,7 +3113,7 @@ public boolean reallocate(final VirtualMachineProfile vm, final DataCenterDeploy @Override public void doInTransactionWithoutResult(final TransactionStatus status) throws InsufficientCapacityException { cleanupNics(vm); - allocate(vm, profiles); + allocate(vm, profiles, null); } }); } @@ -3260,6 +3656,39 @@ public List getNicProfiles(final VirtualMachine vm) { return profiles; } + @Override + public Map getSystemVMAccessDetails(final VirtualMachine vm) { + final Map accessDetails = new HashMap<>(); + accessDetails.put(NetworkElementCommand.ROUTER_NAME, vm.getInstanceName()); + String privateIpAddress = null; + for (final NicProfile profile : getNicProfiles(vm)) { + if (profile == null) { + continue; + } + final Network network = _networksDao.findById(profile.getNetworkId()); + if (network == null) { + continue; + } + final String address = profile.getIPv4Address(); + if (network.getTrafficType() == Networks.TrafficType.Control) { + accessDetails.put(NetworkElementCommand.ROUTER_IP, address); + } + if (network.getTrafficType() == Networks.TrafficType.Guest) { + accessDetails.put(NetworkElementCommand.ROUTER_GUEST_IP, address); + } + if (network.getTrafficType() == Networks.TrafficType.Management) { + privateIpAddress = address; + } + if (network.getTrafficType() != null && !Strings.isNullOrEmpty(address)) { + accessDetails.put(network.getTrafficType().name(), address); + } + } + if (privateIpAddress != null && Strings.isNullOrEmpty(accessDetails.get(NetworkElementCommand.ROUTER_IP))) { + accessDetails.put(NetworkElementCommand.ROUTER_IP, privateIpAddress); + } + return accessDetails; + } + protected boolean stateTransitTo(final NetworkVO network, final Network.Event e) throws NoTransitionException { return _stateMachine.transitTo(network, e, null, _networksDao); } @@ -3400,6 +3829,8 @@ public String getConfigComponentName() { @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {NetworkGcWait, NetworkGcInterval, NetworkLockTimeout, GuestDomainSuffix, NetworkThrottlingRate, MinVRVersion}; + return new ConfigKey[] {NetworkGcWait, NetworkGcInterval, NetworkLockTimeout, + GuestDomainSuffix, NetworkThrottlingRate, MinVRVersion, + PromiscuousMode, MacAddressChanges, ForgedTransmits}; } } diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java index ea6a66dc48a6..e5e0bbfed595 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/orchestration/VolumeOrchestrator.java @@ -30,8 +30,6 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; - import org.apache.cloudstack.engine.orchestration.service.VolumeOrchestrationService; import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; @@ -67,11 +65,13 @@ import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; +import org.apache.log4j.Logger; import com.cloud.agent.api.to.DataTO; import com.cloud.agent.api.to.DiskTO; import com.cloud.agent.api.to.VirtualMachineTO; import com.cloud.agent.manager.allocator.PodAllocator; +import com.cloud.capacity.CapacityManager; import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Resource.ResourceType; import com.cloud.dc.DataCenter; @@ -123,6 +123,7 @@ import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; import com.cloud.vm.DiskProfile; +import com.cloud.vm.UserVmCloneSettingVO; import com.cloud.vm.UserVmVO; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; @@ -132,9 +133,15 @@ import com.cloud.vm.VmWorkMigrateVolume; import com.cloud.vm.VmWorkSerializer; import com.cloud.vm.VmWorkTakeVolumeSnapshot; +import com.cloud.vm.dao.UserVmCloneSettingDao; import com.cloud.vm.dao.UserVmDao; public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrationService, Configurable { + + public enum UserVmCloneType { + full, linked + } + private static final Logger s_logger = Logger.getLogger(VolumeOrchestrator.class); @Inject @@ -182,6 +189,8 @@ public class VolumeOrchestrator extends ManagerBase implements VolumeOrchestrati @Inject StorageManager storageMgr; @Inject + protected UserVmCloneSettingDao _vmCloneSettingDao; + @Inject StorageStrategyFactory _storageStrategyFactory; private final StateMachine2 _volStateMachine; @@ -215,8 +224,8 @@ public VolumeInfo moveVolume(VolumeInfo volume, long destPoolDcId, Long destPool // Find a destination storage pool with the specified criteria DiskOffering diskOffering = _entityMgr.findById(DiskOffering.class, volume.getDiskOfferingId()); - DiskProfile dskCh = new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSize(), - diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); + DiskProfile dskCh = new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSize(), diskOffering.getTagsArray(), + diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); dskCh.setHyperType(dataDiskHyperType); storageMgr.setDiskProfileThrottling(dskCh, null, diskOffering); @@ -239,17 +248,8 @@ public Volume allocateDuplicateVolume(Volume oldVol, Long templateId) { } public VolumeVO allocateDuplicateVolumeVO(Volume oldVol, Long templateId) { - VolumeVO newVol = new VolumeVO(oldVol.getVolumeType(), - oldVol.getName(), - oldVol.getDataCenterId(), - oldVol.getDomainId(), - oldVol.getAccountId(), - oldVol.getDiskOfferingId(), - oldVol.getProvisioningType(), - oldVol.getSize(), - oldVol.getMinIops(), - oldVol.getMaxIops(), - oldVol.get_iScsiName()); + VolumeVO newVol = new VolumeVO(oldVol.getVolumeType(), oldVol.getName(), oldVol.getDataCenterId(), oldVol.getDomainId(), oldVol.getAccountId(), oldVol.getDiskOfferingId(), + oldVol.getProvisioningType(), oldVol.getSize(), oldVol.getMinIops(), oldVol.getMaxIops(), oldVol.get_iScsiName()); if (templateId != null) { newVol.setTemplateId(templateId); } else { @@ -388,8 +388,7 @@ public VolumeInfo createVolumeFromSnapshot(Volume volume, Snapshot snapshot, Use DataStoreRole dataStoreRole = getDataStoreRole(snapshot); SnapshotInfo snapInfo = snapshotFactory.getSnapshot(snapshot.getId(), dataStoreRole); - - if(snapInfo == null && dataStoreRole == DataStoreRole.Image) { + if (snapInfo == null && dataStoreRole == DataStoreRole.Image) { // snapshot is not backed up to secondary, let's do that now. snapInfo = snapshotFactory.getSnapshot(snapshot.getId(), DataStoreRole.Primary); @@ -470,8 +469,8 @@ protected DiskProfile createDiskCharacteristics(VolumeInfo volume, VirtualMachin throw new CloudRuntimeException("Template " + template.getName() + " has not been completely downloaded to zone " + dc.getId()); } - return new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), ss.getSize(), diskOffering.getTagsArray(), - diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), Storage.ImageFormat.ISO != template.getFormat() ? template.getId() : null); + return new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), ss.getSize(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), + diskOffering.isRecreatable(), Storage.ImageFormat.ISO != template.getFormat() ? template.getId() : null); } else { return new DiskProfile(volume.getId(), volume.getVolumeType(), volume.getName(), diskOffering.getId(), diskOffering.getDiskSize(), diskOffering.getTagsArray(), diskOffering.getUseLocalStorage(), diskOffering.isRecreatable(), null); @@ -479,8 +478,8 @@ protected DiskProfile createDiskCharacteristics(VolumeInfo volume, VirtualMachin } @DB - public VolumeInfo copyVolumeFromSecToPrimary(VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId, - ServiceOffering offering, DiskOffering diskOffering, List avoids, long size, HypervisorType hyperType) throws NoTransitionException { + public VolumeInfo copyVolumeFromSecToPrimary(VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId, ServiceOffering offering, + DiskOffering diskOffering, List avoids, long size, HypervisorType hyperType) throws NoTransitionException { final HashSet avoidPools = new HashSet(avoids); DiskProfile dskCh = createDiskCharacteristics(volume, template, dc, diskOffering); @@ -509,8 +508,8 @@ public VolumeInfo copyVolumeFromSecToPrimary(VolumeInfo volume, VirtualMachine v } @DB - public VolumeInfo createVolume(VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId, ServiceOffering offering, - DiskOffering diskOffering, List avoids, long size, HypervisorType hyperType) { + public VolumeInfo createVolume(VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate template, DataCenter dc, Pod pod, Long clusterId, ServiceOffering offering, DiskOffering diskOffering, + List avoids, long size, HypervisorType hyperType) { // update the volume's hv_ss_reserve (hypervisor snapshot reserve) from a disk offering (used for managed storage) volume = volService.updateHypervisorSnapshotReserveForVolume(diskOffering, volume.getId(), hyperType); @@ -600,16 +599,23 @@ public boolean volumeOnSharedStoragePool(Volume volume) { @Override public boolean volumeInactive(Volume volume) { Long vmId = volume.getInstanceId(); - if (vmId != null) { - UserVm vm = _entityMgr.findById(UserVm.class, vmId); - if (vm == null) { - return true; - } - State state = vm.getState(); - if (state.equals(State.Stopped) || state.equals(State.Destroyed)) { - return true; - } + + if (vmId == null) { + return true; + } + + UserVm vm = _entityMgr.findById(UserVm.class, vmId); + + if (vm == null) { + return true; } + + State state = vm.getState(); + + if (state.equals(State.Stopped) || state.equals(State.Destroyed)) { + return true; + } + return false; } @@ -639,12 +645,13 @@ public boolean validateVolumeSizeRange(long size) { } protected DiskProfile toDiskProfile(Volume vol, DiskOffering offering) { - return new DiskProfile(vol.getId(), vol.getVolumeType(), vol.getName(), offering.getId(), vol.getSize(), offering.getTagsArray(), offering.getUseLocalStorage(), - offering.isRecreatable(), vol.getTemplateId()); + return new DiskProfile(vol.getId(), vol.getVolumeType(), vol.getName(), offering.getId(), vol.getSize(), offering.getTagsArray(), offering.getUseLocalStorage(), offering.isRecreatable(), + vol.getTemplateId()); } @Override - public DiskProfile allocateRawVolume(Type type, String name, DiskOffering offering, Long size, Long minIops, Long maxIops, VirtualMachine vm, VirtualMachineTemplate template, Account owner) { + public DiskProfile allocateRawVolume(Type type, String name, DiskOffering offering, Long size, Long minIops, Long maxIops, VirtualMachine vm, VirtualMachineTemplate template, Account owner, + Long deviceId) { if (size == null) { size = offering.getDiskSize(); } else { @@ -654,28 +661,22 @@ public DiskProfile allocateRawVolume(Type type, String name, DiskOffering offeri minIops = minIops != null ? minIops : offering.getMinIops(); maxIops = maxIops != null ? maxIops : offering.getMaxIops(); - VolumeVO vol = new VolumeVO(type, - name, - vm.getDataCenterId(), - owner.getDomainId(), - owner.getId(), - offering.getId(), - offering.getProvisioningType(), - size, - minIops, - maxIops, - null); + VolumeVO vol = new VolumeVO(type, name, vm.getDataCenterId(), owner.getDomainId(), owner.getId(), offering.getId(), offering.getProvisioningType(), size, minIops, maxIops, null); if (vm != null) { vol.setInstanceId(vm.getId()); } - if (type.equals(Type.ROOT)) { + if (deviceId != null) { + vol.setDeviceId(deviceId); + } else if (type.equals(Type.ROOT)) { vol.setDeviceId(0l); } else { vol.setDeviceId(1l); } if (template.getFormat() == ImageFormat.ISO) { vol.setIsoId(template.getId()); + } else if (template.getTemplateType().equals(Storage.TemplateType.DATADISK)) { + vol.setTemplateId(template.getId()); } // display flag matters only for the User vms if (vm.getType() == VirtualMachine.Type.User) { @@ -698,11 +699,12 @@ public DiskProfile allocateRawVolume(Type type, String name, DiskOffering offeri } @Override - public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm, Account owner) { + public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering offering, Long rootDisksize, Long minIops, Long maxIops, VirtualMachineTemplate template, VirtualMachine vm, + Account owner) { assert (template.getFormat() != ImageFormat.ISO) : "ISO is not a template really...."; Long size = _tmpltMgr.getTemplateSize(template.getId(), vm.getDataCenterId()); - if (rootDisksize != null ) { + if (rootDisksize != null) { rootDisksize = rootDisksize * 1024 * 1024 * 1024; if (rootDisksize > size) { s_logger.debug("Using root disk size of " + rootDisksize + " Bytes for volume " + name); @@ -715,17 +717,7 @@ public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering minIops = minIops != null ? minIops : offering.getMinIops(); maxIops = maxIops != null ? maxIops : offering.getMaxIops(); - VolumeVO vol = new VolumeVO(type, - name, - vm.getDataCenterId(), - owner.getDomainId(), - owner.getId(), - offering.getId(), - offering.getProvisioningType(), - size, - minIops, - maxIops, - null); + VolumeVO vol = new VolumeVO(type, name, vm.getDataCenterId(), owner.getDomainId(), owner.getId(), offering.getId(), offering.getProvisioningType(), size, minIops, maxIops, null); vol.setFormat(getSupportedImageFormatForCluster(template.getHypervisorType())); if (vm != null) { vol.setInstanceId(vm.getId()); @@ -746,7 +738,6 @@ public DiskProfile allocateTemplatedVolume(Type type, String name, DiskOffering vol.setDisplayVolume(userVm.isDisplayVm()); } - vol = _volsDao.persist(vol); // Create event and update resource count for volumes if vm is a user vm @@ -796,16 +787,15 @@ private boolean isSupportedImageFormatForCluster(VolumeInfo volume, HypervisorTy } } - private VolumeInfo copyVolume(StoragePool rootDiskPool, VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate rootDiskTmplt, DataCenter dcVO, Pod pod, - DiskOffering diskVO, ServiceOffering svo, HypervisorType rootDiskHyperType) throws NoTransitionException { + private VolumeInfo copyVolume(StoragePool rootDiskPool, VolumeInfo volume, VirtualMachine vm, VirtualMachineTemplate rootDiskTmplt, DataCenter dcVO, Pod pod, DiskOffering diskVO, + ServiceOffering svo, HypervisorType rootDiskHyperType) throws NoTransitionException { if (!isSupportedImageFormatForCluster(volume, rootDiskHyperType)) { - throw new InvalidParameterValueException("Failed to attach volume to VM since volumes format " + volume.getFormat().getFileExtension() - + " is not compatible with the vm hypervisor type"); + throw new InvalidParameterValueException("Failed to attach volume to VM since volumes format " + volume.getFormat().getFileExtension() + " is not compatible with the vm hypervisor type"); } - VolumeInfo volumeOnPrimary = copyVolumeFromSecToPrimary(volume, vm, rootDiskTmplt, dcVO, pod, rootDiskPool.getClusterId(), svo, diskVO, new ArrayList(), - volume.getSize(), rootDiskHyperType); + VolumeInfo volumeOnPrimary = copyVolumeFromSecToPrimary(volume, vm, rootDiskTmplt, dcVO, pod, rootDiskPool.getClusterId(), svo, diskVO, new ArrayList(), volume.getSize(), + rootDiskHyperType); return volumeOnPrimary; } @@ -850,8 +840,7 @@ protected VolumeVO switchVolume(final VolumeVO existingVolume, final VirtualMach long vmTemplateId = vm.getTemplateId(); if (volTemplateId != null && volTemplateId.longValue() != vmTemplateId) { if (s_logger.isDebugEnabled()) { - s_logger.debug("switchVolume: Old Volume's templateId: " + volTemplateId + " does not match the VM's templateId: " + vmTemplateId - + ", updating templateId in the new Volume"); + s_logger.debug("switchVolume: Old Volume's templateId: " + volTemplateId + " does not match the VM's templateId: " + vmTemplateId + ", updating templateId in the new Volume"); } templateIdToUse = vmTemplateId; } @@ -1087,8 +1076,7 @@ public void prepareForMigration(VirtualMachineProfile vm, DeployDestination dest for (VolumeVO vol : vols) { VolumeInfo volumeInfo = volFactory.getVolume(vol.getId()); DataTO volTO = volumeInfo.getTO(); - DiskTO disk = storageMgr.getDiskWithThrottling(volTO, vol.getVolumeType(), vol.getDeviceId(), vol.getPath(), - vm.getServiceOfferingId(), vol.getDiskOfferingId()); + DiskTO disk = storageMgr.getDiskWithThrottling(volTO, vol.getVolumeType(), vol.getDeviceId(), vol.getPath(), vm.getServiceOfferingId(), vol.getDiskOfferingId()); DataStore dataStore = dataStoreMgr.getDataStore(vol.getPoolId(), DataStoreRole.Primary); disk.setDetails(getDetails(volumeInfo, dataStore)); @@ -1098,7 +1086,7 @@ public void prepareForMigration(VirtualMachineProfile vm, DeployDestination dest //if (vm.getType() == VirtualMachine.Type.User && vm.getTemplate().getFormat() == ImageFormat.ISO) { if (vm.getType() == VirtualMachine.Type.User) { - _tmpltMgr.prepareIsoForVmProfile(vm); + _tmpltMgr.prepareIsoForVmProfile(vm, dest); //DataTO dataTO = tmplFactory.getTemplate(vm.getTemplate().getId(), DataStoreRole.Image, vm.getVirtualMachine().getDataCenterId()).getTO(); //DiskTO iso = new DiskTO(dataTO, 3L, null, Volume.Type.ISO); //vm.addDisk(iso); @@ -1196,7 +1184,7 @@ private List getTasks(List vols, Map } else { storageMigrationEnabled = StorageMigrationEnabled.value(); } - if(storageMigrationEnabled){ + if (storageMigrationEnabled) { if (s_logger.isDebugEnabled()) { s_logger.debug("Shared volume " + vol + " will be migrated on storage pool " + assignedPool + " assigned by deploymentPlanner"); } @@ -1216,8 +1204,7 @@ private List getTasks(List vols, Map } } else { if (vol.getPoolId() == null) { - throw new StorageUnavailableException("Volume has no pool associate and also no storage pool assigned in DeployDestination, Unable to create " + vol, - Volume.class, vol.getId()); + throw new StorageUnavailableException("Volume has no pool associate and also no storage pool assigned in DeployDestination, Unable to create " + vol, Volume.class, vol.getId()); } if (s_logger.isDebugEnabled()) { s_logger.debug("No need to recreate the volume: " + vol + ", since it already has a pool assigned: " + vol.getPoolId() + ", adding disk to VM"); @@ -1242,7 +1229,6 @@ private Pair recreateVolume(VolumeVO vol, VirtualMachinePro StoragePool pool = dest.getStorageForDisks().get(vol); destPool = dataStoreMgr.getDataStore(pool.getId(), DataStoreRole.Primary); } - if (vol.getState() == Volume.State.Allocated || vol.getState() == Volume.State.Creating) { newVol = vol; } else { @@ -1261,8 +1247,9 @@ private Pair recreateVolume(VolumeVO vol, VirtualMachinePro VolumeInfo volume = volFactory.getVolume(newVol.getId(), destPool); Long templateId = newVol.getTemplateId(); for (int i = 0; i < 2; i++) { - // retry one more time in case of template reload is required for Vmware case - AsyncCallFuture future = null; + // retry one more time in case of template reload is required for VMware case + AsyncCallFuture future; + if (templateId == null) { DiskOffering diskOffering = _entityMgr.findById(DiskOffering.class, volume.getDiskOfferingId()); HypervisorType hyperType = vm.getVirtualMachine().getHypervisorType(); @@ -1277,9 +1264,13 @@ private Pair recreateVolume(VolumeVO vol, VirtualMachinePro TemplateInfo templ = tmplFactory.getReadyTemplateOnImageStore(templateId, dest.getDataCenter().getId()); if (templ == null) { - s_logger.debug("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId()); - - throw new CloudRuntimeException("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId()); + if (tmplFactory.isTemplateMarkedForDirectDownload(templateId)) { + // Template is marked for direct download bypassing Secondary Storage + templ = tmplFactory.getReadyBypassedTemplateOnPrimaryStore(templateId, destPool.getId(), dest.getHost().getId()); + } else { + s_logger.debug("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId()); + throw new CloudRuntimeException("can't find ready template: " + templateId + " for data center " + dest.getDataCenter().getId()); + } } PrimaryDataStore primaryDataStore = (PrimaryDataStore)destPool; @@ -1294,8 +1285,7 @@ private Pair recreateVolume(VolumeVO vol, VirtualMachinePro long hostId = vm.getVirtualMachine().getHostId(); future = volService.createManagedStorageVolumeFromTemplateAsync(volume, destPool.getId(), templ, hostId); - } - else { + } else { future = volService.createVolumeFromTemplateAsync(volume, destPool.getId(), templ); } } @@ -1348,17 +1338,37 @@ public void prepare(VirtualMachineProfile vm, DeployDestination dest) throws Sto } List vols = _volsDao.findUsableVolumesForInstance(vm.getId()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Checking if we need to prepare " + vols.size() + " volumes for " + vm); - } List tasks = getTasks(vols, dest.getStorageForDisks(), vm); Volume vol = null; - StoragePool pool = null; + StoragePool pool; for (VolumeTask task : tasks) { if (task.type == VolumeTaskType.NOP) { - pool = (StoragePool)dataStoreMgr.getDataStore(task.pool.getId(), DataStoreRole.Primary); vol = task.volume; + + pool = (StoragePool)dataStoreMgr.getDataStore(task.pool.getId(), DataStoreRole.Primary); + + // For zone-wide managed storage, it is possible that the VM can be started in another + // cluster. In that case, make sure that the volume is in the right access group. + if (pool.isManaged()) { + Host lastHost = _hostDao.findById(vm.getVirtualMachine().getLastHostId()); + Host host = _hostDao.findById(vm.getVirtualMachine().getHostId()); + + long lastClusterId = lastHost == null || lastHost.getClusterId() == null ? -1 : lastHost.getClusterId(); + long clusterId = host == null || host.getClusterId() == null ? -1 : host.getClusterId(); + + if (lastClusterId != clusterId) { + if (lastHost != null) { + storageMgr.removeStoragePoolFromCluster(lastHost.getId(), vol.get_iScsiName(), pool); + + DataStore storagePool = dataStoreMgr.getDataStore(pool.getId(), DataStoreRole.Primary); + + volService.revokeAccess(volFactory.getVolume(vol.getId()), lastHost, storagePool); + } + + volService.grantAccess(volFactory.getVolume(vol.getId()), host, (DataStore)pool); + } + } } else if (task.type == VolumeTaskType.MIGRATE) { pool = (StoragePool)dataStoreMgr.getDataStore(task.pool.getId(), DataStoreRole.Primary); vol = migrateVolume(task.volume, pool); @@ -1367,15 +1377,36 @@ public void prepare(VirtualMachineProfile vm, DeployDestination dest) throws Sto pool = (StoragePool)dataStoreMgr.getDataStore(result.second().getId(), DataStoreRole.Primary); vol = result.first(); } + VolumeInfo volumeInfo = volFactory.getVolume(vol.getId()); DataTO volTO = volumeInfo.getTO(); - DiskTO disk = storageMgr.getDiskWithThrottling(volTO, vol.getVolumeType(), vol.getDeviceId(), vol.getPath(), - vm.getServiceOfferingId(), vol.getDiskOfferingId()); + DiskTO disk = storageMgr.getDiskWithThrottling(volTO, vol.getVolumeType(), vol.getDeviceId(), vol.getPath(), vm.getServiceOfferingId(), vol.getDiskOfferingId()); DataStore dataStore = dataStoreMgr.getDataStore(vol.getPoolId(), DataStoreRole.Primary); disk.setDetails(getDetails(volumeInfo, dataStore)); vm.addDisk(disk); + + // If hypervisor is vSphere, check for clone type setting. + if (vm.getHypervisorType().equals(HypervisorType.VMware)) { + // retrieve clone flag. + UserVmCloneType cloneType = UserVmCloneType.linked; + Boolean value = CapacityManager.VmwareCreateCloneFull.valueIn(vol.getPoolId()); + if (value != null && value) { + cloneType = UserVmCloneType.full; + } + UserVmCloneSettingVO cloneSettingVO = _vmCloneSettingDao.findByVmId(vm.getId()); + if (cloneSettingVO != null) { + if (!cloneSettingVO.getCloneType().equals(cloneType.toString())) { + cloneSettingVO.setCloneType(cloneType.toString()); + _vmCloneSettingDao.update(cloneSettingVO.getVmId(), cloneSettingVO); + } + } else { + UserVmCloneSettingVO vmCloneSettingVO = new UserVmCloneSettingVO(vm.getId(), cloneType.toString()); + _vmCloneSettingDao.persist(vmCloneSettingVO); + } + } + } } @@ -1395,8 +1426,7 @@ public boolean canVmRestartOnAnotherServer(long vmId) { return true; } - public static final ConfigKey MaxVolumeSize = new ConfigKey(Long.class, "storage.max.volume.size", "Storage", "2000", "The maximum size for a volume (in GB).", - true); + public static final ConfigKey MaxVolumeSize = new ConfigKey(Long.class, "storage.max.volume.size", "Storage", "2000", "The maximum size for a volume (in GB).", true); public static final ConfigKey RecreatableSystemVmEnabled = new ConfigKey(Boolean.class, "recreate.systemvm.enabled", "Advanced", "false", "If true, will recreate system vm root disk whenever starting system vm", true); @@ -1407,9 +1437,12 @@ public boolean canVmRestartOnAnotherServer(long vmId) { public static final ConfigKey StorageMigrationEnabled = new ConfigKey(Boolean.class, "enable.storage.migration", "Storage", "true", "Enable/disable storage migration across primary storage", true); + static final ConfigKey VolumeUrlCheck = new ConfigKey("Advanced", Boolean.class, "volume.url.check", "true", + "Check the url for a volume before downloading it from the management server. Set to flase when you managment has no internet access.", true); + @Override public ConfigKey[] getConfigKeys() { - return new ConfigKey[] {RecreatableSystemVmEnabled, MaxVolumeSize, StorageHAMigrationEnabled, StorageMigrationEnabled, CustomDiskOfferingMaxSize, CustomDiskOfferingMinSize}; + return new ConfigKey[] {RecreatableSystemVmEnabled, MaxVolumeSize, StorageHAMigrationEnabled, StorageMigrationEnabled, CustomDiskOfferingMaxSize, CustomDiskOfferingMinSize, VolumeUrlCheck}; } @Override @@ -1422,7 +1455,7 @@ public boolean configure(String name, Map params) throws Configu return true; } - private void cleanupVolumeDuringAttachFailure(Long volumeId) { + private void cleanupVolumeDuringAttachFailure(Long volumeId, Long vmId) { VolumeVO volume = _volsDao.findById(volumeId); if (volume == null) { return; @@ -1432,6 +1465,12 @@ private void cleanupVolumeDuringAttachFailure(Long volumeId) { s_logger.debug("Remove volume: " + volume.getId() + ", as it's leftover from last mgt server stop"); _volsDao.remove(volume.getId()); } + + if (volume.getState().equals(Volume.State.Attaching)) { + s_logger.warn("Vol: " + volume.getName() + " failed to attach to VM: " + _userVmDao.findById(vmId).getHostName() + " on last mgt server stop, changing state back to Ready"); + volume.setState(Volume.State.Ready); + _volsDao.update(volumeId, volume); + } } private void cleanupVolumeDuringMigrationFailure(Long volumeId, Long destPoolId) { @@ -1468,14 +1507,13 @@ private void cleanupVolumeDuringSnapshotFailure(Long volumeId, Long snapshotId) @Override public void cleanupStorageJobs() { //clean up failure jobs related to volume - List jobs = _jobMgr.findFailureAsyncJobs(VmWorkAttachVolume.class.getName(), - VmWorkMigrateVolume.class.getName(), VmWorkTakeVolumeSnapshot.class.getName()); + List jobs = _jobMgr.findFailureAsyncJobs(VmWorkAttachVolume.class.getName(), VmWorkMigrateVolume.class.getName(), VmWorkTakeVolumeSnapshot.class.getName()); for (AsyncJobVO job : jobs) { try { if (job.getCmd().equalsIgnoreCase(VmWorkAttachVolume.class.getName())) { VmWorkAttachVolume work = VmWorkSerializer.deserialize(VmWorkAttachVolume.class, job.getCmdInfo()); - cleanupVolumeDuringAttachFailure(work.getVolumeId()); + cleanupVolumeDuringAttachFailure(work.getVolumeId(), work.getVmId()); } else if (job.getCmd().equalsIgnoreCase(VmWorkMigrateVolume.class.getName())) { VmWorkMigrateVolume work = VmWorkSerializer.deserialize(VmWorkMigrateVolume.class, job.getCmdInfo()); cleanupVolumeDuringMigrationFailure(work.getVolumeId(), work.getDestPoolId()); @@ -1511,11 +1549,10 @@ public void destroyVolume(Volume volume) { } // FIXME - All this is boiler plate code and should be done as part of state transition. This shouldn't be part of orchestrator. // publish usage event for the volume - UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), - Volume.class.getName(), volume.getUuid(), volume.isDisplayVolume()); + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_VOLUME_DELETE, volume.getAccountId(), volume.getDataCenterId(), volume.getId(), volume.getName(), Volume.class.getName(), + volume.getUuid(), volume.isDisplayVolume()); _resourceLimitMgr.decrementResourceCount(volume.getAccountId(), ResourceType.volume, volume.isDisplay()); - //FIXME - why recalculate and not decrement - _resourceLimitMgr.recalculateResourceCount(volume.getAccountId(), volume.getDomainId(), ResourceType.primary_storage.getOrdinal()); + _resourceLimitMgr.decrementResourceCount(volume.getAccountId(), ResourceType.primary_storage, volume.isDisplay(), new Long(volume.getSize())); } catch (Exception e) { s_logger.debug("Failed to destroy volume" + volume.getId(), e); throw new CloudRuntimeException("Failed to destroy volume" + volume.getId(), e); @@ -1539,13 +1576,16 @@ public void updateVolumeDiskChain(long volumeId, String path, String chainInfo) VolumeVO vol = _volsDao.findById(volumeId); boolean needUpdate = false; // Volume path is not getting updated in the DB, need to find reason and fix the issue. - if (vol.getPath() == null) + if (vol.getPath() == null) { return; - if (!vol.getPath().equalsIgnoreCase(path)) + } + if (!vol.getPath().equalsIgnoreCase(path)) { needUpdate = true; + } - if (chainInfo != null && (vol.getChainInfo() == null || !chainInfo.equalsIgnoreCase(vol.getChainInfo()))) + if (chainInfo != null && (vol.getChainInfo() == null || !chainInfo.equalsIgnoreCase(vol.getChainInfo()))) { needUpdate = true; + } if (needUpdate) { s_logger.info("Update volume disk chain info. vol: " + vol.getId() + ", " + vol.getPath() + " -> " + path + ", " + vol.getChainInfo() + " -> " + chainInfo); diff --git a/engine/orchestration/test/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java b/engine/orchestration/test/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java index 2d15403a8657..b0283f35c1b3 100644 --- a/engine/orchestration/test/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java +++ b/engine/orchestration/test/org/apache/cloudstack/engine/orchestration/NetworkOrchestratorTest.java @@ -26,10 +26,15 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Arrays; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.offerings.NetworkOfferingVO; import org.apache.log4j.Logger; import org.junit.Before; import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; import org.mockito.Matchers; import com.cloud.network.Network; @@ -56,6 +61,7 @@ /** * NetworkManagerImpl implements NetworkManager. */ +@RunWith(JUnit4.class) public class NetworkOrchestratorTest extends TestCase { static final Logger s_logger = Logger.getLogger(NetworkOrchestratorTest.class); @@ -65,6 +71,10 @@ public class NetworkOrchestratorTest extends TestCase { String dhcpProvider = "VirtualRouter"; NetworkGuru guru = mock(NetworkGuru.class); + NetworkOfferingVO networkOffering = mock(NetworkOfferingVO.class); + + private static final long networkOfferingId = 1l; + @Override @Before public void setUp() { @@ -90,6 +100,9 @@ public void setUp() { List networkGurus = new ArrayList(); networkGurus.add(guru); testOrchastrator.networkGurus = networkGurus; + + when(networkOffering.getGuestType()).thenReturn(GuestType.L2); + when(networkOffering.getId()).thenReturn(networkOfferingId); } @Test @@ -159,4 +172,32 @@ public void testDontRemoveDhcpServiceWhenNotProvided() { verify(testOrchastrator._ntwkSrvcDao, never()).getProviderForServiceInNetwork(network.getId(), Service.Dhcp); verify(testOrchastrator._networksDao, times(1)).findById(nic.getNetworkId()); } + + @Test + public void testCheckL2OfferingServicesEmptyServices() { + when(testOrchastrator._networkModel.listNetworkOfferingServices(networkOfferingId)).thenReturn(new ArrayList<>()); + when(testOrchastrator._networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.UserData)).thenReturn(false); + testOrchastrator.checkL2OfferingServices(networkOffering); + } + + @Test + public void testCheckL2OfferingServicesUserDataOnly() { + when(testOrchastrator._networkModel.listNetworkOfferingServices(networkOfferingId)).thenReturn(Arrays.asList(Service.UserData)); + when(testOrchastrator._networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.UserData)).thenReturn(true); + testOrchastrator.checkL2OfferingServices(networkOffering); + } + + @Test(expected = InvalidParameterValueException.class) + public void testCheckL2OfferingServicesMultipleServicesIncludingUserData() { + when(testOrchastrator._networkModel.listNetworkOfferingServices(networkOfferingId)).thenReturn(Arrays.asList(Service.UserData, Service.Dhcp)); + when(testOrchastrator._networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.UserData)).thenReturn(true); + testOrchastrator.checkL2OfferingServices(networkOffering); + } + + @Test(expected = InvalidParameterValueException.class) + public void testCheckL2OfferingServicesMultipleServicesNotIncludingUserData() { + when(testOrchastrator._networkModel.listNetworkOfferingServices(networkOfferingId)).thenReturn(Arrays.asList(Service.Dns, Service.Dhcp)); + when(testOrchastrator._networkModel.areServicesSupportedByNetworkOffering(networkOfferingId, Service.UserData)).thenReturn(false); + testOrchastrator.checkL2OfferingServices(networkOffering); + } } diff --git a/engine/orchestration/test/resource/provisioningContext.xml b/engine/orchestration/test/resource/provisioningContext.xml index 0320be330876..4fff3bff7ade 100644 --- a/engine/orchestration/test/resource/provisioningContext.xml +++ b/engine/orchestration/test/resource/provisioningContext.xml @@ -21,13 +21,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/engine/pom.xml b/engine/pom.xml index cbecefca3312..4fc66d12a604 100644 --- a/engine/pom.xml +++ b/engine/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../pom.xml @@ -46,14 +46,15 @@ api orchestration + schema storage storage/volume storage/image storage/datamotion storage/cache storage/snapshot + storage/configdrive components-api - schema network service diff --git a/engine/schema/pom.xml b/engine/schema/pom.xml index 4bca9eee0add..430c2cc0c0c1 100644 --- a/engine/schema/pom.xml +++ b/engine/schema/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../pom.xml diff --git a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml index 691647829e94..84c27583925b 100644 --- a/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml +++ b/engine/schema/resources/META-INF/cloudstack/core/spring-engine-schema-core-daos-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > + @@ -176,8 +181,8 @@ - - + + @@ -211,6 +216,7 @@ + @@ -266,10 +272,9 @@ - + - @@ -325,6 +330,7 @@ + @@ -348,5 +354,6 @@ - + + diff --git a/engine/schema/resources/META-INF/cloudstack/system/spring-engine-schema-system-checkers-context.xml b/engine/schema/resources/META-INF/cloudstack/system/spring-engine-schema-system-checkers-context.xml index 2a308873f6a9..bfb3425fc304 100644 --- a/engine/schema/resources/META-INF/cloudstack/system/spring-engine-schema-system-checkers-context.xml +++ b/engine/schema/resources/META-INF/cloudstack/system/spring-engine-schema-system-checkers-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/setup/db/db/create-default-role-api-mappings.sql b/engine/schema/resources/META-INF/db/create-default-role-api-mappings.sql similarity index 100% rename from setup/db/db/create-default-role-api-mappings.sql rename to engine/schema/resources/META-INF/db/create-default-role-api-mappings.sql diff --git a/setup/db/db/data-217to218.sql b/engine/schema/resources/META-INF/db/data-217to218.sql similarity index 100% rename from setup/db/db/data-217to218.sql rename to engine/schema/resources/META-INF/db/data-217to218.sql diff --git a/setup/db/db/schema-20to21.sql b/engine/schema/resources/META-INF/db/schema-20to21.sql similarity index 100% rename from setup/db/db/schema-20to21.sql rename to engine/schema/resources/META-INF/db/schema-20to21.sql diff --git a/setup/db/db/schema-217to218.sql b/engine/schema/resources/META-INF/db/schema-217to218.sql similarity index 100% rename from setup/db/db/schema-217to218.sql rename to engine/schema/resources/META-INF/db/schema-217to218.sql diff --git a/setup/db/db/schema-21to22-cleanup.sql b/engine/schema/resources/META-INF/db/schema-21to22-cleanup.sql similarity index 100% rename from setup/db/db/schema-21to22-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-21to22-cleanup.sql diff --git a/setup/db/db/schema-21to22-premium.sql b/engine/schema/resources/META-INF/db/schema-21to22-premium.sql similarity index 100% rename from setup/db/db/schema-21to22-premium.sql rename to engine/schema/resources/META-INF/db/schema-21to22-premium.sql diff --git a/setup/db/db/schema-21to22.sql b/engine/schema/resources/META-INF/db/schema-21to22.sql similarity index 99% rename from setup/db/db/schema-21to22.sql rename to engine/schema/resources/META-INF/db/schema-21to22.sql index 0c0ad7d66ff2..7ab72287484f 100755 --- a/setup/db/db/schema-21to22.sql +++ b/engine/schema/resources/META-INF/db/schema-21to22.sql @@ -960,15 +960,15 @@ INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest UPDATE `cloud`.`guest_os` SET name = display_name; INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (3, 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.qcow2.bz2', 'ec463e677054f280f152fcc264255d2f', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM'); + VALUES (3, 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloudstack.org/releases/2.2.0/systemvm.qcow2.bz2', 'ec463e677054f280f152fcc264255d2f', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (8, 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/releases/2.2.0/systemvm.ova', '3c9d4c704af44ebd1736e1bc78cec1fa', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware'); + VALUES (8, 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloudstack.org/releases/2.2.0/systemvm.ova', '3c9d4c704af44ebd1736e1bc78cec1fa', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware'); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, display_text, enable_password, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable) - VALUES (4, 'centos55-x86_64', 'CentOS 5.5(64-bit) no GUI (KVM)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/eec2209b-9875-3c8d-92be-c001bd8a0faf.qcow2.bz2', 'ed0e788280ff2912ea40f7f91ca7a249', 'CentOS 5.5(64-bit) no GUI (KVM)', 0, 'QCOW2', 112, 1, 1, 'KVM', 1); + VALUES (4, 'centos55-x86_64', 'CentOS 5.5(64-bit) no GUI (KVM)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloudstack.org/releases/2.2.0/eec2209b-9875-3c8d-92be-c001bd8a0faf.qcow2.bz2', 'ed0e788280ff2912ea40f7f91ca7a249', 'CentOS 5.5(64-bit) no GUI (KVM)', 0, 'QCOW2', 112, 1, 1, 'KVM', 1); INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable) - VALUES (7, 'centos53-x64', 'CentOS 5.3(64-bit) no GUI (vSphere)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/releases/2.2.0/CentOS5.3-x86_64.ova', 'f6f881b7f2292948d8494db837fe0f47', 0, 'CentOS 5.3(64-bit) no GUI (vSphere)', 'OVA', 12, 1, 1, 'VMware', 1); + VALUES (7, 'centos53-x64', 'CentOS 5.3(64-bit) no GUI (vSphere)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloudstack.org/releases/2.2.0/CentOS5.3-x86_64.ova', 'f6f881b7f2292948d8494db837fe0f47', 0, 'CentOS 5.3(64-bit) no GUI (vSphere)', 'OVA', 12, 1, 1, 'VMware', 1); UPDATE vm_instance SET guest_os_id=15 where vm_template_id=1; UPDATE vm_instance SET vm_template_id=(SELECT id FROM vm_template WHERE name='systemvm-xenserver-2.2.4' AND removed IS NULL) where vm_template_id=1; diff --git a/setup/db/db/schema-2210to2211.sql b/engine/schema/resources/META-INF/db/schema-2210to2211.sql similarity index 100% rename from setup/db/db/schema-2210to2211.sql rename to engine/schema/resources/META-INF/db/schema-2210to2211.sql diff --git a/setup/db/db/schema-2211to2212-premium.sql b/engine/schema/resources/META-INF/db/schema-2211to2212-premium.sql similarity index 100% rename from setup/db/db/schema-2211to2212-premium.sql rename to engine/schema/resources/META-INF/db/schema-2211to2212-premium.sql diff --git a/setup/db/db/schema-2211to2212.sql b/engine/schema/resources/META-INF/db/schema-2211to2212.sql similarity index 100% rename from setup/db/db/schema-2211to2212.sql rename to engine/schema/resources/META-INF/db/schema-2211to2212.sql diff --git a/setup/db/db/schema-2212to2213.sql b/engine/schema/resources/META-INF/db/schema-2212to2213.sql similarity index 100% rename from setup/db/db/schema-2212to2213.sql rename to engine/schema/resources/META-INF/db/schema-2212to2213.sql diff --git a/setup/db/db/schema-2213to2214.sql b/engine/schema/resources/META-INF/db/schema-2213to2214.sql similarity index 100% rename from setup/db/db/schema-2213to2214.sql rename to engine/schema/resources/META-INF/db/schema-2213to2214.sql diff --git a/setup/db/db/schema-2214to30-cleanup.sql b/engine/schema/resources/META-INF/db/schema-2214to30-cleanup.sql similarity index 100% rename from setup/db/db/schema-2214to30-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-2214to30-cleanup.sql diff --git a/setup/db/db/schema-2214to30.sql b/engine/schema/resources/META-INF/db/schema-2214to30.sql similarity index 99% rename from setup/db/db/schema-2214to30.sql rename to engine/schema/resources/META-INF/db/schema-2214to30.sql index 326e9a71cb6d..f1d2d7dd4e30 100755 --- a/setup/db/db/schema-2214to30.sql +++ b/engine/schema/resources/META-INF/db/schema-2214to30.sql @@ -626,7 +626,7 @@ UPDATE `cloud`.`event` e set e.domain_id = (select acc.domain_id from `cloud`.`a update `cloud`.`vm_template` set removed=now() where id=2; INSERT INTO `cloud`.`vm_template` (id, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable) - VALUES (5, 'centos56-x86_64-xen', 'CentOS 5.6(64-bit) no GUI (XenServer)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/templates/builtin/centos56-x86_64.vhd.bz2', '905cec879afd9c9d22ecc8036131a180', 0, 'CentOS 5.6(64-bit) no GUI (XenServer)', 'VHD', 12, 1, 1, 'XenServer', 1); + VALUES (5, 'centos56-x86_64-xen', 'CentOS 5.6(64-bit) no GUI (XenServer)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloudstack.org/templates/builtin/centos56-x86_64.vhd.bz2', '905cec879afd9c9d22ecc8036131a180', 0, 'CentOS 5.6(64-bit) no GUI (XenServer)', 'VHD', 12, 1, 1, 'XenServer', 1); DELETE from `cloud`.`configuration` where name='firewall.rule.ui.enabled'; diff --git a/setup/db/db/schema-221to222-cleanup.sql b/engine/schema/resources/META-INF/db/schema-221to222-cleanup.sql similarity index 100% rename from setup/db/db/schema-221to222-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-221to222-cleanup.sql diff --git a/setup/db/db/schema-221to222-premium.sql b/engine/schema/resources/META-INF/db/schema-221to222-premium.sql similarity index 100% rename from setup/db/db/schema-221to222-premium.sql rename to engine/schema/resources/META-INF/db/schema-221to222-premium.sql diff --git a/setup/db/db/schema-221to222.sql b/engine/schema/resources/META-INF/db/schema-221to222.sql similarity index 100% rename from setup/db/db/schema-221to222.sql rename to engine/schema/resources/META-INF/db/schema-221to222.sql diff --git a/setup/db/db/schema-222to224-cleanup.sql b/engine/schema/resources/META-INF/db/schema-222to224-cleanup.sql similarity index 100% rename from setup/db/db/schema-222to224-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-222to224-cleanup.sql diff --git a/setup/db/db/schema-222to224-premium.sql b/engine/schema/resources/META-INF/db/schema-222to224-premium.sql similarity index 100% rename from setup/db/db/schema-222to224-premium.sql rename to engine/schema/resources/META-INF/db/schema-222to224-premium.sql diff --git a/setup/db/db/schema-222to224.sql b/engine/schema/resources/META-INF/db/schema-222to224.sql similarity index 100% rename from setup/db/db/schema-222to224.sql rename to engine/schema/resources/META-INF/db/schema-222to224.sql diff --git a/setup/db/db/schema-224to225-cleanup.sql b/engine/schema/resources/META-INF/db/schema-224to225-cleanup.sql similarity index 100% rename from setup/db/db/schema-224to225-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-224to225-cleanup.sql diff --git a/setup/db/db/schema-224to225.sql b/engine/schema/resources/META-INF/db/schema-224to225.sql similarity index 100% rename from setup/db/db/schema-224to225.sql rename to engine/schema/resources/META-INF/db/schema-224to225.sql diff --git a/setup/db/db/schema-225to226.sql b/engine/schema/resources/META-INF/db/schema-225to226.sql similarity index 100% rename from setup/db/db/schema-225to226.sql rename to engine/schema/resources/META-INF/db/schema-225to226.sql diff --git a/setup/db/db/schema-227to228-premium.sql b/engine/schema/resources/META-INF/db/schema-227to228-premium.sql similarity index 100% rename from setup/db/db/schema-227to228-premium.sql rename to engine/schema/resources/META-INF/db/schema-227to228-premium.sql diff --git a/setup/db/db/schema-227to228.sql b/engine/schema/resources/META-INF/db/schema-227to228.sql similarity index 100% rename from setup/db/db/schema-227to228.sql rename to engine/schema/resources/META-INF/db/schema-227to228.sql diff --git a/setup/db/db/schema-228to229.sql b/engine/schema/resources/META-INF/db/schema-228to229.sql similarity index 100% rename from setup/db/db/schema-228to229.sql rename to engine/schema/resources/META-INF/db/schema-228to229.sql diff --git a/setup/db/db/schema-229to2210.sql b/engine/schema/resources/META-INF/db/schema-229to2210.sql similarity index 100% rename from setup/db/db/schema-229to2210.sql rename to engine/schema/resources/META-INF/db/schema-229to2210.sql diff --git a/setup/db/db/schema-22beta1to22beta2.sql b/engine/schema/resources/META-INF/db/schema-22beta1to22beta2.sql similarity index 100% rename from setup/db/db/schema-22beta1to22beta2.sql rename to engine/schema/resources/META-INF/db/schema-22beta1to22beta2.sql diff --git a/setup/db/db/schema-22beta3to22beta4.sql b/engine/schema/resources/META-INF/db/schema-22beta3to22beta4.sql similarity index 100% rename from setup/db/db/schema-22beta3to22beta4.sql rename to engine/schema/resources/META-INF/db/schema-22beta3to22beta4.sql diff --git a/setup/db/db/schema-301to302-cleanup.sql b/engine/schema/resources/META-INF/db/schema-301to302-cleanup.sql similarity index 100% rename from setup/db/db/schema-301to302-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-301to302-cleanup.sql diff --git a/setup/db/db/schema-301to302.sql b/engine/schema/resources/META-INF/db/schema-301to302.sql similarity index 100% rename from setup/db/db/schema-301to302.sql rename to engine/schema/resources/META-INF/db/schema-301to302.sql diff --git a/setup/db/db/schema-302to303.sql b/engine/schema/resources/META-INF/db/schema-302to303.sql similarity index 100% rename from setup/db/db/schema-302to303.sql rename to engine/schema/resources/META-INF/db/schema-302to303.sql diff --git a/setup/db/db/schema-302to40-cleanup.sql b/engine/schema/resources/META-INF/db/schema-302to40-cleanup.sql similarity index 100% rename from setup/db/db/schema-302to40-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-302to40-cleanup.sql diff --git a/setup/db/db/schema-302to40.sql b/engine/schema/resources/META-INF/db/schema-302to40.sql similarity index 100% rename from setup/db/db/schema-302to40.sql rename to engine/schema/resources/META-INF/db/schema-302to40.sql diff --git a/setup/db/db/schema-304to305-cleanup.sql b/engine/schema/resources/META-INF/db/schema-304to305-cleanup.sql similarity index 100% rename from setup/db/db/schema-304to305-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-304to305-cleanup.sql diff --git a/setup/db/db/schema-304to305.sql b/engine/schema/resources/META-INF/db/schema-304to305.sql similarity index 100% rename from setup/db/db/schema-304to305.sql rename to engine/schema/resources/META-INF/db/schema-304to305.sql diff --git a/setup/db/db/schema-305to306-cleanup.sql b/engine/schema/resources/META-INF/db/schema-305to306-cleanup.sql similarity index 100% rename from setup/db/db/schema-305to306-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-305to306-cleanup.sql diff --git a/setup/db/db/schema-305to306.sql b/engine/schema/resources/META-INF/db/schema-305to306.sql similarity index 100% rename from setup/db/db/schema-305to306.sql rename to engine/schema/resources/META-INF/db/schema-305to306.sql diff --git a/setup/db/db/schema-306to307.sql b/engine/schema/resources/META-INF/db/schema-306to307.sql similarity index 100% rename from setup/db/db/schema-306to307.sql rename to engine/schema/resources/META-INF/db/schema-306to307.sql diff --git a/setup/db/db/schema-307to410-cleanup.sql b/engine/schema/resources/META-INF/db/schema-307to410-cleanup.sql similarity index 100% rename from setup/db/db/schema-307to410-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-307to410-cleanup.sql diff --git a/setup/db/db/schema-307to410.sql b/engine/schema/resources/META-INF/db/schema-307to410.sql similarity index 100% rename from setup/db/db/schema-307to410.sql rename to engine/schema/resources/META-INF/db/schema-307to410.sql diff --git a/setup/db/db/schema-30to301.sql b/engine/schema/resources/META-INF/db/schema-30to301.sql similarity index 100% rename from setup/db/db/schema-30to301.sql rename to engine/schema/resources/META-INF/db/schema-30to301.sql diff --git a/setup/db/db/schema-40to410-cleanup.sql b/engine/schema/resources/META-INF/db/schema-40to410-cleanup.sql similarity index 100% rename from setup/db/db/schema-40to410-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-40to410-cleanup.sql diff --git a/setup/db/db/schema-40to410.sql b/engine/schema/resources/META-INF/db/schema-40to410.sql similarity index 100% rename from setup/db/db/schema-40to410.sql rename to engine/schema/resources/META-INF/db/schema-40to410.sql diff --git a/engine/schema/resources/META-INF/db/schema-41000to41100-cleanup.sql b/engine/schema/resources/META-INF/db/schema-41000to41100-cleanup.sql new file mode 100644 index 000000000000..d7a080efd166 --- /dev/null +++ b/engine/schema/resources/META-INF/db/schema-41000to41100-cleanup.sql @@ -0,0 +1,69 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade cleanup from 4.10.0.0 to 4.11.0.0 +--; + +DELETE FROM `cloud`.`configuration` WHERE name='snapshot.backup.rightafter'; +-- CLOUDSTACK-9914: Alter quota_tariff to support currency values up to 5 decimal places +ALTER TABLE `cloud_usage`.`quota_tariff` MODIFY `currency_value` DECIMAL(15,5) not null; + +DROP VIEW IF EXISTS `cloud`.`user_view`; +CREATE VIEW `cloud`.`user_view` AS + select + user.id, + user.uuid, + user.username, + user.password, + user.firstname, + user.lastname, + user.email, + user.state, + user.api_key, + user.secret_key, + user.created, + user.removed, + user.timezone, + user.registration_token, + user.is_registered, + user.incorrect_login_attempts, + user.source, + user.default, + account.id account_id, + account.uuid account_uuid, + account.account_name account_name, + account.type account_type, + account.role_id account_role_id, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path, + async_job.id job_id, + async_job.uuid job_uuid, + async_job.job_status job_status, + async_job.account_id job_account_id + from + `cloud`.`user` + inner join + `cloud`.`account` ON user.account_id = account.id + inner join + `cloud`.`domain` ON account.domain_id = domain.id + left join + `cloud`.`async_job` ON async_job.instance_id = user.id + and async_job.instance_type = 'User' + and async_job.job_status = 0; diff --git a/engine/schema/resources/META-INF/db/schema-41000to41100.sql b/engine/schema/resources/META-INF/db/schema-41000to41100.sql new file mode 100644 index 000000000000..b3efce4cbbce --- /dev/null +++ b/engine/schema/resources/META-INF/db/schema-41000to41100.sql @@ -0,0 +1,610 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade from 4.10.0.0 to 4.11.0.0 +--; + +--; +-- Stored procedure to do idempotent column add; +--; +DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_ADD_COLUMN`; + +CREATE PROCEDURE `cloud`.`IDEMPOTENT_ADD_COLUMN` ( + IN in_table_name VARCHAR(200) + , IN in_column_name VARCHAR(200) + , IN in_column_definition VARCHAR(1000) +) +BEGIN + + DECLARE CONTINUE HANDLER FOR 1060 BEGIN END; SET @ddl = CONCAT('ALTER TABLE ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', 'ADD COLUMN') ; SET @ddl = CONCAT(@ddl, ' ', in_column_name); SET @ddl = CONCAT(@ddl, ' ', in_column_definition); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; + +DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_DROP_FOREIGN_KEY`; + +CREATE PROCEDURE `cloud`.`IDEMPOTENT_DROP_FOREIGN_KEY` ( + IN in_table_name VARCHAR(200) + , IN in_foreign_key_name VARCHAR(200) +) +BEGIN + + DECLARE CONTINUE HANDLER FOR 1091 BEGIN END; SET @ddl = CONCAT('ALTER TABLE ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', ' DROP FOREIGN KEY '); SET @ddl = CONCAT(@ddl, ' ', in_foreign_key_name); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; + +DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_DROP_INDEX`; + +CREATE PROCEDURE `cloud`.`IDEMPOTENT_DROP_INDEX` ( + IN in_index_name VARCHAR(200) + , IN in_table_name VARCHAR(200) +) +BEGIN + + DECLARE CONTINUE HANDLER FOR 1091 BEGIN END; SET @ddl = CONCAT('DROP INDEX ', in_index_name); SET @ddl = CONCAT(@ddl, ' ', ' ON ') ; SET @ddl = CONCAT(@ddl, ' ', in_table_name); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; + +DROP PROCEDURE IF EXISTS `cloud`.`IDEMPOTENT_CREATE_UNIQUE_INDEX`; + +CREATE PROCEDURE `cloud`.`IDEMPOTENT_CREATE_UNIQUE_INDEX` ( + IN in_index_name VARCHAR(200) + , IN in_table_name VARCHAR(200) + , IN in_index_definition VARCHAR(1000) +) +BEGIN + + DECLARE CONTINUE HANDLER FOR 1061 BEGIN END; SET @ddl = CONCAT('CREATE UNIQUE INDEX ', in_index_name); SET @ddl = CONCAT(@ddl, ' ', ' ON ') ; SET @ddl = CONCAT(@ddl, ' ', in_table_name); SET @ddl = CONCAT(@ddl, ' ', in_index_definition); PREPARE stmt FROM @ddl; EXECUTE stmt; DEALLOCATE PREPARE stmt; END; + +-- Add For VPC flag +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.network_offerings','for_vpc', 'INT(1) NOT NULL DEFAULT 0'); + +UPDATE cloud.network_offerings o +SET for_vpc = 1 +where + o.conserve_mode = 0 + and o.guest_type = 'Isolated' + and exists( + SELECT id + from cloud.ntwk_offering_service_map + where network_offering_id = o.id and ( + provider in ('VpcVirtualRouter', 'InternalLbVm', 'JuniperContrailVpcRouter') + or service in ('NetworkACL') + ) + ); + +UPDATE `cloud`.`configuration` SET value = '600', default_value = '600' WHERE category = 'Advanced' AND name = 'router.aggregation.command.each.timeout'; + +-- CA framework changes +DELETE from `cloud`.`configuration` where name='ssl.keystore'; + +-- Certificate Revocation List +CREATE TABLE IF NOT EXISTS `cloud`.`crl` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `serial` varchar(255) UNIQUE NOT NULL COMMENT 'certificate\'s serial number as hex string', + `cn` varchar(255) COMMENT 'certificate\'s common name', + `revoker_uuid` varchar(40) COMMENT 'revoker user account uuid', + `revoked` datetime COMMENT 'date of revocation', + PRIMARY KEY (`id`), + KEY (`serial`), + UNIQUE KEY (`serial`, `cn`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Host HA feature +CREATE TABLE IF NOT EXISTS `cloud`.`ha_config` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `resource_id` bigint(20) unsigned DEFAULT NULL COMMENT 'id of the resource', + `resource_type` varchar(255) NOT NULL COMMENT 'the type of the resource', + `enabled` int(1) unsigned DEFAULT '0' COMMENT 'is HA enabled for the resource', + `ha_state` varchar(255) DEFAULT 'Disabled' COMMENT 'HA state', + `provider` varchar(255) DEFAULT NULL COMMENT 'HA provider', + `update_count` bigint(20) unsigned NOT NULL DEFAULT '0' COMMENT 'state based incr-only counter for atomic ha_state updates', + `update_time` datetime COMMENT 'last ha_state update datetime', + `mgmt_server_id` bigint(20) unsigned DEFAULT NULL COMMENT 'management server id that is responsible for the HA for the resource', + PRIMARY KEY (`id`), + KEY `i_ha_config__enabled` (`enabled`), + KEY `i_ha_config__ha_state` (`ha_state`), + KEY `i_ha_config__mgmt_server_id` (`mgmt_server_id`), + UNIQUE KEY (`resource_id`, `resource_type`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DELETE from `cloud`.`configuration` where name='outofbandmanagement.sync.interval'; + +-- Annotations specifc changes following +CREATE TABLE IF NOT EXISTS `cloud`.`annotations` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `uuid` varchar(40) UNIQUE, + `annotation` text, + `entity_uuid` varchar(40), + `entity_type` varchar(32), + `user_uuid` varchar(40), + `created` datetime COMMENT 'date of creation', + `removed` datetime COMMENT 'date of removal', + PRIMARY KEY (`id`), + KEY (`uuid`), + KEY `i_entity` (`entity_uuid`, `entity_type`, `created`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +DROP VIEW IF EXISTS `cloud`.`last_annotation_view`; +CREATE VIEW `cloud`.`last_annotation_view` AS + SELECT + `annotations`.`uuid` AS `uuid`, + `annotations`.`annotation` AS `annotation`, + `annotations`.`entity_uuid` AS `entity_uuid`, + `annotations`.`entity_type` AS `entity_type`, + `annotations`.`user_uuid` AS `user_uuid`, + `annotations`.`created` AS `created`, + `annotations`.`removed` AS `removed` + FROM + `annotations` + WHERE + `annotations`.`created` IN (SELECT + MAX(`annotations`.`created`) + FROM + `annotations` + WHERE + `annotations`.`removed` IS NULL + GROUP BY `annotations`.`entity_uuid`); + +-- Host HA changes: +DROP VIEW IF EXISTS `cloud`.`host_view`; +CREATE VIEW `cloud`.`host_view` AS + SELECT + host.id, + host.uuid, + host.name, + host.status, + host.disconnected, + host.type, + host.private_ip_address, + host.version, + host.hypervisor_type, + host.hypervisor_version, + host.capabilities, + host.last_ping, + host.created, + host.removed, + host.resource_state, + host.mgmt_server_id, + host.cpu_sockets, + host.cpus, + host.speed, + host.ram, + cluster.id cluster_id, + cluster.uuid cluster_uuid, + cluster.name cluster_name, + cluster.cluster_type, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + data_center.networktype data_center_type, + host_pod_ref.id pod_id, + host_pod_ref.uuid pod_uuid, + host_pod_ref.name pod_name, + host_tags.tag, + guest_os_category.id guest_os_category_id, + guest_os_category.uuid guest_os_category_uuid, + guest_os_category.name guest_os_category_name, + mem_caps.used_capacity memory_used_capacity, + mem_caps.reserved_capacity memory_reserved_capacity, + cpu_caps.used_capacity cpu_used_capacity, + cpu_caps.reserved_capacity cpu_reserved_capacity, + async_job.id job_id, + async_job.uuid job_uuid, + async_job.job_status job_status, + async_job.account_id job_account_id, + oobm.enabled AS `oobm_enabled`, + oobm.power_state AS `oobm_power_state`, + ha_config.enabled AS `ha_enabled`, + ha_config.ha_state AS `ha_state`, + ha_config.provider AS `ha_provider`, + `last_annotation_view`.`annotation` AS `annotation`, + `last_annotation_view`.`created` AS `last_annotated`, + `user`.`username` AS `username` + FROM + `cloud`.`host` + LEFT JOIN + `cloud`.`cluster` ON host.cluster_id = cluster.id + LEFT JOIN + `cloud`.`data_center` ON host.data_center_id = data_center.id + LEFT JOIN + `cloud`.`host_pod_ref` ON host.pod_id = host_pod_ref.id + LEFT JOIN + `cloud`.`host_details` ON host.id = host_details.host_id + AND host_details.name = 'guest.os.category.id' + LEFT JOIN + `cloud`.`guest_os_category` ON guest_os_category.id = CONVERT ( host_details.value, UNSIGNED ) + LEFT JOIN + `cloud`.`host_tags` ON host_tags.host_id = host.id + LEFT JOIN + `cloud`.`op_host_capacity` mem_caps ON host.id = mem_caps.host_id + AND mem_caps.capacity_type = 0 + LEFT JOIN + `cloud`.`op_host_capacity` cpu_caps ON host.id = cpu_caps.host_id + AND cpu_caps.capacity_type = 1 + LEFT JOIN + `cloud`.`async_job` ON async_job.instance_id = host.id + AND async_job.instance_type = 'Host' + AND async_job.job_status = 0 + LEFT JOIN + `cloud`.`oobm` ON oobm.host_id = host.id + left join + `cloud`.`ha_config` ON ha_config.resource_id=host.id + and ha_config.resource_type='Host' + LEFT JOIN + `cloud`.`last_annotation_view` ON `last_annotation_view`.`entity_uuid` = `host`.`uuid` + LEFT JOIN + `cloud`.`user` ON `user`.`uuid` = `last_annotation_view`.`user_uuid`; +-- End Of Annotations specific changes + +-- Out-of-band management driver for nested-cloudstack +ALTER TABLE `cloud`.`oobm` MODIFY COLUMN port VARCHAR(255); + +-- CLOUDSTACK-9902: Console proxy SSL toggle +INSERT IGNORE INTO `cloud`.`configuration` (`category`, `instance`, `component`, `name`, `value`, `description`, `default_value`, `is_dynamic`) VALUES ('Console Proxy', 'DEFAULT', 'AgentManager', 'consoleproxy.sslEnabled', 'false', 'Enable SSL for console proxy', 'false', 0); + +-- CLOUDSTACK-9859: Retirement of midonet plugin (final removal) +delete from `cloud`.`configuration` where name in ('midonet.apiserver.address', 'midonet.providerrouter.id'); + +-- CLOUDSTACK-9972: Enhance listVolumes API +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Premium', 'DEFAULT', 'management-server', 'volume.stats.interval', '600000', 'Interval (in seconds) to report volume statistics', '600000', now(), NULL, NULL); + +DROP VIEW IF EXISTS `cloud`.`volume_view`; +CREATE VIEW `cloud`.`volume_view` AS + SELECT + volumes.id, + volumes.uuid, + volumes.name, + volumes.device_id, + volumes.volume_type, + volumes.provisioning_type, + volumes.size, + volumes.min_iops, + volumes.max_iops, + volumes.created, + volumes.state, + volumes.attached, + volumes.removed, + volumes.display_volume, + volumes.format, + volumes.path, + volumes.chain_info, + account.id account_id, + account.uuid account_uuid, + account.account_name account_name, + account.type account_type, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path, + projects.id project_id, + projects.uuid project_uuid, + projects.name project_name, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + data_center.networktype data_center_type, + vm_instance.id vm_id, + vm_instance.uuid vm_uuid, + vm_instance.name vm_name, + vm_instance.state vm_state, + vm_instance.vm_type, + user_vm.display_name vm_display_name, + volume_store_ref.size volume_store_size, + volume_store_ref.download_pct, + volume_store_ref.download_state, + volume_store_ref.error_str, + volume_store_ref.created created_on_store, + disk_offering.id disk_offering_id, + disk_offering.uuid disk_offering_uuid, + disk_offering.name disk_offering_name, + disk_offering.display_text disk_offering_display_text, + disk_offering.use_local_storage, + disk_offering.system_use, + disk_offering.bytes_read_rate, + disk_offering.bytes_write_rate, + disk_offering.iops_read_rate, + disk_offering.iops_write_rate, + disk_offering.cache_mode, + storage_pool.id pool_id, + storage_pool.uuid pool_uuid, + storage_pool.name pool_name, + cluster.id cluster_id, + cluster.name cluster_name, + cluster.uuid cluster_uuid, + cluster.hypervisor_type, + vm_template.id template_id, + vm_template.uuid template_uuid, + vm_template.extractable, + vm_template.type template_type, + vm_template.name template_name, + vm_template.display_text template_display_text, + iso.id iso_id, + iso.uuid iso_uuid, + iso.name iso_name, + iso.display_text iso_display_text, + resource_tags.id tag_id, + resource_tags.uuid tag_uuid, + resource_tags.key tag_key, + resource_tags.value tag_value, + resource_tags.domain_id tag_domain_id, + resource_tags.account_id tag_account_id, + resource_tags.resource_id tag_resource_id, + resource_tags.resource_uuid tag_resource_uuid, + resource_tags.resource_type tag_resource_type, + resource_tags.customer tag_customer, + async_job.id job_id, + async_job.uuid job_uuid, + async_job.job_status job_status, + async_job.account_id job_account_id, + host_pod_ref.id pod_id, + host_pod_ref.uuid pod_uuid, + host_pod_ref.name pod_name, + resource_tag_account.account_name tag_account_name, + resource_tag_domain.uuid tag_domain_uuid, + resource_tag_domain.name tag_domain_name + from + `cloud`.`volumes` + inner join + `cloud`.`account` ON volumes.account_id = account.id + inner join + `cloud`.`domain` ON volumes.domain_id = domain.id + left join + `cloud`.`projects` ON projects.project_account_id = account.id + left join + `cloud`.`data_center` ON volumes.data_center_id = data_center.id + left join + `cloud`.`vm_instance` ON volumes.instance_id = vm_instance.id + left join + `cloud`.`user_vm` ON user_vm.id = vm_instance.id + left join + `cloud`.`volume_store_ref` ON volumes.id = volume_store_ref.volume_id + left join + `cloud`.`disk_offering` ON volumes.disk_offering_id = disk_offering.id + left join + `cloud`.`storage_pool` ON volumes.pool_id = storage_pool.id + left join + `cloud`.`host_pod_ref` ON storage_pool.pod_id = host_pod_ref.id + left join + `cloud`.`cluster` ON storage_pool.cluster_id = cluster.id + left join + `cloud`.`vm_template` ON volumes.template_id = vm_template.id + left join + `cloud`.`vm_template` iso ON iso.id = volumes.iso_id + left join + `cloud`.`resource_tags` ON resource_tags.resource_id = volumes.id + and resource_tags.resource_type = 'Volume' + left join + `cloud`.`async_job` ON async_job.instance_id = volumes.id + and async_job.instance_type = 'Volume' + and async_job.job_status = 0 + left join + `cloud`.`account` resource_tag_account ON resource_tag_account.id = resource_tags.account_id + left join + `cloud`.`domain` resource_tag_domain ON resource_tag_domain.id = resource_tags.domain_id; + +-- Extra Dhcp Options +CREATE TABLE IF NOT EXISTS `cloud`.`nic_extra_dhcp_options` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(255) UNIQUE, + `nic_id` bigint unsigned NOT NULL COMMENT ' nic id where dhcp options are applied', + `code` int(32), + `value` text, + PRIMARY KEY (`id`), + CONSTRAINT `fk_nic_extra_dhcp_options_nic_id` FOREIGN KEY (`nic_id`) REFERENCES `nics`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +-- Add new OS versions + +-- Add XenServer 7.1 and 7.2 hypervisor capabilities +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hypervisor_version, max_guests_limit, max_data_volumes_limit, storage_motion_supported) values (UUID(), 'XenServer', '7.1.0', 500, 13, 1); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hypervisor_version, max_guests_limit, max_data_volumes_limit, storage_motion_supported) values (UUID(), 'XenServer', '7.2.0', 500, 13, 1); + +-- Add XenServer 7.0 support for windows 10 +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.0.0', 'Windows 10 (64-bit)', 258, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.0.0', 'Windows 10 (32-bit)', 257, now(), 0); + +-- Add XenServer 7.1 hypervisor guest OS mappings (copy 7.0.0) +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'Xenserver', '7.1.0', guest_os_name, guest_os_id, utc_timestamp(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='Xenserver' AND hypervisor_version='7.0.0'; + +-- Add XenServer 7.1 hypervisor guest OS (see https://docs.citrix.com/content/dam/docs/en-us/xenserver/7-1/downloads/xenserver-7-1-release-notes.pdf) +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.1.0', 'Windows Server 2016 (64-bit)', 259, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.1.0', 'SUSE Linux Enterprise Server 11 SP4', 187, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.1.0', 'Red Hat Enterprise Linux 6 (64-bit)', 240, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.1.0', 'Red Hat Enterprise Linux 7', 245, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.1.0', 'Oracle Enterprise Linux 6 (64-bit)', 251, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.1.0', 'Oracle Linux 7', 247, now(), 0); + +-- Add XenServer 7.2 hypervisor guest OS mappings (copy 7.1.0 & remove Windows Vista, Windows XP, Windows 2003, CentOS 4.x, RHEL 4.xS, LES 10 (all versions) as per XenServer 7.2 Release Notes) +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'Xenserver', '7.2.0', guest_os_name, guest_os_id, utc_timestamp(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='Xenserver' AND hypervisor_version='7.1.0' AND guest_os_id not in (1,2,3,4,56,101,56,58,93,94,50,51,87,88,89,90,91,92,26,27,28,29,40,41,42,43,44,45,96,97,107,108,109,110,151,152,153); + +-- Add table to track primary storage in use for snapshots +CREATE TABLE IF NOT EXISTS `cloud_usage`.`usage_snapshot_on_primary` ( + `id` bigint(20) unsigned NOT NULL, + `zone_id` bigint(20) unsigned NOT NULL, + `account_id` bigint(20) unsigned NOT NULL, + `domain_id` bigint(20) unsigned NOT NULL, + `vm_id` bigint(20) unsigned NOT NULL, + `name` varchar(128), + `type` int(1) unsigned NOT NULL, + `physicalsize` bigint(20), + `virtualsize` bigint(20), + `created` datetime NOT NULL, + `deleted` datetime, + INDEX `i_usage_snapshot_on_primary` (`account_id`,`id`,`vm_id`,`created`) +) ENGINE=InnoDB CHARSET=utf8; + +-- Change monitor patch for apache2 in systemvm +UPDATE `cloud`.`monitoring_services` SET pidfile="/var/run/apache2/apache2.pid" WHERE process_name="apache2" AND service_name="apache2"; + +-- Use 'Other Linux 64-bit' as guest os for the default systemvmtemplate for VMware +-- This fixes a memory allocation issue to systemvms on VMware/ESXi +UPDATE `cloud`.`vm_template` SET guest_os_id=99 WHERE id=8; + +-- Network External Ids +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.networks','external_id', 'varchar(255)'); + +-- Separate Subnet for CPVM and SSVM (system vms) +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.op_dc_ip_address_alloc','forsystemvms', 'TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''Indicates if IP is dedicated for CPVM or SSVM'' '); + +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.op_dc_ip_address_alloc','vlan', 'INT(10) UNSIGNED NULL COMMENT ''Vlan the management network range is on'' '); + +-- CLOUDSTACK-4757: Support multidisk OVA +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.vm_template','parent_template_id', 'bigint(20) unsigned DEFAULT NULL COMMENT ''If datadisk template, then id of the root template this template belongs to'' '); + +-- CLOUDSTACK-10146: Bypass Secondary Storage for KVM templates +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.vm_template','direct_download', 'TINYINT(1) DEFAULT 0 COMMENT ''Indicates if Secondary Storage is bypassed and template is downloaded to Primary Storage'' '); + +-- Changes to template_view for both multidisk OVA and bypass secondary storage for KVM templates +DROP VIEW IF EXISTS `cloud`.`template_view`; +CREATE VIEW `cloud`.`template_view` AS + SELECT + `vm_template`.`id` AS `id`, + `vm_template`.`uuid` AS `uuid`, + `vm_template`.`unique_name` AS `unique_name`, + `vm_template`.`name` AS `name`, + `vm_template`.`public` AS `public`, + `vm_template`.`featured` AS `featured`, + `vm_template`.`type` AS `type`, + `vm_template`.`hvm` AS `hvm`, + `vm_template`.`bits` AS `bits`, + `vm_template`.`url` AS `url`, + `vm_template`.`format` AS `format`, + `vm_template`.`created` AS `created`, + `vm_template`.`checksum` AS `checksum`, + `vm_template`.`display_text` AS `display_text`, + `vm_template`.`enable_password` AS `enable_password`, + `vm_template`.`dynamically_scalable` AS `dynamically_scalable`, + `vm_template`.`state` AS `template_state`, + `vm_template`.`guest_os_id` AS `guest_os_id`, + `guest_os`.`uuid` AS `guest_os_uuid`, + `guest_os`.`display_name` AS `guest_os_name`, + `vm_template`.`bootable` AS `bootable`, + `vm_template`.`prepopulate` AS `prepopulate`, + `vm_template`.`cross_zones` AS `cross_zones`, + `vm_template`.`hypervisor_type` AS `hypervisor_type`, + `vm_template`.`extractable` AS `extractable`, + `vm_template`.`template_tag` AS `template_tag`, + `vm_template`.`sort_key` AS `sort_key`, + `vm_template`.`removed` AS `removed`, + `vm_template`.`enable_sshkey` AS `enable_sshkey`, + `parent_template`.`id` AS `parent_template_id`, + `parent_template`.`uuid` AS `parent_template_uuid`, + `source_template`.`id` AS `source_template_id`, + `source_template`.`uuid` AS `source_template_uuid`, + `account`.`id` AS `account_id`, + `account`.`uuid` AS `account_uuid`, + `account`.`account_name` AS `account_name`, + `account`.`type` AS `account_type`, + `domain`.`id` AS `domain_id`, + `domain`.`uuid` AS `domain_uuid`, + `domain`.`name` AS `domain_name`, + `domain`.`path` AS `domain_path`, + `projects`.`id` AS `project_id`, + `projects`.`uuid` AS `project_uuid`, + `projects`.`name` AS `project_name`, + `data_center`.`id` AS `data_center_id`, + `data_center`.`uuid` AS `data_center_uuid`, + `data_center`.`name` AS `data_center_name`, + `launch_permission`.`account_id` AS `lp_account_id`, + `template_store_ref`.`store_id` AS `store_id`, + `image_store`.`scope` AS `store_scope`, + `template_store_ref`.`state` AS `state`, + `template_store_ref`.`download_state` AS `download_state`, + `template_store_ref`.`download_pct` AS `download_pct`, + `template_store_ref`.`error_str` AS `error_str`, + `template_store_ref`.`size` AS `size`, + `template_store_ref`.physical_size AS `physical_size`, + `template_store_ref`.`destroyed` AS `destroyed`, + `template_store_ref`.`created` AS `created_on_store`, + `vm_template_details`.`name` AS `detail_name`, + `vm_template_details`.`value` AS `detail_value`, + `resource_tags`.`id` AS `tag_id`, + `resource_tags`.`uuid` AS `tag_uuid`, + `resource_tags`.`key` AS `tag_key`, + `resource_tags`.`value` AS `tag_value`, + `resource_tags`.`domain_id` AS `tag_domain_id`, + `domain`.`uuid` AS `tag_domain_uuid`, + `domain`.`name` AS `tag_domain_name`, + `resource_tags`.`account_id` AS `tag_account_id`, + `account`.`account_name` AS `tag_account_name`, + `resource_tags`.`resource_id` AS `tag_resource_id`, + `resource_tags`.`resource_uuid` AS `tag_resource_uuid`, + `resource_tags`.`resource_type` AS `tag_resource_type`, + `resource_tags`.`customer` AS `tag_customer`, + CONCAT(`vm_template`.`id`, + '_', + IFNULL(`data_center`.`id`, 0)) AS `temp_zone_pair`, + `vm_template`.`direct_download` AS `direct_download` + FROM + (((((((((((((`vm_template` + JOIN `guest_os` ON ((`guest_os`.`id` = `vm_template`.`guest_os_id`))) + JOIN `account` ON ((`account`.`id` = `vm_template`.`account_id`))) + JOIN `domain` ON ((`domain`.`id` = `account`.`domain_id`))) + LEFT JOIN `projects` ON ((`projects`.`project_account_id` = `account`.`id`))) + LEFT JOIN `vm_template_details` ON ((`vm_template_details`.`template_id` = `vm_template`.`id`))) + LEFT JOIN `vm_template` `source_template` ON ((`source_template`.`id` = `vm_template`.`source_template_id`))) + LEFT JOIN `template_store_ref` ON (((`template_store_ref`.`template_id` = `vm_template`.`id`) + AND (`template_store_ref`.`store_role` = 'Image') + AND (`template_store_ref`.`destroyed` = 0)))) + LEFT JOIN `vm_template` `parent_template` ON ((`parent_template`.`id` = `vm_template`.`parent_template_id`))) + LEFT JOIN `image_store` ON ((ISNULL(`image_store`.`removed`) + AND (`template_store_ref`.`store_id` IS NOT NULL) + AND (`image_store`.`id` = `template_store_ref`.`store_id`)))) + LEFT JOIN `template_zone_ref` ON (((`template_zone_ref`.`template_id` = `vm_template`.`id`) + AND ISNULL(`template_store_ref`.`store_id`) + AND ISNULL(`template_zone_ref`.`removed`)))) + LEFT JOIN `data_center` ON (((`image_store`.`data_center_id` = `data_center`.`id`) + OR (`template_zone_ref`.`zone_id` = `data_center`.`id`)))) + LEFT JOIN `launch_permission` ON ((`launch_permission`.`template_id` = `vm_template`.`id`))) + LEFT JOIN `resource_tags` ON (((`resource_tags`.`resource_id` = `vm_template`.`id`) + AND ((`resource_tags`.`resource_type` = 'Template') + OR (`resource_tags`.`resource_type` = 'ISO'))))); + +-- CLOUDSTACK-10109: Enable dedication of public IPs to SSVM and CPVM +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.user_ip_address','forsystemvms', 'TINYINT(1) NOT NULL DEFAULT 0 COMMENT ''true if IP is set to system vms, false if not'' '); + +-- ldap binding on domain level +CREATE TABLE IF NOT EXISTS `cloud`.`domain_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `domain_id` bigint unsigned NOT NULL COMMENT 'account id', + `name` varchar(255) NOT NULL, + `value` varchar(255) NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_domain_details__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.ldap_configuration','domain_id', 'BIGINT(20) DEFAULT NULL'); +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.ldap_trust_map','account_id', 'BIGINT(20) DEFAULT 0'); +CALL `cloud`.`IDEMPOTENT_DROP_FOREIGN_KEY`('cloud.ldap_trust_map','fk_ldap_trust_map__domain_id'); +CALL `cloud`.`IDEMPOTENT_DROP_INDEX`('uk_ldap_trust_map__domain_id','cloud.ldap_trust_map'); +CALL `cloud`.`IDEMPOTENT_CREATE_UNIQUE_INDEX`('uk_ldap_trust_map__bind_location','cloud.ldap_trust_map', '(domain_id, account_id)'); + +CREATE TABLE IF NOT EXISTS `cloud`.`netscaler_servicepackages` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(255) UNIQUE, + `name` varchar(255) UNIQUE COMMENT 'name of the service package', + `description` varchar(255) COMMENT 'description of the service package', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `cloud`.`external_netscaler_controlcenter` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(255) UNIQUE, + `username` varchar(255) COMMENT 'username of the NCC', + `password` varchar(255) COMMENT 'password of NCC', + `ncc_ip` varchar(255) COMMENT 'IP of NCC Manager', + `num_retries` bigint unsigned NOT NULL default 2 COMMENT 'Number of retries in ncc for command failure', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.sslcerts','name', 'varchar(255) NULL default NULL COMMENT ''Name of the Certificate'' '); +CALL `cloud`.`IDEMPOTENT_ADD_COLUMN`('cloud.network_offerings','service_package_id', 'varchar(255) NULL default NULL COMMENT ''Netscaler ControlCenter Service Package'' '); \ No newline at end of file diff --git a/setup/db/db/schema-410to420-cleanup.sql b/engine/schema/resources/META-INF/db/schema-410to420-cleanup.sql similarity index 100% rename from setup/db/db/schema-410to420-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-410to420-cleanup.sql diff --git a/setup/db/db/schema-410to420.sql b/engine/schema/resources/META-INF/db/schema-410to420.sql similarity index 99% rename from setup/db/db/schema-410to420.sql rename to engine/schema/resources/META-INF/db/schema-410to420.sql index ebbcfefef3ae..d5173afc186b 100644 --- a/setup/db/db/schema-410to420.sql +++ b/engine/schema/resources/META-INF/db/schema-410to420.sql @@ -669,7 +669,7 @@ ALTER TABLE `cloud`.`physical_network_traffic_types` ADD COLUMN `lxc_network_lab UPDATE configuration SET value='KVM,XenServer,VMware,BareMetal,Ovm,LXC' WHERE name='hypervisor.list'; INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type) - VALUES (10, UUID(), 'routing-10', 'SystemVM Template (LXC)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (LXC)', 'QCOW2', 15, 0, 1, 'LXC'); + VALUES (10, UUID(), 'routing-10', 'SystemVM Template (LXC)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloudstack.org/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (LXC)', 'QCOW2', 15, 0, 1, 'LXC'); ALTER TABLE `cloud`.`user_vm` MODIFY user_data TEXT(32768); diff --git a/engine/schema/resources/META-INF/db/schema-41100to41110-cleanup.sql b/engine/schema/resources/META-INF/db/schema-41100to41110-cleanup.sql new file mode 100644 index 000000000000..2c5855e1ce39 --- /dev/null +++ b/engine/schema/resources/META-INF/db/schema-41100to41110-cleanup.sql @@ -0,0 +1,22 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade from 4.11.0.0 to 4.11.1.0 +--; + +DELETE FROM `cloud`.`configuration` WHERE `name`='vmware.ports.per.dvportgroup'; diff --git a/engine/schema/resources/META-INF/db/schema-41100to41110.sql b/engine/schema/resources/META-INF/db/schema-41100to41110.sql new file mode 100644 index 000000000000..221a4756d300 --- /dev/null +++ b/engine/schema/resources/META-INF/db/schema-41100to41110.sql @@ -0,0 +1,93 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade from 4.11.0.0 to 4.11.1.0 +--; + +-- VMWare hypervisor guest OS mappings + +DELETE from`cloud`.`guest_os_hypervisor` WHERE guest_os_id='269' AND hypervisor_version = '6.0' AND hypervisor_type='VMware'; +DELETE from`cloud`.`guest_os_hypervisor` WHERE guest_os_id='270' AND hypervisor_version = '6.0' AND hypervisor_type='VMware'; + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.0', 'debian6_64Guest', 133, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.0', 'debian6Guest', 132, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.1', 'centosGuest', 171, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.1', 'centosGuest', 179, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.1', 'debian6_64Guest', 133, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.1', 'debian6Guest', 132, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.1', 'debian7_64Guest', 184, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.5', 'centos6Guest', 171, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.5', 'centos6Guest', 179, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.5', 'debian6_64Guest', 133, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.5', 'debian6Guest', 132, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.5', 'debian7_64Guest', 184, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centos64Guest', 172, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centos64Guest', 178, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centos64Guest', 180, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centos64Guest', 182, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centos64Guest', 228, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centosGuest', 177, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centosGuest', 181, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centosGuest', 227, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'debian6_64Guest', 133, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'debian6Guest', 132, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'debian7_64Guest', 184, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'debian8Guest', 269, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6_64Guest', 172, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6_64Guest', 178, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6_64Guest', 180, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6_64Guest', 182, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6_64Guest', 228, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos64Guest', 174, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos64Guest', 176, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6Guest', 177, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6Guest', 181, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centos6Guest', 227, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centosGuest', 173, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'centosGuest', 175, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'debian6_64Guest', 133, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'debian6Guest', 132, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.5', 'debian7_64Guest', 184, now(), 0); + +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos6_64Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='144'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos6_64Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='262'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos6_64Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='264'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos64Guest' WHERE `hypervisor_version`='default' AND hypervisor_type='VmWare' AND guest_os_id='162'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos6Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='143'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos6Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='261'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos6Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='263'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos7_64Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='246'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos7_64Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='260'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='centos7_64Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='274'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='debian5_64Guest' WHERE `hypervisor_version`='5.0' AND hypervisor_type='VMware' AND guest_os_id='15'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='debian5_64Guest' WHERE `hypervisor_version`='5.1' AND hypervisor_type='VMware' AND guest_os_id='15'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='debian5_64Guest' WHERE `hypervisor_version`='5.5' AND hypervisor_type='VMware' AND guest_os_id='15'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='debian5_64Guest' WHERE `hypervisor_version`='6.0' AND hypervisor_type='VMware' AND guest_os_id='15'; +UPDATE `cloud`.`guest_os_hypervisor` SET `guest_os_name`='debian5_64Guest' WHERE `hypervisor_version`='6.5' AND hypervisor_type='VMware' AND guest_os_id='15'; + +-- XenServer 7.3 +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hypervisor_version, max_guests_limit, max_data_volumes_limit, storage_motion_supported) values (UUID(), 'XenServer', '7.3.0', 500, 13, 1); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'Xenserver', '7.3.0', guest_os_name, guest_os_id, utc_timestamp(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='Xenserver' AND hypervisor_version='7.2.0'; + +-- XenServer 7.4 +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hypervisor_version, max_guests_limit, max_data_volumes_limit, storage_motion_supported) values (UUID(), 'XenServer', '7.4.0', 500, 13, 1); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'Xenserver', '7.4.0', guest_os_name, guest_os_id, utc_timestamp(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='Xenserver' AND hypervisor_version='7.3.0'; + +-- XCP-NG 7.4 +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(uuid, hypervisor_type, hypervisor_version, max_guests_limit, max_data_volumes_limit, storage_motion_supported) values (UUID(), 'XenServer', 'XCP-ng 7.4.0', 500, 13, 1); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) SELECT UUID(),'Xenserver', 'XCP-ng 7.4.0', guest_os_name, guest_os_id, utc_timestamp(), 0 FROM `cloud`.`guest_os_hypervisor` WHERE hypervisor_type='Xenserver' AND hypervisor_version='7.4.0'; diff --git a/setup/db/db/schema-420to421.sql b/engine/schema/resources/META-INF/db/schema-420to421.sql similarity index 100% rename from setup/db/db/schema-420to421.sql rename to engine/schema/resources/META-INF/db/schema-420to421.sql diff --git a/setup/db/db/schema-421to430-cleanup.sql b/engine/schema/resources/META-INF/db/schema-421to430-cleanup.sql similarity index 100% rename from setup/db/db/schema-421to430-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-421to430-cleanup.sql diff --git a/setup/db/db/schema-421to430.sql b/engine/schema/resources/META-INF/db/schema-421to430.sql similarity index 98% rename from setup/db/db/schema-421to430.sql rename to engine/schema/resources/META-INF/db/schema-421to430.sql index 0a96ea0ad9b1..80d32dab3fb3 100644 --- a/setup/db/db/schema-421to430.sql +++ b/engine/schema/resources/META-INF/db/schema-421to430.sql @@ -863,12 +863,12 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ("Advanced", 'DEFAULT', 'VMSna INSERT IGNORE INTO `cloud`.`configuration` VALUES ("Advanced", 'DEFAULT', 'VMSnapshotManager', "vmsnapshot.max", "10", "Maximum vm snapshots for a vm", NULL, NULL,NULL,0); INSERT IGNORE INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type, state) - VALUES (9, UUID(), 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/4.3/systemvm64template-2013-12-23-hyperv.vhd.bz2', '5df45ee6ebe1b703a8805f4e1f4d0818', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv', 'Active' ); + VALUES (9, UUID(), 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloudstack.org/templates/4.3/systemvm64template-2013-12-23-hyperv.vhd.bz2', '5df45ee6ebe1b703a8805f4e1f4d0818', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv', 'Active' ); -UPDATE `cloud`.`vm_template` SET `bits` = "64", `url` = "http://download.cloud.com/templates/4.3/systemvm64template-2013-12-23-hyperv.vhd.bz2", `state` = "Active", `checksum` = "5df45ee6ebe1b703a8805f4e1f4d0818" WHERE `id` = "9"; +UPDATE `cloud`.`vm_template` SET `bits` = "64", `url` = "http://download.cloudstack.org/templates/4.3/systemvm64template-2013-12-23-hyperv.vhd.bz2", `state` = "Active", `checksum` = "5df45ee6ebe1b703a8805f4e1f4d0818" WHERE `id` = "9"; INSERT IGNORE INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable, state) - VALUES (6, UUID(), 'centos64-x64', 'CentOS 6.4(64-bit) GUI (Hyperv)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/releases/4.3/centos6_4_64bit.vhd.bz2', 'eef6b9940ea3ed01221d963d4a012d0a', 0, 'CentOS 6.4 (64-bit) GUI (Hyperv)', 'VHD', 182, 1, 1, 'Hyperv', 1, 'Active'); + VALUES (6, UUID(), 'centos64-x64', 'CentOS 6.4(64-bit) GUI (Hyperv)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloudstack.org/releases/4.3/centos6_4_64bit.vhd.bz2', 'eef6b9940ea3ed01221d963d4a012d0a', 0, 'CentOS 6.4 (64-bit) GUI (Hyperv)', 'VHD', 182, 1, 1, 'Hyperv', 1, 'Active'); UPDATE `cloud`.`configuration` SET `component` = 'VMSnapshotManager' WHERE `name` IN ("vmsnapshot.create.wait", "vmsnapshot.max"); diff --git a/setup/db/db/schema-430to440-cleanup.sql b/engine/schema/resources/META-INF/db/schema-430to440-cleanup.sql similarity index 100% rename from setup/db/db/schema-430to440-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-430to440-cleanup.sql diff --git a/setup/db/db/schema-430to440.sql b/engine/schema/resources/META-INF/db/schema-430to440.sql similarity index 100% rename from setup/db/db/schema-430to440.sql rename to engine/schema/resources/META-INF/db/schema-430to440.sql diff --git a/setup/db/db/schema-440to441-cleanup.sql b/engine/schema/resources/META-INF/db/schema-440to441-cleanup.sql similarity index 100% rename from setup/db/db/schema-440to441-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-440to441-cleanup.sql diff --git a/setup/db/db/schema-440to441.sql b/engine/schema/resources/META-INF/db/schema-440to441.sql similarity index 100% rename from setup/db/db/schema-440to441.sql rename to engine/schema/resources/META-INF/db/schema-440to441.sql diff --git a/setup/db/db/schema-441to442.sql b/engine/schema/resources/META-INF/db/schema-441to442.sql similarity index 100% rename from setup/db/db/schema-441to442.sql rename to engine/schema/resources/META-INF/db/schema-441to442.sql diff --git a/setup/db/db/schema-442to450-cleanup.sql b/engine/schema/resources/META-INF/db/schema-442to450-cleanup.sql similarity index 100% rename from setup/db/db/schema-442to450-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-442to450-cleanup.sql diff --git a/setup/db/db/schema-442to450.sql b/engine/schema/resources/META-INF/db/schema-442to450.sql similarity index 99% rename from setup/db/db/schema-442to450.sql rename to engine/schema/resources/META-INF/db/schema-442to450.sql index 774eee506215..5f9fff5ff95d 100644 --- a/setup/db/db/schema-442to450.sql +++ b/engine/schema/resources/META-INF/db/schema-442to450.sql @@ -981,7 +981,7 @@ ALTER TABLE `cloud`.`user_vm_details` MODIFY `value` VARCHAR(5120); UPDATE `cloud`.`host` SET resource = REPLACE(resource, 'com.cloud.hypervisor.xen.resource', 'com.cloud.hypervisor.xenserver.resource') WHERE hypervisor_type='XenServer' AND REMOVED IS NULL; INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable, state) - VALUES (11, UUID(), 'centos7-x86_64-lxc', 'CentOS 7(64-bit) no GUI (LXC)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/templates/builtin/centos-7-x86_64.tar.gz', 'c2c4fa2d0978121c7977db571f132d6e', 0, 'CentOS 7(64-bit) no GUI (LXC)', 'TAR', 246, 1, 1, 'LXC', 1, 'Active'); + VALUES (11, UUID(), 'centos7-x86_64-lxc', 'CentOS 7(64-bit) no GUI (LXC)', 1, now(), 'BUILTIN', 0, 64, 1, 'http://download.cloudstack.org/templates/builtin/centos-7-x86_64.tar.gz', 'c2c4fa2d0978121c7977db571f132d6e', 0, 'CentOS 7(64-bit) no GUI (LXC)', 'TAR', 246, 1, 1, 'LXC', 1, 'Active'); --Support for RHEL 6.5 in relevant hypervisor versions INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (252, UUID(), 4, 'Red Hat Enterprise Linux 6.5 (32-bit)', utc_timestamp()); diff --git a/setup/db/db/schema-443to444.sql b/engine/schema/resources/META-INF/db/schema-443to444.sql similarity index 100% rename from setup/db/db/schema-443to444.sql rename to engine/schema/resources/META-INF/db/schema-443to444.sql diff --git a/setup/db/db/schema-450to451-cleanup.sql b/engine/schema/resources/META-INF/db/schema-450to451-cleanup.sql similarity index 100% rename from setup/db/db/schema-450to451-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-450to451-cleanup.sql diff --git a/setup/db/db/schema-450to451.sql b/engine/schema/resources/META-INF/db/schema-450to451.sql similarity index 100% rename from setup/db/db/schema-450to451.sql rename to engine/schema/resources/META-INF/db/schema-450to451.sql diff --git a/setup/db/db/schema-451to452-cleanup.sql b/engine/schema/resources/META-INF/db/schema-451to452-cleanup.sql similarity index 100% rename from setup/db/db/schema-451to452-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-451to452-cleanup.sql diff --git a/setup/db/db/schema-451to452.sql b/engine/schema/resources/META-INF/db/schema-451to452.sql similarity index 100% rename from setup/db/db/schema-451to452.sql rename to engine/schema/resources/META-INF/db/schema-451to452.sql diff --git a/setup/db/db/schema-452to453-cleanup.sql b/engine/schema/resources/META-INF/db/schema-452to453-cleanup.sql similarity index 100% rename from setup/db/db/schema-452to453-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-452to453-cleanup.sql diff --git a/setup/db/db/schema-452to453.sql b/engine/schema/resources/META-INF/db/schema-452to453.sql similarity index 100% rename from setup/db/db/schema-452to453.sql rename to engine/schema/resources/META-INF/db/schema-452to453.sql diff --git a/setup/db/db/schema-452to460-cleanup.sql b/engine/schema/resources/META-INF/db/schema-452to460-cleanup.sql similarity index 100% rename from setup/db/db/schema-452to460-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-452to460-cleanup.sql diff --git a/setup/db/db/schema-452to460.sql b/engine/schema/resources/META-INF/db/schema-452to460.sql similarity index 98% rename from setup/db/db/schema-452to460.sql rename to engine/schema/resources/META-INF/db/schema-452to460.sql index dfb629f95a0f..ace22e4e0b8f 100644 --- a/setup/db/db/schema-452to460.sql +++ b/engine/schema/resources/META-INF/db/schema-452to460.sql @@ -377,7 +377,7 @@ INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor UPDATE `cloud`.`volumes` v, `cloud`.`storage_pool` s, `cloud`.`cluster` c set v.format='RAW' where v.pool_id=s.id and s.cluster_id=c.id and c.hypervisor_type='Ovm3'; UPDATE configuration SET value='KVM,XenServer,VMware,BareMetal,Ovm,Ovm3,LXC' WHERE name='hypervisor.list'; INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id,featured, cross_zones, hypervisor_type, state) -VALUES (12, UUID(), 'routing-12', 'SystemVM Template (Ovm3)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-ovm.raw.bz2', 'c8577d27b2daafb2d9a4ed307ce2f00f', 0, 'SystemVM Template (Ovm3)', 'RAW', 183, 0, 1, 'Ovm3', 'Active' ); +VALUES (12, UUID(), 'routing-12', 'SystemVM Template (Ovm3)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloudstack.org/systemvm/4.6/systemvm64template-4.6.0-ovm.raw.bz2', 'c8577d27b2daafb2d9a4ed307ce2f00f', 0, 'SystemVM Template (Ovm3)', 'RAW', 183, 0, 1, 'Ovm3', 'Active' ); INSERT IGNORE INTO `cloud`.`configuration` (`category`, `instance`, `component`, `name`, `value`, `default_value`, `description`) VALUES ('Advanced', 'DEFAULT', 'ManagementServer', 'ovm3.heartbeat.timeout' , '180', '120', 'Timeout value to send to the checkheartbeat script for guarding the self fencing functionality on ovm3'); INSERT IGNORE INTO `cloud`.`configuration` (`category`, `instance`, `component`, `name`, `value`, `default_value`, `description`) VALUES ('Advanced', 'DEFAULT', 'ManagementServer', 'ovm3.heartbeat.interval' , '10', '1', 'Interval value the checkheartbeat script uses before triggering the timeout for ovm3'); @@ -385,8 +385,7 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'Netwo UPDATE IGNORE `cloud`.`configuration` SET `value`="PLAINTEXT" WHERE `name`="user.authenticators.exclude"; -DROP TABLE IF EXISTS `cloud`.`external_bigswitch_vns_devices`; -CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( +CREATE TABLE IF NOT EXISTS `cloud`.`external_bigswitch_bcf_devices` ( `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', `uuid` varchar(255) UNIQUE, `physical_network_id` bigint unsigned NOT NULL COMMENT 'id of the physical network in to which bigswitch bcf device is added', @@ -405,7 +404,7 @@ CREATE TABLE `cloud`.`external_bigswitch_bcf_devices` ( UPDATE `cloud`.`host` SET `resource`='com.cloud.hypervisor.xenserver.resource.XenServer600Resource' WHERE `resource`='com.cloud.hypervisor.xenserver.resource.XenServer602Resource'; -CREATE TABLE `cloud`.`ldap_trust_map` ( +CREATE TABLE IF NOT EXISTS `cloud`.`ldap_trust_map` ( `id` int unsigned NOT NULL AUTO_INCREMENT, `domain_id` bigint unsigned NOT NULL, `type` varchar(10) NOT NULL, @@ -420,3 +419,5 @@ INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervis INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'KVM', 'default', 'CentOS 7', 246, utc_timestamp(), 0); UPDATE `cloud`.`hypervisor_capabilities` SET `max_data_volumes_limit` = '32' WHERE `hypervisor_capabilities`.`hypervisor_type` = 'KVM'; + + diff --git a/setup/db/db/schema-460to461-cleanup.sql b/engine/schema/resources/META-INF/db/schema-460to461-cleanup.sql similarity index 100% rename from setup/db/db/schema-460to461-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-460to461-cleanup.sql diff --git a/setup/db/db/schema-460to461.sql b/engine/schema/resources/META-INF/db/schema-460to461.sql similarity index 100% rename from setup/db/db/schema-460to461.sql rename to engine/schema/resources/META-INF/db/schema-460to461.sql diff --git a/setup/db/db/schema-461to470-cleanup.sql b/engine/schema/resources/META-INF/db/schema-461to470-cleanup.sql similarity index 100% rename from setup/db/db/schema-461to470-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-461to470-cleanup.sql diff --git a/setup/db/db/schema-461to470.sql b/engine/schema/resources/META-INF/db/schema-461to470.sql similarity index 100% rename from setup/db/db/schema-461to470.sql rename to engine/schema/resources/META-INF/db/schema-461to470.sql diff --git a/setup/db/db/schema-470to471-cleanup.sql b/engine/schema/resources/META-INF/db/schema-470to471-cleanup.sql similarity index 100% rename from setup/db/db/schema-470to471-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-470to471-cleanup.sql diff --git a/setup/db/db/schema-470to471.sql b/engine/schema/resources/META-INF/db/schema-470to471.sql similarity index 100% rename from setup/db/db/schema-470to471.sql rename to engine/schema/resources/META-INF/db/schema-470to471.sql diff --git a/setup/db/db/schema-471to480-cleanup.sql b/engine/schema/resources/META-INF/db/schema-471to480-cleanup.sql similarity index 100% rename from setup/db/db/schema-471to480-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-471to480-cleanup.sql diff --git a/setup/db/db/schema-471to480.sql b/engine/schema/resources/META-INF/db/schema-471to480.sql similarity index 100% rename from setup/db/db/schema-471to480.sql rename to engine/schema/resources/META-INF/db/schema-471to480.sql diff --git a/setup/db/db/schema-480to481-cleanup.sql b/engine/schema/resources/META-INF/db/schema-480to481-cleanup.sql similarity index 100% rename from setup/db/db/schema-480to481-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-480to481-cleanup.sql diff --git a/setup/db/db/schema-480to481.sql b/engine/schema/resources/META-INF/db/schema-480to481.sql similarity index 99% rename from setup/db/db/schema-480to481.sql rename to engine/schema/resources/META-INF/db/schema-480to481.sql index 3b2d40b3d82c..4c8637bbd6a4 100644 --- a/setup/db/db/schema-480to481.sql +++ b/engine/schema/resources/META-INF/db/schema-480to481.sql @@ -18,3 +18,4 @@ --; -- Schema upgrade from 4.8.0 to 4.8.1; --; + diff --git a/setup/db/db/schema-481to490-cleanup.sql b/engine/schema/resources/META-INF/db/schema-481to490-cleanup.sql similarity index 80% rename from setup/db/db/schema-481to490-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-481to490-cleanup.sql index 0ab02d830899..adf566e07feb 100644 --- a/setup/db/db/schema-481to490-cleanup.sql +++ b/engine/schema/resources/META-INF/db/schema-481to490-cleanup.sql @@ -272,79 +272,3 @@ CREATE VIEW `cloud`.`user_view` AS and async_job.instance_type = 'User' and async_job.job_status = 0; --- Out-of-band management -DROP VIEW IF EXISTS `cloud`.`host_view`; -CREATE VIEW `cloud`.`host_view` AS - select - host.id, - host.uuid, - host.name, - host.status, - host.disconnected, - host.type, - host.private_ip_address, - host.version, - host.hypervisor_type, - host.hypervisor_version, - host.capabilities, - host.last_ping, - host.created, - host.removed, - host.resource_state, - host.mgmt_server_id, - host.cpu_sockets, - host.cpus, - host.speed, - host.ram, - cluster.id cluster_id, - cluster.uuid cluster_uuid, - cluster.name cluster_name, - cluster.cluster_type, - data_center.id data_center_id, - data_center.uuid data_center_uuid, - data_center.name data_center_name, - data_center.networktype data_center_type, - host_pod_ref.id pod_id, - host_pod_ref.uuid pod_uuid, - host_pod_ref.name pod_name, - host_tags.tag, - guest_os_category.id guest_os_category_id, - guest_os_category.uuid guest_os_category_uuid, - guest_os_category.name guest_os_category_name, - mem_caps.used_capacity memory_used_capacity, - mem_caps.reserved_capacity memory_reserved_capacity, - cpu_caps.used_capacity cpu_used_capacity, - cpu_caps.reserved_capacity cpu_reserved_capacity, - async_job.id job_id, - async_job.uuid job_uuid, - async_job.job_status job_status, - async_job.account_id job_account_id, - oobm.enabled AS `oobm_enabled`, - oobm.power_state AS `oobm_power_state` - from - `cloud`.`host` - left join - `cloud`.`cluster` ON host.cluster_id = cluster.id - left join - `cloud`.`data_center` ON host.data_center_id = data_center.id - left join - `cloud`.`host_pod_ref` ON host.pod_id = host_pod_ref.id - left join - `cloud`.`host_details` ON host.id = host_details.host_id - and host_details.name = 'guest.os.category.id' - left join - `cloud`.`guest_os_category` ON guest_os_category.id = CONVERT( host_details.value , UNSIGNED) - left join - `cloud`.`host_tags` ON host_tags.host_id = host.id - left join - `cloud`.`op_host_capacity` mem_caps ON host.id = mem_caps.host_id - and mem_caps.capacity_type = 0 - left join - `cloud`.`op_host_capacity` cpu_caps ON host.id = cpu_caps.host_id - and cpu_caps.capacity_type = 1 - left join - `cloud`.`async_job` ON async_job.instance_id = host.id - and async_job.instance_type = 'Host' - and async_job.job_status = 0 - left join - `cloud`.`oobm` ON oobm.host_id = host.id; diff --git a/setup/db/db/schema-481to490.sql b/engine/schema/resources/META-INF/db/schema-481to490.sql similarity index 93% rename from setup/db/db/schema-481to490.sql rename to engine/schema/resources/META-INF/db/schema-481to490.sql index bd1dd82d1ae0..49cfc8346c54 100644 --- a/setup/db/db/schema-481to490.sql +++ b/engine/schema/resources/META-INF/db/schema-481to490.sql @@ -495,6 +495,83 @@ CREATE TABLE IF NOT EXISTS `cloud`.`oobm` ( CONSTRAINT `fk_oobm__host_id` FOREIGN KEY (`host_id`) REFERENCES `host` (`id`) ON DELETE CASCADE ) ENGINE=InnoDB DEFAULT CHARSET=utf8; +-- Out-of-band management +DROP VIEW IF EXISTS `cloud`.`host_view`; +CREATE VIEW `cloud`.`host_view` AS + select + host.id, + host.uuid, + host.name, + host.status, + host.disconnected, + host.type, + host.private_ip_address, + host.version, + host.hypervisor_type, + host.hypervisor_version, + host.capabilities, + host.last_ping, + host.created, + host.removed, + host.resource_state, + host.mgmt_server_id, + host.cpu_sockets, + host.cpus, + host.speed, + host.ram, + cluster.id cluster_id, + cluster.uuid cluster_uuid, + cluster.name cluster_name, + cluster.cluster_type, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + data_center.networktype data_center_type, + host_pod_ref.id pod_id, + host_pod_ref.uuid pod_uuid, + host_pod_ref.name pod_name, + host_tags.tag, + guest_os_category.id guest_os_category_id, + guest_os_category.uuid guest_os_category_uuid, + guest_os_category.name guest_os_category_name, + mem_caps.used_capacity memory_used_capacity, + mem_caps.reserved_capacity memory_reserved_capacity, + cpu_caps.used_capacity cpu_used_capacity, + cpu_caps.reserved_capacity cpu_reserved_capacity, + async_job.id job_id, + async_job.uuid job_uuid, + async_job.job_status job_status, + async_job.account_id job_account_id, + oobm.enabled AS `oobm_enabled`, + oobm.power_state AS `oobm_power_state` + from + `cloud`.`host` + left join + `cloud`.`cluster` ON host.cluster_id = cluster.id + left join + `cloud`.`data_center` ON host.data_center_id = data_center.id + left join + `cloud`.`host_pod_ref` ON host.pod_id = host_pod_ref.id + left join + `cloud`.`host_details` ON host.id = host_details.host_id + and host_details.name = 'guest.os.category.id' + left join + `cloud`.`guest_os_category` ON guest_os_category.id = CONVERT( host_details.value , UNSIGNED) + left join + `cloud`.`host_tags` ON host_tags.host_id = host.id + left join + `cloud`.`op_host_capacity` mem_caps ON host.id = mem_caps.host_id + and mem_caps.capacity_type = 0 + left join + `cloud`.`op_host_capacity` cpu_caps ON host.id = cpu_caps.host_id + and cpu_caps.capacity_type = 1 + left join + `cloud`.`async_job` ON async_job.instance_id = host.id + and async_job.instance_type = 'Host' + and async_job.job_status = 0 + left join + `cloud`.`oobm` ON oobm.host_id = host.id; + INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '4.0', 'centosGuest', 171, now(), 0); INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '4.1', 'centosGuest', 171, now(), 0); INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid,hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.0', 'centosGuest', 171, now(), 0); diff --git a/setup/db/db/schema-490to4910-cleanup.sql b/engine/schema/resources/META-INF/db/schema-490to4910-cleanup.sql similarity index 95% rename from setup/db/db/schema-490to4910-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-490to4910-cleanup.sql index 71638f1db510..657713b64f15 100644 --- a/setup/db/db/schema-490to4910-cleanup.sql +++ b/engine/schema/resources/META-INF/db/schema-490to4910-cleanup.sql @@ -16,6 +16,6 @@ -- under the License. --; --- Schema cleanup from 4.9.0 to 4.9.1; +-- Schema cleanup from 4.9.0 to 4.9.1.0; --; diff --git a/setup/db/db/schema-490to4910.sql b/engine/schema/resources/META-INF/db/schema-490to4910.sql similarity index 99% rename from setup/db/db/schema-490to4910.sql rename to engine/schema/resources/META-INF/db/schema-490to4910.sql index ec3928f12349..a89358c26fe8 100644 --- a/setup/db/db/schema-490to4910.sql +++ b/engine/schema/resources/META-INF/db/schema-490to4910.sql @@ -16,7 +16,7 @@ -- under the License. --; --- Schema upgrade from 4.9.0 to 4.9.1; +-- Schema upgrade from 4.9.0 to 4.9.1.0; --; -- Fix default user role description diff --git a/setup/db/db/schema-4910to4920-cleanup.sql b/engine/schema/resources/META-INF/db/schema-4910to4920-cleanup.sql similarity index 100% rename from setup/db/db/schema-4910to4920-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-4910to4920-cleanup.sql diff --git a/setup/db/db/schema-4910to4920.sql b/engine/schema/resources/META-INF/db/schema-4910to4920.sql similarity index 100% rename from setup/db/db/schema-4910to4920.sql rename to engine/schema/resources/META-INF/db/schema-4910to4920.sql diff --git a/setup/db/db/schema-4920to4930-cleanup.sql b/engine/schema/resources/META-INF/db/schema-4920to4930-cleanup.sql similarity index 100% rename from setup/db/db/schema-4920to4930-cleanup.sql rename to engine/schema/resources/META-INF/db/schema-4920to4930-cleanup.sql diff --git a/setup/db/db/schema-4920to4930.sql b/engine/schema/resources/META-INF/db/schema-4920to4930.sql similarity index 100% rename from setup/db/db/schema-4920to4930.sql rename to engine/schema/resources/META-INF/db/schema-4920to4930.sql diff --git a/engine/schema/resources/META-INF/db/schema-4930to41000-cleanup.sql b/engine/schema/resources/META-INF/db/schema-4930to41000-cleanup.sql new file mode 100644 index 000000000000..986dcdfe7da7 --- /dev/null +++ b/engine/schema/resources/META-INF/db/schema-4930to41000-cleanup.sql @@ -0,0 +1,24 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade cleanup from 4.9.3.0 to 4.10.0.0; +--; + +DELETE FROM `cloud`.`configuration` WHERE name='consoleproxy.loadscan.interval'; + +DELETE FROM `cloud`.`host_details` where name = 'vmName' and value in (select name from `cloud`.`vm_instance` where state = 'Expunging' and hypervisor_type ='BareMetal'); diff --git a/engine/schema/resources/META-INF/db/schema-4930to41000.sql b/engine/schema/resources/META-INF/db/schema-4930to41000.sql new file mode 100644 index 000000000000..dc0cd6d4d75a --- /dev/null +++ b/engine/schema/resources/META-INF/db/schema-4930to41000.sql @@ -0,0 +1,257 @@ +-- Licensed to the Apache Software Foundation (ASF) under one +-- or more contributor license agreements. See the NOTICE file +-- distributed with this work for additional information +-- regarding copyright ownership. The ASF licenses this file +-- to you under the Apache License, Version 2.0 (the +-- "License"); you may not use this file except in compliance +-- with the License. You may obtain a copy of the License at +-- +-- http://www.apache.org/licenses/LICENSE-2.0 +-- +-- Unless required by applicable law or agreed to in writing, +-- software distributed under the License is distributed on an +-- "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +-- KIND, either express or implied. See the License for the +-- specific language governing permissions and limitations +-- under the License. + +--; +-- Schema upgrade from 4.9.3.0 to 4.10.0.0; +--; + +ALTER TABLE `cloud`.`domain_router` ADD COLUMN update_state varchar(64) DEFAULT NULL; + +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (257, UUID(), 6, 'Windows 10 (32-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (258, UUID(), 6, 'Windows 10 (64-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (259, UUID(), 6, 'Windows Server 2016 (64-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (260, UUID(), 1, 'CentOS 7.1', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (261, UUID(), 1, 'CentOS 6.6 (32-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (262, UUID(), 1, 'CentOS 6.6 (64-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (263, UUID(), 1, 'CentOS 6.7 (32-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (264, UUID(), 1, 'CentOS 6.7 (64-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (265, UUID(), 4, 'Red Hat Enterprise Linux 6.6 (32-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (266, UUID(), 4, 'Red Hat Enterprise Linux 6.6 (64-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (267, UUID(), 4, 'Red Hat Enterprise Linux 6.7 (32-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (268, UUID(), 4, 'Red Hat Enterprise Linux 6.7 (64-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (269, UUID(), 2, 'Debian GNU/Linux 8 (32-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (270, UUID(), 2, 'Debian GNU/Linux 8 (64-bit)', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (271, UUID(), 7, 'CoreOS', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (272, UUID(), 4, 'Red Hat Enterprise Linux 7.1', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (273, UUID(), 4, 'Red Hat Enterprise Linux 7.2', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (274, UUID(), 1, 'CentOS 7.2', now()); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name, created) VALUES (275, UUID(), 6, 'Other PV Virtio-SCSI (64-bit)', now()); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '6.5.0', 'Windows 10 (32-bit)', 257, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'windows9Guest', 257, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'KVM', 'default', 'Windows 10', 257, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '6.5.0', 'Windows 10 (64-bit)', 258, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'windows9_64Guest', 258, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'KVM', 'default', 'Windows 10', 258, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '6.5.0', 'Windows Server 2016 (64-bit)', 259, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.0.0', 'Windows Server 2016 (64-bit)', 259, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'windows9Server64Guest', 259, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'KVM', 'default', 'Windows Server 2016', 259, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'CentOS 7', 260, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '5.5', 'centos64Guest', 260, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'centos64Guest', 260, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'KVM', 'default', 'CentOS 7.1', 260, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'CentOS 6 (32-bit)', 261, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'centosGuest', 261, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'CentOS 6 (64-bit)', 262, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'centos64Guest', 262, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'CentOS 6 (32-bit)', 263, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'centosGuest', 263, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'CentOS 6 (64-bit)', 264, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'centos64Guest', 264, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'Red Hat Enterprise Linux 6 (32-bit)', 265, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'rhel6Guest', 265, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'Red Hat Enterprise Linux 6 (64-bit)', 266, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'rhel6_64Guest', 266, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'Red Hat Enterprise Linux 6 (32-bit)', 267, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'rhel6Guest', 267, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'Red Hat Enterprise Linux 6 (64-bit)', 268, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'rhel6_64Guest', 268, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'debian8Guest', 269, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'debian8Guest', 270, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', 'default', 'CoreOS', 271, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', 'default', 'coreos64Guest', 271, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '5.5', 'coreos64Guest', 271, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'coreos64Guest', 271, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'KVM', 'default', 'CoreOS', 271, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'Xenserver', '6.5.0', 'Red Hat Enterprise Linux 7', 272, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '5.5', 'rhel7_64Guest', 272, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'VMware', '6.0', 'rhel7_64Guest', 272, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(),'KVM', 'default', 'Red Hat Enterprise Linux 7.1', 272, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '6.5.0', 'Red Hat Enterprise Linux 7', 273, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.0.0', 'Red Hat Enterprise Linux 7', 273, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.5', 'rhel7_64Guest', 273, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'rhel7_64Guest', 273, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'KVM', 'default', 'Red Hat Enterprise Linux 7.2', 273, now(), 0); + +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '6.5.0', 'CentOS 7', 274, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'Xenserver', '7.0.0', 'CentOS 7', 274, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '5.5', 'centos64Guest', 274, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'VMware', '6.0', 'centos64Guest', 274, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'KVM', 'default', 'CentOS 7.2', 274, now(), 0); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (uuid, hypervisor_type, hypervisor_version, guest_os_name, guest_os_id, created, is_user_defined) VALUES (UUID(), 'KVM', 'default', 'Other PV Virtio-SCSI (64-bit)', 275, now(), 0); + +CREATE TABLE IF NOT EXISTS `cloud`.`vlan_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `vlan_id` bigint unsigned NOT NULL COMMENT 'vlan id', + `name` varchar(255) NOT NULL, + `value` varchar(1024) NOT NULL, + `display` tinyint(1) NOT NULL DEFAULT 1 COMMENT 'Should detail be displayed to the end user', + PRIMARY KEY (`id`), + CONSTRAINT `fk_vlan_details__vlan_id` FOREIGN KEY `fk_vlan_details__vlan_id`(`vlan_id`) REFERENCES `vlan`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`network_offerings` ADD COLUMN supports_public_access boolean default false; + +ALTER TABLE `cloud`.`image_store_details` CHANGE COLUMN `value` `value` VARCHAR(255) NULL DEFAULT NULL COMMENT 'value of the detail', ADD COLUMN `display` tinyint(1) NOT +NULL DEFAULT '1' COMMENT 'True if the detail can be displayed to the end user' AFTER `value`; + +ALTER TABLE `snapshots` ADD COLUMN `location_type` VARCHAR(32) COMMENT 'Location of snapshot (ex. Primary)'; + +-- Database change for CLOUDSTACK-8746 (VM Snapshotting implementation for KVM) +UPDATE `cloud`.`hypervisor_capabilities` SET `vm_snapshot_enabled` = 1 WHERE `hypervisor_type` ='KVM' AND `hypervisor_version` = 'default'; + +-- [VM-SNAPSHOT] add role permissions for new API command createSnapshotFromVMSnapshot +INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) values (UUID(), 2, 'createSnapshotFromVMSnapshot', 'ALLOW', 318) ON DUPLICATE KEY UPDATE rule=rule; +INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) values (UUID(), 3, 'createSnapshotFromVMSnapshot', 'ALLOW', 302) ON DUPLICATE KEY UPDATE rule=rule; +INSERT INTO `cloud`.`role_permissions` (`uuid`, `role_id`, `rule`, `permission`, `sort_order`) values (UUID(), 4, 'createSnapshotFromVMSnapshot', 'ALLOW', 260) ON DUPLICATE KEY UPDATE rule=rule; + +-- Create table storage_pool_tags +CREATE TABLE IF NOT EXISTS `cloud`.`storage_pool_tags` ( + `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT, + `pool_id` bigint(20) unsigned NOT NULL COMMENT "pool id", + `tag` varchar(255) NOT NULL, + PRIMARY KEY (`id`), + KEY `fk_storage_pool_tags__pool_id` (`pool_id`), + CONSTRAINT `fk_storage_pool_tags__pool_id` FOREIGN KEY (`pool_id`) REFERENCES `storage_pool` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8; + +-- Insert storage tags from storage_pool_details +INSERT INTO `cloud`.`storage_pool_tags` (pool_id, tag) SELECT pool_id, +name FROM `cloud`.`storage_pool_details` WHERE value = 'true'; + +-- Alter view storage_pool_view +CREATE OR REPLACE +VIEW `storage_pool_view` AS + SELECT + `storage_pool`.`id` AS `id`, + `storage_pool`.`uuid` AS `uuid`, + `storage_pool`.`name` AS `name`, + `storage_pool`.`status` AS `status`, + `storage_pool`.`path` AS `path`, + `storage_pool`.`pool_type` AS `pool_type`, + `storage_pool`.`host_address` AS `host_address`, + `storage_pool`.`created` AS `created`, + `storage_pool`.`removed` AS `removed`, + `storage_pool`.`capacity_bytes` AS `capacity_bytes`, + `storage_pool`.`capacity_iops` AS `capacity_iops`, + `storage_pool`.`scope` AS `scope`, + `storage_pool`.`hypervisor` AS `hypervisor`, + `storage_pool`.`storage_provider_name` AS `storage_provider_name`, + `cluster`.`id` AS `cluster_id`, + `cluster`.`uuid` AS `cluster_uuid`, + `cluster`.`name` AS `cluster_name`, + `cluster`.`cluster_type` AS `cluster_type`, + `data_center`.`id` AS `data_center_id`, + `data_center`.`uuid` AS `data_center_uuid`, + `data_center`.`name` AS `data_center_name`, + `data_center`.`networktype` AS `data_center_type`, + `host_pod_ref`.`id` AS `pod_id`, + `host_pod_ref`.`uuid` AS `pod_uuid`, + `host_pod_ref`.`name` AS `pod_name`, + `storage_pool_tags`.`tag` AS `tag`, + `op_host_capacity`.`used_capacity` AS `disk_used_capacity`, + `op_host_capacity`.`reserved_capacity` AS `disk_reserved_capacity`, + `async_job`.`id` AS `job_id`, + `async_job`.`uuid` AS `job_uuid`, + `async_job`.`job_status` AS `job_status`, + `async_job`.`account_id` AS `job_account_id` + FROM + ((((((`storage_pool` + LEFT JOIN `cluster` ON ((`storage_pool`.`cluster_id` = `cluster`.`id`))) + LEFT JOIN `data_center` ON ((`storage_pool`.`data_center_id` = `data_center`.`id`))) + LEFT JOIN `host_pod_ref` ON ((`storage_pool`.`pod_id` = `host_pod_ref`.`id`))) + LEFT JOIN `storage_pool_tags` ON (((`storage_pool_tags`.`pool_id` = `storage_pool`.`id`)))) + LEFT JOIN `op_host_capacity` ON (((`storage_pool`.`id` = `op_host_capacity`.`host_id`) + AND (`op_host_capacity`.`capacity_type` IN (3 , 9))))) + LEFT JOIN `async_job` ON (((`async_job`.`instance_id` = `storage_pool`.`id`) + AND (`async_job`.`instance_type` = 'StoragePool') + AND (`async_job`.`job_status` = 0)))); + +-- Alter view image_store_view +CREATE OR REPLACE +VIEW `image_store_view` AS + SELECT + `image_store`.`id` AS `id`, + `image_store`.`uuid` AS `uuid`, + `image_store`.`name` AS `name`, + `image_store`.`image_provider_name` AS `image_provider_name`, + `image_store`.`protocol` AS `protocol`, + `image_store`.`url` AS `url`, + `image_store`.`scope` AS `scope`, + `image_store`.`role` AS `role`, + `image_store`.`removed` AS `removed`, + `data_center`.`id` AS `data_center_id`, + `data_center`.`uuid` AS `data_center_uuid`, + `data_center`.`name` AS `data_center_name` + FROM + (`image_store` + LEFT JOIN `data_center` ON ((`image_store`.`data_center_id` = `data_center`.`id`))); + +-- Add service_offering_id column to vm_snapshots table +ALTER TABLE `cloud`.`vm_snapshots` ADD COLUMN `service_offering_id` BIGINT(20) UNSIGNED NOT NULL COMMENT '' AFTER `domain_id`; +UPDATE `cloud`.`vm_snapshots` s JOIN `cloud`.`vm_instance` v ON v.id = s.vm_id SET s.service_offering_id = v.service_offering_id; +ALTER TABLE `cloud`.`vm_snapshots` ADD CONSTRAINT `fk_vm_snapshots_service_offering_id` FOREIGN KEY (`service_offering_id`) REFERENCES `cloud`.`service_offering` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION; + +-- Update vm snapshot details for instances with custom service offerings +INSERT INTO `cloud`.`vm_snapshot_details` (vm_snapshot_id, name, value) +SELECT s.id, d.name, d.value +FROM `cloud`.`user_vm_details` d JOIN `cloud`.`vm_instance` v ON (d.vm_id = v.id) +JOIN `cloud`.`service_offering` o ON (v.service_offering_id = o.id) +JOIN `cloud`.`vm_snapshots` s ON (s.service_offering_id = o.id AND s.vm_id = v.id) +WHERE (o.cpu is null AND o.speed IS NULL AND o.ram_size IS NULL) AND +(d.name = 'cpuNumber' OR d.name = 'cpuSpeed' OR d.name = 'memory'); + +-- CLOUDSTACK-9827: Storage tags stored in multiple places +DROP VIEW IF EXISTS `cloud`.`storage_tag_view`; + +CREATE TABLE IF NOT EXISTS `cloud`.`guest_os_details` ( + `id` bigint unsigned NOT NULL auto_increment, + `guest_os_id` bigint unsigned NOT NULL COMMENT 'VPC gateway id', + `name` varchar(255) NOT NULL, + `value` varchar(1024) NOT NULL, + `display` tinyint(1) NOT NULL DEFAULT '0' COMMENT 'True if the detail can be displayed to the end user', + PRIMARY KEY (`id`), + CONSTRAINT `fk_guest_os_details__guest_os_id` FOREIGN KEY `fk_guest_os_details__guest_os_id`(`guest_os_id`) REFERENCES `guest_os`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `user_ip_address` ADD COLUMN `rule_state` VARCHAR(32) COMMENT 'static rule state while removing'; +CREATE TABLE IF NOT EXISTS `cloud`.`firewall_rules_dcidrs`( + `id` BIGINT(20) unsigned NOT NULL AUTO_INCREMENT, + `firewall_rule_id` BIGINT(20) unsigned NOT NULL, + `destination_cidr` VARCHAR(18) DEFAULT NULL, + PRIMARY KEY (id), + UNIQUE KEY `unique_rule_dcidrs` (`firewall_rule_id`, `destination_cidr`), + KEY `fk_firewall_dcidrs_firewall_rules` (`firewall_rule_id`), + CONSTRAINT `fk_firewall_dcidrs_firewall_rules` FOREIGN KEY (`firewall_rule_id`) REFERENCES `firewall_rules` (`id`) ON DELETE CASCADE +)ENGINE=InnoDB DEFAULT CHARSET=utf8; diff --git a/setup/db/db/schema-level.sql b/engine/schema/resources/META-INF/db/schema-level.sql similarity index 100% rename from setup/db/db/schema-level.sql rename to engine/schema/resources/META-INF/db/schema-level.sql diff --git a/setup/db/db/schema-snapshot-217to224.sql b/engine/schema/resources/META-INF/db/schema-snapshot-217to224.sql similarity index 100% rename from setup/db/db/schema-snapshot-217to224.sql rename to engine/schema/resources/META-INF/db/schema-snapshot-217to224.sql diff --git a/setup/db/db/schema-snapshot-223to224.sql b/engine/schema/resources/META-INF/db/schema-snapshot-223to224.sql similarity index 100% rename from setup/db/db/schema-snapshot-223to224.sql rename to engine/schema/resources/META-INF/db/schema-snapshot-223to224.sql diff --git a/engine/schema/src/com/cloud/capacity/CapacityVO.java b/engine/schema/src/com/cloud/capacity/CapacityVO.java index 8df5c861cda4..aaae874182fb 100644 --- a/engine/schema/src/com/cloud/capacity/CapacityVO.java +++ b/engine/schema/src/com/cloud/capacity/CapacityVO.java @@ -17,6 +17,8 @@ package com.cloud.capacity; import java.util.Date; +import java.util.HashMap; +import java.util.Map; import javax.persistence.Column; import javax.persistence.Entity; @@ -75,6 +77,9 @@ public class CapacityVO implements Capacity { @Transient private Float usedPercentage; + @Transient + private Long allocatedCapacity; + public CapacityVO() { } @@ -208,8 +213,37 @@ public void setUsedPercentage(float usedPercentage) { this.usedPercentage = usedPercentage; } + public Long getAllocatedCapacity() { + return allocatedCapacity; + } + + public void setAllocatedCapacity(Long allocatedCapacity) { + this.allocatedCapacity = allocatedCapacity; + } + @Override public String getUuid() { return null; //To change body of implemented methods use File | Settings | File Templates. } + + private static Map capacityNames = null; + static { + capacityNames = new HashMap(); + capacityNames.put(CAPACITY_TYPE_MEMORY, "MEMORY"); + capacityNames.put(CAPACITY_TYPE_CPU, "CPU"); + capacityNames.put(CAPACITY_TYPE_STORAGE, "STORAGE"); + capacityNames.put(CAPACITY_TYPE_STORAGE_ALLOCATED, "STORAGE_ALLOCATED"); + capacityNames.put(CAPACITY_TYPE_VIRTUAL_NETWORK_PUBLIC_IP, "VIRTUAL_NETWORK_PUBLIC_IP"); + capacityNames.put(CAPACITY_TYPE_PRIVATE_IP, "PRIVATE_IP"); + capacityNames.put(CAPACITY_TYPE_SECONDARY_STORAGE, "SECONDARY_STORAGE"); + capacityNames.put(CAPACITY_TYPE_VLAN, "VLAN"); + capacityNames.put(CAPACITY_TYPE_DIRECT_ATTACHED_PUBLIC_IP, "DIRECT_ATTACHED_PUBLIC_IP"); + capacityNames.put(CAPACITY_TYPE_LOCAL_STORAGE, "LOCAL_STORAGE"); + capacityNames.put(CAPACITY_TYPE_GPU, "GPU"); + capacityNames.put(CAPACITY_TYPE_CPU_CORE, "CPU_CORE"); + } + + public static String getCapacityName (Short capacityType) { + return capacityNames.get(capacityType); + } } diff --git a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java index f4e78051046e..5b14bd4af3be 100644 --- a/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java +++ b/engine/schema/src/com/cloud/capacity/dao/CapacityDaoImpl.java @@ -187,6 +187,17 @@ public class CapacityDaoImpl extends GenericDaoBase implements + "from op_host_capacity capacity where cluster_id = ? and capacity_type = ?;"; + private static final String LIST_ALLOCATED_CAPACITY_GROUP_BY_CAPACITY_AND_ZONE = "SELECT v.data_center_id, SUM(cpu) AS cpucore, " + + "SUM(cpu * speed) AS cpu, SUM(ram_size * 1024 * 1024) AS memory " + + "FROM (SELECT vi.data_center_id, (CASE WHEN ISNULL(service_offering.cpu) THEN custom_cpu.value ELSE service_offering.cpu end) AS cpu, " + + "(CASE WHEN ISNULL(service_offering.speed) THEN custom_speed.value ELSE service_offering.speed end) AS speed, " + + "(CASE WHEN ISNULL(service_offering.ram_size) THEN custom_ram_size.value ELSE service_offering.ram_size end) AS ram_size " + + "FROM (((vm_instance vi LEFT JOIN service_offering ON(((vi.service_offering_id = service_offering.id))) " + + "LEFT JOIN user_vm_details custom_cpu ON(((custom_cpu.vm_id = vi.id) AND (custom_cpu.name = 'CpuNumber')))) " + + "LEFT JOIN user_vm_details custom_speed ON(((custom_speed.vm_id = vi.id) AND (custom_speed.name = 'CpuSpeed')))) " + + "LEFT JOIN user_vm_details custom_ram_size ON(((custom_ram_size.vm_id = vi.id) AND (custom_ram_size.name = 'memory')))) " + + "WHERE ISNULL(vi.removed) AND vi.state NOT IN ('Destroyed', 'Error', 'Expunging')"; + public CapacityDaoImpl() { _hostIdTypeSearch = createSearchBuilder(); _hostIdTypeSearch.and("hostId", _hostIdTypeSearch.entity().getHostOrPoolId(), SearchCriteria.Op.EQ); @@ -407,6 +418,33 @@ public List findCapacityBy(Integer capacityType, Long zoneId, Lo PreparedStatement pstmt = null; List results = new ArrayList(); + StringBuilder allocatedSql = new StringBuilder(LIST_ALLOCATED_CAPACITY_GROUP_BY_CAPACITY_AND_ZONE); + + HashMap sumCpuCore = new HashMap(); + HashMap sumCpu = new HashMap(); + HashMap sumMemory = new HashMap(); + if (zoneId != null){ + allocatedSql.append(" AND vi.data_center_id = ?"); + } + allocatedSql.append(" ) AS v GROUP BY v.data_center_id"); + try { + if (podId == null && clusterId == null) { + // add allocated capacity of zone in result + pstmt = txn.prepareAutoCloseStatement(allocatedSql.toString()); + if (zoneId != null){ + pstmt.setLong(1, zoneId); + } + ResultSet rs = pstmt.executeQuery(); + if (rs.next()) { + sumCpuCore.put(rs.getLong(1), rs.getLong(2)); + sumCpu.put(rs.getLong(1), rs.getLong(3)); + sumMemory.put(rs.getLong(1), rs.getLong(4)); + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("DB Exception on: " + allocatedSql, e); + } + StringBuilder sql = new StringBuilder(LIST_CAPACITY_GROUP_BY_CAPACITY_PART1); List resourceIdList = new ArrayList(); @@ -427,7 +465,11 @@ public List findCapacityBy(Integer capacityType, Long zoneId, Lo resourceIdList.add(capacityType.longValue()); } - sql.append(LIST_CAPACITY_GROUP_BY_CAPACITY_DATA_CENTER_POD_CLUSTER); + if (podId == null && clusterId == null) { + sql.append(" GROUP BY capacity_type, data_center_id"); + } else { + sql.append(LIST_CAPACITY_GROUP_BY_CAPACITY_DATA_CENTER_POD_CLUSTER); + } try { pstmt = txn.prepareAutoCloseStatement(sql.toString()); @@ -438,6 +480,7 @@ public List findCapacityBy(Integer capacityType, Long zoneId, Lo ResultSet rs = pstmt.executeQuery(); while (rs.next()) { + Long capacityZoneId = rs.getLong(6); Long capacityPodId = null; Long capacityClusterId = null; @@ -450,6 +493,16 @@ public List findCapacityBy(Integer capacityType, Long zoneId, Lo (short)rs.getLong(5), rs.getLong(6), capacityPodId, capacityClusterId); + if (podId == null && clusterId == null) { + Short sumCapacityType = summedCapacity.getCapacityType(); + if (sumCapacityType == CapacityVO.CAPACITY_TYPE_MEMORY) { + summedCapacity.setAllocatedCapacity(sumMemory.get(capacityZoneId)); + } else if (sumCapacityType == CapacityVO.CAPACITY_TYPE_CPU) { + summedCapacity.setAllocatedCapacity(sumCpu.get(capacityZoneId)); + } else if (sumCapacityType == CapacityVO.CAPACITY_TYPE_CPU_CORE) { + summedCapacity.setAllocatedCapacity(sumCpuCore.get(capacityZoneId)); + } + } results.add(summedCapacity); } HashMap capacityMap = new HashMap(); @@ -460,7 +513,7 @@ public List findCapacityBy(Integer capacityType, Long zoneId, Lo } else { // sum the values based on the zoneId. - key=String.valueOf(result.getDataCenterId())+String.valueOf(result.getCapacityType()); + key=String.valueOf(result.getDataCenterId()) + "-" + String.valueOf(result.getCapacityType()); } SummedCapacity tempCapacity=null; if (capacityMap.containsKey(key)) { @@ -589,6 +642,7 @@ public List listHostsWithEnoughCapacity(int requiredCpu, long requiredRam, } public static class SummedCapacity { + public Long sumAllocated; public long sumUsed; public long sumReserved; public long sumTotal; @@ -679,6 +733,12 @@ public void setPodId(Long podId) { public void setClusterId(Long clusterId) { this.clusterId=clusterId; } + public Long getAllocatedCapacity() { + return sumAllocated; + } + public void setAllocatedCapacity(Long sumAllocated) { + this.sumAllocated = sumAllocated; + } } @Override diff --git a/engine/schema/src/com/cloud/certificate/CrlVO.java b/engine/schema/src/com/cloud/certificate/CrlVO.java new file mode 100644 index 000000000000..6df7530b2903 --- /dev/null +++ b/engine/schema/src/com/cloud/certificate/CrlVO.java @@ -0,0 +1,85 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.certificate; + +import java.math.BigInteger; +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.apache.cloudstack.api.InternalIdentity; + +@Entity +@Table(name = "crl") +public class CrlVO implements InternalIdentity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id = null; + + @Column(name = "serial") + private String certSerial; + + @Column(name = "cn") + private String certCn; + + @Column(name = "revoker_uuid") + private String revokerUuid; + + @Temporal(value = TemporalType.TIMESTAMP) + @Column(name = "revoked", updatable = true) + private Date revoked; + + public CrlVO() { + } + + public CrlVO(final BigInteger certSerial, final String certCn, final String revokerUuid) { + this.certSerial = certSerial.toString(16); + this.certCn = certCn; + this.revokerUuid = revokerUuid; + this.revoked = new Date(); + } + + @Override + public long getId() { + return id; + } + + public BigInteger getCertSerial() { + return new BigInteger(certSerial, 16); + } + + public String getCertCn() { + return certCn; + } + + public String getRevokerUuid() { + return revokerUuid; + } + + public Date getRevoked() { + return revoked; + } +} diff --git a/engine/schema/src/com/cloud/certificate/dao/CrlDao.java b/engine/schema/src/com/cloud/certificate/dao/CrlDao.java new file mode 100644 index 000000000000..613d9caf487f --- /dev/null +++ b/engine/schema/src/com/cloud/certificate/dao/CrlDao.java @@ -0,0 +1,28 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.certificate.dao; + +import java.math.BigInteger; + +import com.cloud.certificate.CrlVO; +import com.cloud.utils.db.GenericDao; + +public interface CrlDao extends GenericDao { + CrlVO findBySerial(final BigInteger certSerial); + CrlVO revokeCertificate(final BigInteger certSerial, final String certCn); +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/certificate/dao/CrlDaoImpl.java b/engine/schema/src/com/cloud/certificate/dao/CrlDaoImpl.java new file mode 100644 index 000000000000..2eee308f1154 --- /dev/null +++ b/engine/schema/src/com/cloud/certificate/dao/CrlDaoImpl.java @@ -0,0 +1,57 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.certificate.dao; + +import java.math.BigInteger; + +import org.apache.cloudstack.context.CallContext; + +import com.cloud.certificate.CrlVO; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + +@DB +public class CrlDaoImpl extends GenericDaoBase implements CrlDao { + + private final SearchBuilder CrlBySerialSearch; + + public CrlDaoImpl() { + super(); + + CrlBySerialSearch = createSearchBuilder(); + CrlBySerialSearch.and("certSerial", CrlBySerialSearch.entity().getCertSerial(), SearchCriteria.Op.EQ); + CrlBySerialSearch.done(); + } + + @Override + public CrlVO findBySerial(final BigInteger certSerial) { + if (certSerial == null) { + return null; + } + final SearchCriteria sc = CrlBySerialSearch.create("certSerial", certSerial.toString(16)); + return findOneBy(sc); + } + + @Override + public CrlVO revokeCertificate(final BigInteger certSerial, final String certCn) { + final CrlVO revokedCertificate = new CrlVO(certSerial, certCn == null ? "" : certCn, CallContext.current().getCallingUserUuid()); + return persist(revokedCertificate); + } +} diff --git a/engine/schema/src/com/cloud/configuration/ManagementServiceConfiguration.java b/engine/schema/src/com/cloud/configuration/ManagementServiceConfiguration.java new file mode 100644 index 000000000000..51b7f62f56de --- /dev/null +++ b/engine/schema/src/com/cloud/configuration/ManagementServiceConfiguration.java @@ -0,0 +1,30 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.configuration; + +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; + +public interface ManagementServiceConfiguration extends Configurable { + ConfigKey PingInterval = new ConfigKey("Advanced", Integer.class, "ping.interval", "60", + "Interval to send application level pings to make sure the connection is still working", false); + ConfigKey PingTimeout = new ConfigKey("Advanced", Float.class, "ping.timeout", "2.5", + "Multiplier to ping.interval before announcing an agent has timed out", true); + public int getPingInterval(); + public float getPingTimeout(); + public long getTimeout(); +} diff --git a/engine/schema/src/com/cloud/configuration/ManagementServiceConfigurationImpl.java b/engine/schema/src/com/cloud/configuration/ManagementServiceConfigurationImpl.java new file mode 100644 index 000000000000..a827014f8593 --- /dev/null +++ b/engine/schema/src/com/cloud/configuration/ManagementServiceConfigurationImpl.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.configuration; + +import org.apache.cloudstack.framework.config.ConfigKey; + +public class ManagementServiceConfigurationImpl implements ManagementServiceConfiguration { + @Override + public String getConfigComponentName() { + return ManagementServiceConfiguration.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[] {PingInterval, PingTimeout}; + } + + @Override + public int getPingInterval() { + return ManagementServiceConfiguration.PingInterval.value(); + } + + @Override + public float getPingTimeout() { + return ManagementServiceConfiguration.PingTimeout.value(); + } + + @Override + public long getTimeout() { + return (long) (PingTimeout.value() * PingInterval.value()); + } +} diff --git a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDao.java b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDao.java index d4695c3ff751..c1ad254d1510 100644 --- a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDao.java +++ b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDao.java @@ -57,4 +57,16 @@ public interface ResourceCountDao extends GenericDao { Set listRowsToUpdateForDomain(long domainId, ResourceType type); long removeEntriesByOwner(long ownerId, ResourceOwnerType ownerType); -} + + /** + * Counts the number of CPU cores allocated for the given account. + * Side note: This method is not using the "resource_count" table. It is executing the actual count instead. + */ + long countCpuNumberAllocatedToAccount(long accountId); + + /** + * Counts the amount of memory allocated for the given account. + * Side note: This method is not using the "resource_count" table. It is executing the actual count instead. + */ + long countMemoryAllocatedToAccount(long accountId); +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java index f7cd3cbf86f6..9cc8913f8fa1 100644 --- a/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java +++ b/engine/schema/src/com/cloud/configuration/dao/ResourceCountDaoImpl.java @@ -16,6 +16,9 @@ // under the License. package com.cloud.configuration.dao; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; import java.util.ArrayList; import java.util.HashSet; import java.util.List; @@ -42,6 +45,7 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.TransactionLegacy; +import com.cloud.utils.exception.CloudRuntimeException; @Component public class ResourceCountDaoImpl extends GenericDaoBase implements ResourceCountDao { @@ -248,4 +252,41 @@ public long removeEntriesByOwner(long ownerId, ResourceOwnerType ownerType) { return 0; } + private String baseSqlCountComputingResourceAllocatedToAccount = "Select " + + " SUM((CASE " + + " WHEN so.%s is not null THEN so.%s " + + " ELSE CONVERT(vmd.value, UNSIGNED INTEGER) " + + " END)) as total " + + " from vm_instance vm " + + " join service_offering_view so on so.id = vm.service_offering_id " + + " left join user_vm_details vmd on vmd.vm_id = vm.id and vmd.name = '%s' " + + " where vm.type = 'User' and state not in ('Destroyed', 'Error', 'Expunging') and display_vm = true and account_id = ? "; + + @Override + public long countCpuNumberAllocatedToAccount(long accountId) { + String sqlCountCpuNumberAllocatedToAccount = String.format(baseSqlCountComputingResourceAllocatedToAccount, ResourceType.cpu, ResourceType.cpu, "cpuNumber"); + return executeSqlCountComputingResourcesForAccount(accountId, sqlCountCpuNumberAllocatedToAccount); + } + + @Override + public long countMemoryAllocatedToAccount(long accountId) { + String serviceOfferingRamSizeField = "ram_size"; + String sqlCountCpuNumberAllocatedToAccount = String.format(baseSqlCountComputingResourceAllocatedToAccount, serviceOfferingRamSizeField, serviceOfferingRamSizeField, "memory"); + return executeSqlCountComputingResourcesForAccount(accountId, sqlCountCpuNumberAllocatedToAccount); + } + + private long executeSqlCountComputingResourcesForAccount(long accountId, String sqlCountComputingResourcesAllocatedToAccount) { + try (TransactionLegacy tx = TransactionLegacy.currentTxn()) { + PreparedStatement pstmt = tx.prepareAutoCloseStatement(sqlCountComputingResourcesAllocatedToAccount); + pstmt.setLong(1, accountId); + + ResultSet rs = pstmt.executeQuery(); + if (!rs.next()) { + throw new CloudRuntimeException(String.format("An unexpected case happened while counting allocated computing resources for account: " + accountId)); + } + return rs.getLong("total"); + } catch (SQLException e) { + throw new CloudRuntimeException(e); + } + } } \ No newline at end of file diff --git a/engine/schema/src/com/cloud/dc/ClusterVO.java b/engine/schema/src/com/cloud/dc/ClusterVO.java index b701542fbdb8..2a76789136a9 100644 --- a/engine/schema/src/com/cloud/dc/ClusterVO.java +++ b/engine/schema/src/com/cloud/dc/ClusterVO.java @@ -16,8 +16,12 @@ // under the License. package com.cloud.dc; -import java.util.Date; -import java.util.UUID; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.org.Cluster; +import com.cloud.org.Grouping; +import com.cloud.org.Managed.ManagedState; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GenericDao; import javax.persistence.Column; import javax.persistence.Entity; @@ -27,13 +31,8 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; - -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.org.Cluster; -import com.cloud.org.Grouping; -import com.cloud.org.Managed.ManagedState; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.db.GenericDao; +import java.util.Date; +import java.util.UUID; @Entity @Table(name = "cluster") @@ -192,4 +191,9 @@ public String getUuid() { public void setUuid(String uuid) { this.uuid = uuid; } + + @Override + public PartitionType partitionType() { + return PartitionType.Cluster; + } } diff --git a/engine/schema/src/com/cloud/dc/DataCenterIpAddressVO.java b/engine/schema/src/com/cloud/dc/DataCenterIpAddressVO.java index 70b4df166543..3d68cc3d9a86 100644 --- a/engine/schema/src/com/cloud/dc/DataCenterIpAddressVO.java +++ b/engine/schema/src/com/cloud/dc/DataCenterIpAddressVO.java @@ -60,6 +60,12 @@ public class DataCenterIpAddressVO implements InternalIdentity { @Column(name = "mac_address") long macAddress; + @Column(name = "forsystemvms") + private boolean forSystemVms; + + @Column(name = "vlan") + private Integer vlan; + protected DataCenterIpAddressVO() { } @@ -113,4 +119,12 @@ public Date getTakenAt() { public long getMacAddress() { return macAddress; } + + public boolean isForSystemVms() { + return forSystemVms; + } + + public Integer getVlan() { + return vlan; + } } diff --git a/engine/schema/src/com/cloud/dc/DataCenterVO.java b/engine/schema/src/com/cloud/dc/DataCenterVO.java index 42ea34a4704e..4ab0eada1e11 100644 --- a/engine/schema/src/com/cloud/dc/DataCenterVO.java +++ b/engine/schema/src/com/cloud/dc/DataCenterVO.java @@ -16,9 +16,10 @@ // under the License. package com.cloud.dc; -import java.util.Date; -import java.util.Map; -import java.util.UUID; +import com.cloud.network.Network.Provider; +import com.cloud.org.Grouping; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GenericDao; import javax.persistence.Column; import javax.persistence.Entity; @@ -30,11 +31,9 @@ import javax.persistence.Table; import javax.persistence.TableGenerator; import javax.persistence.Transient; - -import com.cloud.network.Network.Provider; -import com.cloud.org.Grouping; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.db.GenericDao; +import java.util.Date; +import java.util.Map; +import java.util.UUID; @Entity @Table(name = "data_center") @@ -454,4 +453,9 @@ public String getIp6Dns2() { public void setIp6Dns2(String ip6Dns2) { this.ip6Dns2 = ip6Dns2; } + + @Override + public PartitionType partitionType() { + return PartitionType.Zone; + } } diff --git a/engine/schema/src/com/cloud/dc/VlanDetailsVO.java b/engine/schema/src/com/cloud/dc/VlanDetailsVO.java new file mode 100644 index 000000000000..1a1db3a56814 --- /dev/null +++ b/engine/schema/src/com/cloud/dc/VlanDetailsVO.java @@ -0,0 +1,83 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.dc; + +import org.apache.cloudstack.api.ResourceDetail; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = "vlan_details") +public class VlanDetailsVO implements ResourceDetail { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "vlan_id") + private long resourceId; + + @Column(name = "name") + private String name; + + @Column(name = "value", length = 1024) + private String value; + + @Column(name = "display") + private boolean display = true; + + public VlanDetailsVO() { + } + + public VlanDetailsVO(long networkId, String name, String value, boolean display) { + this.resourceId = networkId; + this.name = name; + this.value = value; + this.display = display; + } + + @Override + public long getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return value; + } + + @Override + public long getResourceId() { + return resourceId; + } + + @Override + public boolean isDisplay() { + return display; + } + +} diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java index 4fc055e6ac8c..a6cd59f1cc35 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDao.java @@ -21,10 +21,35 @@ import com.cloud.dc.DataCenterIpAddressVO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.DataCenterVnetVO; -import com.cloud.utils.Pair; import com.cloud.utils.db.GenericDao; public interface DataCenterDao extends GenericDao { + + class PrivateAllocationData { + + private String ipAddress; + private Long macAddress; + private Integer vlan; + + public PrivateAllocationData(final String ipAddress, final Long macAddress, final Integer vlan) { + this.ipAddress = ipAddress; + this.macAddress = macAddress; + this.vlan = vlan; + } + + public String getIpAddress() { + return ipAddress; + } + + public Long getMacAddress() { + return macAddress; + } + + public Integer getVlan() { + return vlan; + } + } + DataCenterVO findByName(String name); /** @@ -35,7 +60,7 @@ public interface DataCenterDao extends GenericDao { String[] getNextAvailableMacAddressPair(long id, long mask); - Pair allocatePrivateIpAddress(long id, long podId, long instanceId, String reservationId); + PrivateAllocationData allocatePrivateIpAddress(long id, long podId, long instanceId, String reservationId, boolean forSystemVms); DataCenterIpAddressVO allocatePrivateIpAddress(long id, String reservationId); @@ -57,7 +82,7 @@ public interface DataCenterDao extends GenericDao { boolean deleteLinkLocalIpAddressByPod(long podId); - void addPrivateIpAddress(long dcId, long podId, String start, String end); + void addPrivateIpAddress(long dcId, long podId, String start, String end, boolean forSystemVms, Integer vlan); void addLinkLocalIpAddress(long dcId, long podId, String start, String end); diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java index 847a24730fc3..385fb4061551 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterDaoImpl.java @@ -38,7 +38,6 @@ import com.cloud.network.dao.AccountGuestVlanMapVO; import com.cloud.org.Grouping; import com.cloud.utils.NumbersUtil; -import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; @@ -247,13 +246,13 @@ public String[] getNextAvailableMacAddressPair(long id, long mask) { } @Override - public Pair allocatePrivateIpAddress(long dcId, long podId, long instanceId, String reservationId) { + public PrivateAllocationData allocatePrivateIpAddress(long dcId, long podId, long instanceId, String reservationId, boolean forSystemVms) { _ipAllocDao.releaseIpAddress(instanceId); - DataCenterIpAddressVO vo = _ipAllocDao.takeIpAddress(dcId, podId, instanceId, reservationId); + DataCenterIpAddressVO vo = _ipAllocDao.takeIpAddress(dcId, podId, instanceId, reservationId, forSystemVms); if (vo == null) { return null; } - return new Pair(vo.getIpAddress(), vo.getMacAddress()); + return new PrivateAllocationData(vo.getIpAddress(), vo.getMacAddress(), vo.getVlan()); } @Override @@ -287,8 +286,8 @@ public List listAllocatedVnets(long physicalNetworkId) { } @Override - public void addPrivateIpAddress(long dcId, long podId, String start, String end) { - _ipAllocDao.addIpRange(dcId, podId, start, end); + public void addPrivateIpAddress(long dcId, long podId, String start, String end, boolean forSystemVms, Integer vlan) { + _ipAllocDao.addIpRange(dcId, podId, start, end, forSystemVms, vlan); } @Override diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDao.java index e5843b694993..bb840b5adec4 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDao.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterIpAddressDao.java @@ -23,17 +23,17 @@ public interface DataCenterIpAddressDao extends GenericDao { - public DataCenterIpAddressVO takeIpAddress(long dcId, long podId, long instanceId, String reservationId); + DataCenterIpAddressVO takeIpAddress(long dcId, long podId, long instanceId, String reservationId, boolean forSystemVms); - public DataCenterIpAddressVO takeDataCenterIpAddress(long dcId, String reservationId); + DataCenterIpAddressVO takeDataCenterIpAddress(long dcId, String reservationId); - public void addIpRange(long dcId, long podId, String start, String end); + void addIpRange(long dcId, long podId, String start, String end, boolean forSystemVms, Integer vlan); - public void releaseIpAddress(String ipAddress, long dcId, Long instanceId); + void releaseIpAddress(String ipAddress, long dcId, Long instanceId); - public void releaseIpAddress(long nicId, String reservationId); + void releaseIpAddress(long nicId, String reservationId); - public void releaseIpAddress(long nicId); + void releaseIpAddress(long nicId); boolean mark(long dcId, long podId, String ip); @@ -45,6 +45,11 @@ public interface DataCenterIpAddressDao extends GenericDao implements DataCenterIpAddressDao { +public class DataCenterIpAddressDaoImpl extends GenericDaoBase implements DataCenterIpAddressDao, Configurable { private static final Logger s_logger = Logger.getLogger(DataCenterIpAddressDaoImpl.class); private final SearchBuilder AllFieldsSearch; @@ -47,16 +49,26 @@ public class DataCenterIpAddressDaoImpl extends GenericDaoBase AllAllocatedIpCount; private final GenericSearchBuilder AllAllocatedIpCountForDc; + private static final ConfigKey SystemVmManagementIpReservationModeStrictness = new ConfigKey("Advanced", + Boolean.class, "system.vm.management.ip.reservation.mode.strictness", "false","If enabled, the use of System VMs management IP reservation is strict, preferred if not.", false, ConfigKey.Scope.Global); + @Override @DB - public DataCenterIpAddressVO takeIpAddress(long dcId, long podId, long instanceId, String reservationId) { + public DataCenterIpAddressVO takeIpAddress(long dcId, long podId, long instanceId, String reservationId, boolean forSystemVms) { SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("pod", podId); sc.setParameters("taken", (Date)null); + sc.setParameters("forSystemVms", forSystemVms); TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start(); DataCenterIpAddressVO vo = lockOneRandomRow(sc, true); + + // If there is no explicitly created range for system vms and reservation mode is preferred (strictness = false) + if (forSystemVms && vo == null && !SystemVmManagementIpReservationModeStrictness.value()) { + sc.setParameters("forSystemVms", false); + vo = lockOneRandomRow(sc, true); + } if (vo == null) { txn.rollback(); return null; @@ -97,6 +109,16 @@ public boolean deleteIpAddressByPod(long podId) { return remove(sc) > 0; } + @Override + public boolean deleteIpAddressByPodDc(String ipAddress, long podId, long dcId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("ipAddress", ipAddress); + sc.setParameters("pod", podId); + sc.setParameters("dc", dcId); + + return remove(sc) > 0; + } + @Override public boolean mark(long dcId, long podId, String ip) { SearchCriteria sc = AllFieldsSearch.create(); @@ -111,10 +133,10 @@ public boolean mark(long dcId, long podId, String ip) { @Override @DB - public void addIpRange(long dcId, long podId, String start, String end) { + public void addIpRange(long dcId, long podId, String start, String end, boolean forSystemVms, Integer vlan) { TransactionLegacy txn = TransactionLegacy.currentTxn(); - String insertSql = "INSERT INTO `cloud`.`op_dc_ip_address_alloc` (ip_address, data_center_id, pod_id, mac_address) " + - "VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?))"; + String insertSql = "INSERT INTO `cloud`.`op_dc_ip_address_alloc` (ip_address, data_center_id, pod_id, mac_address, forsystemvms" + (vlan == null ? ") " : ", vlan) ") + + "VALUES (?, ?, ?, (select mac_address from `cloud`.`data_center` where id=?), ?" + (vlan == null ? ")" : ", ?)"); String updateSql = "UPDATE `cloud`.`data_center` set mac_address = mac_address+1 where id=?"; long startIP = NetUtils.ip2Long(start); @@ -129,6 +151,10 @@ public void addIpRange(long dcId, long podId, String start, String end) { insertPstmt.setLong(2, dcId); insertPstmt.setLong(3, podId); insertPstmt.setLong(4, dcId); + insertPstmt.setBoolean(5, forSystemVms); + if (vlan != null) { + insertPstmt.setInt(6, vlan); + } insertPstmt.executeUpdate(); } try(PreparedStatement updatePstmt = txn.prepareStatement(updateSql);) { @@ -176,6 +202,19 @@ public void releaseIpAddress(long nicId, String reservationId) { update(vo, sc); } + @Override + public void releasePodIpAddress(long id) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Releasing ip address for ID=" + id); + } + + DataCenterIpAddressVO vo = this.findById(id); + vo.setTakenAt(null); + vo.setInstanceId(null); + vo.setReservationId(null); + persist(vo); + } + @Override public void releaseIpAddress(long nicId) { if (s_logger.isDebugEnabled()) { @@ -235,6 +274,22 @@ public int countIPs(long dcId, boolean onlyCountAllocated) { return count.get(0); } + @Override + public int countIpAddressUsage(final String ipAddress, final long podId, final long dcId, final boolean onlyCountAllocated) { + SearchCriteria sc = createSearchCriteria(); + + if(onlyCountAllocated) { + sc.addAnd("takenAt", SearchCriteria.Op.NNULL); + } + + sc.addAnd("ipAddress", SearchCriteria.Op.EQ, ipAddress); + sc.addAnd("podId", SearchCriteria.Op.EQ, podId); + sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, dcId); + + List result = listBy(sc); + return result.size(); + } + public DataCenterIpAddressDaoImpl() { super(); @@ -246,6 +301,7 @@ public DataCenterIpAddressDaoImpl() { AllFieldsSearch.and("ipAddress", AllFieldsSearch.entity().getIpAddress(), SearchCriteria.Op.EQ); AllFieldsSearch.and("reservation", AllFieldsSearch.entity().getReservationId(), SearchCriteria.Op.EQ); AllFieldsSearch.and("taken", AllFieldsSearch.entity().getTakenAt(), SearchCriteria.Op.EQ); + AllFieldsSearch.and("forSystemVms", AllFieldsSearch.entity().isForSystemVms(), SearchCriteria.Op.EQ); AllFieldsSearch.done(); AllIpCount = createSearchBuilder(Integer.class); @@ -270,4 +326,14 @@ public DataCenterIpAddressDaoImpl() { AllAllocatedIpCountForDc.and("removed", AllAllocatedIpCountForDc.entity().getTakenAt(), SearchCriteria.Op.NNULL); AllAllocatedIpCountForDc.done(); } + + @Override + public String getConfigComponentName() { + return DataCenterIpAddressDao.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[] {SystemVmManagementIpReservationModeStrictness}; + } } diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java index 1783231f4fbb..556ab4513911 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDao.java @@ -27,10 +27,10 @@ public interface DataCenterVnetDao extends GenericDao { public List listAllocatedVnetsInRange(long dcId, long physicalNetworkId, Integer start, Integer end); - public List findVnet(long dcId, String vnet); - public int countZoneVlans(long dcId, boolean onlyCountAllocated); + public List findVnet(long dcId, String vnet); + public List findVnet(long dcId, long physicalNetworkId, String vnet); public void add(long dcId, long physicalNetworkId, List vnets); diff --git a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java index 3205fcd6af64..1c29e6a944c6 100644 --- a/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/DataCenterVnetDaoImpl.java @@ -18,6 +18,7 @@ import java.sql.PreparedStatement; import java.sql.SQLException; +import java.util.ArrayList; import java.util.Date; import java.util.List; import java.util.Map; @@ -30,6 +31,8 @@ import com.cloud.dc.DataCenterVnetVO; import com.cloud.network.dao.AccountGuestVlanMapDao; import com.cloud.network.dao.AccountGuestVlanMapVO; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.UriUtils; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; @@ -99,15 +102,6 @@ public void lockRange(long dcId, long physicalNetworkId, Integer start, Integer lockRows(sc, null, true); } - @Override - public List findVnet(long dcId, String vnet) { - SearchCriteria sc = VnetDcSearch.create(); - ; - sc.setParameters("dc", dcId); - sc.setParameters("vnet", vnet); - return listBy(sc); - } - @Override public int countZoneVlans(long dcId, boolean onlyCountAllocated) { SearchCriteria sc = onlyCountAllocated ? countAllocatedZoneVlans.create() : countZoneVlans.create(); @@ -115,14 +109,37 @@ public int countZoneVlans(long dcId, boolean onlyCountAllocated) { return customSearch(sc, null).get(0); } - @Override - public List findVnet(long dcId, long physicalNetworkId, String vnet) { + private List findOverlappingVnets(final long dcId, final Long physicalNetworkId, final String vnet) { + final List searchVnets = UriUtils.expandVlanUri(vnet); + final List overlappingVnets = new ArrayList<>(); + if (searchVnets == null || searchVnets.isEmpty()) { + return overlappingVnets; + } SearchCriteria sc = VnetDcSearch.create(); sc.setParameters("dc", dcId); - sc.setParameters("physicalNetworkId", physicalNetworkId); - sc.setParameters("vnet", vnet); + if (physicalNetworkId != null) { + sc.setParameters("physicalNetworkId", physicalNetworkId); + } + for (final DataCenterVnetVO dcVNet : listBy(sc)) { + if (dcVNet == null || dcVNet.getVnet() == null) { + continue; + } + final Integer vnetValue = NumbersUtil.parseInt(dcVNet.getVnet(), -1); + if (vnetValue != -1 && searchVnets.contains(vnetValue)) { + overlappingVnets.add(dcVNet); + } + } + return overlappingVnets; + } - return listBy(sc); + @Override + public List findVnet(long dcId, String vnet) { + return findOverlappingVnets(dcId, null, vnet); + } + + @Override + public List findVnet(long dcId, long physicalNetworkId, String vnet) { + return findOverlappingVnets(dcId, physicalNetworkId, vnet); } @Override diff --git a/engine/schema/src/com/cloud/dc/dao/DomainVlanMapDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/DomainVlanMapDaoImpl.java index a5fd5fa1300a..36ca69959568 100644 --- a/engine/schema/src/com/cloud/dc/dao/DomainVlanMapDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/DomainVlanMapDaoImpl.java @@ -18,8 +18,6 @@ import java.util.List; -import javax.ejb.Local; - import org.springframework.stereotype.Component; import com.cloud.dc.DomainVlanMapVO; @@ -28,7 +26,6 @@ import com.cloud.utils.db.SearchCriteria; @Component -@Local(value={DomainVlanMapDao.class}) public class DomainVlanMapDaoImpl extends GenericDaoBase implements DomainVlanMapDao { protected SearchBuilder DomainSearch; protected SearchBuilder VlanSearch; diff --git a/engine/schema/src/com/cloud/dc/dao/HostPodDao.java b/engine/schema/src/com/cloud/dc/dao/HostPodDao.java index 1a000d8830c5..b2e9b898606c 100644 --- a/engine/schema/src/com/cloud/dc/dao/HostPodDao.java +++ b/engine/schema/src/com/cloud/dc/dao/HostPodDao.java @@ -32,4 +32,6 @@ public interface HostPodDao extends GenericDao { public List listDisabledPods(long zoneId); public List listAllPods(Long zoneId); + + public List listAllPodsByCidr(long zoneId, String cidr); } diff --git a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java index 1c83b3a4a78d..3fbeb58c56ff 100644 --- a/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/HostPodDaoImpl.java @@ -137,4 +137,12 @@ public List listAllPods(Long zoneId) { } return customSearch(sc, null); } + @Override + public List listAllPodsByCidr(long zoneId, String cidr) { + SearchCriteria sc = DataCenterAndNameSearch.create(); + sc.setParameters("dataCenterId", zoneId); + sc.setParameters("cidr_address", cidr); + return listBy(sc); + } + } diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDao.java b/engine/schema/src/com/cloud/dc/dao/VlanDao.java index 485593e8f455..e92a5cc6f1ce 100644 --- a/engine/schema/src/com/cloud/dc/dao/VlanDao.java +++ b/engine/schema/src/com/cloud/dc/dao/VlanDao.java @@ -49,6 +49,8 @@ public interface VlanDao extends GenericDao { List listVlansByNetworkId(long networkId); + List listVlansByNetworkIdIncludingRemoved(long networkId); + List listVlansByPhysicalNetworkId(long physicalNetworkId); List listZoneWideNonDedicatedVlans(long zoneId); diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java index eabfbaa8b28f..0c5914824f4f 100644 --- a/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java +++ b/engine/schema/src/com/cloud/dc/dao/VlanDaoImpl.java @@ -105,7 +105,7 @@ public VlanDaoImpl() { ZoneTypeSearch.done(); NetworkVlanSearch = createSearchBuilder(); - NetworkVlanSearch.and("networkOfferingId", NetworkVlanSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); + NetworkVlanSearch.and("networkId", NetworkVlanSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); NetworkVlanSearch.done(); PhysicalNetworkVlanSearch = createSearchBuilder(); @@ -330,12 +330,18 @@ public List searchForZoneWideVlans(long dcId, String vlanType, String vl } @Override - public List listVlansByNetworkId(long networkOfferingId) { + public List listVlansByNetworkId(long networkId) { SearchCriteria sc = NetworkVlanSearch.create(); - sc.setParameters("networkOfferingId", networkOfferingId); + sc.setParameters("networkId", networkId); return listBy(sc); } + @Override public List listVlansByNetworkIdIncludingRemoved(long networkId) { + SearchCriteria sc = NetworkVlanSearch.create(); + sc.setParameters("networkId", networkId); + return listIncludingRemovedBy(sc); + } + @Override public List listVlansByNetworkIdAndGateway(long networkid, String gateway) { SearchCriteria sc = VlanGatewaysearch.create(); diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDetailsDao.java b/engine/schema/src/com/cloud/dc/dao/VlanDetailsDao.java new file mode 100644 index 000000000000..dfc72a0d3bef --- /dev/null +++ b/engine/schema/src/com/cloud/dc/dao/VlanDetailsDao.java @@ -0,0 +1,25 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.dc.dao; + +import com.cloud.dc.VlanDetailsVO; +import com.cloud.utils.db.GenericDao; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDao; + +public interface VlanDetailsDao extends GenericDao, ResourceDetailsDao { + +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/dc/dao/VlanDetailsDaoImpl.java b/engine/schema/src/com/cloud/dc/dao/VlanDetailsDaoImpl.java new file mode 100644 index 000000000000..43f9087c0f6f --- /dev/null +++ b/engine/schema/src/com/cloud/dc/dao/VlanDetailsDaoImpl.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.dc.dao; + + +import com.cloud.dc.VlanDetailsVO; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase; +import org.springframework.stereotype.Component; + +@Component +public class VlanDetailsDaoImpl extends ResourceDetailsDaoBase implements VlanDetailsDao { + + @Override + public void addDetail(long resourceId, String key, String value, boolean display) { + super.addDetail(new VlanDetailsVO(resourceId, key, value, display)); + } + +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/domain/DomainDetailVO.java b/engine/schema/src/com/cloud/domain/DomainDetailVO.java new file mode 100644 index 000000000000..61eb6cfd28e8 --- /dev/null +++ b/engine/schema/src/com/cloud/domain/DomainDetailVO.java @@ -0,0 +1,76 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.domain; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import com.cloud.utils.db.Encrypt; +import org.apache.cloudstack.api.InternalIdentity; + +@Entity +@Table(name = "domain_details") +public class DomainDetailVO implements InternalIdentity { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "domain_id") + private long domainId; + + @Column(name = "name") + private String name; + + @Encrypt + @Column(name = "value") + private String value; + + protected DomainDetailVO() { + } + + public DomainDetailVO(long domainId, String name, String value) { + this.domainId = domainId; + this.name = name; + this.value = value; + } + + public long getDomainId() { + return domainId; + } + + public String getName() { + return name; + } + + public String getValue() { + return value; + } + + public void setValue(String value) { + this.value = value; + } + + @Override + public long getId() { + return id; + } +} diff --git a/engine/schema/src/com/cloud/domain/dao/DomainDetailsDao.java b/engine/schema/src/com/cloud/domain/dao/DomainDetailsDao.java new file mode 100644 index 000000000000..51362cf885e0 --- /dev/null +++ b/engine/schema/src/com/cloud/domain/dao/DomainDetailsDao.java @@ -0,0 +1,34 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.domain.dao; + +import java.util.Map; + +import com.cloud.domain.DomainDetailVO; +import com.cloud.utils.db.GenericDao; + +public interface DomainDetailsDao extends GenericDao { + Map findDetails(long domainId); + + void persist(long domainId, Map details); + + DomainDetailVO findDetail(long domainId, String name); + + void deleteDetails(long domainId); + + void update(long domainId, Map details); +} diff --git a/engine/schema/src/com/cloud/domain/dao/DomainDetailsDaoImpl.java b/engine/schema/src/com/cloud/domain/dao/DomainDetailsDaoImpl.java new file mode 100644 index 000000000000..ad7f70402074 --- /dev/null +++ b/engine/schema/src/com/cloud/domain/dao/DomainDetailsDaoImpl.java @@ -0,0 +1,104 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.domain.dao; + +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.cloud.domain.DomainDetailVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.QueryBuilder; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; +import com.cloud.utils.db.TransactionLegacy; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.ConfigKey.Scope; +import org.apache.cloudstack.framework.config.ScopedConfigStorage; + +public class DomainDetailsDaoImpl extends GenericDaoBase implements DomainDetailsDao, ScopedConfigStorage { + protected final SearchBuilder domainSearch; + + protected DomainDetailsDaoImpl() { + domainSearch = createSearchBuilder(); + domainSearch.and("domainId", domainSearch.entity().getDomainId(), Op.EQ); + domainSearch.done(); + } + + @Override + public Map findDetails(long domainId) { + QueryBuilder sc = QueryBuilder.create(DomainDetailVO.class); + sc.and(sc.entity().getDomainId(), Op.EQ, domainId); + List results = sc.list(); + Map details = new HashMap(results.size()); + for (DomainDetailVO r : results) { + details.put(r.getName(), r.getValue()); + } + return details; + } + + @Override + public void persist(long domainId, Map details) { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + txn.start(); + SearchCriteria sc = domainSearch.create(); + sc.setParameters("domainId", domainId); + expunge(sc); + for (Map.Entry detail : details.entrySet()) { + DomainDetailVO vo = new DomainDetailVO(domainId, detail.getKey(), detail.getValue()); + persist(vo); + } + txn.commit(); + } + + @Override + public DomainDetailVO findDetail(long domainId, String name) { + QueryBuilder sc = QueryBuilder.create(DomainDetailVO.class); + sc.and(sc.entity().getDomainId(), Op.EQ, domainId); + sc.and(sc.entity().getName(), Op.EQ, name); + return sc.find(); + } + + @Override + public void deleteDetails(long domainId) { + SearchCriteria sc = domainSearch.create(); + sc.setParameters("domainId", domainId); + List results = search(sc, null); + for (DomainDetailVO result : results) { + remove(result.getId()); + } + } + + @Override + public void update(long domainId, Map details) { + Map oldDetails = findDetails(domainId); + oldDetails.putAll(details); + persist(domainId, oldDetails); + } + + @Override + public Scope getScope() { + return Scope.Domain; + } + + @Override + public String getConfigValue(long id, ConfigKey key) { + DomainDetailVO vo = findDetail(id, key.key()); + return vo == null ? null : vo.getValue(); + } +} diff --git a/engine/schema/src/com/cloud/host/HostVO.java b/engine/schema/src/com/cloud/host/HostVO.java index c5938d652206..7fd1e7101850 100644 --- a/engine/schema/src/com/cloud/host/HostVO.java +++ b/engine/schema/src/com/cloud/host/HostVO.java @@ -16,11 +16,12 @@ // under the License. package com.cloud.host; -import java.util.Date; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.UUID; +import com.cloud.agent.api.VgpuTypesInfo; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.resource.ResourceState; +import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GenericDao; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; @@ -37,13 +38,11 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; - -import com.cloud.agent.api.VgpuTypesInfo; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.resource.ResourceState; -import com.cloud.storage.Storage.StoragePoolType; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.db.GenericDao; +import java.util.Date; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.UUID; @Entity @Table(name = "host") @@ -178,6 +177,11 @@ public Long getClusterId() { return clusterId; } + @Override + public ResourceType resourceType() { + return ResourceType.Host; + } + public void setClusterId(Long clusterId) { this.clusterId = clusterId; } @@ -713,6 +717,11 @@ public boolean isInMaintenanceStates() { return (getResourceState() == ResourceState.Maintenance || getResourceState() == ResourceState.ErrorInMaintenance || getResourceState() == ResourceState.PrepareForMaintenance); } + @Override + public boolean isDisabled() { + return (getResourceState() == ResourceState.Disabled); + } + public long getUpdated() { return updated; } @@ -730,4 +739,9 @@ public String getUuid() { public void setUuid(String uuid) { this.uuid = uuid; } + + @Override + public PartitionType partitionType() { + return PartitionType.Host; + } } diff --git a/engine/schema/src/com/cloud/host/dao/HostDao.java b/engine/schema/src/com/cloud/host/dao/HostDao.java index 88a354725a9e..71c9cd23867d 100644 --- a/engine/schema/src/com/cloud/host/dao/HostDao.java +++ b/engine/schema/src/com/cloud/host/dao/HostDao.java @@ -24,6 +24,7 @@ import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.hypervisor.Hypervisor; +import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.info.RunningHostCountInfo; import com.cloud.resource.ResourceState; import com.cloud.utils.db.GenericDao; @@ -72,14 +73,6 @@ public interface HostDao extends GenericDao, StateDao findHypervisorHostInCluster(long clusterId); - /** - * @param type - * @param clusterId - * @param podId - * @param dcId - * @param haTag TODO - * @return - */ List listAllUpAndEnabledNonHAHosts(Type type, Long clusterId, Long podId, long dcId, String haTag); List findByDataCenterId(Long zoneId); @@ -98,5 +91,20 @@ public interface HostDao extends GenericDao, StateDao listClustersByHostTag(String hostTagOnOffering); + List listByType(Type type); + + HostVO findByIp(String ip); + + /** + * This method will look for a host that is of the same hypervisor and zone as indicated in its parameters. + *
    + *
  • We give priority to 'Enabled' hosts, but if no 'Enabled' hosts are found, we use 'Disabled' hosts + *
  • If no host is found, we throw a runtime exception + *
+ * + * Side note: this method is currently only used in XenServerGuru; therefore, it was designed to meet XenServer deployment scenarios requirements. + */ + HostVO findHostInZoneToExecuteCommand(long zoneId, HypervisorType hypervisorType); } diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java index 46f8a4da2bc1..e48bfd58a6a8 100644 --- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java +++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java @@ -24,10 +24,10 @@ import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.Objects; import java.util.TimeZone; import javax.annotation.PostConstruct; -import javax.ejb.Local; import javax.inject.Inject; import javax.persistence.TableGenerator; @@ -37,6 +37,7 @@ import com.cloud.agent.api.VgpuTypesInfo; import com.cloud.cluster.agentlb.HostTransferMapVO; import com.cloud.cluster.agentlb.dao.HostTransferMapDao; +import com.cloud.configuration.ManagementServiceConfiguration; import com.cloud.dc.ClusterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.gpu.dao.HostGpuGroupsDao; @@ -48,6 +49,7 @@ import com.cloud.host.Status; import com.cloud.host.Status.Event; import com.cloud.hypervisor.Hypervisor; +import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.info.RunningHostCountInfo; import com.cloud.org.Grouping; import com.cloud.org.Managed; @@ -69,7 +71,6 @@ import com.cloud.utils.exception.CloudRuntimeException; @Component -@Local(value = {HostDao.class}) @DB @TableGenerator(name = "host_req_sq", table = "op_host", pkColumnName = "id", valueColumnName = "sequence", allocationSize = 1) public class HostDaoImpl extends GenericDaoBase implements HostDao { //FIXME: , ExternalIdDao { @@ -77,6 +78,9 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao private static final Logger status_logger = Logger.getLogger(Status.class); private static final Logger state_logger = Logger.getLogger(ResourceState.class); + private static final String LIST_CLUSTERID_FOR_HOST_TAG = "select distinct cluster_id from host join host_tags on host.id = host_tags.host_id and host_tags.tag = ?"; + + protected SearchBuilder TypePodDcStatusSearch; protected SearchBuilder IdStatusSearch; @@ -87,6 +91,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao protected SearchBuilder DcPrivateIpAddressSearch; protected SearchBuilder DcStorageIpAddressSearch; protected SearchBuilder PublicIpAddressSearch; + protected SearchBuilder AnyIpAddressSearch; protected SearchBuilder GuidSearch; protected SearchBuilder DcSearch; @@ -141,6 +146,8 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao protected HostTransferMapDao _hostTransferDao; @Inject protected ClusterDao _clusterDao; + @Inject + ManagementServiceConfiguration mgmtServiceConf; public HostDaoImpl() { super(); @@ -214,6 +221,11 @@ public void init() { PublicIpAddressSearch.and("publicIpAddress", PublicIpAddressSearch.entity().getPublicIpAddress(), SearchCriteria.Op.EQ); PublicIpAddressSearch.done(); + AnyIpAddressSearch = createSearchBuilder(); + AnyIpAddressSearch.or("publicIpAddress", AnyIpAddressSearch.entity().getPublicIpAddress(), SearchCriteria.Op.EQ); + AnyIpAddressSearch.or("privateIpAddress", AnyIpAddressSearch.entity().getPrivateIpAddress(), SearchCriteria.Op.EQ); + AnyIpAddressSearch.done(); + GuidSearch = createSearchBuilder(); GuidSearch.and("guid", GuidSearch.entity().getGuid(), SearchCriteria.Op.EQ); GuidSearch.done(); @@ -295,11 +307,11 @@ public void init() { } HostTransferSearch.and("id", HostTransferSearch.entity().getId(), SearchCriteria.Op.NULL); UnmanagedDirectConnectSearch.join("hostTransferSearch", HostTransferSearch, HostTransferSearch.entity().getId(), UnmanagedDirectConnectSearch.entity().getId(), - JoinType.LEFTOUTER); + JoinType.LEFTOUTER); ClusterManagedSearch = _clusterDao.createSearchBuilder(); ClusterManagedSearch.and("managed", ClusterManagedSearch.entity().getManagedState(), SearchCriteria.Op.EQ); - UnmanagedDirectConnectSearch.join("ClusterManagedSearch", ClusterManagedSearch, ClusterManagedSearch.entity().getId(), UnmanagedDirectConnectSearch.entity() - .getClusterId(), JoinType.INNER); + UnmanagedDirectConnectSearch.join("ClusterManagedSearch", ClusterManagedSearch, ClusterManagedSearch.entity().getId(), UnmanagedDirectConnectSearch.entity().getClusterId(), + JoinType.INNER); UnmanagedDirectConnectSearch.done(); DirectConnectSearch = createSearchBuilder(); @@ -375,6 +387,12 @@ public void init() { ClustersForHostsNotOwnedByAnyMSSearch.and("resource", ClustersForHostsNotOwnedByAnyMSSearch.entity().getResource(), SearchCriteria.Op.NNULL); ClustersForHostsNotOwnedByAnyMSSearch.and("cluster", ClustersForHostsNotOwnedByAnyMSSearch.entity().getClusterId(), SearchCriteria.Op.NNULL); ClustersForHostsNotOwnedByAnyMSSearch.and("server", ClustersForHostsNotOwnedByAnyMSSearch.entity().getManagementServerId(), SearchCriteria.Op.NULL); + + ClusterManagedSearch = _clusterDao.createSearchBuilder(); + ClusterManagedSearch.and("managed", ClusterManagedSearch.entity().getManagedState(), SearchCriteria.Op.EQ); + ClustersForHostsNotOwnedByAnyMSSearch.join("ClusterManagedSearch", ClusterManagedSearch, ClusterManagedSearch.entity().getId(), + ClustersForHostsNotOwnedByAnyMSSearch.entity().getClusterId(), JoinType.INNER); + ClustersForHostsNotOwnedByAnyMSSearch.done(); AllClustersSearch = _clusterDao.createSearchBuilder(Long.class); @@ -499,23 +517,13 @@ private List findClustersOwnedByManagementServer(long managementServerId) */ private List findClustersForHostsNotOwnedByAnyManagementServer() { SearchCriteria sc = ClustersForHostsNotOwnedByAnyMSSearch.create(); + sc.setJoinParameters("ClusterManagedSearch", "managed", Managed.ManagedState.Managed); List clusters = customSearch(sc, null); return clusters; } - /* - * Returns a list of all cluster Ids - */ - private List listAllClusters() { - SearchCriteria sc = AllClustersSearch.create(); - sc.setParameters("managed", Managed.ManagedState.Managed); - - List clusters = _clusterDao.customSearch(sc, null); - return clusters; - } - - /* + /** * This determines if hosts belonging to cluster(@clusterId) are up for grabs * * This is used for handling following cases: @@ -537,7 +545,6 @@ private boolean canOwnCluster(long clusterId) { public List findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Long limit, long managementServerId) { TransactionLegacy txn = TransactionLegacy.currentTxn(); - txn.start(); if (s_logger.isDebugEnabled()) { s_logger.debug("Resetting hosts suitable for reconnect"); } @@ -553,6 +560,7 @@ public List findAndUpdateDirectAgentToLoad(long lastPingSecondsAfter, Lo s_logger.debug("Acquiring hosts for clusters already owned by this management server"); } List clusters = findClustersOwnedByManagementServer(managementServerId); + txn.start(); if (clusters.size() > 0) { // handle clusters already owned by @managementServerId SearchCriteria sc = UnmanagedDirectConnectSearch.create(); @@ -640,7 +648,7 @@ public List findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long SearchCriteria sc = UnmanagedApplianceSearch.create(); sc.setParameters("lastPinged", lastPingSecondsAfter); sc.setParameters("types", Type.ExternalDhcp, Type.ExternalFirewall, Type.ExternalLoadBalancer, Type.BaremetalDhcp, Type.BaremetalPxe, Type.TrafficMonitor, - Type.L2Networking); + Type.L2Networking, Type.NetScalerControlCenter); List hosts = lockRows(sc, null, true); for (HostVO host : hosts) { @@ -774,10 +782,8 @@ public void loadHostTags(HostVO host) { @Override public List findLostHosts(long timeout) { List result = new ArrayList(); - String sql = - "select h.id from host h left join cluster c on h.cluster_id=c.id where h.mgmt_server_id is not null and h.last_ping < ? and h.status in ('Up', 'Updating', 'Disconnected', 'Connecting') and h.type not in ('ExternalFirewall', 'ExternalLoadBalancer', 'TrafficMonitor', 'SecondaryStorage', 'LocalSecondaryStorage', 'L2Networking') and (h.cluster_id is null or c.managed_state = 'Managed') ;"; - try ( - TransactionLegacy txn = TransactionLegacy.currentTxn(); + String sql = "select h.id from host h left join cluster c on h.cluster_id=c.id where h.mgmt_server_id is not null and h.last_ping < ? and h.status in ('Up', 'Updating', 'Disconnected', 'Connecting') and h.type not in ('ExternalFirewall', 'ExternalLoadBalancer', 'TrafficMonitor', 'SecondaryStorage', 'LocalSecondaryStorage', 'L2Networking') and (h.cluster_id is null or c.managed_state = 'Managed') ;"; + try (TransactionLegacy txn = TransactionLegacy.currentTxn(); PreparedStatement pstmt = txn.prepareStatement(sql);) { pstmt.setLong(1, timeout); try (ResultSet rs = pstmt.executeQuery();) { @@ -871,8 +877,7 @@ public boolean update(Long hostId, HostVO host) { @Override @DB public List getRunningHostCounts(Date cutTime) { - String sql = - "select * from (" + "select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + String sql = "select * from (" + "select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + "where h.status='Up' and h.type='SecondaryStorage' and m.last_update > ? " + "group by h.data_center_id, h.type " + "UNION ALL " + "select h.data_center_id, h.type, count(*) as count from host as h INNER JOIN mshost as m ON h.mgmt_server_id=m.msid " + "where h.status='Up' and h.type='Routing' and m.last_update > ? " + "group by h.data_center_id, h.type) as t " + "ORDER by t.data_center_id, t.type"; @@ -977,7 +982,7 @@ public boolean updateState(Status oldStatus, Event event, Status newStatus, Host } } if (event.equals(Event.ManagementServerDown)) { - ub.set(host, _pingTimeAttr, ((System.currentTimeMillis() >> 10) - (10 * 60))); + ub.set(host, _pingTimeAttr, ((System.currentTimeMillis() >> 10) - mgmtServiceConf.getTimeout())); } int result = update(ub, sc, null); assert result <= 1 : "How can this update " + result + " rows? "; @@ -990,24 +995,12 @@ public boolean updateState(Status oldStatus, Event event, Status newStatus, Host StringBuilder str = new StringBuilder("Unable to update host for event:").append(event.toString()); str.append(". Name=").append(host.getName()); - str.append("; New=[status=") - .append(newStatus.toString()) - .append(":msid=") - .append(newStatus.lostConnection() ? "null" : host.getManagementServerId()) - .append(":lastpinged=") - .append(host.getLastPinged()) - .append("]"); + str.append("; New=[status=").append(newStatus.toString()).append(":msid=").append(newStatus.lostConnection() ? "null" : host.getManagementServerId()) + .append(":lastpinged=").append(host.getLastPinged()).append("]"); str.append("; Old=[status=").append(oldStatus.toString()).append(":msid=").append(host.getManagementServerId()).append(":lastpinged=").append(oldPingTime) - .append("]"); - str.append("; DB=[status=") - .append(vo.getStatus().toString()) - .append(":msid=") - .append(vo.getManagementServerId()) - .append(":lastpinged=") - .append(vo.getLastPinged()) - .append(":old update count=") - .append(oldUpdateCount) - .append("]"); + .append("]"); + str.append("; DB=[status=").append(vo.getStatus().toString()).append(":msid=").append(vo.getManagementServerId()).append(":lastpinged=").append(vo.getLastPinged()) + .append(":old update count=").append(oldUpdateCount).append("]"); status_logger.debug(str.toString()); } else { StringBuilder msg = new StringBuilder("Agent status update: ["); @@ -1110,6 +1103,13 @@ public HostVO findByPublicIp(String publicIp) { return findOneBy(sc); } + @Override + public HostVO findByIp(final String ipAddress) { + SearchCriteria sc = AnyIpAddressSearch.create(); + sc.setParameters("publicIpAddress", ipAddress); + sc.setParameters("privateIpAddress", ipAddress); + return findOneBy(sc); + } @Override public List findHypervisorHostInCluster(long clusterId) { @@ -1129,6 +1129,29 @@ public List listAllHosts(long zoneId) { return customSearch(sc, null); } + @Override + public List listClustersByHostTag(String hostTagOnOffering) { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + PreparedStatement pstmt = null; + List result = new ArrayList(); + StringBuilder sql = new StringBuilder(LIST_CLUSTERID_FOR_HOST_TAG); + // during listing the clusters that cross the threshold + // we need to check with disabled thresholds of each cluster if not defined at cluster consider the global value + try { + pstmt = txn.prepareAutoCloseStatement(sql.toString()); + pstmt.setString(1, hostTagOnOffering); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + result.add(rs.getLong(1)); + } + return result; + } catch (SQLException e) { + throw new CloudRuntimeException("DB Exception on: " + sql, e); + } catch (Throwable e) { + throw new CloudRuntimeException("Caught: " + sql, e); + } + } + @Override public List listAllHostsByType(Host.Type type) { SearchCriteria sc = TypeSearch.create(); @@ -1144,4 +1167,43 @@ public List listByType(Host.Type type) { sc.setParameters("type", type); return listBy(sc); } + + String sqlFindHostInZoneToExecuteCommand = "Select id from host " + + " where type = 'Routing' and hypervisor_type = ? and data_center_id = ? and status = 'Up' " + + " and resource_state = '%s' " + + " ORDER by rand() limit 1"; + + @Override + public HostVO findHostInZoneToExecuteCommand(long zoneId, HypervisorType hypervisorType) { + try (TransactionLegacy tx = TransactionLegacy.currentTxn()) { + String sql = createSqlFindHostToExecuteCommand(false); + ResultSet rs = executeSqlGetResultsetForMethodFindHostInZoneToExecuteCommand(hypervisorType, zoneId, tx, sql); + if (rs.next()) { + return findById(rs.getLong("id")); + } + sql = createSqlFindHostToExecuteCommand(true); + rs = executeSqlGetResultsetForMethodFindHostInZoneToExecuteCommand(hypervisorType, zoneId, tx, sql); + if (!rs.next()) { + throw new CloudRuntimeException(String.format("Could not find a host in zone [zoneId=%d] to operate on. ", zoneId)); + } + return findById(rs.getLong("id")); + } catch (SQLException e) { + throw new CloudRuntimeException(e); + } + } + + private ResultSet executeSqlGetResultsetForMethodFindHostInZoneToExecuteCommand(HypervisorType hypervisorType, long zoneId, TransactionLegacy tx, String sql) throws SQLException { + PreparedStatement pstmt = tx.prepareAutoCloseStatement(sql); + pstmt.setString(1, Objects.toString(hypervisorType)); + pstmt.setLong(2, zoneId); + return pstmt.executeQuery(); + } + + private String createSqlFindHostToExecuteCommand(boolean useDisabledHosts) { + String hostResourceStatus = "Enabled"; + if (useDisabledHosts) { + hostResourceStatus = "Disabled"; + } + return String.format(sqlFindHostInZoneToExecuteCommand, hostResourceStatus); + } } diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java index bfaf5627a5c1..f6185309972b 100644 --- a/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesCidrsDaoImpl.java @@ -71,8 +71,8 @@ public void persist(long firewallRuleId, List sourceCidrs) { TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start(); - for (String tag : sourceCidrs) { - FirewallRulesCidrsVO vo = new FirewallRulesCidrsVO(firewallRuleId, tag); + for (String cidr : sourceCidrs) { + FirewallRulesCidrsVO vo = new FirewallRulesCidrsVO(firewallRuleId, cidr); persist(vo); } txn.commit(); diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java index 29e2ba26e09e..f2e9bcba1e5a 100644 --- a/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java +++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDao.java @@ -64,4 +64,6 @@ public interface FirewallRulesDao extends GenericDao { List listByIpAndPurposeWithState(Long addressId, FirewallRule.Purpose purpose, FirewallRule.State state); void loadSourceCidrs(FirewallRuleVO rule); + + void loadDestinationCidrs(FirewallRuleVO rule); } diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java index 45ab1f845123..3ac860b08c5f 100644 --- a/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDaoImpl.java @@ -54,6 +54,8 @@ public class FirewallRulesDaoImpl extends GenericDaoBase i @Inject protected FirewallRulesCidrsDao _firewallRulesCidrsDao; @Inject + protected FirewallRulesDcidrsDao _firewallRulesDcidrsDao; + @Inject ResourceTagDao _tagsDao; @Inject IPAddressDao _ipDao; @@ -224,8 +226,17 @@ public FirewallRuleVO persist(FirewallRuleVO firewallRule) { txn.start(); FirewallRuleVO dbfirewallRule = super.persist(firewallRule); + + //Fill the firewall_rules_cidrs table saveSourceCidrs(firewallRule, firewallRule.getSourceCidrList()); + + //Fill the firewall_ruls_dcidrs table + saveDestinationCidrs(firewallRule, firewallRule.getDestinationCidrList()); + + //Add the source and dest cidrs into the dbfirewall rule to be returned. + //Have to read again from DB as the fields are transient. loadSourceCidrs(dbfirewallRule); + loadDestinationCidrs(dbfirewallRule); txn.commit(); return dbfirewallRule; @@ -238,6 +249,14 @@ public void saveSourceCidrs(FirewallRuleVO firewallRule, List cidrList) _firewallRulesCidrsDao.persist(firewallRule.getId(), cidrList); } + public void saveDestinationCidrs(FirewallRuleVO firewallRule, List cidrList){ + if(cidrList == null){ + return; + } + _firewallRulesDcidrsDao.persist(firewallRule.getId(), cidrList); + + } + @Override public List listByIpPurposeAndProtocolAndNotRevoked(long ipAddressId, Integer startPort, Integer endPort, String protocol, FirewallRule.Purpose purpose) { @@ -360,4 +379,11 @@ public void loadSourceCidrs(FirewallRuleVO rule) { List sourceCidrs = _firewallRulesCidrsDao.getSourceCidrs(rule.getId()); rule.setSourceCidrList(sourceCidrs); } + + @Override + public void loadDestinationCidrs(FirewallRuleVO rule){ + List destCidrs = _firewallRulesDcidrsDao.getDestCidrs(rule.getId()); + rule.setDestinationCidrsList(destCidrs); + } + } diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDcidrsDao.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDcidrsDao.java new file mode 100644 index 000000000000..bc7efc4651c2 --- /dev/null +++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDcidrsDao.java @@ -0,0 +1,28 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.dao; + +import com.cloud.utils.db.GenericDao; + +import java.util.List; + +public interface FirewallRulesDcidrsDao extends GenericDao { + + void persist(long firewallRuleId, List destCidrs); + + List getDestCidrs(long firewallId); +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDcidrsDaoImpl.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDcidrsDaoImpl.java new file mode 100644 index 000000000000..823c9d42ba27 --- /dev/null +++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDcidrsDaoImpl.java @@ -0,0 +1,74 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.dao; + +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import com.cloud.utils.db.TransactionStatus; +import org.springframework.stereotype.Component; + +import java.util.ArrayList; +import java.util.List; + +@Component +public class FirewallRulesDcidrsDaoImpl extends GenericDaoBase implements FirewallRulesDcidrsDao { + + protected final SearchBuilder cidrsSearch; + + protected FirewallRulesDcidrsDaoImpl(){ + cidrsSearch = createSearchBuilder(); + cidrsSearch.and("firewallRuleId", cidrsSearch.entity().getFirewallRuleId(), SearchCriteria.Op.EQ); + cidrsSearch.done(); + + } + + @Override + @DB + public List getDestCidrs(long firewallRuleId){ + SearchCriteria sc =cidrsSearch.create(); + sc.setParameters("firewallRuleId", firewallRuleId); + + List results = search(sc, null); + + List cidrs = new ArrayList(results.size()); + for (FirewallRulesDestCidrsVO result : results) { + cidrs.add(result.getCidr()); + } + + return cidrs; + } + + @Override + @DB + public void persist(final long firewallRuleId, final List destCidrs){ + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + for(String cidr: destCidrs){ + FirewallRulesDestCidrsVO vo = new FirewallRulesDestCidrsVO(firewallRuleId, cidr); + persist(vo); + } + } + }); + } + + +} diff --git a/engine/schema/src/com/cloud/network/dao/FirewallRulesDestCidrsVO.java b/engine/schema/src/com/cloud/network/dao/FirewallRulesDestCidrsVO.java new file mode 100644 index 000000000000..ce00e0ecfb96 --- /dev/null +++ b/engine/schema/src/com/cloud/network/dao/FirewallRulesDestCidrsVO.java @@ -0,0 +1,63 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.network.dao; + +import org.apache.cloudstack.api.InternalIdentity; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +@Entity +@Table(name = ("firewall_rules_dcidrs")) +public class FirewallRulesDestCidrsVO implements InternalIdentity{ + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "firewall_rule_id") + private long firewallRuleId; + + @Column(name = "destination_cidr") + private String destCidr; + + public FirewallRulesDestCidrsVO(){ + + } + + public FirewallRulesDestCidrsVO(long firewallRuleId, String destCidr){ + this.firewallRuleId = firewallRuleId; + this.destCidr = destCidr; + } + + public long getFirewallRuleId(){ + return firewallRuleId; + } + + public String getCidr(){ + return destCidr; + } + + @Override + public long getId() { + return id; + } +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/network/dao/IPAddressVO.java b/engine/schema/src/com/cloud/network/dao/IPAddressVO.java index 0be781b500b5..0b8801161590 100644 --- a/engine/schema/src/com/cloud/network/dao/IPAddressVO.java +++ b/engine/schema/src/com/cloud/network/dao/IPAddressVO.java @@ -117,6 +117,14 @@ public class IPAddressVO implements IpAddress { @Column(name = "display", updatable = true, nullable = false) protected boolean display = true; + //static nat rule state + @Enumerated(value = EnumType.STRING) + @Column(name = "rule_state") + State ruleState; + + @Column(name = "forsystemvms") + private boolean forSystemVms = false; + @Column(name= GenericDao.REMOVED_COLUMN) private Date removed; @@ -367,4 +375,18 @@ public Date getRemoved() { public Date getCreated() { return created; } + + @Override + public State getRuleState() { + return ruleState; + } + + @Override + public void setRuleState(State ruleState) { + this.ruleState = ruleState; + } + + public boolean isForSystemVms() { + return forSystemVms; + } } diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java index 331f7555d81b..c639ef786325 100644 --- a/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java +++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerDao.java @@ -29,4 +29,6 @@ public interface LoadBalancerDao extends GenericDao { List listInTransitionStateByNetworkIdAndScheme(long networkId, Scheme scheme); + boolean isLoadBalancerRulesMappedToVmGuestIp(long instanceId, String instanceIp, long networkId); + } diff --git a/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java b/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java index 0ad768db3b9f..932c5c68a2d2 100644 --- a/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/LoadBalancerDaoImpl.java @@ -20,6 +20,8 @@ import javax.inject.Inject; +import com.cloud.network.rules.FirewallRule; +import com.cloud.utils.db.JoinBuilder; import org.springframework.stereotype.Component; import com.cloud.network.rules.FirewallRule.State; @@ -36,6 +38,8 @@ public class LoadBalancerDaoImpl extends GenericDaoBase im @Inject protected FirewallRulesCidrsDao _portForwardingRulesCidrsDao; + @Inject + LoadBalancerVMMapDao _loadBalancerVMMapDao; protected LoadBalancerDaoImpl() { ListByIp = createSearchBuilder(); @@ -75,4 +79,40 @@ public List listInTransitionStateByNetworkIdAndScheme(long netwo return listBy(sc); } + @Override + public boolean isLoadBalancerRulesMappedToVmGuestIp(long instanceId, String instanceIp, long networkId) + { + SearchBuilder lbVmMapSearch = _loadBalancerVMMapDao.createSearchBuilder(); + lbVmMapSearch.and("instanceIp", lbVmMapSearch.entity().getInstanceIp(),SearchCriteria.Op.EQ); + lbVmMapSearch.and("instanceId", lbVmMapSearch.entity().getInstanceId(), SearchCriteria.Op.EQ); + + SearchBuilder firewallRuleIdSearch = createSearchBuilder(); + firewallRuleIdSearch.selectFields(firewallRuleIdSearch.entity().getId()); + firewallRuleIdSearch.and("networkId",firewallRuleIdSearch.entity().getNetworkId(),Op.EQ); + firewallRuleIdSearch.and("purpose",firewallRuleIdSearch.entity().getPurpose(),Op.EQ); + firewallRuleIdSearch.and("state",firewallRuleIdSearch.entity().getState(),Op.NEQ); + firewallRuleIdSearch.join("LoadBalancerRuleList", lbVmMapSearch, lbVmMapSearch.entity().getLoadBalancerId(), firewallRuleIdSearch.entity().getId(), JoinBuilder.JoinType.INNER); + + firewallRuleIdSearch.done(); + lbVmMapSearch.done(); + + SearchCriteria sc = firewallRuleIdSearch.create(); + sc.setParameters("state", State.Revoke); + sc.setParameters("networkId", networkId); + sc.setParameters("purpose", FirewallRule.Purpose.LoadBalancing); + + sc.setJoinParameters("LoadBalancerRuleList", "instanceIp", instanceIp); + sc.setJoinParameters("LoadBalancerRuleList", "instanceId", instanceId); + + List lbRuleList = customSearch(sc, null); + + if(lbRuleList == null || lbRuleList.size() > 0) { + return true; + } + + return false; + } + + + } diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDao.java b/engine/schema/src/com/cloud/network/dao/NetworkDao.java index 49c801558e65..5091ebd75df0 100644 --- a/engine/schema/src/com/cloud/network/dao/NetworkDao.java +++ b/engine/schema/src/com/cloud/network/dao/NetworkDao.java @@ -54,15 +54,14 @@ public interface NetworkDao extends GenericDao, StateDao listBy(long accountId, long networkId); - long countByZoneAndUri(long zoneId, String broadcastUri); - - long countByZoneUriAndGuestType(long zoneId, String broadcastUri, GuestType guestType); + List listByZoneAndUriAndGuestType(long zoneId, String broadcastUri, GuestType guestType); List listByZone(long zoneId); @@ -119,4 +118,6 @@ public interface NetworkDao extends GenericDao, StateDao listByAclId(long aclId); int getNonSystemNetworkCountByVpcId(long vpcId); + + List listNetworkVO(List idset); } diff --git a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java index 0c4354bac828..1e33b6ac535f 100644 --- a/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/NetworkDaoImpl.java @@ -16,6 +16,8 @@ // under the License. package com.cloud.network.dao; +import java.net.URI; +import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Random; @@ -41,7 +43,9 @@ import com.cloud.offerings.dao.NetworkOfferingDao; import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.tags.dao.ResourceTagDao; +import com.cloud.utils.UriUtils; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder; @@ -56,7 +60,7 @@ @Component @DB() -public class NetworkDaoImpl extends GenericDaoBase implements NetworkDao { +public class NetworkDaoImpl extends GenericDaoBaseimplements NetworkDao { SearchBuilder AllFieldsSearch; SearchBuilder AccountSearch; SearchBuilder RelatedConfigSearch; @@ -69,7 +73,6 @@ public class NetworkDaoImpl extends GenericDaoBase implements N GenericSearchBuilder NetworksRegularUserCanCreateSearch; GenericSearchBuilder NetworksCount; SearchBuilder SourceNATSearch; - GenericSearchBuilder CountByZoneAndURI; GenericSearchBuilder VpcNetworksCount; SearchBuilder OfferingAccountNetworkSearch; @@ -113,6 +116,7 @@ protected void init() { AllFieldsSearch.and("broadcastUri", AllFieldsSearch.entity().getBroadcastUri(), Op.EQ); AllFieldsSearch.and("vpcId", AllFieldsSearch.entity().getVpcId(), Op.EQ); AllFieldsSearch.and("aclId", AllFieldsSearch.entity().getNetworkACLId(), Op.EQ); + AllFieldsSearch.and("redundant", AllFieldsSearch.entity().isRedundant(), Op.EQ); final SearchBuilder join1 = _ntwkOffDao.createSearchBuilder(); join1.and("isSystem", join1.entity().isSystemOnly(), Op.EQ); join1.and("isRedundant", join1.entity().getRedundantRouter(), Op.EQ); @@ -150,14 +154,6 @@ protected void init() { ZoneBroadcastUriSearch.and("guestType", ZoneBroadcastUriSearch.entity().getGuestType(), Op.EQ); ZoneBroadcastUriSearch.done(); - CountByZoneAndURI = createSearchBuilder(Long.class); - CountByZoneAndURI.select(null, Func.COUNT, null); - CountByZoneAndURI.and("dataCenterId", CountByZoneAndURI.entity().getDataCenterId(), Op.EQ); - CountByZoneAndURI.and("broadcastUri", CountByZoneAndURI.entity().getBroadcastUri(), Op.EQ); - CountByZoneAndURI.and("guestType", CountByZoneAndURI.entity().getGuestType(), Op.EQ); - - CountByZoneAndURI.done(); - ZoneSecurityGroupSearch = createSearchBuilder(); ZoneSecurityGroupSearch.and("dataCenterId", ZoneSecurityGroupSearch.entity().getDataCenterId(), Op.EQ); final SearchBuilder offJoin = _ntwkSvcMap.createSearchBuilder(); @@ -275,7 +271,6 @@ public List listByGuestType(Network.GuestType type) { return listBy(sc, null); } - public List findBy(final TrafficType trafficType, final Mode mode, final BroadcastDomainType broadcastType, final long networkOfferingId, final long dataCenterId) { final SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("trafficType", trafficType); @@ -377,11 +372,15 @@ public List getNetworksForOffering(final long offeringId, final long } @Override - public String getNextAvailableMacAddress(final long networkConfigId) { + public String getNextAvailableMacAddress(final long networkConfigId, Integer zoneMacIdentifier) { final SequenceFetcher fetch = SequenceFetcher.getInstance(); - long seq = fetch.getNextSequence(Long.class, _tgMacAddress, networkConfigId); - seq = seq | _prefix << 40 | _rand.nextInt(Short.MAX_VALUE) << 16 & 0x00000000ffff0000l; + if(zoneMacIdentifier != null && zoneMacIdentifier.intValue() != 0 ){ + seq = seq | _prefix << 40 | (long)zoneMacIdentifier << 32 | networkConfigId << 16 & 0x00000000ffff0000l; + } + else { + seq = seq | _prefix << 40 | _rand.nextInt(Short.MAX_VALUE) << 16 & 0x00000000ffff0000l; + } return NetUtils.long2Mac(seq); } @@ -394,13 +393,35 @@ public List listBy(final long accountId, final long networkId) { } @Override - public long countByZoneAndUri(final long zoneId, final String broadcastUri) { + public List listByZoneAndUriAndGuestType(long zoneId, String broadcastUri, GuestType guestType) { + final URI searchUri = BroadcastDomainType.fromString(broadcastUri); + final String searchRange = BroadcastDomainType.getValue(searchUri); + final List searchVlans = UriUtils.expandVlanUri(searchRange); + final List overlappingNetworks = new ArrayList<>(); - final SearchCriteria sc = CountByZoneAndURI.create(); + final SearchCriteria sc = ZoneBroadcastUriSearch.create(); sc.setParameters("dataCenterId", zoneId); - sc.setParameters("broadcastUri", broadcastUri); + if (guestType != null) { + sc.setParameters("guestType", guestType); + } - return customSearch(sc, null).get(0); + for (final NetworkVO network : listBy(sc)) { + if (network.getBroadcastUri() == null || !network.getBroadcastUri().getScheme().equalsIgnoreCase(searchUri.getScheme())) { + continue; + } + final String networkVlanRange = BroadcastDomainType.getValue(network.getBroadcastUri()); + if (networkVlanRange == null || networkVlanRange.isEmpty()) { + continue; + } + for (final Integer networkVlan : UriUtils.expandVlanUri(networkVlanRange)) { + if (searchVlans.contains(networkVlan)) { + overlappingNetworks.add(network); + break; + } + } + } + + return overlappingNetworks; } @Override @@ -410,15 +431,6 @@ public List listByZone(final long zoneId) { return search(sc, null); } - @Override - public long countByZoneUriAndGuestType(final long zoneId, final String broadcastUri, final GuestType guestType) { - final SearchCriteria sc = CountByZoneAndURI.create(); - sc.setParameters("dataCenterId", zoneId); - sc.setParameters("broadcastUri", broadcastUri); - sc.setParameters("guestType", guestType); - return customSearch(sc, null).get(0); - } - @Override public List listByZoneSecurityGroup(final Long zoneId) { final SearchCriteria sc = ZoneSecurityGroupSearch.create(); @@ -645,7 +657,7 @@ public List listNetworksByAccount(final long accountId, final long zo @Override public List listRedundantNetworks() { final SearchCriteria sc = AllFieldsSearch.create(); - sc.setJoinParameters("offerings", "isRedundant", true); + sc.setParameters("redundant", true); return listBy(sc, null); } @@ -676,4 +688,13 @@ public int getNonSystemNetworkCountByVpcId(final long vpcId) { final List results = customSearch(sc, null); return results.get(0); } + + @Override + public List listNetworkVO(List idset) { + final SearchCriteria sc_2 = createSearchCriteria(); + final Filter searchFilter_2 = new Filter(NetworkVO.class, "id", false, null, null); + sc_2.addAnd("networkOfferingId", SearchCriteria.Op.IN, idset); + sc_2.addAnd("removed", SearchCriteria.Op.EQ, null); + return this.search(sc_2, searchFilter_2); + } } diff --git a/engine/schema/src/com/cloud/network/dao/NetworkVO.java b/engine/schema/src/com/cloud/network/dao/NetworkVO.java index ee5c6b54ef8d..0c0bd4de6a12 100644 --- a/engine/schema/src/com/cloud/network/dao/NetworkVO.java +++ b/engine/schema/src/com/cloud/network/dao/NetworkVO.java @@ -67,7 +67,7 @@ public class NetworkVO implements Network { String name; @Column(name = "display_text") - String displayText;; + String displayText; @Column(name = "broadcast_uri") URI broadcastUri; @@ -172,16 +172,14 @@ public class NetworkVO implements Network { @Column(name = "streched_l2") boolean strechedL2Network = false; + @Column(name = "external_id") + String externalId; + @Transient transient String vlanIdAsUUID; - public String getVlanIdAsUUID() { - return vlanIdAsUUID; - } - - public void setVlanIdAsUUID(String vlanIdAsUUID) { - this.vlanIdAsUUID = vlanIdAsUUID; - } + @Transient + boolean rollingRestart = false; public NetworkVO() { uuid = UUID.randomUUID().toString(); @@ -216,7 +214,7 @@ public NetworkVO(TrafficType trafficType, Mode mode, BroadcastDomainType broadca } public NetworkVO(long id, Network that, long offeringId, String guruName, long domainId, long accountId, long related, String name, String displayText, - String networkDomain, GuestType guestType, long dcId, Long physicalNetworkId, ACLType aclType, boolean specifyIpRanges, Long vpcId, final boolean isRedundant) { + String networkDomain, GuestType guestType, long dcId, Long physicalNetworkId, ACLType aclType, boolean specifyIpRanges, Long vpcId, final boolean isRedundant, String externalId) { this(id, that.getTrafficType(), that.getMode(), @@ -248,6 +246,7 @@ public NetworkVO(long id, Network that, long offeringId, String guruName, long d uuid = UUID.randomUUID().toString(); ip6Gateway = that.getIp6Gateway(); ip6Cidr = that.getIp6Cidr(); + this.externalId = externalId; } /** @@ -299,14 +298,18 @@ public State getState() { return state; } + // don't use this directly when possible, use Network state machine instead + public void setState(State state) { + this.state = state; + } + @Override public boolean isRedundant() { return this.redundant; } - // don't use this directly when possible, use Network state machine instead - public void setState(State state) { - this.state = state; + public void setRedundant(boolean redundant) { + this.redundant = redundant; } @Override @@ -314,6 +317,10 @@ public long getRelated() { return related; } + public void setRelated(long related) { + this.related = related; + } + @Override public long getId() { return id; @@ -631,8 +638,27 @@ public void setVpcId(Long vpcId) { this.vpcId = vpcId; } - public void setIsReduntant(boolean reduntant) { - this.redundant = reduntant; + public String getExternalId() { + return externalId; + } + + public void setExternalId(String externalId) { + this.externalId = externalId; + } + + public String getVlanIdAsUUID() { + return vlanIdAsUUID; + } + + public void setVlanIdAsUUID(String vlanIdAsUUID) { + this.vlanIdAsUUID = vlanIdAsUUID; + } + + public boolean isRollingRestart() { + return rollingRestart; } + public void setRollingRestart(boolean rollingRestart) { + this.rollingRestart = rollingRestart; + } } diff --git a/engine/schema/src/com/cloud/network/dao/RouterNetworkVO.java b/engine/schema/src/com/cloud/network/dao/RouterNetworkVO.java index db86cfa26b07..5808af3a3e82 100644 --- a/engine/schema/src/com/cloud/network/dao/RouterNetworkVO.java +++ b/engine/schema/src/com/cloud/network/dao/RouterNetworkVO.java @@ -68,6 +68,10 @@ public Network.GuestType getGuestType() { return guestType; } + public void setNetworkId(long networkId) { + this.networkId = networkId; + } + @Override public long getId() { return id; diff --git a/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java b/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java index afcd4b608dde..d0439a523d0b 100644 --- a/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java +++ b/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDao.java @@ -21,8 +21,6 @@ import com.cloud.utils.db.GenericDao; public interface Site2SiteCustomerGatewayDao extends GenericDao { - Site2SiteCustomerGatewayVO findByGatewayIpAndAccountId(String ip, long accountId); - Site2SiteCustomerGatewayVO findByNameAndAccountId(String name, long accountId); List listByAccountId(long accountId); diff --git a/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java b/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java index 4db826b6459c..3aad27c3909f 100644 --- a/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java +++ b/engine/schema/src/com/cloud/network/dao/Site2SiteCustomerGatewayDaoImpl.java @@ -18,8 +18,6 @@ import java.util.List; - -import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; @@ -28,8 +26,6 @@ @Component public class Site2SiteCustomerGatewayDaoImpl extends GenericDaoBase implements Site2SiteCustomerGatewayDao { - private static final Logger s_logger = Logger.getLogger(Site2SiteCustomerGatewayDaoImpl.class); - private final SearchBuilder AllFieldsSearch; protected Site2SiteCustomerGatewayDaoImpl() { @@ -40,14 +36,6 @@ protected Site2SiteCustomerGatewayDaoImpl() { AllFieldsSearch.done(); } - @Override - public Site2SiteCustomerGatewayVO findByGatewayIpAndAccountId(String ip, long accountId) { - SearchCriteria sc = AllFieldsSearch.create(); - sc.setParameters("gatewayIp", ip); - sc.setParameters("accountId", accountId); - return findOneBy(sc); - } - @Override public Site2SiteCustomerGatewayVO findByNameAndAccountId(String name, long accountId) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/engine/schema/src/com/cloud/network/dao/SslCertVO.java b/engine/schema/src/com/cloud/network/dao/SslCertVO.java index 2676d611bd7d..2aaa6a2fd56c 100644 --- a/engine/schema/src/com/cloud/network/dao/SslCertVO.java +++ b/engine/schema/src/com/cloud/network/dao/SslCertVO.java @@ -23,7 +23,7 @@ import javax.persistence.Id; import javax.persistence.Table; -import com.cloud.network.lb.SslCert; +import org.apache.cloudstack.network.tls.SslCert; import com.cloud.utils.db.Encrypt; @Entity @@ -60,11 +60,14 @@ public class SslCertVO implements SslCert { @Column(name = "fingerprint") String fingerPrint; + @Column(name = "name") + String name; + public SslCertVO() { uuid = UUID.randomUUID().toString(); } - public SslCertVO(String cert, String key, String password, String chain, Long accountId, Long domainId, String fingerPrint) { + public SslCertVO(String cert, String key, String password, String chain, Long accountId, Long domainId, String fingerPrint, String name) { certificate = cert; this.key = key; this.chain = chain; @@ -73,6 +76,7 @@ public SslCertVO(String cert, String key, String password, String chain, Long ac this.domainId = domainId; this.fingerPrint = fingerPrint; uuid = UUID.randomUUID().toString(); + this.name = name; } // Getters @@ -121,6 +125,11 @@ public String getFingerPrint() { return fingerPrint; } + @Override + public String getName() { + return name; + } + @Override public Class getEntityType() { return SslCert.class; diff --git a/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java b/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java index 169102af8c7c..282fa7403e73 100644 --- a/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java +++ b/engine/schema/src/com/cloud/network/rules/FirewallRuleVO.java @@ -110,6 +110,9 @@ public class FirewallRuleVO implements FirewallRule { @Transient List sourceCidrs; + @Transient + List destinationCidrs; + @Column(name = "uuid") String uuid; @@ -117,6 +120,15 @@ public void setSourceCidrList(List sourceCidrs) { this.sourceCidrs = sourceCidrs; } + public void setDestinationCidrsList(List destinationCidrs){ + this.destinationCidrs = destinationCidrs; + } + + @Override + public List getDestinationCidrList(){ + return destinationCidrs; + } + @Override public List getSourceCidrList() { return sourceCidrs; @@ -213,6 +225,9 @@ public FirewallRuleVO(String xId, Long ipAddressId, Integer portStart, Integer p this.icmpType = icmpType; this.sourceCidrs = sourceCidrs; + this.destinationCidrs = null; + + if (related != null) { assert (purpose == Purpose.Firewall) : "related field can be set for rule of purpose " + Purpose.Firewall + " only"; } @@ -224,7 +239,7 @@ public FirewallRuleVO(String xId, Long ipAddressId, Integer portStart, Integer p } public FirewallRuleVO(String xId, Long ipAddressId, Integer portStart, Integer portEnd, String protocol, long networkId, long accountId, long domainId, - Purpose purpose, List sourceCidrs, Integer icmpCode, Integer icmpType, Long related, TrafficType trafficType, FirewallRuleType type) { + Purpose purpose, List sourceCidrs, List destinationCidrs, Integer icmpCode, Integer icmpType, Long related, TrafficType trafficType, FirewallRuleType type) { this(xId, ipAddressId, portStart, portEnd, protocol, networkId, accountId, domainId, purpose, sourceCidrs, icmpCode, icmpType, related, trafficType); this.type = type; } @@ -234,6 +249,13 @@ public FirewallRuleVO(String xId, long ipAddressId, int port, String protocol, l this(xId, ipAddressId, port, port, protocol, networkId, accountId, domainId, purpose, sourceCidrs, icmpCode, icmpType, related, null); } + + public FirewallRuleVO(String xId, Long ipAddressId, Integer portStart, Integer portEnd, String protocol, long networkId, long accountId, long domainId, + Purpose purpose, List sourceCidrs, List destCidrs, Integer icmpCode, Integer icmpType, Long related, TrafficType trafficType) { + this(xId,ipAddressId, portStart, portEnd, protocol, networkId, accountId, domainId, purpose, sourceCidrs, icmpCode, icmpType, related, trafficType); + this.destinationCidrs = destCidrs; + } + @Override public String toString() { return new StringBuilder("Rule[").append(id).append("-").append(purpose).append("-").append(state).append("]").toString(); diff --git a/engine/schema/src/com/cloud/network/vpc/NetworkACLVO.java b/engine/schema/src/com/cloud/network/vpc/NetworkACLVO.java index b6ed5cbd2cbb..fb6a239c58d5 100644 --- a/engine/schema/src/com/cloud/network/vpc/NetworkACLVO.java +++ b/engine/schema/src/com/cloud/network/vpc/NetworkACLVO.java @@ -93,6 +93,10 @@ public void setDisplay(boolean display) { this.display = display; } + public void setVpcId(long vpcId) { + this.vpcId = vpcId; + } + @Override public boolean isDisplay() { return display; diff --git a/engine/schema/src/com/cloud/network/vpc/VpcGatewayVO.java b/engine/schema/src/com/cloud/network/vpc/VpcGatewayVO.java index 23568b492303..9919ba3bf7fb 100644 --- a/engine/schema/src/com/cloud/network/vpc/VpcGatewayVO.java +++ b/engine/schema/src/com/cloud/network/vpc/VpcGatewayVO.java @@ -220,4 +220,8 @@ public long getNetworkACLId() { public Class getEntityType() { return VpcGateway.class; } + + public void setVpcId(Long vpcId) { + this.vpcId = vpcId; + } } diff --git a/engine/schema/src/com/cloud/network/vpc/VpcVO.java b/engine/schema/src/com/cloud/network/vpc/VpcVO.java index b78f22f9f55b..3061d305d05b 100644 --- a/engine/schema/src/com/cloud/network/vpc/VpcVO.java +++ b/engine/schema/src/com/cloud/network/vpc/VpcVO.java @@ -25,6 +25,7 @@ import javax.persistence.Enumerated; import javax.persistence.Id; import javax.persistence.Table; +import javax.persistence.Transient; import com.cloud.utils.db.GenericDao; @@ -88,6 +89,9 @@ public class VpcVO implements Vpc { @Column(name = "region_level_vpc") boolean regionLevelVpc = false; + @Transient + boolean rollingRestart = false; + public VpcVO() { uuid = UUID.randomUUID().toString(); } @@ -228,6 +232,15 @@ public void setRedundant(final boolean isRedundant) { redundant = isRedundant; } + @Override + public boolean isRollingRestart() { + return rollingRestart; + } + + public void setRollingRestart(boolean rollingRestart) { + this.rollingRestart = rollingRestart; + } + @Override public Class getEntityType() { return Vpc.class; diff --git a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDao.java b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDao.java index 5e2a6f50c9c2..37ba3471ce88 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDao.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDao.java @@ -16,8 +16,14 @@ // under the License. package com.cloud.network.vpc.dao; +import java.util.List; + import com.cloud.network.vpc.NetworkACLVO; +import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDao; public interface NetworkACLDao extends GenericDao { + + @DB + List listByVpcId(long vpcId); } diff --git a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDaoImpl.java index 00bb1d87c025..d21df1244f69 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDaoImpl.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/NetworkACLDaoImpl.java @@ -19,15 +19,29 @@ import org.springframework.stereotype.Component; +import java.util.List; + import com.cloud.network.vpc.NetworkACLVO; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; @Component @DB() public class NetworkACLDaoImpl extends GenericDaoBase implements NetworkACLDao { + protected final SearchBuilder AllFieldsSearch; protected NetworkACLDaoImpl() { + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("vpcId", AllFieldsSearch.entity().getVpcId(), SearchCriteria.Op.EQ); + AllFieldsSearch.and("id", AllFieldsSearch.entity().getId(), SearchCriteria.Op.EQ); + AllFieldsSearch.done(); } + @Override public List listByVpcId(long vpcId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("vpcId", vpcId); + return listBy(sc); + } } diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDao.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDao.java index a2a449b9930a..e6a72c870b0e 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDao.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDao.java @@ -30,4 +30,6 @@ public interface VpcGatewayDao extends GenericDao { List listByVpcIdAndType(long vpcId, VpcGateway.Type type); List listByAclIdAndType(long aclId, VpcGateway.Type type); + + List listByVpcId(long vpcId); } diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDaoImpl.java index 284fd8884c1f..39d33192a093 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDaoImpl.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcGatewayDaoImpl.java @@ -82,4 +82,11 @@ public List listByAclIdAndType(long aclId, VpcGateway.Type type) { sc.setParameters("type", type); return listBy(sc); } + + @Override + public List listByVpcId(long vpcId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("vpcId", vpcId); + return listBy(sc); + } } diff --git a/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingServiceMapDaoImpl.java b/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingServiceMapDaoImpl.java index 9679c3af7d86..9e14bb5348f6 100644 --- a/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingServiceMapDaoImpl.java +++ b/engine/schema/src/com/cloud/network/vpc/dao/VpcOfferingServiceMapDaoImpl.java @@ -97,7 +97,6 @@ public boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Ser @Override public List listServicesForVpcOffering(long offId) { SearchCriteria sc = ServicesSearch.create(); - ; sc.setParameters("offeringId", offId); return customSearch(sc, null); } diff --git a/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java b/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java index c16c5ac4bf1a..d28e150da7cb 100644 --- a/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java +++ b/engine/schema/src/com/cloud/offerings/NetworkOfferingDetailsVO.java @@ -25,21 +25,20 @@ import javax.persistence.Id; import javax.persistence.Table; -import org.apache.cloudstack.api.InternalIdentity; - import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Detail; +import org.apache.cloudstack.api.ResourceDetail; @Entity @Table(name = "network_offering_details") -public class NetworkOfferingDetailsVO implements InternalIdentity { +public class NetworkOfferingDetailsVO implements ResourceDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private long id; @Column(name = "network_offering_id") - private long offeringId; + private long resourceId; @Enumerated(value = EnumType.STRING) @Column(name = "name") @@ -51,8 +50,8 @@ public class NetworkOfferingDetailsVO implements InternalIdentity { public NetworkOfferingDetailsVO() { } - public NetworkOfferingDetailsVO(long offeringId, Detail detailName, String value) { - this.offeringId = offeringId; + public NetworkOfferingDetailsVO(long resourceId, Detail detailName, String value) { + this.resourceId = resourceId; this.name = detailName; this.value = value; } @@ -62,11 +61,20 @@ public long getId() { return id; } - public long getOfferingId() { - return offeringId; + @Override + public long getResourceId() { + return resourceId; + } + + public void setResourceId(long resourceId) { + this.resourceId = resourceId; + } + + public String getName() { + return name.name(); } - public NetworkOffering.Detail getName() { + public NetworkOffering.Detail getDetailName() { return name; } @@ -74,12 +82,13 @@ public String getValue() { return value; } - public void setId(long id) { - this.id = id; + @Override + public boolean isDisplay() { + return false; } - public void setOfferingId(long offeringId) { - this.offeringId = offeringId; + public void setId(long id) { + this.id = id; } public void setName(NetworkOffering.Detail name) { diff --git a/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java b/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java index c3d849d134c8..e31714356e6d 100644 --- a/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java +++ b/engine/schema/src/com/cloud/offerings/NetworkOfferingVO.java @@ -130,6 +130,9 @@ public class NetworkOfferingVO implements NetworkOffering { @Column(name = "is_persistent") boolean isPersistent; + @Column(name = "for_vpc") + boolean forVpc; + @Column(name = "egress_default_policy") boolean egressdefaultpolicy; @@ -142,6 +145,9 @@ public class NetworkOfferingVO implements NetworkOffering { @Column(name="supports_streched_l2") boolean supportsStrechedL2 = false; + @Column(name="supports_public_access") + boolean supportsPublicAccess = false; + @Override public String getDisplayText() { return displayText; @@ -153,6 +159,9 @@ public String getDisplayText() { @Column(name = "public_lb") boolean publicLb; + @Column(name="service_package_id") + String servicePackageUuid = null; + @Override public boolean isKeepAliveEnabled() { return keepAliveEnabled; @@ -162,6 +171,15 @@ public void setKeepAliveEnabled(boolean keepAliveEnabled) { this.keepAliveEnabled = keepAliveEnabled; } + @Override + public boolean getForVpc() { + return forVpc; + } + + public void setForVpc(boolean isForVpc) { + this.forVpc = isForVpc; + } + @Override public long getId() { return id; @@ -205,6 +223,10 @@ public String getTags() { return tags; } + public void setTags(String tags) { + this.tags = tags; + } + public void setName(String name) { this.name = name; } @@ -303,7 +325,7 @@ public boolean getEgressDefaultPolicy() { public NetworkOfferingVO(String name, String displayText, TrafficType trafficType, boolean systemOnly, boolean specifyVlan, Integer rateMbps, Integer multicastRateMbps, boolean isDefault, Availability availability, String tags, Network.GuestType guestType, boolean conserveMode, - boolean specifyIpRanges, boolean isPersistent, boolean internalLb, boolean publicLb) { + boolean specifyIpRanges, boolean isPersistent, boolean internalLb, boolean publicLb, boolean isForVpc) { this.name = name; this.displayText = displayText; this.rateMbps = rateMbps; @@ -329,12 +351,13 @@ public NetworkOfferingVO(String name, String displayText, TrafficType trafficTyp this.isPersistent = isPersistent; this.publicLb = publicLb; this.internalLb = internalLb; + this.forVpc = isForVpc; } public NetworkOfferingVO(String name, String displayText, TrafficType trafficType, boolean systemOnly, boolean specifyVlan, Integer rateMbps, Integer multicastRateMbps, boolean isDefault, Availability availability, String tags, Network.GuestType guestType, boolean conserveMode, boolean dedicatedLb, boolean sharedSourceNat, boolean redundantRouter, boolean elasticIp, boolean elasticLb, boolean specifyIpRanges, boolean inline, boolean isPersistent, - boolean associatePublicIP, boolean publicLb, boolean internalLb, boolean egressdefaultpolicy, boolean supportsStrechedL2) { + boolean associatePublicIP, boolean publicLb, boolean internalLb, boolean isForVpc, boolean egressdefaultpolicy, boolean supportsStrechedL2, boolean supportsPublicAccess) { this(name, displayText, trafficType, @@ -350,7 +373,7 @@ public NetworkOfferingVO(String name, String displayText, TrafficType trafficTyp specifyIpRanges, isPersistent, internalLb, - publicLb); + publicLb, isForVpc); this.dedicatedLB = dedicatedLb; this.sharedSourceNat = sharedSourceNat; this.redundantRouter = redundantRouter; @@ -360,6 +383,7 @@ public NetworkOfferingVO(String name, String displayText, TrafficType trafficTyp this.eipAssociatePublicIp = associatePublicIP; this.egressdefaultpolicy = egressdefaultpolicy; this.supportsStrechedL2 = supportsStrechedL2; + this.supportsPublicAccess = supportsPublicAccess; } public NetworkOfferingVO() { @@ -374,7 +398,7 @@ public NetworkOfferingVO() { * TODO */ public NetworkOfferingVO(String name, TrafficType trafficType, boolean specifyIpRanges) { - this(name, "System Offering for " + name, trafficType, true, false, 0, 0, true, Availability.Required, null, null, true, specifyIpRanges, false, false, false); + this(name, "System Offering for " + name, trafficType, true, false, 0, 0, true, Availability.Required, null, null, true, specifyIpRanges, false, false, false, false); this.state = State.Enabled; } @@ -394,6 +418,7 @@ public NetworkOfferingVO(String name, Network.GuestType guestType) { false, false, false, + false, false); this.state = State.Enabled; } @@ -495,4 +520,18 @@ public void setPublicLb(boolean publicLb) { public boolean getSupportsStrechedL2() { return supportsStrechedL2; } + + public void setServicePackage(String servicePackageUuid) { + this.servicePackageUuid = servicePackageUuid; + } + + @Override + public boolean getSupportsPublicAccess() { + return supportsPublicAccess; + } + + @Override + public String getServicePackage() { + return servicePackageUuid; + } } diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java index b7aa94bbaa8f..238a191bd770 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDao.java @@ -61,4 +61,12 @@ public interface NetworkOfferingDao extends GenericDao NetworkOfferingVO persist(NetworkOfferingVO off, Map details); + List listNetworkOfferingID(); + + boolean isUsingServicePackage(String uuid); + + /** + * Create default L2 network offerings + */ + void persistDefaultL2NetworkOfferings(); } diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java index 5a6092ec243c..5c40795a56b1 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java @@ -16,12 +16,15 @@ // under the License. package com.cloud.offerings.dao; +import java.util.ArrayList; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.persistence.EntityExistsException; +import com.cloud.offerings.NetworkOfferingServiceMapVO; +import org.apache.commons.collections.CollectionUtils; import org.springframework.stereotype.Component; import com.cloud.network.Network; @@ -32,6 +35,7 @@ import com.cloud.offerings.NetworkOfferingDetailsVO; import com.cloud.offerings.NetworkOfferingVO; import com.cloud.utils.db.DB; +import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; @@ -49,6 +53,8 @@ public class NetworkOfferingDaoImpl extends GenericDaoBase UpgradeSearch; @Inject NetworkOfferingDetailsDao _detailsDao; + @Inject + private NetworkOfferingServiceMapDao networkOfferingServiceMapDao; protected NetworkOfferingDaoImpl() { super(); @@ -189,4 +195,78 @@ public NetworkOfferingVO persist(NetworkOfferingVO off, Map deta return vo; } + @Override + public List listNetworkOfferingID() { + final SearchCriteria sc_1 = createSearchCriteria(); + final Filter searchFilter_1 = new Filter(NetworkOfferingVO.class, "created", false, null, null); + sc_1.addAnd("servicePackageUuid", SearchCriteria.Op.NEQ, null); + sc_1.addAnd("removed", SearchCriteria.Op.EQ, null); + List set_of_servicePackageUuid = this.search(sc_1, searchFilter_1); + List id_set = new ArrayList(); + for (NetworkOfferingVO node : set_of_servicePackageUuid) { + if (node.getServicePackage() != null && !node.getServicePackage().isEmpty()) { + id_set.add(node.getId()); + } + } + return id_set; + } + + @Override + public boolean isUsingServicePackage(String uuid) { + final SearchCriteria sc = createSearchCriteria(); + final Filter searchFilter= new Filter(NetworkOfferingVO.class, "created", false, null, null); + sc.addAnd("state", SearchCriteria.Op.EQ, NetworkOffering.State.Enabled); + sc.addAnd("servicePackageUuid", SearchCriteria.Op.EQ, uuid); + List list = this.search(sc, searchFilter); + + if(CollectionUtils.isNotEmpty(list)) + return true; + + return false; + } + + /** + * Persist L2 deafult Network offering + */ + private void persistL2DefaultNetworkOffering(String name, String displayText, boolean specifyVlan, boolean configDriveEnabled) { + NetworkOfferingVO offering = new NetworkOfferingVO(name, displayText, TrafficType.Guest, false, specifyVlan, + null, null, true, Availability.Optional, null, Network.GuestType.L2, + true,false, false, false, false, false); + offering.setState(NetworkOffering.State.Enabled); + persistDefaultNetworkOffering(offering); + + if (configDriveEnabled) { + NetworkOfferingServiceMapVO offService = new NetworkOfferingServiceMapVO(offering.getId(), + Network.Service.UserData, Network.Provider.ConfigDrive); + networkOfferingServiceMapDao.persist(offService); + } + } + + /** + * Check for default L2 Network Offerings, create them if they are not already created + */ + private void checkPersistL2NetworkOffering(String name, String displayText, boolean specifyVlan, boolean configDriveEnabled) { + if (findByUniqueName(name) == null) { + persistL2DefaultNetworkOffering(name, displayText, specifyVlan, configDriveEnabled); + } + } + + @Override + public void persistDefaultL2NetworkOfferings() { + checkPersistL2NetworkOffering(NetworkOffering.DefaultL2NetworkOffering, + "Offering for L2 networks", + false, false); + + checkPersistL2NetworkOffering(NetworkOffering.DefaultL2NetworkOfferingVlan, + "Offering for L2 networks VLAN", + true, false); + + checkPersistL2NetworkOffering(NetworkOffering.DefaultL2NetworkOfferingConfigDrive, + "Offering for L2 networks with config drive user data", + false, true); + + checkPersistL2NetworkOffering(NetworkOffering.DefaultL2NetworkOfferingConfigDriveVlan, + "Offering for L2 networks with config drive user data VLAN", + true, true); + } } diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java index 6af9c91c122d..94e5006a708f 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDao.java @@ -21,9 +21,9 @@ import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Detail; import com.cloud.offerings.NetworkOfferingDetailsVO; -import com.cloud.utils.db.GenericDao; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDao; -public interface NetworkOfferingDetailsDao extends GenericDao { +public interface NetworkOfferingDetailsDao extends ResourceDetailsDao { Map getNtwkOffDetails(long offeringId); diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java index ea476709c2e2..786b71c17c49 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingDetailsDaoImpl.java @@ -16,6 +16,8 @@ // under the License. package com.cloud.offerings.dao; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase; + import java.util.HashMap; import java.util.List; import java.util.Map; @@ -23,27 +25,27 @@ import com.cloud.offering.NetworkOffering; import com.cloud.offering.NetworkOffering.Detail; import com.cloud.offerings.NetworkOfferingDetailsVO; -import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Func; import com.cloud.utils.db.SearchCriteria.Op; -public class NetworkOfferingDetailsDaoImpl extends GenericDaoBase implements NetworkOfferingDetailsDao { +public class NetworkOfferingDetailsDaoImpl extends ResourceDetailsDaoBase implements NetworkOfferingDetailsDao { protected final SearchBuilder DetailSearch; private final GenericSearchBuilder ValueSearch; public NetworkOfferingDetailsDaoImpl() { DetailSearch = createSearchBuilder(); - DetailSearch.and("offeringId", DetailSearch.entity().getOfferingId(), SearchCriteria.Op.EQ); + DetailSearch.and("resourceId", DetailSearch.entity().getResourceId(), SearchCriteria.Op.EQ); DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ); + DetailSearch.and("value", DetailSearch.entity().getValue(), SearchCriteria.Op.EQ); DetailSearch.done(); ValueSearch = createSearchBuilder(String.class); ValueSearch.select(null, Func.DISTINCT, ValueSearch.entity().getValue()); - ValueSearch.and("offeringId", ValueSearch.entity().getOfferingId(), SearchCriteria.Op.EQ); + ValueSearch.and("resourceId", ValueSearch.entity().getResourceId(), SearchCriteria.Op.EQ); ValueSearch.and("name", ValueSearch.entity().getName(), Op.EQ); ValueSearch.done(); } @@ -51,12 +53,12 @@ public NetworkOfferingDetailsDaoImpl() { @Override public Map getNtwkOffDetails(long offeringId) { SearchCriteria sc = DetailSearch.create(); - sc.setParameters("offeringId", offeringId); + sc.setParameters("resourceId", offeringId); List results = search(sc, null); Map details = new HashMap(results.size()); for (NetworkOfferingDetailsVO result : results) { - details.put(result.getName(), result.getValue()); + details.put(result.getDetailName(), result.getValue()); } return details; @@ -66,7 +68,7 @@ public Map getNtwkOffDetails(long offeringId) { public String getDetail(long offeringId, Detail detailName) { SearchCriteria sc = ValueSearch.create(); sc.setParameters("name", detailName); - sc.setParameters("offeringId", offeringId); + sc.setParameters("resourceId", offeringId); List results = customSearch(sc, null); if (results.isEmpty()) { return null; @@ -75,4 +77,7 @@ public String getDetail(long offeringId, Detail detailName) { } } + @Override public void addDetail(long resourceId, String key, String value, boolean display) { + persist(new NetworkOfferingDetailsVO(resourceId, Detail.valueOf(key), value)); + } } diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java index 861644986c38..8fb5d6dff84b 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDao.java @@ -31,6 +31,8 @@ public interface NetworkOfferingServiceMapDao extends GenericDao { boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Service... services); + boolean canProviderSupportServiceInNetworkOffering(long networkOfferingId, Service service, Provider provider); + List listByNetworkOfferingId(long networkOfferingId); void deleteByOfferingId(long networkOfferingId); diff --git a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java index b667e58b5558..7868be2ad69a 100644 --- a/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java +++ b/engine/schema/src/com/cloud/offerings/dao/NetworkOfferingServiceMapDaoImpl.java @@ -103,6 +103,15 @@ public boolean areServicesSupportedByNetworkOffering(long networkOfferingId, Ser return false; } + @Override + public boolean canProviderSupportServiceInNetworkOffering(long networkOfferingId, Service service, Provider provider) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("networkOfferingId", networkOfferingId); + sc.setParameters("service", service.getName()); + sc.setParameters("provider", provider.getName()); + return findOneBy(sc) != null; + } + @Override public List listByNetworkOfferingId(long networkOfferingId) { SearchCriteria sc = AllFieldsSearch.create(); diff --git a/engine/schema/src/com/cloud/storage/SnapshotVO.java b/engine/schema/src/com/cloud/storage/SnapshotVO.java index 950c5e972914..f1041590fb76 100644 --- a/engine/schema/src/com/cloud/storage/SnapshotVO.java +++ b/engine/schema/src/com/cloud/storage/SnapshotVO.java @@ -16,8 +16,9 @@ // under the License. package com.cloud.storage; -import java.util.Date; -import java.util.UUID; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.utils.db.GenericDao; +import com.google.gson.annotations.Expose; import javax.persistence.Column; import javax.persistence.Entity; @@ -27,11 +28,8 @@ import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; - -import com.google.gson.annotations.Expose; - -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.utils.db.GenericDao; +import java.util.Date; +import java.util.UUID; @Entity @Table(name = "snapshots") @@ -69,6 +67,11 @@ public class SnapshotVO implements Snapshot { @Column(name = "snapshot_type") short snapshotType; + @Expose + @Column(name = "location_type", updatable = true, nullable = true) + @Enumerated(value = EnumType.STRING) + private LocationType locationType; + @Column(name = "type_description") String typeDescription; @@ -103,7 +106,7 @@ public SnapshotVO() { } public SnapshotVO(long dcId, long accountId, long domainId, Long volumeId, Long diskOfferingId, String name, short snapshotType, String typeDescription, long size, - Long minIops, Long maxIops, HypervisorType hypervisorType) { + Long minIops, Long maxIops, HypervisorType hypervisorType, LocationType locationType) { dataCenterId = dcId; this.accountId = accountId; this.domainId = domainId; @@ -119,6 +122,7 @@ public SnapshotVO(long dcId, long accountId, long domainId, Long volumeId, Long this.hypervisorType = hypervisorType; version = "2.2"; uuid = UUID.randomUUID().toString(); + this.locationType = locationType; } @Override @@ -158,6 +162,11 @@ public String getName() { return name; } + @Override + public long getSnapshotId() { + return id; + } + @Override public short getsnapshotType() { return snapshotType; @@ -171,6 +180,15 @@ public Type getRecurringType() { return Type.values()[snapshotType]; } + @Override + public LocationType getLocationType() { + return locationType; + } + + public void setLocationType(LocationType locationType) { + this.locationType = locationType; + } + @Override public HypervisorType getHypervisorType() { return hypervisorType; diff --git a/server/src/com/cloud/api/query/vo/StorageTagVO.java b/engine/schema/src/com/cloud/storage/StoragePoolTagVO.java old mode 100644 new mode 100755 similarity index 69% rename from server/src/com/cloud/api/query/vo/StorageTagVO.java rename to engine/schema/src/com/cloud/storage/StoragePoolTagVO.java index f8d29fd5f85f..18c0dc3c326f --- a/server/src/com/cloud/api/query/vo/StorageTagVO.java +++ b/engine/schema/src/com/cloud/storage/StoragePoolTagVO.java @@ -14,48 +14,51 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.api.query.vo; +package com.cloud.storage; import javax.persistence.Column; import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.Table; import org.apache.cloudstack.api.InternalIdentity; -/** - * Storage Tags DB view. - * - */ @Entity -@Table(name = "storage_tag_view") -public class StorageTagVO extends BaseViewVO implements InternalIdentity { - private static final long serialVersionUID = 1L; +@Table(name = "storage_pool_tags") +public class StoragePoolTagVO implements InternalIdentity { + + protected StoragePoolTagVO() { + } @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") private long id; - @Column(name = "name") - private String name; - @Column(name = "pool_id") - long poolId; + private long poolId; - @Override - public long getId() { - return id; + @Column(name = "tag") + private String tag; + + public StoragePoolTagVO(long poolId, String tag) { + this.poolId = poolId; + this.tag = tag; } - public String getName() { - return name; + @Override + public long getId() { + return this.id; } public long getPoolId() { return poolId; } - public void setPoolId(long poolId) { - this.poolId = poolId; + public String getTag() { + return tag; } -} \ No newline at end of file + +} diff --git a/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java b/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java old mode 100644 new mode 100755 index f988abab3998..5010edfa762c --- a/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java +++ b/engine/schema/src/com/cloud/storage/VMTemplateDetailVO.java @@ -79,4 +79,20 @@ public String getValue() { public boolean isDisplay() { return display; } + + public void setId(long id) { + this.id = id; + } + + public void setResourceId(long resourceId) { + this.resourceId = resourceId; + } + + public void setName(String name) { + this.name = name; + } + + public void setValue(String value) { + this.value = value; + } } diff --git a/engine/schema/src/com/cloud/storage/VMTemplateVO.java b/engine/schema/src/com/cloud/storage/VMTemplateVO.java index d28c23b1a500..d206835a28a8 100644 --- a/engine/schema/src/com/cloud/storage/VMTemplateVO.java +++ b/engine/schema/src/com/cloud/storage/VMTemplateVO.java @@ -146,6 +146,12 @@ public class VMTemplateVO implements VirtualMachineTemplate { @Column(name = "dynamically_scalable") protected boolean dynamicallyScalable; + @Column(name = "direct_download") + private boolean directDownload; + + @Column(name = "parent_template_id") + private Long parentTemplateId; + @Override public String getUniqueName() { return uniqueName; @@ -188,7 +194,7 @@ private VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, boolean featured, boolean isExtractable, TemplateType type, String url, boolean requiresHvm, int bits, long accountId, String cksum, String displayText, boolean enablePassword, long guestOSId, boolean bootable, - HypervisorType hyperType, String templateTag, Map details, boolean sshKeyEnabled, boolean isDynamicallyScalable) { + HypervisorType hyperType, String templateTag, Map details, boolean sshKeyEnabled, boolean isDynamicallyScalable, boolean directDownload) { this(id, name, format, @@ -212,6 +218,7 @@ public VMTemplateVO(long id, String name, ImageFormat format, boolean isPublic, enableSshKey = sshKeyEnabled; dynamicallyScalable = isDynamicallyScalable; state = State.Active; + this.directDownload = directDownload; } public static VMTemplateVO createPreHostIso(Long id, String uniqueName, String name, ImageFormat format, boolean isPublic, boolean featured, TemplateType type, @@ -605,8 +612,22 @@ public void setUpdated(Date updated) { this.updated = updated; } + public boolean isDirectDownload() { + return directDownload; + } + @Override public Class getEntityType() { return VirtualMachineTemplate.class; } + + @Override + public Long getParentTemplateId() { + return parentTemplateId; + } + + public void setParentTemplateId(Long parentTemplateId) { + this.parentTemplateId = parentTemplateId; + } + } diff --git a/engine/schema/src/com/cloud/storage/dao/SnapshotDao.java b/engine/schema/src/com/cloud/storage/dao/SnapshotDao.java old mode 100644 new mode 100755 index ff2e4457441d..1c11f9b61801 --- a/engine/schema/src/com/cloud/storage/dao/SnapshotDao.java +++ b/engine/schema/src/com/cloud/storage/dao/SnapshotDao.java @@ -37,6 +37,8 @@ public interface SnapshotDao extends GenericDao, StateDao listByVolumeIdType(long volumeId, Type type); + List listByVolumeIdTypeNotDestroyed(long volumeId, Type type); + List listByVolumeIdIncludingRemoved(long volumeId); List listByBackupUuid(long volumeId, String backupUuid); @@ -59,4 +61,6 @@ public interface SnapshotDao extends GenericDao, StateDao listByStatusNotIn(long volumeId, Snapshot.State... status); + } diff --git a/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java old mode 100644 new mode 100755 index 9483f1ca82cd..560edc93816c --- a/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/SnapshotDaoImpl.java @@ -62,12 +62,14 @@ public class SnapshotDaoImpl extends GenericDaoBase implements private SearchBuilder VolumeIdSearch; private SearchBuilder VolumeIdTypeSearch; + private SearchBuilder VolumeIdTypeNotDestroyedSearch; private SearchBuilder ParentIdSearch; private SearchBuilder backupUuidSearch; private SearchBuilder VolumeIdVersionSearch; private SearchBuilder AccountIdSearch; private SearchBuilder InstanceIdSearch; private SearchBuilder StatusSearch; + private SearchBuilder notInStatusSearch; private GenericSearchBuilder CountSnapshotsByAccount; @Inject ResourceTagDao _tagsDao; @@ -95,6 +97,15 @@ public List listByVolumeIdType(long volumeId, Type type) { return listByVolumeIdType(null, volumeId, type); } + @Override + public List listByVolumeIdTypeNotDestroyed(long volumeId, Type type) { + SearchCriteria sc = VolumeIdTypeNotDestroyedSearch.create(); + sc.setParameters("volumeId", volumeId); + sc.setParameters("type", type.ordinal()); + sc.setParameters("status", State.Destroyed); + return listBy(sc, null); + } + @Override public List listByVolumeIdVersion(long volumeId, String version) { return listByVolumeIdVersion(null, volumeId, version); @@ -147,6 +158,12 @@ protected void init() { VolumeIdTypeSearch.and("type", VolumeIdTypeSearch.entity().getsnapshotType(), SearchCriteria.Op.EQ); VolumeIdTypeSearch.done(); + VolumeIdTypeNotDestroyedSearch = createSearchBuilder(); + VolumeIdTypeNotDestroyedSearch.and("volumeId", VolumeIdTypeNotDestroyedSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); + VolumeIdTypeNotDestroyedSearch.and("type", VolumeIdTypeNotDestroyedSearch.entity().getsnapshotType(), SearchCriteria.Op.EQ); + VolumeIdTypeNotDestroyedSearch.and("status", VolumeIdTypeNotDestroyedSearch.entity().getState(), SearchCriteria.Op.NEQ); + VolumeIdTypeNotDestroyedSearch.done(); + VolumeIdVersionSearch = createSearchBuilder(); VolumeIdVersionSearch.and("volumeId", VolumeIdVersionSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); VolumeIdVersionSearch.and("version", VolumeIdVersionSearch.entity().getVersion(), SearchCriteria.Op.EQ); @@ -171,6 +188,11 @@ protected void init() { StatusSearch.and("status", StatusSearch.entity().getState(), SearchCriteria.Op.IN); StatusSearch.done(); + notInStatusSearch = createSearchBuilder(); + notInStatusSearch.and("volumeId", notInStatusSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); + notInStatusSearch.and("status", notInStatusSearch.entity().getState(), SearchCriteria.Op.NOTIN); + notInStatusSearch.done(); + CountSnapshotsByAccount = createSearchBuilder(Long.class); CountSnapshotsByAccount.select(null, Func.COUNT, null); CountSnapshotsByAccount.and("account", CountSnapshotsByAccount.entity().getAccountId(), SearchCriteria.Op.EQ); @@ -336,4 +358,12 @@ public void updateVolumeIds(long oldVolId, long newVolId) { UpdateBuilder ub = getUpdateBuilder(snapshot); update(ub, sc, null); } + + @Override + public List listByStatusNotIn(long volumeId, Snapshot.State... status) { + SearchCriteria sc = this.notInStatusSearch.create(); + sc.setParameters("volumeId", volumeId); + sc.setParameters("status", (Object[]) status); + return listBy(sc, null); + } } diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDao.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDao.java new file mode 100755 index 000000000000..946b46b5cfeb --- /dev/null +++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDao.java @@ -0,0 +1,34 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.storage.dao; + +import java.util.List; + +import org.apache.cloudstack.api.response.StorageTagResponse; + +import com.cloud.storage.StoragePoolTagVO; +import com.cloud.utils.db.GenericDao; + +public interface StoragePoolTagsDao extends GenericDao { + + void persist(long poolId, List storagePoolTags); + List getStoragePoolTags(long poolId); + void deleteTags(long poolId); + List searchByIds(Long... stIds); + StorageTagResponse newStorageTagResponse(StoragePoolTagVO tag); + +} diff --git a/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDaoImpl.java new file mode 100755 index 000000000000..f20e0c411ded --- /dev/null +++ b/engine/schema/src/com/cloud/storage/dao/StoragePoolTagsDaoImpl.java @@ -0,0 +1,160 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.storage.dao; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; + +import org.apache.cloudstack.api.response.StorageTagResponse; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; + +import com.cloud.storage.StoragePoolTagVO; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.TransactionLegacy; + +public class StoragePoolTagsDaoImpl extends GenericDaoBase implements StoragePoolTagsDao { + + @Inject + private ConfigurationDao _configDao; + + protected final SearchBuilder StoragePoolSearch; + private final SearchBuilder StoragePoolIdsSearch; + + private static final int DEFAULT_BATCH_QUERY_SIZE = 2000; + + public StoragePoolTagsDaoImpl() { + StoragePoolSearch = createSearchBuilder(); + StoragePoolSearch.and("poolId", StoragePoolSearch.entity().getPoolId(), SearchCriteria.Op.EQ); + StoragePoolSearch.done(); + StoragePoolIdsSearch = createSearchBuilder(); + StoragePoolIdsSearch.and("idIN", StoragePoolIdsSearch.entity().getId(), SearchCriteria.Op.IN); + StoragePoolIdsSearch.done(); + } + + @Override + public void persist(long poolId, List storagePoolTags) { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + + txn.start(); + SearchCriteria sc = StoragePoolSearch.create(); + sc.setParameters("poolId", poolId); + expunge(sc); + + for (String tag : storagePoolTags) { + tag = tag.trim(); + if (tag.length() > 0) { + StoragePoolTagVO vo = new StoragePoolTagVO(poolId, tag); + persist(vo); + } + } + txn.commit(); + } + + @Override + public List getStoragePoolTags(long poolId) { + SearchCriteria sc = StoragePoolSearch.create(); + sc.setParameters("poolId", poolId); + + List results = search(sc, null); + List storagePoolTags = new ArrayList(results.size()); + for (StoragePoolTagVO result : results) { + storagePoolTags.add(result.getTag()); + } + + return storagePoolTags; + } + + @Override + public void deleteTags(long poolId) { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + txn.start(); + SearchCriteria sc = StoragePoolSearch.create(); + sc.setParameters("poolId", poolId); + expunge(sc); + txn.commit(); + } + + @Override + public List searchByIds(Long... stIds) { + final int detailsBatchSize = getDetailsBatchSize(); + + // query details by batches + List uvList = new ArrayList(); + int curr_index = 0; + + while ((curr_index + detailsBatchSize) <= stIds.length) { + searchForStoragePoolIdsInternal(curr_index, detailsBatchSize, stIds, uvList); + curr_index += detailsBatchSize; + } + + if (curr_index < stIds.length) { + int batch_size = (stIds.length - curr_index); + searchForStoragePoolIdsInternal(curr_index, batch_size, stIds, uvList); + } + + return uvList; + } + + /** + * Search for storage pools based on their IDs. + * The search is executed in batch, this means that we will load a batch of size {@link StoragePoolTagsDaoImpl#getDetailsBatchSize()} + * {@link StoragePoolTagVO} at each time. + * The loaded storage pools are added in the pools parameter. + * @param currIndex current index + * @param batchSize batch size + * @param stIds storage tags array + * @param pools list in which storage pools are added + */ + protected void searchForStoragePoolIdsInternal(int currIndex, int batchSize, Long[] stIds, List pools) { + Long[] ids = new Long[batchSize]; + for (int k = 0, j = currIndex; j < currIndex + batchSize; j++, k++) { + ids[k] = stIds[j]; + } + SearchCriteria sc = StoragePoolIdsSearch.create(); + sc.setParameters("idIN", (Object[])ids); + List vms = searchIncludingRemoved(sc, null, null, false); + if (vms != null) { + pools.addAll(vms); + } + } + + /** + * Retrieve {@code detail.batch.query.size} configuration value. If not available, return default value {@link StoragePoolTagsDaoImpl#DEFAULT_BATCH_QUERY_SIZE} + * @return detail.batch.query.size configuration value + */ + protected int getDetailsBatchSize() { + String batchCfg = _configDao.getValue("detail.batch.query.size"); + return batchCfg != null ? Integer.parseInt(batchCfg) : DEFAULT_BATCH_QUERY_SIZE; + } + + @Override + public StorageTagResponse newStorageTagResponse(StoragePoolTagVO tag) { + StorageTagResponse tagResponse = new StorageTagResponse(); + + tagResponse.setName(tag.getTag()); + tagResponse.setPoolId(tag.getPoolId()); + + tagResponse.setObjectName("storagetag"); + + return tagResponse; + } + +} diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java index dccc902e912c..c43a2ea4ee9e 100644 --- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java +++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDao.java @@ -81,4 +81,6 @@ public interface VMTemplateDao extends GenericDao, StateDao< void loadDetails(VMTemplateVO tmpl); void saveDetails(VMTemplateVO tmpl); + + List listByParentTemplatetId(long parentTemplatetId); } diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java index 2037b3d35f7e..dd1f2fcf1641 100644 --- a/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VMTemplateDaoImpl.java @@ -104,6 +104,7 @@ public class VMTemplateDaoImpl extends GenericDaoBase implem private GenericSearchBuilder CountTemplatesByAccount; // private SearchBuilder updateStateSearch; private SearchBuilder AllFieldsSearch; + protected SearchBuilder ParentTemplateIdSearch; @Inject ResourceTagDao _tagsDao; @@ -135,6 +136,14 @@ public VMTemplateVO findByTemplateName(String templateName) { return findOneIncludingRemovedBy(sc); } + @Override + public List listByParentTemplatetId(long parentTemplatetId) { + SearchCriteria sc = ParentTemplateIdSearch.create(); + sc.setParameters("parentTemplateId", parentTemplatetId); + sc.setParameters("state", VirtualMachineTemplate.State.Active); + return listBy(sc); + } + @Override public List publicIsoSearch(Boolean bootable, boolean listRemoved, Map tags) { @@ -403,6 +412,11 @@ public boolean configure(String name, Map params) throws Configu AllFieldsSearch.and("name", AllFieldsSearch.entity().getName(), SearchCriteria.Op.EQ); AllFieldsSearch.done(); + ParentTemplateIdSearch = createSearchBuilder(); + ParentTemplateIdSearch.and("parentTemplateId", ParentTemplateIdSearch.entity().getParentTemplateId(), SearchCriteria.Op.EQ); + ParentTemplateIdSearch.and("state", ParentTemplateIdSearch.entity().getState(), SearchCriteria.Op.EQ); + ParentTemplateIdSearch.done(); + return result; } diff --git a/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java index 93aad1533714..d2c4a99e6aeb 100644 --- a/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VMTemplatePoolDaoImpl.java @@ -23,6 +23,8 @@ import java.util.List; +import javax.inject.Inject; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -44,6 +46,9 @@ public class VMTemplatePoolDaoImpl extends GenericDaoBase implements VMTemplatePoolDao { public static final Logger s_logger = Logger.getLogger(VMTemplatePoolDaoImpl.class.getName()); + @Inject + DataStoreManager dataStoreManager; + protected final SearchBuilder PoolSearch; protected final SearchBuilder TemplateSearch; protected final SearchBuilder PoolTemplateSearch; diff --git a/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java b/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java index 87662ef0679d..bacb09b98793 100644 --- a/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java +++ b/engine/schema/src/com/cloud/tags/dao/ResourceTagDao.java @@ -17,22 +17,47 @@ package com.cloud.tags.dao; import java.util.List; +import java.util.Map; +import java.util.Set; import com.cloud.server.ResourceTag; import com.cloud.server.ResourceTag.ResourceObjectType; import com.cloud.tags.ResourceTagVO; import com.cloud.utils.db.GenericDao; +import org.apache.cloudstack.api.response.ResourceTagResponse; public interface ResourceTagDao extends GenericDao { /** - * @param resourceId - * @param resourceType - * @return + * Remove a resourceTag based on the resourceId and type + * @param resourceId the id of the resource you want to remove + * @param resourceType the resource type + * @return true if successful */ boolean removeByIdAndType(long resourceId, ResourceObjectType resourceType); List listBy(long resourceId, ResourceObjectType resourceType); + /** + * Find a resource tag based on the resource id, resource type and key + * @param resourceId the id of the resource you want to find + * @param resourceType the resource type (e.g. VPC) + * @param key the key value + * @return the ResourceTag matching the search criteria + */ + ResourceTag findByKey(long resourceId, ResourceObjectType resourceType, String key); + void updateResourceId(long srcId, long destId, ResourceObjectType resourceType); + + Map> listTags(); + + /** + * remove a resource tag based on the resource id, resource type and key + * @param resourceId the id of the resource you want to remove + * @param resourceType the resource type (e.g. VPC) + * @param key the key value + */ + void removeByResourceIdAndKey(long resourceId, ResourceObjectType resourceType, String key); + + List listByResourceUuid(String resourceUuid); } diff --git a/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java b/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java index 0e23eff900f4..cc9d99e6ab16 100644 --- a/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java +++ b/engine/schema/src/com/cloud/tags/dao/ResourceTagsDaoImpl.java @@ -17,8 +17,12 @@ package com.cloud.tags.dao; import java.util.List; +import java.util.Set; +import java.util.Map; +import java.util.HashMap; +import java.util.HashSet; - +import org.apache.cloudstack.api.response.ResourceTagResponse; import org.springframework.stereotype.Component; import com.cloud.server.ResourceTag; @@ -38,6 +42,8 @@ public ResourceTagsDaoImpl() { AllFieldsSearch.and("resourceId", AllFieldsSearch.entity().getResourceId(), Op.EQ); AllFieldsSearch.and("uuid", AllFieldsSearch.entity().getResourceUuid(), Op.EQ); AllFieldsSearch.and("resourceType", AllFieldsSearch.entity().getResourceType(), Op.EQ); + AllFieldsSearch.and("key", AllFieldsSearch.entity().getKey(), Op.EQ); + AllFieldsSearch.and("resourceUuid", AllFieldsSearch.entity().getResourceUuid(), Op.EQ); AllFieldsSearch.done(); } @@ -58,6 +64,15 @@ public List listBy(long resourceId, ResourceObjectType re return listBy(sc); } + @Override + public ResourceTag findByKey(long resourceId, ResourceObjectType resourceType, String key) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", resourceId); + sc.setParameters("resourceType", resourceType); + sc.setParameters("key", key); + return findOneBy(sc); + } + @Override public void updateResourceId(long srcId, long destId, ResourceObjectType resourceType) { SearchCriteria sc = AllFieldsSearch.create(); sc.setParameters("resourceId", srcId); @@ -67,4 +82,42 @@ public List listBy(long resourceId, ResourceObjectType re update(tag.getId(), tag); } } + + @Override + public Map> listTags() { + SearchCriteria sc = AllFieldsSearch.create(); + List resourceTagList = listBy(sc); + Map> resourceTagMap = new HashMap(); + String resourceKey = null; + ResourceTagResponse resourceTagResponse = null; + for (ResourceTagVO resourceTagVO : resourceTagList) { + resourceTagResponse = new ResourceTagResponse(); + resourceTagResponse.setKey(resourceTagVO.getKey()); + resourceTagResponse.setValue(resourceTagVO.getValue()); + Set resourceTagSet = new HashSet(); + resourceKey = resourceTagVO.getResourceId() + ":" + resourceTagVO.getResourceType(); + if(resourceTagMap.get(resourceKey) != null) { + resourceTagSet = resourceTagMap.get(resourceKey); + } + resourceTagSet.add(resourceTagResponse); + resourceTagMap.put(resourceKey, resourceTagSet); + } + return resourceTagMap; + } + + @Override + public void removeByResourceIdAndKey(long resourceId, ResourceObjectType resourceType, String key) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceId", resourceId); + sc.setParameters("resourceType", resourceType); + sc.setParameters("key", key); + remove(sc); + } + + @Override + public List listByResourceUuid(String resourceUuid) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("resourceUuid", resourceUuid); + return listBy(sc); + } } diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java index 968c7a05fe83..158931b57586 100644 --- a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -66,6 +66,9 @@ import com.cloud.upgrade.dao.Upgrade490to4910; import com.cloud.upgrade.dao.Upgrade4910to4920; import com.cloud.upgrade.dao.Upgrade4920to4930; +import com.cloud.upgrade.dao.Upgrade4930to41000; +import com.cloud.upgrade.dao.Upgrade41000to41100; +import com.cloud.upgrade.dao.Upgrade41100to41110; import com.cloud.upgrade.dao.UpgradeSnapshot217to224; import com.cloud.upgrade.dao.UpgradeSnapshot223to224; import com.cloud.upgrade.dao.VersionDao; @@ -83,21 +86,16 @@ import org.apache.log4j.Logger; import javax.inject.Inject; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.ResultSet; import java.sql.SQLException; -import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashMap; import java.util.List; import java.util.Map; -import java.util.TreeMap; import static com.google.common.base.Preconditions.checkArgument; import static com.google.common.collect.Lists.newArrayList; @@ -107,208 +105,363 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { private static final Logger s_logger = Logger.getLogger(DatabaseUpgradeChecker.class); - + private final ImmutableList availableVersions; protected Map _upgradeMap = new HashMap<>(); @Inject VersionDao _dao; - private final ImmutableList availableVersions; - public DatabaseUpgradeChecker() { _dao = new VersionDaoImpl(); - _upgradeMap.put(CloudStackVersion.parse("2.1.7"), new DbUpgrade[] {new Upgrade217to218(), new Upgrade218to22(), new Upgrade221to222(), - new UpgradeSnapshot217to224(), new Upgrade222to224(), new Upgrade224to225(), new Upgrade225to226(), - new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), - new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), - new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), - new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), - new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.1.8"), new DbUpgrade[] {new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to224(), - new Upgrade222to224(), new Upgrade218to224DomainVlans(), new Upgrade224to225(), new Upgrade225to226(), - new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), - new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), - new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), - new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.1.9"), new DbUpgrade[] {new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to224(), - new Upgrade222to224(), new Upgrade218to224DomainVlans(), new Upgrade224to225(), new Upgrade225to226(), - new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), - new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), - new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), - new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), - new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.1"), new DbUpgrade[] {new Upgrade221to222(), new UpgradeSnapshot223to224(), new Upgrade222to224(), - new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), - new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), - new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), - new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), - new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.2"), new DbUpgrade[] {new Upgrade222to224(), new UpgradeSnapshot223to224(), new Upgrade224to225(), - new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), - new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), - new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.3"), new DbUpgrade[] {new Upgrade222to224(), new UpgradeSnapshot223to224(), new Upgrade224to225(), - new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), - new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), - new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.4"), new DbUpgrade[] {new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), - new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), - new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), - new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.5"), new DbUpgrade[] {new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), - new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), - new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), - new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), - new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.6"), new DbUpgrade[] {new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), - new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), - new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), - new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.7"), new DbUpgrade[] {new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), - new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), - new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), - new Upgrade410to420(), - new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), - new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.8"), new DbUpgrade[] {new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), - new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30() - , new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.9"), new DbUpgrade[] {new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), - new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), - new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.10"), new DbUpgrade[] {new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), - new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), - new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), - new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.12"), new DbUpgrade[] {new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), - new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), - new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.13"), new DbUpgrade[] {new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), - new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.14"), new DbUpgrade[] {new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), - new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), - new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("3.0.0"), new DbUpgrade[] {new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), - new Upgrade40to41(), new Upgrade410to420(), - new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("3.0.1"), new DbUpgrade[] {new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("3.0.2"), new DbUpgrade[] {new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), - new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.0.0"), new DbUpgrade[] {new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.0.1"), new DbUpgrade[] {new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.0.2"), new DbUpgrade[] {new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.1.0"), new DbUpgrade[] {new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.1.1"), new DbUpgrade[] {new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.2.0"), new DbUpgrade[] {new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.2.1"), new DbUpgrade[] {new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.3.0"), new DbUpgrade[] {new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.3.1"), new DbUpgrade[] {new Upgrade431to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.3.2"), new DbUpgrade[] {new Upgrade432to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.4.0"), new DbUpgrade[] {new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.4.1"), new DbUpgrade[] {new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930() }); - - _upgradeMap.put(CloudStackVersion.parse("4.4.2"), new DbUpgrade[] {new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.4.3"), new DbUpgrade[] {new Upgrade443to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.4.4"), new DbUpgrade[] {new Upgrade444to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.5.0"), new DbUpgrade[] {new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.5.1"), new DbUpgrade[] {new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.5.2"), new DbUpgrade[] {new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); + _upgradeMap.put(CloudStackVersion.parse("2.1.7"), + new DbUpgrade[] {new Upgrade217to218(), new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to224(), new Upgrade222to224(), new Upgrade224to225(), + new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), + new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), + new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), + new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), + new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), + new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.1.8"), + new DbUpgrade[] {new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to224(), new Upgrade222to224(), new Upgrade218to224DomainVlans(), + new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), + new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), + new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), + new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), + new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000()}); + + _upgradeMap.put(CloudStackVersion.parse("2.1.9"), + new DbUpgrade[] {new Upgrade218to22(), new Upgrade221to222(), new UpgradeSnapshot217to224(), new Upgrade222to224(), new Upgrade218to224DomainVlans(), + new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), + new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), + new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), + new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), + new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.1"), + new DbUpgrade[] {new Upgrade221to222(), new UpgradeSnapshot223to224(), new Upgrade222to224(), new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), + new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), + new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), + new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), + new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.2"), + new DbUpgrade[] {new Upgrade222to224(), new UpgradeSnapshot223to224(), new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), + new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), + new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), + new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), + new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.3"), + new DbUpgrade[] {new Upgrade222to224(), new UpgradeSnapshot223to224(), new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), + new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), + new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), + new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), + new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.4"), + new DbUpgrade[] {new Upgrade224to225(), new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), + new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), + new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), + new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), + new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.5"), + new DbUpgrade[] {new Upgrade225to226(), new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), + new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), + new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), + new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), + new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), + new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.6"), + new DbUpgrade[] {new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), + new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), + new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), + new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), + new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.7"), + new DbUpgrade[] {new Upgrade227to228(), new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), + new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), + new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), + new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), + new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.8"), + new DbUpgrade[] {new Upgrade228to229(), new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), + new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), + new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), + new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.9"), + new DbUpgrade[] {new Upgrade229to2210(), new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), + new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), + new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), + new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.10"), + new DbUpgrade[] {new Upgrade2210to2211(), new Upgrade2211to2212(), new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), + new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), + new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), + new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.12"), + new DbUpgrade[] {new Upgrade2212to2213(), new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), + new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), + new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), + new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.13"), + new DbUpgrade[] {new Upgrade2213to2214(), new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), + new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), + new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), + new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), + new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.14"), + new DbUpgrade[] {new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), + new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), + new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), + new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("3.0.0"), + new DbUpgrade[] {new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), + new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), + new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("3.0.1"), + new DbUpgrade[] {new Upgrade301to302(), new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), + new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), + new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("3.0.2"), + new DbUpgrade[] {new Upgrade302to40(), new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), + new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), + new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.0.0"), + new DbUpgrade[] {new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), + new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), + new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.0.1"), + new DbUpgrade[] {new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), + new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), + new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.0.2"), + new DbUpgrade[] {new Upgrade40to41(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), + new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), + new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.1.0"), + new DbUpgrade[] {new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), + new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), + new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.1.1"), + new DbUpgrade[] {new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), + new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), + new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.2.0"), + new DbUpgrade[] {new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), + new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), + new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), + new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.2.1"), + new DbUpgrade[] {new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), + new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), + new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.3.0"), + new DbUpgrade[] {new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), + new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.3.1"), + new DbUpgrade[] {new Upgrade431to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), + new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.3.2"), + new DbUpgrade[] {new Upgrade432to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), + new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.4.0"), + new DbUpgrade[] {new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), + new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.4.1"), + new DbUpgrade[] {new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), + new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.4.2"), + new DbUpgrade[] {new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), + new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.4.3"), + new DbUpgrade[] {new Upgrade443to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), + new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.4.4"), + new DbUpgrade[] {new Upgrade444to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), + new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.5.0"), + new DbUpgrade[] {new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), + new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.5.1"), + new DbUpgrade[] {new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), + new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), + new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.5.2"), + new DbUpgrade[] {new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), + new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.5.3"), + new DbUpgrade[] {new Upgrade453to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), + new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.6.0"), + new DbUpgrade[] {new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.6.1"), + new DbUpgrade[] {new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.6.2"), + new DbUpgrade[] {new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.7.0"), + new DbUpgrade[] {new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.7.1"), + new DbUpgrade[] {new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.7.2"), + new DbUpgrade[] {new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), + new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.8.0"), + new DbUpgrade[] {new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), + new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.8.1"), + new DbUpgrade[] {new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.8.2.0"), + new DbUpgrade[] {new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.9.0"), + new DbUpgrade[] {new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); - _upgradeMap.put(CloudStackVersion.parse("4.5.3"), new DbUpgrade[] {new Upgrade453to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); + _upgradeMap.put(CloudStackVersion.parse("4.9.1.0"), + new DbUpgrade[] {new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.9.2.0"), + new DbUpgrade[] {new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("4.9.3.0"), + new DbUpgrade[] {new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); - _upgradeMap.put(CloudStackVersion.parse("4.6.0"), new DbUpgrade[] {new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); + _upgradeMap.put(CloudStackVersion.parse("4.9.3.1"), + new DbUpgrade[] {new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); - _upgradeMap.put(CloudStackVersion.parse("4.6.1"), new DbUpgrade[] {new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); + _upgradeMap.put(CloudStackVersion.parse("4.10.0.0"), + new DbUpgrade[] {new Upgrade41000to41100(), new Upgrade41100to41110()}); - _upgradeMap.put(CloudStackVersion.parse("4.6.2"), new DbUpgrade[] {new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.7.0"), new DbUpgrade[] {new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.7.1"), new DbUpgrade[] {new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.7.2"), new DbUpgrade[] {new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.8.0"), new DbUpgrade[] {new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.8.1"), new DbUpgrade[] {new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.8.2.0"), new DbUpgrade[] {new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.9.0"), new DbUpgrade[] {new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.9.1.0"), new DbUpgrade[] {new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("4.9.2.0"), new DbUpgrade[] {new Upgrade4920to4930()}); + _upgradeMap.put(CloudStackVersion.parse("4.11.0.0"), + new DbUpgrade[] {new Upgrade41100to41110()}); //CP Upgrades - _upgradeMap.put(CloudStackVersion.parse("3.0.3"), new DbUpgrade[] {new Upgrade303to304(), new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), - new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("3.0.4"), new DbUpgrade[] {new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), - new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("3.0.5"), new DbUpgrade[] {new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), - new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("3.0.6"), new DbUpgrade[] {new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), - new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("3.0.7"), new DbUpgrade[] {new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.15"), new DbUpgrade[] {new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), - new Upgrade302to303(), new Upgrade303to304(), new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), - new Upgrade410to420(), - new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); - - _upgradeMap.put(CloudStackVersion.parse("2.2.16"), new DbUpgrade[] {new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), - new Upgrade302to303(), new Upgrade303to304(), new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), - new Upgrade410to420(), - new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930()}); + _upgradeMap.put(CloudStackVersion.parse("3.0.3"), + new DbUpgrade[] {new Upgrade303to304(), new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), + new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), + new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), + new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), + new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("3.0.4"), + new DbUpgrade[] {new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), + new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), + new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), + new Upgrade490to4910(), new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("3.0.5"), + new DbUpgrade[] {new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), + new Upgrade430to440(), new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), + new Upgrade460to461(), new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), + new Upgrade4910to4920(), new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("3.0.6"), + new DbUpgrade[] {new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), + new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), + new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("3.0.7"), + new DbUpgrade[] {new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), new Upgrade440to441(), + new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), new Upgrade461to470(), + new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.15"), + new DbUpgrade[] {new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to303(), new Upgrade303to304(), new Upgrade304to305(), + new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), + new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), + new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); + + _upgradeMap.put(CloudStackVersion.parse("2.2.16"), + new DbUpgrade[] {new Upgrade2214to30(), new Upgrade30to301(), new Upgrade301to302(), new Upgrade302to303(), new Upgrade303to304(), new Upgrade304to305(), + new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420(), new Upgrade420to421(), new Upgrade421to430(), new Upgrade430to440(), + new Upgrade440to441(), new Upgrade441to442(), new Upgrade442to450(), new Upgrade450to451(), new Upgrade451to452(), new Upgrade452to460(), new Upgrade460to461(), + new Upgrade461to470(), new Upgrade470to471(), new Upgrade471to480(), new Upgrade480to481(), new Upgrade481to490(), new Upgrade490to4910(), new Upgrade4910to4920(), + new Upgrade4920to4930(), new Upgrade4930to41000(), new Upgrade41000to41100(), new Upgrade41100to41110()}); final List sortedVersions = newArrayList(_upgradeMap.keySet()); sort(sortedVersions); @@ -316,20 +469,17 @@ public DatabaseUpgradeChecker() { availableVersions = ImmutableList.copyOf(sortedVersions); } - protected void runScript(Connection conn, File file) { + protected void runScript(Connection conn, InputStream file) { - try(FileReader reader = new FileReader(file);) { + try (InputStreamReader reader = new InputStreamReader(file)) { ScriptRunner runner = new ScriptRunner(conn, false, true); runner.runScript(reader); - } catch (FileNotFoundException e) { - s_logger.error("Unable to find upgrade script: " + file.getAbsolutePath(), e); - throw new CloudRuntimeException("Unable to find upgrade script: " + file.getAbsolutePath(), e); } catch (IOException e) { - s_logger.error("Unable to read upgrade script: " + file.getAbsolutePath(), e); - throw new CloudRuntimeException("Unable to read upgrade script: " + file.getAbsolutePath(), e); + s_logger.error("Unable to read upgrade script", e); + throw new CloudRuntimeException("Unable to read upgrade script", e); } catch (SQLException e) { - s_logger.error("Unable to execute upgrade script: " + file.getAbsolutePath(), e); - throw new CloudRuntimeException("Unable to execute upgrade script: " + file.getAbsolutePath(), e); + s_logger.error("Unable to execute upgrade script", e); + throw new CloudRuntimeException("Unable to execute upgrade script", e); } } @@ -369,12 +519,11 @@ DbUpgrade[] calculateUpgradePath(final CloudStackVersion dbVersion, final CloudS checkArgument(currentVersion != null); checkArgument(currentVersion.compareTo(dbVersion) > 0); - final DbUpgrade[] upgrades = _upgradeMap.containsKey(dbVersion) ? _upgradeMap.get(dbVersion) : - findMostRecentUpgradePath(dbVersion); + final DbUpgrade[] upgrades = _upgradeMap.containsKey(dbVersion) ? _upgradeMap.get(dbVersion) : findMostRecentUpgradePath(dbVersion); // When there is no upgrade defined for the target version, we assume that there were no schema changes or // data migrations required. Based on that assumption, we add a noop DbUpgrade to the end of the list ... - final CloudStackVersion tailVersion = upgrades.length > 0 ? CloudStackVersion.parse(upgrades[upgrades.length-1].getUpgradedVersion()) : dbVersion; + final CloudStackVersion tailVersion = upgrades.length > 0 ? CloudStackVersion.parse(upgrades[upgrades.length - 1].getUpgradedVersion()) : dbVersion; if (currentVersion.compareTo(tailVersion) != 0) { return concat(upgrades, new NoopDbUpgrade(tailVersion, currentVersion)); @@ -399,15 +548,15 @@ protected void upgrade(CloudStackVersion dbVersion, CloudStackVersion currentVer if (!supportsRollingUpgrade && false) { // FIXME: Needs to detect if there are management servers running // ClusterManagerImpl.arePeersRunning(null)) { - String errorMessage = - "Unable to run upgrade because the upgrade sequence does not support rolling update and there are other management server nodes running"; + String errorMessage = "Unable to run upgrade because the upgrade sequence does not support rolling update and there are other management server nodes running"; s_logger.error(errorMessage); throw new CloudRuntimeException(errorMessage); } for (DbUpgrade upgrade : upgrades) { - s_logger.debug("Running upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + - upgrade.getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion()); + VersionVO version; + s_logger.debug("Running upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + upgrade + .getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion()); TransactionLegacy txn = TransactionLegacy.open("Upgrade"); txn.start(); try { @@ -419,35 +568,17 @@ protected void upgrade(CloudStackVersion dbVersion, CloudStackVersion currentVer s_logger.error(errorMessage, e); throw new CloudRuntimeException(errorMessage, e); } - File[] scripts = upgrade.getPrepareScripts(); + InputStream[] scripts = upgrade.getPrepareScripts(); if (scripts != null) { - for (File script : scripts) { + for (InputStream script : scripts) { runScript(conn, script); } } upgrade.performDataMigration(conn); - boolean upgradeVersion = true; - - if (upgrade.getUpgradedVersion().equals("2.1.8")) { - // we don't have VersionDao in 2.1.x - upgradeVersion = false; - } else if (upgrade.getUpgradedVersion().equals("2.2.4")) { - try(PreparedStatement pstmt = conn.prepareStatement("SELECT * FROM version WHERE version='2.2.4'"); - ResultSet rs = pstmt.executeQuery();) { - // specifically for domain vlan update from 2.1.8 to 2.2.4 - if (rs.next()) { - upgradeVersion = false; - } - } catch (SQLException e) { - throw new CloudRuntimeException("Unable to update the version table", e); - } - } - if (upgradeVersion) { - VersionVO version = new VersionVO(upgrade.getUpgradedVersion()); - _dao.persist(version); - } + version = new VersionVO(upgrade.getUpgradedVersion()); + version = _dao.persist(version); txn.commit(); } catch (CloudRuntimeException e) { @@ -457,71 +588,41 @@ protected void upgrade(CloudStackVersion dbVersion, CloudStackVersion currentVer } finally { txn.close(); } - } - if (true) { // FIXME Needs to detect if management servers are running - // !ClusterManagerImpl.arePeersRunning(trimmedCurrentVersion)) { - s_logger.info("Cleaning upgrades because all management server are now at the same version"); - TreeMap> upgradedVersions = new TreeMap>(); - - List upgradeVersionsList = new ArrayList<>(); - for (DbUpgrade upgrade : upgrades) { - String upgradedVerson = upgrade.getUpgradedVersion(); - List upgradeList = upgradedVersions.get(upgradedVerson); - if (upgradeList == null) { - upgradeList = new ArrayList(); - } - upgradeList.add(upgrade); - upgradedVersions.put(upgradedVerson, upgradeList); - upgradeVersionsList.add(upgradedVerson); - } - - for (String upgradedVersion : upgradeVersionsList) { - List versionUpgrades = upgradedVersions.get(upgradedVersion); - VersionVO version = _dao.findByVersion(upgradedVersion, Step.Upgrade); - s_logger.debug("Upgrading to version " + upgradedVersion + "..."); + // Run the corresponding '-cleanup.sql' script + txn = TransactionLegacy.open("Cleanup"); + try { + s_logger.info("Cleanup upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + upgrade + .getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion()); - TransactionLegacy txn = TransactionLegacy.open("Cleanup"); + txn.start(); + Connection conn; try { - if (version != null) { - for (DbUpgrade upgrade : versionUpgrades) { - s_logger.info("Cleanup upgrade " + upgrade.getClass().getSimpleName() + " to upgrade from " + upgrade.getUpgradableVersionRange()[0] + "-" + - upgrade.getUpgradableVersionRange()[1] + " to " + upgrade.getUpgradedVersion()); - - txn.start(); - - Connection conn; - try { - conn = txn.getConnection(); - } catch (SQLException e) { - String errorMessage = "Unable to cleanup the database"; - s_logger.error(errorMessage, e); - throw new CloudRuntimeException(errorMessage, e); - } - - File[] scripts = upgrade.getCleanupScripts(); - if (scripts != null) { - for (File script : scripts) { - runScript(conn, script); - s_logger.debug("Cleanup script " + script.getAbsolutePath() + " is executed successfully"); - } - } - txn.commit(); - } - - txn.start(); - version.setStep(Step.Complete); - s_logger.debug("Upgrade completed for version " + upgradedVersion); - version.setUpdated(new Date()); - _dao.update(version.getId(), version); - txn.commit(); + conn = txn.getConnection(); + } catch (SQLException e) { + s_logger.error("Unable to cleanup the database", e); + throw new CloudRuntimeException("Unable to cleanup the database", e); + } + + InputStream[] scripts = upgrade.getCleanupScripts(); + if (scripts != null) { + for (InputStream script : scripts) { + runScript(conn, script); + s_logger.debug("Cleanup script " + upgrade.getClass().getSimpleName() + " is executed successfully"); } - } finally { - txn.close(); } + txn.commit(); + + txn.start(); + version.setStep(Step.Complete); + version.setUpdated(new Date()); + _dao.update(version.getId(), version); + txn.commit(); + s_logger.debug("Upgrade completed for version " + version.getVersion()); + } finally { + txn.close(); } } - } @Override @@ -573,7 +674,7 @@ private NoopDbUpgrade(final CloudStackVersion fromVersion, final CloudStackVersi super(); upgradedVersion = toVersion.toString(); - upgradeRange = new String[] { fromVersion.toString(), toVersion.toString() }; + upgradeRange = new String[] {fromVersion.toString(), toVersion.toString()}; } @@ -593,8 +694,8 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - return new File[0]; + public InputStream[] getPrepareScripts() { + return new InputStream[0]; } @Override @@ -603,9 +704,9 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - return new File[0]; + public InputStream[] getCleanupScripts() { + return new InputStream[0]; } } -} +} \ No newline at end of file diff --git a/engine/schema/src/com/cloud/upgrade/dao/DbUpgrade.java b/engine/schema/src/com/cloud/upgrade/dao/DbUpgrade.java index 090cd143196b..02c401c81558 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/DbUpgrade.java +++ b/engine/schema/src/com/cloud/upgrade/dao/DbUpgrade.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public interface DbUpgrade { @@ -30,16 +30,12 @@ public interface DbUpgrade { * @return the script to prepare the database schema for the * data migration step. */ - File[] getPrepareScripts(); + InputStream[] getPrepareScripts(); /** * Performs the actual data migration. */ void performDataMigration(Connection conn); - /** - * - * @return - */ - File[] getCleanupScripts(); + InputStream[] getCleanupScripts(); } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade217to218.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade217to218.java index 28b5c15e018e..2ca4e794fb84 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade217to218.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade217to218.java @@ -16,27 +16,27 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade217to218 implements DbUpgrade { @Override - public File[] getPrepareScripts() { - String schemaFile = Script.findScript("", "db/schema-217to218.sql"); - if (schemaFile == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-217to218.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-217to218.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - - String dataFile = Script.findScript("", "db/data-217to218.sql"); - if (dataFile == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, data-217to218.sql"); + final String dataFile = "META-INF/db/data-217to218.sql"; + final InputStream data = Thread.currentThread().getContextClassLoader().getResourceAsStream(dataFile); + if (data == null) { + throw new CloudRuntimeException("Unable to find " + dataFile); } - return new File[] {new File(schemaFile), new File(dataFile)}; + return new InputStream[] {script, data}; } @Override @@ -45,7 +45,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22.java index dd9ff5e39af4..90070dc3a788 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22.java @@ -16,8 +16,8 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; import java.io.IOException; +import java.io.InputStream; import java.io.StringReader; import java.sql.Connection; import java.sql.PreparedStatement; @@ -44,20 +44,20 @@ import com.cloud.utils.NumbersUtil; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; -import com.cloud.utils.script.Script; public class Upgrade218to22 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade218to22.class); boolean _basicZone; @Override - public File[] getPrepareScripts() { - String file = Script.findScript("", "db/schema-21to22.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-21to22.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } protected void upgradeStoragePools(Connection conn) { @@ -641,13 +641,13 @@ protected void upgradeDirectUserIpAddress(Connection conn, long dcId, long netwo s_logger.debug("Marking " + allocatedIps.size() + " ip addresses to belong to network " + networkId); s_logger.debug("Updating mac addresses for data center id=" + dcId + ". Found " + allocatedIps.size() + " ip addresses to update"); for (Object[] allocatedIp : allocatedIps) { - try (PreparedStatement selectMacAdresses = conn.prepareStatement("SELECT mac_address FROM data_center WHERE id = ?");) { - selectMacAdresses.setLong(1, dcId); - try (ResultSet selectedMacAdresses = selectMacAdresses.executeQuery();) { - if (!selectedMacAdresses.next()) { + try (PreparedStatement selectMacAddresses = conn.prepareStatement("SELECT mac_address FROM data_center WHERE id = ?");) { + selectMacAddresses.setLong(1, dcId); + try (ResultSet selectedMacAddresses = selectMacAddresses.executeQuery();) { + if (!selectedMacAddresses.next()) { throw new CloudRuntimeException("Unable to get mac address for data center " + dcId); } - long mac = selectedMacAdresses.getLong(1); + long mac = selectedMacAddresses.getLong(1); try (PreparedStatement updateDataCenter = conn.prepareStatement("UPDATE data_center SET mac_address=mac_address+1 WHERE id = ?");) { updateDataCenter.setLong(1, dcId); updateDataCenter.executeUpdate(); @@ -768,10 +768,6 @@ protected void upgradeDataCenter(Connection conn) { } } - /** - * @param conn - * @throws SQLException - */ private void updateDatacenterWithServices(Connection conn) throws SQLException { try (PreparedStatement updateDataCenter = conn.prepareStatement("UPDATE data_center SET networktype=?, dns_provider=?, gateway_provider=?, firewall_provider=?, dhcp_provider=?, lb_provider=?, vpn_provider=?, userdata_provider=?");) { @@ -812,11 +808,6 @@ private void updateBasicZoneDataCenterWithVnetAndGuestCidr(Connection conn) thro } } - /** - * @param conn - * @return - * @throws SQLException - */ private ArrayList retrieveDataCenters(Connection conn) throws SQLException { PreparedStatement selectDcData = conn.prepareStatement("SELECT id, guest_network_cidr, domain FROM data_center"); ResultSet dcData = selectDcData.executeQuery(); @@ -833,11 +824,6 @@ private ArrayList retrieveDataCenters(Connection conn) throws SQLExcep return dcs; } - /** - * @return - * @throws SQLException - * @throws CloudRuntimeException - */ private long retrieveNetworkOfferingId(Connection conn, String type) throws SQLException, CloudRuntimeException { long networkOfferingId; try ( @@ -855,14 +841,6 @@ private long retrieveNetworkOfferingId(Connection conn, String type) throws SQLE } } - /** - * @param conn - * @param managementNetworkOfferingId - * @param controlNetworkOfferingId - * @param storageNetworkOfferingId - * @param dc - * @throws SQLException - */ private void updateBasicNetworkingDataCenter(Connection conn, long managementNetworkOfferingId, long controlNetworkOfferingId, long storageNetworkOfferingId, Object[] dc) throws SQLException { Long dcId = (Long)dc[0]; @@ -892,13 +870,6 @@ private void updateBasicNetworkingDataCenter(Connection conn, long managementNet updateConsoleProxies(conn, dcId, mgmtNetworkId, controlNetworkId, basicDefaultDirectNetworkId, "Basic"); } - /** - * @param conn - * @param dcId - * @param controlNetworkId - * @param basicDefaultDirectNetworkId - * @throws SQLException - */ private void retrieveAndUpdateDomainRouters(Connection conn, Long dcId, long controlNetworkId, long basicDefaultDirectNetworkId) throws SQLException { try (PreparedStatement selectVmInstanceData = conn.prepareStatement("SELECT vm_instance.id, vm_instance.domain_id, vm_instance.account_id, domain_router.gateway, domain_router.guest_ip_address, domain_router.domain, domain_router.dns1, domain_router.dns2, domain_router.vnet FROM vm_instance INNER JOIN domain_router ON vm_instance.id=domain_router.id WHERE vm_instance.removed IS NULL AND vm_instance.type='DomainRouter' AND vm_instance.data_center_id=?");) { @@ -917,12 +888,6 @@ private void retrieveAndUpdateDomainRouters(Connection conn, Long dcId, long con } } - /** - * @param conn - * @param dcId - * @param networkId - * @throws SQLException - */ private void updateVlanWithNetworkForDataCenter(Connection conn, Long dcId, long networkId) throws SQLException { try (PreparedStatement selectVlanId = conn.prepareStatement("SELECT id FROM vlan WHERE vlan_type='DirectAttached' AND data_center_id=?");) { selectVlanId.setLong(1, dcId); @@ -936,16 +901,6 @@ private void updateVlanWithNetworkForDataCenter(Connection conn, Long dcId, long } } - /** - * @param conn - * @param managementNetworkOfferingId - * @param publicNetworkOfferingId - * @param controlNetworkOfferingId - * @param storageNetworkOfferingId - * @param dc - * @throws SQLException - * @throws CloudRuntimeException - */ private void updateAdvancedNetworkingDataCenter(Connection conn, long managementNetworkOfferingId, long publicNetworkOfferingId, long controlNetworkOfferingId, long storageNetworkOfferingId, Object[] dc) throws SQLException, CloudRuntimeException { Long dcId = (Long)dc[0]; @@ -984,11 +939,6 @@ private void updateAdvancedNetworkingDataCenter(Connection conn, long management updateConsoleProxies(conn, dcId, mgmtNetworkId, controlNetworkId, publicNetworkId, "Advanced"); } - /** - * @param dcId - * @return - * @throws SQLException - */ private ArrayList retrieveRouters(Connection conn, Long dcId) throws SQLException { ArrayList routers = new ArrayList(); try (PreparedStatement selectRouterData = @@ -1012,28 +962,12 @@ private ArrayList retrieveRouters(Connection conn, Long dcId) throws S return routers; } - /** - * @param conn - * @param dc - * @param dcId - * @param controlNetworkId - * @param publicNetworkId - * @param routers - * @throws SQLException - */ private void updateRouters(Connection conn, Object[] dc, Long dcId, long controlNetworkId, long publicNetworkId, ArrayList routers) throws SQLException { for (Object[] router : routers) { updateRouter(conn, dc, dcId, controlNetworkId, publicNetworkId, router); } } - /** - * @param conn - * @param dcId - * @param controlNetworkId - * @param basicDefaultDirectNetworkId - * @param routers - * @throws SQLException - */ + private void updateRouters(Connection conn, Long dcId, long controlNetworkId, long basicDefaultDirectNetworkId, ArrayList routers) throws SQLException { for (Object[] router : routers) { s_logger.debug("Updating domR with network id in basic zone id=" + dcId); @@ -1043,16 +977,6 @@ private void updateRouters(Connection conn, Long dcId, long controlNetworkId, lo } } - - /** - * @param conn - * @param dc - * @param dcId - * @param controlNetworkId - * @param publicNetworkId - * @param router - * @throws SQLException - */ private void updateRouter(Connection conn, Object[] dc, Long dcId, long controlNetworkId, long publicNetworkId, Object[] router) throws SQLException { String vnet = (String)router[7]; String reservationId = null; @@ -1077,11 +1001,6 @@ private void updateRouter(Connection conn, Object[] dc, Long dcId, long controlN upgradeDomR(conn, dcId, (Long)router[0], publicNetworkId, virtualNetworkId, controlNetworkId, "Advanced", vnet); } - /** - * @param router - * @param virtualNetworkId - * @throws SQLException - */ private void updateNetworkForRouter(Connection conn, Object[] router, long virtualNetworkId) throws SQLException { try (PreparedStatement updateDomainRouter = conn.prepareStatement("UPDATE domain_router SET network_id = ? WHERE id = ? ");) { updateDomainRouter.setLong(1, virtualNetworkId); @@ -1091,12 +1010,6 @@ private void updateNetworkForRouter(Connection conn, Object[] router, long virtu s_logger.debug("Network inserted for " + router[0] + " id = " + virtualNetworkId); } - /** - * @param conn - * @param dc - * @param dcId - * @throws SQLException - */ private void createDirectNetworks(Connection conn, Object[] dc, Long dcId) throws SQLException { // Create direct networks try (PreparedStatement selectVlanData = conn.prepareStatement("SELECT id, vlan_id, vlan_gateway, vlan_netmask FROM vlan WHERE vlan_type='DirectAttached' AND data_center_id=?");) { @@ -1122,17 +1035,6 @@ private void createDirectNetworks(Connection conn, Object[] dc, Long dcId) throw } } - /** - * @param conn - * @param dc - * @param dcId - * @param vlanNetworkMap - * @param vlanId - * @param tag - * @param gateway - * @param cidr - * @throws SQLException - */ private void retrieveAccountDataAndCreateNetwork(Connection conn, Object[] dc, Long dcId, HashMap vlanNetworkMap, long vlanId, String tag, String gateway, String cidr) throws SQLException { Long accountId = 1L; @@ -1156,12 +1058,6 @@ private void retrieveAccountDataAndCreateNetwork(Connection conn, Object[] dc, L } } - /** - * @param accountId - * @param domainId - * @return - * @throws SQLException - */ private Long retrieveDomainId(Connection conn,Long accountId) throws SQLException { try (PreparedStatement pstmt = conn.prepareStatement("SELECT domain_id FROM account WHERE id=?");) { pstmt.setLong(1, accountId); @@ -1175,11 +1071,6 @@ private Long retrieveDomainId(Connection conn,Long accountId) throws SQLExceptio } } - /** - * @param basicDefaultDirectNetworkId - * @param vlanId - * @throws SQLException - */ private void updateVlanNetworkForTag(Connection conn, long basicDefaultDirectNetworkId, long vlanId) throws SQLException { try (PreparedStatement pstmt = conn.prepareStatement("UPDATE vlan SET network_id=? WHERE id=?");) { pstmt.setLong(1, basicDefaultDirectNetworkId); @@ -1188,22 +1079,10 @@ private void updateVlanNetworkForTag(Connection conn, long basicDefaultDirectNet } } - /** - * @param vlanNetworkMap - * @param vlanId - * @param tag - * @throws SQLException - */ private void updateNetworkInVlanTableforTag(Connection conn, HashMap vlanNetworkMap, long vlanId, String tag) throws SQLException { updateVlanNetworkForTag(conn, vlanId, vlanNetworkMap.get(tag)); } - /** - * @param conn - * @param dcId - * @return - * @throws SQLException - */ private ArrayList retrieveDhcpServers(Connection conn, Long dcId) throws SQLException { // Create DHCP domRs - Direct networks try (PreparedStatement pstmt = @@ -1222,15 +1101,6 @@ private ArrayList retrieveDhcpServers(Connection conn, Long dcId) thro } } - /** - * @param conn - * @param dcId - * @param controlNetworkId - * @param routerId - * @param directIp - * @throws SQLException - * @throws CloudRuntimeException - */ private void updateDhcpServerData(Connection conn, Long dcId, long controlNetworkId, Long routerId, String directIp) throws SQLException, CloudRuntimeException { try ( PreparedStatement pstmt = @@ -1257,13 +1127,6 @@ private void updateDhcpServerData(Connection conn, Long dcId, long controlNetwor } } - /** - * @param conn - * @param directNetworkId - * @return - * @throws SQLException - * @throws CloudRuntimeException - */ private String retrieveGateway(Connection conn, Long directNetworkId) throws SQLException, CloudRuntimeException { try (PreparedStatement selectGateway = conn.prepareStatement("SELECT gateway from networks where id=?");) { selectGateway.setLong(1, directNetworkId); @@ -1277,11 +1140,6 @@ private String retrieveGateway(Connection conn, Long directNetworkId) throws SQL } } - /** - * @param routerId - * @param directNetworkId - * @throws SQLException - */ private void updateDomainRouter(Connection conn, Long routerId, Long directNetworkId) throws SQLException { try (PreparedStatement updateDomainRouter = conn.prepareStatement("UPDATE domain_router SET network_id = ? WHERE id = ? ");) { updateDomainRouter.setLong(1, directNetworkId); @@ -1290,14 +1148,6 @@ private void updateDomainRouter(Connection conn, Long routerId, Long directNetwo } } - /** - * @param conn - * @param dcId - * @param mgmtNetworkId - * @param controlNetworkId - * @param publicNetworkId - * @throws SQLException - */ private void updateConsoleProxies(Connection conn, Long dcId, long mgmtNetworkId, long controlNetworkId, long publicNetworkId, String networkingType) throws SQLException { // Upgrade ConsoleProxy try (PreparedStatement selectInstanceIds = conn.prepareStatement("SELECT vm_instance.id FROM vm_instance WHERE removed IS NULL AND type='ConsoleProxy' AND data_center_id=?");) { @@ -2299,13 +2149,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String file = Script.findScript("", "db/schema-21to22-cleanup.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-21to22-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java index dfdd11da659d..5f66728e6d9f 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to224DomainVlans.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -31,7 +31,7 @@ public class Upgrade218to224DomainVlans implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade218to224DomainVlans.class); @Override - public File[] getPrepareScripts() { + public InputStream[] getPrepareScripts() { return null; } @@ -93,7 +93,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java index 10ae5b0b33bf..d21d1ce4e662 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade218to22Premium.java @@ -16,26 +16,23 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade218to22Premium extends Upgrade218to22 { @Override - public File[] getPrepareScripts() { - File[] scripts = super.getPrepareScripts(); - File[] newScripts = new File[2]; - newScripts[0] = scripts[0]; - - String file = Script.findScript("", "db/schema-21to22-premium.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-21to22-premium.sql"); + public InputStream[] getPrepareScripts() { + InputStream[] newScripts = new InputStream[2]; + newScripts[0] = super.getPrepareScripts()[0]; + final String scriptFile = "META-INF/db/schema-21to22-premium.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - - newScripts[1] = new File(file); + newScripts[1] = script; return newScripts; } @@ -47,15 +44,6 @@ public void performDataMigration(Connection conn) { updateUsageIpAddress(conn); } - @Override - public File[] getCleanupScripts() { - File[] scripts = super.getCleanupScripts(); - File[] newScripts = new File[1]; - // Change the array to 2 when you add in the scripts for premium. - newScripts[0] = scripts[0]; - return newScripts; - } - private void updateUserStats(Connection conn) { try ( // update device_id information PreparedStatement pstmt = conn.prepareStatement( diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2210to2211.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2210to2211.java index 221a25fea7d4..db1452270805 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2210to2211.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2210to2211.java @@ -16,16 +16,12 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; -import org.apache.log4j.Logger; - import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade2210to2211 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade2210to2211.class); @Override public String[] getUpgradableVersionRange() { @@ -43,13 +39,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-2210to2211.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-2210to2211.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-2210to2211.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -57,7 +54,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212.java index 4a2ba17a2ac6..f8175386df52 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -27,7 +27,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade2211to2212 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade2211to2212.class); @@ -48,13 +47,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-2211to2212.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-2211to2212.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-2211to2212.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -63,7 +63,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java index 117fa63d0082..374483811368 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2211to2212Premium.java @@ -16,40 +16,26 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; -import java.sql.Connection; +import java.io.InputStream; import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade2211to2212Premium extends Upgrade2211to2212 { final static Logger s_logger = Logger.getLogger(Upgrade2211to2212Premium.class); @Override - public File[] getPrepareScripts() { - File[] scripts = super.getPrepareScripts(); - File[] newScripts = new File[2]; - newScripts[0] = scripts[0]; - - String file = Script.findScript("", "db/schema-2211to2212-premium.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-2211to2212-premium.sql"); + public InputStream[] getPrepareScripts() { + InputStream[] newScripts = new InputStream[2]; + newScripts[0] = super.getPrepareScripts()[0]; + final String scriptFile = "META-INF/db/schema-2211to2212-premium.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - - newScripts[1] = new File(file); + newScripts[1] = script; return newScripts; } - - @Override - public void performDataMigration(Connection conn) { - super.performDataMigration(conn); - } - - @Override - public File[] getCleanupScripts() { - return null; - } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2212to2213.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2212to2213.java index df93519371a3..7debe2ec378a 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2212to2213.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2212to2213.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -27,7 +27,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade2212to2213 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade2212to2213.class); @@ -48,13 +47,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-2212to2213.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-2212to2213.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-2212to2213.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -63,7 +63,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2213to2214.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2213to2214.java index a8bf80c45a98..f155d6fe91d8 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2213to2214.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2213to2214.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -26,7 +26,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade2213to2214 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade2213to2214.class); @@ -47,24 +46,23 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-2213to2214.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-2213to2214.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-2213to2214.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override public void performDataMigration(Connection conn) { fixIndexes(conn); - //Remove certificate upgrade since RHIP is being retired - //upgradeCerts(conn); } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2214to30.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2214to30.java index 272d25990d64..7de60bff8d4c 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade2214to30.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade2214to30.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -36,7 +36,6 @@ import com.cloud.utils.crypt.EncryptionSecretKeyChecker; import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade2214to30 extends Upgrade30xBase implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade2214to30.class); @@ -57,13 +56,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-2214to30.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-2214to30.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-2214to30.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -102,13 +102,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-2214to30-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-2214to30-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-2214to30-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private void setupPhysicalNetworks(Connection conn) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222.java index e8e78b6a6f77..41198adb14bd 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222.java @@ -16,22 +16,22 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade221to222 implements DbUpgrade { @Override - public File[] getPrepareScripts() { - String file = Script.findScript("", "db/schema-221to222.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-221to222.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-221to222.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override @@ -40,13 +40,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String file = Script.findScript("", "db/schema-221to222-cleanup.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-221to222-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-221to222-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java index f1e156853996..c208ff2f065e 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade221to222Premium.java @@ -16,45 +16,23 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; -import java.sql.Connection; - -import org.apache.log4j.Logger; +import java.io.InputStream; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade221to222Premium extends Upgrade221to222 { - final static Logger s_logger = Logger.getLogger(Upgrade221to222Premium.class); @Override - public File[] getPrepareScripts() { - File[] scripts = super.getPrepareScripts(); - File[] newScripts = new File[2]; - newScripts[0] = scripts[0]; - - String file = Script.findScript("", "db/schema-221to222-premium.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-221to222-premium.sql"); + public InputStream[] getPrepareScripts() { + InputStream[] newScripts = new InputStream[2]; + newScripts[0] = super.getPrepareScripts()[0]; + final String scriptFile = "META-INF/db/schema-221to222-premium.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } + newScripts[1] = script; - newScripts[1] = new File(file); - - return newScripts; - } - - @Override - public void performDataMigration(Connection conn) { - super.performDataMigration(conn); - // perform permium data migration here. - } - - @Override - public File[] getCleanupScripts() { - File[] scripts = super.getCleanupScripts(); - File[] newScripts = new File[1]; - // Change the array to 2 when you add in the scripts for premium. - newScripts[0] = scripts[0]; return newScripts; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224.java index 458f7eebf413..94bc4c78528e 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -29,7 +29,6 @@ import com.cloud.capacity.Capacity; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade222to224 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade222to224.class); @@ -50,13 +49,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-222to224.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-222to224.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-222to224.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private void fixRelatedFkeyOnNetworksTable(Connection conn) throws SQLException { @@ -96,13 +96,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String file = Script.findScript("", "db/schema-222to224-cleanup.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-222to224-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-222to224-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } private void checkForDuplicatePublicNetworks(Connection conn) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java index 775c140efdcf..ac7bd120c3da 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade222to224Premium.java @@ -16,30 +16,27 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade222to224Premium extends Upgrade222to224 { final static Logger s_logger = Logger.getLogger(Upgrade222to224Premium.class); @Override - public File[] getPrepareScripts() { - File[] scripts = super.getPrepareScripts(); - File[] newScripts = new File[2]; - newScripts[0] = scripts[0]; - - String file = Script.findScript("", "db/schema-222to224-premium.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-222to224-premium.sql"); + public InputStream[] getPrepareScripts() { + InputStream[] newScripts = new InputStream[2]; + newScripts[0] = super.getPrepareScripts()[0]; + final String scriptFile = "META-INF/db/schema-222to224-premium.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - - newScripts[1] = new File(file); + newScripts[1] = script; return newScripts; } @@ -50,15 +47,6 @@ public void performDataMigration(Connection conn) { updateUserStats(conn); } - @Override - public File[] getCleanupScripts() { - File[] scripts = super.getCleanupScripts(); - File[] newScripts = new File[1]; - // Change the array to 2 when you add in the scripts for premium. - newScripts[0] = scripts[0]; - return newScripts; - } - private void updateUserStats(Connection conn) { try ( // update network_id information PreparedStatement pstmt = conn.prepareStatement( diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade224to225.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade224to225.java index 7b06d7f6b2be..1e23377c012f 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade224to225.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade224to225.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -28,19 +28,19 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade224to225 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade224to225.class); @Override - public File[] getPrepareScripts() { - String file = Script.findScript("", "db/schema-224to225.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-224to225.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-224to225.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override @@ -54,13 +54,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String file = Script.findScript("", "db/schema-224to225-cleanup.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the cleanup script, schema-224to225-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-224to225-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade225to226.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade225to226.java index ed185623e644..f606d6e756f4 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade225to226.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade225to226.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.util.ArrayList; import java.util.HashMap; @@ -25,19 +25,19 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade225to226 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade225to226.class); @Override - public File[] getPrepareScripts() { - String file = Script.findScript("", "db/schema-225to226.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-225to226.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-225to226.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override @@ -47,7 +47,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228.java index fd75857aadea..7d665718db44 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -26,7 +26,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade227to228 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade227to228.class); @@ -47,13 +46,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-227to228.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-227to228.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-227to228.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -88,7 +88,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java index 5ed055125a8f..032fb58da862 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade227to228Premium.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -25,23 +25,20 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade227to228Premium extends Upgrade227to228 { final static Logger s_logger = Logger.getLogger(Upgrade227to228Premium.class); @Override - public File[] getPrepareScripts() { - File[] scripts = super.getPrepareScripts(); - File[] newScripts = new File[2]; - newScripts[0] = scripts[0]; - - String file = Script.findScript("", "db/schema-227to228-premium.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-227to228-premium.sql"); + public InputStream[] getPrepareScripts() { + InputStream[] newScripts = new InputStream[2]; + newScripts[0] = super.getPrepareScripts()[0]; + final String scriptFile = "META-INF/db/schema-227to228-premium.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - - newScripts[1] = new File(file); + newScripts[1] = script; return newScripts; } @@ -53,11 +50,6 @@ public void performDataMigration(Connection conn) { super.performDataMigration(conn); } - @Override - public File[] getCleanupScripts() { - return null; - } - private void addSourceIdColumn(Connection conn) { boolean insertField = false; try { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade228to229.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade228to229.java index a7757c1981a5..c556cd900896 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade228to229.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade228to229.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -27,7 +27,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade228to229 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade228to229.class); @@ -48,12 +47,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-228to229.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-228to229.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-228to229.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -81,7 +82,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade229to2210.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade229to2210.java index dbeb31e6b450..1ad7e6d2b4c5 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade229to2210.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade229to2210.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -26,7 +26,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade229to2210 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade229to2210.class); @@ -47,13 +46,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-229to2210.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-229to2210.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-229to2210.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -63,7 +63,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade301to302.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade301to302.java index 0e9b479c9473..cafd025982a9 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade301to302.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade301to302.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -29,7 +29,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade301to302 extends LegacyDbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade301to302.class); @@ -50,13 +49,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-301to302.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-301to302.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-301to302.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private void dropKeysIfExists(Connection conn) { @@ -81,13 +81,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-301to302-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-301to302-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-301to302-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } protected void updateSharedNetworks(Connection conn) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to303.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to303.java index abd0c347df3b..e07c98dd4489 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to303.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to303.java @@ -20,7 +20,7 @@ /** * @author Alena Prokharchyk */ -import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -30,11 +30,9 @@ import org.apache.log4j.Logger; -// import com.cloud.dc.DataCenter.NetworkType; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade302to303 extends LegacyDbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade302to303.class); @@ -55,13 +53,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-302to303.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-302to303.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-302to303.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -273,7 +272,7 @@ private void encryptConfig(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java index 829e99852bac..eb0492cd288b 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade302to40.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -32,7 +32,6 @@ import com.cloud.dc.DataCenter.NetworkType; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade302to40 extends Upgrade30xBase { final static Logger s_logger = Logger.getLogger(Upgrade302to40.class); @@ -53,13 +52,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-302to40.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-302to40.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-302to40.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -78,13 +78,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-302to40-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-302to40-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-302to40-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private void correctVRProviders(Connection conn) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java index 96793d458578..03f69ddefc90 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -48,7 +48,7 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { + public InputStream[] getPrepareScripts() { return null; } @@ -389,7 +389,7 @@ private void cloneOfferingAndAddTag(Connection conn, long networkOfferingId, lon } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java index 3f1268845c07..dbb7187507f2 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -31,7 +31,6 @@ import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade304to305 extends Upgrade30xBase { final static Logger s_logger = Logger.getLogger(Upgrade304to305.class); @@ -52,13 +51,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-304to305.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-304to305.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-304to305.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -73,13 +73,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-304to305-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-304to305-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-304to305-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private void updateSystemVms(Connection conn) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java index c31ce659a002..79e69e0ad549 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java @@ -18,6 +18,7 @@ package com.cloud.upgrade.dao; import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -29,7 +30,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade305to306 extends Upgrade30xBase { final static Logger s_logger = Logger.getLogger(Upgrade305to306.class); @@ -50,13 +50,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-305to306.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-305to306.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-305to306.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -248,13 +249,14 @@ private void fix22xKVMSnapshots(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-305to306-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-305to306-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-305to306-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java index a911882fa69f..4eb39af51d7c 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -26,7 +26,6 @@ import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade306to307 extends Upgrade30xBase { final static Logger s_logger = Logger.getLogger(Upgrade306to307.class); @@ -47,13 +46,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-306to307.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-306to307.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-306to307.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -62,8 +62,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java index 4319481fe938..1554ff04f701 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -27,7 +27,6 @@ import com.cloud.utils.db.DbProperties; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade307to410 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade307to410.class); @@ -48,13 +47,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-307to410.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-307to410.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-307to410.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -81,12 +81,13 @@ private void updateRegionEntries(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-307to410-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-307to410-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-307to410-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade30to301.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade30to301.java index fafec269c51c..806cabb12eb2 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade30to301.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade30to301.java @@ -16,7 +16,7 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -26,7 +26,6 @@ import com.cloud.configuration.Resource.ResourceType; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade30to301 extends LegacyDbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade30to301.class); @@ -47,13 +46,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-30to301.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-30to301.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-30to301.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -65,7 +65,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade40to41.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade40to41.java index ab683fcb4f3c..5864e2410d04 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade40to41.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade40to41.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -29,7 +29,6 @@ import com.cloud.utils.db.DbProperties; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade40to41 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade40to41.class); @@ -50,13 +49,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-40to410.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-40to410.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-40to410.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -66,13 +66,14 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-40to410-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-40to410-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-40to410-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private void updateRegionEntries(Connection conn) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade41000to41100.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade41000to41100.java new file mode 100644 index 000000000000..3900cf0bf82d --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade41000to41100.java @@ -0,0 +1,134 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.upgrade.dao; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Map; + +import org.apache.commons.codec.binary.Base64; +import org.apache.log4j.Logger; + +import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.exception.CloudRuntimeException; + +public class Upgrade41000to41100 implements DbUpgrade { + + final static Logger LOG = Logger.getLogger(Upgrade41000to41100.class); + + @Override + public String[] getUpgradableVersionRange() { + return new String[] {"4.10.0.0", "4.11.0.0"}; + } + + @Override + public String getUpgradedVersion() { + return "4.11.0.0"; + } + + @Override + public boolean supportsRollingUpgrade() { + return false; + } + + @Override + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-41000to41100.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } + + @Override + public void performDataMigration(Connection conn) { + checkAndEnableDynamicRoles(conn); + validateUserDataInBase64(conn); + } + + private void checkAndEnableDynamicRoles(final Connection conn) { + final Map apiMap = PropertiesUtil.processConfigFile(new String[] { "commands.properties" }); + if (apiMap == null || apiMap.isEmpty()) { + if (LOG.isDebugEnabled()) { + LOG.debug("No commands.properties file was found, enabling dynamic roles by setting dynamic.apichecker.enabled to true if not already enabled."); + } + try (final PreparedStatement updateStatement = conn.prepareStatement("INSERT INTO cloud.configuration (category, instance, name, default_value, value) VALUES ('Advanced', 'DEFAULT', 'dynamic.apichecker.enabled', 'false', 'true') ON DUPLICATE KEY UPDATE value='true'")) { + updateStatement.executeUpdate(); + } catch (SQLException e) { + LOG.error("Failed to set dynamic.apichecker.enabled to true, please run migrate-dynamicroles.py script to manually migrate to dynamic roles.", e); + } + } else { + LOG.warn("Old commands.properties static checker is deprecated, please use migrate-dynamicroles.py to migrate to dynamic roles. Refer http://docs.cloudstack.apache.org/projects/cloudstack-administration/en/latest/accounts.html#using-dynamic-roles"); + } + } + + private void validateUserDataInBase64(Connection conn) { + try (final PreparedStatement selectStatement = conn.prepareStatement("SELECT `id`, `user_data` FROM `cloud`.`user_vm` WHERE `user_data` IS NOT NULL;"); + final ResultSet selectResultSet = selectStatement.executeQuery()) { + while (selectResultSet.next()) { + final Long userVmId = selectResultSet.getLong(1); + final String userData = selectResultSet.getString(2); + if (Base64.isBase64(userData)) { + final String newUserData = Base64.encodeBase64String(Base64.decodeBase64(userData.getBytes())); + if (!userData.equals(newUserData)) { + try (final PreparedStatement updateStatement = conn.prepareStatement("UPDATE `cloud`.`user_vm` SET `user_data` = ? WHERE `id` = ? ;")) { + updateStatement.setString(1, newUserData); + updateStatement.setLong(2, userVmId); + updateStatement.executeUpdate(); + } catch (SQLException e) { + LOG.error("Failed to update cloud.user_vm user_data for id:" + userVmId + " with exception: " + e.getMessage()); + throw new CloudRuntimeException("Exception while updating cloud.user_vm for id " + userVmId, e); + } + } + } else { + // Update to NULL since it's invalid + LOG.warn("Removing user_data for vm id " + userVmId + " because it's invalid"); + LOG.warn("Removed data was: " + userData); + try (final PreparedStatement updateStatement = conn.prepareStatement("UPDATE `cloud`.`user_vm` SET `user_data` = NULL WHERE `id` = ? ;")) { + updateStatement.setLong(1, userVmId); + updateStatement.executeUpdate(); + } catch (SQLException e) { + LOG.error("Failed to update cloud.user_vm user_data for id:" + userVmId + " to NULL with exception: " + e.getMessage()); + throw new CloudRuntimeException("Exception while updating cloud.user_vm for id " + userVmId + " to NULL", e); + } + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Exception while validating existing user_vm table's user_data column to be base64 valid with padding", e); + } + if (LOG.isDebugEnabled()) { + LOG.debug("Done validating base64 content of user data"); + } + } + + @Override + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-41000to41100-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } +} diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java index 7fa2e0cd9e68..9551a5041923 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java @@ -18,6 +18,7 @@ package com.cloud.upgrade.dao; import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.Date; @@ -42,7 +43,6 @@ import com.cloud.utils.Pair; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade410to420 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade410to420.class); @@ -63,13 +63,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-410to420.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-410to420.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-410to420.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -607,13 +608,14 @@ private void updateOverCommitRatioClusterDetails(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-410to420-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-410to420-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-410to420-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private String getNewLabel(ResultSet rs, String oldParamValue) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade41100to41110.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade41100to41110.java new file mode 100644 index 000000000000..90e000168199 --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade41100to41110.java @@ -0,0 +1,319 @@ +/* + * // Licensed to the Apache Software Foundation (ASF) under one + * // or more contributor license agreements. See the NOTICE file + * // distributed with this work for additional information + * // regarding copyright ownership. The ASF licenses this file + * // to you under the Apache License, Version 2.0 (the + * // "License"); you may not use this file except in compliance + * // with the License. You may obtain a copy of the License at + * // + * // http://www.apache.org/licenses/LICENSE-2.0 + * // + * // Unless required by applicable law or agreed to in writing, + * // software distributed under the License is distributed on an + * // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * // KIND, either express or implied. See the License for the + * // specific language governing permissions and limitations + * // under the License. + */ + +package com.cloud.upgrade.dao; + +import com.cloud.hypervisor.Hypervisor; +import com.cloud.utils.crypt.DBEncryptionUtil; +import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.log4j.Logger; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; + +public class Upgrade41100to41110 implements DbUpgrade { + final static Logger LOG = Logger.getLogger(Upgrade41000to41100.class); + + @Override + public String[] getUpgradableVersionRange() { + return new String[]{"4.11.0.0", "4.11.1.0"}; + } + + @Override + public String getUpgradedVersion() { + return "4.11.1.0"; + } + + @Override + public boolean supportsRollingUpgrade() { + return false; + } + + @Override + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-41100to41110.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } + + @Override + public void performDataMigration(Connection conn) { + updateSystemVmTemplates(conn); + markUnnecessarySecureConfigsAsUnsecure(conn); + } + + private void markUnnecessarySecureConfigsAsUnsecure(Connection conn) { + /* + * the following config items where added as 'Secure' in the past. For some this made sense but for the ones below, + * this makes no sense and is a inconvenience at best. The below method will + ** retrieve, + ** unencrypt, + ** mark as 'Advanced' and then + ** store the item + */ + String[] unsecureItems = new String[] { + "ldap.basedn", + "ldap.bind.principal", + "ldap.email.attribute", + "ldap.firstname.attribute", + "ldap.group.object", + "ldap.group.user.uniquemember", + "ldap.lastname.attribute", + "ldap.search.group.principle", + "ldap.truststore", + "ldap.user.object", + "ldap.username.attribute" + }; + + for (String name : unsecureItems) { + uncrypt(conn, name); + } + } + + /** + * if encrypted, decrypt the ldap hostname and port and then update as they are not encrypted now. + */ + private void uncrypt(Connection conn, String name) + { + String value = null; + try ( + PreparedStatement prepSelStmt = conn.prepareStatement("SELECT conf.category,conf.value FROM `cloud`.`configuration` conf WHERE conf.name= ?"); + ) { + prepSelStmt.setString(1,name); + try ( + ResultSet resultSet = prepSelStmt.executeQuery(); + ) { + if (LOG.isInfoEnabled()) { + LOG.info("updating setting '" + name + "'"); + } + if (resultSet.next()) { + if ("Secure".equals(resultSet.getString(1))) { + value = DBEncryptionUtil.decrypt(resultSet.getString(2)); + try ( + PreparedStatement prepUpdStmt= conn.prepareStatement("UPDATE `cloud`.`configuration` SET category = 'Advanced', value = ? WHERE name = ?" ); + ) { + prepUpdStmt.setString(1, value); + prepUpdStmt.setString(2, name); + prepUpdStmt.execute(); + } catch (SQLException e) { + if (LOG.isInfoEnabled()) { + LOG.info("failed to update configuration item '" + name + "' with value '" + value + "'"); + if (LOG.isDebugEnabled()) { + LOG.debug("no update because ", e); + } + } + } + } + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("failed to update configuration item '" + name + "' with value '" + value + "'", e); + } + } + + @SuppressWarnings("serial") + private void updateSystemVmTemplates(final Connection conn) { + LOG.debug("Updating System Vm template IDs"); + final Set hypervisorsListInUse = new HashSet(); + try (PreparedStatement pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null"); ResultSet rs = pstmt.executeQuery()) { + while (rs.next()) { + switch (Hypervisor.HypervisorType.getType(rs.getString(1))) { + case XenServer: + hypervisorsListInUse.add(Hypervisor.HypervisorType.XenServer); + break; + case KVM: + hypervisorsListInUse.add(Hypervisor.HypervisorType.KVM); + break; + case VMware: + hypervisorsListInUse.add(Hypervisor.HypervisorType.VMware); + break; + case Hyperv: + hypervisorsListInUse.add(Hypervisor.HypervisorType.Hyperv); + break; + case LXC: + hypervisorsListInUse.add(Hypervisor.HypervisorType.LXC); + break; + case Ovm3: + hypervisorsListInUse.add(Hypervisor.HypervisorType.Ovm3); + break; + default: + break; + } + } + } catch (final SQLException e) { + LOG.error("updateSystemVmTemplates: Exception caught while getting hypervisor types from clusters: " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting hypervisor types from clusters", e); + } + + final Map NewTemplateNameList = new HashMap() { + { + put(Hypervisor.HypervisorType.KVM, "systemvm-kvm-4.11.1"); + put(Hypervisor.HypervisorType.VMware, "systemvm-vmware-4.11.1"); + put(Hypervisor.HypervisorType.XenServer, "systemvm-xenserver-4.11.1"); + put(Hypervisor.HypervisorType.Hyperv, "systemvm-hyperv-4.11.1"); + put(Hypervisor.HypervisorType.LXC, "systemvm-lxc-4.11.1"); + put(Hypervisor.HypervisorType.Ovm3, "systemvm-ovm3-4.11.1"); + } + }; + + final Map routerTemplateConfigurationNames = new HashMap() { + { + put(Hypervisor.HypervisorType.KVM, "router.template.kvm"); + put(Hypervisor.HypervisorType.VMware, "router.template.vmware"); + put(Hypervisor.HypervisorType.XenServer, "router.template.xenserver"); + put(Hypervisor.HypervisorType.Hyperv, "router.template.hyperv"); + put(Hypervisor.HypervisorType.LXC, "router.template.lxc"); + put(Hypervisor.HypervisorType.Ovm3, "router.template.ovm3"); + } + }; + + final Map newTemplateUrl = new HashMap() { + { + put(Hypervisor.HypervisorType.KVM, "https://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-kvm.qcow2.bz2"); + put(Hypervisor.HypervisorType.VMware, "https://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-vmware.ova"); + put(Hypervisor.HypervisorType.XenServer, "https://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-xen.vhd.bz2"); + put(Hypervisor.HypervisorType.Hyperv, "https://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-hyperv.vhd.zip"); + put(Hypervisor.HypervisorType.LXC, "https://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-kvm.qcow2.bz2"); + put(Hypervisor.HypervisorType.Ovm3, "https://download.cloudstack.org/systemvm/4.11/systemvmtemplate-4.11.1-ovm.raw.bz2"); + } + }; + + final Map newTemplateChecksum = new HashMap() { + { + put(Hypervisor.HypervisorType.KVM, "6019c2ed1a13669dcf334fe380c776b0"); + put(Hypervisor.HypervisorType.XenServer, "f2245e912c856ab610d91f88c362a1f9"); + put(Hypervisor.HypervisorType.VMware, "1dbcd051fcfcd0fd568ff6eb5294988a"); + put(Hypervisor.HypervisorType.Hyperv, "e68ec90f0dc06821d94a2ee0e88fa646"); + put(Hypervisor.HypervisorType.LXC, "6019c2ed1a13669dcf334fe380c776b0"); + put(Hypervisor.HypervisorType.Ovm3, "cd2ac8dcdaf6c05d75e29cb39ee9a10f"); + } + }; + + for (final Map.Entry hypervisorAndTemplateName : NewTemplateNameList.entrySet()) { + LOG.debug("Updating " + hypervisorAndTemplateName.getKey() + " System Vms"); + try (PreparedStatement pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = ? and removed is null order by id desc limit 1")) { + // Get 4.11.0 systemvm template id for corresponding hypervisor + long templateId = -1; + pstmt.setString(1, hypervisorAndTemplateName.getValue()); + try (ResultSet rs = pstmt.executeQuery()) { + if (rs.next()) { + templateId = rs.getLong(1); + } + } catch (final SQLException e) { + LOG.error("updateSystemVmTemplates: Exception caught while getting ids of templates: " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates: Exception caught while getting ids of templates", e); + } + + // change template type to SYSTEM + if (templateId != -1) { + try (PreparedStatement templ_type_pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?");) { + templ_type_pstmt.setLong(1, templateId); + templ_type_pstmt.executeUpdate(); + } catch (final SQLException e) { + LOG.error("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system': " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system'", e); + } + // update template ID of system Vms + try (PreparedStatement update_templ_id_pstmt = conn + .prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = ?");) { + update_templ_id_pstmt.setLong(1, templateId); + update_templ_id_pstmt.setString(2, hypervisorAndTemplateName.getKey().toString()); + update_templ_id_pstmt.executeUpdate(); + } catch (final Exception e) { + LOG.error("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " + templateId + + ": " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " + + templateId, e); + } + + // Change value of global configuration parameter + // router.template.* for the corresponding hypervisor + try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) { + update_pstmt.setString(1, hypervisorAndTemplateName.getValue()); + update_pstmt.setString(2, routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey())); + update_pstmt.executeUpdate(); + } catch (final SQLException e) { + LOG.error("updateSystemVmTemplates:Exception while setting " + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " + + hypervisorAndTemplateName.getValue() + ": " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting " + + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " + hypervisorAndTemplateName.getValue(), e); + } + + // Change value of global configuration parameter + // minreq.sysvmtemplate.version for the ACS version + try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) { + update_pstmt.setString(1, "4.11.1"); + update_pstmt.setString(2, "minreq.sysvmtemplate.version"); + update_pstmt.executeUpdate(); + } catch (final SQLException e) { + LOG.error("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.11.1: " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.11.1", e); + } + } else { + if (hypervisorsListInUse.contains(hypervisorAndTemplateName.getKey())) { + throw new CloudRuntimeException(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. Cannot upgrade system Vms"); + } else { + LOG.warn(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. " + hypervisorAndTemplateName.getKey() + + " hypervisor is not used, so not failing upgrade"); + // Update the latest template URLs for corresponding + // hypervisor + try (PreparedStatement update_templ_url_pstmt = conn + .prepareStatement("UPDATE `cloud`.`vm_template` SET url = ? , checksum = ? WHERE hypervisor_type = ? AND type = 'SYSTEM' AND removed is null order by id desc limit 1");) { + update_templ_url_pstmt.setString(1, newTemplateUrl.get(hypervisorAndTemplateName.getKey())); + update_templ_url_pstmt.setString(2, newTemplateChecksum.get(hypervisorAndTemplateName.getKey())); + update_templ_url_pstmt.setString(3, hypervisorAndTemplateName.getKey().toString()); + update_templ_url_pstmt.executeUpdate(); + } catch (final SQLException e) { + LOG.error("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type " + + hypervisorAndTemplateName.getKey().toString() + ": " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type " + + hypervisorAndTemplateName.getKey().toString(), e); + } + } + } + } catch (final SQLException e) { + LOG.error("updateSystemVmTemplates:Exception while getting ids of templates: " + e.getMessage()); + throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting ids of templates", e); + } + } + LOG.debug("Updating System Vm Template IDs Complete"); + } + + @Override + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-41100to41110-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } +} diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade420to421.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade420to421.java index d8d0b32bd062..d7ba2ed20da3 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade420to421.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade420to421.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -27,7 +27,6 @@ import com.cloud.hypervisor.Hypervisor; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade420to421 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade420to421.class); @@ -48,17 +47,18 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-420to421.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-420to421.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-420to421.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade421to430.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade421to430.java index e8123640225a..55e7d3bdac22 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade421to430.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade421to430.java @@ -17,20 +17,17 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; -import java.sql.Types; -import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade421to430 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade421to430.class); @@ -51,18 +48,18 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-421to430.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-421to430.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-421to430.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override public void performDataMigration(Connection conn) { - encryptLdapConfigParams(conn); encryptImageStoreDetails(conn); upgradeMemoryOfSsvmOffering(conn); } @@ -94,77 +91,6 @@ private void upgradeMemoryOfSsvmOffering(Connection conn) { s_logger.debug("Done upgrading RAM for service offering of Secondary Storage VM to " + newRamSize); } - private void encryptLdapConfigParams(Connection conn) { - String[][] ldapParams = { {"ldap.user.object", "inetOrgPerson", "Sets the object type of users within LDAP"}, - {"ldap.username.attribute", "uid", "Sets the username attribute used within LDAP"}, {"ldap.email.attribute", "mail", "Sets the email attribute used within LDAP"}, - {"ldap.firstname.attribute", "givenname", "Sets the firstname attribute used within LDAP"}, - {"ldap.lastname.attribute", "sn", "Sets the lastname attribute used within LDAP"}, - {"ldap.group.object", "groupOfUniqueNames", "Sets the object type of groups within LDAP"}, - {"ldap.group.user.uniquemember", "uniquemember", "Sets the attribute for uniquemembers within a group"}}; - - String insertSql = "INSERT INTO `cloud`.`configuration`(category, instance, component, name, value, description) VALUES ('Secure', 'DEFAULT', 'management-server', ?, ?, " - + "?) ON DUPLICATE KEY UPDATE category='Secure';"; - - try (PreparedStatement pstmt_insert_ldap_parameters = conn.prepareStatement(insertSql);){ - for (String[] ldapParam : ldapParams) { - String name = ldapParam[0]; - String value = ldapParam[1]; - String desc = ldapParam[2]; - String encryptedValue = DBEncryptionUtil.encrypt(value); - pstmt_insert_ldap_parameters.setString(1, name); - pstmt_insert_ldap_parameters.setBytes(2, encryptedValue.getBytes("UTF-8")); - pstmt_insert_ldap_parameters.setString(3, desc); - pstmt_insert_ldap_parameters.executeUpdate(); - } - - /** - * if encrypted, decrypt the ldap hostname and port and then update as they are not encrypted now. - */ - try ( - PreparedStatement pstmt_ldap_hostname = conn.prepareStatement("SELECT conf.value FROM `cloud`.`configuration` conf WHERE conf.name='ldap.hostname'"); - ResultSet resultSet_ldap_hostname = pstmt_ldap_hostname.executeQuery(); - ) { - String hostname = null; - String port; - int portNumber = 0; - if (resultSet_ldap_hostname.next()) { - hostname = DBEncryptionUtil.decrypt(resultSet_ldap_hostname.getString(1)); - } - - try ( - PreparedStatement pstmt_ldap_port = conn.prepareStatement("SELECT conf.value FROM `cloud`.`configuration` conf WHERE conf.name='ldap.port'"); - ResultSet resultSet_ldap_port = pstmt_ldap_port.executeQuery(); - ) { - if (resultSet_ldap_port.next()) { - port = DBEncryptionUtil.decrypt(resultSet_ldap_port.getString(1)); - if (StringUtils.isNotBlank(port)) { - portNumber = Integer.parseInt(port); - } - } - - if (StringUtils.isNotBlank(hostname)) { - try (PreparedStatement pstmt_insert_ldap_hostname_port = conn.prepareStatement("INSERT INTO `cloud`.`ldap_configuration`(hostname, port) VALUES(?,?)");) { - pstmt_insert_ldap_hostname_port.setString(1, hostname); - if (portNumber != 0) { - pstmt_insert_ldap_hostname_port.setInt(2, portNumber); - } else { - pstmt_insert_ldap_hostname_port.setNull(2, Types.INTEGER); - } - pstmt_insert_ldap_hostname_port.executeUpdate(); - } - } - } - } - - } catch (SQLException e) { - throw new CloudRuntimeException("Unable to insert ldap configuration values ", e); - } catch (UnsupportedEncodingException e) { - throw new CloudRuntimeException("Unable to insert ldap configuration values ", e); - } - s_logger.debug("Done encrypting ldap Config values"); - - } - private void encryptImageStoreDetails(Connection conn) { s_logger.debug("Encrypting image store details"); try ( @@ -193,13 +119,14 @@ private void encryptImageStoreDetails(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-421to430-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-421to430-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-421to430-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java index 51494e7aff60..77070ae8f494 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade430to440.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -28,7 +28,6 @@ import com.cloud.network.Network; import com.cloud.network.Networks.BroadcastDomainType; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade430to440 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade430to440.class); @@ -49,13 +48,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-430to440.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-430to440.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-4310to440.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -228,12 +228,13 @@ private void updateVlanUris(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-430to440-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-430to440-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-430to440-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade440to441.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade440to441.java index 497da8d08d8c..a51f464a797f 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade440to441.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade440to441.java @@ -17,16 +17,12 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; -import org.apache.log4j.Logger; - import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade440to441 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade440to441.class); @Override public String[] getUpgradableVersionRange() { @@ -44,13 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-440to441.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-440to441.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-440to441.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -58,12 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-440to441-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-440to441-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-440to441-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade441to442.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade441to442.java index bd50dfb0a304..4234428f72b0 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade441to442.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade441to442.java @@ -17,16 +17,13 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; -import org.apache.log4j.Logger; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade441to442 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade441to442.class); @Override public String[] getUpgradableVersionRange() { @@ -44,13 +41,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-441to442.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-441to442.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-441to442.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -58,7 +56,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade442to450.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade442to450.java index a9fb08905be2..54e8da5f6e9e 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade442to450.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade442to450.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -32,7 +32,6 @@ import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade442to450 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade442to450.class); @@ -53,13 +52,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-442to450.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-442to450.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-442to450.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -138,13 +138,14 @@ private void upgradeMemoryOfInternalLoadBalancervmOffering(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-442to450-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-442to450-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-442to450-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } private void dropInvalidKeyFromStoragePoolTable(Connection conn) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to444.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to444.java index ded67d6495f7..b8110546a13c 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to444.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to444.java @@ -17,16 +17,12 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; -import org.apache.log4j.Logger; - import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade443to444 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade443to444.class); @Override public String[] getUpgradableVersionRange() { @@ -44,13 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-443to444.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-443to444.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-empty.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override @@ -58,7 +55,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to450.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to450.java index 983494894b9b..80b2c14e00c7 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to450.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade443to450.java @@ -17,12 +17,8 @@ package com.cloud.upgrade.dao; -import org.apache.log4j.Logger; - public class Upgrade443to450 extends Upgrade442to450 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade443to450.class); - @Override public String[] getUpgradableVersionRange() { return new String[] {"4.4.3", "4.5.0"}; diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade444to450.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade444to450.java index d872e528bfff..52fc7299810a 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade444to450.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade444to450.java @@ -17,12 +17,8 @@ package com.cloud.upgrade.dao; -import org.apache.log4j.Logger; - public class Upgrade444to450 extends Upgrade442to450 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade444to450.class); - @Override public String[] getUpgradableVersionRange() { return new String[] {"4.4.4", "4.5.0"}; diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade450to451.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade450to451.java index b49939fc7c71..71476e7dd635 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade450to451.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade450to451.java @@ -17,7 +17,7 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.io.UnsupportedEncodingException; import java.sql.Connection; import java.sql.PreparedStatement; @@ -31,7 +31,6 @@ import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade450to451 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade450to451.class); @@ -52,22 +51,25 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-450to451.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-450to451.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-450to451.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-450to451-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-450to451-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-450to451-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } @Override diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade451to452.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade451to452.java index 870e534fb7f4..788b6f28ef1e 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade451to452.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade451to452.java @@ -18,14 +18,11 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import org.apache.log4j.Logger; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade451to452 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade451to452.class); @Override public String[] getUpgradableVersionRange() { @@ -43,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-451to452.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-451to452.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-451to452.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -56,12 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-451to452-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-451to452-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-451to452-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to453.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to453.java index d1c4661607e3..3bc39ebc68fd 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to453.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to453.java @@ -18,14 +18,11 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import org.apache.log4j.Logger; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade452to453 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade452to453.class); @Override public String[] getUpgradableVersionRange() { @@ -43,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-452to453.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-452to453.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-452to453.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -56,12 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-452to453-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-452to453-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-452to453-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to460.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to460.java index 6b78a7ed611a..91fe345f4a12 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to460.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade452to460.java @@ -17,23 +17,17 @@ package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; -import java.util.Map; -import java.util.Set; import org.apache.log4j.Logger; -import com.cloud.hypervisor.Hypervisor; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade452to460 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade452to460.class); @@ -54,18 +48,18 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - final String script = Script.findScript("", "db/schema-452to460.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-452to460.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-452to460.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] { new File(script) }; + return new InputStream[] {script}; } @Override public void performDataMigration(final Connection conn) { - updateSystemVmTemplates(conn); updateVMInstanceUserId(conn); addIndexForVMInstance(conn); } @@ -162,182 +156,13 @@ private void addIndexForVMInstance(final Connection conn) { } @Override - public File[] getCleanupScripts() { - final String script = Script.findScript("", "db/schema-452to460-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-452to460-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-452to460-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] { new File(script) }; - } - - @SuppressWarnings("serial") - private void updateSystemVmTemplates(final Connection conn) { - s_logger.debug("Updating System Vm template IDs"); - // Get all hypervisors in use - final Set hypervisorsListInUse = new HashSet(); - try (PreparedStatement pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null"); ResultSet rs = pstmt.executeQuery()) { - while (rs.next()) { - switch (Hypervisor.HypervisorType.getType(rs.getString(1))) { - case XenServer: - hypervisorsListInUse.add(Hypervisor.HypervisorType.XenServer); - break; - case KVM: - hypervisorsListInUse.add(Hypervisor.HypervisorType.KVM); - break; - case VMware: - hypervisorsListInUse.add(Hypervisor.HypervisorType.VMware); - break; - case Hyperv: - hypervisorsListInUse.add(Hypervisor.HypervisorType.Hyperv); - break; - case LXC: - hypervisorsListInUse.add(Hypervisor.HypervisorType.LXC); - break; - case Ovm3: - hypervisorsListInUse.add(Hypervisor.HypervisorType.Ovm3); - break; - default: // no action on cases Any, BareMetal, None, Ovm, - // Parralels, Simulator and VirtualBox: - break; - } - } - } catch (final SQLException e) { - s_logger.error("updateSystemVmTemplates:Exception while getting hypervisor types from clusters: " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting hypervisor types from clusters", e); - } - - final Map NewTemplateNameList = new HashMap() { - { - put(Hypervisor.HypervisorType.XenServer, "systemvm-xenserver-4.6"); - put(Hypervisor.HypervisorType.VMware, "systemvm-vmware-4.6"); - put(Hypervisor.HypervisorType.KVM, "systemvm-kvm-4.6"); - put(Hypervisor.HypervisorType.LXC, "systemvm-lxc-4.6"); - put(Hypervisor.HypervisorType.Hyperv, "systemvm-hyperv-4.6"); - put(Hypervisor.HypervisorType.Ovm3, "systemvm-ovm3-4.6"); - } - }; - - final Map routerTemplateConfigurationNames = new HashMap() { - { - put(Hypervisor.HypervisorType.XenServer, "router.template.xenserver"); - put(Hypervisor.HypervisorType.VMware, "router.template.vmware"); - put(Hypervisor.HypervisorType.KVM, "router.template.kvm"); - put(Hypervisor.HypervisorType.LXC, "router.template.lxc"); - put(Hypervisor.HypervisorType.Hyperv, "router.template.hyperv"); - put(Hypervisor.HypervisorType.Ovm3, "router.template.ovm3"); - } - }; - - final Map newTemplateUrl = new HashMap() { - { - put(Hypervisor.HypervisorType.XenServer, "http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-xen.vhd.bz2"); - put(Hypervisor.HypervisorType.VMware, "http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-vmware.ova"); - put(Hypervisor.HypervisorType.KVM, "http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-kvm.qcow2.bz2"); - put(Hypervisor.HypervisorType.LXC, "http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-kvm.qcow2.bz2"); - put(Hypervisor.HypervisorType.Hyperv, "http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-hyperv.vhd.zip"); - put(Hypervisor.HypervisorType.Ovm3, "http://cloudstack.apt-get.eu/systemvm/4.6/systemvm64template-4.6.0-ovm.raw.bz2"); - } - }; - - final Map newTemplateChecksum = new HashMap() { - { - put(Hypervisor.HypervisorType.XenServer, "8886f554a499ec5405b6f203d9d36460"); - put(Hypervisor.HypervisorType.VMware, "4b415224fe00b258f66cad9fce9f73fc"); - put(Hypervisor.HypervisorType.KVM, "c059b0d051e0cd6fbe9d5d4fc40c7e5d"); - put(Hypervisor.HypervisorType.LXC, "c059b0d051e0cd6fbe9d5d4fc40c7e5d"); - put(Hypervisor.HypervisorType.Hyperv, "53e24bddfa56ea3139ed37af4b519013"); - put(Hypervisor.HypervisorType.Ovm3, "c8577d27b2daafb2d9a4ed307ce2f00f"); - } - }; - - for (final Map.Entry hypervisorAndTemplateName : NewTemplateNameList.entrySet()) { - s_logger.debug("Updating " + hypervisorAndTemplateName.getKey() + " System Vms"); - try (PreparedStatement pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = ? and removed is null order by id desc limit 1")) { - // Get 4.6.0 system Vm template Id for corresponding hypervisor - long templateId = -1; - pstmt.setString(1, hypervisorAndTemplateName.getValue()); - try (ResultSet rs = pstmt.executeQuery()) { - if (rs.next()) { - templateId = rs.getLong(1); - } - } catch (final SQLException e) { - s_logger.error("updateSystemVmTemplates:Exception while getting ids of templates: " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting ids of templates", e); - } - - // change template type to SYSTEM - if (templateId != -1) { - try (PreparedStatement templ_type_pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?");) { - templ_type_pstmt.setLong(1, templateId); - templ_type_pstmt.executeUpdate(); - } catch (final SQLException e) { - s_logger.error("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system': " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating template with id " + templateId + " to be marked as 'system'", e); - } - // update template ID of system Vms - try (PreparedStatement update_templ_id_pstmt = conn - .prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = ?");) { - update_templ_id_pstmt.setLong(1, templateId); - update_templ_id_pstmt.setString(2, hypervisorAndTemplateName.getKey().toString()); - update_templ_id_pstmt.executeUpdate(); - } catch (final Exception e) { - s_logger.error("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " + templateId - + ": " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting template for " + hypervisorAndTemplateName.getKey().toString() + " to " - + templateId, e); - } - - // Change value of global configuration parameter - // router.template.* for the corresponding hypervisor - try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) { - update_pstmt.setString(1, hypervisorAndTemplateName.getValue()); - update_pstmt.setString(2, routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey())); - update_pstmt.executeUpdate(); - } catch (final SQLException e) { - s_logger.error("updateSystemVmTemplates:Exception while setting " + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " - + hypervisorAndTemplateName.getValue() + ": " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting " - + routerTemplateConfigurationNames.get(hypervisorAndTemplateName.getKey()) + " to " + hypervisorAndTemplateName.getValue(), e); - } - - // Change value of global configuration parameter - // minreq.sysvmtemplate.version for the ACS version - try (PreparedStatement update_pstmt = conn.prepareStatement("UPDATE `cloud`.`configuration` SET value = ? WHERE name = ?");) { - update_pstmt.setString(1, getUpgradedVersion()); - update_pstmt.setString(2, "minreq.sysvmtemplate.version"); - update_pstmt.executeUpdate(); - } catch (final SQLException e) { - s_logger.error("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.6.0: " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while setting 'minreq.sysvmtemplate.version' to 4.6.0", e); - } - } else { - if (hypervisorsListInUse.contains(hypervisorAndTemplateName.getKey())) { - throw new CloudRuntimeException(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. Cannot upgrade system Vms"); - } else { - s_logger.warn(getUpgradedVersion() + hypervisorAndTemplateName.getKey() + " SystemVm template not found. " + hypervisorAndTemplateName.getKey() - + " hypervisor is not used, so not failing upgrade"); - // Update the latest template URLs for corresponding - // hypervisor - try (PreparedStatement update_templ_url_pstmt = conn - .prepareStatement("UPDATE `cloud`.`vm_template` SET url = ? , checksum = ? WHERE hypervisor_type = ? AND type = 'SYSTEM' AND removed is null order by id desc limit 1");) { - update_templ_url_pstmt.setString(1, newTemplateUrl.get(hypervisorAndTemplateName.getKey())); - update_templ_url_pstmt.setString(2, newTemplateChecksum.get(hypervisorAndTemplateName.getKey())); - update_templ_url_pstmt.setString(3, hypervisorAndTemplateName.getKey().toString()); - update_templ_url_pstmt.executeUpdate(); - } catch (final SQLException e) { - s_logger.error("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type " - + hypervisorAndTemplateName.getKey().toString() + ": " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while updating 'url' and 'checksum' for hypervisor type " - + hypervisorAndTemplateName.getKey().toString(), e); - } - } - } - } catch (final SQLException e) { - s_logger.error("updateSystemVmTemplates:Exception while getting ids of templates: " + e.getMessage()); - throw new CloudRuntimeException("updateSystemVmTemplates:Exception while getting ids of templates", e); - } - } - s_logger.debug("Updating System Vm Template IDs Complete"); + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade453to460.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade453to460.java index 504cc7336c25..2dd4b0aad27b 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade453to460.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade453to460.java @@ -17,10 +17,7 @@ package com.cloud.upgrade.dao; -import org.apache.log4j.Logger; - public class Upgrade453to460 extends Upgrade452to460 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade453to460.class); @Override public String[] getUpgradableVersionRange() { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade460to461.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade460to461.java index 9011c2ed10d8..88bda4616c80 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade460to461.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade460to461.java @@ -18,14 +18,11 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import org.apache.log4j.Logger; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade460to461 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade460to461.class); @Override public String[] getUpgradableVersionRange() { @@ -43,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-460to461.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-460to461.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-460to461.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -56,12 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-460to461-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-460to461-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-460to461-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade461to470.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade461to470.java index 8dbbdb2e9ec8..e7922cebf0ac 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade461to470.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade461to470.java @@ -18,10 +18,9 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; import org.apache.log4j.Logger; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException; @@ -45,12 +44,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-461to470.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-461to470.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-461to470.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } public void alterAddColumnToCloudUsage(final Connection conn) { @@ -73,12 +74,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-461to470-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-461to470-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-461to470-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade470to471.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade470to471.java index d2a2e202a415..08cdfdd53f55 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade470to471.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade470to471.java @@ -18,14 +18,11 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import org.apache.log4j.Logger; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade470to471 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade470to471.class); @Override public String[] getUpgradableVersionRange() { @@ -43,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-470to471.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-470to471.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-470to471.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -56,12 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-470to471-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-470to471-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-470to471-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade471to480.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade471to480.java index bde4c0ff24e6..3b3a0bba03ec 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade471to480.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade471to480.java @@ -18,14 +18,11 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import org.apache.log4j.Logger; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade471to480 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade471to480.class); @Override public String[] getUpgradableVersionRange() { @@ -43,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-471to480.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-471to480.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-471to480.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -56,12 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-471to480-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-471to480-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-471to480-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade480to481.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade480to481.java index 26e7d125ec84..be33709dd921 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade480to481.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade480to481.java @@ -18,14 +18,11 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import org.apache.log4j.Logger; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade480to481 implements DbUpgrade { - final static Logger s_logger = Logger.getLogger(Upgrade480to481.class); @Override public String[] getUpgradableVersionRange() { @@ -43,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-480to481.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-480to481.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-480to481.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -56,12 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-480to481-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-480to481-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-480to481-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade481to490.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade481to490.java index 29e6534105bc..1f9fb2f3f9f7 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade481to490.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade481to490.java @@ -17,9 +17,9 @@ package com.cloud.upgrade.dao; -import java.io.File; -import java.io.FileReader; import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; @@ -30,7 +30,6 @@ import com.cloud.utils.db.ScriptRunner; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class Upgrade481to490 implements DbUpgrade { final static Logger s_logger = Logger.getLogger(Upgrade481to490.class); @@ -51,12 +50,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-481to490.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-481to490.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-481to490.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -117,12 +118,13 @@ private void setupRolesAndPermissionsForDynamicChecker(final Connection conn) { if (s_logger.isDebugEnabled()) { s_logger.debug("Configuring default role-api mappings, use migrate-dynamicroles.py instead if you want to migrate rules from an existing commands.properties file"); } - String script = Script.findScript("", "db/create-default-role-api-mappings.sql"); + final String scriptFile = "META-INF/db/create-default-role-api-mappings.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { s_logger.error("Unable to find default role-api mapping sql file, please configure api per role manually"); return; } - try(final FileReader reader = new FileReader(new File(script))) { + try(final InputStreamReader reader = new InputStreamReader(script)) { ScriptRunner runner = new ScriptRunner(conn, false, true); runner.runScript(reader); } catch (SQLException | IOException e) { @@ -131,11 +133,13 @@ private void setupRolesAndPermissionsForDynamicChecker(final Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-481to490-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-481to490-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-481to490-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade490to4910.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade490to4910.java index 01e4b13d4328..8757d7fa5395 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade490to4910.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade490to4910.java @@ -18,9 +18,8 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade490to4910 implements DbUpgrade { @@ -41,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-490to4910.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-490to4910.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-490to4910.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -54,11 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-490to4910-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-490to4910-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-490to4910-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade4910to4920.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade4910to4920.java index 46584539e1e5..1950c8f28b88 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade4910to4920.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade4910to4920.java @@ -18,9 +18,8 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade4910to4920 implements DbUpgrade { @@ -41,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-4910to4920.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-4910to4920.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-4910to4920.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -54,11 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-4910to4920-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-4910to4920-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-4910to4920-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade4920to4930.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade4920to4930.java index 3c82254e338f..bc02c95064c8 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade4920to4930.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade4920to4930.java @@ -18,9 +18,8 @@ package com.cloud.upgrade.dao; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; public class Upgrade4920to4930 implements DbUpgrade { @@ -41,12 +40,14 @@ public boolean supportsRollingUpgrade() { } @Override - public File[] getPrepareScripts() { - String script = Script.findScript("", "db/schema-4920to4930.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-4920to4930.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-4920to4930.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } @Override @@ -54,11 +55,13 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { - String script = Script.findScript("", "db/schema-4920to4930-cleanup.sql"); + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-4920to4930-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); if (script == null) { - throw new CloudRuntimeException("Unable to find db/schema-4920to4930-cleanup.sql"); + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(script)}; + + return new InputStream[] {script}; } } diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade4930to41000.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade4930to41000.java new file mode 100644 index 000000000000..46abd44aa6a0 --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade4930to41000.java @@ -0,0 +1,337 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.upgrade.dao; + +import java.io.InputStream; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.HashMap; + +import org.apache.log4j.Logger; + +import com.cloud.utils.exception.CloudRuntimeException; + +public class Upgrade4930to41000 implements DbUpgrade { + final static Logger s_logger = Logger.getLogger(Upgrade4930to41000.class); + + public static class MemoryValues { + long max; + long min; + + public MemoryValues(final long min, final long max) { + this.min = min * 1024 * 1024; + this.max = max * 1024 * 1024; + } + + public long getMax() { + return max; + } + + public long getMin() { + return min; + } + } + + @Override + public String[] getUpgradableVersionRange() { + return new String[] {"4.9.3.0", "4.10.0.0"}; + } + + @Override + public String getUpgradedVersion() { + return "4.10.0.0"; + } + + @Override + public boolean supportsRollingUpgrade() { + return false; + } + + @Override + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-4930to41000.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } + + @Override + public void performDataMigration(Connection conn) { + populateGuestOsDetails(conn); + updateSourceCidrs(conn); + } + + @Override + public InputStream[] getCleanupScripts() { + final String scriptFile = "META-INF/db/schema-4930to41000-cleanup.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); + } + + return new InputStream[] {script}; + } + + private void populateGuestOsDetails(Connection conn){ + final HashMap xenServerGuestOsMemoryMap = new HashMap(70); + + xenServerGuestOsMemoryMap.put("CentOS 4.5 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 4.6 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 4.7 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 4.8 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.0 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.0 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.1 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.1 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.2 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.2 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.3 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.3 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.4 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.4 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.5 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.5 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.6 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.6 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.7 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.7 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.8 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.8 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.9 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.9 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.10 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 5.10 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.0 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.0 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.1 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.1 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.2 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.3 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.3 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.4 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.4 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.5 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.5 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.6 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.6 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.7 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 6.7 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 7", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 7.1 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 7.2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CentOS 7.3 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.0 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.0 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.1 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.1 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.2 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.3 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.3 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.4 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.4 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.5 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.5 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.6 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.6 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.7 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.7 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.8 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.8 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.9 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.9 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.10 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 5.10 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.0 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.0 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.1 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.1 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.2 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.3 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.3 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.4 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.4 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.5 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Oracle Enterprise Linux 6.5 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 4.5 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 4.6 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 4.7 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 4.8 (32-bit)", new MemoryValues(256l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.0 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.0 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.1 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.1 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.2 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.2 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.3 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.3 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.4 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.4 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.5 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.5 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.6 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.6 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.7 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.7 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.8 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.8 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.9 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.9 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.10 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 5.10 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.0 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.0 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.1 (32-bit)", new MemoryValues(512l, 8 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.1 (64-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.2 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.3 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.3 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.4 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.4 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.5 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.5 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.6 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.6 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.7 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 6.7 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 7", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 7.1", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Red Hat Enterprise Linux 7.2", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 5.0 (64-bit)", new MemoryValues(128l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 5(64-bit)", new MemoryValues(128l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 6(32-bit)", new MemoryValues(128l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 6(64-bit)", new MemoryValues(128l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 7(32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 7(64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 8(32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Debian GNU/Linux 8(64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10(32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10(64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP1 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP1 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP2 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP3 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP3 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP4 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP4 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP1 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP1 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP2 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP3 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP3 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 12 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("SUSE Linux Enterprise Server 12 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows 7 (32-bit)", new MemoryValues(1024l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows 7 (64-bit)", new MemoryValues(2 * 1024l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows 8 (32-bit)", new MemoryValues(1024l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows 8 (64-bit)", new MemoryValues(2 * 1024l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2003 Enterprise Edition(32-bit)", new MemoryValues(256l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2003 Enterprise Edition(64-bit)", new MemoryValues(256l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2003 SP2 (32-bit)", new MemoryValues(256l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2003 SP2 (64-bit)", new MemoryValues(256l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2008 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2008 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2008 SP2 (32-bit)", new MemoryValues(512l, 64 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2008 SP2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2008 R2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2008 R2 SP1 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2012 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Server 2012 R2 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Vista (32-bit)", new MemoryValues(1024l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Vista (64-bit)", new MemoryValues(1024l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows Vista SP2 (32-bit)", new MemoryValues(1024l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows XP (32-bit)", new MemoryValues(256l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows XP (64-bit)", new MemoryValues(256l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Windows XP SP3 (32-bit)", new MemoryValues(256l, 4 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 10.04 (32-bit)", new MemoryValues(128l, 512l)); + xenServerGuestOsMemoryMap.put("Ubuntu 10.04 (64-bit)", new MemoryValues(128l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 10.10 (32-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 10.10 (64-bit)", new MemoryValues(512l, 16 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 12.04 (32-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 12.04 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 14.04 (32-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 14.04 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 16.04 (32-bit)", new MemoryValues(512l, 32 * 1024l)); + xenServerGuestOsMemoryMap.put("Ubuntu 16.04 (64-bit)", new MemoryValues(512l, 128 * 1024l)); + xenServerGuestOsMemoryMap.put("CoreOS", new MemoryValues(512l, 128 * 1024l)); + + final String insertDynamicMemoryVal = "insert into guest_os_details(guest_os_id, name, value, display) select id,?, ?, 0 from guest_os where display_name = ?"; + + + PreparedStatement ps = null; + try{ + ps = conn.prepareStatement(insertDynamicMemoryVal); + + for (String key: xenServerGuestOsMemoryMap.keySet()){ + ps.setString(1,"xenserver.dynamicMin"); + ps.setString(2,String.valueOf(xenServerGuestOsMemoryMap.get(key).getMin())); + ps.setString(3, key); + ps.executeUpdate(); + + ps.setString(1,"xenserver.dynamicMax"); + ps.setString(2,String.valueOf(xenServerGuestOsMemoryMap.get(key).getMax())); + ps.setString(3, key); + ps.executeUpdate(); + } + + + }catch(SQLException e){ + throw new CloudRuntimeException("Unable to update guestOs details", e); + }finally { + try { + if (ps != null && !ps.isClosed()) { + ps.close(); + } + } catch (SQLException e) { + } + } + + } + + private void updateSourceCidrs(Connection conn){ + //with ipset the value for source cidr 0.0.0.0/0 can't be added in ipset. So changing it to network cidr. + try(PreparedStatement pstmt = conn.prepareStatement("UPDATE `cloud`.`firewall_rules_cidrs` AS s, (SELECT IFNULL(networks.network_cidr,networks.cidr) cidr," + + "`firewall_rules_cidrs`.`id`, `firewall_rules`.`traffic_type` "+ + "FROM `cloud`.`networks`, `cloud`.`firewall_rules`,`cloud`.`firewall_rules_cidrs` WHERE `cloud`.`networks`.`id`=`cloud`.`firewall_rules`.`network_id` " + + "AND `cloud`.`firewall_rules`.`id` = `cloud`.`firewall_rules_cidrs`.`firewall_rule_id`) AS p " + + "SET `s`.`source_cidr` = `p`.`cidr` WHERE `s`.`source_cidr`=\"0.0.0.0/0\" AND `s`.`id`=`p`.`id` AND `p`.`traffic_type`=\"Egress\" ;")){ + pstmt.execute(); + }catch (SQLException e) { + throw new CloudRuntimeException("updateSourceCidrs:Exception:" + e.getMessage(), e); + } + } +} diff --git a/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java b/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java index 802521c42d56..3e39f81f761c 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java +++ b/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot217to224.java @@ -16,22 +16,22 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class UpgradeSnapshot217to224 implements DbUpgrade { @Override - public File[] getPrepareScripts() { - String file = Script.findScript("", "db/schema-snapshot-217to224.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-snapshot-217to224.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-snapshot-217to224.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override @@ -39,7 +39,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java b/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java index 85f845b489a2..8e546e7dd4d5 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java +++ b/engine/schema/src/com/cloud/upgrade/dao/UpgradeSnapshot223to224.java @@ -16,22 +16,22 @@ // under the License. package com.cloud.upgrade.dao; -import java.io.File; +import java.io.InputStream; import java.sql.Connection; import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.script.Script; public class UpgradeSnapshot223to224 implements DbUpgrade { @Override - public File[] getPrepareScripts() { - String file = Script.findScript("", "db/schema-snapshot-223to224.sql"); - if (file == null) { - throw new CloudRuntimeException("Unable to find the upgrade script, schema-snapshot-223to224.sql"); + public InputStream[] getPrepareScripts() { + final String scriptFile = "META-INF/db/schema-snapshot-223to224.sql"; + final InputStream script = Thread.currentThread().getContextClassLoader().getResourceAsStream(scriptFile); + if (script == null) { + throw new CloudRuntimeException("Unable to find " + scriptFile); } - return new File[] {new File(file)}; + return new InputStream[] {script}; } @Override @@ -39,7 +39,7 @@ public void performDataMigration(Connection conn) { } @Override - public File[] getCleanupScripts() { + public InputStream[] getCleanupScripts() { return null; } diff --git a/engine/schema/src/com/cloud/usage/UsageSnapshotOnPrimaryVO.java b/engine/schema/src/com/cloud/usage/UsageSnapshotOnPrimaryVO.java new file mode 100644 index 000000000000..74f944b9eceb --- /dev/null +++ b/engine/schema/src/com/cloud/usage/UsageSnapshotOnPrimaryVO.java @@ -0,0 +1,145 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.usage; + +import java.util.Date; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; + +import org.apache.cloudstack.api.InternalIdentity; + +@Entity +@Table(name = "usage_snapshot_on_primary") +public class UsageSnapshotOnPrimaryVO implements InternalIdentity { + + @Column(name = "id") + // volumeId + private long id; + + @Column(name = "zone_id") + private long zoneId; + + @Column(name = "account_id") + private long accountId; + + @Column(name = "domain_id") + private long domainId; + + @Column(name = "vm_id") + private long vmId; + + @Column(name = "name") + private String name; + + @Column(name = "type") + private int snapshotType; + + @Column(name = "physicalsize") + private long physicalSize; + + @Column(name = "created") + @Temporal(value = TemporalType.TIMESTAMP) + private Date created = null; + + @Column(name = "deleted") + @Temporal(value = TemporalType.TIMESTAMP) + private Date deleted; + + @Column(name = "virtualsize") + private Long virtualSize; + + protected UsageSnapshotOnPrimaryVO() { + } + + public UsageSnapshotOnPrimaryVO(long id, long zoneId, long accountId, long domainId, long vmId, String name, int type, long virtualSize, long physicalSize, Date created, Date deleted) { + this.id = id; + this.zoneId = zoneId; + this.accountId = accountId; + this.domainId = domainId; + this.snapshotType = type; + this.physicalSize = physicalSize; + this.virtualSize = virtualSize; + this.created = created; + this.vmId = vmId; + this.name = name; + this.deleted = deleted; + } + + public long getZoneId() { + return zoneId; + } + + public long getAccountId() { + return accountId; + } + + public long getDomainId() { + return domainId; + } + + public int getSnapshotType() { + return snapshotType; + } + + public long getPhysicalSize() { + return physicalSize; + } + + public Long getVirtualSize() { + return virtualSize; + } + + public Date getDeleted() { + return deleted; + } + + public void setDeleted(Date deleted) { + this.deleted = deleted; + } + + public Date getCreated() { + return created; + } + + public void setCreated(Date created) { + this.created = created; + } + + public long getVmId() { + return vmId; + } + + public String getName() { + return name; + } + + @Override + public long getId() { + return this.id; + } + + @Override + public String toString() { + return "UsageSnapshotOnPrimaryVO [id=" + id + ", zoneId=" + zoneId + ", accountId=" + accountId + ", domainId=" + domainId + ", vmId=" + vmId + ", name=" + name + + ", snapshotType=" + snapshotType + ", physicalSize=" + physicalSize + ", created=" + created + ", deleted=" + deleted + ", virtualSize=" + virtualSize + "]"; + } + +} diff --git a/engine/schema/src/com/cloud/usage/UsageVMSnapshotVO.java b/engine/schema/src/com/cloud/usage/UsageVMSnapshotVO.java index 1266d638fe65..05a1b29c6f3d 100644 --- a/engine/schema/src/com/cloud/usage/UsageVMSnapshotVO.java +++ b/engine/schema/src/com/cloud/usage/UsageVMSnapshotVO.java @@ -120,4 +120,10 @@ public long getId() { return this.id; } + @Override + public String toString() { + return "UsageVMSnapshotVO [id=" + id + ", zoneId=" + zoneId + ", accountId=" + accountId + ", domainId=" + domainId + ", vmId=" + vmId + ", diskOfferingId=" + + diskOfferingId + ", size=" + size + ", created=" + created + ", processed=" + processed + "]"; + } + } diff --git a/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java index 45337b22e137..ad8ce59dba72 100644 --- a/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java +++ b/engine/schema/src/com/cloud/usage/dao/UsageStorageDaoImpl.java @@ -66,6 +66,7 @@ public UsageStorageDaoImpl() { IdZoneSearch.and("id", IdZoneSearch.entity().getId(), SearchCriteria.Op.EQ); IdZoneSearch.and("type", IdZoneSearch.entity().getStorageType(), SearchCriteria.Op.EQ); IdZoneSearch.and("dcId", IdZoneSearch.entity().getZoneId(), SearchCriteria.Op.EQ); + IdZoneSearch.and("deleted", IdZoneSearch.entity().getDeleted(), SearchCriteria.Op.NULL); IdZoneSearch.done(); } @@ -85,6 +86,7 @@ public List listByIdAndZone(long accountId, long id, int type, l sc.setParameters("id", id); sc.setParameters("type", type); sc.setParameters("dcId", dcId); + sc.setParameters("deleted", null); return listBy(sc, null); } diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotOnPrimaryDao.java b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotOnPrimaryDao.java new file mode 100644 index 000000000000..09d6e00cf9a0 --- /dev/null +++ b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotOnPrimaryDao.java @@ -0,0 +1,31 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.usage.dao; + +import java.util.Date; +import java.util.List; + +import com.cloud.usage.UsageSnapshotOnPrimaryVO; +import com.cloud.utils.db.GenericDao; + +public interface UsageVMSnapshotOnPrimaryDao extends GenericDao { + + public void updateDeleted(UsageSnapshotOnPrimaryVO usage); + + public List getUsageRecords(Long accountId, Long domainId, Date startDate, Date endDate); + +} diff --git a/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotOnPrimaryDaoImpl.java b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotOnPrimaryDaoImpl.java new file mode 100644 index 000000000000..59269387008a --- /dev/null +++ b/engine/schema/src/com/cloud/usage/dao/UsageVMSnapshotOnPrimaryDaoImpl.java @@ -0,0 +1,117 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.usage.dao; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; +import java.util.TimeZone; + + +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import com.cloud.usage.UsageSnapshotOnPrimaryVO; +import com.cloud.utils.DateUtil; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.TransactionLegacy; + +@Component +public class UsageVMSnapshotOnPrimaryDaoImpl extends GenericDaoBase implements UsageVMSnapshotOnPrimaryDao { + public static final Logger s_logger = Logger.getLogger(UsageVMSnapshotOnPrimaryDaoImpl.class.getName()); + protected static final String GET_USAGE_RECORDS_BY_ACCOUNT = "SELECT id, zone_id, account_id, domain_id, vm_id, name, type, physicalsize, virtualsize, created, deleted " + + " FROM usage_snapshot_on_primary" + " WHERE account_id = ? " + " AND ( (created < ? AND deleted is NULL)" + + " OR ( deleted BETWEEN ? AND ?)) ORDER BY created asc"; + protected static final String UPDATE_DELETED = "UPDATE usage_snapshot_on_primary SET deleted = ? WHERE account_id = ? AND id = ? and vm_id = ? and created = ?"; + + @Override + public void updateDeleted(UsageSnapshotOnPrimaryVO usage) { + TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB); + PreparedStatement pstmt = null; + try { + txn.start(); + pstmt = txn.prepareAutoCloseStatement(UPDATE_DELETED); + pstmt.setString(1, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), usage.getDeleted())); + pstmt.setLong(2, usage.getAccountId()); + pstmt.setLong(3, usage.getId()); + pstmt.setLong(4, usage.getVmId()); + pstmt.setString(5, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), usage.getCreated())); + pstmt.executeUpdate(); + txn.commit(); + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Error updating UsageSnapshotOnPrimaryVO", e); + } finally { + txn.close(); + } + } + + @Override + public List getUsageRecords(Long accountId, Long domainId, Date startDate, Date endDate) { + List usageRecords = new ArrayList(); + + String sql = GET_USAGE_RECORDS_BY_ACCOUNT; + TransactionLegacy txn = TransactionLegacy.open(TransactionLegacy.USAGE_DB); + PreparedStatement pstmt = null; + + try { + int i = 1; + pstmt = txn.prepareAutoCloseStatement(sql); + pstmt.setLong(i++, accountId); + pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), endDate)); + pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), startDate)); + pstmt.setString(i++, DateUtil.getDateDisplayString(TimeZone.getTimeZone("GMT"), endDate)); + s_logger.debug("GET_USAGE_RECORDS_BY_ACCOUNT " + pstmt); + ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + //id, zone_id, account_id, domain_iVMSnapshotVOd, vm_id, disk_offering_id, size, created, deleted + Long vId = Long.valueOf(rs.getLong(1)); + Long zoneId = Long.valueOf(rs.getLong(2)); + Long acctId = Long.valueOf(rs.getLong(3)); + Long dId = Long.valueOf(rs.getLong(4)); + Long vmId = Long.valueOf(rs.getLong(5)); + String name = String.valueOf(rs.getString(6)); + Integer type = Integer.valueOf(rs.getInt(7)); + Long physicalSize = Long.valueOf(rs.getLong(8)); + Long virtaulSize = Long.valueOf(rs.getLong(9)); + Date createdDate = null; + Date deleteDate = null; + String createdTS = rs.getString(10); + String deleted = rs.getString(11); + + if (createdTS != null) { + createdDate = DateUtil.parseDateString(s_gmtTimeZone, createdTS); + } + if (deleted != null) { + deleteDate = DateUtil.parseDateString(s_gmtTimeZone, deleted); + } + usageRecords.add(new UsageSnapshotOnPrimaryVO(vId, zoneId, acctId, dId, vmId, name, type, virtaulSize, physicalSize, createdDate, deleteDate)); + } + } catch (Exception e) { + txn.rollback(); + s_logger.warn("Error getting usage records", e); + } finally { + txn.close(); + } + + return usageRecords; + } + +} diff --git a/engine/schema/src/com/cloud/user/UserAccountVO.java b/engine/schema/src/com/cloud/user/UserAccountVO.java index 5ce0eb79d665..2ad2ae07f01b 100644 --- a/engine/schema/src/com/cloud/user/UserAccountVO.java +++ b/engine/schema/src/com/cloud/user/UserAccountVO.java @@ -33,6 +33,7 @@ import com.cloud.utils.db.Encrypt; import com.cloud.utils.db.GenericDao; +import com.google.common.base.Strings; @Entity @Table(name = "user") @@ -257,6 +258,9 @@ public void setAccountState(String accountState) { @Override public String getTimezone() { + if (Strings.isNullOrEmpty(timezone)) { + return "UTC"; + } return timezone; } diff --git a/engine/schema/src/com/cloud/user/UserVO.java b/engine/schema/src/com/cloud/user/UserVO.java index da7811ecc5b6..05655bf711e9 100644 --- a/engine/schema/src/com/cloud/user/UserVO.java +++ b/engine/schema/src/com/cloud/user/UserVO.java @@ -34,6 +34,7 @@ import com.cloud.user.Account.State; import com.cloud.utils.db.Encrypt; import com.cloud.utils.db.GenericDao; +import com.google.common.base.Strings; /** * A bean representing a user @@ -126,7 +127,25 @@ public UserVO(long accountId, String username, String password, String firstName this.source = source; } - @Override + public UserVO(UserVO user) { + this.setAccountId(user.getAccountId()); + this.setUsername(user.getUsername()); + this.setPassword(user.getPassword()); + this.setFirstname(user.getFirstname()); + this.setLastname(user.getLastname()); + this.setEmail(user.getEmail()); + this.setTimezone(user.getTimezone()); + this.setUuid(user.getUuid()); + this.setSource(user.getSource()); + this.setApiKey(user.getApiKey()); + this.setSecretKey(user.getSecretKey()); + this.setExternalEntity(user.getExternalEntity()); + this.setRegistered(user.isRegistered()); + this.setRegistrationToken(user.getRegistrationToken()); + this.setState(user.getState()); + } + + @Override public long getId() { return id; } @@ -233,6 +252,9 @@ public void setSecretKey(String secretKey) { @Override public String getTimezone() { + if (Strings.isNullOrEmpty(timezone)) { + return "UTC"; + } return timezone; } diff --git a/engine/schema/src/com/cloud/user/dao/AccountDao.java b/engine/schema/src/com/cloud/user/dao/AccountDao.java index 374c9cc43d6d..b97f318fd28a 100644 --- a/engine/schema/src/com/cloud/user/dao/AccountDao.java +++ b/engine/schema/src/com/cloud/user/dao/AccountDao.java @@ -16,9 +16,6 @@ // under the License. package com.cloud.user.dao; -import java.util.Date; -import java.util.List; - import com.cloud.user.Account; import com.cloud.user.AccountVO; import com.cloud.user.User; @@ -26,6 +23,9 @@ import com.cloud.utils.db.Filter; import com.cloud.utils.db.GenericDao; +import java.util.Date; +import java.util.List; + public interface AccountDao extends GenericDao { Pair findUserAccountByApiKey(String apiKey); @@ -62,6 +62,8 @@ public interface AccountDao extends GenericDao { //returns only non-removed account Account findActiveAccount(String accountName, Long domainId); + Account findActiveAccountById(Long accountId, Long domainId); + Account findActiveNonProjectAccount(String accountName, Long domainId); List getAccountIdsForDomains(List ids); diff --git a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java index 27891503dc8b..956f8a8282eb 100644 --- a/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java +++ b/engine/schema/src/com/cloud/user/dao/AccountDaoImpl.java @@ -16,15 +16,6 @@ // under the License. package com.cloud.user.dao; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.util.Date; -import java.util.List; - - -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - import com.cloud.user.Account; import com.cloud.user.Account.State; import com.cloud.user.AccountVO; @@ -39,6 +30,13 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.TransactionLegacy; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.util.Date; +import java.util.List; @Component public class AccountDaoImpl extends GenericDaoBase implements AccountDao { @@ -188,6 +186,13 @@ public Account findActiveAccount(String accountName, Long domainId) { return findOneBy(sc); } + @Override + public Account findActiveAccountById(Long accountId, Long domainId) { + SearchCriteria sc = AllFieldsSearch.create("id", accountId); + sc.setParameters("domainId", domainId); + return findOneBy(sc); + } + @Override public Account findActiveNonProjectAccount(String accountName, Long domainId) { SearchCriteria sc = NonProjectAccountSearch.create("accountName", accountName); diff --git a/engine/schema/src/com/cloud/vm/DomainRouterVO.java b/engine/schema/src/com/cloud/vm/DomainRouterVO.java index 2596d24a5fb5..2a7aa49b6ed4 100644 --- a/engine/schema/src/com/cloud/vm/DomainRouterVO.java +++ b/engine/schema/src/com/cloud/vm/DomainRouterVO.java @@ -69,6 +69,11 @@ public class DomainRouterVO extends VMInstanceVO implements VirtualRouter { @Column(name = "vpc_id") private Long vpcId; + + @Column(name= "update_state") + @Enumerated(EnumType.STRING) + private UpdateState updateState; + public DomainRouterVO(final long id, final long serviceOfferingId, final long elementId, final String name, final long templateId, final HypervisorType hypervisorType, final long guestOSId, final long domainId, final long accountId, final long userId, final boolean isRedundantRouter, final RedundantState redundantState, final boolean haEnabled, final boolean stopPending, final Long vpcId) { @@ -193,4 +198,13 @@ public Long getVpcId() { return vpcId; } + public UpdateState getUpdateState() { + return updateState; + } + + public void setUpdateState(UpdateState updateState) { + this.updateState = updateState; + } + + } diff --git a/engine/schema/src/com/cloud/vm/NicExtraDhcpOptionVO.java b/engine/schema/src/com/cloud/vm/NicExtraDhcpOptionVO.java new file mode 100644 index 000000000000..7b6d28fb5ffc --- /dev/null +++ b/engine/schema/src/com/cloud/vm/NicExtraDhcpOptionVO.java @@ -0,0 +1,82 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.vm; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.UUID; + +@Entity +@Table(name = "nic_extra_dhcp_options") +public class NicExtraDhcpOptionVO implements NicExtraDhcpOption { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "uuid") + String uuid = UUID.randomUUID().toString(); + + @Column(name = "nic_id") + private long nicId; + + @Column(name="code") + private int code; + + @Column(name = "value") + private String value; + + public NicExtraDhcpOptionVO (){ + + } + + public NicExtraDhcpOptionVO (long nicId, int code, String value) { + this.nicId = nicId; + this.code = code; + this.value = value; + } + + @Override + public long getNicId() { + return nicId; + } + + @Override + public int getCode() { + return code; + } + + @Override + public String getValue() { + return value; + } + + @Override + public String getUuid() { + return uuid; + } + + @Override + public long getId() { + return id; + } +} diff --git a/engine/schema/src/com/cloud/vm/UserVmCloneSettingVO.java b/engine/schema/src/com/cloud/vm/UserVmCloneSettingVO.java index 91b4918625d8..adca686db57c 100644 --- a/engine/schema/src/com/cloud/vm/UserVmCloneSettingVO.java +++ b/engine/schema/src/com/cloud/vm/UserVmCloneSettingVO.java @@ -46,4 +46,8 @@ public long getVmId() { public String getCloneType() { return this.cloneType; } + + public void setCloneType(String cloneType) { + this.cloneType = cloneType; + } } diff --git a/engine/schema/src/com/cloud/vm/UserVmDetailVO.java b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java old mode 100644 new mode 100755 index 2b169a382727..81bb6dd9d4f3 --- a/engine/schema/src/com/cloud/vm/UserVmDetailVO.java +++ b/engine/schema/src/com/cloud/vm/UserVmDetailVO.java @@ -80,4 +80,11 @@ public boolean isDisplay() { return display; } + public void setName(String name) { + this.name = name; + } + + public void setValue(String value) { + this.value = value; + } } diff --git a/engine/schema/src/com/cloud/vm/VMInstanceVO.java b/engine/schema/src/com/cloud/vm/VMInstanceVO.java index d4b18d078e49..b0ebf2406f57 100644 --- a/engine/schema/src/com/cloud/vm/VMInstanceVO.java +++ b/engine/schema/src/com/cloud/vm/VMInstanceVO.java @@ -16,11 +16,14 @@ // under the License. package com.cloud.vm; -import java.security.NoSuchAlgorithmException; -import java.security.SecureRandom; -import java.util.Date; -import java.util.Map; -import java.util.UUID; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.utils.db.Encrypt; +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.db.StateMachine; +import com.cloud.utils.fsm.FiniteStateObject; +import com.cloud.vm.VirtualMachine.State; +import org.apache.commons.codec.binary.Base64; +import org.apache.log4j.Logger; import javax.persistence.Column; import javax.persistence.DiscriminatorColumn; @@ -36,16 +39,11 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import javax.persistence.Transient; - -import org.apache.commons.codec.binary.Base64; -import org.apache.log4j.Logger; - -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.utils.db.Encrypt; -import com.cloud.utils.db.GenericDao; -import com.cloud.utils.db.StateMachine; -import com.cloud.utils.fsm.FiniteStateObject; -import com.cloud.vm.VirtualMachine.State; +import java.security.NoSuchAlgorithmException; +import java.security.SecureRandom; +import java.util.Date; +import java.util.Map; +import java.util.UUID; @Entity @Table(name = "vm_instance") @@ -269,6 +267,10 @@ public HypervisorType getHypervisorType() { return hypervisorType; } + public void setHypervisorType(HypervisorType hypervisorType) { + this.hypervisorType = hypervisorType; + } + @Override public Date getCreated() { return created; @@ -566,4 +568,9 @@ public Long getPowerHostId() { public void setPowerHostId(Long hostId) { powerHostId = hostId; } + + @Override + public PartitionType partitionType() { + return PartitionType.VM; + } } diff --git a/engine/schema/src/com/cloud/vm/dao/NicDao.java b/engine/schema/src/com/cloud/vm/dao/NicDao.java index 2c7895a5a557..0d86964974a5 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDao.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDao.java @@ -44,6 +44,8 @@ public interface NicDao extends GenericDao { NicVO findByIp4AddressAndNetworkId(String ip4Address, long networkId); + NicVO findByNetworkIdAndMacAddress(long networkId, String mac); + NicVO findDefaultNicForVM(long instanceId); /** @@ -74,4 +76,10 @@ public interface NicDao extends GenericDao { List listByNetworkIdTypeAndGatewayAndBroadcastUri(long networkId, VirtualMachine.Type vmType, String gateway, URI broadcastUri); int countNicsForStartingVms(long networkId); + + NicVO getControlNicForVM(long vmId); + + Long getPeerRouterId(String publicMacAddress, long routerId); + + List listByVmIdAndKeyword(long instanceId, String keyword); } diff --git a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java index f27088a44570..f953a4c1f93e 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicDaoImpl.java @@ -45,6 +45,7 @@ public class NicDaoImpl extends GenericDaoBase implements NicDao { private SearchBuilder NonReleasedSearch; private GenericSearchBuilder deviceIdSearch; private GenericSearchBuilder CountByForStartingVms; + private SearchBuilder PeerRouterSearch; @Inject VMInstanceDao _vmDao; @@ -60,12 +61,14 @@ protected void init() { AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ); AllFieldsSearch.and("gateway", AllFieldsSearch.entity().getIPv4Gateway(), Op.EQ); AllFieldsSearch.and("vmType", AllFieldsSearch.entity().getVmType(), Op.EQ); - AllFieldsSearch.and("address", AllFieldsSearch.entity().getIPv4Address(), Op.EQ); + AllFieldsSearch.and("address", AllFieldsSearch.entity().getIPv4Address(), Op.LIKE); AllFieldsSearch.and("isDefault", AllFieldsSearch.entity().isDefaultNic(), Op.EQ); AllFieldsSearch.and("broadcastUri", AllFieldsSearch.entity().getBroadcastUri(), Op.EQ); AllFieldsSearch.and("secondaryip", AllFieldsSearch.entity().getSecondaryIp(), Op.EQ); AllFieldsSearch.and("nicid", AllFieldsSearch.entity().getId(), Op.EQ); AllFieldsSearch.and("strategy", AllFieldsSearch.entity().getReservationStrategy(), Op.EQ); + AllFieldsSearch.and("reserverName",AllFieldsSearch.entity().getReserver(),Op.EQ); + AllFieldsSearch.and("macAddress", AllFieldsSearch.entity().getMacAddress(), Op.EQ); AllFieldsSearch.done(); IpSearch = createSearchBuilder(String.class); @@ -93,6 +96,12 @@ protected void init() { join1.and("state", join1.entity().getState(), Op.EQ); CountByForStartingVms.join("vm", join1, CountByForStartingVms.entity().getInstanceId(), join1.entity().getId(), JoinBuilder.JoinType.INNER); CountByForStartingVms.done(); + + PeerRouterSearch = createSearchBuilder(); + PeerRouterSearch.and("instanceId", PeerRouterSearch.entity().getInstanceId(), Op.NEQ); + PeerRouterSearch.and("macAddress", PeerRouterSearch.entity().getMacAddress(), Op.EQ); + PeerRouterSearch.and("vmType", PeerRouterSearch.entity().getVmType(), Op.EQ); + PeerRouterSearch.done(); } @Override @@ -190,6 +199,14 @@ public NicVO findByIp4AddressAndNetworkId(String ip4Address, long networkId) { return findOneBy(sc); } + @Override + public NicVO findByNetworkIdAndMacAddress(long networkId, String mac) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("macAddress", mac); + return findOneBy(sc); + } + @Override public NicVO findDefaultNicForVM(long instanceId) { SearchCriteria sc = AllFieldsSearch.create(); @@ -198,6 +215,14 @@ public NicVO findDefaultNicForVM(long instanceId) { return findOneBy(sc); } + @Override + public NicVO getControlNicForVM(long vmId){ + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("instance", vmId); + sc.setParameters("reserverName", "ControlNetworkGuru"); + return findOneBy(sc); + } + @Override public NicVO findNonReleasedByInstanceIdAndNetworkId(long networkId, long instanceId) { SearchCriteria sc = NonReleasedSearch.create(); @@ -302,4 +327,25 @@ public int countNicsForStartingVms(long networkId) { List results = customSearch(sc, null); return results.get(0); } + + @Override + public Long getPeerRouterId(String publicMacAddress, final long routerId) { + final SearchCriteria sc = PeerRouterSearch.create(); + sc.setParameters("instanceId", routerId); + sc.setParameters("macAddress", publicMacAddress); + sc.setParameters("vmType", VirtualMachine.Type.DomainRouter); + NicVO nicVo = findOneBy(sc); + if (nicVo != null) { + return nicVo.getInstanceId(); + } + return null; + } + + @Override + public List listByVmIdAndKeyword(long instanceId, String keyword) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("instance", instanceId); + sc.setParameters("address", "%" + keyword + "%"); + return listBy(sc); + } } diff --git a/engine/schema/src/com/cloud/vm/dao/NicExtraDhcpOptionDao.java b/engine/schema/src/com/cloud/vm/dao/NicExtraDhcpOptionDao.java new file mode 100644 index 000000000000..69d9c00e1e0b --- /dev/null +++ b/engine/schema/src/com/cloud/vm/dao/NicExtraDhcpOptionDao.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.vm.dao; + +import java.util.List; + +import com.cloud.utils.db.GenericDao; +import com.cloud.vm.NicExtraDhcpOptionVO; + +public interface NicExtraDhcpOptionDao extends GenericDao { + List listByNicId(long nicId); + + /** + * Persists list of NicExtraDhcpOptionVO + * @param extraDhcpOptions + */ + void saveExtraDhcpOptions(List extraDhcpOptions); +} diff --git a/engine/schema/src/com/cloud/vm/dao/NicExtraDhcpOptionDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicExtraDhcpOptionDaoImpl.java new file mode 100644 index 000000000000..3056c73938e7 --- /dev/null +++ b/engine/schema/src/com/cloud/vm/dao/NicExtraDhcpOptionDaoImpl.java @@ -0,0 +1,77 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.vm.dao; + +import org.springframework.stereotype.Component; + +import java.util.List; + +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; + +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.vm.NicExtraDhcpOption; +import com.cloud.vm.NicExtraDhcpOptionVO; + +@Component +public class NicExtraDhcpOptionDaoImpl extends GenericDaoBase implements NicExtraDhcpOptionDao { + private SearchBuilder AllFieldsSearch; + + protected NicExtraDhcpOptionDaoImpl() { + super(); + + AllFieldsSearch = createSearchBuilder(); + AllFieldsSearch.and("nic_id", AllFieldsSearch.entity().getNicId(), SearchCriteria.Op.EQ); + AllFieldsSearch.and("code", AllFieldsSearch.entity().getCode(), SearchCriteria.Op.IN); + + AllFieldsSearch.done(); + } + + @DB() + @Override + public List listByNicId(long nicId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("nic_id", nicId); + + return listBy(sc); + } + + @DB() + @Override + public void saveExtraDhcpOptions(List extraDhcpOptions) { + if (extraDhcpOptions.isEmpty()) { + return; + } + + extraDhcpOptions + .stream() + .map(NicExtraDhcpOption::getNicId) + .distinct() + .forEach(this::removeByNicId); + + extraDhcpOptions.stream() + .forEach(this::persist); + } + + public void removeByNicId(long nicId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("nic_id", nicId); + expunge(sc); + } + +} diff --git a/engine/schema/src/com/cloud/vm/dao/NicIpAliasDao.java b/engine/schema/src/com/cloud/vm/dao/NicIpAliasDao.java index b79c101b8286..40e7e4072416 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicIpAliasDao.java +++ b/engine/schema/src/com/cloud/vm/dao/NicIpAliasDao.java @@ -58,4 +58,5 @@ public interface NicIpAliasDao extends GenericDao { List listByNetworkIdAndState(long networkId, NicIpAlias.State state); + int moveIpAliases(long fromNicId, long toNicId); } \ No newline at end of file diff --git a/engine/schema/src/com/cloud/vm/dao/NicIpAliasDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicIpAliasDaoImpl.java index 48cc6621b444..d1453aa46307 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicIpAliasDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicIpAliasDaoImpl.java @@ -172,4 +172,14 @@ public Integer countAliasIps(long id) { List list = listBy(sc); return list.size(); } + + @Override + public int moveIpAliases(long fromNicId, long toNicId) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("nicId", fromNicId); + + NicIpAliasVO update = createForUpdate(); + update.setNicId(toNicId); + return update(update, sc); + } } diff --git a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java index 39b8470b8c24..96b80b84dd7e 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java +++ b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDao.java @@ -48,9 +48,15 @@ public interface NicSecondaryIpDao extends GenericDao { NicSecondaryIpVO findByIp4AddressAndNicId(String ip4Address, long nicId); + NicSecondaryIpVO findByIp4AddressAndInstanceId(Long vmId, String vmIp); + NicSecondaryIpVO findByIp4AddressAndNetworkIdAndInstanceId(long networkId, Long vmId, String vmIp); List getSecondaryIpAddressesForNic(long nicId); Long countByNicId(long nicId); + + List listSecondaryIpUsingKeyword(long nicId, String keyword); + + int moveSecondaryIps(long fromNicId, long toNicId); } diff --git a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java index 8cd61953a736..01f53bc99fb3 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpDaoImpl.java @@ -20,6 +20,7 @@ import java.util.List; +import com.cloud.utils.StringUtils; import org.springframework.stereotype.Component; import com.cloud.utils.db.GenericDaoBase; @@ -40,7 +41,7 @@ protected NicSecondaryIpDaoImpl() { AllFieldsSearch = createSearchBuilder(); AllFieldsSearch.and("instanceId", AllFieldsSearch.entity().getVmId(), Op.EQ); AllFieldsSearch.and("network", AllFieldsSearch.entity().getNetworkId(), Op.EQ); - AllFieldsSearch.and("address", AllFieldsSearch.entity().getIp4Address(), Op.EQ); + AllFieldsSearch.and("address", AllFieldsSearch.entity().getIp4Address(), Op.LIKE); AllFieldsSearch.and("nicId", AllFieldsSearch.entity().getNicId(), Op.EQ); AllFieldsSearch.done(); @@ -106,7 +107,13 @@ public List getSecondaryIpAddressesForNic(long nicId) { List results = search(sc, null); List ips = new ArrayList(results.size()); for (NicSecondaryIpVO result : results) { - ips.add(result.getIp4Address()); + if (StringUtils.isNotBlank(result.getIp4Address())) { + ips.add(result.getIp4Address()); + } + + if (StringUtils.isNotBlank(result.getIp6Address())) { + ips.add(result.getIp6Address()); + } } return ips; } @@ -119,8 +126,10 @@ public NicSecondaryIpVO findByInstanceIdAndNetworkId(long networkId, long instan @Override public NicSecondaryIpVO findByIp4AddressAndNetworkId(String ip4Address, long networkId) { - // TODO Auto-generated method stub - return null; + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("network", networkId); + sc.setParameters("address", ip4Address); + return findOneBy(sc); } @Override @@ -131,6 +140,14 @@ public NicSecondaryIpVO findByIp4AddressAndNicId(String ip4Address, long nicId) return findOneBy(sc); } + @Override + public NicSecondaryIpVO findByIp4AddressAndInstanceId(Long vmId, String vmIp) { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("instanceId", vmId); + sc.setParameters("address", vmIp); + return findOneBy(sc); + } + @Override public NicSecondaryIpVO findByIp4AddressAndNetworkIdAndInstanceId(long networkId, Long vmId, String vmIp) { SearchCriteria sc = AllFieldsSearch.create(); @@ -146,4 +163,24 @@ public Long countByNicId(long nicId) { sc.setParameters("nic", nicId); return customSearch(sc, null).get(0); } + + @Override + public List listSecondaryIpUsingKeyword(long nicId, String keyword) + { + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("nicId", nicId); + sc.setParameters("address", "%" + keyword + "%"); + return listBy(sc); + } + + @Override + public int moveSecondaryIps(long fromNicId, long toNicId) { + NicSecondaryIpVO update = createForUpdate(); + update.setNicId(toNicId); + + SearchCriteria sc = AllFieldsSearch.create(); + sc.setParameters("nicId", fromNicId); + + return update(update, sc); + } } diff --git a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpVO.java b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpVO.java index f8730aac5d2b..d60ac9298fcb 100644 --- a/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpVO.java +++ b/engine/schema/src/com/cloud/vm/dao/NicSecondaryIpVO.java @@ -42,6 +42,16 @@ public NicSecondaryIpVO(long nicId, String ipaddr, long vmId, long accountId, lo this.networkId = networkId; } + public NicSecondaryIpVO(long nicId, String ip4Address, String ip6Address, long vmId, long accountId, long domainId, long networkId) { + this.nicId = nicId; + this.vmId = vmId; + this.ip4Address = ip4Address; + this.ip6Address = ip6Address; + this.accountId = accountId; + this.domainId = domainId; + this.networkId = networkId; + } + protected NicSecondaryIpVO() { } @@ -87,6 +97,11 @@ public long getNicId() { return nicId; } + @Override + public void setNicId(long nicId) { + this.nicId = nicId; + } + @Override public long getDomainId() { return domainId; diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java index d76f6d46d4e3..0761f56917b3 100644 --- a/engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/UserVmCloneSettingDaoImpl.java @@ -45,7 +45,7 @@ public UserVmCloneSettingDaoImpl() { public void init() { // Initialize the search builders. vmIdSearch = createSearchBuilder(); - vmIdSearch.and("vmId", vmIdSearch.entity().getCloneType(), Op.EQ); + vmIdSearch.and("vmId", vmIdSearch.entity().getVmId(), Op.EQ); vmIdSearch.done(); cloneTypeSearch = createSearchBuilder(); diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java index b1ff7060ba16..d13234d10168 100644 --- a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -29,6 +29,9 @@ import javax.annotation.PostConstruct; import javax.inject.Inject; +import com.cloud.network.Network; +import com.cloud.network.dao.NetworkDao; +import com.cloud.network.dao.NetworkVO; import org.apache.log4j.Logger; import com.cloud.server.ResourceTag.ResourceObjectType; @@ -77,6 +80,8 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use // ResourceTagsDaoImpl _tagsDao = ComponentLocator.inject(ResourceTagsDaoImpl.class); @Inject ResourceTagDao _tagsDao; + @Inject + NetworkDao networkDao; private static final String LIST_PODS_HAVING_VMS_FOR_ACCOUNT = "SELECT pod_id FROM cloud.vm_instance WHERE data_center_id = ? AND account_id = ? AND pod_id IS NOT NULL AND (state = 'Running' OR state = 'Stopped') " @@ -299,21 +304,32 @@ public List listVirtualNetworkInstancesByAcctAndNetwork(long accountId return listBy(sc); } - @Override - public List listByNetworkIdAndStates(long networkId, State... states) { - if (UserVmSearch == null) { + /** + * Recreates UserVmSearch depending on network type, as nics on L2 networks have no ip addresses + * @param network network + */ + private void recreateUserVmSeach(NetworkVO network) { + if (network != null) { SearchBuilder nicSearch = _nicDao.createSearchBuilder(); nicSearch.and("networkId", nicSearch.entity().getNetworkId(), SearchCriteria.Op.EQ); nicSearch.and("removed", nicSearch.entity().getRemoved(), SearchCriteria.Op.NULL); - nicSearch.and().op("ip4Address", nicSearch.entity().getIPv4Address(), SearchCriteria.Op.NNULL); - nicSearch.or("ip6Address", nicSearch.entity().getIPv6Address(), SearchCriteria.Op.NNULL); - nicSearch.cp(); + if (!Network.GuestType.L2.equals(network.getGuestType())) { + nicSearch.and().op("ip4Address", nicSearch.entity().getIPv4Address(), SearchCriteria.Op.NNULL); + nicSearch.or("ip6Address", nicSearch.entity().getIPv6Address(), SearchCriteria.Op.NNULL); + nicSearch.cp(); + } UserVmSearch = createSearchBuilder(); UserVmSearch.and("states", UserVmSearch.entity().getState(), SearchCriteria.Op.IN); UserVmSearch.join("nicSearch", nicSearch, UserVmSearch.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); UserVmSearch.done(); } + } + + @Override + public List listByNetworkIdAndStates(long networkId, State... states) { + NetworkVO network = networkDao.findById(networkId); + recreateUserVmSeach(network); SearchCriteria sc = UserVmSearch.create(); if (states != null && states.length != 0) { diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java old mode 100644 new mode 100755 index 8d457fadff5e..6fda4a15c324 --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDao.java @@ -53,6 +53,14 @@ public interface VMInstanceDao extends GenericDao, StateDao< */ List listByPodId(long podId); + /** + * Lists non-expunged VMs by templateId + * @param templateId + * @return list of VMInstanceVO deployed from the specified template, that are not expunged + */ + public List listNonExpungedByTemplate(long templateId); + + /** * Lists non-expunged VMs by zone ID and templateId * @param zoneId @@ -116,6 +124,8 @@ public interface VMInstanceDao extends GenericDao, StateDao< Long countRunningByAccount(long accountId); + Long countByZoneAndState(long zoneId, State state); + List listNonRemovedVmsByTypeAndNetwork(long networkId, VirtualMachine.Type... types); /** @@ -140,4 +150,6 @@ public interface VMInstanceDao extends GenericDao, StateDao< VMInstanceVO findVMByHostNameInZone(String hostName, long zoneId); boolean isPowerStateUpToDate(long instanceId); + + List listNonMigratingVmsByHostEqualsLastHost(long hostId); } diff --git a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java old mode 100644 new mode 100755 index df5e60e7a1ae..1565f53233bc --- a/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/VMInstanceDaoImpl.java @@ -72,6 +72,7 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem protected SearchBuilder IdStatesSearch; protected SearchBuilder AllFieldsSearch; protected SearchBuilder ZoneTemplateNonExpungedSearch; + protected SearchBuilder TemplateNonExpungedSearch; protected SearchBuilder NameLikeSearch; protected SearchBuilder StateChangeSearch; protected SearchBuilder TransitionSearch; @@ -87,10 +88,12 @@ public class VMInstanceDaoImpl extends GenericDaoBase implem protected GenericSearchBuilder FindIdsOfVirtualRoutersByAccount; protected GenericSearchBuilder CountActiveByHost; protected GenericSearchBuilder CountRunningByAccount; + protected GenericSearchBuilder CountByZoneAndState; protected SearchBuilder NetworkTypeSearch; protected GenericSearchBuilder DistinctHostNameSearch; protected SearchBuilder HostAndStateSearch; protected SearchBuilder StartingWithNoHostSearch; + protected SearchBuilder NotMigratingSearch; @Inject ResourceTagDao _tagsDao; @@ -164,6 +167,12 @@ protected void init() { ZoneTemplateNonExpungedSearch.and("state", ZoneTemplateNonExpungedSearch.entity().getState(), Op.NEQ); ZoneTemplateNonExpungedSearch.done(); + + TemplateNonExpungedSearch = createSearchBuilder(); + TemplateNonExpungedSearch.and("template", TemplateNonExpungedSearch.entity().getTemplateId(), Op.EQ); + TemplateNonExpungedSearch.and("state", TemplateNonExpungedSearch.entity().getState(), Op.NEQ); + TemplateNonExpungedSearch.done(); + NameLikeSearch = createSearchBuilder(); NameLikeSearch.and("name", NameLikeSearch.entity().getHostName(), Op.LIKE); NameLikeSearch.done(); @@ -242,6 +251,12 @@ protected void init() { CountRunningByAccount.and("state", CountRunningByAccount.entity().getState(), SearchCriteria.Op.EQ); CountRunningByAccount.done(); + CountByZoneAndState = createSearchBuilder(Long.class); + CountByZoneAndState.select(null, Func.COUNT, null); + CountByZoneAndState.and("zone", CountByZoneAndState.entity().getDataCenterId(), SearchCriteria.Op.EQ); + CountByZoneAndState.and("state", CountByZoneAndState.entity().getState(), SearchCriteria.Op.EQ); + CountByZoneAndState.done(); + HostAndStateSearch = createSearchBuilder(); HostAndStateSearch.and("host", HostAndStateSearch.entity().getHostId(), Op.EQ); HostAndStateSearch.and("states", HostAndStateSearch.entity().getState(), Op.IN); @@ -266,6 +281,11 @@ protected void init() { DistinctHostNameSearch.join("nicSearch", nicSearch, DistinctHostNameSearch.entity().getId(), nicSearch.entity().getInstanceId(), JoinBuilder.JoinType.INNER); DistinctHostNameSearch.done(); + NotMigratingSearch = createSearchBuilder(); + NotMigratingSearch.and("host", NotMigratingSearch.entity().getHostId(), Op.EQ); + NotMigratingSearch.and("lastHost", NotMigratingSearch.entity().getLastHostId(), Op.EQ); + NotMigratingSearch.and("state", NotMigratingSearch.entity().getState(), Op.NEQ); + NotMigratingSearch.done(); } @Override @@ -290,6 +310,15 @@ public List listByHostId(long hostid) { return listBy(sc); } + @Override + public List listNonMigratingVmsByHostEqualsLastHost(long hostId) { + SearchCriteria sc = NotMigratingSearch.create(); + sc.setParameters("host", hostId); + sc.setParameters("lastHost", hostId); + sc.setParameters("state", State.Migrating); + return listBy(sc); + } + @Override public List listByZoneId(long zoneId) { SearchCriteria sc = AllFieldsSearch.create(); @@ -327,6 +356,15 @@ public List listByZoneIdAndType(long zoneId, VirtualMachine.Type t return listBy(sc); } + @Override + public List listNonExpungedByTemplate(long templateId) { + SearchCriteria sc = TemplateNonExpungedSearch.create(); + + sc.setParameters("template", templateId); + sc.setParameters("state", State.Expunging); + return listBy(sc); + } + @Override public List listNonExpungedByZoneAndTemplate(long zoneId, long templateId) { SearchCriteria sc = ZoneTemplateNonExpungedSearch.create(); @@ -718,6 +756,14 @@ public Long countRunningByAccount(long accountId) { return customSearch(sc, null).get(0); } + @Override + public Long countByZoneAndState(long zoneId, State state) { + SearchCriteria sc = CountByZoneAndState.create(); + sc.setParameters("zone", zoneId); + sc.setParameters("state", state); + return customSearch(sc, null).get(0); + } + @Override public List listNonRemovedVmsByTypeAndNetwork(long networkId, VirtualMachine.Type... types) { if (NetworkTypeSearch == null) { diff --git a/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java b/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java index df2966d45b66..c48396ad0219 100644 --- a/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java +++ b/engine/schema/src/com/cloud/vm/snapshot/VMSnapshotVO.java @@ -72,6 +72,9 @@ public class VMSnapshotVO implements VMSnapshot { @Column(name = "domain_id") long domainId; + @Column(name = "service_offering_id") + private long serviceOfferingId; + @Column(name = "vm_snapshot_type") @Enumerated(EnumType.STRING) VMSnapshot.Type type; @@ -139,6 +142,7 @@ public VMSnapshotVO(Long accountId, Long domainId, Long vmId, String description displayName = vsDisplayName; this.type = type; this.current = current; + this.serviceOfferingId = serviceOfferingId; } @Override @@ -248,4 +252,9 @@ public void setRemoved(Date removed) { public Class getEntityType() { return VMSnapshot.class; } + + @Override + public long getServiceOfferingId() { + return serviceOfferingId; + } } diff --git a/engine/schema/src/org/apache/cloudstack/acl/dao/RoleDaoImpl.java b/engine/schema/src/org/apache/cloudstack/acl/dao/RoleDaoImpl.java index c7eb496213ef..e3dd266d1315 100644 --- a/engine/schema/src/org/apache/cloudstack/acl/dao/RoleDaoImpl.java +++ b/engine/schema/src/org/apache/cloudstack/acl/dao/RoleDaoImpl.java @@ -24,11 +24,9 @@ import org.apache.cloudstack.acl.RoleVO; import org.springframework.stereotype.Component; -import javax.ejb.Local; import java.util.List; @Component -@Local(value = {RoleDao.class}) public class RoleDaoImpl extends GenericDaoBase implements RoleDao { private final SearchBuilder RoleByNameSearch; private final SearchBuilder RoleByTypeSearch; diff --git a/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDao.java b/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDao.java index 375449196575..c9aeba1c5998 100644 --- a/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDao.java +++ b/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDao.java @@ -20,6 +20,7 @@ import com.cloud.utils.db.GenericDao; import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RolePermission; +import org.apache.cloudstack.acl.RolePermission.Permission; import org.apache.cloudstack.acl.RolePermissionVO; import java.util.List; @@ -40,6 +41,15 @@ public interface RolePermissionsDao extends GenericDao { */ boolean update(final Role role, final List newOrder); + /** + * Updates existing role permission + * @param role role of which rule belongs + * @param rolePermission role permission + * @param permission permission + * @return true on success, false if not + */ + boolean update(final Role role, final RolePermission rolePermission, final Permission permission); + /** * Returns ordered linked-list of role permission for a given role * @param roleId the ID of the role diff --git a/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java b/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java index 8f6fa83f012b..68b6abf21953 100644 --- a/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java +++ b/engine/schema/src/org/apache/cloudstack/acl/dao/RolePermissionsDaoImpl.java @@ -29,11 +29,11 @@ import com.cloud.utils.exception.CloudRuntimeException; import org.apache.cloudstack.acl.Role; import org.apache.cloudstack.acl.RolePermission; +import org.apache.cloudstack.acl.RolePermission.Permission; import org.apache.cloudstack.acl.RolePermissionVO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import javax.ejb.Local; import java.util.ArrayList; import java.util.Collections; import java.util.HashSet; @@ -41,7 +41,6 @@ import java.util.Set; @Component -@Local(value = {RolePermissionsDao.class}) public class RolePermissionsDaoImpl extends GenericDaoBase implements RolePermissionsDao { protected static final Logger LOGGER = Logger.getLogger(RolePermissionsDaoImpl.class); @@ -149,6 +148,19 @@ public Boolean doInTransaction(TransactionStatus status) { }); } + @Override + public boolean update(Role role, RolePermission rolePermission, Permission permission) { + if (role == null || rolePermission == null || permission == null) { + return false; + } + RolePermissionVO rolePermissionVO = findById(rolePermission.getId()); + if (rolePermissionVO == null || role.getId() != rolePermission.getRoleId() || rolePermissionVO.getId() != rolePermission.getId()) { + return false; + } + rolePermissionVO.setPermission(permission); + return update(rolePermission.getId(), rolePermissionVO); + } + @Override public List findAllByRoleIdSorted(final Long roleId) { final SearchCriteria sc = RolePermissionsSearch.create(); diff --git a/engine/schema/src/org/apache/cloudstack/annotation/AnnotationVO.java b/engine/schema/src/org/apache/cloudstack/annotation/AnnotationVO.java new file mode 100644 index 000000000000..982dd6db15ba --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/annotation/AnnotationVO.java @@ -0,0 +1,154 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.annotation; + +import com.cloud.utils.db.GenericDao; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; +import java.util.Date; +import java.util.UUID; + +/** + * @since 4.11 + */ +@Entity +@Table(name = "annotations") +public class AnnotationVO implements Annotation { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "uuid") + private String uuid; + + @Column(name = "annotation") + private String annotation; + + @Column(name = "entity_uuid") + private String entityUuid; + + @Column(name = "entity_type") + private AnnotationService.EntityType entityType; + + @Column(name = "user_uuid") + private String userUuid; + + @Column(name = GenericDao.CREATED_COLUMN) + private Date created; + + @Column(name = GenericDao.REMOVED_COLUMN) + private Date removed; + + // construct + public AnnotationVO() { + this.uuid = UUID.randomUUID().toString(); + } + + public AnnotationVO(String text, AnnotationService.EntityType type, String uuid) { + this(); + setAnnotation(text); + setEntityType(type); + setEntityUuid(uuid); + } + + public AnnotationVO(String text, String type, String uuid) { + this(); + setAnnotation(text); + setEntityType(type); + setEntityUuid(uuid); + } + // access + + @Override + public long getId() { + return id; + } + + + @Override + public String getUuid() { + return uuid; + } + + @Override + public String getAnnotation() { + return annotation; + } + + @Override + public String getEntityUuid() { + return entityUuid; + } + + @Override + public AnnotationService.EntityType getEntityType() { + return entityType; + } + + @Override + public String getUserUuid() { + return userUuid; + } + + @Override + public Date getCreated() { + return created; + } + + @Override + public Date getRemoved() { + return removed; + } + + public void setUuid(String uuid) { + this.uuid = uuid; + } + + public void setAnnotation(String annotation) { + this.annotation = annotation; + } + + public void setEntityUuid(String entityUuid) { + this.entityUuid = entityUuid; + } + + public void setEntityType(String entityType) { + this.entityType = AnnotationService.EntityType.valueOf(entityType); + } + + public void setEntityType(AnnotationService.EntityType entityType) { + this.entityType = entityType; + } + + public void setUserUuid(String userUuid) { + this.userUuid = userUuid; + } + + public void setCreated(Date created) { + this.created = created; + } + + public void setRemoved(Date removed) { + this.removed = removed; + } +} diff --git a/server/src/com/cloud/api/query/dao/StorageTagDao.java b/engine/schema/src/org/apache/cloudstack/annotation/dao/AnnotationDao.java similarity index 72% rename from server/src/com/cloud/api/query/dao/StorageTagDao.java rename to engine/schema/src/org/apache/cloudstack/annotation/dao/AnnotationDao.java index aa2d6e6e9f70..6bf8484560c0 100644 --- a/server/src/com/cloud/api/query/dao/StorageTagDao.java +++ b/engine/schema/src/org/apache/cloudstack/annotation/dao/AnnotationDao.java @@ -14,17 +14,17 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.api.query.dao; +package org.apache.cloudstack.annotation.dao; -import java.util.List; - -import org.apache.cloudstack.api.response.StorageTagResponse; - -import com.cloud.api.query.vo.StorageTagVO; +import org.apache.cloudstack.annotation.AnnotationVO; import com.cloud.utils.db.GenericDao; -public interface StorageTagDao extends GenericDao { - StorageTagResponse newStorageTagResponse(StorageTagVO storageTag); +import java.util.List; - List searchByIds(Long... storageTagIds); +/** + * @since 4.11 + */ +public interface AnnotationDao extends GenericDao { + public List findByEntityType(String entityType); + public List findByEntity(String entityType, String entityUuid); } diff --git a/engine/schema/src/org/apache/cloudstack/annotation/dao/AnnotationDaoImpl.java b/engine/schema/src/org/apache/cloudstack/annotation/dao/AnnotationDaoImpl.java new file mode 100644 index 000000000000..e2fcc905e0b7 --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/annotation/dao/AnnotationDaoImpl.java @@ -0,0 +1,59 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.annotation.dao; + +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import org.apache.cloudstack.annotation.AnnotationVO; +import org.springframework.stereotype.Component; + +import java.util.List; + +/** + * @since 4.1 + */ +@Component +public class AnnotationDaoImpl extends GenericDaoBase implements AnnotationDao { + private final SearchBuilder AnnotationSearchByType; + private final SearchBuilder AnnotationSearchByTypeAndUuid; + + public AnnotationDaoImpl() { + super(); + AnnotationSearchByType = createSearchBuilder(); + AnnotationSearchByType.and("entityType", AnnotationSearchByType.entity().getEntityType(), SearchCriteria.Op.EQ); + AnnotationSearchByType.done(); + AnnotationSearchByTypeAndUuid = createSearchBuilder(); + AnnotationSearchByTypeAndUuid.and("entityType", AnnotationSearchByTypeAndUuid.entity().getEntityType(), SearchCriteria.Op.EQ); + AnnotationSearchByTypeAndUuid.and("entityUuid", AnnotationSearchByTypeAndUuid.entity().getEntityUuid(), SearchCriteria.Op.EQ); + AnnotationSearchByTypeAndUuid.done(); + + } + + @Override public List findByEntityType(String entityType) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("entityType", SearchCriteria.Op.EQ, entityType); + return listBy(sc); + } + + @Override public List findByEntity(String entityType, String entityUuid) { + SearchCriteria sc = createSearchCriteria(); + sc.addAnd("entityType", SearchCriteria.Op.EQ, entityType); + sc.addAnd("entityUuid", SearchCriteria.Op.EQ, entityUuid); + return listBy(sc, null); + } +} diff --git a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java index d7560e22bd10..cdb80febdcf1 100644 --- a/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java +++ b/engine/schema/src/org/apache/cloudstack/engine/cloud/entity/api/db/VMEntityVO.java @@ -550,4 +550,9 @@ public boolean isDisplay() { public void setDisplay(boolean display) { this.display = display; } + + @Override + public PartitionType partitionType() { + return PartitionType.VM; + } } diff --git a/engine/schema/src/org/apache/cloudstack/ha/HAConfigVO.java b/engine/schema/src/org/apache/cloudstack/ha/HAConfigVO.java new file mode 100644 index 000000000000..a68ed93746d5 --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/ha/HAConfigVO.java @@ -0,0 +1,142 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ha; + +import com.cloud.utils.db.StateMachine; + +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.Table; +import javax.persistence.Temporal; +import javax.persistence.TemporalType; +import java.util.Date; + +@Entity +@Table(name = "ha_config") +public class HAConfigVO implements HAConfig { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private Long id; + + @Column(name = "resource_id", updatable = false, nullable = false) + private long resourceId; + + @Column(name = "resource_type", nullable = false) + @Enumerated(value = EnumType.STRING) + private HAResource.ResourceType resourceType; + + @Column(name = "enabled") + private boolean enabled = false; + + // There is no setter for status because it has to be set in the dao code + @Enumerated(value = EnumType.STRING) + @StateMachine(state = HAState.class, event = HAConfig.Event.class) + @Column(name = "ha_state", updatable = true, nullable = false, length = 32) + private HAState haState = null; + + @Column(name = "provider") + private String haProvider; + + // This field should be updated every time the state is updated. + // There's no set method in the vo object because it is done with in the dao code. + @Column(name = "update_count", updatable = true, nullable = false) + private long updateCount; + + @Column(name = "update_time", updatable = true) + @Temporal(value = TemporalType.TIMESTAMP) + private Date updateTime; + + @Column(name = "mgmt_server_id") + private Long managementServerId; + + public HAConfigVO() { + } + + @Override + public long getId() { + return id; + } + + public long getResourceId() { + return resourceId; + } + + public HAResource.ResourceType getResourceType() { + return resourceType; + } + + public boolean isEnabled() { + return enabled; + } + + public long getUpdateCount() { + return updateCount; + } + + public long incrUpdateCount() { + updateCount++; + return updateCount; + } + + public Date getUpdateTime() { + return updateTime; + } + + public Long getManagementServerId() { + return managementServerId; + } + + public HAState getHaState() { + return haState; + } + + @Override + public HAState getState() { + return haState; + } + + public String getHaProvider() { + return haProvider; + } + + public void setHaProvider(String haProvider) { + this.haProvider = haProvider; + } + + public void setResourceId(long resourceId) { + this.resourceId = resourceId; + } + + public void setResourceType(HAResource.ResourceType resourceType) { + this.resourceType = resourceType; + } + + public void setEnabled(boolean enabled) { + this.enabled = enabled; + } + + public void setManagementServerId(Long managementServerId) { + this.managementServerId = managementServerId; + } +} diff --git a/engine/schema/src/org/apache/cloudstack/ha/dao/HAConfigDao.java b/engine/schema/src/org/apache/cloudstack/ha/dao/HAConfigDao.java new file mode 100644 index 000000000000..4a398f821a96 --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/ha/dao/HAConfigDao.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ha.dao; + +import com.cloud.utils.db.GenericDao; +import com.cloud.utils.fsm.StateDao; +import org.apache.cloudstack.ha.HAConfig; +import org.apache.cloudstack.ha.HAConfigVO; +import org.apache.cloudstack.ha.HAResource; + +import java.util.List; + +public interface HAConfigDao extends GenericDao, StateDao { + HAConfig findHAResource(long resourceId, HAResource.ResourceType resourceType); + List listHAResource(final Long resourceId, final HAResource.ResourceType resourceType); + void expireServerOwnership(long serverId); +} \ No newline at end of file diff --git a/engine/schema/src/org/apache/cloudstack/ha/dao/HAConfigDaoImpl.java b/engine/schema/src/org/apache/cloudstack/ha/dao/HAConfigDaoImpl.java new file mode 100644 index 000000000000..4d74e2e66566 --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/ha/dao/HAConfigDaoImpl.java @@ -0,0 +1,149 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ha.dao; + +import com.cloud.utils.DateUtil; +import com.cloud.utils.db.Attribute; +import com.cloud.utils.db.DB; +import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import com.cloud.utils.db.TransactionLegacy; +import com.cloud.utils.db.TransactionStatus; +import com.cloud.utils.db.UpdateBuilder; +import org.apache.cloudstack.ha.HAConfig; +import org.apache.cloudstack.ha.HAConfigVO; +import org.apache.cloudstack.ha.HAResource; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; + +@DB +@Component +public class HAConfigDaoImpl extends GenericDaoBase implements HAConfigDao { + private static final Logger LOG = Logger.getLogger(HAConfigDaoImpl.class); + + private static final String EXPIRE_OWNERSHIP = "UPDATE ha_config set mgmt_server_id=NULL where mgmt_server_id=?"; + + private SearchBuilder ResourceSearch; + private SearchBuilder StateUpdateSearch; + + private Attribute HAStateAttr; + private Attribute MsIdAttr; + private Attribute UpdateTimeAttr; + + public HAConfigDaoImpl() { + super(); + + ResourceSearch = createSearchBuilder(); + ResourceSearch.and("resourceId", ResourceSearch.entity().getResourceId(), SearchCriteria.Op.EQ); + ResourceSearch.and("resourceType", ResourceSearch.entity().getResourceType(), SearchCriteria.Op.EQ); + ResourceSearch.done(); + + StateUpdateSearch = createSearchBuilder(); + StateUpdateSearch.and("id", StateUpdateSearch.entity().getId(), SearchCriteria.Op.EQ); + StateUpdateSearch.and("haState", StateUpdateSearch.entity().getHaState(), SearchCriteria.Op.EQ); + StateUpdateSearch.and("update", StateUpdateSearch.entity().getUpdateCount(), SearchCriteria.Op.EQ); + StateUpdateSearch.done(); + + HAStateAttr = _allAttributes.get("haState"); + MsIdAttr = _allAttributes.get("managementServerId"); + UpdateTimeAttr = _allAttributes.get("updateTime"); + assert (HAStateAttr != null && MsIdAttr != null && UpdateTimeAttr != null) : "Couldn't find one of these attributes"; + } + + @Override + public boolean updateState(HAConfig.HAState currentState, HAConfig.Event event, HAConfig.HAState nextState, HAConfig vo, Object data) { + HAConfigVO haConfig = (HAConfigVO) vo; + if (haConfig == null) { + if (LOG.isTraceEnabled()) { + LOG.trace("Invalid ha config view object provided"); + } + return false; + } + + Long newManagementServerId = event.getServerId(); + if (currentState == nextState && (haConfig.getManagementServerId() != null && haConfig.getManagementServerId().equals(newManagementServerId))) { + return false; + } + + if (event == HAConfig.Event.Disabled) { + newManagementServerId = null; + } + + SearchCriteria sc = StateUpdateSearch.create(); + sc.setParameters("id", haConfig.getId()); + sc.setParameters("haState", currentState); + sc.setParameters("update", haConfig.getUpdateCount()); + + haConfig.incrUpdateCount(); + UpdateBuilder ub = getUpdateBuilder(haConfig); + ub.set(haConfig, HAStateAttr, nextState); + ub.set(haConfig, UpdateTimeAttr, DateUtil.currentGMTTime()); + ub.set(haConfig, MsIdAttr, newManagementServerId); + + int result = update(ub, sc, null); + if (LOG.isTraceEnabled() && result <= 0) { + LOG.trace(String.format("Failed to update HA state from:%s to:%s due to event:%s for the ha_config id:%d", currentState, nextState, event, haConfig.getId())); + } + return result > 0; + } + + @Override + public HAConfig findHAResource(final long resourceId, final HAResource.ResourceType resourceType) { + final SearchCriteria sc = ResourceSearch.create(); + sc.setParameters("resourceId", resourceId); + sc.setParameters("resourceType", resourceType); + return findOneBy(sc); + } + + @Override + public List listHAResource(final Long resourceId, final HAResource.ResourceType resourceType) { + final SearchCriteria sc = ResourceSearch.create(); + if (resourceId != null && resourceId > 0L) { + sc.setParameters("resourceId", resourceId); + } + if (resourceType != null) { + sc.setParameters("resourceType", resourceType); + } + return new ArrayList(listBy(sc)); + } + + @Override + public void expireServerOwnership(final long serverId) { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + TransactionLegacy txn = TransactionLegacy.currentTxn(); + try (final PreparedStatement pstmt = txn.prepareAutoCloseStatement(EXPIRE_OWNERSHIP);) { + pstmt.setLong(1, serverId); + pstmt.executeUpdate(); + } catch (SQLException e) { + txn.rollback(); + LOG.warn("Failed to expire HA ownership of management server id: " + serverId); + } + } + }); + } +} diff --git a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementVO.java b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementVO.java index b5c357c3f824..2f975caf0f17 100644 --- a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementVO.java +++ b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/OutOfBandManagementVO.java @@ -59,7 +59,7 @@ public class OutOfBandManagementVO implements OutOfBandManagement { private String address; @Column(name = "port") - private Integer port; + private String port; @Column(name = "username") private String username; @@ -121,7 +121,7 @@ public String getAddress() { } @Override - public Integer getPort() { + public String getPort() { return port; } @@ -173,7 +173,7 @@ public void setAddress(String address) { } @Override - public void setPort(Integer port) { + public void setPort(String port) { this.port = port; } diff --git a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java index 5985b8162567..8a4ee36710f8 100644 --- a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java +++ b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDao.java @@ -27,5 +27,5 @@ public interface OutOfBandManagementDao extends GenericDao, StateDao { OutOfBandManagement findByHost(long hostId); List findAllByManagementServer(long serverId); - void expireOutOfBandManagementOwnershipByServer(long serverId); + void expireServerOwnership(long serverId); } diff --git a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java index b914b6b702d4..3cdd28fe25a0 100644 --- a/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java +++ b/engine/schema/src/org/apache/cloudstack/outofbandmanagement/dao/OutOfBandManagementDaoImpl.java @@ -110,7 +110,7 @@ public void doInTransactionWithoutResult(TransactionStatus status) { } @Override - public void expireOutOfBandManagementOwnershipByServer(long serverId) { + public void expireServerOwnership(long serverId) { final String resetOwnerSql = "UPDATE oobm set mgmt_server_id=NULL, power_state=NULL where mgmt_server_id=?"; executeExpireOwnershipSql(resetOwnerSql, serverId); if (LOG.isDebugEnabled()) { diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/GuestOsDetailVO.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/GuestOsDetailVO.java new file mode 100644 index 000000000000..0ab252afa38e --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/GuestOsDetailVO.java @@ -0,0 +1,81 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.resourcedetail; + +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.GenerationType; +import javax.persistence.Id; +import javax.persistence.Table; + +import org.apache.cloudstack.api.ResourceDetail; + +@Entity +@Table(name = "guest_os_details") +public class GuestOsDetailVO implements ResourceDetail { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + @Column(name = "id") + private long id; + + @Column(name = "guest_os_id") + private long resourceId; + + @Column(name = "name") + private String name; + + @Column(name = "value", length = 1024) + private String value; + + @Column(name = "display") + private boolean display = true; + + public GuestOsDetailVO() { + } + + public GuestOsDetailVO(long id, String name, String value) { + this.resourceId = id; + this.name = name; + this.value = value; + } + + @Override + public long getId() { + return id; + } + + @Override + public String getName() { + return name; + } + + @Override + public String getValue() { + return value; + } + + @Override + public long getResourceId() { + return resourceId; + } + + @Override + public boolean isDisplay() { + return display; + } +} diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/GuestOsDetailsDao.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/GuestOsDetailsDao.java new file mode 100644 index 000000000000..4b1d5a8d3a7e --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/GuestOsDetailsDao.java @@ -0,0 +1,26 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.resourcedetail.dao; + +import org.apache.cloudstack.resourcedetail.GuestOsDetailVO; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDao; + +import com.cloud.utils.db.GenericDao; + +public interface GuestOsDetailsDao extends GenericDao, ResourceDetailsDao { + +} diff --git a/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/GuestOsDetailsDaoImpl.java b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/GuestOsDetailsDaoImpl.java new file mode 100644 index 000000000000..16e6fd1f9284 --- /dev/null +++ b/engine/schema/src/org/apache/cloudstack/resourcedetail/dao/GuestOsDetailsDaoImpl.java @@ -0,0 +1,30 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.resourcedetail.dao; + +import org.apache.cloudstack.resourcedetail.GuestOsDetailVO; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase; +import org.springframework.stereotype.Component; + +@Component +public class GuestOsDetailsDaoImpl extends ResourceDetailsDaoBase implements GuestOsDetailsDao { + + @Override + public void addDetail(long resourceId, String key, String value, boolean display) { + super.addDetail(new GuestOsDetailVO(resourceId, key, value)); + } +} diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java similarity index 96% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java rename to engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java index 13a7f470b0fc..9d532625c0ab 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDaoImpl.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDaoImpl.java @@ -16,7 +16,7 @@ * specific language governing permissions and limitations * under the License. */ -package org.apache.cloudstack.storage.image.db; +package org.apache.cloudstack.storage.datastore.db; import java.util.List; import java.util.Map; @@ -26,8 +26,6 @@ import org.springframework.stereotype.Component; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDao; -import org.apache.cloudstack.storage.datastore.db.ImageStoreVO; import com.cloud.storage.DataStoreRole; import com.cloud.storage.ScopeType; diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailVO.java index 66014377004e..fdfb7348fca1 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailVO.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailVO.java @@ -23,18 +23,18 @@ import javax.persistence.Id; import javax.persistence.Table; -import org.apache.cloudstack.api.InternalIdentity; +import org.apache.cloudstack.api.ResourceDetail; @Entity @Table(name = "image_store_details") -public class ImageStoreDetailVO implements InternalIdentity { +public class ImageStoreDetailVO implements ResourceDetail { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Column(name = "id") long id; @Column(name = "store_id") - long storeId; + long resourceId; @Column(name = "name") String name; @@ -42,13 +42,17 @@ public class ImageStoreDetailVO implements InternalIdentity { @Column(name = "value") String value; + @Column(name = "display") + private boolean display = true; + public ImageStoreDetailVO() { } - public ImageStoreDetailVO(long storeId, String name, String value) { - this.storeId = storeId; + public ImageStoreDetailVO(long storeId, String name, String value, boolean display) { + this.resourceId = storeId; this.name = name; this.value = value; + this.display = display; } @Override @@ -56,28 +60,24 @@ public long getId() { return id; } - public long getStoreId() { - return storeId; - } - - public void setStoreId(long storeId) { - this.storeId = storeId; + @Override + public long getResourceId() { + return resourceId; } + @Override public String getName() { return name; } - public void setName(String name) { - this.name = name; - } - + @Override public String getValue() { return value; } - public void setValue(String value) { - this.value = value; + @Override + public boolean isDisplay() { + return display; } } diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDao.java index 91fff280d918..04cd70308a44 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDao.java @@ -18,9 +18,11 @@ import java.util.Map; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDao; + import com.cloud.utils.db.GenericDao; -public interface ImageStoreDetailsDao extends GenericDao { +public interface ImageStoreDetailsDao extends GenericDao, ResourceDetailsDao { void update(long storeId, Map details); diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDaoImpl.java similarity index 65% rename from engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java rename to engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDaoImpl.java index 2bfc38e6c827..8e5ce770f450 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/ImageStoreDetailsDaoImpl.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/ImageStoreDetailsDaoImpl.java @@ -14,34 +14,36 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package org.apache.cloudstack.storage.image.db; +package org.apache.cloudstack.storage.datastore.db; import java.util.HashMap; import java.util.List; import java.util.Map; - import org.springframework.stereotype.Component; -import org.apache.cloudstack.api.ApiConstants; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailVO; -import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; - import com.cloud.utils.crypt.DBEncryptionUtil; -import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.QueryBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; +import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.TransactionLegacy; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.ConfigKey.Scope; +import org.apache.cloudstack.framework.config.ScopedConfigStorage; +import org.apache.cloudstack.resourcedetail.ResourceDetailsDaoBase; + @Component -public class ImageStoreDetailsDaoImpl extends GenericDaoBase implements ImageStoreDetailsDao { +public class ImageStoreDetailsDaoImpl extends ResourceDetailsDaoBase implements ImageStoreDetailsDao, ScopedConfigStorage { protected final SearchBuilder storeSearch; - protected ImageStoreDetailsDaoImpl() { + public ImageStoreDetailsDaoImpl() { super(); storeSearch = createSearchBuilder(); - storeSearch.and("store", storeSearch.entity().getStoreId(), SearchCriteria.Op.EQ); + storeSearch.and("store", storeSearch.entity().getResourceId(), SearchCriteria.Op.EQ); storeSearch.done(); } @@ -54,7 +56,7 @@ public void update(long storeId, Map details) { txn.start(); expunge(sc); for (Map.Entry entry : details.entrySet()) { - ImageStoreDetailVO detail = new ImageStoreDetailVO(storeId, entry.getKey(), entry.getValue()); + ImageStoreDetailVO detail = new ImageStoreDetailVO(storeId, entry.getKey(), entry.getValue(), true); persist(detail); } txn.commit(); @@ -88,7 +90,30 @@ public void deleteDetails(long storeId) { for (ImageStoreDetailVO result : results) { remove(result.getId()); } + } + + @Override + public Scope getScope() { + return ConfigKey.Scope.ImageStore; + } + + @Override + public ImageStoreDetailVO findDetail(long storeId, String name) { + QueryBuilder sc = QueryBuilder.create(ImageStoreDetailVO.class); + sc.and(sc.entity().getResourceId(), Op.EQ, storeId); + sc.and(sc.entity().getName(), Op.EQ, name); + return sc.find(); + } + @Override + public String getConfigValue(long id, ConfigKey key) { + ImageStoreDetailVO vo = findDetail(id, key.key()); + return vo == null ? null : vo.getValue(); + } + + @Override + public void addDetail(long resourceId, String key, String value, boolean display) { + super.addDetail(new ImageStoreDetailVO(resourceId, key, value, display)); } } diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java index 32d1d792244d..2398e91c90c7 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDao.java @@ -53,7 +53,7 @@ public interface PrimaryDataStoreDao extends GenericDao { */ void updateCapacityIops(long id, long capacityIops); - StoragePoolVO persist(StoragePoolVO pool, Map details); + StoragePoolVO persist(StoragePoolVO pool, Map details, List tags); /** * Find pool by name. @@ -100,7 +100,7 @@ public interface PrimaryDataStoreDao extends GenericDao { Map getDetails(long poolId); - List searchForStoragePoolDetails(long poolId, String value); + List searchForStoragePoolTags(long poolId); List findIfDuplicatePoolsExistByUUID(String uuid); @@ -121,4 +121,6 @@ public interface PrimaryDataStoreDao extends GenericDao { List findLocalStoragePoolsByHostAndTags(long hostId, String[] tags); List listLocalStoragePoolByPath(long datacenterId, String path); + + void deletePoolTags(long poolId); } diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java index c451e1dee460..3cd59055774e 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImpl.java @@ -20,19 +20,22 @@ import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; -import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.commons.collections.CollectionUtils; + import com.cloud.host.Status; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.ScopeType; import com.cloud.storage.StoragePoolHostVO; import com.cloud.storage.StoragePoolStatus; +import com.cloud.storage.StoragePoolTagVO; import com.cloud.storage.dao.StoragePoolHostDao; +import com.cloud.storage.dao.StoragePoolTagsDao; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.GenericSearchBuilder; @@ -47,26 +50,35 @@ @DB() public class PrimaryDataStoreDaoImpl extends GenericDaoBase implements PrimaryDataStoreDao { - protected final SearchBuilder AllFieldSearch; - protected final SearchBuilder DcPodSearch; - protected final SearchBuilder DcPodAnyClusterSearch; - protected final SearchBuilder DeleteLvmSearch; - protected final SearchBuilder DcLocalStorageSearch; - protected final GenericSearchBuilder StatusCountSearch; + private final SearchBuilder AllFieldSearch; + private final SearchBuilder DcPodSearch; + private final SearchBuilder DcPodAnyClusterSearch; + private final SearchBuilder DeleteLvmSearch; + private final SearchBuilder DcLocalStorageSearch; + private final GenericSearchBuilder StatusCountSearch; @Inject - protected StoragePoolDetailsDao _detailsDao; + private StoragePoolDetailsDao _detailsDao; @Inject - protected StoragePoolHostDao _hostDao; - - private final String DetailsSqlPrefix = - "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_details ON storage_pool.id = storage_pool_details.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and (storage_pool.pod_id = ? or storage_pool.pod_id is null) and storage_pool.scope = ? and ("; - private final String DetailsSqlSuffix = ") GROUP BY storage_pool_details.pool_id HAVING COUNT(storage_pool_details.name) >= ?"; - private final String ZoneWideDetailsSqlPrefix = - "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_details ON storage_pool.id = storage_pool_details.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and storage_pool.scope = ? and ("; - private final String ZoneWideDetailsSqlSuffix = ") GROUP BY storage_pool_details.pool_id HAVING COUNT(storage_pool_details.name) >= ?"; - - private final String FindPoolTagDetails = "SELECT storage_pool_details.name FROM storage_pool_details WHERE pool_id = ? and value = ?"; + private StoragePoolHostDao _hostDao; + @Inject + private StoragePoolTagsDao _tagsDao; + + protected final String DetailsSqlPrefix = "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_details ON storage_pool.id = storage_pool_details.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and (storage_pool.pod_id = ? or storage_pool.pod_id is null) and storage_pool.scope = ? and ("; + protected final String DetailsSqlSuffix = ") GROUP BY storage_pool_details.pool_id HAVING COUNT(storage_pool_details.name) >= ?"; + private final String ZoneWideTagsSqlPrefix = "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_tags ON storage_pool.id = storage_pool_tags.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and storage_pool.scope = ? and ("; + private final String ZoneWideTagsSqlSuffix = ") GROUP BY storage_pool_tags.pool_id HAVING COUNT(storage_pool_tags.tag) >= ?"; + + // Storage tags are now separate from storage_pool_details, leaving only details on that table + protected final String TagsSqlPrefix = "SELECT storage_pool.* from storage_pool LEFT JOIN storage_pool_tags ON storage_pool.id = storage_pool_tags.pool_id WHERE storage_pool.removed is null and storage_pool.status = 'Up' and storage_pool.data_center_id = ? and (storage_pool.pod_id = ? or storage_pool.pod_id is null) and storage_pool.scope = ? and ("; + protected final String TagsSqlSuffix = ") GROUP BY storage_pool_tags.pool_id HAVING COUNT(storage_pool_tags.tag) >= ?"; + + /** + * Used in method findPoolsByDetailsOrTagsInternal + */ + protected enum ValueType { + DETAILS, TAGS; + } public PrimaryDataStoreDaoImpl() { AllFieldSearch = createSearchBuilder(); @@ -256,7 +268,7 @@ public StoragePoolVO listById(Integer id) { @Override @DB - public StoragePoolVO persist(StoragePoolVO pool, Map details) { + public StoragePoolVO persist(StoragePoolVO pool, Map details, List tags) { TransactionLegacy txn = TransactionLegacy.currentTxn(); txn.start(); pool = super.persist(pool); @@ -266,57 +278,119 @@ public StoragePoolVO persist(StoragePoolVO pool, Map details) { _detailsDao.persist(vo); } } + if (CollectionUtils.isNotEmpty(tags)) { + _tagsDao.persist(pool.getId(), tags); + } txn.commit(); return pool; } - @DB - @Override - public List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details, ScopeType scope) { - StringBuilder sql = new StringBuilder(DetailsSqlPrefix); - if (clusterId != null) { - sql.append("storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND ("); - } + /** + * Internal helper method to retrieve storage pools by given details or storage tags. + * @param dcId data center id + * @param podId pod id + * @param clusterId cluster id + * @param scope score + * @param sqlValues sql string containing details or storage tags values required to query + * @param valuesType enumerate to indicate if values are related to details or storage tags + * @param valuesLength values length + * @return list of storage pools matching conditions + */ + protected List findPoolsByDetailsOrTagsInternal(long dcId, long podId, Long clusterId, ScopeType scope, String sqlValues, ValueType valuesType, + int valuesLength) { + String sqlPrefix = valuesType.equals(ValueType.DETAILS) ? DetailsSqlPrefix : TagsSqlPrefix; + String sqlSuffix = valuesType.equals(ValueType.DETAILS) ? DetailsSqlSuffix : TagsSqlSuffix; + String sql = getSqlPreparedStatement(sqlPrefix, sqlSuffix, sqlValues, clusterId); + return searchStoragePoolsPreparedStatement(sql, dcId, podId, clusterId, scope, valuesLength); + } - for (Map.Entry detail : details.entrySet()) { - sql.append("((storage_pool_details.name='") - .append(detail.getKey()) - .append("') AND (storage_pool_details.value='") - .append(detail.getValue()) - .append("')) OR "); - } - sql.delete(sql.length() - 4, sql.length()); - sql.append(DetailsSqlSuffix); + /** + * Search storage pools in a transaction + * @param sql prepared statement sql + * @param dcId data center id + * @param podId pod id + * @param clusterId cluster id + * @param scope scope + * @param valuesLength values length + * @return storage pools matching criteria + */ + @DB + protected List searchStoragePoolsPreparedStatement(String sql, long dcId, Long podId, Long clusterId, ScopeType scope, int valuesLength) { TransactionLegacy txn = TransactionLegacy.currentTxn(); - try (PreparedStatement pstmt = txn.prepareStatement(sql.toString());){ - List pools = new ArrayList(); - int i = 1; - pstmt.setLong(i++, dcId); - pstmt.setLong(i++, podId); - pstmt.setString(i++, scope.toString()); - if (clusterId != null) { - pstmt.setLong(i++, clusterId); - } - pstmt.setInt(i++, details.size()); - try(ResultSet rs = pstmt.executeQuery();) { - while (rs.next()) { - pools.add(toEntityBean(rs, false)); + List pools = new ArrayList(); + try (PreparedStatement pstmt = txn.prepareStatement(sql);) { + if (pstmt != null) { + int i = 1; + pstmt.setLong(i++, dcId); + if (podId != null) { + pstmt.setLong(i++, podId); + } + pstmt.setString(i++, scope.toString()); + if (clusterId != null) { + pstmt.setLong(i++, clusterId); + } + pstmt.setInt(i++, valuesLength); + try (ResultSet rs = pstmt.executeQuery();) { + while (rs.next()) { + pools.add(toEntityBean(rs, false)); + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute :" + e.getMessage(), e); } - }catch (SQLException e) { - throw new CloudRuntimeException("Unable to execute :" + e.getMessage(), e); } - return pools; } catch (SQLException e) { throw new CloudRuntimeException("Unable to execute :" + e.getMessage(), e); } + return pools; + } + + protected String getSqlPreparedStatement(String sqlPrefix, String sqlSuffix, String sqlValues, Long clusterId) { + StringBuilder sql = new StringBuilder(sqlPrefix); + if (clusterId != null) { + sql.append("storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND ("); + } + sql.append(sqlValues); + sql.append(sqlSuffix); + return sql.toString(); + } + + /** + * Return SQL string from details, to be placed between SQL Prefix and SQL Suffix when creating storage tags PreparedStatement. + * @param details storage pool details + * @return SQL string containing storage tag values to be Prefix and Suffix when creating PreparedStatement. + * @throws NullPointerException if details is null + * @throws IndexOutOfBoundsException if details is not null, but empty + */ + protected String getSqlValuesFromDetails(Map details) { + StringBuilder sqlValues = new StringBuilder(); + for (Map.Entry detail : details.entrySet()) { + sqlValues.append("((storage_pool_details.name='").append(detail.getKey()).append("') AND (storage_pool_details.value='").append(detail.getValue()).append("')) OR "); + } + sqlValues.delete(sqlValues.length() - 4, sqlValues.length()); + return sqlValues.toString(); } - protected Map tagsToDetails(String[] tags) { - Map details = new HashMap(tags.length); + /** + * Return SQL string from storage tags, to be placed between SQL Prefix and SQL Suffix when creating storage tags PreparedStatement. + * @param tags storage tags array + * @return SQL string containing storage tag values to be placed between Prefix and Suffix when creating PreparedStatement. + * @throws NullPointerException if tags is null + * @throws IndexOutOfBoundsException if tags is not null, but empty + */ + protected String getSqlValuesFromStorageTags(String[] tags) throws NullPointerException, IndexOutOfBoundsException { + StringBuilder sqlValues = new StringBuilder(); for (String tag : tags) { - details.put(tag, "true"); + sqlValues.append("(storage_pool_tags.tag='").append(tag).append("') OR "); } - return details; + sqlValues.delete(sqlValues.length() - 4, sqlValues.length()); + return sqlValues.toString(); + } + + @DB + @Override + public List findPoolsByDetails(long dcId, long podId, Long clusterId, Map details, ScopeType scope) { + String sqlValues = getSqlValuesFromDetails(details); + return findPoolsByDetailsOrTagsInternal(dcId, podId, clusterId, scope, sqlValues, ValueType.DETAILS, details.size()); } @Override @@ -325,8 +399,8 @@ public List findPoolsByTags(long dcId, long podId, Long clusterId if (tags == null || tags.length == 0) { storagePools = listBy(dcId, podId, clusterId, ScopeType.CLUSTER); } else { - Map details = tagsToDetails(tags); - storagePools = findPoolsByDetails(dcId, podId, clusterId, details, ScopeType.CLUSTER); + String sqlValues = getSqlValuesFromStorageTags(tags); + storagePools = findPoolsByDetailsOrTagsInternal(dcId, podId, clusterId, ScopeType.CLUSTER, sqlValues, ValueType.TAGS, tags.length); } return storagePools; @@ -358,8 +432,8 @@ public List findLocalStoragePoolsByTags(long dcId, long podId, Lo if (tags == null || tags.length == 0) { storagePools = listBy(dcId, podId, clusterId, ScopeType.HOST); } else { - Map details = tagsToDetails(tags); - storagePools = findPoolsByDetails(dcId, podId, clusterId, details, ScopeType.HOST); + String sqlValues = getSqlValuesFromStorageTags(tags); + storagePools = findPoolsByDetailsOrTagsInternal(dcId, podId, clusterId, ScopeType.HOST, sqlValues, ValueType.TAGS, tags.length); } return storagePools; @@ -369,7 +443,8 @@ public List findLocalStoragePoolsByTags(long dcId, long podId, Lo public List findLocalStoragePoolsByHostAndTags(long hostId, String[] tags) { SearchBuilder hostSearch = createSearchBuilder(); SearchBuilder hostPoolSearch = _hostDao.createSearchBuilder(); - SearchBuilder tagPoolSearch = _detailsDao.createSearchBuilder();; + SearchBuilder tagPoolSearch = _tagsDao.createSearchBuilder(); + ; // Search for pools on the host hostPoolSearch.and("hostId", hostPoolSearch.entity().getHostId(), Op.EQ); @@ -379,22 +454,19 @@ public List findLocalStoragePoolsByHostAndTags(long hostId, Strin hostSearch.and("status", hostSearch.entity().getStatus(), Op.EQ); hostSearch.join("hostJoin", hostPoolSearch, hostSearch.entity().getId(), hostPoolSearch.entity().getPoolId(), JoinBuilder.JoinType.INNER); - if (!(tags == null || tags.length == 0 )) { - tagPoolSearch.and("name", tagPoolSearch.entity().getName(), Op.EQ); - tagPoolSearch.and("value", tagPoolSearch.entity().getValue(), Op.EQ); - hostSearch.join("tagJoin", tagPoolSearch, hostSearch.entity().getId(), tagPoolSearch.entity().getResourceId(), JoinBuilder.JoinType.INNER); + if (!(tags == null || tags.length == 0)) { + tagPoolSearch.and("tag", tagPoolSearch.entity().getTag(), Op.EQ); + hostSearch.join("tagJoin", tagPoolSearch, hostSearch.entity().getId(), tagPoolSearch.entity().getPoolId(), JoinBuilder.JoinType.INNER); } SearchCriteria sc = hostSearch.create(); - sc.setJoinParameters("hostJoin", "hostId", hostId ); + sc.setJoinParameters("hostJoin", "hostId", hostId); sc.setParameters("scope", ScopeType.HOST.toString()); sc.setParameters("status", Status.Up.toString()); - if (!(tags == null || tags.length == 0 )) { - Map details = tagsToDetails(tags); - for (Map.Entry detail : details.entrySet()) { - sc.setJoinParameters("tagJoin","name", detail.getKey()); - sc.setJoinParameters("tagJoin", "value", detail.getValue()); + if (!(tags == null || tags.length == 0)) { + for (String tag : tags) { + sc.setJoinParameters("tagJoin", "tag", tag); } } return listBy(sc); @@ -409,68 +481,15 @@ public List findZoneWideStoragePoolsByTags(long dcId, String[] ta sc.and(sc.entity().getScope(), Op.EQ, ScopeType.ZONE); return sc.list(); } else { - Map details = tagsToDetails(tags); - - StringBuilder sql = new StringBuilder(ZoneWideDetailsSqlPrefix); - - for (int i=0;i pools = new ArrayList(); - if (pstmt != null) { - int i = 1; - - pstmt.setLong(i++, dcId); - pstmt.setString(i++, ScopeType.ZONE.toString()); - - for (Map.Entry detail : details.entrySet()) { - pstmt.setString(i++, detail.getKey()); - pstmt.setString(i++, detail.getValue()); - } - - pstmt.setInt(i++, details.size()); - - try(ResultSet rs = pstmt.executeQuery();) { - while (rs.next()) { - pools.add(toEntityBean(rs, false)); - } - }catch (SQLException e) { - throw new CloudRuntimeException("findZoneWideStoragePoolsByTags:Exception:" + e.getMessage(), e); - } - } - return pools; - } catch (SQLException e) { - throw new CloudRuntimeException("findZoneWideStoragePoolsByTags:Exception:" + e.getMessage(), e); - } + String sqlValues = getSqlValuesFromStorageTags(tags); + String sql = getSqlPreparedStatement(ZoneWideTagsSqlPrefix, ZoneWideTagsSqlSuffix, sqlValues, null); + return searchStoragePoolsPreparedStatement(sql, dcId, null, null, ScopeType.ZONE, tags.length); } } @Override - @DB - public List searchForStoragePoolDetails(long poolId, String value) { - StringBuilder sql = new StringBuilder(FindPoolTagDetails); - TransactionLegacy txn = TransactionLegacy.currentTxn(); - List tags = new ArrayList(); - try(PreparedStatement pstmt = txn.prepareStatement(sql.toString());) { - if (pstmt != null) { - pstmt.setLong(1, poolId); - pstmt.setString(2, value); - try(ResultSet rs = pstmt.executeQuery();) { - while (rs.next()) { - tags.add(rs.getString("name")); - } - }catch (SQLException e) { - throw new CloudRuntimeException("searchForStoragePoolDetails:Exception:" + e.getMessage(), e); - } - } - return tags; - } catch (SQLException e) { - throw new CloudRuntimeException("searchForStoragePoolDetails:Exception:" + e.getMessage(), e); - } + public List searchForStoragePoolTags(long poolId) { + return _tagsDao.getStoragePoolTags(poolId); } @Override @@ -481,7 +500,7 @@ public void updateDetails(long poolId, Map details) { detailsVO.add(new StoragePoolDetailVO(poolId, key, details.get(key), true)); } _detailsDao.saveDetails(detailsVO); - if(details.size() == 0) { + if (details.size() == 0) { _detailsDao.removeDetails(poolId); } } @@ -530,4 +549,9 @@ public List findZoneWideStoragePoolsByHypervisor(long dataCenterI sc.and(sc.entity().getHypervisor(), Op.EQ, hypervisorType); return sc.list(); } + + @Override + public void deletePoolTags(long poolId) { + _tagsDao.deleteTags(poolId); + } } diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java index 4b83e312c7b3..20cff5671b7d 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java @@ -63,4 +63,5 @@ public interface SnapshotDataStoreDao extends GenericDao listByState(ObjectInDataStoreStateMachine.State... states); } diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java index ad2ad4187702..24fcaa03f56c 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/StoragePoolVO.java @@ -231,6 +231,7 @@ public void setManaged(boolean managed) { this.managed = managed; } + @Override public boolean isManaged() { return managed; } diff --git a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java index 4da779c42a7a..a6e609e7d870 100644 --- a/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java +++ b/engine/schema/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java @@ -83,4 +83,10 @@ public interface TemplateDataStoreDao extends GenericDao listByTemplateState(VirtualMachineTemplate.State... states); + + TemplateDataStoreVO createTemplateDirectDownloadEntry(long templateId, Long size); + + TemplateDataStoreVO getReadyBypassedTemplate(long templateId); + + boolean isTemplateMarkedForDirectDownload(long templateId); } diff --git a/engine/schema/test/com/cloud/storage/dao/StoragePoolTagsDaoImplTest.java b/engine/schema/test/com/cloud/storage/dao/StoragePoolTagsDaoImplTest.java new file mode 100755 index 000000000000..dcbd665a57db --- /dev/null +++ b/engine/schema/test/com/cloud/storage/dao/StoragePoolTagsDaoImplTest.java @@ -0,0 +1,128 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.storage.dao; + +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Matchers; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.Spy; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.cloud.storage.StoragePoolTagVO; +import com.cloud.utils.db.Filter; +import com.cloud.utils.db.SearchBuilder; +import com.cloud.utils.db.SearchCriteria; + +import static org.mockito.Mockito.when; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.doNothing; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import junit.framework.TestCase; + +@RunWith(PowerMockRunner.class) +public class StoragePoolTagsDaoImplTest extends TestCase { + + @Mock + ConfigurationDao _configDao; + @Mock + SearchBuilder StoragePoolIdsSearch; + + @Spy + @InjectMocks + private StoragePoolTagsDaoImpl _storagePoolTagsDaoImpl = new StoragePoolTagsDaoImpl(); + + @Mock + StoragePoolTagVO storagePoolTag1; + @Mock + StoragePoolTagVO storagePoolTag2; + + private final String batchSizeConfigurationKey = "detail.batch.query.size"; + private final String batchSizeValue = "2800"; + private final String batchSizeDefaultValue = "2000"; + private final String batchSizeLow = "2"; + + private final Long[] storageTagsIds = {1l,2l,3l,4l,5l}; + private final List storagePoolTagList = Arrays.asList(storagePoolTag1, storagePoolTag2); + + @Before + public void setup() { + when(_configDao.getValue(batchSizeConfigurationKey)).thenReturn(batchSizeValue); + doReturn(storagePoolTagList).when(_storagePoolTagsDaoImpl).searchIncludingRemoved( + Matchers.any(SearchCriteria.class), Matchers.isNull(Filter.class), Matchers.isNull(Boolean.class), Matchers.eq(false)); + } + + @Test + public void testGetDetailsBatchSizeNotNull() { + assertEquals(Integer.parseInt(batchSizeValue), _storagePoolTagsDaoImpl.getDetailsBatchSize()); + } + + @Test + public void testGetDetailsBatchSizeNull() { + when(_configDao.getValue(batchSizeConfigurationKey)).thenReturn(null); + assertEquals(Integer.parseInt(batchSizeDefaultValue), _storagePoolTagsDaoImpl.getDetailsBatchSize()); + } + + @Test + public void testSearchForStoragePoolIdsInternalStorageTagsNotNullSearch() { + List storagePoolTags = new ArrayList(); + + _storagePoolTagsDaoImpl.searchForStoragePoolIdsInternal(0, storageTagsIds.length, storageTagsIds, storagePoolTags); + verify(_storagePoolTagsDaoImpl).searchIncludingRemoved(Matchers.any(SearchCriteria.class), Matchers.isNull(Filter.class), Matchers.isNull(Boolean.class), Matchers.eq(false)); + assertEquals(2, storagePoolTags.size()); + } + + @Test + public void testSearchForStoragePoolIdsInternalStorageTagsNullSearch() { + List storagePoolTags = new ArrayList(); + doReturn(null).when(_storagePoolTagsDaoImpl).searchIncludingRemoved( + Matchers.any(SearchCriteria.class), Matchers.isNull(Filter.class), Matchers.isNull(Boolean.class), Matchers.eq(false)); + + _storagePoolTagsDaoImpl.searchForStoragePoolIdsInternal(0, storageTagsIds.length, storageTagsIds, storagePoolTags); + verify(_storagePoolTagsDaoImpl).searchIncludingRemoved(Matchers.any(SearchCriteria.class), Matchers.isNull(Filter.class), Matchers.isNull(Boolean.class), Matchers.eq(false)); + assertEquals(0, storagePoolTags.size()); + } + + @Test + public void testSearchByIdsStorageTagsIdsGreaterOrEqualThanBatchSize() { + when(_configDao.getValue(batchSizeConfigurationKey)).thenReturn(batchSizeLow); + doNothing().when(_storagePoolTagsDaoImpl).searchForStoragePoolIdsInternal(Matchers.anyInt(), Matchers.anyInt(), Matchers.any(Long[].class), Matchers.anyList()); + _storagePoolTagsDaoImpl.searchByIds(storageTagsIds); + + int batchSize = Integer.parseInt(batchSizeLow); + int difference = storageTagsIds.length - 2 * batchSize; + verify(_storagePoolTagsDaoImpl, Mockito.times(2)).searchForStoragePoolIdsInternal(Matchers.anyInt(), Matchers.eq(batchSize), Matchers.any(Long[].class), Matchers.anyList()); + verify(_storagePoolTagsDaoImpl).searchForStoragePoolIdsInternal(Matchers.eq(2 * batchSize), Matchers.eq(difference), Matchers.any(Long[].class), Matchers.anyList()); + } + + @Test + public void testSearchByIdsStorageTagsIdsLowerThanBatchSize() { + doNothing().when(_storagePoolTagsDaoImpl).searchForStoragePoolIdsInternal(Matchers.anyInt(), Matchers.anyInt(), Matchers.any(Long[].class), Matchers.anyList()); + _storagePoolTagsDaoImpl.searchByIds(storageTagsIds); + + verify(_storagePoolTagsDaoImpl).searchForStoragePoolIdsInternal(Matchers.eq(0), Matchers.eq(storageTagsIds.length), Matchers.any(Long[].class), Matchers.anyList()); + } +} diff --git a/engine/schema/test/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java b/engine/schema/test/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java index 0b210872ff52..15bfd8a623aa 100644 --- a/engine/schema/test/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java +++ b/engine/schema/test/com/cloud/upgrade/DatabaseUpgradeCheckerTest.java @@ -24,6 +24,7 @@ import com.cloud.upgrade.dao.Upgrade471to480; import com.cloud.upgrade.dao.Upgrade480to481; import com.cloud.upgrade.dao.Upgrade490to4910; +import com.cloud.upgrade.dao.Upgrade41100to41110; import org.apache.cloudstack.utils.CloudStackVersion; import org.junit.Test; @@ -74,6 +75,28 @@ public void testCalculateUpgradePath490to4910() { } + @Test + public void testCalculateUpgradePath4110to4111() { + + final CloudStackVersion dbVersion = CloudStackVersion.parse("4.11.0.0"); + assertNotNull(dbVersion); + + final CloudStackVersion currentVersion = CloudStackVersion.parse("4.11.1.0"); + assertNotNull(currentVersion); + + final DatabaseUpgradeChecker checker = new DatabaseUpgradeChecker(); + final DbUpgrade[] upgrades = checker.calculateUpgradePath(dbVersion, currentVersion); + + assertNotNull(upgrades); + assertTrue(upgrades.length >= 1); + assertTrue(upgrades[0] instanceof Upgrade41100to41110); + + assertTrue(Arrays.equals(new String[] { "4.11.0.0", currentVersion.toString()}, + upgrades[0].getUpgradableVersionRange())); + assertEquals(currentVersion.toString(), upgrades[0].getUpgradedVersion()); + + } + @Test public void testFindUpgradePath470to481() { diff --git a/engine/schema/test/com/cloud/vm/dao/VMInstanceDaoImplTest.java b/engine/schema/test/com/cloud/vm/dao/VMInstanceDaoImplTest.java index 767b41420b72..95a57ed582f3 100644 --- a/engine/schema/test/com/cloud/vm/dao/VMInstanceDaoImplTest.java +++ b/engine/schema/test/com/cloud/vm/dao/VMInstanceDaoImplTest.java @@ -68,3 +68,5 @@ public void testIfStateAndHostUnchanged() throws Exception { } } + + diff --git a/engine/schema/test/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImplTest.java b/engine/schema/test/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImplTest.java new file mode 100755 index 000000000000..2d195af0843f --- /dev/null +++ b/engine/schema/test/org/apache/cloudstack/storage/datastore/db/PrimaryDataStoreDaoImplTest.java @@ -0,0 +1,152 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.storage.datastore.db; + +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.verify; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDaoImpl.ValueType; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Matchers; +import org.mockito.Mock; +import org.mockito.Spy; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.cloud.storage.ScopeType; +import com.cloud.storage.dao.StoragePoolHostDao; +import com.cloud.storage.dao.StoragePoolTagsDao; + +import junit.framework.TestCase; + +@RunWith(PowerMockRunner.class) +public class PrimaryDataStoreDaoImplTest extends TestCase { + + @Mock + StoragePoolDetailsDao _detailsDao; + @Mock + StoragePoolHostDao _hostDao; + @Mock + StoragePoolTagsDao _tagsDao; + + @Spy + @InjectMocks + private static PrimaryDataStoreDaoImpl primaryDataStoreDao = new PrimaryDataStoreDaoImpl(); + + @Mock + StoragePoolVO storagePoolVO; + + private static final String STORAGE_TAG_1 = "NFS-A"; + private static final String STORAGE_TAG_2 = "NFS-B"; + private static final String[] STORAGE_TAGS_ARRAY = {STORAGE_TAG_1, STORAGE_TAG_2}; + + private static final String DETAIL_KEY = "storage.overprovisioning.factor"; + private static final String DETAIL_VALUE = "2.0"; + private static final Map STORAGE_POOL_DETAILS = new HashMap<>(); + + private static final String EXPECTED_RESULT_SQL_STORAGE_TAGS = "(storage_pool_tags.tag='" + STORAGE_TAG_1 + "') OR (storage_pool_tags.tag='" + STORAGE_TAG_2 + "')"; + private static final String EXPECTED_RESULT_SQL_DETAILS = "((storage_pool_details.name='" + DETAIL_KEY + "') AND (storage_pool_details.value='" + DETAIL_VALUE +"'))"; + + private static final String SQL_PREFIX = "XXXXXXXXXXXXXXXX"; + private static final String SQL_SUFFIX = "ZZZZZZZZZZZZZZZZ"; + private static final String SQL_VALUES = "YYYYYYYYYYYYYYYY"; + + private static final Long DATACENTER_ID = 1l; + private static final Long POD_ID = 1l; + private static final Long CLUSTER_ID = null; + private static final ScopeType SCOPE = ScopeType.ZONE; + + @Before + public void setup() { + STORAGE_POOL_DETAILS.put(DETAIL_KEY, DETAIL_VALUE); + doReturn(Arrays.asList(storagePoolVO)).when(primaryDataStoreDao). + searchStoragePoolsPreparedStatement(Matchers.anyString(), Matchers.anyLong(), Matchers.anyLong(), Matchers.anyLong(), + Matchers.any(ScopeType.class), Matchers.anyInt()); + } + + @Test + public void testGetSqlValuesFromStorageTagsNotNullStorageTags() { + assertEquals(EXPECTED_RESULT_SQL_STORAGE_TAGS, primaryDataStoreDao.getSqlValuesFromStorageTags(STORAGE_TAGS_ARRAY)); + } + + @Test(expected=NullPointerException.class) + public void testGetSqlValuesFromStorageTagsNullStorageTags() { + primaryDataStoreDao.getSqlValuesFromStorageTags(null); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testGetSqlValuesFromStorageTagsEmptyStorageTags() { + String[] emptyStorageTags = {}; + primaryDataStoreDao.getSqlValuesFromStorageTags(emptyStorageTags); + } + + @Test + public void testGetSqlValuesFromDetailsNotNullDetails() { + assertEquals(EXPECTED_RESULT_SQL_DETAILS, primaryDataStoreDao.getSqlValuesFromDetails(STORAGE_POOL_DETAILS)); + } + + @Test(expected=NullPointerException.class) + public void testGetSqlValuesFromDetailsNullDetails() { + primaryDataStoreDao.getSqlValuesFromDetails(null); + } + + @Test(expected=IndexOutOfBoundsException.class) + public void testGetSqlValuesFromDetailsEmptyDetailss() { + Map emptyDetails = new HashMap(); + primaryDataStoreDao.getSqlValuesFromDetails(emptyDetails); + } + + @Test + public void testGetSqlPreparedStatementNullClusterId() { + String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, null); + assertEquals(SQL_PREFIX + SQL_VALUES + SQL_SUFFIX, sqlPreparedStatement); + } + + @Test + public void testGetSqlPreparedStatementNotNullClusterId() { + String clusterSql = "storage_pool.cluster_id = ? OR storage_pool.cluster_id IS NULL) AND ("; + String sqlPreparedStatement = primaryDataStoreDao.getSqlPreparedStatement(SQL_PREFIX, SQL_SUFFIX, SQL_VALUES, 1l); + assertEquals(SQL_PREFIX + clusterSql + SQL_VALUES + SQL_SUFFIX, sqlPreparedStatement); + } + + @Test + public void testFindPoolsByDetailsOrTagsInternalStorageTagsType() { + List storagePools = primaryDataStoreDao.findPoolsByDetailsOrTagsInternal(DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, SQL_VALUES, ValueType.TAGS, STORAGE_TAGS_ARRAY.length); + assertEquals(Arrays.asList(storagePoolVO), storagePools); + verify(primaryDataStoreDao).getSqlPreparedStatement( + primaryDataStoreDao.TagsSqlPrefix, primaryDataStoreDao.TagsSqlSuffix, SQL_VALUES, CLUSTER_ID); + String expectedSql = primaryDataStoreDao.TagsSqlPrefix + SQL_VALUES + primaryDataStoreDao.TagsSqlSuffix; + verify(primaryDataStoreDao).searchStoragePoolsPreparedStatement(expectedSql, DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, STORAGE_TAGS_ARRAY.length); + } + + @Test + public void testFindPoolsByDetailsOrTagsInternalDetailsType() { + List storagePools = primaryDataStoreDao.findPoolsByDetailsOrTagsInternal(DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, SQL_VALUES, ValueType.DETAILS, STORAGE_POOL_DETAILS.size()); + assertEquals(Arrays.asList(storagePoolVO), storagePools); + verify(primaryDataStoreDao).getSqlPreparedStatement( + primaryDataStoreDao.DetailsSqlPrefix, primaryDataStoreDao.DetailsSqlSuffix, SQL_VALUES, CLUSTER_ID); + String expectedSql = primaryDataStoreDao.DetailsSqlPrefix + SQL_VALUES + primaryDataStoreDao.DetailsSqlSuffix; + verify(primaryDataStoreDao).searchStoragePoolsPreparedStatement(expectedSql, DATACENTER_ID, POD_ID, CLUSTER_ID, SCOPE, STORAGE_POOL_DETAILS.size()); + } +} diff --git a/engine/schema/test/resources/db.properties b/engine/schema/test/resources/db.properties index 49fd68aa933e..5571ad9cc967 100644 --- a/engine/schema/test/resources/db.properties +++ b/engine/schema/test/resources/db.properties @@ -19,7 +19,7 @@ # management server clustering parameters, change cluster.node.IP to the machine IP address -# in which the management server(Tomcat) is running +# in which the management server is running cluster.node.IP=127.0.0.1 cluster.servlet.port=9090 region.id=1 diff --git a/engine/service/pom.xml b/engine/service/pom.xml index 6bcf01ec4056..2dc7dc857782 100644 --- a/engine/service/pom.xml +++ b/engine/service/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT cloud-engine-service war diff --git a/engine/service/src/main/webapp/WEB-INF/log4j.xml b/engine/service/src/main/webapp/WEB-INF/log4j.xml index df46461f9724..19d48b47e836 100644 --- a/engine/service/src/main/webapp/WEB-INF/log4j.xml +++ b/engine/service/src/main/webapp/WEB-INF/log4j.xml @@ -25,17 +25,7 @@ - - + @@ -46,4 +36,4 @@ - \ No newline at end of file + diff --git a/engine/service/src/main/webapp/WEB-INF/web.xml b/engine/service/src/main/webapp/WEB-INF/web.xml index c5bb44f0f151..e7663cea39e8 100644 --- a/engine/service/src/main/webapp/WEB-INF/web.xml +++ b/engine/service/src/main/webapp/WEB-INF/web.xml @@ -31,9 +31,6 @@ org.springframework.web.context.ContextLoaderListener - - org.springframework.web.util.Log4jConfigListener - CXF Servlet CXFServlet diff --git a/engine/storage/cache/pom.xml b/engine/storage/cache/pom.xml index ab99e55e6082..f0de47279cd3 100644 --- a/engine/storage/cache/pom.xml +++ b/engine/storage/cache/pom.xml @@ -15,7 +15,7 @@ org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/engine/storage/cache/resources/META-INF/cloudstack/core/spring-engine-storage-cache-core-context.xml b/engine/storage/cache/resources/META-INF/cloudstack/core/spring-engine-storage-cache-core-context.xml index 7b8e2a4ab2c7..f98b06da2a8e 100644 --- a/engine/storage/cache/resources/META-INF/cloudstack/core/spring-engine-storage-cache-core-context.xml +++ b/engine/storage/cache/resources/META-INF/cloudstack/core/spring-engine-storage-cache-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > + + 4.0.0 + cloud-engine-storage-configdrive + Apache CloudStack Framework - Storage Config Drive Component + + org.apache.cloudstack + cloud-engine + 4.11.1.0-SNAPSHOT + ../../pom.xml + + + + + org.apache.cloudstack + cloud-api + ${project.version} + + + org.apache.cloudstack + cloud-core + ${project.version} + + + + diff --git a/engine/storage/configdrive/src/org/apache/cloudstack/storage/configdrive/ConfigDrive.java b/engine/storage/configdrive/src/org/apache/cloudstack/storage/configdrive/ConfigDrive.java new file mode 100644 index 000000000000..2fbc590c2754 --- /dev/null +++ b/engine/storage/configdrive/src/org/apache/cloudstack/storage/configdrive/ConfigDrive.java @@ -0,0 +1,45 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.storage.configdrive; + +public class ConfigDrive { + + public final static String CONFIGDRIVEDIR = "configdrive"; + + public static final String cloudStackConfigDriveName = "/cloudstack/"; + public static final String openStackConfigDriveName = "/openstack/latest/"; + + /** + * Creates the path to ISO file relative to mount point. + * The config driver path will have the following format: {@link #CONFIGDRIVEDIR} + / + instanceName + ".iso" + * + * @return config drive ISO file path + */ + public static String createConfigDrivePath(String instanceName) { + return ConfigDrive.CONFIGDRIVEDIR + "/" + configIsoFileName(instanceName); + } + + /** + * Config Drive iso file name for an instance name + * @param instanceName + * @return + */ + public static String configIsoFileName(String instanceName) { + return instanceName + ".iso"; + } +} \ No newline at end of file diff --git a/engine/storage/configdrive/src/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java b/engine/storage/configdrive/src/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java new file mode 100644 index 000000000000..0675b43cb4a1 --- /dev/null +++ b/engine/storage/configdrive/src/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilder.java @@ -0,0 +1,319 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.storage.configdrive; + +import static com.cloud.network.NetworkModel.CONFIGDATA_CONTENT; +import static com.cloud.network.NetworkModel.CONFIGDATA_DIR; +import static com.cloud.network.NetworkModel.CONFIGDATA_FILE; +import static com.cloud.network.NetworkModel.PASSWORD_FILE; +import static com.cloud.network.NetworkModel.USERDATA_FILE; + +import java.io.File; +import java.io.IOException; +import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; +import java.util.List; + +import org.apache.commons.codec.binary.Base64; +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.joda.time.Duration; + +import com.cloud.network.NetworkModel; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; + +public class ConfigDriveBuilder { + + public static final Logger LOG = Logger.getLogger(ConfigDriveBuilder.class); + + /** + * Writes a content {@link String} to a file that is going to be created in a folder. We will not append to the file if it already exists. Therefore, its content will be overwritten. + * Moreover, the charset used is {@link com.cloud.utils.StringUtils#getPreferredCharset()}. + * + * We expect the folder object and the file not to be null/empty. + */ + static void writeFile(File folder, String file, String content) { + try { + FileUtils.write(new File(folder, file), content, com.cloud.utils.StringUtils.getPreferredCharset(), false); + } catch (IOException ex) { + throw new CloudRuntimeException("Failed to create config drive file " + file, ex); + } + } + + /** + * Read the content of a {@link File} and convert it to a String in base 64. + * We expect the content of the file to be encoded using {@link StandardCharsets#US_ASC} + */ + public static String fileToBase64String(File isoFile) throws IOException { + byte[] encoded = Base64.encodeBase64(FileUtils.readFileToByteArray(isoFile)); + return new String(encoded, StandardCharsets.US_ASCII); + } + + /** + * Writes a String encoded in base 64 to a file in the given folder. + * The content will be decoded and then written to the file. Be aware that we will overwrite the content of the file if it already exists. + * Moreover, the content will must be encoded in {@link StandardCharsets#US_ASCII} before it is encoded in base 64. + */ + public static File base64StringToFile(String encodedIsoData, String folder, String fileName) throws IOException { + byte[] decoded = Base64.decodeBase64(encodedIsoData.getBytes(StandardCharsets.US_ASCII)); + Path destPath = Paths.get(folder, fileName); + try { + Files.createDirectories(destPath.getParent()); + } catch (final IOException e) { + LOG.warn("Exception hit while trying to recreate directory: " + destPath.getParent().toString()); + } + return Files.write(destPath, decoded).toFile(); + } + + /** + * This method will build the metadata files required by OpenStack driver. Then, an ISO is going to be generated and returned as a String in base 64. + * If vmData is null, we throw a {@link CloudRuntimeException}. Moreover, {@link IOException} are captured and re-thrown as {@link CloudRuntimeException}. + */ + public static String buildConfigDrive(List vmData, String isoFileName, String driveLabel) { + if (vmData == null) { + throw new CloudRuntimeException("No VM metadata provided"); + } + + Path tempDir = null; + String tempDirName = null; + try { + tempDir = Files.createTempDirectory(ConfigDrive.CONFIGDRIVEDIR); + tempDirName = tempDir.toString(); + + File openStackFolder = new File(tempDirName + ConfigDrive.openStackConfigDriveName); + + writeVendorAndNetworkEmptyJsonFile(openStackFolder); + writeVmMetadata(vmData, tempDirName, openStackFolder); + + linkUserData(tempDirName); + + return generateAndRetrieveIsoAsBase64Iso(isoFileName, driveLabel, tempDirName); + } catch (IOException e) { + throw new CloudRuntimeException("Failed due to", e); + } finally { + deleteTempDir(tempDir); + } + } + + private static void deleteTempDir(Path tempDir) { + try { + if (tempDir != null) { + FileUtils.deleteDirectory(tempDir.toFile()); + } + } catch (IOException ioe) { + LOG.warn("Failed to delete ConfigDrive temporary directory: " + tempDir.toString(), ioe); + } + } + + /** + * Generates the ISO file that has the tempDir content. + * + * Max allowed file size of config drive is 64MB [1]. Therefore, if the ISO is bigger than that, we throw a {@link CloudRuntimeException}. + * [1] https://docs.openstack.org/project-install-guide/baremetal/draft/configdrive.html + */ + static String generateAndRetrieveIsoAsBase64Iso(String isoFileName, String driveLabel, String tempDirName) throws IOException { + File tmpIsoStore = new File(tempDirName, isoFileName); + Script command = new Script(getProgramToGenerateIso(), Duration.standardSeconds(300), LOG); + command.add("-o", tmpIsoStore.getAbsolutePath()); + command.add("-ldots"); + command.add("-allow-lowercase"); + command.add("-allow-multidot"); + command.add("-cache-inodes"); // Enable caching inode and device numbers to find hard links to files. + command.add("-l"); + command.add("-quiet"); + command.add("-J"); + command.add("-r"); + command.add("-V", driveLabel); + command.add(tempDirName); + LOG.debug("Executing config drive creation command: " + command.toString()); + String result = command.execute(); + if (StringUtils.isNotBlank(result)) { + String errMsg = "Unable to create iso file: " + isoFileName + " due to ge" + result; + LOG.warn(errMsg); + throw new CloudRuntimeException(errMsg); + } + File tmpIsoFile = new File(tmpIsoStore.getAbsolutePath()); + if (tmpIsoFile.length() > (64L * 1024L * 1024L)) { + throw new CloudRuntimeException("Config drive file exceeds maximum allowed size of 64MB"); + } + return fileToBase64String(tmpIsoFile); + } + + /** + * Checks if the 'genisoimage' or 'mkisofs' is available and return the full qualified path for the program. + * The path checked are the following: + *
    + *
  • /usr/bin/genisoimage + *
  • /usr/bin/mkisofs + *
/usr/local/bin/mkisofs + */ + static String getProgramToGenerateIso() throws IOException { + File isoCreator = new File("/usr/bin/genisoimage"); + if (!isoCreator.exists()) { + isoCreator = new File("/usr/bin/mkisofs"); + if (!isoCreator.exists()) { + isoCreator = new File("/usr/local/bin/mkisofs"); + } + } + if (!isoCreator.exists()) { + throw new CloudRuntimeException("Cannot create iso for config drive using any know tool. Known paths [/usr/bin/genisoimage, /usr/bin/mkisofs, /usr/local/bin/mkisofs]"); + } + if (!isoCreator.canExecute()) { + throw new CloudRuntimeException("Cannot create iso for config drive using: " + isoCreator.getCanonicalPath()); + } + return isoCreator.getCanonicalPath(); + } + + /** + * First we generate a JSON object using {@link #createJsonObjectWithVmData(List, String)}, then we write it to a file called "meta_data.json". + */ + static void writeVmMetadata(List vmData, String tempDirName, File openStackFolder) { + JsonObject metaData = createJsonObjectWithVmData(vmData, tempDirName); + writeFile(openStackFolder, "meta_data.json", metaData.toString()); + } + + /** + * Writes the following empty JSON files: + *
    + *
  • vendor_data.json + *
  • network_data.json + *
+ * + * If the folder does not exist and we cannot create it, we throw a {@link CloudRuntimeException}. + */ + static void writeVendorAndNetworkEmptyJsonFile(File openStackFolder) { + if (openStackFolder.exists() || openStackFolder.mkdirs()) { + writeFile(openStackFolder, "vendor_data.json", "{}"); + writeFile(openStackFolder, "network_data.json", "{}"); + } else { + throw new CloudRuntimeException("Failed to create folder " + openStackFolder); + } + } + + /** + * Creates the {@link JsonObject} with VM's metadata. The vmData is a list of arrays; we expect this list to have the following entries: + *
    + *
  • [0]: config data type + *
  • [1]: config data file name + *
  • [2]: config data file content + *
+ */ + static JsonObject createJsonObjectWithVmData(List vmData, String tempDirName) { + JsonObject metaData = new JsonObject(); + for (String[] item : vmData) { + String dataType = item[CONFIGDATA_DIR]; + String fileName = item[CONFIGDATA_FILE]; + String content = item[CONFIGDATA_CONTENT]; + LOG.debug(String.format("[createConfigDriveIsoForVM] dataType=%s, filename=%s, content=%s", dataType, fileName, (PASSWORD_FILE.equals(fileName) ? "********" : content))); + + createFileInTempDirAnAppendOpenStackMetadataToJsonObject(tempDirName, metaData, dataType, fileName, content); + } + return metaData; + } + + static void createFileInTempDirAnAppendOpenStackMetadataToJsonObject(String tempDirName, JsonObject metaData, String dataType, String fileName, String content) { + if (StringUtils.isBlank(dataType)) { + return; + } + //create folder + File typeFolder = new File(tempDirName + ConfigDrive.cloudStackConfigDriveName + dataType); + if (!typeFolder.exists() && !typeFolder.mkdirs()) { + throw new CloudRuntimeException("Failed to create folder: " + typeFolder); + } + if (StringUtils.isNotBlank(content)) { + File file = new File(typeFolder, fileName + ".txt"); + try { + if (fileName.equals(USERDATA_FILE)) { + // User Data is passed as a base64 encoded string + FileUtils.writeByteArrayToFile(file, Base64.decodeBase64(content)); + } else { + FileUtils.write(file, content, com.cloud.utils.StringUtils.getPreferredCharset()); + } + } catch (IOException ex) { + throw new CloudRuntimeException("Failed to create file ", ex); + } + } + + //now write the file to the OpenStack directory + buildOpenStackMetaData(metaData, dataType, fileName, content); + } + + /** + * Hard link the user_data.txt file with the user_data file in the OpenStack directory. + */ + static void linkUserData(String tempDirName) { + String userDataFilePath = tempDirName + ConfigDrive.cloudStackConfigDriveName + "userdata/user_data.txt"; + File file = new File(userDataFilePath); + if (file.exists()) { + Script hardLink = new Script("ln", Duration.standardSeconds(300), LOG); + hardLink.add(userDataFilePath); + hardLink.add(tempDirName + ConfigDrive.openStackConfigDriveName + "user_data"); + LOG.debug("execute command: " + hardLink.toString()); + + String executionResult = hardLink.execute(); + if (StringUtils.isNotBlank(executionResult)) { + throw new CloudRuntimeException("Unable to create user_data link due to " + executionResult); + } + } + } + + private static JsonArray arrayOf(JsonElement... elements) { + JsonArray array = new JsonArray(); + for (JsonElement element : elements) { + array.add(element); + } + return array; + } + + private static void buildOpenStackMetaData(JsonObject metaData, String dataType, String fileName, String content) { + if (!NetworkModel.METATDATA_DIR.equals(dataType)) { + return; + } + if (StringUtils.isEmpty(content)) { + return; + } + //keys are a special case in OpenStack format + if (NetworkModel.PUBLIC_KEYS_FILE.equals(fileName)) { + String[] keyArray = content.replace("\\n", "").split(" "); + String keyName = "key"; + if (keyArray.length > 3 && StringUtils.isNotEmpty(keyArray[2])) { + keyName = keyArray[2]; + } + + JsonObject keyLegacy = new JsonObject(); + keyLegacy.addProperty("type", "ssh"); + keyLegacy.addProperty("data", content.replace("\\n", "")); + keyLegacy.addProperty("name", keyName); + metaData.add("keys", arrayOf(keyLegacy)); + + JsonObject key = new JsonObject(); + key.addProperty(keyName, content); + metaData.add("public_keys", key); + } else if (NetworkModel.openStackFileMapping.get(fileName) != null) { + metaData.addProperty(NetworkModel.openStackFileMapping.get(fileName), content); + } + } + +} diff --git a/engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilderTest.java b/engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilderTest.java new file mode 100644 index 000000000000..96032738edcb --- /dev/null +++ b/engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveBuilderTest.java @@ -0,0 +1,497 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.storage.configdrive; + +import static org.mockito.Mockito.times; + +import java.io.File; +import java.io.IOException; +import java.lang.reflect.Method; +import java.nio.charset.Charset; +import java.nio.charset.StandardCharsets; +import java.util.ArrayList; +import java.util.List; + +import org.apache.commons.io.FileUtils; +import org.apache.commons.lang.StringUtils; +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InOrder; +import org.mockito.Mockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; +import org.reflections.ReflectionUtils; + +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; +import com.google.gson.JsonObject; + +@RunWith(PowerMockRunner.class) +@PrepareForTest({FileUtils.class}) +public class ConfigDriveBuilderTest { + + @Test + public void writeFileTest() throws Exception { + PowerMockito.mockStatic(FileUtils.class); + + ConfigDriveBuilder.writeFile(new File("folder"), "subfolder", "content"); + + PowerMockito.verifyStatic(); + FileUtils.write(Mockito.any(File.class), Mockito.anyString(), Mockito.any(Charset.class), Mockito.eq(false)); + } + + @SuppressWarnings("unchecked") + @Test(expected = CloudRuntimeException.class) + public void writeFileTestwriteFileTestIOExceptionWhileWritingFile() throws Exception { + PowerMockito.mockStatic(FileUtils.class); + + //Does not look good, I know... but this is the price of static methods. + Method method = ReflectionUtils.getMethods(FileUtils.class, ReflectionUtils.withParameters(File.class, CharSequence.class, Charset.class, Boolean.TYPE)).iterator().next(); + PowerMockito.when(FileUtils.class, method).withArguments(Mockito.any(File.class), Mockito.anyString(), Mockito.any(Charset.class), Mockito.anyBoolean()).thenThrow(IOException.class); + + ConfigDriveBuilder.writeFile(new File("folder"), "subfolder", "content"); + } + + @Test + public void fileToBase64StringTest() throws Exception { + PowerMockito.mockStatic(FileUtils.class); + + String fileContent = "content"; + Method method = getFileUtilsReadfileToByteArrayMethod(); + PowerMockito.when(FileUtils.class, method).withArguments(Mockito.any(File.class)).thenReturn(fileContent.getBytes()); + + String returnedContentInBase64 = ConfigDriveBuilder.fileToBase64String(new File("file")); + + Assert.assertEquals("Y29udGVudA==", returnedContentInBase64); + } + + @SuppressWarnings("unchecked") + @Test(expected = IOException.class) + public void fileToBase64StringTestIOException() throws Exception { + PowerMockito.mockStatic(FileUtils.class); + + Method method = getFileUtilsReadfileToByteArrayMethod(); + PowerMockito.when(FileUtils.class, method).withArguments(Mockito.any(File.class)).thenThrow(IOException.class); + + ConfigDriveBuilder.fileToBase64String(new File("file")); + } + + @SuppressWarnings("unchecked") + private Method getFileUtilsReadfileToByteArrayMethod() { + return ReflectionUtils.getMethods(FileUtils.class, ReflectionUtils.withName("readFileToByteArray")).iterator().next(); + } + + @Test + public void base64StringToFileTest() throws Exception { + String encodedIsoData = "Y29udGVudA=="; + + String parentFolder = "parentFolder"; + String fileName = "fileName"; + + File parentFolderFile = new File(parentFolder); + parentFolderFile.mkdir(); + + ConfigDriveBuilder.base64StringToFile(encodedIsoData, parentFolder, fileName); + + File file = new File(parentFolderFile, fileName); + String contentOfFile = new String(FileUtils.readFileToByteArray(file), StandardCharsets.US_ASCII); + + Assert.assertEquals("content", contentOfFile); + + file.delete(); + parentFolderFile.delete(); + } + + @Test(expected = CloudRuntimeException.class) + public void buildConfigDriveTestNoVmData() { + ConfigDriveBuilder.buildConfigDrive(null, "teste", "C:"); + } + + @SuppressWarnings("unchecked") + @PrepareForTest({ConfigDriveBuilder.class}) + @Test(expected = CloudRuntimeException.class) + public void buildConfigDriveTestIoException() throws Exception { + PowerMockito.mockStatic(ConfigDriveBuilder.class); + + Method method = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("writeVendorAndNetworkEmptyJsonFile")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, method).withArguments(Mockito.any(File.class)).thenThrow(IOException.class); + + //This is odd, but it was necessary to allow us to check if we catch the IOexception and re-throw as a CloudRuntimeException + //We are mocking the class being tested; therefore, we needed to force the execution of the real method we want to test. + PowerMockito.when(ConfigDriveBuilder.class, new ArrayList<>(), "teste", "C:").thenCallRealMethod(); + + ConfigDriveBuilder.buildConfigDrive(new ArrayList<>(), "teste", "C:"); + } + + @Test + @SuppressWarnings("unchecked") + @PrepareForTest({ConfigDriveBuilder.class}) + public void buildConfigDriveTest() throws Exception { + PowerMockito.mockStatic(ConfigDriveBuilder.class); + + Method writeVendorAndNetworkEmptyJsonFileMethod = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("writeVendorAndNetworkEmptyJsonFile")).iterator().next(); + PowerMockito.doNothing().when(ConfigDriveBuilder.class, writeVendorAndNetworkEmptyJsonFileMethod).withArguments(Mockito.any(File.class)); + + Method writeVmMetadataMethod = getWriteVmMetadataMethod(); + PowerMockito.doNothing().when(ConfigDriveBuilder.class, writeVmMetadataMethod).withArguments(Mockito.anyListOf(String[].class), Mockito.anyString(), Mockito.any(File.class)); + + Method linkUserDataMethod = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("linkUserData")).iterator().next(); + PowerMockito.doNothing().when(ConfigDriveBuilder.class, linkUserDataMethod).withArguments(Mockito.anyString()); + + Method generateAndRetrieveIsoAsBase64IsoMethod = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("generateAndRetrieveIsoAsBase64Iso")).iterator().next(); + PowerMockito.doReturn("mockIsoDataBase64").when(ConfigDriveBuilder.class, generateAndRetrieveIsoAsBase64IsoMethod).withArguments(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); + + //force execution of real method + PowerMockito.when(ConfigDriveBuilder.class, new ArrayList<>(), "teste", "C:").thenCallRealMethod(); + + String returnedIsoData = ConfigDriveBuilder.buildConfigDrive(new ArrayList<>(), "teste", "C:"); + + Assert.assertEquals("mockIsoDataBase64", returnedIsoData); + + PowerMockito.verifyStatic(); + ConfigDriveBuilder.writeVendorAndNetworkEmptyJsonFile(Mockito.any(File.class)); + ConfigDriveBuilder.writeVmMetadata(Mockito.anyListOf(String[].class), Mockito.anyString(), Mockito.any(File.class)); + ConfigDriveBuilder.linkUserData(Mockito.anyString()); + ConfigDriveBuilder.generateAndRetrieveIsoAsBase64Iso(Mockito.anyString(), Mockito.anyString(), Mockito.anyString()); + } + + @SuppressWarnings("unchecked") + private Method getWriteVmMetadataMethod() { + return ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("writeVmMetadata")).iterator().next(); + } + + @Test(expected = CloudRuntimeException.class) + public void writeVendorAndNetworkEmptyJsonFileTestCannotCreateOpenStackFolder() { + File folderFileMock = Mockito.mock(File.class); + Mockito.doReturn(false).when(folderFileMock).mkdirs(); + + ConfigDriveBuilder.writeVendorAndNetworkEmptyJsonFile(folderFileMock); + } + + @Test(expected = CloudRuntimeException.class) + public void writeVendorAndNetworkEmptyJsonFileTest() { + File folderFileMock = Mockito.mock(File.class); + Mockito.doReturn(false).when(folderFileMock).mkdirs(); + + ConfigDriveBuilder.writeVendorAndNetworkEmptyJsonFile(folderFileMock); + } + + @Test + @PrepareForTest({ConfigDriveBuilder.class}) + public void writeVendorAndNetworkEmptyJsonFileTestCreatingFolder() throws Exception { + PowerMockito.mockStatic(ConfigDriveBuilder.class); + + File folderFileMock = Mockito.mock(File.class); + Mockito.doReturn(false).when(folderFileMock).exists(); + Mockito.doReturn(true).when(folderFileMock).mkdirs(); + + //force execution of real method + Method writeVendorAndNetworkEmptyJsonFileMethod = getWriteVendorAndNetworkEmptyJsonFileMethod(); + PowerMockito.when(ConfigDriveBuilder.class, writeVendorAndNetworkEmptyJsonFileMethod).withArguments(folderFileMock).thenCallRealMethod(); + + ConfigDriveBuilder.writeVendorAndNetworkEmptyJsonFile(folderFileMock); + + Mockito.verify(folderFileMock).exists(); + Mockito.verify(folderFileMock).mkdirs(); + + PowerMockito.verifyStatic(); + ConfigDriveBuilder.writeFile(Mockito.any(File.class), Mockito.eq("vendor_data.json"), Mockito.eq("{}")); + ConfigDriveBuilder.writeFile(Mockito.any(File.class), Mockito.eq("network_data.json"), Mockito.eq("{}")); + } + + @SuppressWarnings("unchecked") + private Method getWriteVendorAndNetworkEmptyJsonFileMethod() { + return ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("writeVendorAndNetworkEmptyJsonFile")).iterator().next(); + } + + @Test + @SuppressWarnings("unchecked") + @PrepareForTest({ConfigDriveBuilder.class}) + public void writeVmMetadataTest() throws Exception { + PowerMockito.mockStatic(ConfigDriveBuilder.class); + + Method method = getWriteVmMetadataMethod(); + PowerMockito.when(ConfigDriveBuilder.class, method).withArguments(new ArrayList<>(), "metadataFile", new File("folder")).thenCallRealMethod(); + + Method createJsonObjectWithVmDataMethod = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("createJsonObjectWithVmData")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, createJsonObjectWithVmDataMethod).withArguments(Mockito.anyListOf(String[].class), Mockito.any(File.class)).thenReturn(new JsonObject()); + + ConfigDriveBuilder.writeVmMetadata(new ArrayList<>(), "metadataFile", new File("folder")); + + PowerMockito.verifyStatic(); + ConfigDriveBuilder.createJsonObjectWithVmData(Mockito.anyListOf(String[].class), Mockito.anyString()); + ConfigDriveBuilder.writeFile(Mockito.any(File.class), Mockito.eq("meta_data.json"), Mockito.eq("{}")); + } + + @Test + @PrepareForTest({File.class, Script.class, ConfigDriveBuilder.class}) + public void linkUserDataTestUserDataFilePathDoesNotExist() throws Exception { + File fileMock = Mockito.mock(File.class); + Mockito.doReturn(false).when(fileMock).exists(); + + PowerMockito.mockStatic(File.class, Script.class); + PowerMockito.whenNew(File.class).withArguments(Mockito.anyString()).thenReturn(fileMock); + + Script scriptMock = Mockito.mock(Script.class); + PowerMockito.whenNew(Script.class).withAnyArguments().thenReturn(scriptMock); + + ConfigDriveBuilder.linkUserData("test"); + + Mockito.verify(scriptMock, times(0)).execute(); + } + + @Test(expected = CloudRuntimeException.class) + @PrepareForTest({File.class, Script.class, ConfigDriveBuilder.class}) + public void linkUserDataTestUserDataFilePathExistAndExecutionPresentedSomeError() throws Exception { + File fileMock = Mockito.mock(File.class); + Mockito.doReturn(true).when(fileMock).exists(); + + PowerMockito.mockStatic(File.class, Script.class); + PowerMockito.whenNew(File.class).withArguments(Mockito.anyString()).thenReturn(fileMock); + + Script scriptMock = Mockito.mock(Script.class); + PowerMockito.whenNew(Script.class).withAnyArguments().thenReturn(scriptMock); + + Mockito.doReturn("message").when(scriptMock).execute(); + ConfigDriveBuilder.linkUserData("test"); + } + + @Test + @PrepareForTest({File.class, Script.class, ConfigDriveBuilder.class}) + public void linkUserDataTest() throws Exception { + File fileMock = Mockito.mock(File.class); + Mockito.doReturn(true).when(fileMock).exists(); + + PowerMockito.mockStatic(File.class, Script.class); + PowerMockito.whenNew(File.class).withArguments(Mockito.anyString()).thenReturn(fileMock); + + Script scriptMock = Mockito.mock(Script.class); + PowerMockito.whenNew(Script.class).withAnyArguments().thenReturn(scriptMock); + + Mockito.doReturn(StringUtils.EMPTY).when(scriptMock).execute(); + String tempDirName = "test"; + ConfigDriveBuilder.linkUserData(tempDirName); + + Mockito.verify(scriptMock).add(tempDirName + ConfigDrive.cloudStackConfigDriveName + "userdata/user_data.txt"); + Mockito.verify(scriptMock).add(tempDirName + ConfigDrive.openStackConfigDriveName + "user_data"); + Mockito.verify(scriptMock).execute(); + } + + @SuppressWarnings("unchecked") + @Test(expected = CloudRuntimeException.class) + @PrepareForTest({Script.class, ConfigDriveBuilder.class}) + public void generateAndRetrieveIsoAsBase64IsoTestGenIsoFailure() throws Exception { + PowerMockito.mockStatic(Script.class, ConfigDriveBuilder.class); + + Script scriptMock = Mockito.mock(Script.class); + PowerMockito.whenNew(Script.class).withAnyArguments().thenReturn(scriptMock); + + Mockito.doReturn("scriptMessage").when(scriptMock).execute(); + + Method method = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("generateAndRetrieveIsoAsBase64Iso")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, method).withArguments(Mockito.any(File.class), Mockito.any(File.class), Mockito.any(File.class)).thenCallRealMethod(); + + Method getProgramToGenerateIsoMethod = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("getProgramToGenerateIso")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, getProgramToGenerateIsoMethod).withNoArguments().thenReturn("/usr/bin/genisoimage"); + + ConfigDriveBuilder.generateAndRetrieveIsoAsBase64Iso("isoFileName", "driveLabel", "tempDirName"); + } + + @SuppressWarnings("unchecked") + @Test(expected = CloudRuntimeException.class) + @PrepareForTest({File.class, Script.class, ConfigDriveBuilder.class}) + public void generateAndRetrieveIsoAsBase64IsoTestIsoTooBig() throws Exception { + PowerMockito.mockStatic(File.class, Script.class, ConfigDriveBuilder.class); + + File fileMock = Mockito.mock(File.class); + PowerMockito.whenNew(File.class).withAnyArguments().thenReturn(fileMock); + + Script scriptMock = Mockito.mock(Script.class); + PowerMockito.whenNew(Script.class).withAnyArguments().thenReturn(scriptMock); + + Mockito.doReturn(StringUtils.EMPTY).when(scriptMock).execute(); + Mockito.doReturn(64L * 1024L * 1024L + 1l).when(fileMock).length(); + + Method method = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("generateAndRetrieveIsoAsBase64Iso")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, method).withArguments(Mockito.any(File.class), Mockito.any(File.class), Mockito.any(File.class)).thenCallRealMethod(); + + Method getProgramToGenerateIsoMethod = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("getProgramToGenerateIso")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, getProgramToGenerateIsoMethod).withNoArguments().thenReturn("/usr/bin/genisoimage"); + + ConfigDriveBuilder.generateAndRetrieveIsoAsBase64Iso("isoFileName", "driveLabel", "tempDirName"); + } + + @Test + @SuppressWarnings("unchecked") + @PrepareForTest({File.class, Script.class, ConfigDriveBuilder.class}) + public void generateAndRetrieveIsoAsBase64IsoTest() throws Exception { + PowerMockito.mockStatic(File.class, Script.class, ConfigDriveBuilder.class); + + File fileMock = Mockito.mock(File.class); + PowerMockito.whenNew(File.class).withArguments("tempDirName", "isoFileName").thenReturn(fileMock); + + Script scriptMock = Mockito.mock(Script.class); + PowerMockito.whenNew(Script.class).withAnyArguments().thenReturn(scriptMock); + + Mockito.when(fileMock.getAbsolutePath()).thenReturn("absolutePath"); + Mockito.doReturn(StringUtils.EMPTY).when(scriptMock).execute(); + Mockito.doReturn(64L * 1024L * 1024L).when(fileMock).length(); + + Method method = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("generateAndRetrieveIsoAsBase64Iso")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, method).withArguments(Mockito.any(File.class), Mockito.any(File.class), Mockito.any(File.class)).thenCallRealMethod(); + + Method getProgramToGenerateIsoMethod = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("getProgramToGenerateIso")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, getProgramToGenerateIsoMethod).withNoArguments().thenReturn("/usr/bin/genisoimage"); + + ConfigDriveBuilder.generateAndRetrieveIsoAsBase64Iso("isoFileName", "driveLabel", "tempDirName"); + + InOrder inOrder = Mockito.inOrder(scriptMock); + inOrder.verify(scriptMock).add("-o", "absolutePath"); + inOrder.verify(scriptMock).add("-ldots"); + inOrder.verify(scriptMock).add("-allow-lowercase"); + inOrder.verify(scriptMock).add("-allow-multidot"); + inOrder.verify(scriptMock).add("-cache-inodes"); + inOrder.verify(scriptMock).add("-l"); + inOrder.verify(scriptMock).add("-quiet"); + inOrder.verify(scriptMock).add("-J"); + inOrder.verify(scriptMock).add("-r"); + inOrder.verify(scriptMock).add("-V", "driveLabel"); + inOrder.verify(scriptMock).add("tempDirName"); + inOrder.verify(scriptMock).execute(); + + PowerMockito.verifyStatic(); + ConfigDriveBuilder.fileToBase64String(Mockito.any(File.class)); + + } + + @Test + @SuppressWarnings("unchecked") + @PrepareForTest({ConfigDriveBuilder.class}) + public void createJsonObjectWithVmDataTesT() throws Exception { + PowerMockito.mockStatic(ConfigDriveBuilder.class); + + Method method = ReflectionUtils.getMethods(ConfigDriveBuilder.class, ReflectionUtils.withName("createJsonObjectWithVmData")).iterator().next(); + PowerMockito.when(ConfigDriveBuilder.class, method).withArguments(Mockito.anyListOf(String[].class), Mockito.anyString()).thenCallRealMethod(); + + List vmData = new ArrayList<>(); + vmData.add(new String[] {"dataType", "fileName", "content"}); + vmData.add(new String[] {"dataType2", "fileName2", "content2"}); + + ConfigDriveBuilder.createJsonObjectWithVmData(vmData, "tempDirName"); + + PowerMockito.verifyStatic(Mockito.times(1)); + ConfigDriveBuilder.createFileInTempDirAnAppendOpenStackMetadataToJsonObject(Mockito.eq("tempDirName"), Mockito.any(JsonObject.class), Mockito.eq("dataType"), Mockito.eq("fileName"), + Mockito.eq("content")); + ConfigDriveBuilder.createFileInTempDirAnAppendOpenStackMetadataToJsonObject(Mockito.eq("tempDirName"), Mockito.any(JsonObject.class), Mockito.eq("dataType2"), Mockito.eq("fileName2"), + Mockito.eq("content2")); + } + + @Test + @PrepareForTest({File.class, ConfigDriveBuilder.class}) + public void getProgramToGenerateIsoTestGenIsoExistsAndIsExecutable() throws Exception { + PowerMockito.mockStatic(File.class); + + File genIsoFileMock = Mockito.mock(File.class); + Mockito.doReturn(true).when(genIsoFileMock).exists(); + Mockito.doReturn(true).when(genIsoFileMock).canExecute(); + + PowerMockito.whenNew(File.class).withArguments("/usr/bin/genisoimage").thenReturn(genIsoFileMock); + + ConfigDriveBuilder.getProgramToGenerateIso(); + + Mockito.verify(genIsoFileMock, Mockito.times(2)).exists(); + Mockito.verify(genIsoFileMock).canExecute(); + Mockito.verify(genIsoFileMock).getCanonicalPath(); + } + + @Test(expected = CloudRuntimeException.class) + @PrepareForTest({File.class, ConfigDriveBuilder.class}) + public void getProgramToGenerateIsoTestGenIsoExistsbutNotExecutable() throws Exception { + PowerMockito.mockStatic(File.class); + + File genIsoFileMock = Mockito.mock(File.class); + Mockito.doReturn(true).when(genIsoFileMock).exists(); + Mockito.doReturn(false).when(genIsoFileMock).canExecute(); + + PowerMockito.whenNew(File.class).withArguments("/usr/bin/genisoimage").thenReturn(genIsoFileMock); + + ConfigDriveBuilder.getProgramToGenerateIso(); + } + + @Test + @PrepareForTest({File.class, ConfigDriveBuilder.class}) + public void getProgramToGenerateIsoTestNotGenIsoMkIsoInLinux() throws Exception { + PowerMockito.mockStatic(File.class); + + File genIsoFileMock = Mockito.mock(File.class); + Mockito.doReturn(false).when(genIsoFileMock).exists(); + + File mkIsoProgramInLinuxFileMock = Mockito.mock(File.class); + Mockito.doReturn(true).when(mkIsoProgramInLinuxFileMock).exists(); + Mockito.doReturn(true).when(mkIsoProgramInLinuxFileMock).canExecute(); + + PowerMockito.whenNew(File.class).withArguments("/usr/bin/genisoimage").thenReturn(genIsoFileMock); + PowerMockito.whenNew(File.class).withArguments("/usr/bin/mkisofs").thenReturn(mkIsoProgramInLinuxFileMock); + + ConfigDriveBuilder.getProgramToGenerateIso(); + + Mockito.verify(genIsoFileMock, Mockito.times(1)).exists(); + Mockito.verify(genIsoFileMock, Mockito.times(0)).canExecute(); + Mockito.verify(genIsoFileMock, Mockito.times(0)).getCanonicalPath(); + + Mockito.verify(mkIsoProgramInLinuxFileMock, Mockito.times(2)).exists(); + Mockito.verify(mkIsoProgramInLinuxFileMock, Mockito.times(1)).canExecute(); + Mockito.verify(mkIsoProgramInLinuxFileMock, Mockito.times(1)).getCanonicalPath(); + } + + @Test + @PrepareForTest({File.class, ConfigDriveBuilder.class}) + public void getProgramToGenerateIsoTestMkIsoMac() throws Exception { + PowerMockito.mockStatic(File.class); + + File genIsoFileMock = Mockito.mock(File.class); + Mockito.doReturn(false).when(genIsoFileMock).exists(); + + File mkIsoProgramInLinuxFileMock = Mockito.mock(File.class); + Mockito.doReturn(false).when(mkIsoProgramInLinuxFileMock).exists(); + + File mkIsoProgramInMacOsFileMock = Mockito.mock(File.class); + Mockito.doReturn(true).when(mkIsoProgramInMacOsFileMock).exists(); + Mockito.doReturn(true).when(mkIsoProgramInMacOsFileMock).canExecute(); + + PowerMockito.whenNew(File.class).withArguments("/usr/bin/genisoimage").thenReturn(genIsoFileMock); + PowerMockito.whenNew(File.class).withArguments("/usr/bin/mkisofs").thenReturn(mkIsoProgramInLinuxFileMock); + PowerMockito.whenNew(File.class).withArguments("/usr/local/bin/mkisofs").thenReturn(mkIsoProgramInMacOsFileMock); + + ConfigDriveBuilder.getProgramToGenerateIso(); + + Mockito.verify(genIsoFileMock, Mockito.times(1)).exists(); + Mockito.verify(genIsoFileMock, Mockito.times(0)).canExecute(); + Mockito.verify(genIsoFileMock, Mockito.times(0)).getCanonicalPath(); + + Mockito.verify(mkIsoProgramInLinuxFileMock, Mockito.times(1)).exists(); + Mockito.verify(mkIsoProgramInLinuxFileMock, Mockito.times(0)).canExecute(); + Mockito.verify(mkIsoProgramInLinuxFileMock, Mockito.times(0)).getCanonicalPath(); + + Mockito.verify(mkIsoProgramInMacOsFileMock, Mockito.times(1)).exists(); + Mockito.verify(mkIsoProgramInMacOsFileMock, Mockito.times(1)).canExecute(); + Mockito.verify(mkIsoProgramInMacOsFileMock, Mockito.times(1)).getCanonicalPath(); + } +} \ No newline at end of file diff --git a/engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveTest.java b/engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveTest.java new file mode 100644 index 000000000000..fd3d3db86a35 --- /dev/null +++ b/engine/storage/configdrive/test/org/apache/cloudstack/storage/configdrive/ConfigDriveTest.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.storage.configdrive; + +import java.io.IOException; + +import org.junit.Assert; +import org.junit.Test; + +public class ConfigDriveTest { + + @Test + public void testConfigDriveIsoPath() throws IOException { + Assert.assertEquals(ConfigDrive.createConfigDrivePath("i-x-y"), "configdrive/i-x-y.iso"); + } + +} \ No newline at end of file diff --git a/engine/storage/datamotion/pom.xml b/engine/storage/datamotion/pom.xml index 39a3d51e62f9..779eda0622ac 100644 --- a/engine/storage/datamotion/pom.xml +++ b/engine/storage/datamotion/pom.xml @@ -16,7 +16,7 @@ org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml b/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml index 3bde76868487..3b09a852ee88 100644 --- a/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml +++ b/engine/storage/datamotion/resources/META-INF/cloudstack/core/spring-engine-storage-datamotion-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java index 3124666db19e..9471fad84d6f 100644 --- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java +++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/AncientDataMotionStrategy.java @@ -45,6 +45,7 @@ import org.apache.cloudstack.storage.RemoteHostEndPoint; import org.apache.cloudstack.storage.command.CopyCommand; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -56,8 +57,10 @@ import com.cloud.agent.api.to.DataTO; import com.cloud.agent.api.to.NfsTO; import com.cloud.agent.api.to.VirtualMachineTO; +import com.cloud.capacity.CapacityManager; import com.cloud.configuration.Config; import com.cloud.host.Host; +import com.cloud.hypervisor.Hypervisor; import com.cloud.storage.DataStoreRole; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.StoragePool; @@ -153,7 +156,7 @@ protected Answer copyObject(DataObject srcData, DataObject destData, Host destHo srcForCopy = cacheData = cacheMgr.createCacheObject(srcData, destScope); } - CopyCommand cmd = new CopyCommand(srcForCopy.getTO(), destData.getTO(), _primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value()); + CopyCommand cmd = new CopyCommand(srcForCopy.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value()); EndPoint ep = destHost != null ? RemoteHostEndPoint.getHypervisorHostEndPoint(destHost) : selector.select(srcForCopy, destData); if (ep == null) { String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; @@ -201,6 +204,23 @@ protected Answer copyObject(DataObject srcData, DataObject destData, Host destHo } } + /** + * Adds {@code 'vmware.create.full.clone'} value for a given primary storage, whose HV is VMware, on datastore's {@code fullCloneFlag} field + * @param dataTO Dest data store TO + * @return dataTO including fullCloneFlag, if provided + */ + protected DataTO addFullCloneFlagOnVMwareDest(DataTO dataTO) { + if (dataTO != null && dataTO.getHypervisorType().equals(Hypervisor.HypervisorType.VMware)){ + DataStoreTO dataStoreTO = dataTO.getDataStore(); + if (dataStoreTO != null && dataStoreTO instanceof PrimaryDataStoreTO){ + PrimaryDataStoreTO primaryDataStoreTO = (PrimaryDataStoreTO) dataStoreTO; + Boolean value = CapacityManager.VmwareCreateCloneFull.valueIn(primaryDataStoreTO.getId()); + primaryDataStoreTO.setFullCloneFlag(value); + } + } + return dataTO; + } + protected Answer copyObject(DataObject srcData, DataObject destData) { return copyObject(srcData, destData, null); } @@ -257,7 +277,7 @@ protected Answer copyVolumeFromSnapshot(DataObject snapObj, DataObject volObj) { ep = selector.select(srcData, volObj); } - CopyCommand cmd = new CopyCommand(srcData.getTO(), volObj.getTO(), _createVolumeFromSnapshotWait, VirtualMachineManager.ExecuteInSequence.value()); + CopyCommand cmd = new CopyCommand(srcData.getTO(), addFullCloneFlagOnVMwareDest(volObj.getTO()), _createVolumeFromSnapshotWait, VirtualMachineManager.ExecuteInSequence.value()); Answer answer = null; if (ep == null) { String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; @@ -280,7 +300,7 @@ protected Answer copyVolumeFromSnapshot(DataObject snapObj, DataObject volObj) { } protected Answer cloneVolume(DataObject template, DataObject volume) { - CopyCommand cmd = new CopyCommand(template.getTO(), volume.getTO(), 0, VirtualMachineManager.ExecuteInSequence.value()); + CopyCommand cmd = new CopyCommand(template.getTO(), addFullCloneFlagOnVMwareDest(volume.getTO()), 0, VirtualMachineManager.ExecuteInSequence.value()); try { EndPoint ep = selector.select(volume.getDataStore()); Answer answer = null; @@ -330,7 +350,7 @@ protected Answer copyVolumeBetweenPools(DataObject srcData, DataObject destData) objOnImageStore.processEvent(Event.CopyingRequested); - CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), destData.getTO(), _copyvolumewait, VirtualMachineManager.ExecuteInSequence.value()); + CopyCommand cmd = new CopyCommand(objOnImageStore.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _copyvolumewait, VirtualMachineManager.ExecuteInSequence.value()); EndPoint ep = selector.select(objOnImageStore, destData); if (ep == null) { String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; @@ -424,7 +444,6 @@ public void copyAsync(DataObject srcData, DataObject destData, Host destHost, As String errMsg = null; try { s_logger.debug("copyAsync inspecting src type " + srcData.getType().toString() + " copyAsync inspecting dest type " + destData.getType().toString()); - if (srcData.getType() == DataObjectType.SNAPSHOT && destData.getType() == DataObjectType.VOLUME) { answer = copyVolumeFromSnapshot(srcData, destData); } else if (srcData.getType() == DataObjectType.SNAPSHOT && destData.getType() == DataObjectType.TEMPLATE) { @@ -477,7 +496,7 @@ protected Answer createTemplateFromSnapshot(DataObject srcData, DataObject destD ep = selector.select(srcData, destData); } - CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _createprivatetemplatefromsnapshotwait, VirtualMachineManager.ExecuteInSequence.value()); + CopyCommand cmd = new CopyCommand(srcData.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _createprivatetemplatefromsnapshotwait, VirtualMachineManager.ExecuteInSequence.value()); Answer answer = null; if (ep == null) { String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; @@ -500,10 +519,10 @@ protected Answer copySnapshot(DataObject srcData, DataObject destData) { DataObject cacheData = null; SnapshotInfo snapshotInfo = (SnapshotInfo)srcData; - Object payload = snapshotInfo.getPayload(); + Boolean snapshotFullBackup = snapshotInfo.getFullBackup(); Boolean fullSnapshot = true; - if (payload != null) { - fullSnapshot = (Boolean)payload; + if (snapshotFullBackup != null) { + fullSnapshot = snapshotFullBackup; } Map options = new HashMap(); options.put("fullSnapshot", fullSnapshot.toString()); @@ -513,7 +532,7 @@ protected Answer copySnapshot(DataObject srcData, DataObject destData) { Scope selectedScope = pickCacheScopeForCopy(srcData, destData); cacheData = cacheMgr.getCacheObject(srcData, selectedScope); - CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait, VirtualMachineManager.ExecuteInSequence.value()); + CopyCommand cmd = new CopyCommand(srcData.getTO(), addFullCloneFlagOnVMwareDest(destData.getTO()), _backupsnapshotwait, VirtualMachineManager.ExecuteInSequence.value()); cmd.setCacheTO(cacheData.getTO()); cmd.setOptions(options); EndPoint ep = selector.select(srcData, destData); @@ -525,6 +544,7 @@ protected Answer copySnapshot(DataObject srcData, DataObject destData) { answer = ep.sendMessage(cmd); } } else { + addFullCloneFlagOnVMwareDest(destData.getTO()); CopyCommand cmd = new CopyCommand(srcData.getTO(), destData.getTO(), _backupsnapshotwait, VirtualMachineManager.ExecuteInSequence.value()); cmd.setOptions(options); EndPoint ep = selector.select(srcData, destData, StorageAction.BACKUPSNAPSHOT); diff --git a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java index 7a59ad07c449..45e951b59a10 100644 --- a/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java +++ b/engine/storage/datamotion/src/org/apache/cloudstack/storage/motion/StorageSystemDataMotionStrategy.java @@ -18,35 +18,83 @@ */ package org.apache.cloudstack.storage.motion; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; -import java.util.concurrent.ExecutionException; - -import javax.inject.Inject; - +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.storage.CopyVolumeAnswer; +import com.cloud.agent.api.storage.CopyVolumeCommand; +import com.cloud.agent.api.MigrateAnswer; +import com.cloud.agent.api.MigrateCommand; +import com.cloud.agent.api.ModifyTargetsAnswer; +import com.cloud.agent.api.ModifyTargetsCommand; +import com.cloud.agent.api.PrepareForMigrationCommand; +import com.cloud.agent.api.storage.MigrateVolumeAnswer; +import com.cloud.agent.api.storage.MigrateVolumeCommand; +import com.cloud.agent.api.to.DataStoreTO; +import com.cloud.agent.api.to.DataTO; +import com.cloud.agent.api.to.DiskTO; +import com.cloud.agent.api.to.NfsTO; +import com.cloud.agent.api.to.VirtualMachineTO; +import com.cloud.configuration.Config; import com.cloud.dc.dao.ClusterDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.OperationTimedoutException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.dao.HostDao; +import com.cloud.host.dao.HostDetailsDao; +import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.resource.ResourceState; +import com.cloud.storage.DataStoreRole; +import com.cloud.storage.DiskOfferingVO; +import com.cloud.storage.Snapshot; +import com.cloud.storage.SnapshotVO; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.storage.StorageManager; +import com.cloud.storage.VMTemplateVO; +import com.cloud.storage.VolumeDetailVO; +import com.cloud.storage.Volume; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.DiskOfferingDao; +import com.cloud.storage.dao.GuestOSCategoryDao; +import com.cloud.storage.dao.GuestOSDao; +import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.SnapshotDetailsDao; +import com.cloud.storage.dao.SnapshotDetailsVO; +import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeDetailsDao; +import com.cloud.utils.NumbersUtil; +import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineManager; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.dao.VMInstanceDao; + +import com.google.common.base.Preconditions; import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.ClusterScope; import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionStrategy; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; +import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; +import org.apache.cloudstack.engine.subsystem.api.storage.Scope; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager; import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService.VolumeApiResult; +import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; import org.apache.cloudstack.framework.async.AsyncCallFuture; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; @@ -55,60 +103,57 @@ import org.apache.cloudstack.storage.command.ResignatureAnswer; import org.apache.cloudstack.storage.command.ResignatureCommand; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; import org.apache.commons.lang.StringUtils; +import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; + import org.springframework.stereotype.Component; -import com.cloud.agent.AgentManager; -import com.cloud.agent.api.to.DiskTO; -import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.configuration.Config; -import com.cloud.host.Host; -import com.cloud.host.HostVO; -import com.cloud.host.dao.HostDao; -import com.cloud.host.dao.HostDetailsDao; -import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.server.ManagementService; -import com.cloud.storage.DataStoreRole; -import com.cloud.storage.DiskOfferingVO; -import com.cloud.storage.SnapshotVO; -import com.cloud.storage.Storage.ImageFormat; -import com.cloud.storage.VolumeDetailVO; -import com.cloud.storage.VolumeVO; -import com.cloud.storage.dao.DiskOfferingDao; -import com.cloud.storage.dao.SnapshotDao; -import com.cloud.storage.dao.SnapshotDetailsDao; -import com.cloud.storage.dao.SnapshotDetailsVO; -import com.cloud.storage.dao.VolumeDao; -import com.cloud.storage.dao.VolumeDetailsDao; -import com.cloud.utils.NumbersUtil; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.vm.VirtualMachineManager; +import javax.inject.Inject; -import com.google.common.base.Preconditions; +import java.util.ArrayList; +import java.util.Collection; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Random; +import java.util.Set; +import java.util.UUID; +import java.util.concurrent.TimeUnit; @Component public class StorageSystemDataMotionStrategy implements DataMotionStrategy { private static final Logger LOGGER = Logger.getLogger(StorageSystemDataMotionStrategy.class); private static final Random RANDOM = new Random(System.nanoTime()); + private static final int LOCK_TIME_IN_SECONDS = 300; + private static final String OPERATION_NOT_SUPPORTED = "This operation is not supported."; @Inject private AgentManager _agentMgr; @Inject private ConfigurationDao _configDao; @Inject private DataStoreManager dataStoreMgr; @Inject private DiskOfferingDao _diskOfferingDao; + @Inject private GuestOSCategoryDao _guestOsCategoryDao; + @Inject private GuestOSDao _guestOsDao; @Inject private ClusterDao clusterDao; @Inject private HostDao _hostDao; @Inject private HostDetailsDao hostDetailsDao; - @Inject private ManagementService _mgr; @Inject private PrimaryDataStoreDao _storagePoolDao; @Inject private SnapshotDao _snapshotDao; + @Inject private SnapshotDataStoreDao _snapshotDataStoreDao; @Inject private SnapshotDetailsDao _snapshotDetailsDao; + @Inject private VMInstanceDao _vmDao; + @Inject private VMTemplateDao _vmTemplateDao; @Inject private VolumeDao _volumeDao; @Inject private VolumeDataFactory _volumeDataFactory; @Inject private VolumeDetailsDao volumeDetailsDao; @Inject private VolumeService _volumeService; + @Inject private StorageCacheManager cacheMgr; + @Inject private EndPointSelector selector; @Override public StrategyPriority canHandle(DataObject srcData, DataObject destData) { @@ -125,9 +170,40 @@ public StrategyPriority canHandle(DataObject srcData, DataObject destData) { return StrategyPriority.HIGHEST; } + if (srcData instanceof VolumeInfo && destData instanceof VolumeInfo) { + VolumeInfo srcVolumeInfo = (VolumeInfo)srcData; + + if (isVolumeOnManagedStorage(srcVolumeInfo)) { + return StrategyPriority.HIGHEST; + } + + VolumeInfo destVolumeInfo = (VolumeInfo)destData; + + if (isVolumeOnManagedStorage(destVolumeInfo)) { + return StrategyPriority.HIGHEST; + } + } + + if (srcData instanceof VolumeInfo && destData instanceof TemplateInfo) { + VolumeInfo srcVolumeInfo = (VolumeInfo)srcData; + + if (isVolumeOnManagedStorage(srcVolumeInfo)) { + return StrategyPriority.HIGHEST; + } + } + return StrategyPriority.CANT_HANDLE; } + private boolean isVolumeOnManagedStorage(VolumeInfo volumeInfo) { + long storagePooldId = volumeInfo.getDataStore().getId(); + StoragePoolVO storagePoolVO = _storagePoolDao.findById(storagePooldId); + + return storagePoolVO.isManaged(); + } + + // canHandle returns true if the storage driver for the DataObject that's passed in can support certain features (what features we + // care about during a particular invocation of this method depend on what type of DataObject was passed in (ex. VolumeInfo versus SnapshotInfo)). private boolean canHandle(DataObject dataObject) { Preconditions.checkArgument(dataObject != null, "Passing 'null' to dataObject of canHandle(DataObject) is not supported."); @@ -140,7 +216,7 @@ private boolean canHandle(DataObject dataObject) { return false; } - if (dataObject instanceof VolumeInfo || dataObject instanceof SnapshotInfo) { + if (dataObject instanceof VolumeInfo || dataObject instanceof SnapshotInfo) { String value = mapCapabilities.get(DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString()); Boolean supportsStorageSystemSnapshots = Boolean.valueOf(value); @@ -159,7 +235,6 @@ private boolean canHandle(DataObject dataObject) { return true; } - } } @@ -168,202 +243,282 @@ private boolean canHandle(DataObject dataObject) { @Override public StrategyPriority canHandle(Map volumeMap, Host srcHost, Host destHost) { + if (HypervisorType.KVM.equals(srcHost.getHypervisorType())) { + Set volumeInfoSet = volumeMap.keySet(); + + for (VolumeInfo volumeInfo : volumeInfoSet) { + StoragePoolVO storagePoolVO = _storagePoolDao.findById(volumeInfo.getPoolId()); + + if (storagePoolVO.isManaged()) { + return StrategyPriority.HIGHEST; + } + } + + Collection dataStores = volumeMap.values(); + + for (DataStore dataStore : dataStores) { + StoragePoolVO storagePoolVO = _storagePoolDao.findById(dataStore.getId()); + + if (storagePoolVO.isManaged()) { + return StrategyPriority.HIGHEST; + } + } + } + return StrategyPriority.CANT_HANDLE; } @Override public void copyAsync(DataObject srcData, DataObject destData, Host destHost, AsyncCompletionCallback callback) { if (srcData instanceof SnapshotInfo) { - SnapshotInfo snapshotInfo = (SnapshotInfo)srcData; + SnapshotInfo srcSnapshotInfo = (SnapshotInfo)srcData; - validate(snapshotInfo); + handleCopyAsyncForSnapshot(srcSnapshotInfo, destData, callback); + } else if (srcData instanceof TemplateInfo && destData instanceof VolumeInfo) { + TemplateInfo srcTemplateInfo = (TemplateInfo)srcData; + VolumeInfo destVolumeInfo = (VolumeInfo)destData; - boolean canHandleSrc = canHandle(srcData); + handleCopyAsyncForTemplateAndVolume(srcTemplateInfo, destVolumeInfo, callback); + } else if (srcData instanceof VolumeInfo && destData instanceof VolumeInfo) { + VolumeInfo srcVolumeInfo = (VolumeInfo)srcData; + VolumeInfo destVolumeInfo = (VolumeInfo)destData; - if (canHandleSrc && destData instanceof TemplateInfo && - (destData.getDataStore().getRole() == DataStoreRole.Image || destData.getDataStore().getRole() == DataStoreRole.ImageCache)) { - handleCreateTemplateFromSnapshot(snapshotInfo, (TemplateInfo)destData, callback); + handleCopyAsyncForVolumes(srcVolumeInfo, destVolumeInfo, callback); + } else if (srcData instanceof VolumeInfo && destData instanceof TemplateInfo && + (destData.getDataStore().getRole() == DataStoreRole.Image || destData.getDataStore().getRole() == DataStoreRole.ImageCache)) { + VolumeInfo srcVolumeInfo = (VolumeInfo)srcData; + TemplateInfo destTemplateInfo = (TemplateInfo)destData; - return; - } + handleCreateTemplateFromVolume(srcVolumeInfo, destTemplateInfo, callback); + } + else { + handleError(OPERATION_NOT_SUPPORTED, callback); + } + } - if (destData instanceof VolumeInfo) { - VolumeInfo volumeInfo = (VolumeInfo)destData; + private void handleCopyAsyncForSnapshot(SnapshotInfo srcSnapshotInfo, DataObject destData, AsyncCompletionCallback callback) { + verifyFormat(srcSnapshotInfo); - boolean canHandleDest = canHandle(destData); + boolean canHandleSrc = canHandle(srcSnapshotInfo); - if (canHandleSrc && canHandleDest) { - if (snapshotInfo.getDataStore().getId() == volumeInfo.getDataStore().getId()) { - handleCreateVolumeFromSnapshotBothOnStorageSystem(snapshotInfo, volumeInfo, callback); - return; - } - else { - String errMsg = "This operation is not supported (DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT " + - "not supported by source or destination storage plug-in). " + getSrcDestDataStoreMsg(srcData, destData); + if (canHandleSrc && (destData instanceof TemplateInfo || destData instanceof SnapshotInfo) && + (destData.getDataStore().getRole() == DataStoreRole.Image || destData.getDataStore().getRole() == DataStoreRole.ImageCache)) { + handleCopyDataToSecondaryStorage(srcSnapshotInfo, destData, callback); + } else if (destData instanceof VolumeInfo) { + handleCopyAsyncForSnapshotToVolume(srcSnapshotInfo, (VolumeInfo)destData, callback); + } else { + handleError(OPERATION_NOT_SUPPORTED, callback); + } + } - LOGGER.warn(errMsg); + private void handleCopyAsyncForSnapshotToVolume(SnapshotInfo srcSnapshotInfo, VolumeInfo destVolumeInfo, + AsyncCompletionCallback callback) { + boolean canHandleDest = canHandle(destVolumeInfo); - throw new UnsupportedOperationException(errMsg); - } - } + if (!canHandleDest) { + handleError(OPERATION_NOT_SUPPORTED, callback); + } + + boolean canHandleSrc = canHandle(srcSnapshotInfo); - if (canHandleSrc) { - String errMsg = "This operation is not supported (DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT " + - "not supported by destination storage plug-in). " + getDestDataStoreMsg(destData); + if (!canHandleSrc) { + handleCreateVolumeFromSnapshotOnSecondaryStorage(srcSnapshotInfo, destVolumeInfo, callback); + } - LOGGER.warn(errMsg); + if (srcSnapshotInfo.getDataStore().getId() == destVolumeInfo.getDataStore().getId()) { + handleCreateVolumeFromSnapshotBothOnStorageSystem(srcSnapshotInfo, destVolumeInfo, callback); + } else { + String errMsg = "To perform this operation, the source and destination primary storages must be the same."; - throw new UnsupportedOperationException(errMsg); - } + handleError(errMsg, callback); + } + } - if (canHandleDest) { - String errMsg = "This operation is not supported (DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT " + - "not supported by source storage plug-in). " + getSrcDataStoreMsg(srcData); + private void handleCopyAsyncForTemplateAndVolume(TemplateInfo srcTemplateInfo, VolumeInfo destVolumeInfo, AsyncCompletionCallback callback) { + boolean canHandleSrc = canHandle(srcTemplateInfo); + + if (!canHandleSrc) { + handleError(OPERATION_NOT_SUPPORTED, callback); + } - LOGGER.warn(errMsg); + handleCreateVolumeFromTemplateBothOnStorageSystem(srcTemplateInfo, destVolumeInfo, callback); + } - throw new UnsupportedOperationException(errMsg); + private void handleCopyAsyncForVolumes(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, AsyncCompletionCallback callback) { + if (srcVolumeInfo.getState() == Volume.State.Migrating) { + if (isVolumeOnManagedStorage(srcVolumeInfo)) { + if (destVolumeInfo.getDataStore().getRole() == DataStoreRole.Image || destVolumeInfo.getDataStore().getRole() == DataStoreRole.ImageCache) { + handleVolumeCopyFromManagedStorageToSecondaryStorage(srcVolumeInfo, destVolumeInfo, callback); + } else if (!isVolumeOnManagedStorage(destVolumeInfo)) { + handleVolumeMigrationFromManagedStorageToNonManagedStorage(srcVolumeInfo, destVolumeInfo, callback); + } else { + String errMsg = "The source volume to migrate and the destination volume are both on managed storage. " + + "Migration in this case is not yet supported."; + + handleError(errMsg, callback); } - } - } else if (srcData instanceof TemplateInfo && destData instanceof VolumeInfo) { - boolean canHandleSrc = canHandle(srcData); + } else if (!isVolumeOnManagedStorage(destVolumeInfo)) { + String errMsg = "The 'StorageSystemDataMotionStrategy' does not support this migration use case."; - if (!canHandleSrc) { - String errMsg = "This operation is not supported (DataStoreCapabilities.STORAGE_CAN_CREATE_VOLUME_FROM_VOLUME " + - "not supported by destination storage plug-in). " + getDestDataStoreMsg(destData); + handleError(errMsg, callback); + } else { + handleVolumeMigrationFromNonManagedStorageToManagedStorage(srcVolumeInfo, destVolumeInfo, callback); + } + } else if (srcVolumeInfo.getState() == Volume.State.Uploaded && + (srcVolumeInfo.getDataStore().getRole() == DataStoreRole.Image || srcVolumeInfo.getDataStore().getRole() == DataStoreRole.ImageCache) && + destVolumeInfo.getDataStore().getRole() == DataStoreRole.Primary) { + ImageFormat imageFormat = destVolumeInfo.getFormat(); - LOGGER.warn(errMsg); + if (!ImageFormat.QCOW2.equals(imageFormat)) { + String errMsg = "The 'StorageSystemDataMotionStrategy' does not support this upload use case (non KVM)."; - throw new UnsupportedOperationException(errMsg); + handleError(errMsg, callback); } - handleCreateVolumeFromTemplateBothOnStorageSystem((TemplateInfo)srcData, (VolumeInfo)destData, callback); - - return; + handleCreateVolumeFromVolumeOnSecondaryStorage(srcVolumeInfo, destVolumeInfo, destVolumeInfo.getDataCenterId(), HypervisorType.KVM, callback); + } else { + handleError(OPERATION_NOT_SUPPORTED, callback); } - - throw new UnsupportedOperationException("This operation is not supported."); } - private String getSrcDestDataStoreMsg(DataObject srcData, DataObject destData) { - Preconditions.checkArgument(srcData != null, "Passing 'null' to srcData of getSrcDestDataStoreMsg(DataObject, DataObject) is not supported."); - Preconditions.checkArgument(destData != null, "Passing 'null' to destData of getSrcDestDataStoreMsg(DataObject, DataObject) is not supported."); + private void handleError(String errMsg, AsyncCompletionCallback callback) { + LOGGER.warn(errMsg); - return "Source data store = " + srcData.getDataStore().getName() + "; " + "Destination data store = " + destData.getDataStore().getName() + "."; + invokeCallback(errMsg, callback); + + throw new UnsupportedOperationException(errMsg); } - private String getSrcDataStoreMsg(DataObject srcData) { - Preconditions.checkArgument(srcData != null, "Passing 'null' to srcData of getSrcDataStoreMsg(DataObject) is not supported."); + private void invokeCallback(String errMsg, AsyncCompletionCallback callback) { + CopyCmdAnswer copyCmdAnswer = new CopyCmdAnswer(errMsg); - return "Source data store = " + srcData.getDataStore().getName() + "."; - } + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); - private String getDestDataStoreMsg(DataObject destData) { - Preconditions.checkArgument(destData != null, "Passing 'null' to destData of getDestDataStoreMsg(DataObject) is not supported."); + result.setResult(errMsg); - return "Destination data store = " + destData.getDataStore().getName() + "."; + callback.complete(result); } - private void validate(SnapshotInfo snapshotInfo) { - long volumeId = snapshotInfo.getVolumeId(); + private void handleVolumeCopyFromManagedStorageToSecondaryStorage(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, + AsyncCompletionCallback callback) { + String errMsg = null; + String volumePath = null; - VolumeVO volumeVO = _volumeDao.findByIdIncludingRemoved(volumeId); + try { + if (!ImageFormat.QCOW2.equals(srcVolumeInfo.getFormat())) { + throw new CloudRuntimeException("Currently, only the KVM hypervisor type is supported for the migration of a volume " + + "from managed storage to non-managed storage."); + } - if (volumeVO.getFormat() != ImageFormat.VHD) { - throw new CloudRuntimeException("Only the " + ImageFormat.VHD.toString() + " image type is currently supported."); - } - } + HypervisorType hypervisorType = HypervisorType.KVM; + VirtualMachine vm = srcVolumeInfo.getAttachedVM(); - private boolean usingBackendSnapshotFor(SnapshotInfo snapshotInfo) { - String property = getProperty(snapshotInfo.getId(), "takeSnapshot"); + if (vm != null && vm.getState() != VirtualMachine.State.Stopped) { + throw new CloudRuntimeException("Currently, if a volume to copy from managed storage to secondary storage is attached to " + + "a VM, the VM must be in the Stopped state."); + } - return Boolean.parseBoolean(property); - } + long srcStoragePoolId = srcVolumeInfo.getPoolId(); + StoragePoolVO srcStoragePoolVO = _storagePoolDao.findById(srcStoragePoolId); - private void handleCreateTemplateFromSnapshot(SnapshotInfo snapshotInfo, TemplateInfo templateInfo, AsyncCompletionCallback callback) { - try { - snapshotInfo.processEvent(Event.CopyingRequested); + HostVO hostVO; + + if (srcStoragePoolVO.getClusterId() != null) { + hostVO = getHostInCluster(srcStoragePoolVO.getClusterId()); + } + else { + hostVO = getHost(srcVolumeInfo.getDataCenterId(), hypervisorType, false); + } + + volumePath = copyVolumeToSecondaryStorage(srcVolumeInfo, destVolumeInfo, hostVO, + "Unable to copy the volume from managed storage to secondary storage"); } catch (Exception ex) { - throw new CloudRuntimeException("This snapshot is not currently in a state where it can be used to create a template."); + errMsg = "Migration operation failed in 'StorageSystemDataMotionStrategy.handleVolumeCopyFromManagedStorageToSecondaryStorage': " + + ex.getMessage(); + + throw new CloudRuntimeException(errMsg); } + finally { + CopyCmdAnswer copyCmdAnswer; + + if (errMsg != null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } + else if (volumePath == null) { + copyCmdAnswer = new CopyCmdAnswer("Unable to acquire a volume path"); + } + else { + VolumeObjectTO volumeObjectTO = (VolumeObjectTO)destVolumeInfo.getTO(); - HostVO hostVO = getHost(snapshotInfo); + volumeObjectTO.setPath(volumePath); - boolean usingBackendSnapshot = usingBackendSnapshotFor(snapshotInfo); - boolean computeClusterSupportsResign = clusterDao.getSupportsResigning(hostVO.getClusterId()); + copyCmdAnswer = new CopyCmdAnswer(volumeObjectTO); + } - if (usingBackendSnapshot && !computeClusterSupportsResign) { - String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + hostVO.getClusterId(); + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); - LOGGER.warn(noSupportForResignErrMsg); + result.setResult(errMsg); - throw new CloudRuntimeException(noSupportForResignErrMsg); + callback.complete(result); } + } + + private void handleVolumeMigrationFromManagedStorageToNonManagedStorage(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, + AsyncCompletionCallback callback) { + String errMsg = null; try { - if (usingBackendSnapshot) { - createVolumeFromSnapshot(hostVO, snapshotInfo, true); + if (!ImageFormat.QCOW2.equals(srcVolumeInfo.getFormat())) { + throw new CloudRuntimeException("Currently, only the KVM hypervisor type is supported for the migration of a volume " + + "from managed storage to non-managed storage."); } - DataStore srcDataStore = snapshotInfo.getDataStore(); + HypervisorType hypervisorType = HypervisorType.KVM; + VirtualMachine vm = srcVolumeInfo.getAttachedVM(); - String value = _configDao.getValue(Config.PrimaryStorageDownloadWait.toString()); - int primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); - CopyCommand copyCommand = new CopyCommand(snapshotInfo.getTO(), templateInfo.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value()); + if (vm != null && vm.getState() != VirtualMachine.State.Stopped) { + throw new CloudRuntimeException("Currently, if a volume to migrate from managed storage to non-managed storage is attached to " + + "a VM, the VM must be in the Stopped state."); + } - String errMsg = null; + long destStoragePoolId = destVolumeInfo.getPoolId(); + StoragePoolVO destStoragePoolVO = _storagePoolDao.findById(destStoragePoolId); - CopyCmdAnswer copyCmdAnswer = null; + HostVO hostVO; - try { - // If we are using a back-end snapshot, then we should still have access to it from the hosts in the cluster that hostVO is in - // (because we passed in true as the third parameter to createVolumeFromSnapshot above). - if (usingBackendSnapshot == false) { - _volumeService.grantAccess(snapshotInfo, hostVO, srcDataStore); - } + if (destStoragePoolVO.getClusterId() != null) { + hostVO = getHostInCluster(destStoragePoolVO.getClusterId()); + } + else { + hostVO = getHost(destVolumeInfo.getDataCenterId(), hypervisorType, false); + } - Map srcDetails = getSnapshotDetails(snapshotInfo); + setCertainVolumeValuesNull(destVolumeInfo.getId()); - copyCommand.setOptions(srcDetails); + // migrate the volume via the hypervisor + String path = migrateVolume(srcVolumeInfo, destVolumeInfo, hostVO, "Unable to migrate the volume from managed storage to non-managed storage"); - copyCmdAnswer = (CopyCmdAnswer)_agentMgr.send(hostVO.getId(), copyCommand); - } - catch (CloudRuntimeException | AgentUnavailableException | OperationTimedoutException ex) { - String msg = "Failed to create template from snapshot (Snapshot ID = " + snapshotInfo.getId() + ") : "; + updateVolumePath(destVolumeInfo.getId(), path); + } + catch (Exception ex) { + errMsg = "Migration operation failed in 'StorageSystemDataMotionStrategy.handleVolumeMigrationFromManagedStorageToNonManagedStorage': " + + ex.getMessage(); - LOGGER.warn(msg, ex); + throw new CloudRuntimeException(errMsg); + } + finally { + CopyCmdAnswer copyCmdAnswer; - throw new CloudRuntimeException(msg + ex.getMessage()); + if (errMsg != null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); } - finally { - try { - _volumeService.revokeAccess(snapshotInfo, hostVO, srcDataStore); - } - catch (Exception ex) { - LOGGER.warn("Error revoking access to snapshot (Snapshot ID = " + snapshotInfo.getId() + "): " + ex.getMessage(), ex); - } + else { + destVolumeInfo = _volumeDataFactory.getVolume(destVolumeInfo.getId(), destVolumeInfo.getDataStore()); - if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { - if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { - errMsg = copyCmdAnswer.getDetails(); - } - else { - errMsg = "Unable to create template from snapshot"; - } - } + DataTO dataTO = destVolumeInfo.getTO(); - try { - if (StringUtils.isEmpty(errMsg)) { - snapshotInfo.processEvent(Event.OperationSuccessed); - } - else { - snapshotInfo.processEvent(Event.OperationFailed); - } - } - catch (Exception ex) { - LOGGER.warn("Error processing snapshot event: " + ex.getMessage(), ex); - } + copyCmdAnswer = new CopyCmdAnswer(dataTO); } CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); @@ -372,113 +527,646 @@ private void handleCreateTemplateFromSnapshot(SnapshotInfo snapshotInfo, Templat callback.complete(result); } - finally { - if (usingBackendSnapshot) { - deleteVolumeFromSnapshot(snapshotInfo); - } + } + + private void verifyFormat(ImageFormat imageFormat) { + if (imageFormat != ImageFormat.VHD && imageFormat != ImageFormat.OVA && imageFormat != ImageFormat.QCOW2) { + throw new CloudRuntimeException("Only the following image types are currently supported: " + + ImageFormat.VHD.toString() + ", " + ImageFormat.OVA.toString() + ", and " + ImageFormat.QCOW2); } } - /** - * Clones a template present on the storage to a new volume and resignatures it. - * - * @param templateInfo source template - * @param volumeInfo destination ROOT volume - * @param callback for async - */ - private void handleCreateVolumeFromTemplateBothOnStorageSystem(TemplateInfo templateInfo, VolumeInfo volumeInfo, AsyncCompletionCallback callback) { - Preconditions.checkArgument(templateInfo != null, "Passing 'null' to templateInfo of handleCreateVolumeFromTemplateBothOnStorageSystem is not supported."); - Preconditions.checkArgument(volumeInfo != null, "Passing 'null' to volumeInfo of handleCreateVolumeFromTemplateBothOnStorageSystem is not supported."); + private void verifyFormat(SnapshotInfo snapshotInfo) { + long volumeId = snapshotInfo.getVolumeId(); - CopyCmdAnswer copyCmdAnswer = null; - String errMsg = null; + VolumeVO volumeVO = _volumeDao.findByIdIncludingRemoved(volumeId); - HostVO hostVO = getHost(volumeInfo.getDataCenterId(), true); + verifyFormat(volumeVO.getFormat()); + } - if (hostVO == null) { - throw new CloudRuntimeException("Unable to locate a host capable of resigning in the zone with the following ID: " + volumeInfo.getDataCenterId()); - } + private boolean usingBackendSnapshotFor(SnapshotInfo snapshotInfo) { + String property = getSnapshotProperty(snapshotInfo.getId(), "takeSnapshot"); - boolean computeClusterSupportsResign = clusterDao.getSupportsResigning(hostVO.getClusterId()); + return Boolean.parseBoolean(property); + } - if (!computeClusterSupportsResign) { - String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + hostVO.getClusterId(); + private boolean needCacheStorage(DataObject srcData, DataObject destData) { + DataTO srcTO = srcData.getTO(); + DataStoreTO srcStoreTO = srcTO.getDataStore(); + DataTO destTO = destData.getTO(); + DataStoreTO destStoreTO = destTO.getDataStore(); - LOGGER.warn(noSupportForResignErrMsg); + // both snapshot and volume are on primary datastore - no need for a cache storage as hypervisor will copy directly + if (srcStoreTO instanceof PrimaryDataStoreTO && destStoreTO instanceof PrimaryDataStoreTO) { + return false; + } - throw new CloudRuntimeException(noSupportForResignErrMsg); + if (srcStoreTO instanceof NfsTO || srcStoreTO.getRole() == DataStoreRole.ImageCache) { + return false; } - try { - VolumeDetailVO volumeDetail = new VolumeDetailVO(volumeInfo.getId(), - "cloneOfTemplate", - String.valueOf(templateInfo.getId()), - false); + if (destStoreTO instanceof NfsTO || destStoreTO.getRole() == DataStoreRole.ImageCache) { + return false; + } - volumeDetail = volumeDetailsDao.persist(volumeDetail); + if (LOGGER.isDebugEnabled()) { + LOGGER.debug("needCacheStorage true; dest at " + destTO.getPath() + ", dest role " + destStoreTO.getRole().toString() + "; src at " + + srcTO.getPath() + ", src role " + srcStoreTO.getRole().toString()); + } - AsyncCallFuture future = _volumeService.createVolumeAsync(volumeInfo, volumeInfo.getDataStore()); - VolumeApiResult result = future.get(); + return true; + } - if (volumeDetail != null) { - volumeDetailsDao.remove(volumeDetail.getId()); - } + private Scope pickCacheScopeForCopy(DataObject srcData, DataObject destData) { + Scope srcScope = srcData.getDataStore().getScope(); + Scope destScope = destData.getDataStore().getScope(); - if (result.isFailed()) { - LOGGER.warn("Failed to create a volume: " + result.getResult()); + Scope selectedScope = null; - throw new CloudRuntimeException(result.getResult()); - } + if (srcScope.getScopeId() != null) { + selectedScope = getZoneScope(srcScope); + } else if (destScope.getScopeId() != null) { + selectedScope = getZoneScope(destScope); + } else { + LOGGER.warn("Cannot find a zone-wide scope for movement that needs a cache storage"); + } - volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); + return selectedScope; + } - volumeInfo.processEvent(Event.MigrationRequested); + private Scope getZoneScope(Scope scope) { + ZoneScope zoneScope; - volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); + if (scope instanceof ClusterScope) { + ClusterScope clusterScope = (ClusterScope)scope; - copyCmdAnswer = performResignature(volumeInfo, hostVO); + zoneScope = new ZoneScope(clusterScope.getZoneId()); + } else if (scope instanceof HostScope) { + HostScope hostScope = (HostScope)scope; - if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { - if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { - throw new CloudRuntimeException(copyCmdAnswer.getDetails()); - } - else { - throw new CloudRuntimeException("Unable to create a volume from a template"); + zoneScope = new ZoneScope(hostScope.getZoneId()); + } else { + zoneScope = (ZoneScope)scope; + } + + return zoneScope; + } + + private void handleVolumeMigrationFromNonManagedStorageToManagedStorage(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, + AsyncCompletionCallback callback) { + String errMsg = null; + + try { + HypervisorType hypervisorType = srcVolumeInfo.getHypervisorType(); + + if (!HypervisorType.KVM.equals(hypervisorType)) { + throw new CloudRuntimeException("Currently, only the KVM hypervisor type is supported for the migration of a volume " + + "from non-managed storage to managed storage."); + } + + VirtualMachine vm = srcVolumeInfo.getAttachedVM(); + + if (vm != null && vm.getState() != VirtualMachine.State.Stopped) { + throw new CloudRuntimeException("Currently, if a volume to migrate from non-managed storage to managed storage is attached to " + + "a VM, the VM must be in the Stopped state."); + } + + destVolumeInfo.getDataStore().getDriver().createAsync(destVolumeInfo.getDataStore(), destVolumeInfo, null); + + VolumeVO volumeVO = _volumeDao.findById(destVolumeInfo.getId()); + + volumeVO.setPath(volumeVO.get_iScsiName()); + + _volumeDao.update(volumeVO.getId(), volumeVO); + + destVolumeInfo = _volumeDataFactory.getVolume(destVolumeInfo.getId(), destVolumeInfo.getDataStore()); + + long srcStoragePoolId = srcVolumeInfo.getPoolId(); + StoragePoolVO srcStoragePoolVO = _storagePoolDao.findById(srcStoragePoolId); + + HostVO hostVO; + + if (srcStoragePoolVO.getClusterId() != null) { + hostVO = getHostInCluster(srcStoragePoolVO.getClusterId()); + } + else { + hostVO = getHost(destVolumeInfo.getDataCenterId(), hypervisorType, false); + } + + // migrate the volume via the hypervisor + migrateVolume(srcVolumeInfo, destVolumeInfo, hostVO, "Unable to migrate the volume from non-managed storage to managed storage"); + + volumeVO = _volumeDao.findById(destVolumeInfo.getId()); + + volumeVO.setFormat(ImageFormat.QCOW2); + + _volumeDao.update(volumeVO.getId(), volumeVO); + } + catch (Exception ex) { + errMsg = "Migration operation failed in 'StorageSystemDataMotionStrategy.handleVolumeMigrationFromNonManagedStorageToManagedStorage': " + + ex.getMessage(); + + throw new CloudRuntimeException(errMsg); + } + finally { + CopyCmdAnswer copyCmdAnswer; + + if (errMsg != null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } + else { + destVolumeInfo = _volumeDataFactory.getVolume(destVolumeInfo.getId(), destVolumeInfo.getDataStore()); + + DataTO dataTO = destVolumeInfo.getTO(); + + copyCmdAnswer = new CopyCmdAnswer(dataTO); + } + + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + + result.setResult(errMsg); + + callback.complete(result); + } + } + + /** + * This function is responsible for copying a snapshot from managed storage to secondary storage. This is used in the following two cases: + * 1) When creating a template from a snapshot + * 2) When createSnapshot is called with location=SECONDARY + * + * @param snapshotInfo source snapshot + * @param destData destination (can be template or snapshot) + * @param callback callback for async + */ + private void handleCopyDataToSecondaryStorage(SnapshotInfo snapshotInfo, DataObject destData, AsyncCompletionCallback callback) { + String errMsg = null; + CopyCmdAnswer copyCmdAnswer = null; + boolean usingBackendSnapshot = false; + + try { + snapshotInfo.processEvent(Event.CopyingRequested); + + HostVO hostVO = getHost(snapshotInfo); + + boolean needCache = needCacheStorage(snapshotInfo, destData); + + DataObject destOnStore = destData; + + if (needCache) { + // creates an object in the DB for data to be cached + Scope selectedScope = pickCacheScopeForCopy(snapshotInfo, destData); + + destOnStore = cacheMgr.getCacheObject(snapshotInfo, selectedScope); + + destOnStore.processEvent(Event.CreateOnlyRequested); + } + + usingBackendSnapshot = usingBackendSnapshotFor(snapshotInfo); + + if (usingBackendSnapshot) { + final boolean computeClusterSupportsVolumeClone; + + // only XenServer, VMware, and KVM are currently supported + if (HypervisorType.XenServer.equals(snapshotInfo.getHypervisorType())) { + computeClusterSupportsVolumeClone = clusterDao.getSupportsResigning(hostVO.getClusterId()); + } + else if (HypervisorType.VMware.equals(snapshotInfo.getHypervisorType()) || HypervisorType.KVM.equals(snapshotInfo.getHypervisorType())) { + computeClusterSupportsVolumeClone = true; + } + else { + throw new CloudRuntimeException("Unsupported hypervisor type"); + } + + if (!computeClusterSupportsVolumeClone) { + String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + + hostVO.getClusterId(); + + LOGGER.warn(noSupportForResignErrMsg); + + throw new CloudRuntimeException(noSupportForResignErrMsg); + } + } + + String vmdk = null; + String uuid = null; + boolean keepGrantedAccess = false; + + DataStore srcDataStore = snapshotInfo.getDataStore(); + + if (usingBackendSnapshot) { + createVolumeFromSnapshot(snapshotInfo); + + if (HypervisorType.XenServer.equals(snapshotInfo.getHypervisorType()) || HypervisorType.VMware.equals(snapshotInfo.getHypervisorType())) { + keepGrantedAccess = HypervisorType.XenServer.equals(snapshotInfo.getHypervisorType()); + + Map extraDetails = null; + + if (HypervisorType.VMware.equals(snapshotInfo.getHypervisorType())) { + extraDetails = new HashMap<>(); + + String extraDetailsVmdk = getSnapshotProperty(snapshotInfo.getId(), DiskTO.VMDK); + + extraDetails.put(DiskTO.VMDK, extraDetailsVmdk); + extraDetails.put(DiskTO.TEMPLATE_RESIGN, Boolean.TRUE.toString()); + } + + copyCmdAnswer = performResignature(snapshotInfo, hostVO, extraDetails, keepGrantedAccess); + + // If using VMware, have the host rescan its software HBA if dynamic discovery is in use. + if (HypervisorType.VMware.equals(snapshotInfo.getHypervisorType())) { + String iqn = getSnapshotProperty(snapshotInfo.getId(), DiskTO.IQN); + + disconnectHostFromVolume(hostVO, srcDataStore.getId(), iqn); + } + + if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { + if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { + throw new CloudRuntimeException(copyCmdAnswer.getDetails()); + } else { + throw new CloudRuntimeException("Unable to create volume from snapshot"); + } + } + + vmdk = copyCmdAnswer.getNewData().getPath(); + uuid = UUID.randomUUID().toString(); + } + } + + String value = _configDao.getValue(Config.PrimaryStorageDownloadWait.toString()); + int primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); + CopyCommand copyCommand = new CopyCommand(snapshotInfo.getTO(), destOnStore.getTO(), primaryStorageDownloadWait, + VirtualMachineManager.ExecuteInSequence.value()); + + try { + if (!keepGrantedAccess) { + _volumeService.grantAccess(snapshotInfo, hostVO, srcDataStore); + } + + Map srcDetails = getSnapshotDetails(snapshotInfo); + + if (isForVMware(destData)) { + srcDetails.put(DiskTO.VMDK, vmdk); + srcDetails.put(DiskTO.UUID, uuid); + + if (destData instanceof TemplateInfo) { + VMTemplateVO templateDataStoreVO = _vmTemplateDao.findById(destData.getId()); + + templateDataStoreVO.setUniqueName(uuid); + + _vmTemplateDao.update(destData.getId(), templateDataStoreVO); + } + } + + copyCommand.setOptions(srcDetails); + + copyCmdAnswer = (CopyCmdAnswer)_agentMgr.send(hostVO.getId(), copyCommand); + + if (!copyCmdAnswer.getResult()) { + // We were not able to copy. Handle it. + errMsg = copyCmdAnswer.getDetails(); + + throw new CloudRuntimeException(errMsg); + } + + if (needCache) { + // If cached storage was needed (in case of object store as secondary + // storage), at this point, the data has been copied from the primary + // to the NFS cache by the hypervisor. We now invoke another copy + // command to copy this data from cache to secondary storage. We + // then clean up the cache. + + destOnStore.processEvent(Event.OperationSuccessed, copyCmdAnswer); + + CopyCommand cmd = new CopyCommand(destOnStore.getTO(), destData.getTO(), primaryStorageDownloadWait, + VirtualMachineManager.ExecuteInSequence.value()); + EndPoint ep = selector.select(destOnStore, destData); + + if (ep == null) { + errMsg = "No remote endpoint to send command, check if host or SSVM is down"; + + LOGGER.error(errMsg); + + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } else { + copyCmdAnswer = (CopyCmdAnswer)ep.sendMessage(cmd); + } + + // clean up snapshot copied to staging + cacheMgr.deleteCacheObject(destOnStore); + } + } catch (CloudRuntimeException | AgentUnavailableException | OperationTimedoutException ex) { + String msg = "Failed to create template from snapshot (Snapshot ID = " + snapshotInfo.getId() + ") : "; + + LOGGER.warn(msg, ex); + + throw new CloudRuntimeException(msg + ex.getMessage(), ex); + } finally { + _volumeService.revokeAccess(snapshotInfo, hostVO, srcDataStore); + + // If using VMware, have the host rescan its software HBA if dynamic discovery is in use. + if (HypervisorType.VMware.equals(snapshotInfo.getHypervisorType())) { + String iqn = getSnapshotProperty(snapshotInfo.getId(), DiskTO.IQN); + + disconnectHostFromVolume(hostVO, srcDataStore.getId(), iqn); + } + + if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { + if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { + errMsg = copyCmdAnswer.getDetails(); + + if (needCache) { + cacheMgr.deleteCacheObject(destOnStore); + } + } + else { + errMsg = "Unable to create template from snapshot"; + } + } + + try { + if (StringUtils.isEmpty(errMsg)) { + snapshotInfo.processEvent(Event.OperationSuccessed); + } + else { + snapshotInfo.processEvent(Event.OperationFailed); + } + } + catch (Exception ex) { + LOGGER.warn("Error processing snapshot event: " + ex.getMessage(), ex); } } - } catch (InterruptedException | ExecutionException ex) { - volumeInfo.getDataStore().getDriver().deleteAsync(volumeInfo.getDataStore(), volumeInfo, null); + } + catch (Exception ex) { + errMsg = ex.getMessage(); - throw new CloudRuntimeException("Create volume from template (ID = " + templateInfo.getId() + ") failed " + ex.getMessage()); + throw new CloudRuntimeException(errMsg); } + finally { + if (usingBackendSnapshot) { + deleteVolumeFromSnapshot(snapshotInfo); + } - CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + if (copyCmdAnswer == null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } - result.setResult(errMsg); + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + + result.setResult(errMsg); + + callback.complete(result); + } + } + + /** + * Creates a volume on the storage from a snapshot that resides on the secondary storage (archived snapshot). + * @param snapshotInfo snapshot on secondary + * @param volumeInfo volume to be created on the storage + * @param callback for async + */ + private void handleCreateVolumeFromSnapshotOnSecondaryStorage(SnapshotInfo snapshotInfo, VolumeInfo volumeInfo, + AsyncCompletionCallback callback) { + String errMsg = null; + CopyCmdAnswer copyCmdAnswer = null; + + try { + // at this point, the snapshotInfo and volumeInfo should have the same disk offering ID (so either one should be OK to get a DiskOfferingVO instance) + DiskOfferingVO diskOffering = _diskOfferingDao.findByIdIncludingRemoved(volumeInfo.getDiskOfferingId()); + SnapshotVO snapshot = _snapshotDao.findById(snapshotInfo.getId()); + + // update the volume's hv_ss_reserve (hypervisor snapshot reserve) from a disk offering (used for managed storage) + _volumeService.updateHypervisorSnapshotReserveForVolume(diskOffering, volumeInfo.getId(), snapshot.getHypervisorType()); + + HostVO hostVO; + + // create a volume on the storage + AsyncCallFuture future = _volumeService.createVolumeAsync(volumeInfo, volumeInfo.getDataStore()); + VolumeApiResult result = future.get(); + + if (result.isFailed()) { + LOGGER.error("Failed to create a volume: " + result.getResult()); + + throw new CloudRuntimeException(result.getResult()); + } + + volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); + volumeInfo.processEvent(Event.MigrationRequested); + volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); + + hostVO = getHost(snapshotInfo.getDataCenterId(), snapshotInfo.getHypervisorType(), false); + + // copy the volume from secondary via the hypervisor + if (HypervisorType.XenServer.equals(snapshotInfo.getHypervisorType())) { + copyCmdAnswer = performCopyOfVdi(volumeInfo, snapshotInfo, hostVO); + } + else { + copyCmdAnswer = copyImageToVolume(snapshotInfo, volumeInfo, hostVO); + } + + if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { + if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { + throw new CloudRuntimeException(copyCmdAnswer.getDetails()); + } + else { + throw new CloudRuntimeException("Unable to create volume from snapshot"); + } + } + } + catch (Exception ex) { + errMsg = "Copy operation failed in 'StorageSystemDataMotionStrategy.handleCreateVolumeFromSnapshotOnSecondaryStorage': " + + ex.getMessage(); + + throw new CloudRuntimeException(errMsg); + } + finally { + if (copyCmdAnswer == null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } + + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + + result.setResult(errMsg); + + callback.complete(result); + } + } + + /** + * Clones a template present on the storage to a new volume and resignatures it. + * + * @param templateInfo source template + * @param volumeInfo destination ROOT volume + * @param callback for async + */ + private void handleCreateVolumeFromTemplateBothOnStorageSystem(TemplateInfo templateInfo, VolumeInfo volumeInfo, AsyncCompletionCallback callback) { + String errMsg = null; + CopyCmdAnswer copyCmdAnswer = null; + + try { + Preconditions.checkArgument(templateInfo != null, "Passing 'null' to templateInfo of " + + "handleCreateVolumeFromTemplateBothOnStorageSystem is not supported."); + Preconditions.checkArgument(volumeInfo != null, "Passing 'null' to volumeInfo of " + + "handleCreateVolumeFromTemplateBothOnStorageSystem is not supported."); + + verifyFormat(templateInfo.getFormat()); + + HostVO hostVO = null; + + final boolean computeClusterSupportsVolumeClone; + + // only XenServer, VMware, and KVM are currently supported + // Leave host equal to null for KVM since we don't need to perform a resignature when using that hypervisor type. + if (volumeInfo.getFormat() == ImageFormat.VHD) { + hostVO = getHost(volumeInfo.getDataCenterId(), HypervisorType.XenServer, true); + + if (hostVO == null) { + throw new CloudRuntimeException("Unable to locate a host capable of resigning in the zone with the following ID: " + + volumeInfo.getDataCenterId()); + } + + computeClusterSupportsVolumeClone = clusterDao.getSupportsResigning(hostVO.getClusterId()); + + if (!computeClusterSupportsVolumeClone) { + String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + + hostVO.getClusterId(); + + LOGGER.warn(noSupportForResignErrMsg); + + throw new CloudRuntimeException(noSupportForResignErrMsg); + } + } + else if (volumeInfo.getFormat() == ImageFormat.OVA) { + // all VMware hosts support resigning + hostVO = getHost(volumeInfo.getDataCenterId(), HypervisorType.VMware, false); + + if (hostVO == null) { + throw new CloudRuntimeException("Unable to locate a host capable of resigning in the zone with the following ID: " + + volumeInfo.getDataCenterId()); + } + } + + VolumeDetailVO volumeDetail = new VolumeDetailVO(volumeInfo.getId(), + "cloneOfTemplate", + String.valueOf(templateInfo.getId()), + false); + + volumeDetail = volumeDetailsDao.persist(volumeDetail); + + AsyncCallFuture future = _volumeService.createVolumeAsync(volumeInfo, volumeInfo.getDataStore()); + + int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(_configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); + + VolumeApiResult result = future.get(storagePoolMaxWaitSeconds, TimeUnit.SECONDS); + + if (volumeDetail != null) { + volumeDetailsDao.remove(volumeDetail.getId()); + } + + if (result.isFailed()) { + LOGGER.warn("Failed to create a volume: " + result.getResult()); + + throw new CloudRuntimeException(result.getResult()); + } + + volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); + volumeInfo.processEvent(Event.MigrationRequested); + volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); + + if (hostVO != null) { + Map extraDetails = null; + + if (HypervisorType.VMware.equals(templateInfo.getHypervisorType())) { + extraDetails = new HashMap<>(); + + String extraDetailsVmdk = templateInfo.getUniqueName() + ".vmdk"; + + extraDetails.put(DiskTO.VMDK, extraDetailsVmdk); + extraDetails.put(DiskTO.EXPAND_DATASTORE, Boolean.TRUE.toString()); + } + + copyCmdAnswer = performResignature(volumeInfo, hostVO, extraDetails); + + if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { + if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { + throw new CloudRuntimeException(copyCmdAnswer.getDetails()); + } else { + throw new CloudRuntimeException("Unable to create a volume from a template"); + } + } + + // If using VMware, have the host rescan its software HBA if dynamic discovery is in use. + if (HypervisorType.VMware.equals(templateInfo.getHypervisorType())) { + disconnectHostFromVolume(hostVO, volumeInfo.getPoolId(), volumeInfo.get_iScsiName()); + } + } + else { + VolumeObjectTO newVolume = new VolumeObjectTO(); + + newVolume.setSize(volumeInfo.getSize()); + newVolume.setPath(volumeInfo.getPath()); + newVolume.setFormat(volumeInfo.getFormat()); + + copyCmdAnswer = new CopyCmdAnswer(newVolume); + } + } catch (Exception ex) { + try { + volumeInfo.getDataStore().getDriver().deleteAsync(volumeInfo.getDataStore(), volumeInfo, null); + } + catch (Exception exc) { + LOGGER.warn("Failed to delete volume", exc); + } + + if (templateInfo != null) { + errMsg = "Create volume from template (ID = " + templateInfo.getId() + ") failed: " + ex.getMessage(); + } + else { + errMsg = "Create volume from template failed: " + ex.getMessage(); + } + + throw new CloudRuntimeException(errMsg); + } + finally { + if (copyCmdAnswer == null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } + + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + + result.setResult(errMsg); - callback.complete(result); + callback.complete(result); + } } - private void handleCreateVolumeFromSnapshotBothOnStorageSystem(SnapshotInfo snapshotInfo, VolumeInfo volumeInfo, AsyncCompletionCallback callback) { - CopyCmdAnswer copyCmdAnswer = null; + private void handleCreateVolumeFromSnapshotBothOnStorageSystem(SnapshotInfo snapshotInfo, VolumeInfo volumeInfo, + AsyncCompletionCallback callback) { String errMsg = null; + CopyCmdAnswer copyCmdAnswer = null; try { + verifyFormat(snapshotInfo); + HostVO hostVO = getHost(snapshotInfo); boolean usingBackendSnapshot = usingBackendSnapshotFor(snapshotInfo); - boolean computeClusterSupportsResign = clusterDao.getSupportsResigning(hostVO.getClusterId()); + boolean computeClusterSupportsVolumeClone = true; + + if (HypervisorType.XenServer.equals(snapshotInfo.getHypervisorType())) { + computeClusterSupportsVolumeClone = clusterDao.getSupportsResigning(hostVO.getClusterId()); - if (usingBackendSnapshot && !computeClusterSupportsResign) { - String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + hostVO.getClusterId(); + if (usingBackendSnapshot && !computeClusterSupportsVolumeClone) { + String noSupportForResignErrMsg = "Unable to locate an applicable host with which to perform a resignature operation : Cluster ID = " + + hostVO.getClusterId(); - LOGGER.warn(noSupportForResignErrMsg); + LOGGER.warn(noSupportForResignErrMsg); - throw new CloudRuntimeException(noSupportForResignErrMsg); + throw new CloudRuntimeException(noSupportForResignErrMsg); + } } boolean canStorageSystemCreateVolumeFromVolume = canStorageSystemCreateVolumeFromVolume(snapshotInfo); - boolean useCloning = usingBackendSnapshot || (canStorageSystemCreateVolumeFromVolume && computeClusterSupportsResign); + boolean useCloning = usingBackendSnapshot || (canStorageSystemCreateVolumeFromVolume && computeClusterSupportsVolumeClone); VolumeDetailVO volumeDetail = null; @@ -499,7 +1187,6 @@ private void handleCreateVolumeFromSnapshotBothOnStorageSystem(SnapshotInfo snap _volumeService.updateHypervisorSnapshotReserveForVolume(diskOffering, volumeInfo.getId(), snapshot.getHypervisorType()); AsyncCallFuture future = _volumeService.createVolumeAsync(volumeInfo, volumeInfo.getDataStore()); - VolumeApiResult result = future.get(); if (volumeDetail != null) { @@ -513,96 +1200,519 @@ private void handleCreateVolumeFromSnapshotBothOnStorageSystem(SnapshotInfo snap } volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); - volumeInfo.processEvent(Event.MigrationRequested); - volumeInfo = _volumeDataFactory.getVolume(volumeInfo.getId(), volumeInfo.getDataStore()); - if (useCloning) { - copyCmdAnswer = performResignature(volumeInfo, hostVO); + if (HypervisorType.XenServer.equals(snapshotInfo.getHypervisorType()) || HypervisorType.VMware.equals(snapshotInfo.getHypervisorType())) { + if (useCloning) { + Map extraDetails = null; + + if (HypervisorType.VMware.equals(snapshotInfo.getHypervisorType())) { + extraDetails = new HashMap<>(); + + String extraDetailsVmdk = getSnapshotProperty(snapshotInfo.getId(), DiskTO.VMDK); + + extraDetails.put(DiskTO.VMDK, extraDetailsVmdk); + } + + copyCmdAnswer = performResignature(volumeInfo, hostVO, extraDetails); + + // If using VMware, have the host rescan its software HBA if dynamic discovery is in use. + if (HypervisorType.VMware.equals(snapshotInfo.getHypervisorType())) { + disconnectHostFromVolume(hostVO, volumeInfo.getPoolId(), volumeInfo.get_iScsiName()); + } + } else { + // asking for a XenServer host here so we don't always prefer to use XenServer hosts that support resigning + // even when we don't need those hosts to do this kind of copy work + hostVO = getHost(snapshotInfo.getDataCenterId(), snapshotInfo.getHypervisorType(), false); + + copyCmdAnswer = performCopyOfVdi(volumeInfo, snapshotInfo, hostVO); + } + + if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { + if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { + throw new CloudRuntimeException(copyCmdAnswer.getDetails()); + } else { + throw new CloudRuntimeException("Unable to create volume from snapshot"); + } + } + } + else if (HypervisorType.KVM.equals(snapshotInfo.getHypervisorType())) { + VolumeObjectTO newVolume = new VolumeObjectTO(); + + newVolume.setSize(volumeInfo.getSize()); + newVolume.setPath(volumeInfo.get_iScsiName()); + newVolume.setFormat(volumeInfo.getFormat()); + + copyCmdAnswer = new CopyCmdAnswer(newVolume); } else { - // asking for a XenServer host here so we don't always prefer to use XenServer hosts that support resigning - // even when we don't need those hosts to do this kind of copy work - hostVO = getHost(snapshotInfo.getDataCenterId(), false); + throw new CloudRuntimeException("Unsupported hypervisor type"); + } + } + catch (Exception ex) { + errMsg = "Copy operation failed in 'StorageSystemDataMotionStrategy.handleCreateVolumeFromSnapshotBothOnStorageSystem': " + + ex.getMessage(); - copyCmdAnswer = performCopyOfVdi(volumeInfo, snapshotInfo, hostVO); + throw new CloudRuntimeException(errMsg); + } + finally { + if (copyCmdAnswer == null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); } + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + + result.setResult(errMsg); + + callback.complete(result); + } + } + + private void handleCreateVolumeFromVolumeOnSecondaryStorage(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, + long dataCenterId, HypervisorType hypervisorType, + AsyncCompletionCallback callback) { + String errMsg = null; + CopyCmdAnswer copyCmdAnswer = null; + + try { + // create a volume on the storage + destVolumeInfo.getDataStore().getDriver().createAsync(destVolumeInfo.getDataStore(), destVolumeInfo, null); + + destVolumeInfo = _volumeDataFactory.getVolume(destVolumeInfo.getId(), destVolumeInfo.getDataStore()); + + HostVO hostVO = getHost(dataCenterId, hypervisorType, false); + + // copy the volume from secondary via the hypervisor + copyCmdAnswer = copyImageToVolume(srcVolumeInfo, destVolumeInfo, hostVO); + if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { - errMsg = copyCmdAnswer.getDetails(); + throw new CloudRuntimeException(copyCmdAnswer.getDetails()); } else { - errMsg = "Unable to create volume from snapshot"; + throw new CloudRuntimeException("Unable to create volume from volume"); } } } catch (Exception ex) { - errMsg = ex.getMessage() != null ? ex.getMessage() : "Copy operation failed in 'StorageSystemDataMotionStrategy.handleCreateVolumeFromSnapshotBothOnStorageSystem'"; + errMsg = "Copy operation failed in 'StorageSystemDataMotionStrategy.handleCreateVolumeFromVolumeOnSecondaryStorage': " + + ex.getMessage(); + + throw new CloudRuntimeException(errMsg); } + finally { + if (copyCmdAnswer == null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } - CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); - result.setResult(errMsg); + result.setResult(errMsg); + + callback.complete(result); + } + } + + private CopyCmdAnswer copyImageToVolume(DataObject srcDataObject, VolumeInfo destVolumeInfo, HostVO hostVO) { + String value = _configDao.getValue(Config.PrimaryStorageDownloadWait.toString()); + int primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); + + CopyCommand copyCommand = new CopyCommand(srcDataObject.getTO(), destVolumeInfo.getTO(), primaryStorageDownloadWait, + VirtualMachineManager.ExecuteInSequence.value()); + + CopyCmdAnswer copyCmdAnswer; + + try { + _volumeService.grantAccess(destVolumeInfo, hostVO, destVolumeInfo.getDataStore()); + + Map destDetails = getVolumeDetails(destVolumeInfo); + + copyCommand.setOptions2(destDetails); + + copyCmdAnswer = (CopyCmdAnswer)_agentMgr.send(hostVO.getId(), copyCommand); + } + catch (CloudRuntimeException | AgentUnavailableException | OperationTimedoutException ex) { + String msg = "Failed to copy image : "; + + LOGGER.warn(msg, ex); + + throw new CloudRuntimeException(msg + ex.getMessage(), ex); + } + finally { + _volumeService.revokeAccess(destVolumeInfo, hostVO, destVolumeInfo.getDataStore()); + } + + VolumeObjectTO volumeObjectTO = (VolumeObjectTO)copyCmdAnswer.getNewData(); + + volumeObjectTO.setFormat(ImageFormat.QCOW2); + + return copyCmdAnswer; + } + + /** + * If the underlying storage system is making use of read-only snapshots, this gives the storage system the opportunity to + * create a volume from the snapshot so that we can copy the VHD file that should be inside of the snapshot to secondary storage. + * + * The resultant volume must be writable because we need to resign the SR and the VDI that should be inside of it before we copy + * the VHD file to secondary storage. + * + * If the storage system is using writable snapshots, then nothing need be done by that storage system here because we can just + * resign the SR and the VDI that should be inside of the snapshot before copying the VHD file to secondary storage. + */ + private void createVolumeFromSnapshot(SnapshotInfo snapshotInfo) { + SnapshotDetailsVO snapshotDetails = handleSnapshotDetails(snapshotInfo.getId(), "create"); + + try { + snapshotInfo.getDataStore().getDriver().createAsync(snapshotInfo.getDataStore(), snapshotInfo, null); + } + finally { + _snapshotDetailsDao.remove(snapshotDetails.getId()); + } + } + + /** + * If the underlying storage system needed to create a volume from a snapshot for createVolumeFromSnapshot(SnapshotInfo), then + * this is its opportunity to delete that temporary volume and restore properties in snapshot_details to the way they were before the + * invocation of createVolumeFromSnapshot(SnapshotInfo). + */ + private void deleteVolumeFromSnapshot(SnapshotInfo snapshotInfo) { + SnapshotDetailsVO snapshotDetails = handleSnapshotDetails(snapshotInfo.getId(), "delete"); + + try { + snapshotInfo.getDataStore().getDriver().createAsync(snapshotInfo.getDataStore(), snapshotInfo, null); + } + finally { + _snapshotDetailsDao.remove(snapshotDetails.getId()); + } + } + + private SnapshotDetailsVO handleSnapshotDetails(long csSnapshotId, String value) { + String name = "tempVolume"; + + _snapshotDetailsDao.removeDetail(csSnapshotId, name); + + SnapshotDetailsVO snapshotDetails = new SnapshotDetailsVO(csSnapshotId, name, value, false); + + return _snapshotDetailsDao.persist(snapshotDetails); + } + + /** + * For each disk to migrate: + * Create a volume on the target storage system. + * Make the newly created volume accessible to the target KVM host. + * Send a command to the target KVM host to connect to the newly created volume. + * Send a command to the source KVM host to migrate the VM and its storage. + */ + @Override + public void copyAsync(Map volumeDataStoreMap, VirtualMachineTO vmTO, Host srcHost, Host destHost, AsyncCompletionCallback callback) { + String errMsg = null; + + try { + if (srcHost.getHypervisorType() != HypervisorType.KVM) { + throw new CloudRuntimeException("Invalid hypervisor type (only KVM supported for this operation at the time being)"); + } + + verifyLiveMigrationMapForKVM(volumeDataStoreMap); + + Map migrateStorage = new HashMap<>(); + Map srcVolumeInfoToDestVolumeInfo = new HashMap<>(); + + for (Map.Entry entry : volumeDataStoreMap.entrySet()) { + VolumeInfo srcVolumeInfo = entry.getKey(); + DataStore destDataStore = entry.getValue(); + + VolumeVO srcVolume = _volumeDao.findById(srcVolumeInfo.getId()); + StoragePoolVO destStoragePool = _storagePoolDao.findById(destDataStore.getId()); + + VolumeVO destVolume = duplicateVolumeOnAnotherStorage(srcVolume, destStoragePool); + VolumeInfo destVolumeInfo = _volumeDataFactory.getVolume(destVolume.getId(), destDataStore); + + // move the volume from Allocated to Creating + destVolumeInfo.processEvent(Event.MigrationCopyRequested); + // move the volume from Creating to Ready + destVolumeInfo.processEvent(Event.MigrationCopySucceeded); + // move the volume from Ready to Migrating + destVolumeInfo.processEvent(Event.MigrationRequested); + + // create a volume on the destination storage + destDataStore.getDriver().createAsync(destDataStore, destVolumeInfo, null); + + destVolume = _volumeDao.findById(destVolume.getId()); + + destVolume.setPath(destVolume.get_iScsiName()); + + _volumeDao.update(destVolume.getId(), destVolume); + + destVolumeInfo = _volumeDataFactory.getVolume(destVolume.getId(), destDataStore); + + _volumeService.grantAccess(destVolumeInfo, destHost, destDataStore); + + String connectedPath = connectHostToVolume(destHost, destVolumeInfo.getPoolId(), destVolumeInfo.get_iScsiName()); + + MigrateCommand.MigrateDiskInfo migrateDiskInfo = new MigrateCommand.MigrateDiskInfo(srcVolumeInfo.getPath(), + MigrateCommand.MigrateDiskInfo.DiskType.BLOCK, + MigrateCommand.MigrateDiskInfo.DriverType.RAW, + MigrateCommand.MigrateDiskInfo.Source.DEV, + connectedPath); + + migrateStorage.put(srcVolumeInfo.getPath(), migrateDiskInfo); + + srcVolumeInfoToDestVolumeInfo.put(srcVolumeInfo, destVolumeInfo); + } + + PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(vmTO); + + try { + Answer pfma = _agentMgr.send(destHost.getId(), pfmc); + + if (pfma == null || !pfma.getResult()) { + String details = pfma != null ? pfma.getDetails() : "null answer returned"; + String msg = "Unable to prepare for migration due to the following: " + details; + + throw new AgentUnavailableException(msg, destHost.getId()); + } + } + catch (final OperationTimedoutException e) { + throw new AgentUnavailableException("Operation timed out", destHost.getId()); + } + + VMInstanceVO vm = _vmDao.findById(vmTO.getId()); + boolean isWindows = _guestOsCategoryDao.findById(_guestOsDao.findById(vm.getGuestOSId()).getCategoryId()).getName().equalsIgnoreCase("Windows"); + + MigrateCommand migrateCommand = new MigrateCommand(vmTO.getName(), destHost.getPrivateIpAddress(), isWindows, vmTO, true); + + migrateCommand.setWait(StorageManager.KvmStorageOnlineMigrationWait.value()); + + migrateCommand.setMigrateStorage(migrateStorage); + + String autoConvergence = _configDao.getValue(Config.KvmAutoConvergence.toString()); + boolean kvmAutoConvergence = Boolean.parseBoolean(autoConvergence); + + migrateCommand.setAutoConvergence(kvmAutoConvergence); + + MigrateAnswer migrateAnswer = (MigrateAnswer)_agentMgr.send(srcHost.getId(), migrateCommand); + + boolean success = migrateAnswer != null && migrateAnswer.getResult(); + + handlePostMigration(success, srcVolumeInfoToDestVolumeInfo, vmTO, destHost); + + if (migrateAnswer == null) { + throw new CloudRuntimeException("Unable to get an answer to the migrate command"); + } + + if (!migrateAnswer.getResult()) { + errMsg = migrateAnswer.getDetails(); + + throw new CloudRuntimeException(errMsg); + } + } + catch (Exception ex) { + errMsg = "Copy operation failed in 'StorageSystemDataMotionStrategy.copyAsync': " + ex.getMessage(); + + throw new CloudRuntimeException(errMsg); + } + finally { + CopyCmdAnswer copyCmdAnswer = new CopyCmdAnswer(errMsg); + + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); + + result.setResult(errMsg); + + callback.complete(result); + } + } + + private void handlePostMigration(boolean success, Map srcVolumeInfoToDestVolumeInfo, VirtualMachineTO vmTO, Host destHost) { + if (!success) { + try { + PrepareForMigrationCommand pfmc = new PrepareForMigrationCommand(vmTO); + + pfmc.setRollback(true); + + Answer pfma = _agentMgr.send(destHost.getId(), pfmc); + + if (pfma == null || !pfma.getResult()) { + String details = pfma != null ? pfma.getDetails() : "null answer returned"; + String msg = "Unable to rollback prepare for migration due to the following: " + details; + + throw new AgentUnavailableException(msg, destHost.getId()); + } + } + catch (Exception e) { + LOGGER.debug("Failed to disconnect one or more (original) dest volumes", e); + } + } + + for (Map.Entry entry : srcVolumeInfoToDestVolumeInfo.entrySet()) { + VolumeInfo srcVolumeInfo = entry.getKey(); + VolumeInfo destVolumeInfo = entry.getValue(); + + if (success) { + srcVolumeInfo.processEvent(Event.OperationSuccessed); + destVolumeInfo.processEvent(Event.OperationSuccessed); + + _volumeDao.updateUuid(srcVolumeInfo.getId(), destVolumeInfo.getId()); + + VolumeVO volumeVO = _volumeDao.findById(destVolumeInfo.getId()); + + volumeVO.setFormat(ImageFormat.QCOW2); + + _volumeDao.update(volumeVO.getId(), volumeVO); + + try { + _volumeService.destroyVolume(srcVolumeInfo.getId()); + + srcVolumeInfo = _volumeDataFactory.getVolume(srcVolumeInfo.getId()); + + AsyncCallFuture destroyFuture = _volumeService.expungeVolumeAsync(srcVolumeInfo); + + if (destroyFuture.get().isFailed()) { + LOGGER.debug("Failed to clean up source volume on storage"); + } + } catch (Exception e) { + LOGGER.debug("Failed to clean up source volume on storage", e); + } + + // Update the volume ID for snapshots on secondary storage + if (!_snapshotDao.listByVolumeId(srcVolumeInfo.getId()).isEmpty()) { + _snapshotDao.updateVolumeIds(srcVolumeInfo.getId(), destVolumeInfo.getId()); + _snapshotDataStoreDao.updateVolumeIds(srcVolumeInfo.getId(), destVolumeInfo.getId()); + } + } + else { + try { + disconnectHostFromVolume(destHost, destVolumeInfo.getPoolId(), destVolumeInfo.get_iScsiName()); + } + catch (Exception e) { + LOGGER.debug("Failed to disconnect (new) dest volume", e); + } + + try { + _volumeService.revokeAccess(destVolumeInfo, destHost, destVolumeInfo.getDataStore()); + } + catch (Exception e) { + LOGGER.debug("Failed to revoke access from dest volume", e); + } + + destVolumeInfo.processEvent(Event.OperationFailed); + srcVolumeInfo.processEvent(Event.OperationFailed); + + try { + _volumeService.destroyVolume(destVolumeInfo.getId()); + + destVolumeInfo = _volumeDataFactory.getVolume(destVolumeInfo.getId()); + + AsyncCallFuture destroyFuture = _volumeService.expungeVolumeAsync(destVolumeInfo); + + if (destroyFuture.get().isFailed()) { + LOGGER.debug("Failed to clean up dest volume on storage"); + } + } catch (Exception e) { + LOGGER.debug("Failed to clean up dest volume on storage", e); + } + } + } + } + + private VolumeVO duplicateVolumeOnAnotherStorage(Volume volume, StoragePoolVO storagePoolVO) { + Long lastPoolId = volume.getPoolId(); + + VolumeVO newVol = new VolumeVO(volume); + + newVol.setInstanceId(null); + newVol.setChainInfo(null); + newVol.setPath(null); + newVol.setFolder(null); + newVol.setPodId(storagePoolVO.getPodId()); + newVol.setPoolId(storagePoolVO.getId()); + newVol.setLastPoolId(lastPoolId); + + return _volumeDao.persist(newVol); + } + + private String connectHostToVolume(Host host, long storagePoolId, String iqn) { + ModifyTargetsCommand modifyTargetsCommand = getModifyTargetsCommand(storagePoolId, iqn, true); + + return sendModifyTargetsCommand(modifyTargetsCommand, host.getId()).get(0); + } + + private void disconnectHostFromVolume(Host host, long storagePoolId, String iqn) { + ModifyTargetsCommand modifyTargetsCommand = getModifyTargetsCommand(storagePoolId, iqn, false); + + sendModifyTargetsCommand(modifyTargetsCommand, host.getId()); + } + + private ModifyTargetsCommand getModifyTargetsCommand(long storagePoolId, String iqn, boolean add) { + StoragePoolVO storagePool = _storagePoolDao.findById(storagePoolId); + + Map details = new HashMap<>(); + + details.put(ModifyTargetsCommand.IQN, iqn); + details.put(ModifyTargetsCommand.STORAGE_TYPE, storagePool.getPoolType().name()); + details.put(ModifyTargetsCommand.STORAGE_UUID, storagePool.getUuid()); + details.put(ModifyTargetsCommand.STORAGE_HOST, storagePool.getHostAddress()); + details.put(ModifyTargetsCommand.STORAGE_PORT, String.valueOf(storagePool.getPort())); + + ModifyTargetsCommand modifyTargetsCommand = new ModifyTargetsCommand(); + + List> targets = new ArrayList<>(); + + targets.add(details); + + modifyTargetsCommand.setTargets(targets); + modifyTargetsCommand.setApplyToAllHostsInCluster(true); + modifyTargetsCommand.setAdd(add); + modifyTargetsCommand.setTargetTypeToRemove(ModifyTargetsCommand.TargetTypeToRemove.DYNAMIC); - callback.complete(result); + return modifyTargetsCommand; } - /** - * If the underlying storage system is making use of read-only snapshots, this gives the storage system the opportunity to - * create a volume from the snapshot so that we can copy the VHD file that should be inside of the snapshot to secondary storage. - * - * The resultant volume must be writable because we need to resign the SR and the VDI that should be inside of it before we copy - * the VHD file to secondary storage. - * - * If the storage system is using writable snapshots, then nothing need be done by that storage system here because we can just - * resign the SR and the VDI that should be inside of the snapshot before copying the VHD file to secondary storage. - */ - private void createVolumeFromSnapshot(HostVO hostVO, SnapshotInfo snapshotInfo, boolean keepGrantedAccess) { - SnapshotDetailsVO snapshotDetails = handleSnapshotDetails(snapshotInfo.getId(), "tempVolume", "create"); + private List sendModifyTargetsCommand(ModifyTargetsCommand cmd, long hostId) { + ModifyTargetsAnswer modifyTargetsAnswer = (ModifyTargetsAnswer)_agentMgr.easySend(hostId, cmd); - try { - snapshotInfo.getDataStore().getDriver().createAsync(snapshotInfo.getDataStore(), snapshotInfo, null); - } - finally { - _snapshotDetailsDao.remove(snapshotDetails.getId()); + if (modifyTargetsAnswer == null) { + throw new CloudRuntimeException("Unable to get an answer to the modify targets command"); } - CopyCmdAnswer copyCmdAnswer = performResignature(snapshotInfo, hostVO, keepGrantedAccess); + if (!modifyTargetsAnswer.getResult()) { + String msg = "Unable to modify targets on the following host: " + hostId; - if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { - if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { - throw new CloudRuntimeException(copyCmdAnswer.getDetails()); - } - else { - throw new CloudRuntimeException("Unable to create volume from snapshot"); - } + throw new CloudRuntimeException(msg); } + + return modifyTargetsAnswer.getConnectedPaths(); } - /** - * If the underlying storage system needed to create a volume from a snapshot for createVolumeFromSnapshot(HostVO, SnapshotInfo), then - * this is its opportunity to delete that temporary volume and restore properties in snapshot_details to the way they were before the - * invocation of createVolumeFromSnapshot(HostVO, SnapshotInfo). - */ - private void deleteVolumeFromSnapshot(SnapshotInfo snapshotInfo) { - SnapshotDetailsVO snapshotDetails = handleSnapshotDetails(snapshotInfo.getId(), "tempVolume", "delete"); + /* + * At a high level: The source storage cannot be managed and the destination storage must be managed. + */ + private void verifyLiveMigrationMapForKVM(Map volumeDataStoreMap) { + for (Map.Entry entry : volumeDataStoreMap.entrySet()) { + VolumeInfo volumeInfo = entry.getKey(); - try { - snapshotInfo.getDataStore().getDriver().createAsync(snapshotInfo.getDataStore(), snapshotInfo, null); - } - finally { - _snapshotDetailsDao.remove(snapshotDetails.getId()); - } - } + Long storagePoolId = volumeInfo.getPoolId(); + StoragePoolVO srcStoragePoolVO = _storagePoolDao.findById(storagePoolId); - private SnapshotDetailsVO handleSnapshotDetails(long csSnapshotId, String name, String value) { - _snapshotDetailsDao.removeDetail(csSnapshotId, name); + if (srcStoragePoolVO == null) { + throw new CloudRuntimeException("Volume with ID " + volumeInfo.getId() + " is not associated with a storage pool."); + } - SnapshotDetailsVO snapshotDetails = new SnapshotDetailsVO(csSnapshotId, name, value, false); + if (srcStoragePoolVO.isManaged()) { + throw new CloudRuntimeException("Migrating a volume online with KVM from managed storage is not currently supported."); + } - return _snapshotDetailsDao.persist(snapshotDetails); + DataStore dataStore = entry.getValue(); + StoragePoolVO destStoragePoolVO = _storagePoolDao.findById(dataStore.getId()); + + if (destStoragePoolVO == null) { + throw new CloudRuntimeException("Destination storage pool with ID " + dataStore.getId() + " was not located."); + } + + if (!destStoragePoolVO.isManaged()) { + throw new CloudRuntimeException("Migrating a volume online with KVM can currently only be done when moving to managed storage."); + } + } } private boolean canStorageSystemCreateVolumeFromVolume(SnapshotInfo snapshotInfo) { @@ -621,7 +1731,17 @@ private boolean canStorageSystemCreateVolumeFromVolume(SnapshotInfo snapshotInfo return supportsCloningVolumeFromVolume; } - private String getProperty(long snapshotId, String property) { + private String getVolumeProperty(long volumeId, String property) { + VolumeDetailVO volumeDetails = volumeDetailsDao.findDetail(volumeId, property); + + if (volumeDetails != null) { + return volumeDetails.getValue(); + } + + return null; + } + + private String getSnapshotProperty(long snapshotId, String property) { SnapshotDetailsVO snapshotDetails = _snapshotDetailsDao.findDetail(snapshotId, property); if (snapshotDetails != null) { @@ -631,18 +1751,124 @@ private String getProperty(long snapshotId, String property) { return null; } - private Map getVolumeDetails(VolumeInfo volumeInfo) { - Map volumeDetails = new HashMap(); + private void handleCreateTemplateFromVolume(VolumeInfo volumeInfo, TemplateInfo templateInfo, AsyncCompletionCallback callback) { + boolean srcVolumeDetached = volumeInfo.getAttachedVM() == null; - VolumeVO volumeVO = _volumeDao.findById(volumeInfo.getId()); + String errMsg = null; + CopyCmdAnswer copyCmdAnswer = null; + + try { + if (!ImageFormat.QCOW2.equals(volumeInfo.getFormat())) { + throw new CloudRuntimeException("When using managed storage, you can only create a template from a volume on KVM currently."); + } + + volumeInfo.processEvent(Event.MigrationRequested); + + HostVO hostVO = getHost(volumeInfo.getDataCenterId(), HypervisorType.KVM, false); + DataStore srcDataStore = volumeInfo.getDataStore(); + + String value = _configDao.getValue(Config.PrimaryStorageDownloadWait.toString()); + int primaryStorageDownloadWait = NumberUtils.toInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); + CopyCommand copyCommand = new CopyCommand(volumeInfo.getTO(), templateInfo.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value()); + + try { + if (srcVolumeDetached) { + _volumeService.grantAccess(volumeInfo, hostVO, srcDataStore); + } + + Map srcDetails = getVolumeDetails(volumeInfo); + + copyCommand.setOptions(srcDetails); + + copyCmdAnswer = (CopyCmdAnswer)_agentMgr.send(hostVO.getId(), copyCommand); + + if (!copyCmdAnswer.getResult()) { + // We were not able to copy. Handle it. + errMsg = copyCmdAnswer.getDetails(); + throw new CloudRuntimeException(errMsg); + } + + VMTemplateVO vmTemplateVO = _vmTemplateDao.findById(templateInfo.getId()); + + vmTemplateVO.setHypervisorType(HypervisorType.KVM); + + _vmTemplateDao.update(vmTemplateVO.getId(), vmTemplateVO); + } + catch (CloudRuntimeException | AgentUnavailableException | OperationTimedoutException ex) { + String msg = "Failed to create template from volume (Volume ID = " + volumeInfo.getId() + ") : "; + + LOGGER.warn(msg, ex); + + throw new CloudRuntimeException(msg + ex.getMessage(), ex); + } + finally { + try { + if (srcVolumeDetached) { + _volumeService.revokeAccess(volumeInfo, hostVO, srcDataStore); + } + } + catch (Exception ex) { + LOGGER.warn("Error revoking access to volume (Volume ID = " + volumeInfo.getId() + "): " + ex.getMessage(), ex); + } + if (copyCmdAnswer == null || !copyCmdAnswer.getResult()) { + if (copyCmdAnswer != null && !StringUtils.isEmpty(copyCmdAnswer.getDetails())) { + errMsg = copyCmdAnswer.getDetails(); + } + else { + errMsg = "Unable to create template from volume"; + } + } + + try { + if (StringUtils.isEmpty(errMsg)) { + volumeInfo.processEvent(Event.OperationSuccessed); + } + else { + volumeInfo.processEvent(Event.OperationFailed); + } + } + catch (Exception ex) { + LOGGER.warn("Error processing snapshot event: " + ex.getMessage(), ex); + } + } + } + catch (Exception ex) { + errMsg = ex.getMessage(); + + throw new CloudRuntimeException(errMsg); + } + finally { + if (copyCmdAnswer == null) { + copyCmdAnswer = new CopyCmdAnswer(errMsg); + } + + CopyCommandResult result = new CopyCommandResult(null, copyCmdAnswer); - long storagePoolId = volumeVO.getPoolId(); + result.setResult(errMsg); + + callback.complete(result); + } + } + + private Map getVolumeDetails(VolumeInfo volumeInfo) { + long storagePoolId = volumeInfo.getPoolId(); StoragePoolVO storagePoolVO = _storagePoolDao.findById(storagePoolId); + if (!storagePoolVO.isManaged()) { + return null; + } + + Map volumeDetails = new HashMap<>(); + + VolumeVO volumeVO = _volumeDao.findById(volumeInfo.getId()); + volumeDetails.put(DiskTO.STORAGE_HOST, storagePoolVO.getHostAddress()); volumeDetails.put(DiskTO.STORAGE_PORT, String.valueOf(storagePoolVO.getPort())); volumeDetails.put(DiskTO.IQN, volumeVO.get_iScsiName()); + volumeDetails.put(DiskTO.VOLUME_SIZE, String.valueOf(volumeVO.getSize())); + volumeDetails.put(DiskTO.SCSI_NAA_DEVICE_ID, getVolumeProperty(volumeInfo.getId(), DiskTO.SCSI_NAA_DEVICE_ID)); + ChapInfo chapInfo = _volumeService.getChapInfo(volumeInfo, volumeInfo.getDataStore()); if (chapInfo != null) { @@ -656,7 +1882,7 @@ private Map getVolumeDetails(VolumeInfo volumeInfo) { } private Map getSnapshotDetails(SnapshotInfo snapshotInfo) { - Map snapshotDetails = new HashMap(); + Map snapshotDetails = new HashMap<>(); long storagePoolId = snapshotInfo.getDataStore().getId(); StoragePoolVO storagePoolVO = _storagePoolDao.findById(storagePoolId); @@ -666,34 +1892,63 @@ private Map getSnapshotDetails(SnapshotInfo snapshotInfo) { long snapshotId = snapshotInfo.getId(); - snapshotDetails.put(DiskTO.IQN, getProperty(snapshotId, DiskTO.IQN)); + snapshotDetails.put(DiskTO.IQN, getSnapshotProperty(snapshotId, DiskTO.IQN)); + snapshotDetails.put(DiskTO.VOLUME_SIZE, String.valueOf(snapshotInfo.getSize())); + snapshotDetails.put(DiskTO.SCSI_NAA_DEVICE_ID, getSnapshotProperty(snapshotId, DiskTO.SCSI_NAA_DEVICE_ID)); - snapshotDetails.put(DiskTO.CHAP_INITIATOR_USERNAME, getProperty(snapshotId, DiskTO.CHAP_INITIATOR_USERNAME)); - snapshotDetails.put(DiskTO.CHAP_INITIATOR_SECRET, getProperty(snapshotId, DiskTO.CHAP_INITIATOR_SECRET)); - snapshotDetails.put(DiskTO.CHAP_TARGET_USERNAME, getProperty(snapshotId, DiskTO.CHAP_TARGET_USERNAME)); - snapshotDetails.put(DiskTO.CHAP_TARGET_SECRET, getProperty(snapshotId, DiskTO.CHAP_TARGET_SECRET)); + snapshotDetails.put(DiskTO.CHAP_INITIATOR_USERNAME, getSnapshotProperty(snapshotId, DiskTO.CHAP_INITIATOR_USERNAME)); + snapshotDetails.put(DiskTO.CHAP_INITIATOR_SECRET, getSnapshotProperty(snapshotId, DiskTO.CHAP_INITIATOR_SECRET)); + snapshotDetails.put(DiskTO.CHAP_TARGET_USERNAME, getSnapshotProperty(snapshotId, DiskTO.CHAP_TARGET_USERNAME)); + snapshotDetails.put(DiskTO.CHAP_TARGET_SECRET, getSnapshotProperty(snapshotId, DiskTO.CHAP_TARGET_SECRET)); return snapshotDetails; } private HostVO getHost(SnapshotInfo snapshotInfo) { - HostVO hostVO = getHost(snapshotInfo.getDataCenterId(), true); + HypervisorType hypervisorType = snapshotInfo.getHypervisorType(); - if (hostVO == null) { - hostVO = getHost(snapshotInfo.getDataCenterId(), false); + if (HypervisorType.XenServer.equals(hypervisorType)) { + HostVO hostVO = getHost(snapshotInfo.getDataCenterId(), hypervisorType, true); if (hostVO == null) { - throw new CloudRuntimeException("Unable to locate an applicable host in data center with ID = " + snapshotInfo.getDataCenterId()); + hostVO = getHost(snapshotInfo.getDataCenterId(), hypervisorType, false); + + if (hostVO == null) { + throw new CloudRuntimeException("Unable to locate an applicable host in data center with ID = " + snapshotInfo.getDataCenterId()); + } + } + + return hostVO; + } + + if (HypervisorType.VMware.equals(hypervisorType) || HypervisorType.KVM.equals(hypervisorType)) { + return getHost(snapshotInfo.getDataCenterId(), hypervisorType, false); + } + + throw new CloudRuntimeException("Unsupported hypervisor type"); + } + + private HostVO getHostInCluster(long clusterId) { + List hosts = _hostDao.findByClusterId(clusterId); + + if (hosts != null && hosts.size() > 0) { + Collections.shuffle(hosts, RANDOM); + + for (HostVO host : hosts) { + if (ResourceState.Enabled.equals(host.getResourceState())) { + return host; + } } } - return hostVO; + throw new CloudRuntimeException("Unable to locate a host"); } - private HostVO getHost(Long zoneId, boolean computeClusterMustSupportResign) { + private HostVO getHost(Long zoneId, HypervisorType hypervisorType, boolean computeClusterMustSupportResign) { Preconditions.checkArgument(zoneId != null, "Zone ID cannot be null."); + Preconditions.checkArgument(hypervisorType != null, "Hypervisor type cannot be null."); - List hosts = _hostDao.listByDataCenterIdAndHypervisorType(zoneId, HypervisorType.XenServer); + List hosts = _hostDao.listByDataCenterIdAndHypervisorType(zoneId, hypervisorType); if (hosts == null) { return null; @@ -704,6 +1959,10 @@ private HostVO getHost(Long zoneId, boolean computeClusterMustSupportResign) { Collections.shuffle(hosts, RANDOM); for (HostVO host : hosts) { + if (!ResourceState.Enabled.equals(host.getResourceState())) { + continue; + } + if (computeClusterMustSupportResign) { long clusterId = host.getClusterId(); @@ -726,15 +1985,6 @@ private HostVO getHost(Long zoneId, boolean computeClusterMustSupportResign) { return null; } - @Override - public void copyAsync(Map volumeMap, VirtualMachineTO vmTo, Host srcHost, Host destHost, AsyncCompletionCallback callback) { - CopyCommandResult result = new CopyCommandResult(null, null); - - result.setResult("Unsupported operation requested for copying data."); - - callback.complete(result); - } - private Map getDetails(DataObject dataObj) { if (dataObj instanceof VolumeInfo) { return getVolumeDetails((VolumeInfo)dataObj); @@ -746,19 +1996,45 @@ else if (dataObj instanceof SnapshotInfo) { throw new CloudRuntimeException("'dataObj' must be of type 'VolumeInfo' or 'SnapshotInfo'."); } - private CopyCmdAnswer performResignature(DataObject dataObj, HostVO hostVO) { - return performResignature(dataObj, hostVO, false); + private boolean isForVMware(DataObject dataObj) { + if (dataObj instanceof VolumeInfo) { + return ImageFormat.OVA.equals(((VolumeInfo)dataObj).getFormat()); + } + + if (dataObj instanceof SnapshotInfo) { + return ImageFormat.OVA.equals(((SnapshotInfo)dataObj).getBaseVolume().getFormat()); + } + + return dataObj instanceof TemplateInfo && HypervisorType.VMware.equals(((TemplateInfo)dataObj).getHypervisorType()); + } + + private CopyCmdAnswer performResignature(DataObject dataObj, HostVO hostVO, Map extraDetails) { + return performResignature(dataObj, hostVO, extraDetails, false); } - private CopyCmdAnswer performResignature(DataObject dataObj, HostVO hostVO, boolean keepGrantedAccess) { + private CopyCmdAnswer performResignature(DataObject dataObj, HostVO hostVO, Map extraDetails, boolean keepGrantedAccess) { long storagePoolId = dataObj.getDataStore().getId(); DataStore dataStore = dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary); Map details = getDetails(dataObj); + if (extraDetails != null) { + details.putAll(extraDetails); + } + ResignatureCommand command = new ResignatureCommand(details); - ResignatureAnswer answer = null; + ResignatureAnswer answer; + + GlobalLock lock = GlobalLock.getInternLock(dataStore.getUuid()); + + if (!lock.lock(LOCK_TIME_IN_SECONDS)) { + String errMsg = "Couldn't lock the DB (in performResignature) on the following string: " + dataStore.getUuid(); + + LOGGER.warn(errMsg); + + throw new CloudRuntimeException(errMsg); + } try { _volumeService.grantAccess(dataObj, hostVO, dataStore); @@ -775,7 +2051,10 @@ private CopyCmdAnswer performResignature(DataObject dataObj, HostVO hostVO, bool throw new CloudRuntimeException(msg + ex.getMessage()); } finally { - if (keepGrantedAccess == false) { + lock.unlock(); + lock.releaseRef(); + + if (!keepGrantedAccess) { _volumeService.revokeAccess(dataObj, hostVO, dataStore); } } @@ -802,20 +2081,184 @@ private CopyCmdAnswer performResignature(DataObject dataObj, HostVO hostVO, bool return new CopyCmdAnswer(newVolume); } + private DataObject cacheSnapshotChain(SnapshotInfo snapshot, Scope scope) { + DataObject leafData = null; + DataStore store = cacheMgr.getCacheStorage(snapshot, scope); + + while (snapshot != null) { + DataObject cacheData = cacheMgr.createCacheObject(snapshot, store); + + if (leafData == null) { + leafData = cacheData; + } + + snapshot = snapshot.getParent(); + } + + return leafData; + } + + private String migrateVolume(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, HostVO hostVO, String errMsg) { + boolean srcVolumeDetached = srcVolumeInfo.getAttachedVM() == null; + + try { + Map srcDetails = getVolumeDetails(srcVolumeInfo); + Map destDetails = getVolumeDetails(destVolumeInfo); + + MigrateVolumeCommand migrateVolumeCommand = new MigrateVolumeCommand(srcVolumeInfo.getTO(), destVolumeInfo.getTO(), + srcDetails, destDetails, StorageManager.KvmStorageOfflineMigrationWait.value()); + + if (srcVolumeDetached) { + _volumeService.grantAccess(srcVolumeInfo, hostVO, srcVolumeInfo.getDataStore()); + } + + _volumeService.grantAccess(destVolumeInfo, hostVO, destVolumeInfo.getDataStore()); + + MigrateVolumeAnswer migrateVolumeAnswer = (MigrateVolumeAnswer)_agentMgr.send(hostVO.getId(), migrateVolumeCommand); + + if (migrateVolumeAnswer == null || !migrateVolumeAnswer.getResult()) { + if (migrateVolumeAnswer != null && !StringUtils.isEmpty(migrateVolumeAnswer.getDetails())) { + throw new CloudRuntimeException(migrateVolumeAnswer.getDetails()); + } + else { + throw new CloudRuntimeException(errMsg); + } + } + + if (srcVolumeDetached) { + _volumeService.revokeAccess(destVolumeInfo, hostVO, destVolumeInfo.getDataStore()); + } + + try { + _volumeService.revokeAccess(srcVolumeInfo, hostVO, srcVolumeInfo.getDataStore()); + } + catch (Exception e) { + // This volume should be deleted soon, so just log a warning here. + LOGGER.warn(e.getMessage(), e); + } + + return migrateVolumeAnswer.getVolumePath(); + } + catch (Exception ex) { + try { + _volumeService.revokeAccess(destVolumeInfo, hostVO, destVolumeInfo.getDataStore()); + } + catch (Exception e) { + // This volume should be deleted soon, so just log a warning here. + LOGGER.warn(e.getMessage(), e); + } + + if (srcVolumeDetached) { + _volumeService.revokeAccess(srcVolumeInfo, hostVO, srcVolumeInfo.getDataStore()); + } + + String msg = "Failed to perform volume migration : "; + + LOGGER.warn(msg, ex); + + throw new CloudRuntimeException(msg + ex.getMessage(), ex); + } + } + + private String copyVolumeToSecondaryStorage(VolumeInfo srcVolumeInfo, VolumeInfo destVolumeInfo, HostVO hostVO, String errMsg) { + boolean srcVolumeDetached = srcVolumeInfo.getAttachedVM() == null; + + try { + StoragePoolVO storagePoolVO = _storagePoolDao.findById(srcVolumeInfo.getPoolId()); + Map srcDetails = getVolumeDetails(srcVolumeInfo); + + CopyVolumeCommand copyVolumeCommand = new CopyVolumeCommand(srcVolumeInfo.getId(), destVolumeInfo.getPath(), storagePoolVO, + destVolumeInfo.getDataStore().getUri(), true, StorageManager.KvmStorageOfflineMigrationWait.value(), true); + + copyVolumeCommand.setSrcData(srcVolumeInfo.getTO()); + copyVolumeCommand.setSrcDetails(srcDetails); + + if (srcVolumeDetached) { + _volumeService.grantAccess(srcVolumeInfo, hostVO, srcVolumeInfo.getDataStore()); + } + + CopyVolumeAnswer copyVolumeAnswer = (CopyVolumeAnswer)_agentMgr.send(hostVO.getId(), copyVolumeCommand); + + if (copyVolumeAnswer == null || !copyVolumeAnswer.getResult()) { + if (copyVolumeAnswer != null && !StringUtils.isEmpty(copyVolumeAnswer.getDetails())) { + throw new CloudRuntimeException(copyVolumeAnswer.getDetails()); + } + else { + throw new CloudRuntimeException(errMsg); + } + } + + return copyVolumeAnswer.getVolumePath(); + } + catch (Exception ex) { + String msg = "Failed to perform volume copy to secondary storage : "; + + LOGGER.warn(msg, ex); + + throw new CloudRuntimeException(msg + ex.getMessage()); + } + finally { + if (srcVolumeDetached) { + _volumeService.revokeAccess(srcVolumeInfo, hostVO, srcVolumeInfo.getDataStore()); + } + } + } + + private void setCertainVolumeValuesNull(long volumeId) { + VolumeVO volumeVO = _volumeDao.findById(volumeId); + + volumeVO.set_iScsiName(null); + volumeVO.setMinIops(null); + volumeVO.setMaxIops(null); + volumeVO.setHypervisorSnapshotReserve(null); + + _volumeDao.update(volumeId, volumeVO); + } + + private void updateVolumePath(long volumeId, String path) { + VolumeVO volumeVO = _volumeDao.findById(volumeId); + + volumeVO.setPath(path); + + _volumeDao.update(volumeId, volumeVO); + } + + /** + * Copies data from secondary storage to a primary volume + * @param volumeInfo The primary volume + * @param snapshotInfo destination of the copy + * @param hostVO the host used to copy the data + * @return result of the copy + */ private CopyCmdAnswer performCopyOfVdi(VolumeInfo volumeInfo, SnapshotInfo snapshotInfo, HostVO hostVO) { + Snapshot.LocationType locationType = snapshotInfo.getLocationType(); + String value = _configDao.getValue(Config.PrimaryStorageDownloadWait.toString()); int primaryStorageDownloadWait = NumbersUtil.parseInt(value, Integer.parseInt(Config.PrimaryStorageDownloadWait.getDefaultValue())); - CopyCommand copyCommand = new CopyCommand(snapshotInfo.getTO(), volumeInfo.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value()); + DataObject srcData = snapshotInfo; CopyCmdAnswer copyCmdAnswer = null; + DataObject cacheData = null; + + boolean needCacheStorage = needCacheStorage(snapshotInfo, volumeInfo); + + if (needCacheStorage) { + cacheData = cacheSnapshotChain(snapshotInfo, new ZoneScope(volumeInfo.getDataCenterId())); + srcData = cacheData; + } + + CopyCommand copyCommand = new CopyCommand(srcData.getTO(), volumeInfo.getTO(), primaryStorageDownloadWait, VirtualMachineManager.ExecuteInSequence.value()); try { - _volumeService.grantAccess(snapshotInfo, hostVO, snapshotInfo.getDataStore()); - _volumeService.grantAccess(volumeInfo, hostVO, volumeInfo.getDataStore()); + if (Snapshot.LocationType.PRIMARY.equals(locationType)) { + _volumeService.grantAccess(snapshotInfo, hostVO, snapshotInfo.getDataStore()); + + Map srcDetails = getSnapshotDetails(snapshotInfo); - Map srcDetails = getSnapshotDetails(snapshotInfo); + copyCommand.setOptions(srcDetails); + } - copyCommand.setOptions(srcDetails); + _volumeService.grantAccess(volumeInfo, hostVO, volumeInfo.getDataStore()); Map destDetails = getVolumeDetails(volumeInfo); @@ -828,11 +2271,18 @@ private CopyCmdAnswer performCopyOfVdi(VolumeInfo volumeInfo, SnapshotInfo snaps LOGGER.warn(msg, ex); - throw new CloudRuntimeException(msg + ex.getMessage()); + throw new CloudRuntimeException(msg + ex.getMessage(), ex); } finally { - _volumeService.revokeAccess(snapshotInfo, hostVO, snapshotInfo.getDataStore()); + if (Snapshot.LocationType.PRIMARY.equals(locationType)) { + _volumeService.revokeAccess(snapshotInfo, hostVO, snapshotInfo.getDataStore()); + } + _volumeService.revokeAccess(volumeInfo, hostVO, volumeInfo.getDataStore()); + + if (needCacheStorage && copyCmdAnswer != null && copyCmdAnswer.getResult()) { + cacheMgr.deleteCacheObject(cacheData); + } } return copyCmdAnswer; diff --git a/engine/storage/datamotion/test/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java b/engine/storage/datamotion/test/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java new file mode 100755 index 000000000000..dccb6b445e56 --- /dev/null +++ b/engine/storage/datamotion/test/org/apache/cloudstack/storage/motion/AncientDataMotionStrategyTest.java @@ -0,0 +1,99 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ +package org.apache.cloudstack.storage.motion; + +import static org.mockito.Mockito.when; + +import java.lang.reflect.Field; +import java.lang.reflect.Modifier; + +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.never; +import static org.mockito.Mockito.any; + +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.cloud.agent.api.to.DataTO; +import com.cloud.capacity.CapacityManager; +import com.cloud.hypervisor.Hypervisor.HypervisorType; + +@RunWith(PowerMockRunner.class) +@PrepareForTest(CapacityManager.class) +public class AncientDataMotionStrategyTest { + + @Spy + @InjectMocks + private AncientDataMotionStrategy strategy = new AncientDataMotionStrategy(); + + @Mock + DataTO dataTO; + @Mock + PrimaryDataStoreTO dataStoreTO; + @Mock + ConfigKey vmwareKey; + + private static final long POOL_ID = 1l; + private static final Boolean FULL_CLONE_FLAG = true; + + @Before + public void setup() throws Exception { + MockitoAnnotations.initMocks(this); + + replaceVmwareCreateCloneFullField(); + + when(vmwareKey.valueIn(POOL_ID)).thenReturn(FULL_CLONE_FLAG); + + when(dataTO.getHypervisorType()).thenReturn(HypervisorType.VMware); + when(dataTO.getDataStore()).thenReturn(dataStoreTO); + when(dataStoreTO.getId()).thenReturn(POOL_ID); + } + + private void replaceVmwareCreateCloneFullField() throws Exception { + Field field = CapacityManager.class.getDeclaredField("VmwareCreateCloneFull"); + field.setAccessible(true); + // remove final modifier from field + Field modifiersField = Field.class.getDeclaredField("modifiers"); + modifiersField.setAccessible(true); + modifiersField.setInt(field, field.getModifiers() & ~Modifier.FINAL); + field.set(null, vmwareKey); + } + + @Test + public void testAddFullCloneFlagOnVMwareDest(){ + strategy.addFullCloneFlagOnVMwareDest(dataTO); + verify(dataStoreTO).setFullCloneFlag(FULL_CLONE_FLAG); + } + + @Test + public void testAddFullCloneFlagOnNotVmwareDest(){ + when(dataTO.getHypervisorType()).thenReturn(HypervisorType.Any); + verify(dataStoreTO, never()).setFullCloneFlag(any(Boolean.class)); + } + +} diff --git a/engine/storage/image/pom.xml b/engine/storage/image/pom.xml index 86f50f6dc791..35a0bac72f46 100644 --- a/engine/storage/image/pom.xml +++ b/engine/storage/image/pom.xml @@ -16,7 +16,7 @@ org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml index 51be9d99faa8..5c7b05b756a1 100644 --- a/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml +++ b/engine/storage/image/resources/META-INF/cloudstack/core/spring-engine-storage-image-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > listTemplateOnCache(long templateId) { return tmplObjs; } + /** + * Given existing spool refs, return one pool id existing on pools and refs + */ + private Long getOneMatchingPoolIdFromRefs(List existingRefs, List pools) { + if (pools.isEmpty()) { + throw new CloudRuntimeException("No storage pools found"); + } + if (existingRefs.isEmpty()) { + return pools.get(0).getId(); + } else { + for (VMTemplateStoragePoolVO ref : existingRefs) { + for (StoragePoolVO p : pools) { + if (ref.getPoolId() == p.getId()) { + return p.getId(); + } + } + } + } + return null; + } + + /** + * Retrieve storage pools with scope = cluster or zone matching clusterId or dataCenterId depending on their scope + */ + private List getStoragePoolsFromClusterOrZone(Long clusterId, long dataCenterId, Hypervisor.HypervisorType hypervisorType) { + List pools = new ArrayList<>(); + if (clusterId != null) { + List clusterPools = primaryDataStoreDao.listPoolsByCluster(clusterId); + pools.addAll(clusterPools); + } + List zonePools = primaryDataStoreDao.findZoneWideStoragePoolsByHypervisor(dataCenterId, hypervisorType); + pools.addAll(zonePools); + return pools; + } + + @Override + public TemplateInfo getReadyBypassedTemplateOnPrimaryStore(long templateId, Long poolId, Long hostId) { + VMTemplateVO templateVO = imageDataDao.findById(templateId); + if (templateVO == null || !templateVO.isDirectDownload()) { + return null; + } + Long pool = poolId; + if (poolId == null) { + //Get ISO from existing pool ref + HostVO host = hostDao.findById(hostId); + List pools = getStoragePoolsFromClusterOrZone(host.getClusterId(), host.getDataCenterId(), host.getHypervisorType()); + List existingRefs = templatePoolDao.listByTemplateId(templateId); + pool = getOneMatchingPoolIdFromRefs(existingRefs, pools); + } + if (pool == null) { + throw new CloudRuntimeException("No storage pool found where to download template: " + templateId); + } + VMTemplateStoragePoolVO spoolRef = templatePoolDao.findByPoolTemplate(pool, templateId); + if (spoolRef == null) { + directDownloadManager.downloadTemplate(templateId, pool, hostId); + } + DataStore store = storeMgr.getDataStore(pool, DataStoreRole.Primary); + return this.getTemplate(templateId, store); + } + + @Override + public boolean isTemplateMarkedForDirectDownload(long templateId) { + VMTemplateVO templateVO = imageDataDao.findById(templateId); + return templateVO.isDirectDownload(); + } + } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java index df277d016e88..45e3941a5ec3 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/TemplateServiceImpl.java @@ -18,23 +18,19 @@ */ package org.apache.cloudstack.storage.image; +import java.io.File; import java.util.ArrayList; import java.util.Date; +import java.util.HashMap; import java.util.HashSet; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.ExecutionException; import javax.inject.Inject; -import com.cloud.configuration.Resource; -import com.cloud.event.EventTypes; -import com.cloud.event.UsageEventUtils; -import org.apache.cloudstack.engine.subsystem.api.storage.Scope; -import org.apache.cloudstack.framework.messagebus.MessageBus; -import org.apache.cloudstack.framework.messagebus.PublishScope; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService; @@ -46,6 +42,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; +import org.apache.cloudstack.engine.subsystem.api.storage.Scope; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; import org.apache.cloudstack.engine.subsystem.api.storage.StorageCacheManager; import org.apache.cloudstack.engine.subsystem.api.storage.TemplateDataFactory; @@ -58,6 +55,8 @@ import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcContext; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.messagebus.MessageBus; +import org.apache.cloudstack.framework.messagebus.PublishScope; import org.apache.cloudstack.storage.command.CommandResult; import org.apache.cloudstack.storage.command.DeleteCommand; import org.apache.cloudstack.storage.datastore.DataObjectManager; @@ -67,19 +66,29 @@ import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; import org.apache.cloudstack.storage.image.store.TemplateObject; import org.apache.cloudstack.storage.to.TemplateObjectTO; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.ListTemplateAnswer; import com.cloud.agent.api.storage.ListTemplateCommand; +import com.cloud.agent.api.to.DatadiskTO; import com.cloud.alert.AlertManager; import com.cloud.configuration.Config; +import com.cloud.configuration.Resource; +import com.cloud.configuration.Resource.ResourceType; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.dc.dao.DataCenterDao; +import com.cloud.event.EventTypes; +import com.cloud.event.UsageEventUtils; import com.cloud.exception.ResourceAllocationException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.storage.DataStoreRole; import com.cloud.storage.ImageStoreDetailsUtil; +import com.cloud.storage.ScopeType; +import com.cloud.storage.Storage; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.TemplateType; import com.cloud.storage.StoragePool; @@ -88,7 +97,6 @@ import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VMTemplateZoneVO; import com.cloud.storage.dao.VMTemplateDao; -import com.cloud.storage.dao.VMTemplatePoolDao; import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.storage.template.TemplateConstants; import com.cloud.storage.template.TemplateProp; @@ -102,6 +110,8 @@ import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; import com.cloud.utils.fsm.StateMachine2; +import com.cloud.vm.VmDetailConstants; +import com.google.common.base.Strings; @Component public class TemplateServiceImpl implements TemplateService { @@ -133,8 +143,6 @@ public class TemplateServiceImpl implements TemplateService { @Inject TemplateDataFactory _templateFactory; @Inject - VMTemplatePoolDao _tmpltPoolDao; - @Inject EndPointSelector _epSelector; @Inject TemplateManager _tmpltMgr; @@ -146,6 +154,8 @@ public class TemplateServiceImpl implements TemplateService { MessageBus _messageBus; @Inject ImageStoreDetailsUtil imageStoreDetailsUtil; + @Inject + TemplateDataFactory imageFactory; class TemplateOpContext extends AsyncRpcContext { final TemplateObject template; @@ -326,6 +336,17 @@ public void handleTemplateSync(DataStore store) { } } + for (Iterator iter = allTemplates.listIterator(); iter.hasNext();) { + VMTemplateVO child_template = iter.next(); + if (child_template.getParentTemplateId() != null) { + String uniqueName = child_template.getUniqueName(); + if (templateInfos.containsKey(uniqueName)) { + templateInfos.remove(uniqueName); + } + iter.remove(); + } + } + toBeDownloaded.addAll(allTemplates); final StateMachine2 stateMachine = VirtualMachineTemplate.State.getStateMachine(); @@ -369,8 +390,10 @@ public void handleTemplateSync(DataStore store) { etype = EventTypes.EVENT_ISO_CREATE; } - UsageEventUtils.publishUsageEvent(etype, tmplt.getAccountId(), zoneId, tmplt.getId(), tmplt.getName(), null, null, - tmpltInfo.getPhysicalSize(), tmpltInfo.getSize(), VirtualMachineTemplate.class.getName(), tmplt.getUuid()); + if (zoneId != null) { + UsageEventUtils.publishUsageEvent(etype, tmplt.getAccountId(), zoneId, tmplt.getId(), tmplt.getName(), null, null, + tmpltInfo.getPhysicalSize(), tmpltInfo.getSize(), VirtualMachineTemplate.class.getName(), tmplt.getUuid()); + } } tmpltStore.setDownloadPercent(100); @@ -445,6 +468,9 @@ public void handleTemplateSync(DataStore store) { } catch (NoTransitionException e) { s_logger.error("Unexpected state transition exception for template " + tmplt.getName() + ". Details: " + e.getMessage()); } + } else if (tmplt.isDirectDownload()) { + s_logger.info("Template " + tmplt.getName() + ":" + tmplt.getId() + " is marked for direct download, discarding it for download on image stores"); + toBeDownloaded.remove(tmplt); } else { s_logger.info("Template Sync did not find " + uniqueName + " on image store " + storeId + ", may request download based on available hypervisor types"); if (tmpltStore != null) { @@ -675,6 +701,18 @@ protected Void createTemplateCallback(AsyncCallbackDispatcher dataDiskTemplates = new ArrayList(); + ImageStoreEntity tmpltStore = (ImageStoreEntity)parentTemplate.getDataStore(); + dataDiskTemplates = tmpltStore.getDataDiskTemplates(parentTemplate); + int diskCount = 0; + VMTemplateVO templateVO = _templateDao.findById(parentTemplate.getId()); + _templateDao.loadDetails(templateVO); + DataStore imageStore = parentTemplate.getDataStore(); + Map details = parentTemplate.getDetails(); + if (details == null) { + details = templateVO.getDetails(); + if (details == null) { + details = new HashMap<>(); + } + } + for (DatadiskTO diskTemplate : dataDiskTemplates) { + if (!diskTemplate.isBootable()) { + createChildDataDiskTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++); + if (!diskTemplate.isIso() && Strings.isNullOrEmpty(details.get(VmDetailConstants.DATA_DISK_CONTROLLER))){ + details.put(VmDetailConstants.DATA_DISK_CONTROLLER, getOvaDiskControllerDetails(diskTemplate, false)); + details.put(VmDetailConstants.DATA_DISK_CONTROLLER + diskTemplate.getDiskId(), getOvaDiskControllerDetails(diskTemplate, false)); + } + } else { + finalizeParentTemplate(diskTemplate, templateVO, parentTemplate, imageStore, diskCount++); + if (Strings.isNullOrEmpty(VmDetailConstants.ROOT_DISK_CONTROLLER)) { + final String rootDiskController = getOvaDiskControllerDetails(diskTemplate, true); + if (!Strings.isNullOrEmpty(rootDiskController)) { + details.put(VmDetailConstants.ROOT_DISK_CONTROLLER, rootDiskController); + } + } + } + } + templateVO.setDetails(details); + _templateDao.saveDetails(templateVO); + return true; + } catch (CloudRuntimeException | InterruptedException | ExecutionException e) { + return false; + } + } + + private boolean createChildDataDiskTemplate(DatadiskTO dataDiskTemplate, VMTemplateVO template, TemplateInfo parentTemplate, DataStore imageStore, int diskCount) throws ExecutionException, InterruptedException { + // Make an entry in vm_template table + Storage.ImageFormat format = dataDiskTemplate.isIso() ? Storage.ImageFormat.ISO : template.getFormat(); + String suffix = dataDiskTemplate.isIso() ? "-IsoDiskTemplate-" : "-DataDiskTemplate-"; + TemplateType ttype = dataDiskTemplate.isIso() ? TemplateType.ISODISK : TemplateType.DATADISK; + final long templateId = _templateDao.getNextInSequence(Long.class, "id"); + long guestOsId = dataDiskTemplate.isIso() ? 1 : 0; + String templateName = dataDiskTemplate.isIso() ? dataDiskTemplate.getPath().substring(dataDiskTemplate.getPath().lastIndexOf(File.separator) + 1) : template.getName() + suffix + diskCount; + VMTemplateVO templateVO = new VMTemplateVO(templateId, templateName, format, false, false, false, ttype, template.getUrl(), + template.requiresHvm(), template.getBits(), template.getAccountId(), null, templateName, false, guestOsId, false, template.getHypervisorType(), null, + null, false, false, false); + if (dataDiskTemplate.isIso()){ + templateVO.setUniqueName(templateName); + } + templateVO.setParentTemplateId(template.getId()); + templateVO.setSize(dataDiskTemplate.getVirtualSize()); + templateVO = _templateDao.persist(templateVO); + // Make sync call to create Datadisk templates in image store + TemplateApiResult result = null; + TemplateInfo dataDiskTemplateInfo = imageFactory.getTemplate(templateVO.getId(), imageStore); + AsyncCallFuture future = createDatadiskTemplateAsync(parentTemplate, dataDiskTemplateInfo, dataDiskTemplate.getPath(), dataDiskTemplate.getDiskId(), + dataDiskTemplate.getFileSize(), dataDiskTemplate.isBootable()); + result = future.get(); + if (result.isSuccess()) { + // Make an entry in template_zone_ref table + if (imageStore.getScope().getScopeType() == ScopeType.REGION) { + associateTemplateToZone(templateId, null); + } else if (imageStore.getScope().getScopeType() == ScopeType.ZONE) { + Long zoneId = ((ImageStoreEntity)imageStore).getDataCenterId(); + VMTemplateZoneVO templateZone = new VMTemplateZoneVO(zoneId, templateId, new Date()); + _vmTemplateZoneDao.persist(templateZone); + } + _resourceLimitMgr.incrementResourceCount(template.getAccountId(), ResourceType.secondary_storage, templateVO.getSize()); + } else { + // Delete the Datadisk templates that were already created as they are now invalid + s_logger.debug("Since creation of Datadisk template: " + templateVO.getId() + " failed, delete other Datadisk templates that were created as part of parent" + + " template download"); + TemplateInfo parentTemplateInfo = imageFactory.getTemplate(templateVO.getParentTemplateId(), imageStore); + cleanupDatadiskTemplates(parentTemplateInfo); + } + return result.isSuccess(); + } + + private boolean finalizeParentTemplate(DatadiskTO dataDiskTemplate, VMTemplateVO templateVO, TemplateInfo parentTemplate, DataStore imageStore, int diskCount) throws ExecutionException, InterruptedException, CloudRuntimeException { + TemplateInfo templateInfo = imageFactory.getTemplate(templateVO.getId(), imageStore); + AsyncCallFuture templateFuture = createDatadiskTemplateAsync(parentTemplate, templateInfo, dataDiskTemplate.getPath(), dataDiskTemplate.getDiskId(), + dataDiskTemplate.getFileSize(), dataDiskTemplate.isBootable()); + TemplateApiResult result = null; + result = templateFuture.get(); + if (!result.isSuccess()) { + s_logger.debug("Since creation of parent template: " + templateInfo.getId() + " failed, delete Datadisk templates that were created as part of parent" + + " template download"); + cleanupDatadiskTemplates(templateInfo); + } + return result.isSuccess(); + } + + private String getOvaDiskControllerDetails(DatadiskTO diskTemplate, boolean isRootDisk) { + String controller = diskTemplate.getDiskController() ; + String controllerSubType = diskTemplate.getDiskControllerSubType(); + + if (controller != null) { + controller = controller.toLowerCase(); + } + + if (controllerSubType != null) { + controllerSubType = controllerSubType.toLowerCase(); + } + + if (StringUtils.isNotBlank(controller)) { + if (controller.contains("ide")) { + return "ide"; + } + if (controller.contains("scsi")) { + if (StringUtils.isNotBlank(controllerSubType)) { + if (controllerSubType.equals("lsilogicsas")) { + return "lsisas1068"; + } + return controllerSubType; + } + if (!isRootDisk) { + return "scsi"; + } + } + if (!isRootDisk) { + return "osdefault"; + } + } + + // Root disk to use global setting vmware.root.disk.controller + if (!isRootDisk) { + return "scsi"; + } + return controller; + } + + private void cleanupDatadiskTemplates(TemplateInfo parentTemplateInfo) { + DataStore imageStore = parentTemplateInfo.getDataStore(); + List datadiskTemplatesToDelete = _templateDao.listByParentTemplatetId(parentTemplateInfo.getId()); + for (VMTemplateVO datadiskTemplateToDelete: datadiskTemplatesToDelete) { + s_logger.info("Delete template: " + datadiskTemplateToDelete.getId() + " from image store: " + imageStore.getName()); + AsyncCallFuture future = deleteTemplateAsync(imageFactory.getTemplate(datadiskTemplateToDelete.getId(), imageStore)); + try { + TemplateApiResult result = future.get(); + if (!result.isSuccess()) { + s_logger.warn("Failed to delete datadisk template: " + datadiskTemplateToDelete + " from image store: " + imageStore.getName() + " due to: " + result.getResult()); + break; + } + _vmTemplateZoneDao.deletePrimaryRecordsForTemplate(datadiskTemplateToDelete.getId()); + _resourceLimitMgr.decrementResourceCount(datadiskTemplateToDelete.getAccountId(), ResourceType.secondary_storage, datadiskTemplateToDelete.getSize()); + } catch (Exception e) { + s_logger.debug("Delete datadisk template failed", e); + throw new CloudRuntimeException("Delete template Failed", e); + } + } + } + @Override public AsyncCallFuture deleteTemplateAsync(TemplateInfo template) { TemplateObject to = (TemplateObject)template; @@ -1003,4 +1201,69 @@ public void addSystemVMTemplatesToSecondary(DataStore store) { } } } + + private class CreateDataDiskTemplateContext extends AsyncRpcContext { + private final DataObject dataDiskTemplate; + private final AsyncCallFuture future; + + public CreateDataDiskTemplateContext(AsyncCompletionCallback callback, DataObject dataDiskTemplate, AsyncCallFuture future) { + super(callback); + this.dataDiskTemplate = dataDiskTemplate; + this.future = future; + } + + public AsyncCallFuture getFuture() { + return this.future; + } + } + + @Override + public AsyncCallFuture createDatadiskTemplateAsync(TemplateInfo parentTemplate, TemplateInfo dataDiskTemplate, String path, String diskId, long fileSize, boolean bootable) { + AsyncCallFuture future = new AsyncCallFuture(); + // Make an entry for disk template in template_store_ref table + DataStore store = parentTemplate.getDataStore(); + TemplateObject dataDiskTemplateOnStore; + if (!bootable) { + dataDiskTemplateOnStore = (TemplateObject)store.create(dataDiskTemplate); + dataDiskTemplateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.CreateOnlyRequested); + } else { + dataDiskTemplateOnStore = (TemplateObject) imageFactory.getTemplate(parentTemplate, store); + } + try { + CreateDataDiskTemplateContext context = new CreateDataDiskTemplateContext(null, dataDiskTemplateOnStore, future); + AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); + caller.setCallback(caller.getTarget().createDatadiskTemplateCallback(null, null)).setContext(context); + ImageStoreEntity tmpltStore = (ImageStoreEntity)parentTemplate.getDataStore(); + tmpltStore.createDataDiskTemplateAsync(dataDiskTemplate, path, diskId, fileSize, bootable, caller); + } catch (CloudRuntimeException ex) { + dataDiskTemplateOnStore.processEvent(ObjectInDataStoreStateMachine.Event.OperationFailed); + TemplateApiResult result = new TemplateApiResult(dataDiskTemplate); + result.setResult(ex.getMessage()); + if (future != null) { + future.complete(result); + } + } + return future; + } + + protected Void createDatadiskTemplateCallback(AsyncCallbackDispatcher callback, + CreateDataDiskTemplateContext context) { + DataObject dataDiskTemplate = context.dataDiskTemplate; + AsyncCallFuture future = context.getFuture(); + CreateCmdResult result = callback.getResult(); + TemplateApiResult dataDiskTemplateResult = new TemplateApiResult((TemplateObject)dataDiskTemplate); + try { + if (result.isSuccess()) { + dataDiskTemplate.processEvent(Event.OperationSuccessed, result.getAnswer()); + } else { + dataDiskTemplate.processEvent(Event.OperationFailed); + dataDiskTemplateResult.setResult(result.getResult()); + } + } catch (CloudRuntimeException e) { + s_logger.debug("Failed to process create template callback", e); + dataDiskTemplateResult.setResult(e.toString()); + } + future.complete(dataDiskTemplateResult); + return null; + } } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java index 182a8ec4cab7..f54673d2b61e 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/ImageStoreImpl.java @@ -20,6 +20,7 @@ import java.util.Date; import java.util.Set; +import java.util.List; import java.util.concurrent.ExecutionException; import javax.inject.Inject; @@ -42,7 +43,9 @@ import org.apache.cloudstack.storage.image.ImageStoreDriver; import org.apache.cloudstack.storage.image.datastore.ImageStoreEntity; import org.apache.cloudstack.storage.to.ImageStoreTO; - +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; +import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; +import com.cloud.agent.api.to.DatadiskTO; import com.cloud.agent.api.to.DataStoreTO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.storage.DataStoreRole; @@ -180,6 +183,11 @@ public String getProtocol() { return imageDataStoreVO.getProtocol(); } + @Override + public String getUrl() { + return imageDataStoreVO.getUrl(); + } + @Override public DataStoreTO getTO() { DataStoreTO to = getDriver().getStoreTO(this); @@ -209,5 +217,14 @@ public void deleteExtractUrl(String installPath, String url, Upload.Type entityT driver.deleteEntityExtractUrl(this, installPath, url, entityType); } + @Override + public List getDataDiskTemplates(DataObject obj) { + return driver.getDataDiskTemplates(obj); + } + + @Override + public Void createDataDiskTemplateAsync(TemplateInfo dataDiskTemplate, String path, String diskId, long fileSize, boolean bootable, AsyncCompletionCallback callback) { + return driver.createDataDiskTemplateAsync(dataDiskTemplate, path, diskId, bootable, fileSize, callback); + } } diff --git a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java index 6e78f190d5d3..9b9b711c40c0 100644 --- a/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java +++ b/engine/storage/image/src/org/apache/cloudstack/storage/image/store/TemplateObject.java @@ -34,6 +34,7 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreDao; import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.to.TemplateObjectTO; +import com.cloud.agent.api.storage.CreateDatadiskTemplateAnswer; import com.cloud.agent.api.Answer; import com.cloud.agent.api.to.DataObjectType; @@ -230,6 +231,16 @@ public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer answe templateVO.setSize(newTemplate.getSize()); imageDao.update(templateVO.getId(), templateVO); } + } else if (answer instanceof CreateDatadiskTemplateAnswer) { + CreateDatadiskTemplateAnswer createAnswer = (CreateDatadiskTemplateAnswer)answer; + TemplateObjectTO dataDiskTemplate = createAnswer.getDataDiskTemplate(); + TemplateDataStoreVO templateStoreRef = templateStoreDao.findByStoreTemplate(getDataStore().getId(), dataDiskTemplate.getId()); + templateStoreRef.setInstallPath(dataDiskTemplate.getPath()); + templateStoreRef.setDownloadPercent(100); + templateStoreRef.setDownloadState(Status.DOWNLOADED); + templateStoreRef.setSize(dataDiskTemplate.getSize()); + templateStoreRef.setPhysicalSize(dataDiskTemplate.getPhysicalSize()); + templateStoreDao.update(templateStoreRef.getId(), templateStoreRef); } } objectInStoreMgr.update(this, event); @@ -344,6 +355,14 @@ public String getInstallPath() { return obj != null ? obj.getInstallPath() : null; } + @Override + public boolean isDirectDownload() { + if (this.imageVO == null) { + return false; + } + return this.imageVO.isDirectDownload(); + } + public void setInstallPath(String installPath) { this.installPath = installPath; } @@ -450,6 +469,11 @@ public Long getSourceTemplateId() { return imageVO.getSourceTemplateId(); } + @Override + public Long getParentTemplateId() { + return imageVO.getParentTemplateId(); + } + @Override public String getTemplateTag() { return imageVO.getTemplateTag(); diff --git a/engine/storage/integration-test/pom.xml b/engine/storage/integration-test/pom.xml index 1d35f0f4f9b8..ad7dc5f87f07 100644 --- a/engine/storage/integration-test/pom.xml +++ b/engine/storage/integration-test/pom.xml @@ -16,7 +16,7 @@ org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml b/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml index b7ef363ff04d..944196da1fc1 100644 --- a/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml +++ b/engine/storage/integration-test/test/resource/fakeDriverTestContext.xml @@ -13,13 +13,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> @@ -35,15 +35,14 @@ - - + + - diff --git a/engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml b/engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml index a981b8e9b4e2..58074c2f35fa 100644 --- a/engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml +++ b/engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml @@ -12,13 +12,13 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/engine/storage/integration-test/test/resources/component.xml b/engine/storage/integration-test/test/resources/component.xml index 09818417ffb7..66a4aa80bab7 100644 --- a/engine/storage/integration-test/test/resources/component.xml +++ b/engine/storage/integration-test/test/resources/component.xml @@ -22,13 +22,13 @@ xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/engine/storage/resources/META-INF/cloudstack/storage-allocator/spring-engine-storage-storage-allocator-context.xml b/engine/storage/resources/META-INF/cloudstack/storage-allocator/spring-engine-storage-storage-allocator-context.xml index e4e02aa210e9..783c98aacbe2 100644 --- a/engine/storage/resources/META-INF/cloudstack/storage-allocator/spring-engine-storage-storage-allocator-context.xml +++ b/engine/storage/resources/META-INF/cloudstack/storage-allocator/spring-engine-storage-storage-allocator-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/engine/storage/snapshot/resources/META-INF/cloudstack/core/spring-engine-storage-snapshot-core-context.xml b/engine/storage/snapshot/resources/META-INF/cloudstack/core/spring-engine-storage-snapshot-core-context.xml index 308899280dcd..75545a89ed18 100644 --- a/engine/storage/snapshot/resources/META-INF/cloudstack/core/spring-engine-storage-snapshot-core-context.xml +++ b/engine/storage/snapshot/resources/META-INF/cloudstack/core/spring-engine-storage-snapshot-core-context.xml @@ -21,19 +21,17 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > + class="org.apache.cloudstack.storage.snapshot.SnapshotServiceImpl" /> + class="org.apache.cloudstack.storage.snapshot.SnapshotDataFactoryImpl"/> diff --git a/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml b/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml index de8d11ed3726..e94ee0780a67 100644 --- a/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml +++ b/engine/storage/snapshot/resources/META-INF/cloudstack/storage/spring-engine-storage-snapshot-storage-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > getSnapshots(long volumeId, DataStoreRole role) { + + SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findByVolume(volumeId, role); + if (snapshotStore == null) { + return new ArrayList<>(); + } + DataStore store = storeMgr.getDataStore(snapshotStore.getDataStoreId(), role); + List volSnapShots = snapshotDao.listByVolumeId(volumeId); + List infos = new ArrayList<>(); + for(SnapshotVO snapshot: volSnapShots) { + SnapshotObject info = SnapshotObject.getSnapshotObject(snapshot, store); + infos.add(info); + } + return infos; + } + + @Override public SnapshotInfo getSnapshot(long snapshotId, DataStoreRole role) { SnapshotVO snapshot = snapshotDao.findById(snapshotId); diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java index 60ff31e4342f..23e1650ffa0c 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotObject.java @@ -62,6 +62,7 @@ public class SnapshotObject implements SnapshotInfo { private SnapshotVO snapshot; private DataStore store; private Object payload; + private Boolean fullBackup; @Inject protected SnapshotDao snapshotDao; @Inject @@ -191,7 +192,9 @@ public void processEvent(ObjectInDataStoreStateMachine.Event event) { s_logger.debug("Failed to update state:" + e.toString()); throw new CloudRuntimeException("Failed to update state: " + e.toString()); } finally { - if (event == ObjectInDataStoreStateMachine.Event.OperationFailed) { + DataObjectInStore obj = objectInStoreMgr.findObject(this, this.getDataStore()); + if (event == ObjectInDataStoreStateMachine.Event.OperationFailed && !obj.getState().equals(ObjectInDataStoreStateMachine.State.Destroying)) { + // Don't delete db entry if snapshot is successfully removed. objectInStoreMgr.deleteIfNotReady(this); } } @@ -228,6 +231,11 @@ public String getName() { return snapshot.getName(); } + @Override + public long getSnapshotId() { + return snapshot.getSnapshotId(); + } + @Override public Date getCreated() { return snapshot.getCreated(); @@ -238,6 +246,9 @@ public Type getRecurringType() { return snapshot.getRecurringType(); } + @Override + public LocationType getLocationType() { return snapshot.getLocationType(); } + @Override public State getState() { return snapshot.getState(); @@ -383,6 +394,16 @@ public Object getPayload() { return payload; } + @Override + public void setFullBackup(Boolean data) { + fullBackup = data; + } + + @Override + public Boolean getFullBackup() { + return fullBackup; + } + @Override public boolean delete() { if (store != null) { diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java index f7f044fa8f15..601959bdcbd9 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotServiceImpl.java @@ -22,9 +22,6 @@ import javax.inject.Inject; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; import org.apache.cloudstack.engine.subsystem.api.storage.DataMotionService; @@ -44,20 +41,28 @@ import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcContext; +import org.apache.cloudstack.framework.jobs.AsyncJob; import org.apache.cloudstack.storage.command.CommandResult; import org.apache.cloudstack.storage.command.CopyCmdAnswer; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; +import org.apache.log4j.Logger; +import com.cloud.storage.CreateSnapshotPayload; +import com.cloud.event.EventTypes; +import com.cloud.event.UsageEventUtils; import com.cloud.storage.DataStoreRole; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotVO; import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.SnapshotDetailsDao; import com.cloud.storage.template.TemplateConstants; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import com.cloud.utils.db.TransactionStatus; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; -@Component public class SnapshotServiceImpl implements SnapshotService { private static final Logger s_logger = Logger.getLogger(SnapshotServiceImpl.class); @Inject @@ -72,6 +77,8 @@ public class SnapshotServiceImpl implements SnapshotService { DataMotionService motionSrv; @Inject StorageCacheManager _cacheMgr; + @Inject + private SnapshotDetailsDao _snapshotDetailsDao; static private class CreateSnapshotContext extends AsyncRpcContext { final SnapshotInfo snapshot; @@ -211,6 +218,8 @@ public SnapshotResult takeSnapshot(SnapshotInfo snap) { try { result = future.get(); + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_ON_PRIMARY, snap.getAccountId(), snap.getDataCenterId(), snap.getId(), + snap.getName(), null, null, snapshotOnPrimary.getSize(), snapshotOnPrimary.getSize(), snap.getClass().getName(), snap.getUuid()); return result; } catch (InterruptedException e) { s_logger.debug("Failed to create snapshot", e); @@ -226,9 +235,9 @@ public SnapshotResult takeSnapshot(SnapshotInfo snap) { // we are taking delta snapshot private DataStore findSnapshotImageStore(SnapshotInfo snapshot) { Boolean fullSnapshot = true; - Object payload = snapshot.getPayload(); - if (payload != null) { - fullSnapshot = (Boolean)payload; + Boolean snapshotFullBackup = snapshot.getFullBackup(); + if (snapshotFullBackup != null) { + fullSnapshot = snapshotFullBackup; } if (fullSnapshot) { return dataStoreMgr.getImageStore(snapshot.getDataCenterId()); @@ -284,7 +293,7 @@ public SnapshotInfo backupSnapshot(SnapshotInfo snapshot) { if (res.isFailed()) { throw new CloudRuntimeException(res.getResult()); } - SnapshotInfo destSnapshot = res.getSnashot(); + SnapshotInfo destSnapshot = res.getSnapshot(); return destSnapshot; } catch (InterruptedException e) { s_logger.debug("failed copy snapshot", e); @@ -300,19 +309,22 @@ protected Void copySnapshotAsyncCallback(AsyncCallbackDispatcher future = context.future; SnapshotResult snapResult = new SnapshotResult(destSnapshot, result.getAnswer()); if (result.isFailed()) { try { - destSnapshot.processEvent(Event.OperationFailed); - //if backup snapshot failed, mark srcSnapshot in snapshot_store_ref as failed also - srcSnapshot.processEvent(Event.DestroyRequested); - srcSnapshot.processEvent(Event.OperationSuccessed); - - srcSnapshot.processEvent(Snapshot.Event.OperationFailed); - _snapshotDao.remove(srcSnapshot.getId()); - } catch (NoTransitionException e) { - s_logger.debug("Failed to update state: " + e.toString()); + if (createSnapshotPayload.getAsyncBackup()) { + destSnapshot.processEvent(Event.OperationFailed); + throw new SnapshotBackupException("Failed in creating backup of snapshot with ID "+srcSnapshot.getId()); + } else { + destSnapshot.processEvent(Event.OperationFailed); + //if backup snapshot failed, mark srcSnapshot in snapshot_store_ref as failed also + cleanupOnSnapshotBackupFailure(context.srcSnapshot); + } + } catch (SnapshotBackupException e) { + s_logger.debug("Failed to create backup: " + e.toString()); } snapResult.setResult(result.getResult()); future.complete(snapResult); @@ -547,4 +559,38 @@ protected Void syncSnapshotCallBack(AsyncCallbackDispatcher stateMachine = new StateMachine2(); @Inject @@ -52,6 +49,8 @@ public SnapshotStateMachineManagerImpl() { stateMachine.addTransition(Snapshot.State.Copying, Event.OperationFailed, Snapshot.State.BackedUp); stateMachine.addTransition(Snapshot.State.Destroying, Event.OperationSucceeded, Snapshot.State.Destroyed); stateMachine.addTransition(Snapshot.State.Destroying, Event.OperationFailed, State.BackedUp); + stateMachine.addTransition(Snapshot.State.Destroying, Event.DestroyRequested, Snapshot.State.Destroying); + stateMachine.addTransition(Snapshot.State.BackingUp, Event.BackupToSecondary, Snapshot.State.BackingUp); stateMachine.registerListener(new SnapshotStateListener()); } diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategyBase.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategyBase.java index b08a8377f95d..ba16e75f737a 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategyBase.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/SnapshotStrategyBase.java @@ -28,7 +28,7 @@ public abstract class SnapshotStrategyBase implements SnapshotStrategy { @Override public SnapshotInfo takeSnapshot(SnapshotInfo snapshot) { - return snapshotSvr.takeSnapshot(snapshot).getSnashot(); + return snapshotSvr.takeSnapshot(snapshot).getSnapshot(); } @Override diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java index 02691ff318e8..a6fe50e25819 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/StorageSystemSnapshotStrategy.java @@ -16,39 +16,14 @@ // under the License. package org.apache.cloudstack.storage.snapshot; -import java.util.ArrayList; -import java.util.Collections; -import java.util.HashMap; -import java.util.List; -import java.util.Map; -import java.util.Random; - -import javax.inject.Inject; - -import org.apache.log4j.Logger; -import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; -import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory; -import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; -import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult; -import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority; -import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; -import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; -import org.apache.cloudstack.storage.command.SnapshotAndCopyAnswer; -import org.apache.cloudstack.storage.command.SnapshotAndCopyCommand; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; - -import org.springframework.stereotype.Component; - -import com.google.common.base.Optional; - import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.ModifyTargetsCommand; import com.cloud.agent.api.to.DiskTO; import com.cloud.dc.dao.ClusterDao; +import com.cloud.event.ActionEvent; +import com.cloud.event.EventTypes; +import com.cloud.event.UsageEventUtils; import com.cloud.exception.InvalidParameterValueException; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; @@ -57,6 +32,7 @@ import com.cloud.org.Grouping.AllocationState; import com.cloud.resource.ResourceState; import com.cloud.server.ManagementService; +import com.cloud.storage.CreateSnapshotPayload; import com.cloud.storage.DataStoreRole; import com.cloud.storage.Snapshot; import com.cloud.storage.SnapshotVO; @@ -67,11 +43,50 @@ import com.cloud.storage.dao.SnapshotDetailsDao; import com.cloud.storage.dao.SnapshotDetailsVO; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeDetailsDao; +import com.cloud.storage.VolumeDetailVO; import com.cloud.utils.db.DB; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.fsm.NoTransitionException; +import com.cloud.vm.VirtualMachine; import com.cloud.vm.VMInstanceVO; import com.cloud.vm.dao.VMInstanceDao; +import com.cloud.vm.snapshot.VMSnapshot; +import com.cloud.vm.snapshot.VMSnapshotService; +import com.cloud.vm.snapshot.VMSnapshotVO; +import com.cloud.vm.snapshot.dao.VMSnapshotDao; +import com.google.common.base.Preconditions; + +import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreCapabilities; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; +import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory; +import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotResult; +import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; +import org.apache.cloudstack.engine.subsystem.api.storage.VolumeService; +import org.apache.cloudstack.storage.command.SnapshotAndCopyAnswer; +import org.apache.cloudstack.storage.command.SnapshotAndCopyCommand; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import javax.inject.Inject; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.Random; +import java.util.UUID; @Component public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase { @@ -86,17 +101,59 @@ public class StorageSystemSnapshotStrategy extends SnapshotStrategyBase { @Inject private SnapshotDao snapshotDao; @Inject private SnapshotDataFactory snapshotDataFactory; @Inject private SnapshotDetailsDao snapshotDetailsDao; + @Inject private SnapshotDataStoreDao snapshotStoreDao; + @Inject private VolumeDetailsDao volumeDetailsDao; @Inject private VMInstanceDao vmInstanceDao; + @Inject private VMSnapshotDao vmSnapshotDao; + @Inject private VMSnapshotService vmSnapshotService; @Inject private VolumeDao volumeDao; @Inject private VolumeService volService; + @Inject private VolumeDetailsDao volumeDetailsDaoImpl; @Override public SnapshotInfo backupSnapshot(SnapshotInfo snapshotInfo) { - return snapshotInfo; + Preconditions.checkArgument(snapshotInfo != null, "'snapshotInfo' cannot be 'null'."); + + if (snapshotInfo.getLocationType() != Snapshot.LocationType.SECONDARY) { + markAsBackedUp((SnapshotObject)snapshotInfo); + + return snapshotInfo; + } + + // At this point, the snapshot is either taken as a native + // snapshot on the storage or exists as a volume on the storage (clone). + // If archive flag is passed in, we should copy this snapshot to secondary + // storage and delete it from primary storage. + + HostVO host = getHost(snapshotInfo.getVolumeId()); + + boolean canStorageSystemCreateVolumeFromSnapshot = canStorageSystemCreateVolumeFromSnapshot(snapshotInfo.getBaseVolume().getPoolId()); + + if (!canStorageSystemCreateVolumeFromSnapshot) { + String msg = "Cannot archive snapshot: 'canStorageSystemCreateVolumeFromSnapshot' was false."; + + s_logger.warn(msg); + + throw new CloudRuntimeException(msg); + } + + boolean computeClusterSupportsResign = clusterDao.getSupportsResigning(host.getClusterId()); + + if (!computeClusterSupportsResign) { + String msg = "Cannot archive snapshot: 'computeClusterSupportsResign' was false."; + + s_logger.warn(msg); + + throw new CloudRuntimeException(msg); + } + + return snapshotSvr.backupSnapshot(snapshotInfo); } @Override public boolean deleteSnapshot(Long snapshotId) { + Preconditions.checkArgument(snapshotId != null, "'snapshotId' cannot be 'null'."); + SnapshotVO snapshotVO = snapshotDao.findById(snapshotId); if (Snapshot.State.Destroyed.equals(snapshotVO.getState())) { @@ -110,9 +167,21 @@ public boolean deleteSnapshot(Long snapshotId) { } if (!Snapshot.State.BackedUp.equals(snapshotVO.getState())) { - throw new InvalidParameterValueException("Unable to delete snapshotshot " + snapshotId + " because it is in the following state: " + snapshotVO.getState()); + throw new InvalidParameterValueException("Unable to delete snapshot '" + snapshotId + + "' because it is in the following state: " + snapshotVO.getState()); } + return cleanupSnapshotOnPrimaryStore(snapshotId); + } + + /** + * This cleans up a snapshot which was taken on a primary store. + * + * @param snapshotId: ID of snapshot to be removed + * @return true if snapshot is removed; else, false + */ + @ActionEvent(eventType = EventTypes.EVENT_SNAPSHOT_OFF_PRIMARY, eventDescription = "deleting snapshot", async = true) + private boolean cleanupSnapshotOnPrimaryStore(long snapshotId) { SnapshotObject snapshotObj = (SnapshotObject)snapshotDataFactory.getSnapshot(snapshotId, DataStoreRole.Primary); if (snapshotObj == null) { @@ -124,11 +193,23 @@ public boolean deleteSnapshot(Long snapshotId) { } if (ObjectInDataStoreStateMachine.State.Copying.equals(snapshotObj.getStatus())) { - throw new InvalidParameterValueException("Unable to delete snapshotshot " + snapshotId + " because it is in the copying state."); + throw new InvalidParameterValueException("Unable to delete snapshot '" + snapshotId + "' because it is in the copying state"); } try { snapshotObj.processEvent(Snapshot.Event.DestroyRequested); + + List volumesFromSnapshot = volumeDetailsDaoImpl.findDetails("SNAPSHOT_ID", String.valueOf(snapshotId), null); + + if (volumesFromSnapshot.size() > 0) { + try { + snapshotObj.processEvent(Snapshot.Event.OperationFailed); + } catch (NoTransitionException e1) { + s_logger.debug("Failed to change snapshot state: " + e1.toString()); + } + + throw new InvalidParameterValueException("Unable to perform delete operation, Snapshot with id: " + snapshotId + " is in use "); + } } catch (NoTransitionException e) { s_logger.debug("Failed to set the state to destroying: ", e); @@ -140,6 +221,9 @@ public boolean deleteSnapshot(Long snapshotId) { snapshotSvr.deleteSnapshot(snapshotObj); snapshotObj.processEvent(Snapshot.Event.OperationSucceeded); + + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_OFF_PRIMARY, snapshotObj.getAccountId(), snapshotObj.getDataCenterId(), snapshotId, + snapshotObj.getName(), null, null, 0L, snapshotObj.getClass().getName(), snapshotObj.getUuid()); } catch (Exception e) { s_logger.debug("Failed to delete snapshot: ", e); @@ -157,9 +241,198 @@ public boolean deleteSnapshot(Long snapshotId) { return true; } + private boolean isAcceptableRevertFormat(VolumeVO volumeVO) { + return ImageFormat.VHD.equals(volumeVO.getFormat()) || ImageFormat.OVA.equals(volumeVO.getFormat()) || ImageFormat.QCOW2.equals(volumeVO.getFormat()); + } + + private void verifyFormat(VolumeInfo volumeInfo) { + ImageFormat imageFormat = volumeInfo.getFormat(); + + if (imageFormat != ImageFormat.VHD && imageFormat != ImageFormat.OVA && imageFormat != ImageFormat.QCOW2) { + throw new CloudRuntimeException("Only the following image types are currently supported: " + + ImageFormat.VHD.toString() + ", " + ImageFormat.OVA.toString() + ", and " + ImageFormat.QCOW2); + } + } + + private void verifyDiskTypeAndHypervisor(VolumeInfo volumeInfo) { + ImageFormat imageFormat = volumeInfo.getFormat(); + Volume.Type volumeType = volumeInfo.getVolumeType(); + + if (ImageFormat.OVA.equals(imageFormat) && Volume.Type.ROOT.equals(volumeType)) { + throw new CloudRuntimeException("The hypervisor type is VMware and the disk type is ROOT. For this situation, " + + "recover the data on the snapshot by creating a new CloudStack volume from the corresponding volume snapshot."); + } + } + + private void verifySnapshotType(SnapshotInfo snapshotInfo) { + if (snapshotInfo.getHypervisorType() == HypervisorType.KVM && snapshotInfo.getDataStore().getRole() != DataStoreRole.Primary) { + throw new CloudRuntimeException("For the KVM hypervisor type, you can only revert a volume to a snapshot state if the snapshot " + + "resides on primary storage. For other snapshot types, create a volume from the snapshot to recover its data."); + } + } + + private void verifyLocationType(SnapshotInfo snapshotInfo) { + VolumeInfo volumeInfo = snapshotInfo.getBaseVolume(); + + if (snapshotInfo.getLocationType() == Snapshot.LocationType.SECONDARY && volumeInfo.getFormat() != ImageFormat.VHD) { + throw new CloudRuntimeException("Only the '" + ImageFormat.VHD + "' image type can be used when 'LocationType' is set to 'SECONDARY'."); + } + } + + private boolean getHypervisorRequiresResignature(VolumeInfo volumeInfo) { + return ImageFormat.VHD.equals(volumeInfo.getFormat()) || ImageFormat.OVA.equals(volumeInfo.getFormat()); + } + @Override - public boolean revertSnapshot(SnapshotInfo snapshot) { - throw new UnsupportedOperationException("Reverting not supported. Create a template or volume based on the snapshot instead."); + public boolean revertSnapshot(SnapshotInfo snapshotInfo) { + VolumeInfo volumeInfo = snapshotInfo.getBaseVolume(); + + verifyFormat(volumeInfo); + + verifyDiskTypeAndHypervisor(volumeInfo); + + verifySnapshotType(snapshotInfo); + + SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findBySnapshot(snapshotInfo.getId(), DataStoreRole.Primary); + + if (snapshotStore != null) { + long snapshotStoragePoolId = snapshotStore.getDataStoreId(); + + if (!volumeInfo.getPoolId().equals(snapshotStoragePoolId)) { + String errMsg = "Storage pool mismatch"; + + s_logger.error(errMsg); + + throw new CloudRuntimeException(errMsg); + } + } + + boolean storageSystemSupportsCapability = storageSystemSupportsCapability(volumeInfo.getPoolId(), + DataStoreCapabilities.CAN_REVERT_VOLUME_TO_SNAPSHOT.toString()); + + if (!storageSystemSupportsCapability) { + String errMsg = "Storage pool revert capability not supported"; + + s_logger.error(errMsg); + + throw new CloudRuntimeException(errMsg); + } + + SnapshotVO snapshotVO = snapshotDao.acquireInLockTable(snapshotInfo.getId()); + + if (snapshotVO == null) { + String errMsg = "Failed to acquire lock on the following snapshot: " + snapshotInfo.getId(); + + s_logger.error(errMsg); + + throw new CloudRuntimeException(errMsg); + } + + Long hostId = null; + boolean success = false; + + try { + volumeInfo.stateTransit(Volume.Event.RevertSnapshotRequested); + + if (getHypervisorRequiresResignature(volumeInfo)) { + hostId = getHostId(volumeInfo); + + if (hostId != null) { + HostVO hostVO = hostDao.findById(hostId); + DataStore dataStore = dataStoreMgr.getDataStore(volumeInfo.getPoolId(), DataStoreRole.Primary); + + volService.revokeAccess(volumeInfo, hostVO, dataStore); + + modifyTarget(false, volumeInfo, hostId); + } + } + + success = snapshotSvr.revertSnapshot(snapshotInfo); + + if (!success) { + String errMsg = "Failed to revert a volume to a snapshot state"; + + s_logger.error(errMsg); + + throw new CloudRuntimeException(errMsg); + } + } + finally { + if (getHypervisorRequiresResignature(volumeInfo)) { + if (hostId != null) { + HostVO hostVO = hostDao.findById(hostId); + DataStore dataStore = dataStoreMgr.getDataStore(volumeInfo.getPoolId(), DataStoreRole.Primary); + + volService.grantAccess(volumeInfo, hostVO, dataStore); + + modifyTarget(true, volumeInfo, hostId); + } + } + + if (success) { + volumeInfo.stateTransit(Volume.Event.OperationSucceeded); + } + else { + volumeInfo.stateTransit(Volume.Event.OperationFailed); + } + + snapshotDao.releaseFromLockTable(snapshotInfo.getId()); + } + + return true; + } + + private Long getHostId(VolumeInfo volumeInfo) { + VirtualMachine virtualMachine = volumeInfo.getAttachedVM(); + + if (virtualMachine == null) { + return null; + } + + Long hostId = virtualMachine.getHostId(); + + if (hostId == null) { + hostId = virtualMachine.getLastHostId(); + } + + return hostId; + } + + private void modifyTarget(boolean add, VolumeInfo volumeInfo, long hostId) { + StoragePoolVO storagePoolVO = storagePoolDao.findById(volumeInfo.getPoolId()); + + Map details = new HashMap<>(3); + + details.put(ModifyTargetsCommand.IQN, volumeInfo.get_iScsiName()); + details.put(ModifyTargetsCommand.STORAGE_HOST, storagePoolVO.getHostAddress()); + details.put(ModifyTargetsCommand.STORAGE_PORT, String.valueOf(storagePoolVO.getPort())); + + List> targets = new ArrayList<>(1); + + targets.add(details); + + ModifyTargetsCommand cmd = new ModifyTargetsCommand(); + + cmd.setTargets(targets); + cmd.setApplyToAllHostsInCluster(true); + cmd.setAdd(add); + cmd.setTargetTypeToRemove(ModifyTargetsCommand.TargetTypeToRemove.BOTH); + + sendModifyTargetsCommand(cmd, hostId); + } + + private void sendModifyTargetsCommand(ModifyTargetsCommand cmd, long hostId) { + Answer answer = agentMgr.easySend(hostId, cmd); + + if (answer == null) { + throw new CloudRuntimeException("Unable to get an answer to the modify targets command"); + } + + if (!answer.getResult()) { + String msg = "Unable to modify targets on the following host: " + hostId; + + throw new CloudRuntimeException(msg); + } } @Override @@ -167,8 +440,23 @@ public boolean revertSnapshot(SnapshotInfo snapshot) { public SnapshotInfo takeSnapshot(SnapshotInfo snapshotInfo) { VolumeInfo volumeInfo = snapshotInfo.getBaseVolume(); - if (volumeInfo.getFormat() != ImageFormat.VHD) { - throw new CloudRuntimeException("Only the " + ImageFormat.VHD.toString() + " image type is currently supported."); + verifyFormat(volumeInfo); + verifyLocationType(snapshotInfo); + + final boolean canStorageSystemCreateVolumeFromSnapshot = canStorageSystemCreateVolumeFromSnapshot(volumeInfo.getPoolId()); + final boolean computeClusterSupportsVolumeClone; + + // only XenServer, VMware and KVM are currently supported + if (volumeInfo.getFormat() == ImageFormat.VHD) { + HostVO hostVO = getHost(volumeInfo.getId()); + + computeClusterSupportsVolumeClone = clusterDao.getSupportsResigning(hostVO.getClusterId()); + } + else if (volumeInfo.getFormat() == ImageFormat.OVA || volumeInfo.getFormat() == ImageFormat.QCOW2) { + computeClusterSupportsVolumeClone = true; + } + else { + throw new CloudRuntimeException("Unsupported format"); } SnapshotVO snapshotVO = snapshotDao.acquireInLockTable(snapshotInfo.getId()); @@ -177,21 +465,24 @@ public SnapshotInfo takeSnapshot(SnapshotInfo snapshotInfo) { throw new CloudRuntimeException("Failed to acquire lock on the following snapshot: " + snapshotInfo.getId()); } + VMSnapshot vmSnapshot = null; + + if (ImageFormat.OVA.equals(volumeInfo.getFormat())) { + setVmdk(snapshotInfo, volumeInfo); + + vmSnapshot = takeHypervisorSnapshot(volumeInfo); + } + SnapshotResult result = null; + SnapshotInfo snapshotOnPrimary; try { volumeInfo.stateTransit(Volume.Event.SnapshotRequested); - // only XenServer is currently supported - HostVO hostVO = getHost(volumeInfo.getId()); - - boolean canStorageSystemCreateVolumeFromSnapshot = canStorageSystemCreateVolumeFromSnapshot(volumeInfo.getPoolId()); - boolean computeClusterSupportsResign = clusterDao.getSupportsResigning(hostVO.getClusterId()); - - // if canStorageSystemCreateVolumeFromSnapshot && computeClusterSupportsResign, then take a back-end snapshot or create a back-end clone; + // if canStorageSystemCreateVolumeFromSnapshot && computeClusterSupportsVolumeClone, then take a back-end snapshot or create a back-end clone; // else, just create a new back-end volume (eventually used to create a new SR on and to copy a VDI to) - if (canStorageSystemCreateVolumeFromSnapshot && computeClusterSupportsResign) { + if (canStorageSystemCreateVolumeFromSnapshot && computeClusterSupportsVolumeClone) { SnapshotDetailsVO snapshotDetail = new SnapshotDetailsVO(snapshotInfo.getId(), "takeSnapshot", Boolean.TRUE.toString(), @@ -208,40 +499,140 @@ public SnapshotInfo takeSnapshot(SnapshotInfo snapshotInfo) { throw new CloudRuntimeException(result.getResult()); } - if (!canStorageSystemCreateVolumeFromSnapshot || !computeClusterSupportsResign) { + if (!canStorageSystemCreateVolumeFromSnapshot || !computeClusterSupportsVolumeClone) { performSnapshotAndCopyOnHostSide(volumeInfo, snapshotInfo); } - markAsBackedUp((SnapshotObject)result.getSnashot()); + snapshotOnPrimary = result.getSnapshot(); } finally { if (result != null && result.isSuccess()) { volumeInfo.stateTransit(Volume.Event.OperationSucceeded); - } - else { + } else { volumeInfo.stateTransit(Volume.Event.OperationFailed); } - snapshotDao.releaseFromLockTable(snapshotInfo.getId()); + if (ImageFormat.OVA.equals(volumeInfo.getFormat())) { + if (vmSnapshot != null) { + deleteHypervisorSnapshot(vmSnapshot); + } + } } - return snapshotInfo; + snapshotDao.releaseFromLockTable(snapshotInfo.getId()); + + return snapshotOnPrimary; + } + + @Override + public void postSnapshotCreation(SnapshotInfo snapshot) { + updateLocationTypeInDb(snapshot); + + if (snapshot.getLocationType() == Snapshot.LocationType.SECONDARY) { + // remove the snapshot on primary storage + try { + snapshotSvr.deleteSnapshot(snapshot); + } catch (Exception e) { + s_logger.warn("Failed to clean up snapshot '" + snapshot.getId() + "' on primary storage: " + e.getMessage()); + } + } + + } + + private VMSnapshot takeHypervisorSnapshot(VolumeInfo volumeInfo) { + VirtualMachine virtualMachine = volumeInfo.getAttachedVM(); + + if (virtualMachine != null && VirtualMachine.State.Running.equals(virtualMachine.getState())) { + String vmSnapshotName = UUID.randomUUID().toString().replace("-", ""); + + VMSnapshotVO vmSnapshotVO = + new VMSnapshotVO(virtualMachine.getAccountId(), virtualMachine.getDomainId(), virtualMachine.getId(), vmSnapshotName, vmSnapshotName, + vmSnapshotName, virtualMachine.getServiceOfferingId(), VMSnapshot.Type.Disk, null); + + VMSnapshot vmSnapshot = vmSnapshotDao.persist(vmSnapshotVO); + + if (vmSnapshot == null) { + throw new CloudRuntimeException("Unable to allocate a VM snapshot object"); + } + + vmSnapshot = vmSnapshotService.createVMSnapshot(virtualMachine.getId(), vmSnapshot.getId(), true); + + if (vmSnapshot == null) { + throw new CloudRuntimeException("Unable to create a hypervisor-side snapshot"); + } + + try { + Thread.sleep(60000); + } + catch (Exception ex) { + s_logger.warn(ex.getMessage(), ex); + } + + return vmSnapshot; + } + + // We didn't need to take a hypervisor-side snapshot. Return 'null' to indicate this. + return null; + } + + private void deleteHypervisorSnapshot(VMSnapshot vmSnapshot) { + boolean success = vmSnapshotService.deleteVMSnapshot(vmSnapshot.getId()); + + if (!success) { + throw new CloudRuntimeException("Unable to delete the hypervisor-side snapshot"); + } + } + + private void setVmdk(SnapshotInfo snapshotInfo, VolumeInfo volumeInfo) { + if (!ImageFormat.OVA.equals(volumeInfo.getFormat())) { + return; + } + + String search = "]"; + + String path = volumeInfo.getPath(); + int startIndex = path.indexOf(search); + + SnapshotDetailsVO snapshotDetail = new SnapshotDetailsVO(snapshotInfo.getId(), + DiskTO.VMDK, + path.substring(startIndex + search.length()).trim(), + false); + + snapshotDetailsDao.persist(snapshotDetail); + } + + private void updateLocationTypeInDb(SnapshotInfo snapshotInfo) { + Object objPayload = snapshotInfo.getPayload(); + + if (objPayload instanceof CreateSnapshotPayload) { + CreateSnapshotPayload payload = (CreateSnapshotPayload)objPayload; + + SnapshotVO snapshot = snapshotDao.findById(snapshotInfo.getId()); + + snapshot.setLocationType(payload.getLocationType()); + + snapshotDao.update(snapshotInfo.getId(), snapshot); + } } private boolean canStorageSystemCreateVolumeFromSnapshot(long storagePoolId) { - boolean supportsCloningVolumeFromSnapshot = false; + return storageSystemSupportsCapability(storagePoolId, DataStoreCapabilities.CAN_CREATE_VOLUME_FROM_SNAPSHOT.toString()); + } + + private boolean storageSystemSupportsCapability(long storagePoolId, String capability) { + boolean supportsCapability = false; DataStore dataStore = dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary); Map mapCapabilities = dataStore.getDriver().getCapabilities(); if (mapCapabilities != null) { - String value = mapCapabilities.get(DataStoreCapabilities.CAN_CREATE_VOLUME_FROM_SNAPSHOT.toString()); + String value = mapCapabilities.get(capability); - supportsCloningVolumeFromSnapshot = Boolean.valueOf(value); + supportsCapability = Boolean.valueOf(value); } - return supportsCloningVolumeFromSnapshot; + return supportsCapability; } private void performSnapshotAndCopyOnHostSide(VolumeInfo volumeInfo, SnapshotInfo snapshotInfo) { @@ -277,7 +668,8 @@ private void performSnapshotAndCopyOnHostSide(VolumeInfo volumeInfo, SnapshotInf if (hostId != null) { hostVO = hostDao.findById(hostId); } - else { + + if (hostVO == null || !ResourceState.Enabled.equals(hostVO.getResourceState())) { Optional optHostVO = getHost(volumeInfo.getDataCenterId(), false); if (optHostVO.isPresent()) { @@ -301,7 +693,7 @@ private void performSnapshotAndCopyOnHostSide(VolumeInfo volumeInfo, SnapshotInf SnapshotAndCopyCommand snapshotAndCopyCommand = new SnapshotAndCopyCommand(volumeInfo.getPath(), sourceDetails, destDetails); - SnapshotAndCopyAnswer snapshotAndCopyAnswer = null; + SnapshotAndCopyAnswer snapshotAndCopyAnswer; try { // if sourceDetails != null, we need to connect the host(s) to the volume @@ -435,7 +827,7 @@ private HostVO getHost(long zoneId, Long hostId) { HostVO hostVO = hostDao.findById(hostId); - if (hostVO != null) { + if (hostVO != null && ResourceState.Enabled.equals(hostVO.getResourceState())) { return hostVO; } @@ -466,7 +858,7 @@ private Optional getHost(long zoneId, boolean computeClusterMustSupportR Collections.shuffle(hosts, new Random(System.nanoTime())); for (HostVO host : hosts) { - if (host.getResourceState() == ResourceState.Enabled) { + if (ResourceState.Enabled.equals(host.getResourceState())) { if (computeClusterMustSupportResign) { if (clusterDao.getSupportsResigning(cluster.getId())) { return Optional.of(host); @@ -485,7 +877,7 @@ private Optional getHost(long zoneId, boolean computeClusterMustSupportR } } - return Optional.absent(); + return Optional.empty(); } private void markAsBackedUp(SnapshotObject snapshotObj) { @@ -505,33 +897,104 @@ private void markAsBackedUp(SnapshotObject snapshotObj) { } } + private boolean usingBackendSnapshotFor(long snapshotId) { + String property = getProperty(snapshotId, "takeSnapshot"); + + return Boolean.parseBoolean(property); + } + @Override public StrategyPriority canHandle(Snapshot snapshot, SnapshotOperation op) { - if (SnapshotOperation.REVERT.equals(op)) { - return StrategyPriority.CANT_HANDLE; + Snapshot.LocationType locationType = snapshot.getLocationType(); + + // If the snapshot exists on Secondary Storage, we can't delete it. + if (SnapshotOperation.DELETE.equals(op)) { + if (Snapshot.LocationType.SECONDARY.equals(locationType)) { + return StrategyPriority.CANT_HANDLE; + } + + SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Image); + + // If the snapshot exists on Secondary Storage, we can't delete it. + if (snapshotStore != null) { + return StrategyPriority.CANT_HANDLE; + } + + snapshotStore = snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Primary); + + if (snapshotStore == null) { + return StrategyPriority.CANT_HANDLE; + } + + long snapshotStoragePoolId = snapshotStore.getDataStoreId(); + + boolean storageSystemSupportsCapability = storageSystemSupportsCapability(snapshotStoragePoolId, DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString()); + + return storageSystemSupportsCapability ? StrategyPriority.HIGHEST : StrategyPriority.CANT_HANDLE; } long volumeId = snapshot.getVolumeId(); VolumeVO volumeVO = volumeDao.findByIdIncludingRemoved(volumeId); - long storagePoolId = volumeVO.getPoolId(); + long volumeStoragePoolId = volumeVO.getPoolId(); - DataStore dataStore = dataStoreMgr.getDataStore(storagePoolId, DataStoreRole.Primary); + if (SnapshotOperation.REVERT.equals(op)) { + boolean baseVolumeExists = volumeVO.getRemoved() == null; + + if (baseVolumeExists) { + boolean acceptableFormat = isAcceptableRevertFormat(volumeVO); + + if (acceptableFormat) { + SnapshotDataStoreVO snapshotStore = snapshotStoreDao.findBySnapshot(snapshot.getId(), DataStoreRole.Primary); + + boolean usingBackendSnapshot = usingBackendSnapshotFor(snapshot.getId()); - if (dataStore != null) { - Map mapCapabilities = dataStore.getDriver().getCapabilities(); + if (usingBackendSnapshot) { + if (snapshotStore != null) { + long snapshotStoragePoolId = snapshotStore.getDataStoreId(); - if (mapCapabilities != null) { - String value = mapCapabilities.get(DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString()); - Boolean supportsStorageSystemSnapshots = Boolean.valueOf(value); + boolean storageSystemSupportsCapability = storageSystemSupportsCapability(snapshotStoragePoolId, + DataStoreCapabilities.CAN_REVERT_VOLUME_TO_SNAPSHOT.toString()); - if (supportsStorageSystemSnapshots) { - return StrategyPriority.HIGHEST; + if (storageSystemSupportsCapability) { + return StrategyPriority.HIGHEST; + } + + storageSystemSupportsCapability = storageSystemSupportsCapability(volumeStoragePoolId, + DataStoreCapabilities.CAN_REVERT_VOLUME_TO_SNAPSHOT.toString()); + + if (storageSystemSupportsCapability) { + return StrategyPriority.HIGHEST; + } + } + } + else { + if (snapshotStore != null) { + long snapshotStoragePoolId = snapshotStore.getDataStoreId(); + + StoragePoolVO storagePoolVO = storagePoolDao.findById(snapshotStoragePoolId); + + if (storagePoolVO.isManaged()) { + return StrategyPriority.HIGHEST; + } + } + + StoragePoolVO storagePoolVO = storagePoolDao.findById(volumeStoragePoolId); + + if (storagePoolVO.isManaged()) { + return StrategyPriority.HIGHEST; + } + } } } + + return StrategyPriority.CANT_HANDLE; } - return StrategyPriority.CANT_HANDLE; + boolean storageSystemSupportsCapability = storageSystemSupportsCapability(volumeStoragePoolId, DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString()); + + return storageSystemSupportsCapability ? StrategyPriority.HIGHEST : StrategyPriority.CANT_HANDLE; } + } diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java index 06e05ec34d76..3ab2129bc0b1 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/snapshot/XenserverSnapshotStrategy.java @@ -33,13 +33,17 @@ import org.apache.cloudstack.engine.subsystem.api.storage.StrategyPriority; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeInfo; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.framework.jobs.AsyncJob; +import org.apache.cloudstack.framework.jobs.dao.SyncQueueItemDao; import org.apache.cloudstack.storage.command.CreateObjectAnswer; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; import org.apache.cloudstack.storage.datastore.PrimaryDataStoreImpl; import org.apache.cloudstack.storage.to.SnapshotObjectTO; +import org.apache.cloudstack.utils.identity.ManagementServerNode; -import com.cloud.configuration.Config; +import com.cloud.event.EventTypes; +import com.cloud.event.UsageEventUtils; import com.cloud.exception.InvalidParameterValueException; import com.cloud.hypervisor.Hypervisor; import com.cloud.hypervisor.Hypervisor.HypervisorType; @@ -51,8 +55,14 @@ import com.cloud.storage.StoragePoolStatus; import com.cloud.storage.Volume; import com.cloud.storage.VolumeVO; +import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.dao.SnapshotDao; +import com.cloud.storage.dao.SnapshotDetailsDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeDetailsDao; +import com.cloud.utils.db.Transaction; +import com.cloud.utils.db.TransactionCallbackNoReturn; +import com.cloud.utils.db.TransactionStatus; import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.Storage.StoragePoolType; @@ -81,13 +91,18 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { SnapshotDataFactory snapshotDataFactory; @Inject private SnapshotDao _snapshotDao; + @Inject + private SnapshotDetailsDao _snapshotDetailsDao; + @Inject + private SyncQueueItemDao _syncQueueItemDao; + @Inject + VolumeDetailsDao _volumeDetailsDaoImpl; @Override public SnapshotInfo backupSnapshot(SnapshotInfo snapshot) { SnapshotInfo parentSnapshot = snapshot.getParent(); if (parentSnapshot != null && snapshot.getPath().equalsIgnoreCase(parentSnapshot.getPath())) { - s_logger.debug("backup an empty snapshot"); // don't need to backup this snapshot SnapshotDataStoreVO parentSnapshotOnBackupStore = snapshotStoreDao.findBySnapshot(parentSnapshot.getId(), DataStoreRole.Image); if (parentSnapshotOnBackupStore != null && parentSnapshotOnBackupStore.getState() == State.Ready) { @@ -159,7 +174,7 @@ public SnapshotInfo backupSnapshot(SnapshotInfo snapshot) { } } - snapshot.addPayload(fullBackup); + snapshot.setFullBackup(fullBackup); return snapshotSvr.backupSnapshot(snapshot); } @@ -194,18 +209,23 @@ protected boolean deleteSnapshotChain(SnapshotInfo snapshot) { } } if (!deleted) { - boolean r = snapshotSvr.deleteSnapshot(snapshot); - if (r) { - // delete snapshot in cache if there is - List cacheSnaps = snapshotDataFactory.listSnapshotOnCache(snapshot.getId()); - for (SnapshotInfo cacheSnap : cacheSnaps) { - s_logger.debug("Delete snapshot " + snapshot.getId() + " from image cache store: " + cacheSnap.getDataStore().getName()); - cacheSnap.delete(); + try { + boolean r = snapshotSvr.deleteSnapshot(snapshot); + if (r) { + // delete snapshot in cache if there is + List cacheSnaps = snapshotDataFactory.listSnapshotOnCache(snapshot.getId()); + for (SnapshotInfo cacheSnap : cacheSnaps) { + s_logger.debug("Delete snapshot " + snapshot.getId() + " from image cache store: " + cacheSnap.getDataStore().getName()); + cacheSnap.delete(); + } } - } - if (!resultIsSet) { - result = r; - resultIsSet = true; + if (!resultIsSet) { + result = r; + resultIsSet = true; + } + } catch (Exception e) { + // Snapshots which are not successfully deleted will be retried again. + s_logger.debug("Failed to delete snapshot on storage. ", e); } } snapshot = parent; @@ -219,6 +239,12 @@ protected boolean deleteSnapshotChain(SnapshotInfo snapshot) { @Override public boolean deleteSnapshot(Long snapshotId) { SnapshotVO snapshotVO = snapshotDao.findById(snapshotId); + + if (snapshotVO.getState() == Snapshot.State.Allocated) { + snapshotDao.remove(snapshotId); + return true; + } + if (snapshotVO.getState() == Snapshot.State.Destroyed) { return true; } @@ -233,13 +259,13 @@ public boolean deleteSnapshot(Long snapshotId) { } if (snapshotVO.getState() == Snapshot.State.CreatedOnPrimary) { - s_logger.debug("delete snapshot on primary storage:"); snapshotVO.setState(Snapshot.State.Destroyed); snapshotDao.update(snapshotId, snapshotVO); return true; } - if (!Snapshot.State.BackedUp.equals(snapshotVO.getState()) && !Snapshot.State.Error.equals(snapshotVO.getState())) { + if (!Snapshot.State.BackedUp.equals(snapshotVO.getState()) && !Snapshot.State.Error.equals(snapshotVO.getState()) && + !Snapshot.State.Destroying.equals(snapshotVO.getState())) { throw new InvalidParameterValueException("Can't delete snapshotshot " + snapshotId + " due to it is in " + snapshotVO.getState() + " Status"); } @@ -256,6 +282,17 @@ public boolean deleteSnapshot(Long snapshotId) { SnapshotObject obj = (SnapshotObject)snapshotOnImage; try { obj.processEvent(Snapshot.Event.DestroyRequested); + List volumesFromSnapshot; + volumesFromSnapshot = _volumeDetailsDaoImpl.findDetails("SNAPSHOT_ID", String.valueOf(snapshotId), null); + + if (volumesFromSnapshot.size() > 0) { + try { + obj.processEvent(Snapshot.Event.OperationFailed); + } catch (NoTransitionException e1) { + s_logger.debug("Failed to change snapshot state: " + e1.toString()); + } + throw new InvalidParameterValueException("Unable to perform delete operation, Snapshot with id: " + snapshotId + " is in use "); + } } catch (NoTransitionException e) { s_logger.debug("Failed to set the state to destroying: ", e); return false; @@ -293,7 +330,7 @@ public boolean deleteSnapshot(Long snapshotId) { @Override public boolean revertSnapshot(SnapshotInfo snapshot) { - if (canHandle(snapshot,SnapshotOperation.REVERT) == StrategyPriority.CANT_HANDLE) { + if (canHandle(snapshot, SnapshotOperation.REVERT) == StrategyPriority.CANT_HANDLE) { throw new CloudRuntimeException("Reverting not supported. Create a template or volume based on the snapshot instead."); } @@ -344,9 +381,11 @@ public boolean revertSnapshot(SnapshotInfo snapshot) { @Override @DB public SnapshotInfo takeSnapshot(SnapshotInfo snapshot) { + SnapshotInfo snapshotOnPrimary = null; Object payload = snapshot.getPayload(); + CreateSnapshotPayload createSnapshotPayload = null; if (payload != null) { - CreateSnapshotPayload createSnapshotPayload = (CreateSnapshotPayload)payload; + createSnapshotPayload = (CreateSnapshotPayload)payload; if (createSnapshotPayload.getQuiescevm()) { throw new InvalidParameterValueException("can't handle quiescevm equal true for volume snapshot"); } @@ -374,58 +413,55 @@ public SnapshotInfo takeSnapshot(SnapshotInfo snapshot) { volumeInfo.stateTransit(Volume.Event.OperationFailed); } } + snapshotOnPrimary = result.getSnapshot(); + snapshotOnPrimary.addPayload(snapshot.getPayload()); - snapshot = result.getSnashot(); - DataStore primaryStore = snapshot.getDataStore(); - boolean backupFlag = Boolean.parseBoolean(configDao.getValue(Config.BackupSnapshotAfterTakingSnapshot.toString())); - - SnapshotInfo backupedSnapshot; - if(backupFlag) { - backupedSnapshot = backupSnapshot(snapshot); - } else { - // Fake it to get the transitions to fire in the proper order - s_logger.debug("skipping backup of snapshot due to configuration "+Config.BackupSnapshotAfterTakingSnapshot.toString()); - - SnapshotObject snapObj = (SnapshotObject)snapshot; - try { - snapObj.processEvent(Snapshot.Event.OperationNotPerformed); - } catch (NoTransitionException e) { - s_logger.debug("Failed to change state: " + snapshot.getId() + ": " + e.toString()); - throw new CloudRuntimeException(e.toString()); - } - backupedSnapshot = snapshot; + /*The Management Server ID is stored in snapshot_details table with the snapshot id and (name, value): (MS_ID, ), to know which snapshots have not been completed in case of some failure situation like + * Mgmt server down etc. and by fetching the entries on restart the cleaning up of failed snapshots is done*/ + _snapshotDetailsDao.addDetail(((SnapshotObject)snapshotOnPrimary).getId(), AsyncJob.Constants.MS_ID, Long.toString(ManagementServerNode.getManagementServerId()), false); + return snapshotOnPrimary; + } finally { + if (snapshotVO != null) { + snapshotDao.releaseFromLockTable(snapshot.getId()); } + } + } - try { - SnapshotInfo parent = snapshot.getParent(); - if (backupedSnapshot != null && parent != null && primaryStore instanceof PrimaryDataStoreImpl) { - if (((PrimaryDataStoreImpl)primaryStore).getPoolType() != StoragePoolType.RBD) { - Long parentSnapshotId = parent.getId(); - while (parentSnapshotId != null && parentSnapshotId != 0L) { - SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), parentSnapshotId); - if (snapshotDataStoreVO != null) { - parentSnapshotId = snapshotDataStoreVO.getParentSnapshotId(); - snapshotStoreDao.remove(snapshotDataStoreVO.getId()); - } else { - parentSnapshotId = null; + @Override + public void postSnapshotCreation(SnapshotInfo snapshotOnPrimary) { + Transaction.execute(new TransactionCallbackNoReturn() { + @Override + public void doInTransactionWithoutResult(TransactionStatus status) { + _snapshotDetailsDao.removeDetail(((SnapshotObject)snapshotOnPrimary).getId(), AsyncJob.Constants.MS_ID); + DataStore primaryStore = snapshotOnPrimary.getDataStore(); + try { + SnapshotInfo parent = snapshotOnPrimary.getParent(); + if (parent != null && primaryStore instanceof PrimaryDataStoreImpl) { + if (((PrimaryDataStoreImpl)primaryStore).getPoolType() != StoragePoolType.RBD) { + Long parentSnapshotId = parent.getId(); + while (parentSnapshotId != null && parentSnapshotId != 0L) { + SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), parentSnapshotId); + if (snapshotDataStoreVO != null) { + parentSnapshotId = snapshotDataStoreVO.getParentSnapshotId(); + UsageEventUtils.publishUsageEvent(EventTypes.EVENT_SNAPSHOT_OFF_PRIMARY, parent.getAccountId(), parent.getDataCenterId(), parent.getId(), + parent.getName(), null, null, 0L, 0L, parent.getClass().getName(), parent.getUuid()); + snapshotStoreDao.remove(snapshotDataStoreVO.getId()); + } else { + parentSnapshotId = null; + } } } + SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), snapshotOnPrimary.getId()); + if (snapshotDataStoreVO != null) { + snapshotDataStoreVO.setParentSnapshotId(0L); + snapshotStoreDao.update(snapshotDataStoreVO.getId(), snapshotDataStoreVO); + } } - SnapshotDataStoreVO snapshotDataStoreVO = snapshotStoreDao.findByStoreSnapshot(primaryStore.getRole(), primaryStore.getId(), snapshot.getId()); - if (snapshotDataStoreVO != null) { - snapshotDataStoreVO.setParentSnapshotId(0L); - snapshotStoreDao.update(snapshotDataStoreVO.getId(), snapshotDataStoreVO); - } + } catch (Exception e) { + s_logger.debug("Failed to clean up snapshots on primary storage", e); } - } catch (Exception e) { - s_logger.debug("Failed to clean up snapshots on primary storage", e); } - return backupedSnapshot; - } finally { - if (snapshotVO != null) { - snapshotDao.releaseFromLockTable(snapshot.getId()); - } - } + }); } @Override @@ -443,4 +479,5 @@ public StrategyPriority canHandle(Snapshot snapshot, SnapshotOperation op) { return StrategyPriority.DEFAULT; } + } diff --git a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java index 13fd54cf8f77..ebe8b27b2077 100644 --- a/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java +++ b/engine/storage/snapshot/src/org/apache/cloudstack/storage/vmsnapshot/DefaultVMSnapshotStrategy.java @@ -119,6 +119,14 @@ public VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot) { List volumeTOs = vmSnapshotHelper.getVolumeTOList(userVm.getId()); + long prev_chain_size = 0; + long virtual_size=0; + for (VolumeObjectTO volume : volumeTOs) { + virtual_size += volume.getSize(); + VolumeVO volumeVO = volumeDao.findById(volume.getId()); + prev_chain_size += volumeVO.getVmSnapshotChainSize() == null ? 0 : volumeVO.getVmSnapshotChainSize(); + } + VMSnapshotTO current = null; VMSnapshotVO currentSnapshot = vmSnapshotDao.findCurrentSnapshotByVmId(userVm.getId()); if (currentSnapshot != null) @@ -150,10 +158,12 @@ public VMSnapshot takeVMSnapshot(VMSnapshot vmSnapshot) { processAnswer(vmSnapshotVO, userVm, answer, hostId); s_logger.debug("Create vm snapshot " + vmSnapshot.getName() + " succeeded for vm: " + userVm.getInstanceName()); result = true; - + long new_chain_size=0; for (VolumeObjectTO volumeTo : answer.getVolumeTOs()) { publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_CREATE, vmSnapshot, userVm, volumeTo); + new_chain_size += volumeTo.getSize(); } + publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_ON_PRIMARY, vmSnapshot, userVm, new_chain_size - prev_chain_size, virtual_size); return vmSnapshot; } else { String errMsg = "Creating VM snapshot: " + vmSnapshot.getName() + " failed"; @@ -208,9 +218,12 @@ public boolean deleteVMSnapshot(VMSnapshot vmSnapshot) { if (answer != null && answer.getResult()) { DeleteVMSnapshotAnswer deleteVMSnapshotAnswer = (DeleteVMSnapshotAnswer)answer; processAnswer(vmSnapshotVO, userVm, answer, hostId); + long full_chain_size=0; for (VolumeObjectTO volumeTo : deleteVMSnapshotAnswer.getVolumeTOs()) { publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_DELETE, vmSnapshot, userVm, volumeTo); + full_chain_size += volumeTo.getSize(); } + publishUsageEvent(EventTypes.EVENT_VM_SNAPSHOT_OFF_PRIMARY, vmSnapshot, userVm, full_chain_size, 0L); return true; } else { String errMsg = (answer == null) ? null : answer.getDetails(); @@ -325,7 +338,16 @@ private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm } } UsageEventUtils.publishUsageEvent(type, vmSnapshot.getAccountId(), userVm.getDataCenterId(), userVm.getId(), vmSnapshot.getName(), offeringId, volume.getId(), // save volume's id into templateId field - volumeTo.getSize(), VMSnapshot.class.getName(), vmSnapshot.getUuid()); + volumeTo.getSize(), VMSnapshot.class.getName(), vmSnapshot.getUuid()); + } + + private void publishUsageEvent(String type, VMSnapshot vmSnapshot, UserVm userVm, Long vmSnapSize, Long virtualSize) { + try { + UsageEventUtils.publishUsageEvent(type, vmSnapshot.getAccountId(), userVm.getDataCenterId(), userVm.getId(), vmSnapshot.getName(), 0L, 0L, vmSnapSize, virtualSize, + VMSnapshot.class.getName(), vmSnapshot.getUuid()); + } catch (Exception e) { + s_logger.error("Failed to publis usage event " + type, e); + } } @Override @@ -392,4 +414,15 @@ public boolean revertVMSnapshot(VMSnapshot vmSnapshot) { public StrategyPriority canHandle(VMSnapshot vmSnapshot) { return StrategyPriority.DEFAULT; } + + @Override + public boolean deleteVMSnapshotFromDB(VMSnapshot vmSnapshot) { + try { + vmSnapshotHelper.vmSnapshotStateTransitTo(vmSnapshot, VMSnapshot.Event.ExpungeRequested); + } catch (NoTransitionException e) { + s_logger.debug("Failed to change vm snapshot state with event ExpungeRequested"); + throw new CloudRuntimeException("Failed to change vm snapshot state with event ExpungeRequested: " + e.getMessage()); + } + return vmSnapshotDao.remove(vmSnapshot.getId()); + } } diff --git a/engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml b/engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml index d99c2e2dbac5..a06ba6a3b9a1 100644 --- a/engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml +++ b/engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml @@ -12,13 +12,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/engine/storage/snapshot/test/resources/db.properties b/engine/storage/snapshot/test/resources/db.properties index e8e94121fe19..eabc445c208a 100644 --- a/engine/storage/snapshot/test/resources/db.properties +++ b/engine/storage/snapshot/test/resources/db.properties @@ -17,7 +17,7 @@ # management server clustering parameters, change cluster.node.IP to the machine IP address -# in which the management server(Tomcat) is running +# in which the management server is running cluster.node.IP=127.0.0.1 cluster.servlet.port=9090 diff --git a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java index 3bad62eb5748..b438bc121e4c 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java +++ b/engine/storage/src/org/apache/cloudstack/storage/RemoteHostEndPoint.java @@ -18,17 +18,15 @@ */ package org.apache.cloudstack.storage; +import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.concurrent.ScheduledExecutorService; -import java.util.concurrent.TimeUnit; import javax.inject.Inject; -import org.apache.log4j.Logger; - import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.managed.context.ManagedContextRunnable; +import org.apache.log4j.Logger; import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; @@ -54,9 +52,11 @@ public class RemoteHostEndPoint implements EndPoint { private static final Logger s_logger = Logger.getLogger(RemoteHostEndPoint.class); + private long hostId; private String hostAddress; private String publicAddress; + @Inject AgentManager agentMgr; @Inject @@ -65,10 +65,10 @@ public class RemoteHostEndPoint implements EndPoint { protected SecondaryStorageVmDao vmDao; @Inject protected HostDao _hostDao; - private ScheduledExecutorService executor; + + private static ExecutorService executorService = Executors.newCachedThreadPool(new NamedThreadFactory("RemoteHostEndPoint")); public RemoteHostEndPoint() { - executor = Executors.newScheduledThreadPool(10, new NamedThreadFactory("RemoteHostEndPoint")); } private void configure(Host host) { @@ -134,17 +134,17 @@ public Answer sendMessage(Command cmd) { } private class CmdRunner extends ManagedContextRunnable implements Listener { - final AsyncCompletionCallback callback; - Answer answer; + private final AsyncCompletionCallback callback; + private Answer answer; - public CmdRunner(AsyncCompletionCallback callback) { + CmdRunner(final AsyncCompletionCallback callback) { this.callback = callback; } @Override public boolean processAnswers(long agentId, long seq, Answer[] answers) { - answer = answers[0]; - executor.schedule(this, 10, TimeUnit.SECONDS); + this.answer = answers[0]; + RemoteHostEndPoint.executorService.submit(this); return true; } @@ -204,7 +204,7 @@ public boolean processTimeout(long agentId, long seq) { @Override protected void runInContext() { - callback.complete(answer); + this.callback.complete(this.answer); } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java index aa23a43291c0..f64037619a8a 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java @@ -22,12 +22,12 @@ import javax.inject.Inject; -import org.springframework.stereotype.Component; - -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; -import org.apache.cloudstack.engine.subsystem.api.storage.Scope; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.ZoneScope; +import org.apache.cloudstack.engine.subsystem.api.storage.Scope; +import org.springframework.stereotype.Component; + import org.apache.cloudstack.storage.image.datastore.ImageStoreProviderManager; import com.cloud.storage.DataStoreRole; diff --git a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java index e414b6c4c357..292ef432ff95 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java +++ b/engine/storage/src/org/apache/cloudstack/storage/endpoint/DefaultEndPointSelector.java @@ -71,6 +71,9 @@ public class DefaultEndPointSelector implements EndPointSelector { + "left join cluster_details cd on c.id=cd.cluster_id and cd.name='" + CapacityManager.StorageOperationsExcludeCluster.key() + "' " + "where h.status = 'Up' and h.type = 'Routing' and h.resource_state = 'Enabled' and s.pool_id = ? "; + private String findOneHypervisorHostInScopeByType = "select h.id from host h where h.status = 'Up' and h.hypervisor_type = ? "; + private String findOneHypervisorHostInScope = "select h.id from host h where h.status = 'Up' and h.hypervisor_type is not null "; + protected boolean moveBetweenPrimaryImage(DataStore srcStore, DataStore destStore) { DataStoreRole srcRole = srcStore.getRole(); DataStoreRole destRole = destStore.getRole(); @@ -106,30 +109,33 @@ protected EndPoint findEndPointInScope(Scope scope, String sqlBase, Long poolId) StringBuilder sbuilder = new StringBuilder(); sbuilder.append(sqlBase); - if (scope.getScopeType() == ScopeType.HOST) { - sbuilder.append(" and h.id = "); - sbuilder.append(scope.getScopeId()); - } else if (scope.getScopeType() == ScopeType.CLUSTER) { - sbuilder.append(" and h.cluster_id = "); - sbuilder.append(scope.getScopeId()); - } else if (scope.getScopeType() == ScopeType.ZONE) { - sbuilder.append(" and h.data_center_id = "); - sbuilder.append(scope.getScopeId()); + if (scope != null) { + if (scope.getScopeType() == ScopeType.HOST) { + sbuilder.append(" and h.id = "); + sbuilder.append(scope.getScopeId()); + } else if (scope.getScopeType() == ScopeType.CLUSTER) { + sbuilder.append(" and h.cluster_id = "); + sbuilder.append(scope.getScopeId()); + } else if (scope.getScopeType() == ScopeType.ZONE) { + sbuilder.append(" and h.data_center_id = "); + sbuilder.append(scope.getScopeId()); + } } + // TODO: order by rand() is slow if there are lot of hosts sbuilder.append(") t where t.value<>'true' or t.value is null"); //Added for exclude cluster's subquery sbuilder.append(" ORDER by rand() limit 1"); String sql = sbuilder.toString(); HostVO host = null; TransactionLegacy txn = TransactionLegacy.currentTxn(); - try(PreparedStatement pstmt = txn.prepareStatement(sql);) { + try (PreparedStatement pstmt = txn.prepareStatement(sql)) { pstmt.setLong(1, poolId); try(ResultSet rs = pstmt.executeQuery();) { while (rs.next()) { long id = rs.getLong(1); host = hostDao.findById(id); } - }catch (SQLException e) { + } catch (SQLException e) { s_logger.warn("can't find endpoint", e); } } catch (SQLException e) { @@ -206,6 +212,7 @@ public EndPoint select(DataObject srcData, DataObject destData) { @Override public EndPoint select(DataObject srcData, DataObject destData, StorageAction action) { + s_logger.error("IR24 select BACKUPSNAPSHOT from primary to secondary " + srcData.getId() + " dest=" + destData.getId()); if (action == StorageAction.BACKUPSNAPSHOT && srcData.getDataStore().getRole() == DataStoreRole.Primary) { SnapshotInfo srcSnapshot = (SnapshotInfo)srcData; VolumeInfo volumeInfo = srcSnapshot.getBaseVolume(); diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java index 288fae4e1a1b..1c6f1e70660f 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/BaseImageStoreDriverImpl.java @@ -20,7 +20,9 @@ import java.net.URI; import java.net.URISyntaxException; +import java.util.ArrayList; import java.util.Date; +import java.util.List; import java.util.Map; import javax.inject.Inject; @@ -34,6 +36,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; +import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; import org.apache.cloudstack.framework.async.AsyncCallbackDispatcher; import org.apache.cloudstack.framework.async.AsyncCompletionCallback; import org.apache.cloudstack.framework.async.AsyncRpcContext; @@ -44,9 +47,13 @@ import org.apache.cloudstack.storage.datastore.db.TemplateDataStoreVO; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; +import org.apache.cloudstack.storage.endpoint.DefaultEndPointSelector; import com.cloud.agent.api.Answer; +import com.cloud.agent.api.storage.CreateDatadiskTemplateCommand; import com.cloud.agent.api.storage.DownloadAnswer; +import com.cloud.agent.api.storage.GetDatadisksAnswer; +import com.cloud.agent.api.storage.GetDatadisksCommand; import com.cloud.agent.api.to.DataObjectType; import com.cloud.agent.api.to.DataTO; import com.cloud.alert.AlertManager; @@ -54,10 +61,15 @@ import com.cloud.storage.VMTemplateVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.VMTemplateDao; +import com.cloud.storage.dao.VMTemplateDetailsDao; import com.cloud.storage.dao.VMTemplateZoneDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.download.DownloadMonitor; +import com.cloud.user.ResourceLimitService; +import com.cloud.user.dao.AccountDao; +import com.cloud.agent.api.to.DatadiskTO; import com.cloud.utils.net.Proxy; +import com.cloud.utils.exception.CloudRuntimeException; public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver { private static final Logger s_logger = Logger.getLogger(BaseImageStoreDriverImpl.class); @@ -79,6 +91,14 @@ public abstract class BaseImageStoreDriverImpl implements ImageStoreDriver { VMTemplateZoneDao _vmTemplateZoneDao; @Inject AlertManager _alertMgr; + @Inject + VMTemplateDetailsDao _templateDetailsDao; + @Inject + DefaultEndPointSelector _defaultEpSelector; + @Inject + AccountDao _accountDao; + @Inject + ResourceLimitService _resourceLimitMgr; protected String _proxy = null; @@ -288,6 +308,58 @@ public void resize(DataObject data, AsyncCompletionCallback cal } @Override - public void deleteEntityExtractUrl(DataStore store, String installPath, String url, Upload.Type entityType){ + public void deleteEntityExtractUrl(DataStore store, String installPath, String url, Upload.Type entityType) { + } + + @Override + public List getDataDiskTemplates(DataObject obj) { + List dataDiskDetails = new ArrayList(); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Get the data disks present in the OVA template"); + } + DataStore store = obj.getDataStore(); + GetDatadisksCommand cmd = new GetDatadisksCommand(obj.getTO()); + EndPoint ep = _defaultEpSelector.select(store); + Answer answer = null; + if (ep == null) { + String errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; + s_logger.error(errMsg); + answer = new Answer(cmd, false, errMsg); + } else { + answer = ep.sendMessage(cmd); + } + if (answer != null && answer.getResult()) { + GetDatadisksAnswer getDatadisksAnswer = (GetDatadisksAnswer)answer; + dataDiskDetails = getDatadisksAnswer.getDataDiskDetails(); // Details - Disk path, virtual size + } + else { + throw new CloudRuntimeException("Get Data disk command failed " + answer.getDetails()); + } + return dataDiskDetails; + } + + @Override + public Void createDataDiskTemplateAsync(TemplateInfo dataDiskTemplate, String path, String diskId, boolean bootable, long fileSize, AsyncCompletionCallback callback) { + Answer answer = null; + String errMsg = null; + if (s_logger.isDebugEnabled()) { + s_logger.debug("Create Datadisk template: " + dataDiskTemplate.getId()); + } + CreateDatadiskTemplateCommand cmd = new CreateDatadiskTemplateCommand(dataDiskTemplate.getTO(), path, diskId, fileSize, bootable); + EndPoint ep = _defaultEpSelector.select(dataDiskTemplate.getDataStore()); + if (ep == null) { + errMsg = "No remote endpoint to send command, check if host or ssvm is down?"; + s_logger.error(errMsg); + answer = new Answer(cmd, false, errMsg); + } else { + answer = ep.sendMessage(cmd); + } + if (answer != null && !answer.getResult()) { + errMsg = answer.getDetails(); + } + CreateCmdResult result = new CreateCmdResult(null, answer); + result.setResult(errMsg); + callback.complete(result); + return null; } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/ImageStoreDriver.java b/engine/storage/src/org/apache/cloudstack/storage/image/ImageStoreDriver.java index e71529edb8fc..70f40f6f5c06 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/ImageStoreDriver.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/ImageStoreDriver.java @@ -19,14 +19,25 @@ package org.apache.cloudstack.storage.image; import com.cloud.storage.Upload; + +import java.util.List; + +import org.apache.cloudstack.engine.subsystem.api.storage.CreateCmdResult; import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreDriver; +import org.apache.cloudstack.engine.subsystem.api.storage.TemplateInfo; +import org.apache.cloudstack.framework.async.AsyncCompletionCallback; +import com.cloud.agent.api.to.DatadiskTO; import com.cloud.storage.Storage.ImageFormat; public interface ImageStoreDriver extends DataStoreDriver { String createEntityExtractUrl(DataStore store, String installPath, ImageFormat format, DataObject dataObject); void deleteEntityExtractUrl(DataStore store, String installPath, String url, Upload.Type entityType); + + List getDataDiskTemplates(DataObject obj); + + Void createDataDiskTemplateAsync(TemplateInfo dataDiskTemplate, String path, String diskId, boolean bootable, long fileSize, AsyncCompletionCallback callback); } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java index 28d9d4646ee8..c7aad898d643 100755 --- a/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/NfsImageStoreDriverImpl.java @@ -24,22 +24,23 @@ import org.apache.cloudstack.storage.datastore.db.ImageStoreDetailsDao; +import com.cloud.capacity.CapacityManager; + public abstract class NfsImageStoreDriverImpl extends BaseImageStoreDriverImpl { @Inject ImageStoreDetailsDao _imageStoreDetailsDao; - private static final String NFS_VERSION_DETAILS_KEY = "nfs.version"; - /** * Retrieve NFS version to be used for imgStoreId store, if provided in image_store_details table * @param imgStoreId store id - * @return "nfs.version" associated value for imgStoreId in image_store_details table if exists, null if not + * @return "secstorage.nfs.version" associated value for imgStoreId in image_store_details table if exists, null if not */ protected Integer getNfsVersion(long imgStoreId){ Map imgStoreDetails = _imageStoreDetailsDao.getDetails(imgStoreId); - if (imgStoreDetails != null && imgStoreDetails.containsKey(NFS_VERSION_DETAILS_KEY)){ - String nfsVersionParam = imgStoreDetails.get(NFS_VERSION_DETAILS_KEY); + String nfsVersionKey = CapacityManager.ImageStoreNFSVersion.key(); + if (imgStoreDetails != null && imgStoreDetails.containsKey(nfsVersionKey)){ + String nfsVersionParam = imgStoreDetails.get(nfsVersionKey); return (nfsVersionParam != null ? Integer.valueOf(nfsVersionParam) : null); } return null; diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java index db752fe8a1ea..d3c1effd2a1e 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/TemplateEntityImpl.java @@ -304,7 +304,11 @@ public void incrUpdatedCount() { @Override public Date getUpdated() { - // TODO Auto-generated method stub + return null; + } + + @Override + public Long getParentTemplateId() { return null; } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java index 5e29f7136aae..dbb606b44a8a 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/datastore/ImageStoreHelper.java @@ -129,15 +129,12 @@ public ImageStoreVO createImageStore(Map params, Map keyIter = details.keySet().iterator(); while (keyIter.hasNext()) { String key = keyIter.next().toString(); - ImageStoreDetailVO detail = new ImageStoreDetailVO(); - detail.setStoreId(store.getId()); - detail.setName(key); String value = details.get(key); // encrypt swift key or s3 secret key if (key.equals(ApiConstants.KEY) || key.equals(ApiConstants.S3_SECRET_KEY)) { value = DBEncryptionUtil.encrypt(value); } - detail.setValue(value); + ImageStoreDetailVO detail = new ImageStoreDetailVO(store.getId(), key, value, true); imageStoreDetailsDao.persist(detail); } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java index fea0b77942b5..c3e48b9b2f3a 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/SnapshotDataStoreDaoImpl.java @@ -16,25 +16,6 @@ // under the License. package org.apache.cloudstack.storage.image.db; -import java.sql.PreparedStatement; -import java.sql.ResultSet; -import java.sql.SQLException; -import java.util.Date; -import java.util.List; -import java.util.Map; - -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; -import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; - import com.cloud.storage.DataStoreRole; import com.cloud.utils.db.DB; import com.cloud.utils.db.GenericDaoBase; @@ -43,6 +24,28 @@ import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.TransactionLegacy; import com.cloud.utils.db.UpdateBuilder; +import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; +import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; +import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; +import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import com.cloud.storage.SnapshotVO; +import com.cloud.storage.dao.SnapshotDao; +import javax.inject.Inject; +import com.cloud.hypervisor.Hypervisor; +import java.util.ArrayList; +import com.cloud.utils.db.Filter; +import javax.naming.ConfigurationException; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.Date; +import java.util.List; +import java.util.Map; @Component public class SnapshotDataStoreDaoImpl extends GenericDaoBase implements SnapshotDataStoreDao { @@ -56,9 +59,15 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase snapshotIdSearch; private SearchBuilder volumeIdSearch; private SearchBuilder volumeSearch; + private SearchBuilder stateSearch; + private SearchBuilder parentSnapshotSearch; + private SearchBuilder snapshotVOSearch; + + public static ArrayList hypervisorsSupportingSnapshotsChaining = new ArrayList(); + + @Inject + private SnapshotDao _snapshotDao; - private final String parentSearch = "select store_id, store_role, snapshot_id from cloud.snapshot_store_ref where store_id = ? " - + " and store_role = ? and volume_id = ? and state = 'Ready'" + " order by created DESC " + " limit 1"; private final String findLatestSnapshot = "select store_id, store_role, snapshot_id from cloud.snapshot_store_ref where " + " store_role = ? and volume_id = ? and state = 'Ready'" + " order by created DESC " + @@ -103,6 +112,7 @@ public boolean configure(String name, Map params) throws Configu snapshotSearch = createSearchBuilder(); snapshotSearch.and("snapshot_id", snapshotSearch.entity().getSnapshotId(), SearchCriteria.Op.EQ); snapshotSearch.and("store_role", snapshotSearch.entity().getRole(), SearchCriteria.Op.EQ); + snapshotSearch.and("state", snapshotSearch.entity().getState(), SearchCriteria.Op.EQ); snapshotSearch.done(); storeSnapshotSearch = createSearchBuilder(); @@ -125,6 +135,21 @@ public boolean configure(String name, Map params) throws Configu volumeSearch.and("store_role", volumeSearch.entity().getRole(), SearchCriteria.Op.EQ); volumeSearch.done(); + stateSearch = createSearchBuilder(); + stateSearch.and("state", stateSearch.entity().getState(), SearchCriteria.Op.IN); + stateSearch.done(); + + parentSnapshotSearch = createSearchBuilder(); + parentSnapshotSearch.and("volume_id", parentSnapshotSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); + parentSnapshotSearch.and("store_id", parentSnapshotSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ); + parentSnapshotSearch.and("store_role", parentSnapshotSearch.entity().getRole(), SearchCriteria.Op.EQ); + parentSnapshotSearch.and("state", parentSnapshotSearch.entity().getState(), SearchCriteria.Op.EQ); + parentSnapshotSearch.done(); + + snapshotVOSearch = _snapshotDao.createSearchBuilder(); + snapshotVOSearch.and("volume_id", snapshotVOSearch.entity().getVolumeId(), SearchCriteria.Op.EQ); + snapshotVOSearch.done(); + return true; } @@ -269,22 +294,17 @@ public SnapshotDataStoreVO findOldestSnapshotForVolume(Long volumeId, DataStoreR @Override @DB public SnapshotDataStoreVO findParent(DataStoreRole role, Long storeId, Long volumeId) { - TransactionLegacy txn = TransactionLegacy.currentTxn(); - try ( - PreparedStatement pstmt = txn.prepareStatement(parentSearch); - ){ - pstmt.setLong(1, storeId); - pstmt.setString(2, role.toString()); - pstmt.setLong(3, volumeId); - try (ResultSet rs = pstmt.executeQuery();) { - while (rs.next()) { - long sid = rs.getLong(1); - long snid = rs.getLong(3); - return findByStoreSnapshot(role, sid, snid); - } + if(isSnapshotChainingRequired(volumeId)) { + SearchCriteria sc = parentSnapshotSearch.create(); + sc.setParameters("volume_id", volumeId); + sc.setParameters("store_role", role.toString()); + sc.setParameters("state", ObjectInDataStoreStateMachine.State.Ready.name()); + sc.setParameters("store_id", storeId); + + List snapshotList = listBy(sc, new Filter(SnapshotDataStoreVO.class, "created", false, null, null)); + if (snapshotList != null && snapshotList.size() != 0) { + return snapshotList.get(0); } - } catch (SQLException e) { - s_logger.debug("Failed to find parent snapshot: " + e.toString()); } return null; } @@ -294,6 +314,7 @@ public SnapshotDataStoreVO findBySnapshot(long snapshotId, DataStoreRole role) { SearchCriteria sc = snapshotSearch.create(); sc.setParameters("snapshot_id", snapshotId); sc.setParameters("store_role", role); + sc.setParameters("state", State.Ready); return findOneBy(sc); } @@ -408,4 +429,28 @@ public void updateVolumeIds(long oldVolId, long newVolId) { UpdateBuilder ub = getUpdateBuilder(snapshot); update(ub, sc, null); } + + @Override + public List listByState(ObjectInDataStoreStateMachine.State... states) { + SearchCriteria sc = stateSearch.create(); + sc.setParameters("state", (Object[])states); + return listBy(sc, null); + } + + private boolean isSnapshotChainingRequired(long volumeId) { + + hypervisorsSupportingSnapshotsChaining.add(Hypervisor.HypervisorType.XenServer); + + SearchCriteria sc = snapshotVOSearch.create(); + sc.setParameters("volume_id", volumeId); + + SnapshotVO volSnapshot = _snapshotDao.findOneBy(sc); + + if (volSnapshot != null && hypervisorsSupportingSnapshotsChaining.contains(volSnapshot.getHypervisorType())) { + return true; + } + + return false; + } + } diff --git a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java index 066503b0208e..2372e8444cc5 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/image/db/TemplateDataStoreDaoImpl.java @@ -26,6 +26,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import org.apache.cloudstack.engine.subsystem.api.storage.DataObjectInStore; @@ -67,6 +68,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase storeTemplateDownloadStatusSearch; private SearchBuilder downloadTemplateSearch; private SearchBuilder uploadTemplateStateSearch; + private SearchBuilder directDownloadTemplateSeach; private SearchBuilder templateOnlySearch; private static final String EXPIRE_DOWNLOAD_URLS_FOR_ZONE = "update template_store_ref set download_url_created=? where download_url_created is not null and store_id in (select id from image_store where data_center_id=?)"; @@ -143,6 +145,13 @@ public boolean configure(String name, Map params) throws Configu downloadTemplateSearch.and("destroyed", downloadTemplateSearch.entity().getDestroyed(), SearchCriteria.Op.EQ); downloadTemplateSearch.done(); + directDownloadTemplateSeach = createSearchBuilder(); + directDownloadTemplateSeach.and("template_id", directDownloadTemplateSeach.entity().getTemplateId(), Op.EQ); + directDownloadTemplateSeach.and("download_state", directDownloadTemplateSeach.entity().getDownloadState(), Op.EQ); + directDownloadTemplateSeach.and("store_id", directDownloadTemplateSeach.entity().getDataStoreId(), Op.NULL); + directDownloadTemplateSeach.and("state", directDownloadTemplateSeach.entity().getState(), Op.EQ); + directDownloadTemplateSeach.done(); + templateOnlySearch = _tmpltDao.createSearchBuilder(); templateOnlySearch.and("states", templateOnlySearch.entity().getState(), SearchCriteria.Op.IN); uploadTemplateStateSearch = createSearchBuilder(); @@ -549,4 +558,34 @@ public List listByTemplateState(VirtualMachineTemplate.Stat sc.setParameters("destroyed", false); return listIncludingRemovedBy(sc); } + + @Override + public TemplateDataStoreVO createTemplateDirectDownloadEntry(long templateId, Long size) { + TemplateDataStoreVO templateDataStoreVO = new TemplateDataStoreVO(); + templateDataStoreVO.setTemplateId(templateId); + templateDataStoreVO.setDataStoreRole(DataStoreRole.Image); + templateDataStoreVO.setState(State.Ready); + templateDataStoreVO.setDownloadState(Status.BYPASSED); + templateDataStoreVO.setSize(size == null ? 0l : size); + return templateDataStoreVO; + } + + @Override + public TemplateDataStoreVO getReadyBypassedTemplate(long templateId) { + SearchCriteria sc = directDownloadTemplateSeach.create(); + sc.setParameters("template_id", templateId); + sc.setParameters("download_state", Status.BYPASSED); + sc.setParameters("state", State.Ready); + List list = search(sc, null); + if (CollectionUtils.isEmpty(list) || list.size() > 1) { + return null; + } + return list.get(0); + } + + @Override + public boolean isTemplateMarkedForDirectDownload(long templateId) { + TemplateDataStoreVO templateRef = getReadyBypassedTemplate(templateId); + return templateRef != null; + } } diff --git a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java index a660f412113f..24e77a8a5442 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/snapshot/SnapshotEntityImpl.java @@ -94,6 +94,12 @@ public String getName() { return null; } + @Override + public long getSnapshotId() { + // TODO Auto-generated method stub + return 0; + } + @Override public Date getCreated() { // TODO Auto-generated method stub @@ -184,6 +190,11 @@ public Type getRecurringType() { return null; } + @Override + public LocationType getLocationType() { + return null; + } + @Override public Class getEntityType() { return Snapshot.class; diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java index 8752c198e3d8..31b57080aec6 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java +++ b/engine/storage/src/org/apache/cloudstack/storage/volume/datastore/PrimaryDataStoreHelper.java @@ -20,6 +20,7 @@ import java.io.UnsupportedEncodingException; import java.net.URLEncoder; +import java.util.ArrayList; import java.util.List; import java.util.Map; @@ -118,6 +119,8 @@ public DataStore createPrimaryDataStore(PrimaryDataStoreParameters params) { dataStoreVO.setPath(updatedPath); } String tags = params.getTags(); + List storageTags = new ArrayList(); + if (tags != null) { String[] tokens = tags.split(","); @@ -126,10 +129,10 @@ public DataStore createPrimaryDataStore(PrimaryDataStoreParameters params) { if (tag.length() == 0) { continue; } - details.put(tag, "true"); + storageTags.add(tag); } } - dataStoreVO = dataStoreDao.persist(dataStoreVO, details); + dataStoreVO = dataStoreDao.persist(dataStoreVO, details, storageTags); return dataStoreMgr.getDataStore(dataStoreVO.getId(), DataStoreRole.Primary); } @@ -231,6 +234,7 @@ public boolean deletePrimaryDataStore(DataStore store) { poolVO.setUuid(null); this.dataStoreDao.update(poolVO.getId(), poolVO); dataStoreDao.remove(poolVO.getId()); + dataStoreDao.deletePoolTags(poolVO.getId()); deletePoolStats(poolVO.getId()); // Delete op_host_capacity entries this._capacityDao.removeBy(Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED, null, null, null, poolVO.getId()); diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java deleted file mode 100644 index 75838b025812..000000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreDaoImpl.java +++ /dev/null @@ -1,123 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cloudstack.storage.volume.db; - -import java.util.Date; - -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.Event; -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine.State; - -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.QueryBuilder; -import com.cloud.utils.db.SearchBuilder; -import com.cloud.utils.db.SearchCriteria; -import com.cloud.utils.db.SearchCriteria.Op; -import com.cloud.utils.db.UpdateBuilder; - -@Component -public class TemplatePrimaryDataStoreDaoImpl extends GenericDaoBase implements TemplatePrimaryDataStoreDao { - private static final Logger s_logger = Logger.getLogger(TemplatePrimaryDataStoreDaoImpl.class); - protected final SearchBuilder updateSearchBuilder; - - public TemplatePrimaryDataStoreDaoImpl() { - updateSearchBuilder = createSearchBuilder(); - updateSearchBuilder.and("id", updateSearchBuilder.entity().getId(), Op.EQ); - updateSearchBuilder.and("state", updateSearchBuilder.entity().getState(), Op.EQ); - updateSearchBuilder.and("updatedCount", updateSearchBuilder.entity().getUpdatedCount(), Op.EQ); - updateSearchBuilder.done(); - } - - @Override - public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolId(long templateId, long poolId) { - QueryBuilder sc = QueryBuilder.create(TemplatePrimaryDataStoreVO.class); - sc.and(sc.entity().getTemplateId(), Op.EQ, templateId); - sc.and(sc.entity().getPoolId(), Op.EQ, poolId); - return sc.find(); - } - - @Override - public TemplatePrimaryDataStoreVO findByTemplateIdAndPoolIdAndReady(long templateId, long poolId) { - QueryBuilder sc = QueryBuilder.create(TemplatePrimaryDataStoreVO.class); - sc.and(sc.entity().getTemplateId(), Op.EQ, templateId); - sc.and(sc.entity().getPoolId(), Op.EQ, poolId); - sc.and(sc.entity().getState(), Op.EQ, ObjectInDataStoreStateMachine.State.Ready); - return sc.find(); - } - - @Override - public boolean updateState(State currentState, Event event, State nextState, TemplatePrimaryDataStoreVO vo, Object data) { - Long oldUpdated = vo.getUpdatedCount(); - Date oldUpdatedTime = vo.getLastUpdated(); - - SearchCriteria sc = updateSearchBuilder.create(); - sc.setParameters("id", vo.getId()); - sc.setParameters("state", currentState); - sc.setParameters("updatedCount", vo.getUpdatedCount()); - - vo.incrUpdatedCount(); - - UpdateBuilder builder = getUpdateBuilder(vo); - builder.set(vo, "state", nextState); - builder.set(vo, "lastUpdated", new Date()); - - int rows = update(vo, sc); - if (rows == 0 && s_logger.isDebugEnabled()) { - TemplatePrimaryDataStoreVO template = findByIdIncludingRemoved(vo.getId()); - if (template != null) { - StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString()); - str.append(": DB Data={id=") - .append(template.getId()) - .append("; state=") - .append(template.getState()) - .append("; updatecount=") - .append(template.getUpdatedCount()) - .append(";updatedTime=") - .append(template.getLastUpdated()); - str.append(": New Data={id=") - .append(vo.getId()) - .append("; state=") - .append(nextState) - .append("; event=") - .append(event) - .append("; updatecount=") - .append(vo.getUpdatedCount()) - .append("; updatedTime=") - .append(vo.getLastUpdated()); - str.append(": stale Data={id=") - .append(vo.getId()) - .append("; state=") - .append(currentState) - .append("; event=") - .append(event) - .append("; updatecount=") - .append(oldUpdated) - .append("; updatedTime=") - .append(oldUpdatedTime); - } else { - s_logger.debug("Unable to update template: id=" + vo.getId() + ", as there is no such template exists in the database anymore"); - } - } - return rows > 0; - } - -} diff --git a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java b/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java deleted file mode 100644 index 9635729442bd..000000000000 --- a/engine/storage/src/org/apache/cloudstack/storage/volume/db/TemplatePrimaryDataStoreVO.java +++ /dev/null @@ -1,262 +0,0 @@ -/* - * Licensed to the Apache Software Foundation (ASF) under one - * or more contributor license agreements. See the NOTICE file - * distributed with this work for additional information - * regarding copyright ownership. The ASF licenses this file - * to you under the Apache License, Version 2.0 (the - * "License"); you may not use this file except in compliance - * with the License. You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, - * software distributed under the License is distributed on an - * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY - * KIND, either express or implied. See the License for the - * specific language governing permissions and limitations - * under the License. - */ -package org.apache.cloudstack.storage.volume.db; - -import java.util.Date; - -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.Table; -import javax.persistence.Temporal; -import javax.persistence.TemporalType; - -import org.apache.cloudstack.engine.subsystem.api.storage.ObjectInDataStoreStateMachine; - -import com.cloud.storage.VMTemplateStorageResourceAssoc.Status; -import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.fsm.StateObject; - -@Entity -@Table(name = "template_spool_ref") -public class TemplatePrimaryDataStoreVO implements StateObject { - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - long id; - - @Column(name = "pool_id") - private long poolId; - - @Column(name = "template_id") - long templateId; - - @Column(name = GenericDaoBase.CREATED_COLUMN) - Date created = null; - - @Column(name = "last_updated") - @Temporal(value = TemporalType.TIMESTAMP) - Date lastUpdated = null; - - @Column(name = "download_pct") - int downloadPercent; - - @Column(name = "download_state") - @Enumerated(EnumType.STRING) - Status downloadState; - - @Column(name = "local_path") - String localDownloadPath; - - @Column(name = "error_str") - String errorString; - - @Column(name = "job_id") - String jobId; - - @Column(name = "install_path") - String installPath; - - @Column(name = "template_size") - long templateSize; - - @Column(name = "marked_for_gc") - boolean markedForGC; - - @Column(name = "state") - @Enumerated(EnumType.STRING) - ObjectInDataStoreStateMachine.State state; - - @Column(name = "update_count", updatable = true, nullable = false) - protected long updatedCount; - - public long getUpdatedCount() { - return this.updatedCount; - } - - public void incrUpdatedCount() { - this.updatedCount++; - } - - public void decrUpdatedCount() { - this.updatedCount--; - } - - public String getInstallPath() { - return installPath; - } - - public long getTemplateSize() { - return templateSize; - } - - public long getPoolId() { - return poolId; - } - - public void setpoolId(long poolId) { - this.poolId = poolId; - } - - public long getTemplateId() { - return templateId; - } - - public void setTemplateId(long templateId) { - this.templateId = templateId; - } - - public int getDownloadPercent() { - return downloadPercent; - } - - public void setDownloadPercent(int downloadPercent) { - this.downloadPercent = downloadPercent; - } - - public void setDownloadState(Status downloadState) { - this.downloadState = downloadState; - } - - public long getId() { - return id; - } - - public Date getCreated() { - return created; - } - - public Date getLastUpdated() { - return lastUpdated; - } - - public void setLastUpdated(Date date) { - lastUpdated = date; - } - - public void setInstallPath(String installPath) { - this.installPath = installPath; - } - - public Status getDownloadState() { - return downloadState; - } - - public TemplatePrimaryDataStoreVO(long poolId, long templateId) { - super(); - this.poolId = poolId; - this.templateId = templateId; - this.downloadState = Status.NOT_DOWNLOADED; - this.state = ObjectInDataStoreStateMachine.State.Allocated; - this.markedForGC = false; - } - - public TemplatePrimaryDataStoreVO(long poolId, long templateId, Date lastUpdated, int downloadPercent, Status downloadState, String localDownloadPath, - String errorString, String jobId, String installPath, long templateSize) { - super(); - this.poolId = poolId; - this.templateId = templateId; - this.lastUpdated = lastUpdated; - this.downloadPercent = downloadPercent; - this.downloadState = downloadState; - this.localDownloadPath = localDownloadPath; - this.errorString = errorString; - this.jobId = jobId; - this.installPath = installPath; - this.templateSize = templateSize; - } - - protected TemplatePrimaryDataStoreVO() { - - } - - public void setLocalDownloadPath(String localPath) { - this.localDownloadPath = localPath; - } - - public String getLocalDownloadPath() { - return localDownloadPath; - } - - public void setErrorString(String errorString) { - this.errorString = errorString; - } - - public String getErrorString() { - return errorString; - } - - public void setJobId(String jobId) { - this.jobId = jobId; - } - - public String getJobId() { - return jobId; - } - - public void setTemplateSize(long templateSize) { - this.templateSize = templateSize; - } - - public boolean getMarkedForGC() { - return markedForGC; - } - - public void setMarkedForGC(boolean markedForGC) { - this.markedForGC = markedForGC; - } - - @Override - public boolean equals(Object obj) { - if (obj instanceof TemplatePrimaryDataStoreVO) { - TemplatePrimaryDataStoreVO other = (TemplatePrimaryDataStoreVO)obj; - return (this.templateId == other.getTemplateId() && this.poolId == other.getPoolId()); - } - return false; - } - - @Override - public int hashCode() { - Long tid = new Long(templateId); - Long hid = new Long(poolId); - return tid.hashCode() + hid.hashCode(); - } - - @Override - public String toString() { - return new StringBuilder("TmplPool[").append(id) - .append("-") - .append(templateId) - .append("-") - .append("poolId") - .append("-") - .append(installPath) - .append("]") - .toString(); - } - - @Override - public ObjectInDataStoreStateMachine.State getState() { - return this.state; - } - -} \ No newline at end of file diff --git a/engine/storage/volume/pom.xml b/engine/storage/volume/pom.xml index 83a555cd2ab0..f08eaf04f006 100644 --- a/engine/storage/volume/pom.xml +++ b/engine/storage/volume/pom.xml @@ -16,7 +16,7 @@ org.apache.cloudstack cloud-engine - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/engine/storage/volume/resources/META-INF/cloudstack/core/spring-engine-storage-volume-core-context.xml b/engine/storage/volume/resources/META-INF/cloudstack/core/spring-engine-storage-volume-core-context.xml index ba9afb538ec8..860929cdeb50 100644 --- a/engine/storage/volume/resources/META-INF/cloudstack/core/spring-engine-storage-volume-core-context.xml +++ b/engine/storage/volume/resources/META-INF/cloudstack/core/spring-engine-storage-volume-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java index 3e4cdfff20f6..692f3cc97915 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeDataFactoryImpl.java @@ -23,8 +23,6 @@ import javax.inject.Inject; -import org.springframework.stereotype.Component; - import org.apache.cloudstack.engine.subsystem.api.storage.DataObject; import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; @@ -37,7 +35,6 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.VolumeDao; -@Component public class VolumeDataFactoryImpl implements VolumeDataFactory { @Inject VolumeDao volumeDao; diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java index 5bf49a9a8138..ed9b39823f2f 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeObject.java @@ -174,11 +174,11 @@ public long getVolumeId() { } @Override - public boolean stateTransit(Volume.Event event) { + public boolean stateTransit(Volume.Event event) { boolean result = false; try { volumeVO = volumeDao.findById(volumeVO.getId()); - if(volumeVO != null) { + if (volumeVO != null) { result = _volStateMachine.transitTo(volumeVO, event, null, volumeDao); volumeVO = volumeDao.findById(volumeVO.getId()); } @@ -332,8 +332,9 @@ public void processEvent(ObjectInDataStoreStateMachine.Event event) { throw new CloudRuntimeException("Failed to update state:" + e.toString()); } finally { // in case of OperationFailed, expunge the entry + // state transit call reloads the volume from DB and so check for null as well if (event == ObjectInDataStoreStateMachine.Event.OperationFailed && - (volumeVO.getState() != Volume.State.Copying && volumeVO.getState() != Volume.State.Uploaded && volumeVO.getState() != Volume.State.UploadError)) { + (volumeVO != null && volumeVO.getState() != Volume.State.Copying && volumeVO.getState() != Volume.State.Uploaded && volumeVO.getState() != Volume.State.UploadError)) { objectInStoreMgr.deleteIfNotReady(this); } } @@ -516,7 +517,11 @@ public void processEvent(ObjectInDataStoreStateMachine.Event event, Answer answe VolumeObjectTO newVol = (VolumeObjectTO)cpyAnswer.getNewData(); vol.setPath(newVol.getPath()); if (newVol.getSize() != null) { - vol.setSize(newVol.getSize()); + // Root disk resize may be requested where the original + // template size is less than the requested root disk size + if (vol.getSize() == null || vol.getSize() < newVol.getSize()) { + vol.setSize(newVol.getSize()); + } } if (newVol.getFormat() != null) { vol.setFormat(newVol.getFormat()); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java index 0796ce06f01d..d2979f7415dd 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/volume/VolumeServiceImpl.java @@ -28,14 +28,6 @@ import javax.inject.Inject; -import com.cloud.dc.dao.ClusterDao; -import com.cloud.offering.DiskOffering; -import com.cloud.org.Cluster; -import com.cloud.org.Grouping.AllocationState; -import com.cloud.resource.ResourceState; -import com.cloud.server.ManagementService; -import com.cloud.storage.RegisterVolumePayload; -import com.cloud.utils.Pair; import org.apache.cloudstack.engine.cloud.entity.api.VolumeEntity; import org.apache.cloudstack.engine.subsystem.api.storage.ChapInfo; import org.apache.cloudstack.engine.subsystem.api.storage.CopyCommandResult; @@ -70,6 +62,7 @@ import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreDao; import org.apache.cloudstack.storage.datastore.db.SnapshotDataStoreVO; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreDao; import org.apache.cloudstack.storage.datastore.db.VolumeDataStoreVO; import org.apache.cloudstack.storage.image.store.TemplateObject; @@ -78,7 +71,9 @@ import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; +import com.cloud.agent.api.ModifyTargetsCommand; import com.cloud.agent.api.storage.ListVolumeAnswer; import com.cloud.agent.api.storage.ListVolumeCommand; import com.cloud.agent.api.storage.ResizeVolumeCommand; @@ -87,16 +82,22 @@ import com.cloud.alert.AlertManager; import com.cloud.configuration.Config; import com.cloud.configuration.Resource.ResourceType; +import com.cloud.dc.dao.ClusterDao; import com.cloud.event.EventTypes; import com.cloud.event.UsageEventUtils; -import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceAllocationException; import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.offering.DiskOffering; +import com.cloud.org.Cluster; +import com.cloud.org.Grouping.AllocationState; +import com.cloud.resource.ResourceState; +import com.cloud.server.ManagementService; import com.cloud.storage.DataStoreRole; +import com.cloud.storage.RegisterVolumePayload; import com.cloud.storage.ScopeType; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.storage.StoragePool; @@ -108,11 +109,13 @@ import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.VMTemplatePoolDao; import com.cloud.storage.dao.VolumeDao; +import com.cloud.storage.dao.VolumeDetailsDao; import com.cloud.storage.snapshot.SnapshotManager; import com.cloud.storage.template.TemplateProp; import com.cloud.user.AccountManager; import com.cloud.user.ResourceLimitService; import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Pair; import com.cloud.utils.db.DB; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.exception.CloudRuntimeException; @@ -121,6 +124,8 @@ public class VolumeServiceImpl implements VolumeService { private static final Logger s_logger = Logger.getLogger(VolumeServiceImpl.class); @Inject + protected AgentManager agentMgr; + @Inject VolumeDao volDao; @Inject PrimaryDataStoreProviderManager dataStoreMgr; @@ -158,6 +163,10 @@ public class VolumeServiceImpl implements VolumeService { private ManagementService mgr; @Inject private ClusterDao clusterDao; + @Inject + private VolumeDetailsDao _volumeDetailsDao; + + private final static String SNAPSHOT_ID = "SNAPSHOT_ID"; public VolumeServiceImpl() { } @@ -320,10 +329,13 @@ public AsyncCallFuture expungeVolumeAsync(VolumeInfo volume) { } VolumeVO vol = volDao.findById(volume.getId()); + if (vol == null) { + s_logger.debug("Volume " + volume.getId() + " is not found"); + future.complete(result); + return future; + } - String volumePath = vol.getPath(); - Long poolId = vol.getPoolId(); - if (poolId == null || volumePath == null || volumePath.trim().isEmpty()) { + if (!volumeExistsOnPrimary(vol)) { // not created on primary store if (volumeStore == null) { // also not created on secondary store @@ -352,6 +364,32 @@ public AsyncCallFuture expungeVolumeAsync(VolumeInfo volume) { return future; } + private boolean volumeExistsOnPrimary(VolumeVO vol) { + Long poolId = vol.getPoolId(); + + if (poolId == null) { + return false; + } + + PrimaryDataStore primaryStore = dataStoreMgr.getPrimaryDataStore(poolId); + + if (primaryStore == null) { + return false; + } + + if (primaryStore.isManaged()) { + return true; + } + + String volumePath = vol.getPath(); + + if (volumePath == null || volumePath.trim().isEmpty()) { + return false; + } + + return true; + } + public Void deleteVolumeCallback(AsyncCallbackDispatcher callback, DeleteVolumeContext context) { CommandResult result = callback.getResult(); VolumeObject vo = context.getVolume(); @@ -363,9 +401,26 @@ public Void deleteVolumeCallback(AsyncCallbackDispatcher mapCapabilities = primaryDataStore.getDriver().getCapabilities(); + + String value = mapCapabilities.get(DataStoreCapabilities.STORAGE_SYSTEM_SNAPSHOT.toString()); + Boolean supportsStorageSystemSnapshots = new Boolean(value); + + if (!supportsStorageSystemSnapshots) { + _snapshotStoreDao.remove(snapStoreVo.getId()); + } + } else { + _snapshotStoreDao.remove(snapStoreVo.getId()); + } } } else { vo.processEvent(Event.OperationFailed); @@ -395,8 +450,8 @@ private class ManagedCreateBaseImageContext extends AsyncRpcContext { private final TemplateInfo _templateInfo; private final AsyncCallFuture _future; - public ManagedCreateBaseImageContext(AsyncCompletionCallback callback, VolumeInfo volumeInfo, - PrimaryDataStore primaryDatastore, TemplateInfo templateInfo, AsyncCallFuture future) { + public ManagedCreateBaseImageContext(AsyncCompletionCallback callback, VolumeInfo volumeInfo, PrimaryDataStore primaryDatastore, TemplateInfo templateInfo, + AsyncCallFuture future) { super(callback); _volumeInfo = volumeInfo; @@ -430,8 +485,8 @@ class CreateBaseImageContext extends AsyncRpcContext { final DataObject destObj; long templatePoolId; - public CreateBaseImageContext(AsyncCompletionCallback callback, VolumeInfo volume, PrimaryDataStore datastore, TemplateInfo srcTemplate, - AsyncCallFuture future, DataObject destObj, long templatePoolId) { + public CreateBaseImageContext(AsyncCompletionCallback callback, VolumeInfo volume, PrimaryDataStore datastore, TemplateInfo srcTemplate, AsyncCallFuture future, + DataObject destObj, long templatePoolId) { super(callback); this.volume = volume; this.dataStore = datastore; @@ -491,13 +546,11 @@ protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStor throw new CloudRuntimeException("Failed to find template " + template.getUniqueName() + " in storage pool " + dataStore.getId()); } else { if (s_logger.isDebugEnabled()) { - s_logger.debug("Found template " + template.getUniqueName() + " in storage pool " + dataStore.getId() + " with VMTemplateStoragePool id: " + - templatePoolRef.getId()); + s_logger.debug("Found template " + template.getUniqueName() + " in storage pool " + dataStore.getId() + " with VMTemplateStoragePool id: " + templatePoolRef.getId()); } } long templatePoolRefId = templatePoolRef.getId(); - CreateBaseImageContext context = - new CreateBaseImageContext(null, volume, dataStore, template, future, templateOnPrimaryStoreObj, templatePoolRefId); + CreateBaseImageContext context = new CreateBaseImageContext(null, volume, dataStore, template, future, templateOnPrimaryStoreObj, templatePoolRefId); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().copyBaseImageCallback(null, null)).setContext(context); @@ -513,8 +566,8 @@ protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStor } templatePoolRef = _tmpltPoolDao.findByPoolTemplate(dataStore.getId(), template.getId()); if (templatePoolRef != null && templatePoolRef.getState() == ObjectInDataStoreStateMachine.State.Ready) { - s_logger.info("Unable to acquire lock on VMTemplateStoragePool " + templatePoolRefId + ", But Template " + template.getUniqueName() + - " is already copied to primary storage, skip copying"); + s_logger.info( + "Unable to acquire lock on VMTemplateStoragePool " + templatePoolRefId + ", But Template " + template.getUniqueName() + " is already copied to primary storage, skip copying"); createVolumeFromBaseImageAsync(volume, templateOnPrimaryStoreObj, dataStore, future); return; } @@ -548,8 +601,7 @@ protected void createBaseImageAsync(VolumeInfo volume, PrimaryDataStore dataStor return; } - protected Void managedCopyBaseImageCallback(AsyncCallbackDispatcher callback, - ManagedCreateBaseImageContext context) { + protected Void managedCopyBaseImageCallback(AsyncCallbackDispatcher callback, ManagedCreateBaseImageContext context) { CopyCommandResult result = callback.getResult(); VolumeInfo volumeInfo = context.getVolumeInfo(); VolumeApiResult res = new VolumeApiResult(volumeInfo); @@ -568,8 +620,7 @@ protected Void managedCopyBaseImageCallback(AsyncCallbackDispatcher extends AsyncRpcContext { private final DataObject templateOnStore; private final SnapshotInfo snapshot; - public CreateVolumeFromBaseImageContext(AsyncCompletionCallback callback, DataObject vo, DataStore primaryStore, DataObject templateOnStore, - AsyncCallFuture future, SnapshotInfo snapshot) { + public CreateVolumeFromBaseImageContext(AsyncCompletionCallback callback, DataObject vo, DataStore primaryStore, DataObject templateOnStore, AsyncCallFuture future, + SnapshotInfo snapshot) { super(callback); this.vo = vo; this.future = future; @@ -669,8 +718,7 @@ protected void createVolumeFromBaseImageAsync(VolumeInfo volume, DataObject temp DataObject volumeOnPrimaryStorage = pd.create(volume); volumeOnPrimaryStorage.processEvent(Event.CreateOnlyRequested); - CreateVolumeFromBaseImageContext context = - new CreateVolumeFromBaseImageContext(null, volumeOnPrimaryStorage, pd, templateOnPrimaryStore, future, null); + CreateVolumeFromBaseImageContext context = new CreateVolumeFromBaseImageContext(null, volumeOnPrimaryStorage, pd, templateOnPrimaryStore, future, null); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().createVolumeFromBaseImageCallBack(null, null)); caller.setContext(context); @@ -680,8 +728,7 @@ protected void createVolumeFromBaseImageAsync(VolumeInfo volume, DataObject temp } @DB - protected Void createVolumeFromBaseImageCallBack(AsyncCallbackDispatcher callback, - CreateVolumeFromBaseImageContext context) { + protected Void createVolumeFromBaseImageCallBack(AsyncCallbackDispatcher callback, CreateVolumeFromBaseImageContext context) { DataObject vo = context.vo; DataObject tmplOnPrimary = context.templateOnStore; CopyCommandResult result = callback.getResult(); @@ -713,7 +760,7 @@ protected Void createVolumeFromBaseImageCallBack(AsyncCallbackDispatcher copyTemplateFuture = new AsyncCallFuture<>(); int storagePoolMaxWaitSeconds = NumbersUtil.parseInt(configDao.getValue(Config.StoragePoolMaxWaitSeconds.key()), 3600); long templatePoolRefId = templatePoolRef.getId(); @@ -831,22 +875,20 @@ private void copyTemplateToManagedTemplateVolume(TemplateInfo srcTemplateInfo, T } try { - // copy the template from sec storage to the created volume - CreateBaseImageContext copyContext = new CreateBaseImageContext<>( - null, null, destPrimaryDataStore, srcTemplateInfo, - copyTemplateFuture, templateOnPrimary, templatePoolRefId - ); + // copy the template from sec storage to the created volume + CreateBaseImageContext copyContext = new CreateBaseImageContext<>(null, null, destPrimaryDataStore, srcTemplateInfo, copyTemplateFuture, templateOnPrimary, + templatePoolRefId); AsyncCallbackDispatcher copyCaller = AsyncCallbackDispatcher.create(this); copyCaller.setCallback(copyCaller.getTarget().copyManagedTemplateCallback(null, null)).setContext(copyContext); // Populate details which will be later read by the storage subsystem. - Map details = new HashMap(); + Map details = new HashMap<>(); details.put(PrimaryDataStore.MANAGED, Boolean.TRUE.toString()); details.put(PrimaryDataStore.STORAGE_HOST, destPrimaryDataStore.getHostAddress()); details.put(PrimaryDataStore.STORAGE_PORT, String.valueOf(destPrimaryDataStore.getPort())); - details.put(PrimaryDataStore.MANAGED_STORE_TARGET, ((TemplateObject)templateOnPrimary).getInstallPath()); + details.put(PrimaryDataStore.MANAGED_STORE_TARGET, templateOnPrimary.getInstallPath()); details.put(PrimaryDataStore.MANAGED_STORE_TARGET_ROOT_VOLUME, srcTemplateInfo.getUniqueName()); details.put(PrimaryDataStore.REMOVE_AFTER_COPY, Boolean.TRUE.toString()); details.put(PrimaryDataStore.VOLUME_SIZE, String.valueOf(templateOnPrimary.getSize())); @@ -866,37 +908,68 @@ private void copyTemplateToManagedTemplateVolume(TemplateInfo srcTemplateInfo, T grantAccess(templateOnPrimary, destHost, destPrimaryDataStore); - VolumeApiResult result = null; + VolumeApiResult result; try { motionSrv.copyAsync(srcTemplateInfo, templateOnPrimary, destHost, copyCaller); result = copyTemplateFuture.get(); - } - finally { + } finally { revokeAccess(templateOnPrimary, destHost, destPrimaryDataStore); + + if (HypervisorType.VMware.equals(destHost.getHypervisorType())) { + details.put(ModifyTargetsCommand.IQN, templateOnPrimary.getInstallPath()); + + List> targets = new ArrayList<>(); + + targets.add(details); + + removeDynamicTargets(destHost.getId(), targets); + } } if (result.isFailed()) { - throw new CloudRuntimeException("Failed to copy template " + templateOnPrimary.getId() + - " to primary storage " + destPrimaryDataStore.getId() + ": " + result.getResult()); + throw new CloudRuntimeException("Failed to copy template " + templateOnPrimary.getId() + " to primary storage " + destPrimaryDataStore.getId() + ": " + result.getResult()); // XXX: I find it is useful to destroy the volume on primary storage instead of another thread trying the copy again because I've seen // something weird happens to the volume (XenServer creates an SR, but the VDI copy can fail). // For now, I just retry the copy. } - } - catch (Throwable e) { + } catch (Throwable e) { s_logger.debug("Failed to create a template on primary storage", e); templateOnPrimary.processEvent(Event.OperationFailed); throw new CloudRuntimeException(e.getMessage()); - } - finally { + } finally { _tmpltPoolDao.releaseFromLockTable(templatePoolRefId); } } + private void removeDynamicTargets(long hostId, List> targets) { + ModifyTargetsCommand cmd = new ModifyTargetsCommand(); + + cmd.setTargets(targets); + cmd.setApplyToAllHostsInCluster(true); + cmd.setAdd(false); + cmd.setTargetTypeToRemove(ModifyTargetsCommand.TargetTypeToRemove.DYNAMIC); + + sendModifyTargetsCommand(cmd, hostId); + } + + private void sendModifyTargetsCommand(ModifyTargetsCommand cmd, long hostId) { + Answer answer = agentMgr.easySend(hostId, cmd); + + if (answer == null) { + String msg = "Unable to get an answer to the modify targets command"; + + s_logger.warn(msg); + } else if (!answer.getResult()) { + String msg = "Unable to modify target on the following host: " + hostId; + + s_logger.warn(msg); + } + } + /** * Clones the template volume on managed storage to the ROOT volume * @@ -905,8 +978,7 @@ private void copyTemplateToManagedTemplateVolume(TemplateInfo srcTemplateInfo, T * @param destPrimaryDataStore Primary storage of the volume * @param future For async */ - private void createManagedVolumeCloneTemplateAsync(VolumeInfo volumeInfo, TemplateInfo templateOnPrimary, PrimaryDataStore destPrimaryDataStore, - AsyncCallFuture future) { + private void createManagedVolumeCloneTemplateAsync(VolumeInfo volumeInfo, TemplateInfo templateOnPrimary, PrimaryDataStore destPrimaryDataStore, AsyncCallFuture future) { VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId()); if (templatePoolRef == null) { @@ -921,8 +993,7 @@ private void createManagedVolumeCloneTemplateAsync(VolumeInfo volumeInfo, Templa try { volumeInfo.processEvent(Event.CreateOnlyRequested); - CreateVolumeFromBaseImageContext context = - new CreateVolumeFromBaseImageContext<>(null, volumeInfo, destPrimaryDataStore, templateOnPrimary, future, null); + CreateVolumeFromBaseImageContext context = new CreateVolumeFromBaseImageContext<>(null, volumeInfo, destPrimaryDataStore, templateOnPrimary, future, null); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); @@ -939,8 +1010,7 @@ private void createManagedVolumeCloneTemplateAsync(VolumeInfo volumeInfo, Templa } } - private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, PrimaryDataStore primaryDataStore, TemplateInfo srcTemplateInfo, Host destHost, - AsyncCallFuture future) { + private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, PrimaryDataStore primaryDataStore, TemplateInfo srcTemplateInfo, Host destHost, AsyncCallFuture future) { try { // Create a volume on managed storage. @@ -956,8 +1026,7 @@ private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, Primary // Refresh the volume info from the DB. volumeInfo = volFactory.getVolume(volumeInfo.getId(), primaryDataStore); - ManagedCreateBaseImageContext context = new ManagedCreateBaseImageContext(null, volumeInfo, - primaryDataStore, srcTemplateInfo, future); + ManagedCreateBaseImageContext context = new ManagedCreateBaseImageContext(null, volumeInfo, primaryDataStore, srcTemplateInfo, future); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().managedCopyBaseImageCallback(null, null)).setContext(context); @@ -987,8 +1056,7 @@ private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, Primary try { motionSrv.copyAsync(srcTemplateInfo, destTemplateInfo, destHost, caller); - } - finally { + } finally { revokeAccess(volumeInfo, destHost, primaryDataStore); } } catch (Throwable t) { @@ -1004,8 +1072,7 @@ private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, Primary if (expungeVolumeResult.isFailed()) { errMsg += " : Failed to expunge a volume that was created"; } - } - catch (Exception ex) { + } catch (Exception ex) { errMsg += " : " + ex.getMessage(); } @@ -1018,8 +1085,7 @@ private void createManagedVolumeCopyTemplateAsync(VolumeInfo volumeInfo, Primary } @Override - public AsyncCallFuture createManagedStorageVolumeFromTemplateAsync(VolumeInfo volumeInfo, long destDataStoreId, - TemplateInfo srcTemplateInfo, long destHostId) { + public AsyncCallFuture createManagedStorageVolumeFromTemplateAsync(VolumeInfo volumeInfo, long destDataStoreId, TemplateInfo srcTemplateInfo, long destHostId) { PrimaryDataStore destPrimaryDataStore = dataStoreMgr.getPrimaryDataStore(destDataStoreId); Host destHost = _hostDao.findById(destHostId); @@ -1027,16 +1093,14 @@ public AsyncCallFuture createManagedStorageVolumeFromTemplateAs throw new CloudRuntimeException("Destination host should not be null."); } - Boolean storageCanCloneVolume = new Boolean( - destPrimaryDataStore.getDriver().getCapabilities().get(DataStoreCapabilities.CAN_CREATE_VOLUME_FROM_VOLUME.toString()) - ); + Boolean storageCanCloneVolume = new Boolean(destPrimaryDataStore.getDriver().getCapabilities().get(DataStoreCapabilities.CAN_CREATE_VOLUME_FROM_VOLUME.toString())); - boolean computeZoneSupportsResign = computeZoneSupportsResign(destHost.getDataCenterId(), destHost.getHypervisorType()); + boolean computeSupportsVolumeClone = computeSupportsVolumeClone(destHost.getDataCenterId(), destHost.getHypervisorType()); AsyncCallFuture future = new AsyncCallFuture<>(); - if (storageCanCloneVolume && computeZoneSupportsResign) { - s_logger.debug("Storage " + destDataStoreId + " can support cloning using a cached template and host cluster can perform UUID resigning."); + if (storageCanCloneVolume && computeSupportsVolumeClone) { + s_logger.debug("Storage " + destDataStoreId + " can support cloning using a cached template and compute side is OK with volume cloning."); TemplateInfo templateOnPrimary = destPrimaryDataStore.getTemplate(srcTemplateInfo.getId()); @@ -1052,10 +1116,7 @@ public AsyncCallFuture createManagedStorageVolumeFromTemplateAs VMTemplateStoragePoolVO templatePoolRef = _tmpltPoolDao.findByPoolTemplate(destPrimaryDataStore.getId(), templateOnPrimary.getId()); if (templatePoolRef == null) { - throw new CloudRuntimeException("Failed to find template " + - srcTemplateInfo.getUniqueName() + " in storage pool " + - destPrimaryDataStore.getId() - ); + throw new CloudRuntimeException("Failed to find template " + srcTemplateInfo.getUniqueName() + " in storage pool " + destPrimaryDataStore.getId()); } if (templatePoolRef.getDownloadState() == Status.NOT_DOWNLOADED) { @@ -1064,16 +1125,22 @@ public AsyncCallFuture createManagedStorageVolumeFromTemplateAs // We have a template on primary storage. Clone it to new volume. s_logger.debug("Creating a clone from template on primary storage " + destDataStoreId); + createManagedVolumeCloneTemplateAsync(volumeInfo, templateOnPrimary, destPrimaryDataStore, future); } else { s_logger.debug("Primary storage does not support cloning or no support for UUID resigning on the host side; copying the template normally"); + createManagedVolumeCopyTemplateAsync(volumeInfo, destPrimaryDataStore, srcTemplateInfo, destHost, future); } return future; } - private boolean computeZoneSupportsResign(long zoneId, HypervisorType hypervisorType) { + private boolean computeSupportsVolumeClone(long zoneId, HypervisorType hypervisorType) { + if (HypervisorType.VMware.equals(hypervisorType) || HypervisorType.KVM.equals(hypervisorType)) { + return true; + } + return getHost(zoneId, hypervisorType, true) != null; } @@ -1090,8 +1157,7 @@ private HostVO getHost(Long zoneId, HypervisorType hypervisorType, boolean compu Collections.shuffle(clusters, new Random(System.nanoTime())); - clusters: - for (Cluster cluster : clusters) { + clusters: for (Cluster cluster : clusters) { if (cluster.getAllocationState() == AllocationState.Enabled) { List hosts = _hostDao.findByClusterId(cluster.getId()); @@ -1103,13 +1169,11 @@ private HostVO getHost(Long zoneId, HypervisorType hypervisorType, boolean compu if (computeClusterMustSupportResign) { if (clusterDao.getSupportsResigning(cluster.getId())) { return host; - } - else { + } else { // no other host in the cluster in question should be able to satisfy our requirements here, so move on to the next cluster continue clusters; } - } - else { + } else { return host; } } @@ -1137,17 +1201,15 @@ public AsyncCallFuture createVolumeFromTemplateAsync(VolumeInfo return future; } - @Override @DB - public boolean destroyVolume(long volumeId) throws ConcurrentOperationException { + @Override + public void destroyVolume(long volumeId) { // mark volume entry in volumes table as destroy state VolumeInfo vol = volFactory.getVolume(volumeId); vol.stateTransit(Volume.Event.DestroyRequested); snapshotMgr.deletePoliciesForVolume(volumeId); vol.stateTransit(Volume.Event.OperationSucceeded); - - return true; } @Override @@ -1157,9 +1219,9 @@ public AsyncCallFuture createVolumeFromSnapshot(VolumeInfo volu try { DataObject volumeOnStore = store.create(volume); volumeOnStore.processEvent(Event.CreateOnlyRequested); - snapshot.processEvent(Event.CopyingRequested); - CreateVolumeFromBaseImageContext context = - new CreateVolumeFromBaseImageContext(null, volume, store, volumeOnStore, future, snapshot); + _volumeDetailsDao.addDetail(volume.getId(), SNAPSHOT_ID, Long.toString(snapshot.getId()), false); + + CreateVolumeFromBaseImageContext context = new CreateVolumeFromBaseImageContext(null, volume, store, volumeOnStore, future, snapshot); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().createVolumeFromSnapshotCallback(null, null)).setContext(context); motionSrv.copyAsync(snapshot, volumeOnStore, caller); @@ -1173,8 +1235,7 @@ public AsyncCallFuture createVolumeFromSnapshot(VolumeInfo volu return future; } - protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher callback, - CreateVolumeFromBaseImageContext context) { + protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher callback, CreateVolumeFromBaseImageContext context) { CopyCommandResult result = callback.getResult(); VolumeInfo volume = (VolumeInfo)context.templateOnStore; SnapshotInfo snapshot = context.snapshot; @@ -1193,7 +1254,8 @@ protected Void createVolumeFromSnapshotCallback(AsyncCallbackDispatcher extends AsyncRpcContext { final VolumeInfo destVolume; final AsyncCallFuture future; - public CopyVolumeContext(AsyncCompletionCallback callback, AsyncCallFuture future, VolumeInfo srcVolume, VolumeInfo destVolume, - DataStore destStore) { + public CopyVolumeContext(AsyncCompletionCallback callback, AsyncCallFuture future, VolumeInfo srcVolume, VolumeInfo destVolume, DataStore destStore) { super(callback); this.srcVolume = srcVolume; this.destVolume = destVolume; @@ -1268,8 +1329,7 @@ protected AsyncCallFuture copyVolumeFromImageToPrimary(VolumeIn } } - protected Void - copyVolumeFromImageToPrimaryCallback(AsyncCallbackDispatcher callback, CopyVolumeContext context) { + protected Void copyVolumeFromImageToPrimaryCallback(AsyncCallbackDispatcher callback, CopyVolumeContext context) { VolumeInfo srcVolume = context.srcVolume; VolumeInfo destVolume = context.destVolume; CopyCommandResult result = callback.getResult(); @@ -1322,8 +1382,7 @@ protected AsyncCallFuture copyVolumeFromPrimaryToImage(VolumeIn } } - protected Void - copyVolumeFromPrimaryToImageCallback(AsyncCallbackDispatcher callback, CopyVolumeContext context) { + protected Void copyVolumeFromPrimaryToImageCallback(AsyncCallbackDispatcher callback, CopyVolumeContext context) { VolumeInfo srcVolume = context.srcVolume; VolumeInfo destVolume = context.destVolume; CopyCommandResult result = callback.getResult(); @@ -1440,8 +1499,7 @@ private class MigrateVolumeContext extends AsyncRpcContext { /** * @param callback */ - public MigrateVolumeContext(AsyncCompletionCallback callback, AsyncCallFuture future, VolumeInfo srcVolume, VolumeInfo destVolume, - DataStore destStore) { + public MigrateVolumeContext(AsyncCompletionCallback callback, AsyncCallFuture future, VolumeInfo srcVolume, VolumeInfo destVolume, DataStore destStore) { super(callback); this.srcVolume = srcVolume; this.destVolume = destVolume; @@ -1487,6 +1545,7 @@ protected Void migrateVolumeCallBack(AsyncCallbackDispatcher migrateVolumes(Map return future; } - protected Void - migrateVmWithVolumesCallBack(AsyncCallbackDispatcher callback, MigrateVmWithVolumesContext context) { + protected Void migrateVmWithVolumesCallBack(AsyncCallbackDispatcher callback, MigrateVmWithVolumesContext context) { Map volumeToPool = context.volumeToPool; CopyCommandResult result = callback.getResult(); AsyncCallFuture future = context.future; @@ -1568,6 +1626,7 @@ public AsyncCallFuture migrateVolumes(Map } else { for (Map.Entry entry : volumeToPool.entrySet()) { VolumeInfo volume = entry.getKey(); + snapshotMgr.cleanupSnapshotsByVolume(volume.getId()); volume.processEvent(Event.OperationSuccessed); } future.complete(res); @@ -1611,7 +1670,7 @@ public AsyncCallFuture registerVolume(VolumeInfo volume, DataSt } @Override - public Pair registerVolumeForPostUpload(VolumeInfo volume, DataStore store) { + public Pair registerVolumeForPostUpload(VolumeInfo volume, DataStore store) { EndPoint ep = _epSelector.select(store); if (ep == null) { @@ -1620,7 +1679,7 @@ public Pair registerVolumeForPostUpload(VolumeInfo volume, throw new CloudRuntimeException(errorMessage); } DataObject volumeOnStore = store.create(volume); - return new Pair<>(ep,volumeOnStore); + return new Pair<>(ep, volumeOnStore); } protected Void registerVolumeCallback(AsyncCallbackDispatcher callback, CreateVolumeContext context) { @@ -1647,21 +1706,20 @@ protected Void registerVolumeCallback(AsyncCallbackDispatcher resize(VolumeInfo volume) { CreateVolumeContext context = new CreateVolumeContext(null, volume, future); AsyncCallbackDispatcher caller = AsyncCallbackDispatcher.create(this); caller.setCallback(caller.getTarget().resizeVolumeCallback(caller, context)).setContext(context); - volume.getDataStore().getDriver().resize(volume, caller); + + try { + volume.getDataStore().getDriver().resize(volume, caller); + } catch (Exception e) { + s_logger.debug("Failed to change state to resize", e); + + result.setResult(e.toString()); + + future.complete(result); + } + return future; } @@ -1715,8 +1783,8 @@ public void resizeVolumeOnHypervisor(long volumeId, long newSize, long destHostI if (ep != null) { VolumeVO volume = volDao.findById(volumeId); PrimaryDataStore primaryDataStore = this.dataStoreMgr.getPrimaryDataStore(volume.getPoolId()); - ResizeVolumeCommand resizeCmd = new ResizeVolumeCommand(volume.getPath(), new StorageFilerTO(primaryDataStore), - volume.getSize(), newSize, true, instanceName, primaryDataStore.isManaged(), volume.get_iScsiName()); + ResizeVolumeCommand resizeCmd = new ResizeVolumeCommand(volume.getPath(), new StorageFilerTO(primaryDataStore), volume.getSize(), newSize, true, instanceName, + primaryDataStore.isManaged(), volume.get_iScsiName()); answer = ep.sendMessage(resizeCmd); } else { @@ -1789,8 +1857,8 @@ public void handleVolumeSync(DataStore store) { for (VolumeDataStoreVO volumeStore : dbVolumes) { VolumeVO volume = volDao.findById(volumeStore.getVolumeId()); if (volume == null) { - s_logger.warn("Volume_store_ref table shows that volume " + volumeStore.getVolumeId() + " is on image store " + storeId + - ", but the volume is not found in volumes table, potentially some bugs in deleteVolume, so we just treat this volume to be deleted and mark it as destroyed"); + s_logger.warn("Volume_store_ref table shows that volume " + volumeStore.getVolumeId() + " is on image store " + storeId + + ", but the volume is not found in volumes table, potentially some bugs in deleteVolume, so we just treat this volume to be deleted and mark it as destroyed"); volumeStore.setDestroyed(true); _volumeStoreDao.update(volumeStore.getId(), volumeStore); continue; @@ -1815,7 +1883,8 @@ public void handleVolumeSync(DataStore store) { VolumeObject volObj = (VolumeObject)volFactory.getVolume(volume.getId()); volObj.processEvent(Event.OperationFailed); } else if (volumeStore.getDownloadUrl() == null) { - msg = "Volume (" + volume.getUuid() + ") with install path " + volInfo.getInstallPath() + " is corrupted, please check in image store: " + volumeStore.getDataStoreId(); + msg = "Volume (" + volume.getUuid() + ") with install path " + volInfo.getInstallPath() + " is corrupted, please check in image store: " + + volumeStore.getDataStoreId(); s_logger.warn(msg); } else { s_logger.info("Removing volume_store_ref entry for corrupted volume " + volume.getName()); @@ -1845,8 +1914,8 @@ public void handleVolumeSync(DataStore store) { if (volInfo.getSize() > 0) { try { - _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(volume.getAccountId()), - com.cloud.configuration.Resource.ResourceType.secondary_storage, volInfo.getSize() - volInfo.getPhysicalSize()); + _resourceLimitMgr.checkResourceLimit(_accountMgr.getAccount(volume.getAccountId()), com.cloud.configuration.Resource.ResourceType.secondary_storage, + volInfo.getSize() - volInfo.getPhysicalSize()); } catch (ResourceAllocationException e) { s_logger.warn(e.getMessage()); _alertMgr.sendAlert(AlertManager.AlertType.ALERT_TYPE_RESOURCE_LIMIT_EXCEEDED, volume.getDataCenterId(), volume.getPodId(), e.getMessage(), e.getMessage()); @@ -1907,7 +1976,7 @@ public void handleVolumeSync(DataStore store) { } // Delete volumes which are not present on DB. - for (Map.Entry entry : volumeInfos.entrySet()) { + for (Map.Entry entry : volumeInfos.entrySet()) { Long uniqueName = entry.getKey(); TemplateProp tInfo = entry.getValue(); @@ -1973,8 +2042,13 @@ public SnapshotInfo takeSnapshot(VolumeInfo volume) { SnapshotInfo snapshot = null; try { snapshot = snapshotMgr.takeSnapshot(volume); + } catch (CloudRuntimeException cre) { + s_logger.error("Take snapshot: " + volume.getId() + " failed", cre); + throw cre; } catch (Exception e) { - s_logger.debug("Take snapshot: " + volume.getId() + " failed", e); + if (s_logger.isDebugEnabled()) { + s_logger.debug("unknown exception while taking snapshot for volume " + volume.getId() + " was caught", e); + } throw new CloudRuntimeException("Failed to take snapshot", e); } diff --git a/engine/storage/volume/test/resource/testContext.xml b/engine/storage/volume/test/resource/testContext.xml index 67c28faa84bf..da2f5a257792 100644 --- a/engine/storage/volume/test/resource/testContext.xml +++ b/engine/storage/volume/test/resource/testContext.xml @@ -21,13 +21,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> + + 4.0.0 + Apache CloudStack Agent Management Servers Load Balancer + cloud-framework-agent-lb + + cloudstack-framework + org.apache.cloudstack + 4.11.1.0-SNAPSHOT + ../pom.xml + + + diff --git a/framework/agent-lb/src/org/apache/cloudstack/agent/lb/IndirectAgentLB.java b/framework/agent-lb/src/org/apache/cloudstack/agent/lb/IndirectAgentLB.java new file mode 100644 index 000000000000..627a5ee5f50c --- /dev/null +++ b/framework/agent-lb/src/org/apache/cloudstack/agent/lb/IndirectAgentLB.java @@ -0,0 +1,53 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.agent.lb; + +import java.util.List; + +public interface IndirectAgentLB { + + /** + * Return list of management server addresses after applying configured lb algorithm + * for a host in a zone. + * @param hostId host id (if present) + * @param dcId zone id + * @param orderedHostIdList (optional) list of ordered host id list + * @return management servers string list + */ + List getManagementServerList(Long hostId, Long dcId, List orderedHostIdList); + + /** + * Compares received management server list against expected list for a host in a zone. + * @param hostId host id + * @param dcId zone id + * @param receivedMSHosts received management server list + * @return true if mgmtHosts is up to date, false if not + */ + boolean compareManagementServerList(Long hostId, Long dcId, List receivedMSHosts); + + /** + * Returns the configure LB algorithm + * @return returns algorithm name + */ + String getLBAlgorithmName(); + + /** + * Returns the configured LB preferred host check interval (if applicable at cluster scope) + * @return returns interval in seconds + */ + Long getLBPreferredHostCheckInterval(Long clusterId); +} \ No newline at end of file diff --git a/framework/agent-lb/src/org/apache/cloudstack/agent/lb/IndirectAgentLBAlgorithm.java b/framework/agent-lb/src/org/apache/cloudstack/agent/lb/IndirectAgentLBAlgorithm.java new file mode 100644 index 000000000000..a4a622f17ab4 --- /dev/null +++ b/framework/agent-lb/src/org/apache/cloudstack/agent/lb/IndirectAgentLBAlgorithm.java @@ -0,0 +1,45 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.agent.lb; + +import java.util.List; + +public interface IndirectAgentLBAlgorithm { + /** + * Returns a sorted management server list to send to host after applying the algorithm + * @param msList management server list + * @param orderedHostList ordered host list + * @param hostId host id + * @return returns the list of management server addresses which will be sent to host id + */ + List sort(final List msList, final List orderedHostList, final Long hostId); + + /** + * Gets the unique name of the algorithm + * @return returns the name of the Agent MSLB algorithm + */ + String getName(); + + /** + * Compares and return if received mgmt server list is equal to the actual mgmt server lists + * @param msList current mgmt server list + * @param receivedMsList received mgmt server list + * @return true if the lists are equal, false if not + */ + boolean compare(final List msList, final List receivedMsList); +} \ No newline at end of file diff --git a/framework/ca/pom.xml b/framework/ca/pom.xml new file mode 100644 index 000000000000..2e644f163f4e --- /dev/null +++ b/framework/ca/pom.xml @@ -0,0 +1,29 @@ + + + 4.0.0 + cloud-framework-ca + Apache CloudStack Framework - Certificate Authority + + org.apache.cloudstack + cloudstack-framework + 4.11.1.0-SNAPSHOT + ../pom.xml + + diff --git a/framework/ca/src/org/apache/cloudstack/framework/ca/CAProvider.java b/framework/ca/src/org/apache/cloudstack/framework/ca/CAProvider.java new file mode 100644 index 000000000000..388cae7e0074 --- /dev/null +++ b/framework/ca/src/org/apache/cloudstack/framework/ca/CAProvider.java @@ -0,0 +1,107 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.framework.ca; + +import java.io.IOException; +import java.math.BigInteger; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.cert.X509Certificate; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; + +public interface CAProvider { + + /** + * Method returns capability of the plugin to participate in certificate issuance, revocation and provisioning + * @return returns true when CA provider can do certificate lifecycle tasks + */ + boolean canProvisionCertificates(); + + /** + * Returns root CA certificate + * @return returns concatenated root CA certificate string + */ + List getCaCertificate(); + + /** + * Issues certificate with provided options + * @param domainNames + * @param ipAddresses + * @param validityDays + * @return returns issued certificate + */ + Certificate issueCertificate(final List domainNames, final List ipAddresses, final int validityDays); + + /** + * Issues certificate using given CSR and other options + * @param csr + * @param domainNames + * @param ipAddresses + * @param validityDays + * @return returns issued certificate using provided CSR and other options + */ + Certificate issueCertificate(final String csr, final List domainNames, final List ipAddresses, final int validityDays); + + /** + * Revokes certificate using certificate serial and CN + * @param certSerial + * @param certCn + * @return returns true on success + */ + boolean revokeCertificate(final BigInteger certSerial, final String certCn); + + /** + * This method can add/inject custom TrustManagers for client connection validations. + * @param sslContext The SSL context used while accepting a client connection + * @param remoteAddress + * @param certMap + * @return returns created SSL engine instance + * @throws GeneralSecurityException + * @throws IOException + */ + SSLEngine createSSLEngine(final SSLContext sslContext, final String remoteAddress, final Map certMap) throws GeneralSecurityException, IOException; + + /** + * Returns the management server keystore used to connect to peers + * @return returns KeyStore instance + */ + KeyStore getManagementKeyStore() throws KeyStoreException; + + /** + * Returns the keystore passphrase to use + * @return returns char[] passphrase + */ + char[] getKeyStorePassphrase(); + + /** + * Returns the unique name of the provider + * @return returns provider name + */ + String getProviderName(); + + /** + * Returns description about the CA provider plugin + * @return returns description + */ + String getDescription(); +} diff --git a/framework/ca/src/org/apache/cloudstack/framework/ca/CAService.java b/framework/ca/src/org/apache/cloudstack/framework/ca/CAService.java new file mode 100644 index 000000000000..facf13a5cb68 --- /dev/null +++ b/framework/ca/src/org/apache/cloudstack/framework/ca/CAService.java @@ -0,0 +1,50 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.framework.ca; + +import java.io.IOException; +import java.security.GeneralSecurityException; +import java.security.KeyStore; +import java.security.KeyStoreException; + +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; + +public interface CAService { + /** + * Returns a SSLEngine to be used for handling client connections + * @param context + * @param remoteAddress + * @return + * @throws GeneralSecurityException + * @throws IOException + */ + SSLEngine createSSLEngine(final SSLContext context, final String remoteAddress) throws GeneralSecurityException, IOException; + + /** + * Returns the management server keystore used to connect to peers + * @return returns KeyStore instance + */ + KeyStore getManagementKeyStore() throws KeyStoreException; + + /** + * Returns the keystore passphrase to use + * @return returns char[] passphrase + */ + char[] getKeyStorePassphrase(); +} diff --git a/framework/ca/src/org/apache/cloudstack/framework/ca/Certificate.java b/framework/ca/src/org/apache/cloudstack/framework/ca/Certificate.java new file mode 100644 index 000000000000..b3a230d5a992 --- /dev/null +++ b/framework/ca/src/org/apache/cloudstack/framework/ca/Certificate.java @@ -0,0 +1,46 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.framework.ca; + +import java.security.PrivateKey; +import java.security.cert.X509Certificate; +import java.util.List; + +public class Certificate { + private X509Certificate clientCertificate; + private PrivateKey privateKey; + private List caCertificates; + + public Certificate(final X509Certificate clientCertificate, final PrivateKey privateKey, final List caCertificates) { + this.clientCertificate = clientCertificate; + this.privateKey = privateKey; + this.caCertificates = caCertificates; + } + + public X509Certificate getClientCertificate() { + return clientCertificate; + } + + public PrivateKey getPrivateKey() { + return privateKey; + } + + public List getCaCertificates() { + return caCertificates; + } +} diff --git a/framework/cluster/pom.xml b/framework/cluster/pom.xml index c6089b84bc86..49243d19d366 100644 --- a/framework/cluster/pom.xml +++ b/framework/cluster/pom.xml @@ -15,7 +15,7 @@ org.apache.cloudstack cloudstack-framework - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../pom.xml diff --git a/framework/cluster/resources/META-INF/cloudstack/core/spring-framework-cluster-core-context.xml b/framework/cluster/resources/META-INF/cloudstack/core/spring-framework-cluster-core-context.xml index 13353b0ead1d..539c9e9164f9 100644 --- a/framework/cluster/resources/META-INF/cloudstack/core/spring-framework-cluster-core-context.xml +++ b/framework/cluster/resources/META-INF/cloudstack/core/spring-framework-cluster-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java index 2e20f241e01d..d4717cada55d 100644 --- a/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java +++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java @@ -22,7 +22,6 @@ import java.nio.channels.SocketChannel; import java.rmi.RemoteException; import java.sql.Connection; -import java.sql.SQLException; import java.sql.SQLNonTransientException; import java.sql.SQLRecoverableException; import java.util.ArrayList; @@ -546,7 +545,7 @@ protected void runInContext() { profiler.start(); profilerHeartbeatUpdate.start(); - txn.transitToUserManagedConnection(getHeartbeatConnection()); + txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB); if (s_logger.isTraceEnabled()) { s_logger.trace("Cluster manager heartbeat update, id:" + _mshostId); } @@ -597,7 +596,6 @@ protected void runInContext() { invalidHeartbeatConnection(); } } finally { - txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB); txn.close("ClusterHeartbeat"); } } @@ -616,15 +614,6 @@ private boolean isRootCauseConnectionRelated(Throwable e) { return false; } - private Connection getHeartbeatConnection() throws SQLException { - if (_heartbeatConnection == null) { - final Connection conn = TransactionLegacy.getStandaloneConnectionWithException(); - _heartbeatConnection = new ConnectionConcierge("ClusterManagerHeartbeat", conn, false); - } - - return _heartbeatConnection.conn(); - } - private void invalidHeartbeatConnection() { if (_heartbeatConnection != null) { final Connection conn = TransactionLegacy.getStandaloneConnection(); diff --git a/framework/cluster/test/com/cloud/cluster/ClusterServiceServletAdapterTest.java b/framework/cluster/test/com/cloud/cluster/ClusterServiceServletAdapterTest.java index 28dbcaa951a6..91d8b611a0f5 100644 --- a/framework/cluster/test/com/cloud/cluster/ClusterServiceServletAdapterTest.java +++ b/framework/cluster/test/com/cloud/cluster/ClusterServiceServletAdapterTest.java @@ -18,22 +18,31 @@ import static org.junit.Assert.assertTrue; +import org.apache.cloudstack.framework.config.ConfigDepot; import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; +import org.mockito.Mock; import org.mockito.runners.MockitoJUnitRunner; +import com.cloud.cluster.dao.ManagementServerHostDao; import com.cloud.utils.component.ComponentLifecycle; @RunWith(MockitoJUnitRunner.class) public class ClusterServiceServletAdapterTest { + @Mock + private ClusterManager _manager; + @Mock + private ManagementServerHostDao _mshostDao; + @Mock + protected ConfigDepot _configDepot; + ClusterServiceServletAdapter clusterServiceServletAdapter; ClusterManagerImpl clusterManagerImpl; @Before - public void setup() throws IllegalArgumentException, - IllegalAccessException, NoSuchFieldException, SecurityException { + public void setup() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException, SecurityException { clusterServiceServletAdapter = new ClusterServiceServletAdapter(); clusterManagerImpl = new ClusterManagerImpl(); } diff --git a/framework/config/pom.xml b/framework/config/pom.xml index db02bd306a61..1d40e0099e57 100644 --- a/framework/config/pom.xml +++ b/framework/config/pom.xml @@ -15,7 +15,7 @@ org.apache.cloudstack cloudstack-framework - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../pom.xml diff --git a/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context-inheritable.xml b/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context-inheritable.xml index c887531300c5..e176ec5a88b1 100644 --- a/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context-inheritable.xml +++ b/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context-inheritable.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context.xml b/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context.xml index 8d75d27576e0..be116fc5e775 100644 --- a/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context.xml +++ b/framework/config/resources/META-INF/cloudstack/system/spring-framework-config-system-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > { public static enum Scope { - Global, Zone, Cluster, StoragePool, Account, ManagementServer + Global, Zone, Cluster, StoragePool, Account, ManagementServer, ImageStore, Domain } private final String _category; @@ -140,7 +140,8 @@ public boolean isSameKeyAs(Object obj) { public T value() { if (_value == null || isDynamic()) { ConfigurationVO vo = s_depot != null ? s_depot.global().findById(key()) : null; - _value = valueOf((vo != null && vo.getValue() != null) ? vo.getValue() : defaultValue()); + final String value = (vo != null && vo.getValue() != null) ? vo.getValue() : defaultValue(); + _value = ((value == null) ? (T)defaultValue() : valueOf(value)); } return _value; diff --git a/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java b/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java index 4631bb9d0e80..6a85b90b70d3 100644 --- a/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java +++ b/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigDepotImpl.java @@ -84,6 +84,8 @@ public ConfigDepotImpl() { _scopeLevelConfigsMap.put(ConfigKey.Scope.Cluster, new HashSet>()); _scopeLevelConfigsMap.put(ConfigKey.Scope.StoragePool, new HashSet>()); _scopeLevelConfigsMap.put(ConfigKey.Scope.Account, new HashSet>()); + _scopeLevelConfigsMap.put(ConfigKey.Scope.ImageStore, new HashSet>()); + _scopeLevelConfigsMap.put(ConfigKey.Scope.Domain, new HashSet>()); } @Override diff --git a/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigurationVO.java b/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigurationVO.java index b317ea21c51c..7cd9afb83846 100644 --- a/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigurationVO.java +++ b/framework/config/src/org/apache/cloudstack/framework/config/impl/ConfigurationVO.java @@ -122,7 +122,7 @@ public void setName(String name) { @Override public String getValue() { - if(isEncryptedConfig()) { + if(isEncrypted()) { return DBEncryptionUtil.decrypt(value); } else { return value; @@ -130,14 +130,15 @@ public String getValue() { } public void setValue(String value) { - if(isEncryptedConfig()) { + if(isEncrypted()) { this.value = DBEncryptionUtil.encrypt(value); } else { this.value = value; } } - private boolean isEncryptedConfig() { + @Override + public boolean isEncrypted() { return "Hidden".equals(getCategory()) || "Secure".equals(getCategory()); } diff --git a/framework/db/pom.xml b/framework/db/pom.xml index c50d06f2bcb1..44617d45124d 100644 --- a/framework/db/pom.xml +++ b/framework/db/pom.xml @@ -15,14 +15,10 @@ org.apache.cloudstack cloudstack-framework - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../pom.xml - - javax.ejb - ejb-api - net.sf.ehcache ehcache-core diff --git a/framework/db/resources/META-INF/cloudstack/system/spring-framework-db-system-context.xml b/framework/db/resources/META-INF/cloudstack/system/spring-framework-db-system-context.xml index 651b8742a339..f532a5cdc6ca 100644 --- a/framework/db/resources/META-INF/cloudstack/system/spring-framework-db-system-context.xml +++ b/framework/db/resources/META-INF/cloudstack/system/spring-framework-db-system-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/framework/db/src/com/cloud/utils/db/GenericDao.java b/framework/db/src/com/cloud/utils/db/GenericDao.java index 121d65d65011..63047e7c699b 100644 --- a/framework/db/src/com/cloud/utils/db/GenericDao.java +++ b/framework/db/src/com/cloud/utils/db/GenericDao.java @@ -276,4 +276,6 @@ public interface GenericDao { Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, final Filter filter); Map getAllAttributes(); + + Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, final Filter filter, final String[] distinctColumns); } diff --git a/framework/db/src/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/com/cloud/utils/db/GenericDaoBase.java index c5a4cd85dd81..304a122a0b73 100644 --- a/framework/db/src/com/cloud/utils/db/GenericDaoBase.java +++ b/framework/db/src/com/cloud/utils/db/GenericDaoBase.java @@ -44,7 +44,7 @@ import java.util.TimeZone; import java.util.UUID; import java.util.concurrent.ConcurrentHashMap; - +import com.google.common.base.Strings; import javax.naming.ConfigurationException; import javax.persistence.AttributeOverride; import javax.persistence.Column; @@ -1326,6 +1326,14 @@ public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, return new Pair, Integer>(objects, count); } + @Override + @DB() + public Pair, Integer> searchAndDistinctCount(final SearchCriteria sc, final Filter filter, final String[] distinctColumns) { + List objects = search(sc, filter, null, false); + Integer count = getDistinctCount(sc, distinctColumns); + return new Pair, Integer>(objects, count); + } + @Override @DB() public List search(final SearchCriteria sc, final Filter filter, final boolean enableQueryCache) { @@ -1927,6 +1935,52 @@ public Integer getDistinctCount(SearchCriteria sc) { } } + public Integer getDistinctCount(SearchCriteria sc, String[] distinctColumns) { + String clause = sc != null ? sc.getWhereClause() : null; + if (Strings.isNullOrEmpty(clause)) { + clause = null; + } + + final StringBuilder str = createDistinctSelect(sc, clause != null, distinctColumns); + if (clause != null) { + str.append(clause); + } + + Collection>> joins = null; + if (sc != null) { + joins = sc.getJoins(); + if (joins != null) { + addJoins(str, joins); + } + } + + final TransactionLegacy txn = TransactionLegacy.currentTxn(); + final String sql = "SELECT COUNT(*) FROM (" + str.toString() + ") AS tmp"; + + try (PreparedStatement pstmt = txn.prepareAutoCloseStatement(sql)) { + int i = 1; + if (clause != null) { + for (final Pair value : sc.getValues()) { + prepareAttribute(i++, pstmt, value.first(), value.second()); + } + } + + if (joins != null) { + i = addJoinAttributes(i, pstmt, joins); + } + + final ResultSet rs = pstmt.executeQuery(); + while (rs.next()) { + return rs.getInt(1); + } + return 0; + } catch (final SQLException e) { + throw new CloudRuntimeException("DB Exception in executing: " + sql, e); + } catch (final Throwable e) { + throw new CloudRuntimeException("Caught exception in : " + sql, e); + } + } + public Integer getCount(SearchCriteria sc) { String clause = sc != null ? sc.getWhereClause() : null; if (clause != null && clause.length() == 0) { @@ -2013,4 +2067,18 @@ protected Pair, Integer> listAndCountIncludingRemovedBy(final SearchCrit Integer count = getCount(sc); return new Pair, Integer>(objects, count); } + + @DB() + protected StringBuilder createDistinctSelect(SearchCriteria sc, final boolean whereClause, String[] distinctColumns) { + final SqlGenerator generator = new SqlGenerator(_entityBeanType); + String distinctSql = generator.buildDistinctSql(distinctColumns); + + StringBuilder sql = new StringBuilder(distinctSql); + + if (!whereClause) { + sql.delete(sql.length() - (_discriminatorClause == null ? 6 : 4), sql.length()); + } + + return sql; + } } diff --git a/framework/db/src/com/cloud/utils/db/GroupBy.java b/framework/db/src/com/cloud/utils/db/GroupBy.java index 00c0acbe48ba..60b59baef962 100644 --- a/framework/db/src/com/cloud/utils/db/GroupBy.java +++ b/framework/db/src/com/cloud/utils/db/GroupBy.java @@ -54,12 +54,9 @@ public GroupBy group(final Func func, final Object useless) { return this; } - public J having(final Func func, final Object obj, final Op op, final Object value) { + public J having(final Func func, final Attribute obj, final Op op) { assert (_having == null) : "You can only specify one having in a group by"; - final List attrs = _builder.getSpecifiedAttributes(); - assert attrs.size() == 1 : "You didn't specified an attribute"; - - _having = new Having(func, attrs.get(0), op, value); + _having = new Having(func, obj, op); _builder.getSpecifiedAttributes().clear(); return _builder; } @@ -88,13 +85,11 @@ protected class Having { public Func func; public Attribute attr; public Op op; - public Object value; - public Having(final Func func, final Attribute attr, final Op op, final Object value) { + public Having(final Func func, final Attribute attr, final Op op) { this.func = func; this.attr = attr; this.op = op; - this.value = value; } public void toSql(final StringBuilder builder) { diff --git a/framework/db/src/com/cloud/utils/db/SqlGenerator.java b/framework/db/src/com/cloud/utils/db/SqlGenerator.java index e6cb9cb88970..516849650f12 100644 --- a/framework/db/src/com/cloud/utils/db/SqlGenerator.java +++ b/framework/db/src/com/cloud/utils/db/SqlGenerator.java @@ -680,4 +680,20 @@ public String buildDistinctIdSql() { return sql.append("SELECT DISTINCT id FROM ").append(buildTableReferences()).append(" WHERE ").append(buildDiscriminatorClause().first()).toString(); } + + public String buildDistinctSql(String[] distinctColumnNames) { + StringBuilder sbColumn = new StringBuilder(); + + if (distinctColumnNames != null && distinctColumnNames.length > 0) { + for (String columnName : distinctColumnNames) { + sbColumn.append(columnName).append(", "); + } + sbColumn.delete(sbColumn.length() - 2, sbColumn.length()); + } else { + sbColumn.append("*"); + } + + StringBuilder sql = new StringBuilder(); + return sql.append("SELECT DISTINCT " + sbColumn.toString() + " FROM ").append(buildTableReferences()).append(" WHERE ").append(buildDiscriminatorClause().first()).toString(); + } } diff --git a/framework/db/test/com/cloud/utils/db/GroupByTest.java b/framework/db/test/com/cloud/utils/db/GroupByTest.java index d394c73c3fa9..f508746df367 100644 --- a/framework/db/test/com/cloud/utils/db/GroupByTest.java +++ b/framework/db/test/com/cloud/utils/db/GroupByTest.java @@ -21,6 +21,8 @@ import static org.junit.Assert.assertTrue; import java.util.ArrayList; +import java.util.Collection; +import java.util.List; import org.junit.Test; @@ -32,6 +34,10 @@ public class GroupByTest { protected static final String EXPECTED_QUERY = "BASE GROUP BY FIRST(TEST_TABLE.TEST_COLUMN), MAX(TEST_TABLE.TEST_COLUMN) HAVING COUNT(TEST_TABLE2.TEST_COLUMN2) > ? "; + protected static final DbTestDao dao = new DbTestDao(); + protected static final String EXPECTED_QUERY_2 = "TEST GROUP BY test.fld_int HAVING SUM(test.fld_long) > ? "; + protected static final String FULL_EXPECTED_QUERY_2 = "SELECT test.fld_string FROM test WHERE test.fld_string = ? GROUP BY test.fld_int HAVING SUM(test.fld_long) > ? "; + @Test public void testToSql() { // Prepare @@ -39,12 +45,13 @@ public void testToSql() { final GroupByExtension groupBy = new GroupByExtension(new SearchBaseExtension(String.class, String.class)); final Attribute att = new Attribute("TEST_TABLE", "TEST_COLUMN"); - final Pair pair1 = new Pair(SearchCriteria.Func.FIRST, att); - final Pair pair2 = new Pair(SearchCriteria.Func.MAX, att); - groupBy._groupBys = new ArrayList>(); + final Attribute att2 = new Attribute("TEST_TABLE2", "TEST_COLUMN2"); + final Pair pair1 = new Pair<>(SearchCriteria.Func.FIRST, att); + final Pair pair2 = new Pair<>(SearchCriteria.Func.MAX, att); + groupBy._groupBys = new ArrayList<>(); groupBy._groupBys.add(pair1); groupBy._groupBys.add(pair2); - groupBy.having(SearchCriteria.Func.COUNT, att, Op.GT, "SOME_VALUE"); + groupBy.having(SearchCriteria.Func.COUNT, att2, Op.GT); // Execute groupBy.toSql(sb); @@ -52,6 +59,45 @@ public void testToSql() { // Assert assertTrue("It didn't create the expected SQL query.", sb.toString().equals(EXPECTED_QUERY)); } + + @Test + public void testToSqlWithDao() { + StringBuilder sb = new StringBuilder("TEST"); + SearchBuilder searchBuilder = dao.createSearchBuilder(); + searchBuilder.selectFields(searchBuilder.entity().getFieldString()); + searchBuilder.and("st", searchBuilder.entity().getFieldString(), SearchCriteria.Op.EQ); + GroupBy groupBy = searchBuilder.groupBy(searchBuilder.entity().getFieldInt()); + groupBy.having(SearchCriteria.Func.SUM, dao.getAllAttributes().get("fieldLong"), SearchCriteria.Op.GT); + groupBy.toSql(sb); + assertTrue("It didn't create the expected SQL query.", sb.toString().equals(EXPECTED_QUERY_2)); + + searchBuilder.done(); + SearchCriteria sc = searchBuilder.create(); + sc.setGroupByValues(0); + sc.setParameters("st", "SOMETHING"); + + String clause = sc.getWhereClause(); + if (clause != null && clause.length() == 0) { + clause = null; + } + + final StringBuilder str = dao.createPartialSelectSql(sc, clause != null); + if (clause != null) { + str.append(clause); + } + + Collection>> joins; + joins = sc.getJoins(); + if (joins != null) { + dao.addJoins(str, joins); + } + + List groupByValues = dao.addGroupBy(str, sc); + + assertTrue("It didn't create the expected SQL query.", str.toString().equals(FULL_EXPECTED_QUERY_2)); + assertTrue("Incorrect group by parameter list", groupByValues.size() == 1); + } + } class GroupByExtension extends GroupBy { @@ -66,13 +112,11 @@ protected void init(final SearchBaseExtension builder) { } } -@SuppressWarnings({"rawtypes", "unchecked"}) class SearchBaseExtension extends SearchBase{ SearchBaseExtension(final Class entityType, final Class resultType) { super(entityType, resultType); - _specifiedAttrs = new ArrayList(); - _specifiedAttrs.add(new Attribute("TEST_TABLE2", "TEST_COLUMN2")); + _specifiedAttrs = new ArrayList<>(); } @Override diff --git a/framework/db/test/com/cloud/utils/db/TransactionTest.java b/framework/db/test/com/cloud/utils/db/TransactionTest.java deleted file mode 100644 index fed663285d1b..000000000000 --- a/framework/db/test/com/cloud/utils/db/TransactionTest.java +++ /dev/null @@ -1,166 +0,0 @@ -// Licensed to the Apache Software Foundation (ASF) under one -// or more contributor license agreements. See the NOTICE file -// distributed with this work for additional information -// regarding copyright ownership. The ASF licenses this file -// to you under the Apache License, Version 2.0 (the -// "License"); you may not use this file except in compliance -// the License. You may obtain a copy of the License at -// -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, -// software distributed under the License is distributed on an -// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -// KIND, either express or implied. See the License for the -// specific language governing permissions and limitations -// under the License. -package com.cloud.utils.db; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; - -import org.junit.After; -import org.junit.AfterClass; -import org.junit.Assert; -import org.junit.BeforeClass; -import org.junit.Test; - -import com.cloud.utils.component.ComponentContext; -import com.cloud.utils.exception.CloudRuntimeException; - -/** - * A test fixture to test APIs or bugs found for Transaction class. This test fixture will do one time setup before - * all its testcases to set up a test db table, and then tear down these test db artifacts after all testcases are run. - * - */ -public class TransactionTest { - - @BeforeClass - public static void oneTimeSetup() { - try ( - Connection conn = TransactionLegacy.getStandaloneConnection(); - PreparedStatement pstmt = - conn.prepareStatement("CREATE TABLE `cloud`.`test` (" + "`id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT," + "`fld_int` int unsigned," - + "`fld_long` bigint unsigned," + "`fld_string` varchar(255)," + "PRIMARY KEY (`id`)" + ") ENGINE=InnoDB DEFAULT CHARSET=utf8;"); - ) { - - pstmt.execute(); - - } catch (SQLException e) { - throw new CloudRuntimeException("Problem with sql", e); - } - } - - @Test - /** - * When a transaction is set to use user-managed db connection, for each following db statement, we should see - * that the same db connection is reused rather than acquiring a new one each time in typical transaction model. - */ - public void testUserManagedConnection() { - DbTestDao testDao = ComponentContext.inject(DbTestDao.class); - TransactionLegacy txn = TransactionLegacy.open("SingleConnectionThread"); - Connection conn = null; - try { - conn = TransactionLegacy.getStandaloneConnectionWithException(); - txn.transitToUserManagedConnection(conn); - // try two SQLs to make sure that they are using the same connection - // acquired above. - testDao.create(1, 1, "Record 1"); - Connection checkConn = TransactionLegacy.currentTxn().getConnection(); - if (checkConn != conn) { - Assert.fail("A new db connection is acquired instead of using old one after create sql"); - } - testDao.update(2, 2, "Record 1"); - Connection checkConn2 = TransactionLegacy.currentTxn().getConnection(); - if (checkConn2 != conn) { - Assert.fail("A new db connection is acquired instead of using old one after update sql"); - } - } catch (SQLException e) { - Assert.fail(e.getMessage()); - } finally { - txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB); - txn.close(); - - if (conn != null) { - try { - conn.close(); - } catch (SQLException e) { - throw new CloudRuntimeException("Problem with close db connection", e); - } - } - } - } - - @Test - /** - * This test is simulating ClusterHeartBeat process, where the same transaction and db connection is reused. - */ - public void testTransactionReuse() { - DbTestDao testDao = ComponentContext.inject(DbTestDao.class); - // acquire a db connection and keep it - Connection conn = null; - try { - conn = TransactionLegacy.getStandaloneConnectionWithException(); - } catch (SQLException ex) { - throw new CloudRuntimeException("Problem with getting db connection", ex); - } - - // start heartbeat loop, make sure that each loop still use the same - // connection - TransactionLegacy txn = null; - for (int i = 0; i < 3; i++) { - txn = TransactionLegacy.open("HeartbeatSimulator"); - try { - - txn.transitToUserManagedConnection(conn); - testDao.create(i, i, "Record " + i); - Connection checkConn = TransactionLegacy.currentTxn().getConnection(); - if (checkConn != conn) { - Assert.fail("A new db connection is acquired instead of using old one in loop " + i); - } - } catch (SQLException e) { - Assert.fail(e.getMessage()); - } finally { - txn.transitToAutoManagedConnection(TransactionLegacy.CLOUD_DB); - txn.close(); - } - } - // close the connection once we are done since we are managing db - // connection ourselves. - if (conn != null) { - try { - conn.close(); - } catch (SQLException e) { - throw new CloudRuntimeException("Problem with close db connection", e); - } - } - } - - @After - /** - * Delete all records after each test, but table is still kept - */ - public void tearDown() { - try ( - Connection conn = TransactionLegacy.getStandaloneConnection(); - PreparedStatement pstmt = conn.prepareStatement("truncate table `cloud`.`test`"); - ) { - pstmt.execute(); - } catch (SQLException e) { - throw new CloudRuntimeException("Problem with sql", e); - } - } - - @AfterClass - public static void oneTimeTearDown() { - try ( - Connection conn = TransactionLegacy.getStandaloneConnection(); - PreparedStatement pstmt = conn.prepareStatement("DROP TABLE IF EXISTS `cloud`.`test`"); - ) { - pstmt.execute(); - } catch (SQLException e) { - throw new CloudRuntimeException("Problem with sql", e); - } - } -} diff --git a/framework/direct-download/pom.xml b/framework/direct-download/pom.xml new file mode 100644 index 000000000000..fa23615c35c5 --- /dev/null +++ b/framework/direct-download/pom.xml @@ -0,0 +1,31 @@ + + + 4.0.0 + cloud-framework-direct-download + Apache CloudStack Framework - Direct Download to Primary Storage + + cloudstack-framework + org.apache.cloudstack + 4.11.1.0-SNAPSHOT + ../pom.xml + + \ No newline at end of file diff --git a/framework/direct-download/src/org/apache/cloudstack/framework/agent/direct/download/DirectDownloadService.java b/framework/direct-download/src/org/apache/cloudstack/framework/agent/direct/download/DirectDownloadService.java new file mode 100644 index 000000000000..f3153e3470e9 --- /dev/null +++ b/framework/direct-download/src/org/apache/cloudstack/framework/agent/direct/download/DirectDownloadService.java @@ -0,0 +1,31 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.framework.agent.direct.download; + +public interface DirectDownloadService { + + /** + * Download template/ISO into poolId bypassing secondary storage. Download performed by hostId + */ + void downloadTemplate(long templateId, long poolId, long hostId); + + /** + * Upload client certificate to each running host + */ + boolean uploadCertificateToHosts(String certificateCer, String certificateName, String hypervisor); +} diff --git a/framework/events/pom.xml b/framework/events/pom.xml index 378576137032..befbe9f5b5ea 100644 --- a/framework/events/pom.xml +++ b/framework/events/pom.xml @@ -15,7 +15,7 @@ org.apache.cloudstack cloudstack-framework - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../pom.xml diff --git a/framework/ipc/pom.xml b/framework/ipc/pom.xml index 14e083170875..c9b29723b359 100644 --- a/framework/ipc/pom.xml +++ b/framework/ipc/pom.xml @@ -16,7 +16,7 @@ org.apache.cloudstack cloudstack-framework - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../pom.xml diff --git a/framework/ipc/resources/META-INF/cloudstack/core/spring-framework-ipc-core-context.xml b/framework/ipc/resources/META-INF/cloudstack/core/spring-framework-ipc-core-context.xml index effa23efded8..15b6f802627d 100644 --- a/framework/ipc/resources/META-INF/cloudstack/core/spring-framework-ipc-core-context.xml +++ b/framework/ipc/resources/META-INF/cloudstack/core/spring-framework-ipc-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/centos7/tomcat7/server.xml b/packaging/centos7/tomcat7/server.xml deleted file mode 100644 index 124ff63bc7f2..000000000000 --- a/packaging/centos7/tomcat7/server.xml +++ /dev/null @@ -1,80 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/packaging/centos7/tomcat7/tomcat-users.xml b/packaging/centos7/tomcat7/tomcat-users.xml deleted file mode 100644 index 81422a02892e..000000000000 --- a/packaging/centos7/tomcat7/tomcat-users.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - - - - - - - diff --git a/packaging/centos7/tomcat7/web.xml b/packaging/centos7/tomcat7/web.xml deleted file mode 100644 index 44b6eab07fe4..000000000000 --- a/packaging/centos7/tomcat7/web.xml +++ /dev/null @@ -1,1188 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - org.apache.catalina.servlets.DefaultServlet - - debug - 0 - - - listings - false - - 1 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - jsp - org.apache.jasper.servlet.JspServlet - - fork - false - - - xpoweredBy - false - - 3 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - default - / - - - - - - - - jsp - *.jsp - - - - jsp - *.jspx - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 30 - - - - - - - - - - - - abs - audio/x-mpeg - - - ai - application/postscript - - - aif - audio/x-aiff - - - aifc - audio/x-aiff - - - aiff - audio/x-aiff - - - aim - application/x-aim - - - art - image/x-jg - - - asf - video/x-ms-asf - - - asx - video/x-ms-asf - - - au - audio/basic - - - avi - video/x-msvideo - - - avx - video/x-rad-screenplay - - - bcpio - application/x-bcpio - - - bin - application/octet-stream - - - bmp - image/bmp - - - body - text/html - - - cdf - application/x-cdf - - - cer - application/x-x509-ca-cert - - - class - application/java - - - cpio - application/x-cpio - - - csh - application/x-csh - - - css - text/css - - - dib - image/bmp - - - doc - application/msword - - - dtd - application/xml-dtd - - - dv - video/x-dv - - - dvi - application/x-dvi - - - eps - application/postscript - - - etx - text/x-setext - - - exe - application/octet-stream - - - gif - image/gif - - - gtar - application/x-gtar - - - gz - application/x-gzip - - - hdf - application/x-hdf - - - hqx - application/mac-binhex40 - - - htc - text/x-component - - - htm - text/html - - - html - text/html - - - hqx - application/mac-binhex40 - - - ief - image/ief - - - jad - text/vnd.sun.j2me.app-descriptor - - - jar - application/java-archive - - - java - text/plain - - - jnlp - application/x-java-jnlp-file - - - jpe - image/jpeg - - - jpeg - image/jpeg - - - jpg - image/jpeg - - - js - text/javascript - - - jsf - text/plain - - - jspf - text/plain - - - kar - audio/x-midi - - - latex - application/x-latex - - - m3u - audio/x-mpegurl - - - mac - image/x-macpaint - - - man - application/x-troff-man - - - mathml - application/mathml+xml - - - me - application/x-troff-me - - - mid - audio/x-midi - - - midi - audio/x-midi - - - mif - application/x-mif - - - mov - video/quicktime - - - movie - video/x-sgi-movie - - - mp1 - audio/x-mpeg - - - mp2 - audio/x-mpeg - - - mp3 - audio/x-mpeg - - - mp4 - video/mp4 - - - mpa - audio/x-mpeg - - - mpe - video/mpeg - - - mpeg - video/mpeg - - - mpega - audio/x-mpeg - - - mpg - video/mpeg - - - mpv2 - video/mpeg2 - - - ms - application/x-wais-source - - - nc - application/x-netcdf - - - oda - application/oda - - - - odb - application/vnd.oasis.opendocument.database - - - - odc - application/vnd.oasis.opendocument.chart - - - - odf - application/vnd.oasis.opendocument.formula - - - - odg - application/vnd.oasis.opendocument.graphics - - - - odi - application/vnd.oasis.opendocument.image - - - - odm - application/vnd.oasis.opendocument.text-master - - - - odp - application/vnd.oasis.opendocument.presentation - - - - ods - application/vnd.oasis.opendocument.spreadsheet - - - - odt - application/vnd.oasis.opendocument.text - - - ogg - application/ogg - - - - otg - application/vnd.oasis.opendocument.graphics-template - - - - oth - application/vnd.oasis.opendocument.text-web - - - - otp - application/vnd.oasis.opendocument.presentation-template - - - - ots - application/vnd.oasis.opendocument.spreadsheet-template - - - - ott - application/vnd.oasis.opendocument.text-template - - - pbm - image/x-portable-bitmap - - - pct - image/pict - - - pdf - application/pdf - - - pgm - image/x-portable-graymap - - - pic - image/pict - - - pict - image/pict - - - pls - audio/x-scpls - - - png - image/png - - - pnm - image/x-portable-anymap - - - pnt - image/x-macpaint - - - ppm - image/x-portable-pixmap - - - ppt - application/vnd.ms-powerpoint - - - pps - application/vnd.ms-powerpoint - - - ps - application/postscript - - - psd - image/x-photoshop - - - qt - video/quicktime - - - qti - image/x-quicktime - - - qtif - image/x-quicktime - - - ras - image/x-cmu-raster - - - rdf - application/rdf+xml - - - rgb - image/x-rgb - - - rm - application/vnd.rn-realmedia - - - roff - application/x-troff - - - rtf - application/rtf - - - rtx - text/richtext - - - sh - application/x-sh - - - shar - application/x-shar - - - - smf - audio/x-midi - - - sit - application/x-stuffit - - - snd - audio/basic - - - src - application/x-wais-source - - - sv4cpio - application/x-sv4cpio - - - sv4crc - application/x-sv4crc - - - svg - image/svg+xml - - - svgz - image/svg+xml - - - swf - application/x-shockwave-flash - - - t - application/x-troff - - - tar - application/x-tar - - - tcl - application/x-tcl - - - tex - application/x-tex - - - texi - application/x-texinfo - - - texinfo - application/x-texinfo - - - tif - image/tiff - - - tiff - image/tiff - - - tr - application/x-troff - - - tsv - text/tab-separated-values - - - txt - text/plain - - - ulw - audio/basic - - - ustar - application/x-ustar - - - vxml - application/voicexml+xml - - - xbm - image/x-xbitmap - - - xht - application/xhtml+xml - - - xhtml - application/xhtml+xml - - - xls - application/vnd.ms-excel - - - xml - application/xml - - - xpm - image/x-xpixmap - - - xsl - application/xml - - - xslt - application/xslt+xml - - - xul - application/vnd.mozilla.xul+xml - - - xwd - image/x-xwindowdump - - - vsd - application/x-visio - - - wav - audio/x-wav - - - - wbmp - image/vnd.wap.wbmp - - - - wml - text/vnd.wap.wml - - - - wmlc - application/vnd.wap.wmlc - - - - wmls - text/vnd.wap.wmlscript - - - - wmlscriptc - application/vnd.wap.wmlscriptc - - - wmv - video/x-ms-wmv - - - wrl - x-world/x-vrml - - - wspolicy - application/wspolicy+xml - - - Z - application/x-compress - - - z - application/x-compress - - - zip - application/zip - - - - - - - - - - - - - - - - index.html - index.htm - index.jsp - - - diff --git a/packaging/debian/cloudstack-agent.init b/packaging/debian/cloudstack-agent.init index 0cae5f55a3cf..26107792a6ba 100755 --- a/packaging/debian/cloudstack-agent.init +++ b/packaging/debian/cloudstack-agent.init @@ -50,7 +50,7 @@ unset OPTIONS mkdir -m 0755 -p "$TMP" # The first existing directory is used for JAVA_HOME (if JAVA_HOME is not defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/java-7-openjdk-amd64 /usr/lib/jvm/java-7-openjdk-i386 /usr/lib/jvm/java-7-oracle /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-openjdk-i386 /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-6-sun" +JDK_DIRS="/usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-8-openjdk-i386 /usr/lib/jvm/java-8-oracle" for jdir in $JDK_DIRS; do if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then diff --git a/packaging/debian/cloudstack-usage.init b/packaging/debian/cloudstack-usage.init index e6129c26b6c0..05174504befb 100755 --- a/packaging/debian/cloudstack-usage.init +++ b/packaging/debian/cloudstack-usage.init @@ -64,7 +64,7 @@ setJavaHome() { # If everything has failed, try hardcoded paths # The first existing directory is used for JAVA_HOME (if JAVA_HOME is not defined in $DEFAULT) - JDK_DIRS="/usr/lib/jvm/java-7-openjdk-amd64 /usr/lib/jvm/java-7-openjdk-i386 /usr/lib/jvm/java-7-oracle /usr/lib/jvm/java-7-openjdk /usr/lib/jvm/java-7-sun" + JDK_DIRS="/usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-8-openjdk-i386 /usr/lib/jvm/java-8-oracle /usr/lib/jvm/java-8-openjdk" for jdir in $JDK_DIRS; do if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then JAVA_HOME="$jdir" diff --git a/packaging/debian/init/cloud-management b/packaging/debian/init/cloud-management index 90052c9bb158..580f683b8293 100755 --- a/packaging/debian/init/cloud-management +++ b/packaging/debian/init/cloud-management @@ -1,6 +1,6 @@ #!/bin/sh # -# /etc/init.d/tomcat6 -- startup script for the Tomcat 6 servlet engine +# /etc/init.d/cloudstack-management -- startup script for CloudStack # Licensed to the Apache Software Foundation (ASF) under one # or more contributor license agreements. See the NOTICE file @@ -26,17 +26,18 @@ # Should-Stop: $named # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 -# Short-Description: Start Tomcat (CloudStack). -# Description: Start the Tomcat servlet engine that runs the CloudStack Management Server. +# Short-Description: Start CloudStack. +# Description: Start the CloudStack Management Server. ### END INIT INFO PATH=/bin:/usr/bin:/sbin:/usr/sbin NAME=cloudstack-management -DESC="CloudStack-specific Tomcat servlet engine" +DESC="CloudStack Management Server" DAEMON=/usr/bin/jsvc -CATALINA_HOME=/usr/share/cloudstack-management -DEFAULT=/etc/cloudstack/management/tomcat6.conf -JVM_TMP=/tmp/$NAME-temp +DEFAULT=/etc/default/$NAME +USER="cloud" +GROUP="cloud" +CLOUDSTACK_PID="/var/run/$NAME.pid" # We have to explicitly set the HOME variable to the homedir from the user "cloud" # This is because various scripts run by the management server read the HOME variable @@ -47,8 +48,7 @@ if [ `id -u` -ne 0 ]; then echo "You need root privileges to run this script" exit 1 fi - -# Make sure tomcat is started with system locale + if [ -r /etc/default/locale ]; then . /etc/default/locale export LANG @@ -57,76 +57,28 @@ fi . /lib/lsb/init-functions . /etc/default/rcS - -# The following variables can be overwritten in $DEFAULT - -# Run Tomcat 6 as this user ID -TOMCAT6_USER=tomcat6 - # The first existing directory is used for JAVA_HOME (if JAVA_HOME is not # defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/java-7-openjdk-amd64 /usr/lib/jvm/java-7-openjdk-i386 /usr/lib/jvm/java-7-oracle /usr/lib/jvm/java-7-openjdk /usr/lib/jvm/java-7-sun" +JDK_DIRS="/usr/lib/jvm/java-8-openjdk-amd64 /usr/lib/jvm/java-8-openjdk-i386 /usr/lib/jvm/java-8-oracle /usr/lib/jvm/java-8-openjdk" # Look for the right JVM to use for jdir in $JDK_DIRS; do if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME="$jdir" + JAVA_HOME="$jdir" fi done export JAVA_HOME -# Directory for per-instance configuration files and webapps -CATALINA_BASE=/usr/share/cloudstack-management - -# Use the Java security manager? (yes/no) -TOMCAT6_SECURITY=no - -# Default Java options -# Set java.awt.headless=true if JAVA_OPTS is not set so the -# Xalan XSL transformer can work without X11 display on JDK 1.4+ -# It also looks like the default heap size of 64M is not enough for most cases -# so the maximum heap size is set to 128M -if [ -z "$JAVA_OPTS" ]; then - JAVA_OPTS="-Djava.awt.headless=true -Xmx128M" -fi - -# End of variables that can be overwritten in $DEFAULT - # overwrite settings from default file if [ -f "$DEFAULT" ]; then . "$DEFAULT" fi -if [ ! -f "$CATALINA_HOME/bin/bootstrap.jar" ]; then - log_failure_msg "$NAME is not installed" - exit 1 -fi +JARS=$(ls /usr/share/cloudstack-management/lib/*.jar | tr '\n' ':' | sed s'/.$//') +CLASSPATH="$JARS:$CLASSPATH" [ -f "$DAEMON" ] || exit 0 -POLICY_CACHE="$CATALINA_BASE/work/catalina.policy" - -JAVA_OPTS="$JAVA_OPTS -Djava.endorsed.dirs=$CATALINA_HOME/endorsed -Dcatalina.base=$CATALINA_BASE -Dcatalina.home=$CATALINA_HOME -Djava.io.tmpdir=$JVM_TMP" - -# Set the JSP compiler if set in the tomcat6.default file -if [ -n "$JSP_COMPILER" ]; then - JAVA_OPTS="$JAVA_OPTS -Dbuild.compiler=$JSP_COMPILER" -fi - -if [ "$TOMCAT6_SECURITY" = "yes" ]; then - JAVA_OPTS="$JAVA_OPTS -Djava.security.manager -Djava.security.policy=$POLICY_CACHE" -fi - -# Set juli LogManager if logging.properties is provided -if [ -r "$CATALINA_BASE"/conf/logging.properties ]; then - JAVA_OPTS="$JAVA_OPTS "-Djava.util.logging.manager=org.apache.juli.ClassLoaderLogManager" "-Djava.util.logging.config.file="$CATALINA_BASE/conf/logging.properties" -fi - -# Define other required variables -CATALINA_PID="/var/run/$NAME.pid" -BOOTSTRAP_CLASS=org.apache.catalina.startup.Bootstrap -JSVC_CLASSPATH="/usr/share/java/commons-daemon.jar:$CATALINA_HOME/bin/bootstrap.jar:/etc/cloudstack/management:/usr/share/cloudstack-management/setup" - # Look for Java Secure Sockets Extension (JSSE) JARs if [ -z "${JSSE_HOME}" -a -r "${JAVA_HOME}/jre/lib/jsse.jar" ]; then JSSE_HOME="${JAVA_HOME}/jre/" @@ -140,74 +92,36 @@ case "$1" in exit 1 fi - if [ ! -d "$CATALINA_BASE/conf" ]; then - log_failure_msg "invalid CATALINA_BASE: $CATALINA_BASE" - exit 1 - fi - log_daemon_msg "Starting $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - - # Regenerate POLICY_CACHE file - umask 022 - echo "// AUTO-GENERATED FILE from /etc/tomcat6/policy.d/" \ - > "$POLICY_CACHE" - echo "" >> "$POLICY_CACHE" - if ls $CATALINA_BASE/conf/policy.d/*.policy > /dev/null 2>&1 ; then - cat $CATALINA_BASE/conf/policy.d/*.policy \ - >> "$POLICY_CACHE" - fi - - # Remove / recreate JVM_TMP directory - rm -rf "$JVM_TMP" - mkdir "$JVM_TMP" || { - log_failure_msg "could not create JVM temporary directory" - exit 1 - } - chown $TOMCAT6_USER "$JVM_TMP" - cd "$JVM_TMP" - + if start-stop-daemon --test --start --quiet --pidfile "$CLOUDSTACK_PID" \ + --user $USER --startas "$JAVA_HOME/bin/java"; then # fix storage issues on nfs mounts umask 000 - $DAEMON -user "$TOMCAT6_USER" -cp "$JSVC_CLASSPATH" \ - -outfile SYSLOG -errfile SYSLOG \ - -pidfile "$CATALINA_PID" $JAVA_OPTS "$BOOTSTRAP_CLASS" - - sleep 5 - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_end_msg 1 - else - log_end_msg 0 - fi + start-stop-daemon --start --quiet --pidfile "$CLOUDSTACK_PID" \ + --user $USER --group $GROUP --exec $DAEMON -- -user "$USER" -server \ + -home "$JAVA_HOME" -cp "$CLASSPATH" \ + -outfile SYSLOG -errfile $LOGDIR/$NAME.err \ + -pidfile "$CLOUDSTACK_PID" $JAVA_OPTS "$BOOTSTRAP_CLASS" + log_end_msg $? else - log_progress_msg "(already running)" + log_progress_msg "(already running)" log_end_msg 0 fi ;; stop) log_daemon_msg "Stopping $DESC" "$NAME" - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user "$TOMCAT6_USER" --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - log_progress_msg "(not running)" - else - $DAEMON -cp "$JSVC_CLASSPATH" -pidfile "$CATALINA_PID" \ - -stop "$BOOTSTRAP_CLASS" - fi - rm -rf "$JVM_TMP" + start-stop-daemon --stop --quiet --retry=TERM/30/KILL/5 --pidfile "$CLOUDSTACK_PID" + RETVAL="$?" + [ "$RETVAL" = 2 ] && return 2 log_end_msg 0 ;; status) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ + if start-stop-daemon --test --start --pidfile "$CLOUDSTACK_PID" \ + --user $USER --startas "$JAVA_HOME/bin/java" \ >/dev/null; then - if [ -f "$CATALINA_PID" ]; then + if [ -f "$CLOUDSTACK_PID" ]; then log_success_msg "$DESC is not running, but pid file exists." exit 1 else @@ -215,25 +129,18 @@ case "$1" in exit 3 fi else - log_success_msg "$DESC is running with pid `cat $CATALINA_PID`" + log_success_msg "$DESC is running with pid `cat $CLOUDSTACK_PID`" fi ;; restart|force-reload) - if start-stop-daemon --test --stop --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ + if start-stop-daemon --test --stop --pidfile "$CLOUDSTACK_PID" \ + --user $USER --startas "$JAVA_HOME/bin/java" \ >/dev/null; then $0 stop sleep 1 fi $0 start ;; - try-restart) - if start-stop-daemon --test --start --pidfile "$CATALINA_PID" \ - --user $TOMCAT6_USER --startas "$JAVA_HOME/bin/java" \ - >/dev/null; then - $0 start - fi - ;; *) log_success_msg "Usage: $0 {start|stop|restart|try-restart|force-reload|status}" exit 1 diff --git a/packaging/debian/replace.properties b/packaging/debian/replace.properties index e1d28bb95493..258cb844318f 100644 --- a/packaging/debian/replace.properties +++ b/packaging/debian/replace.properties @@ -32,7 +32,7 @@ APISERVERLOG=/var/log/cloudstack/management/apilog.log BINDIR=/usr/bin COMMONLIBDIR=/usr/share/cloudstack-common CONFIGUREVARS= -DEPSCLASSPATH=/usr/share/tomcat6/bin/bootstrap.jar:/usr/share/tomcat6/bin/tomcat-juli.jar +DEPSCLASSPATH= DOCDIR= IPALOCATORLOG=/var/log/cloudstack/management/ipallocator.log JAVADIR=/usr/share/cloudstack-management/webapps/client/WEB-INF/lib diff --git a/packaging/fedora20/cloud-agent.rc b/packaging/fedora20/cloud-agent.rc deleted file mode 100755 index 2defa1488832..000000000000 --- a/packaging/fedora20/cloud-agent.rc +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash - -# chkconfig: 35 99 10 -# description: Cloud Agent -# pidfile: /var/run/cloudstack-agent.pid - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# WARNING: if this script is changed, then all other initscripts MUST BE changed to match it as well - -. /etc/rc.d/init.d/functions - -# set environment variables - -SHORTNAME=$(basename $0 | sed -e 's/^[SK][0-9][0-9]//') -PIDFILE=/var/run/"$SHORTNAME".pid -LOCKFILE=/var/lock/subsys/"$SHORTNAME" -LOGDIR=/var/log/cloudstack/agent -LOGFILE=${LOGDIR}/agent.log -PROGNAME="Cloud Agent" -CLASS="com.cloud.agent.AgentShell" -JSVC=`which jsvc 2>/dev/null`; - -# exit if we don't find jsvc -if [ -z "$JSVC" ]; then - echo no jsvc found in path; - exit 1; -fi - -unset OPTIONS -[ -r /etc/sysconfig/"$SHORTNAME" ] && source /etc/sysconfig/"$SHORTNAME" - -# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/jre /usr/lib/jvm/java-7-openjdk /usr/lib/jvm/java-7-openjdk-i386 /usr/lib/jvm/java-7-openjdk-amd64 /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-openjdk-i386 /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-6-sun" - -for jdir in $JDK_DIRS; do - if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME="$jdir" - fi -done -export JAVA_HOME - -ACP=`ls /usr/share/cloudstack-agent/lib/*.jar | tr '\n' ':' | sed s'/.$//'` -PCP=`ls /usr/share/cloudstack-agent/plugins/*.jar 2>/dev/null | tr '\n' ':' | sed s'/.$//'` - -# We need to append the JSVC daemon JAR to the classpath -# AgentShell implements the JSVC daemon methods -export CLASSPATH="/usr/share/java/commons-daemon.jar:$ACP:$PCP:/etc/cloudstack/agent:/usr/share/cloudstack-common/scripts" - -start() { - echo -n $"Starting $PROGNAME: " - if hostname --fqdn >/dev/null 2>&1 ; then - $JSVC -Xms256m -Xmx2048m -cp "$CLASSPATH" -pidfile "$PIDFILE" \ - -errfile $LOGDIR/cloudstack-agent.err -outfile $LOGDIR/cloudstack-agent.out $CLASS - RETVAL=$? - echo - else - failure - echo - echo The host name does not resolve properly to an IP address. Cannot start "$PROGNAME". > /dev/stderr - RETVAL=9 - fi - [ $RETVAL = 0 ] && touch ${LOCKFILE} - return $RETVAL -} - -stop() { - echo -n $"Stopping $PROGNAME: " - $JSVC -pidfile "$PIDFILE" -stop $CLASS - RETVAL=$? - echo - [ $RETVAL = 0 ] && rm -f ${LOCKFILE} ${PIDFILE} -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status -p ${PIDFILE} $SHORTNAME - RETVAL=$? - ;; - restart) - stop - sleep 3 - start - ;; - condrestart) - if status -p ${PIDFILE} $SHORTNAME >&/dev/null; then - stop - sleep 3 - start - fi - ;; - *) - echo $"Usage: $SHORTNAME {start|stop|restart|condrestart|status|help}" - RETVAL=3 -esac - -exit $RETVAL diff --git a/packaging/fedora20/cloud-ipallocator.rc b/packaging/fedora20/cloud-ipallocator.rc deleted file mode 100755 index d3eadec8a82a..000000000000 --- a/packaging/fedora20/cloud-ipallocator.rc +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# chkconfig: 35 99 10 -# description: Cloud Agent - -# WARNING: if this script is changed, then all other initscripts MUST BE changed to match it as well - -. /etc/rc.d/init.d/functions - -# set environment variables - -SHORTNAME="$(basename $(readlink -f $0))" -PIDFILE=/var/run/"$SHORTNAME".pid -LOCKFILE=/var/lock/subsys/"$SHORTNAME" -LOGFILE=/var/log/cloudstack/ipallocator/ipallocator.log -PROGNAME="External IPAllocator" - -unset OPTIONS -[ -r /etc/sysconfig/"$SHORTNAME" ] && source /etc/sysconfig/"$SHORTNAME" -DAEMONIZE=/usr/bin/cloud-daemonize -PROG=/usr/bin/cloud-external-ipallocator.py -OPTIONS=8083 - -start() { - echo -n $"Starting $PROGNAME: " - if hostname --fqdn >/dev/null 2>&1 ; then - daemon --check=$SHORTNAME --pidfile=${PIDFILE} "$DAEMONIZE" \ - -n "$SHORTNAME" -p "$PIDFILE" -l "$LOGFILE" "$PROG" $OPTIONS - RETVAL=$? - echo - else - failure - echo - echo The host name does not resolve properly to an IP address. Cannot start "$PROGNAME". > /dev/stderr - RETVAL=9 - fi - [ $RETVAL = 0 ] && touch ${LOCKFILE} - return $RETVAL -} - -stop() { - echo -n $"Stopping $PROGNAME: " - killproc -p ${PIDFILE} $SHORTNAME # -d 10 $SHORTNAME - RETVAL=$? - echo - [ $RETVAL = 0 ] && rm -f ${LOCKFILE} ${PIDFILE} -} - - -# See how we were called. -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status -p ${PIDFILE} $SHORTNAME - RETVAL=$? - ;; - restart) - stop - sleep 3 - start - ;; - condrestart) - if status -p ${PIDFILE} $SHORTNAME >&/dev/null; then - stop - sleep 3 - start - fi - ;; - *) - echo $"Usage: $SHORTNAME {start|stop|restart|condrestart|status|help}" - RETVAL=3 -esac - -exit $RETVAL - diff --git a/packaging/fedora20/cloud-management.rc b/packaging/fedora20/cloud-management.rc deleted file mode 100755 index f5ed7a8048ac..000000000000 --- a/packaging/fedora20/cloud-management.rc +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# cloudstack-management This shell script takes care of starting and stopping Tomcat -# -# chkconfig: - 80 20 -# -### BEGIN INIT INFO -# Provides: tomcat6 -# Required-Start: $network $syslog -# Required-Stop: $network $syslog -# Default-Start: -# Default-Stop: -# Description: Release implementation for Servlet 2.5 and JSP 2.1 -# Short-Description: start and stop tomcat -### END INIT INFO -# -# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot -# - heavily rewritten by Deepak Bhole and Jason Corley -# - -if [ -r /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -fi -if [ -r /lib/lsb/init-functions ]; then - . /lib/lsb/init-functions -fi - - -NAME="$(basename $(readlink -f $0))" -export SERVICE_NAME="$NAME" -stop() { - SHUTDOWN_WAIT="30" - count="0" - if [ -f /var/run/${NAME}.pid ]; then - pid=`cat /var/run/${NAME}.pid` - kill $pid &>/dev/null - until [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ] || \ - [ "$count" -gt "$SHUTDOWN_WAIT" ] - do - sleep 1 - let count="${count}+1" - done - if [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ]; then - log_success_msg "Stopping ${NAME}:" - rm -f /var/run/${NAME}.pid - rm -f /var/lock/subsys/${NAME} - else - log_failure_msg "Stopping ${NAME}:" - fi - else - echo "Cannot find PID file of ${NAME}" - log_failure_msg "Stopping ${NAME}:" - fi -} - -set_ulimit() { - fd_limit=`ulimit -n` - if [ "$fd_limit" != "4096" ]; then - user=`whoami` - if [ $user == "root" ]; then - ulimit -n 4096 - fi - fi -} - -handle_pid_file() { - if [ "$1" -ne 0 ] && [ "$1" -ne 3 ]; then - echo "The pid file locates at /var/run/${NAME}.pid and lock file at /var/lock/subsys/${NAME}. - Starting ${NAME} will take care of them or you can manually clean up." - fi -} - -start() { - readpath=$(readlink -f $0) - source `dirname $readpath`/tomcat.sh -} - -# See how we were called. -case "$1" in - status) - status ${NAME} - RETVAL=$? - handle_pid_file $RETVAL - ;; - stop) - stop - ;; - restart) - stop - set start - set_ulimit - start - ;; - *) - set_ulimit - start -esac - -exit $RETVAL diff --git a/packaging/fedora20/cloud-management.sysconfig b/packaging/fedora20/cloud-management.sysconfig deleted file mode 100644 index cbc8b8b36c1c..000000000000 --- a/packaging/fedora20/cloud-management.sysconfig +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This file is loaded in /etc/init.d/vmopsmanagement -# ATM we only do two things here: - -dummy=1 ; export TOMCAT_CFG=/etc/cloudstack/management/tomcat6.conf ; . /etc/cloudstack/management/tomcat6.conf -#-------------------------- - diff --git a/packaging/fedora20/cloud-usage.rc b/packaging/fedora20/cloud-usage.rc deleted file mode 100755 index 774113745d75..000000000000 --- a/packaging/fedora20/cloud-usage.rc +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/bash - -### BEGIN INIT INFO -# Provides: cloudstack-usage -# Required-Start: $network $local_fs -# Required-Stop: $network $local_fs -# Default-Start: 3 4 5 -# Default-Stop: 0 1 2 6 -# Short-Description: Start/stop Apache CloudStack Usage Monitor -# Description: This scripts Starts/Stops the Apache CloudStack Usage Monitor -## The CloudStack Usage Monitor is a part of the Apache CloudStack project and is used -## for storing usage statistics from instances. -## JSVC (Java daemonizing) is used for starting and stopping the usage monitor. -### END INIT INFO - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -. /etc/rc.d/init.d/functions - -SHORTNAME="cloudstack-usage" -PIDFILE=/var/run/"$SHORTNAME".pid -LOCKFILE=/var/lock/subsys/"$SHORTNAME" -LOGDIR=/var/log/cloudstack/usage -LOGFILE=${LOGDIR}/usage.log -PROGNAME="CloudStack Usage Monitor" -CLASS="com.cloud.usage.UsageServer" -PROG="jsvc" -DAEMON="/usr/bin/jsvc" -USER=cloud - -unset OPTIONS -[ -r /etc/sysconfig/default/"$SHORTNAME" ] && source /etc/sysconfig/default/"$SHORTNAME" - -setJavaHome() { - # use $JAVA_HOME if defined - if [ -n "$JAVA_HOME" ] ; then - return - fi - - # try java first - java=$(which java 2>/dev/null || :) - - # try javac if java is not found - if [ -z "$java" ] ; then - java=$(which javac 2>/dev/null || :) - fi - - if [ -n "$java" ] ; then - JAVA_HOME=$(dirname $(dirname $(readlink -e $java))) - export JAVA_HOME - return - fi - - # didnt find java home. exiting with error - exit 1 -} - -setJavaHome - -SCP="" -DCP="" -UCP=`ls /usr/share/cloudstack-usage/cloud-usage-*.jar`":"`ls /usr/share/cloudstack-usage/lib/*.jar | tr '\n' ':'` -JCP="/usr/share/java/commons-daemon.jar":"/usr/share/java/mysql-connector-java.jar" - -# We need to append the JSVC daemon and mysql-connector JAR to the classpath -# AgentShell implements the JSVC daemon methods -export CLASSPATH="$SCP:$DCP:$UCP:$JCP:/etc/cloudstack/usage" - -start() { - if [ -s "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") >/dev/null 2>&1; then - echo "$PROGNAME apparently already running" - exit 0 - fi - - if hostname --fqdn >/dev/null 2>&1 ; then - true - else - echo "The host name does not resolve properly to an IP address. Cannot start $PROGNAME" - exit 1 - fi - - echo -n "Starting $PROGNAME" "$SHORTNAME" - - if daemon --pidfile $PIDFILE $DAEMON -home "$JAVA_HOME" -cp "$CLASSPATH" -pidfile "$PIDFILE" -user "$USER" \ - -errfile $LOGDIR/cloudstack-usage.err -outfile $LOGDIR/cloudstack-usage.out -Dpid=$$ $CLASS - RETVAL=$? - then - rc=0 - sleep 1 - if ! kill -0 $(cat "$PIDFILE") >/dev/null 2>&1; then - failure - rc=1 - fi - else - rc=1 - fi - - if [ $rc -eq 0 ]; then - success - else - failure - rm -f "$PIDFILE" - fi - echo -} - -stop() { - echo -n "Stopping $PROGNAME" "$SHORTNAME" - killproc -p $PIDFILE $DAEMON - if [ "$?" -eq 0 ]; then - success - else - failure - fi - rm -f "$PIDFILE" - echo -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status -p $PIDFILE $SHORTNAME - RETVAL=$? - ;; - restart | force-reload) - stop - sleep 3 - start - ;; - *) - echo "Usage: $0 {start|stop|restart|force-reload|status}" - RETVAL=3 -esac - -exit $RETVAL - diff --git a/packaging/fedora20/cloud.spec b/packaging/fedora20/cloud.spec deleted file mode 100644 index 0a80991154f9..000000000000 --- a/packaging/fedora20/cloud.spec +++ /dev/null @@ -1,655 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -%define __os_install_post %{nil} -%global debug_package %{nil} - -# DISABLE the post-percentinstall java repacking and line number stripping -# we need to find a way to just disable the java repacking and line number stripping, but not the autodeps - -Name: cloudstack -Summary: CloudStack IaaS Platform -#http://fedoraproject.org/wiki/PackageNamingGuidelines#Pre-Release_packages -%if "%{?_prerelease}" != "" -%define _maventag %{_ver}-SNAPSHOT -Release: %{_rel}%{dist} -%else -%define _maventag %{_ver} -Release: %{_rel}%{dist} -%endif - -%{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")} - -Version: %{_ver} -License: ASL 2.0 -Vendor: Apache CloudStack -Packager: Apache CloudStack -Group: System Environment/Libraries -# FIXME do groups for every single one of the subpackages -Source0: %{name}-%{_maventag}.tgz -BuildRoot: %{_tmppath}/%{name}-%{_maventag}-%{release}-build - -BuildRequires: java-1.7.0-openjdk-devel -BuildRequires: tomcat -BuildRequires: ws-commons-util -BuildRequires: jpackage-utils -BuildRequires: gcc -BuildRequires: glibc-devel -BuildRequires: /usr/bin/mkisofs -BuildRequires: mysql-connector-python -#BuildRequires: maven => 3.0.0 - -%description -CloudStack is a highly-scalable elastic, open source, -intelligent IaaS cloud implementation. - -%package management -Summary: CloudStack management server UI -Requires: tomcat -Requires: java-1.7.0-openjdk -Requires: python -Requires: bash -Requires: bzip2 -Requires: gzip -Requires: unzip -Requires: /sbin/mount.nfs -Requires: openssh-clients -Requires: nfs-utils -Requires: wget -Requires: mysql -Requires: mysql-connector-java -Requires: ws-commons-util -Requires: jpackage-utils -Requires: sudo -Requires: /sbin/service -Requires: /sbin/chkconfig -Requires: /usr/bin/ssh-keygen -Requires: mkisofs -Requires: mysql-connector-python -Requires: python-paramiko -Requires: ipmitool -Requires: %{name}-common = %{_ver} -Obsoletes: cloud-client < 4.1.0 -Obsoletes: cloud-client-ui < 4.1.0 -Obsoletes: cloud-server < 4.1.0 -Obsoletes: cloud-test < 4.1.0 -Provides: cloud-client -Group: System Environment/Libraries -%description management -The CloudStack management server is the central point of coordination, -management, and intelligence in CloudStack. - -%package common -Summary: Apache CloudStack common files and scripts -Requires: python -Obsoletes: cloud-test < 4.1.0 -Obsoletes: cloud-scripts < 4.1.0 -Obsoletes: cloud-utils < 4.1.0 -Obsoletes: cloud-core < 4.1.0 -Obsoletes: cloud-deps < 4.1.0 -Obsoletes: cloud-python < 4.1.0 -Obsoletes: cloud-setup < 4.1.0 -Obsoletes: cloud-cli < 4.1.0 -Obsoletes: cloud-daemonize < 4.1.0 -Group: System Environment/Libraries -%description common -The Apache CloudStack files shared between agent and management server - -%package agent -Summary: CloudStack Agent for KVM hypervisors -Requires: openssh-clients -Requires: java-1.7.0-openjdk -Requires: %{name}-common = %{_ver} -Requires: libvirt -Requires: bridge-utils -Requires: ebtables -Requires: iptables -Requires: ethtool -Requires: vconfig -Requires: ipset -Requires: jsvc -Requires: jakarta-commons-daemon -Requires: jakarta-commons-daemon-jsvc -Requires: perl -Requires: libvirt-python -Requires: qemu-img -Requires: qemu-kvm -Requires: libcgroup-tools -Requires: net-tools -Provides: cloud-agent -Obsoletes: cloud-agent < 4.1.0 -Obsoletes: cloud-agent-libs < 4.1.0 -Obsoletes: cloud-test < 4.1.0 -Group: System Environment/Libraries -%description agent -The CloudStack agent for KVM hypervisors - -%package baremetal-agent -Summary: CloudStack baremetal agent -Requires: tftp-server -Requires: xinetd -Requires: syslinux -Requires: chkconfig -Requires: dhcp -Requires: httpd -Group: System Environment/Libraries -%description baremetal-agent -The CloudStack baremetal agent - -%package usage -Summary: CloudStack Usage calculation server -Requires: java-1.7.0-openjdk -Requires: jsvc -Requires: jakarta-commons-daemon -Requires: jakarta-commons-daemon-jsvc -Group: System Environment/Libraries -Obsoletes: cloud-usage < 4.1.0 -Provides: cloud-usage -%description usage -The CloudStack usage calculation service - -%package cli -Summary: Apache CloudStack CLI -Provides: python-cloudmonkey -Provides: python-marvin -Group: System Environment/Libraries -%description cli -Apache CloudStack command line interface - -%if "%{_ossnoss}" == "noredist" -%package mysql-ha -Summary: Apache CloudStack Balancing Strategy for MySQL -Requires: mysql-connector-java -Requires: tomcat -Group: System Environmnet/Libraries -%description mysql-ha -Apache CloudStack Balancing Strategy for MySQL - -%endif - -%prep -echo Doing CloudStack build - -%setup -q -n %{name}-%{_maventag} - -%build - -cp packaging/centos63/replace.properties build/replace.properties -echo VERSION=%{_maventag} >> build/replace.properties -echo PACKAGE=%{name} >> build/replace.properties -touch build/gitrev.txt -echo $(git rev-parse HEAD) > build/gitrev.txt - -if [ "%{_ossnoss}" == "NOREDIST" -o "%{_ossnoss}" == "noredist" ] ; then - echo "Executing mvn packaging with non-redistributable libraries" - if [ "%{_sim}" == "SIMULATOR" -o "%{_sim}" == "simulator" ] ; then - echo "Executing mvn noredist packaging with simulator ..." - mvn -Psystemvm -Dnoredist -Dsimulator clean package - else - echo "Executing mvn noredist packaging without simulator..." - mvn -Psystemvm -Dnoredist clean package - fi -else - if [ "%{_sim}" == "SIMULATOR" -o "%{_sim}" == "simulator" ] ; then - echo "Executing mvn default packaging simulator ..." - mvn -Psystemvm -Dsimulator clean package - else - echo "Executing mvn default packaging without simulator ..." - mvn -Psystemvm clean package - fi -fi - -%install -[ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT} -# Common directories -mkdir -p ${RPM_BUILD_ROOT}%{_bindir} -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/ipallocator -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/work -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/temp -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/mnt -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/management -mkdir -p ${RPM_BUILD_ROOT}%{_initrddir} -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d - -# Common -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/vms -mkdir -p ${RPM_BUILD_ROOT}%{python_sitearch}/ -mkdir -p ${RPM_BUILD_ROOT}%/usr/bin -cp -r scripts/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts -install -D systemvm/dist/systemvm.iso ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/vms/systemvm.iso -install python/lib/cloud_utils.py ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py -cp -r python/lib/cloudutils ${RPM_BUILD_ROOT}%{python_sitearch}/ -python -m py_compile ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py -python -m compileall ${RPM_BUILD_ROOT}%{python_sitearch}/cloudutils -cp build/gitrev.txt ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts -cp packaging/centos63/cloudstack-sccs ${RPM_BUILD_ROOT}/usr/bin - -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts/network/cisco -cp -r plugins/network-elements/cisco-vnmc/scripts/network/cisco/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts/network/cisco - -# Management -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/ -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management - -# Specific for tomcat -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost/client -ln -sf /usr/share/tomcat/bin ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/bin -ln -sf /etc/%{name}/management ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/conf -ln -sf /usr/share/tomcat/lib ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib -ln -sf /var/log/%{name}/management ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/logs -ln -sf /var/cache/%{name}/management/temp ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/temp -ln -sf /var/cache/%{name}/management/work ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/work - -/bin/touch ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management/catalina.out - -install -D client/target/utilities/bin/cloud-migrate-databases ${RPM_BUILD_ROOT}%{_bindir}/%{name}-migrate-databases -install -D client/target/utilities/bin/cloud-set-guest-password ${RPM_BUILD_ROOT}%{_bindir}/%{name}-set-guest-password -install -D client/target/utilities/bin/cloud-set-guest-sshkey ${RPM_BUILD_ROOT}%{_bindir}/%{name}-set-guest-sshkey -install -D client/target/utilities/bin/cloud-setup-databases ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-databases -install -D client/target/utilities/bin/cloud-setup-encryption ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-encryption -install -D client/target/utilities/bin/cloud-setup-management ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-management -install -D client/target/utilities/bin/cloud-setup-baremetal ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-baremetal -install -D client/target/utilities/bin/cloud-sysvmadm ${RPM_BUILD_ROOT}%{_bindir}/%{name}-sysvmadm -install -D client/target/utilities/bin/cloud-update-xenserver-licenses ${RPM_BUILD_ROOT}%{_bindir}/%{name}-update-xenserver-licenses - -cp -r client/target/utilities/scripts/db/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup -cp -r client/target/cloud-client-ui-%{_maventag}/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client - -# Don't package the scripts in the management webapp -rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/scripts -rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/vms - -for name in db.properties log4j-cloud.xml tomcat6-nonssl.conf tomcat6-ssl.conf server-ssl.xml server-nonssl.xml \ - catalina.policy catalina.properties classpath.conf tomcat-users.xml web.xml environment.properties java.security.ciphers ; do - mv ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/$name \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/$name -done - -ln -s %{_sysconfdir}/%{name}/management/log4j-cloud.xml \ - ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/log4j-cloud.xml - -mv ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/context.xml \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost/client - -install python/bindir/cloud-external-ipallocator.py ${RPM_BUILD_ROOT}%{_bindir}/%{name}-external-ipallocator.py -install -D client/target/pythonlibs/jasypt-1.9.2.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/lib/jasypt-1.9.2.jar - -install -D packaging/centos63/cloud-ipallocator.rc ${RPM_BUILD_ROOT}%{_initrddir}/%{name}-ipallocator -install -D packaging/centos63/cloud-management.rc ${RPM_BUILD_ROOT}%{_initrddir}/%{name}-management -install -D packaging/centos63/cloud-management.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/%{name}-management -install -D packaging/centos63/tomcat.sh ${RPM_BUILD_ROOT}%{_initrddir}/tomcat.sh -install -D server/target/conf/cloudstack-catalina.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-catalina - -chmod 440 ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d/%{name}-management -chmod 770 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina -chmod 770 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost -chmod 770 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost/client -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/mnt -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/management -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/work -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/temp -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent - -# KVM Agent -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/plugins -install -D packaging/centos63/cloud-agent.rc ${RPM_BUILD_ROOT}%{_sysconfdir}/init.d/%{name}-agent -install -D agent/target/transformed/agent.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/agent.properties -install -D agent/target/transformed/environment.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/environment.properties -install -D agent/target/transformed/log4j-cloud.xml ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/log4j-cloud.xml -install -D agent/target/transformed/cloud-setup-agent ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-agent -install -D agent/target/transformed/cloudstack-agent-upgrade ${RPM_BUILD_ROOT}%{_bindir}/%{name}-agent-upgrade -install -D agent/target/transformed/libvirtqemuhook ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib/libvirtqemuhook -install -D agent/target/transformed/cloud-ssh ${RPM_BUILD_ROOT}%{_bindir}/%{name}-ssh -install -D agent/target/transformed/cloudstack-agent-profile.sh ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d/%{name}-agent-profile.sh -install -D agent/target/transformed/cloudstack-agent.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-agent -install -D plugins/hypervisors/kvm/target/cloud-plugin-hypervisor-kvm-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%name-agent/lib/cloud-plugin-hypervisor-kvm-%{_maventag}.jar -cp plugins/hypervisors/kvm/target/dependencies/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib - -# Usage server -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib -install -D usage/target/cloud-usage-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/cloud-usage-%{_maventag}.jar -install -D usage/target/transformed/db.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage/db.properties -install -D usage/target/transformed/log4j-cloud_usage.xml ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage/log4j-cloud.xml -cp usage/target/dependencies/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib/ -install -D packaging/centos63/cloud-usage.rc ${RPM_BUILD_ROOT}/%{_sysconfdir}/init.d/%{name}-usage -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/usage/ - -# CLI -cp -r cloud-cli/cloudtool ${RPM_BUILD_ROOT}%{python_sitearch}/ -install cloud-cli/cloudapis/cloud.py ${RPM_BUILD_ROOT}%{python_sitearch}/cloudapis.py - -# MYSQL HA -if [ "x%{_ossnoss}" == "xnoredist" ] ; then - mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-mysql-ha/lib - cp -r plugins/database/mysql-ha/target/cloud-plugin-database-mysqlha-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-mysql-ha/lib -fi - -#License files from whisker -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-management-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-management-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-common-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-common-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-agent-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-agent-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/LICENSE -if [ "x%{_ossnoss}" == "xnoredist" ] ; then - install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-mysql-ha-%{version}/LICENSE - install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-mysql-ha-%{version}/NOTICE -fi - -%clean -[ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT} - -%preun management -/sbin/service cloudstack-management stop || true -if [ "$1" == "0" ] ; then - /sbin/chkconfig --del cloudstack-management > /dev/null 2>&1 || true - /sbin/service cloudstack-management stop > /dev/null 2>&1 || true -fi - -%pre management -id cloud > /dev/null 2>&1 || /usr/sbin/useradd -M -c "CloudStack unprivileged user" \ - -r -s /bin/sh -d %{_localstatedir}/cloudstack/management cloud|| true - -# set max file descriptors for cloud user to 4096 -sed -i /"cloud hard nofile"/d /etc/security/limits.conf -sed -i /"cloud soft nofile"/d /etc/security/limits.conf -echo "cloud hard nofile 4096" >> /etc/security/limits.conf -echo "cloud soft nofile 4096" >> /etc/security/limits.conf -rm -rf %{_localstatedir}/cache/cloud -rm -rf %{_localstatedir}/cache/cloudstack -# user harcoded here, also hardcoded on wscript - -# save old configs if they exist (for upgrade). Otherwise we may lose them -# when the old packages are erased. There are a lot of properties files here. -if [ -d "%{_sysconfdir}/cloud" ] ; then - mv %{_sysconfdir}/cloud %{_sysconfdir}/cloud.rpmsave -fi - -# in case of upgrade to 4.9+ copy commands.properties if not exists in /etc/cloudstack/management/ -if [ "$1" == "2" ] ; then - if [ -f "%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/commands.properties" ] && [ ! -f "%{_sysconfdir}/%{name}/management/commands.properties" ] ; then - cp -p %{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/commands.properties %{_sysconfdir}/%{name}/management/commands.properties - fi -fi - -%post management -if [ "$1" == "1" ] ; then - /sbin/chkconfig --add cloudstack-management > /dev/null 2>&1 || true - /sbin/chkconfig --level 345 cloudstack-management on > /dev/null 2>&1 || true -fi - -if [ ! -f %{_datadir}/cloudstack-common/scripts/vm/hypervisor/xenserver/vhd-util ] ; then - echo Please download vhd-util from http://download.cloud.com.s3.amazonaws.com/tools/vhd-util and put it in - echo %{_datadir}/cloudstack-common/scripts/vm/hypervisor/xenserver/ -fi - -# change cloud user's home to 4.1+ version if needed. Would do this via 'usermod', but it -# requires that cloud user not be in use, so RPM could not be installed while management is running -if getent passwd cloud | grep -q /var/lib/cloud; then - sed -i 's/\/var\/lib\/cloud\/management/\/var\/cloudstack\/management/g' /etc/passwd -fi - -# if saved configs from upgrade exist, copy them over -if [ -f "%{_sysconfdir}/cloud.rpmsave/management/db.properties" ]; then - mv %{_sysconfdir}/%{name}/management/db.properties %{_sysconfdir}/%{name}/management/db.properties.rpmnew - cp -p %{_sysconfdir}/cloud.rpmsave/management/db.properties %{_sysconfdir}/%{name}/management - if [ -f "%{_sysconfdir}/cloud.rpmsave/management/key" ]; then - cp -p %{_sysconfdir}/cloud.rpmsave/management/key %{_sysconfdir}/%{name}/management - fi - # make sure we only do this on the first install of this RPM, don't want to overwrite on a reinstall - mv %{_sysconfdir}/cloud.rpmsave/management/db.properties %{_sysconfdir}/cloud.rpmsave/management/db.properties.rpmsave -fi - -# Choose server.xml and tomcat.conf links based on old config, if exists -serverxml=%{_sysconfdir}/%{name}/management/server.xml -oldserverxml=%{_sysconfdir}/cloud.rpmsave/management/server.xml -if [ -f $oldserverxml ] || [ -L $oldserverxml ]; then - if stat -c %N $oldserverxml| grep -q server-ssl ; then - if [ -f $serverxml ] || [ -L $serverxml ]; then rm -f $serverxml; fi - ln -s %{_sysconfdir}/%{name}/management/server-ssl.xml $serverxml - echo Please verify the server.xml in saved folder, and make the required changes manually , saved folder available at $oldserverxml - else - if [ -f $serverxml ] || [ -L $serverxml ]; then rm -f $serverxml; fi - ln -s %{_sysconfdir}/%{name}/management/server-nonssl.xml $serverxml - echo Please verify the server.xml in saved folder, and make the required changes manually , saved folder available at $oldserverxml - - fi -else - echo "Unable to determine ssl settings for server.xml, please run cloudstack-setup-management manually" -fi - - -tomcatconf=%{_sysconfdir}/%{name}/management/tomcat6.conf -oldtomcatconf=%{_sysconfdir}/cloud.rpmsave/management/tomcat6.conf -if [ -f $oldtomcatconf ] || [ -L $oldtomcatconf ] ; then - if stat -c %N $oldtomcatconf| grep -q tomcat6-ssl ; then - if [ -f $tomcatconf ] || [ -L $tomcatconf ]; then rm -f $tomcatconf; fi - ln -s %{_sysconfdir}/%{name}/management/tomcat6-ssl.conf $tomcatconf - echo Please verify the tomcat6.conf in saved folder, and make the required changes manually , saved folder available at $oldtomcatconf - else - if [ -f $tomcatconf ] || [ -L $tomcatconf ]; then rm -f $tomcatconf; fi - ln -s %{_sysconfdir}/%{name}/management/tomcat6-nonssl.conf $tomcatconf - echo Please verify the tomcat6.conf in saved folder, and make the required changes manually , saved folder available at $oldtomcatconf - fi -else - echo "Unable to determine ssl settings for tomcat.conf, please run cloudstack-setup-management manually" -fi - -if [ -f "%{_sysconfdir}/cloud.rpmsave/management/cloud.keystore" ]; then - cp -p %{_sysconfdir}/cloud.rpmsave/management/cloud.keystore %{_sysconfdir}/%{name}/management/cloudmanagementserver.keystore - # make sure we only do this on the first install of this RPM, don't want to overwrite on a reinstall - mv %{_sysconfdir}/cloud.rpmsave/management/cloud.keystore %{_sysconfdir}/cloud.rpmsave/management/cloud.keystore.rpmsave -fi - -%preun agent -/sbin/service cloudstack-agent stop || true -if [ "$1" == "0" ] ; then - /sbin/chkconfig --del cloudstack-agent > /dev/null 2>&1 || true - /sbin/service cloudstack-agent stop > /dev/null 2>&1 || true -fi - -%pre agent - -# save old configs if they exist (for upgrade). Otherwise we may lose them -# when the old packages are erased. There are a lot of properties files here. -if [ -d "%{_sysconfdir}/cloud" ] ; then - mv %{_sysconfdir}/cloud %{_sysconfdir}/cloud.rpmsave -fi - -%post agent -if [ "$1" == "1" ] ; then - echo "Running %{_bindir}/%{name}-agent-upgrade to update bridge name for upgrade from CloudStack 4.0.x (and before) to CloudStack 4.1 (and later)" - %{_bindir}/%{name}-agent-upgrade - if [ ! -d %{_sysconfdir}/libvirt/hooks ] ; then - mkdir %{_sysconfdir}/libvirt/hooks - fi - cp -a ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib/libvirtqemuhook %{_sysconfdir}/libvirt/hooks/qemu - /sbin/service libvirtd restart - /sbin/chkconfig --add cloudstack-agent > /dev/null 2>&1 || true - /sbin/chkconfig --level 345 cloudstack-agent on > /dev/null 2>&1 || true -fi - -# if saved configs from upgrade exist, copy them over -if [ -f "%{_sysconfdir}/cloud.rpmsave/agent/agent.properties" ]; then - mv %{_sysconfdir}/%{name}/agent/agent.properties %{_sysconfdir}/%{name}/agent/agent.properties.rpmnew - cp -p %{_sysconfdir}/cloud.rpmsave/agent/agent.properties %{_sysconfdir}/%{name}/agent - # make sure we only do this on the first install of this RPM, don't want to overwrite on a reinstall - mv %{_sysconfdir}/cloud.rpmsave/agent/agent.properties %{_sysconfdir}/cloud.rpmsave/agent/agent.properties.rpmsave -fi - -%preun usage -/sbin/service cloudstack-usage stop || true -if [ "$1" == "0" ] ; then - /sbin/chkconfig --del cloudstack-usage > /dev/null 2>&1 || true - /sbin/service cloudstack-usage stop > /dev/null 2>&1 || true -fi - -%post usage -if [ -f "%{_sysconfdir}/%{name}/management/db.properties" ]; then - echo Replacing db.properties with management server db.properties - rm -f %{_sysconfdir}/%{name}/usage/db.properties - ln -s %{_sysconfdir}/%{name}/management/db.properties %{_sysconfdir}/%{name}/usage/db.properties - /sbin/chkconfig --add cloudstack-usage > /dev/null 2>&1 || true - /sbin/chkconfig --level 345 cloudstack-usage on > /dev/null 2>&1 || true -fi - -if [ -f "%{_sysconfdir}/%{name}/management/key" ]; then - echo Replacing key with management server key - rm -f %{_sysconfdir}/%{name}/usage/key - ln -s %{_sysconfdir}/%{name}/management/key %{_sysconfdir}/%{name}/usage/key -fi - -#No default permission as the permission setup is complex -%files management -%defattr(-,root,root,-) -%dir %attr(0770,root,cloud) %{_sysconfdir}/%{name}/management/Catalina -%dir %attr(0770,root,cloud) %{_sysconfdir}/%{name}/management/Catalina/localhost -%dir %attr(0770,root,cloud) %{_sysconfdir}/%{name}/management/Catalina/localhost/client -%dir %{_datadir}/%{name}-management -%dir %attr(0770,root,cloud) %{_localstatedir}/%{name}/mnt -%dir %attr(0770,cloud,cloud) %{_localstatedir}/%{name}/management -%dir %attr(0770,root,cloud) %{_localstatedir}/cache/%{name}/management -%dir %attr(0770,root,cloud) %{_localstatedir}/cache/%{name}/management/work -%dir %attr(0770,root,cloud) %{_localstatedir}/cache/%{name}/management/temp -%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/management -%config(noreplace) %{_sysconfdir}/sysconfig/%{name}-management -%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/db.properties -%config(noreplace) %{_sysconfdir}/%{name}/management/log4j-cloud.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/tomcat6-nonssl.conf -%config(noreplace) %{_sysconfdir}/%{name}/management/tomcat6-ssl.conf -%config(noreplace) %{_sysconfdir}/%{name}/management/Catalina/localhost/client/context.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/catalina.policy -%config(noreplace) %{_sysconfdir}/%{name}/management/catalina.properties -%config(noreplace) %{_sysconfdir}/%{name}/management/classpath.conf -%config(noreplace) %{_sysconfdir}/%{name}/management/server-nonssl.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/server-ssl.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/tomcat-users.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/web.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/environment.properties -%config(noreplace) %{_sysconfdir}/%{name}/management/java.security.ciphers -%config(noreplace) %{_sysconfdir}/%{name}/management/commons-logging.properties -%attr(0755,root,root) %{_initrddir}/%{name}-management -%attr(0755,root,root) %{_initrddir}/tomcat.sh - -%attr(0755,root,root) %{_bindir}/%{name}-setup-management -%attr(0755,root,root) %{_bindir}/%{name}-update-xenserver-licenses -%{_datadir}/%{name}-management/webapps -%{_datadir}/%{name}-management/bin -%{_datadir}/%{name}-management/conf -%{_datadir}/%{name}-management/lib -%{_datadir}/%{name}-management/logs -%{_datadir}/%{name}-management/temp -%{_datadir}/%{name}-management/work -%attr(0755,root,root) %{_bindir}/%{name}-setup-databases -%attr(0755,root,root) %{_bindir}/%{name}-migrate-databases -%attr(0755,root,root) %{_bindir}/%{name}-set-guest-password -%attr(0755,root,root) %{_bindir}/%{name}-set-guest-sshkey -%attr(0755,root,root) %{_bindir}/%{name}-sysvmadm -%attr(0755,root,root) %{_bindir}/%{name}-setup-encryption -%{_datadir}/%{name}-management/setup/*.sql -%{_datadir}/%{name}-management/setup/db/*.sql -%{_datadir}/%{name}-management/setup/*.sh -%{_datadir}/%{name}-management/setup/server-setup.xml -%attr(0755,root,root) %{_bindir}/%{name}-external-ipallocator.py -%attr(0755,root,root) %{_initrddir}/%{name}-ipallocator -%dir %attr(0770,root,root) %{_localstatedir}/log/%{name}/ipallocator -%{_defaultdocdir}/%{name}-management-%{version}/LICENSE -%{_defaultdocdir}/%{name}-management-%{version}/NOTICE -%attr(0644,cloud,cloud) %{_localstatedir}/log/%{name}/management/catalina.out -%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-catalina - -%files agent -%attr(0755,root,root) %{_bindir}/%{name}-setup-agent -%attr(0755,root,root) %{_bindir}/%{name}-agent-upgrade -%attr(0755,root,root) %{_bindir}/%{name}-ssh -%attr(0755,root,root) %{_sysconfdir}/init.d/%{name}-agent -%attr(0644,root,root) %{_sysconfdir}/profile.d/%{name}-agent-profile.sh -%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-agent -%attr(0755,root,root) %{_datadir}/%{name}-common/scripts/network/cisco -%config(noreplace) %{_sysconfdir}/%{name}/agent -%dir %{_localstatedir}/log/%{name}/agent -%attr(0644,root,root) %{_datadir}/%{name}-agent/lib/*.jar -%attr(0755,root,root) %{_datadir}/%{name}-agent/lib/libvirtqemuhook -%dir %{_datadir}/%{name}-agent/plugins -%{_defaultdocdir}/%{name}-agent-%{version}/LICENSE -%{_defaultdocdir}/%{name}-agent-%{version}/NOTICE - -%files common -%dir %attr(0755,root,root) %{python_sitearch}/cloudutils -%dir %attr(0755,root,root) %{_datadir}/%{name}-common/vms -%attr(0755,root,root) %{_datadir}/%{name}-common/scripts -%attr(0755,root,root) /usr/bin/cloudstack-sccs -%attr(0644, root, root) %{_datadir}/%{name}-common/vms/systemvm.iso -%attr(0644,root,root) %{python_sitearch}/cloud_utils.py -%attr(0644,root,root) %{python_sitearch}/cloud_utils.pyc -%attr(0644,root,root) %{python_sitearch}/cloudutils/* -%attr(0644, root, root) %{_datadir}/%{name}-common/lib/jasypt-1.9.2.jar -%{_defaultdocdir}/%{name}-common-%{version}/LICENSE -%{_defaultdocdir}/%{name}-common-%{version}/NOTICE - -%files usage -%attr(0755,root,root) %{_sysconfdir}/init.d/%{name}-usage -%attr(0644,root,root) %{_datadir}/%{name}-usage/*.jar -%attr(0644,root,root) %{_datadir}/%{name}-usage/lib/*.jar -%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/usage -%attr(0644,root,root) %{_sysconfdir}/%{name}/usage/db.properties -%attr(0644,root,root) %{_sysconfdir}/%{name}/usage/log4j-cloud.xml -%{_defaultdocdir}/%{name}-usage-%{version}/LICENSE -%{_defaultdocdir}/%{name}-usage-%{version}/NOTICE - -%files cli -%attr(0644,root,root) %{python_sitearch}/cloudapis.py -%attr(0644,root,root) %{python_sitearch}/cloudtool/__init__.py -%attr(0644,root,root) %{python_sitearch}/cloudtool/utils.py -%{_defaultdocdir}/%{name}-cli-%{version}/LICENSE -%{_defaultdocdir}/%{name}-cli-%{version}/NOTICE - -%if "%{_ossnoss}" == "noredist" -%files mysql-ha -%defattr(0644,cloud,cloud,0755) -%attr(0644,root,root) %{_datadir}/%{name}-mysql-ha/lib/* -%{_defaultdocdir}/%{name}-mysql-ha-%{version}/LICENSE -%{_defaultdocdir}/%{name}-mysql-ha-%{version}/NOTICE -%endif - -%files baremetal-agent -%attr(0755,root,root) %{_bindir}/cloudstack-setup-baremetal - -%changelog -* Thu Apr 30 2015 Rohit Yadav 4.6.0 -- Remove awsapi package - -* Fri Jul 04 2014 Hugo Trippaers 4.5.0 -- Add a package for the mysql ha module - -* Wed Oct 03 2012 Hugo Trippaers 4.1.0 -- new style spec file diff --git a/packaging/fedora20/cloudstack-agent.te b/packaging/fedora20/cloudstack-agent.te deleted file mode 100644 index 4259e173a46f..000000000000 --- a/packaging/fedora20/cloudstack-agent.te +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -module cloudstack-agent 1.0; - -require { - type nfs_t; - type system_conf_t; - type mount_t; - type qemu_t; - class file unlink; - class filesystem getattr; -} - -#============= mount_t ============== -allow mount_t system_conf_t:file unlink; - -#============= qemu_t ============== -allow qemu_t nfs_t:filesystem getattr; diff --git a/packaging/fedora20/cloudstack-sccs b/packaging/fedora20/cloudstack-sccs deleted file mode 100644 index e05d372c7fe4..000000000000 --- a/packaging/fedora20/cloudstack-sccs +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/sh - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -cat /usr/share/cloudstack-common/scripts/gitrev.txt diff --git a/packaging/fedora20/replace.properties b/packaging/fedora20/replace.properties deleted file mode 100644 index bdf6e223b596..000000000000 --- a/packaging/fedora20/replace.properties +++ /dev/null @@ -1,59 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -DBUSER=cloud -DBPW=cloud -DBROOTPW= -MSLOG=vmops.log -APISERVERLOG=api.log -DBHOST=localhost -DBDRIVER=jdbc:mysql -COMPONENTS-SPEC=components-premium.xml -REMOTEHOST=localhost -AGENTCLASSPATH= -AGENTLOG=/var/log/cloudstack/agent/agent.log -AGENTLOGDIR=/var/log/cloudstack/agent/ -AGENTSYSCONFDIR=/etc/cloudstack/agent -APISERVERLOG=/var/log/cloudstack/management/apilog.log -BINDIR=/usr/bin -COMMONLIBDIR=/usr/share/cloudstack-common -CONFIGUREVARS= -DEPSCLASSPATH= -DOCDIR= -IPALOCATORLOG=/var/log/cloudstack/management/ipallocator.log -JAVADIR=/usr/share/java -LIBEXECDIR=/usr/libexec -LOCKDIR=/var/lock -MSCLASSPATH= -MSCONF=/etc/cloudstack/management -MSENVIRON=/usr/share/cloudstack-management -MSLOG=/var/log/cloudstack/management/management-server.log -MSLOGDIR=/var/log/cloudstack/management/ -MSMNTDIR=/var/cloudstack/mnt -MSUSER=cloud -PIDDIR=/var/run -PLUGINJAVADIR=/usr/share/cloudstack-management/plugin -PREMIUMJAVADIR=/usr/share/cloudstack-management/premium -PYTHONDIR=/usr/lib/python2.6/site-packages/ -SERVERSYSCONFDIR=/etc/sysconfig -SETUPDATADIR=/usr/share/cloudstack-management/setup -SYSCONFDIR=/etc/sysconfig -SYSTEMCLASSPATH= -SYSTEMJARS= -USAGECLASSPATH= -USAGELOG=/var/log/cloudstack/usage/usage.log -USAGESYSCONFDIR=/etc/sysconfig diff --git a/packaging/fedora21/cloud-agent.rc b/packaging/fedora21/cloud-agent.rc deleted file mode 100755 index 2defa1488832..000000000000 --- a/packaging/fedora21/cloud-agent.rc +++ /dev/null @@ -1,118 +0,0 @@ -#!/bin/bash - -# chkconfig: 35 99 10 -# description: Cloud Agent -# pidfile: /var/run/cloudstack-agent.pid - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# WARNING: if this script is changed, then all other initscripts MUST BE changed to match it as well - -. /etc/rc.d/init.d/functions - -# set environment variables - -SHORTNAME=$(basename $0 | sed -e 's/^[SK][0-9][0-9]//') -PIDFILE=/var/run/"$SHORTNAME".pid -LOCKFILE=/var/lock/subsys/"$SHORTNAME" -LOGDIR=/var/log/cloudstack/agent -LOGFILE=${LOGDIR}/agent.log -PROGNAME="Cloud Agent" -CLASS="com.cloud.agent.AgentShell" -JSVC=`which jsvc 2>/dev/null`; - -# exit if we don't find jsvc -if [ -z "$JSVC" ]; then - echo no jsvc found in path; - exit 1; -fi - -unset OPTIONS -[ -r /etc/sysconfig/"$SHORTNAME" ] && source /etc/sysconfig/"$SHORTNAME" - -# The first existing directory is used for JAVA_HOME (if JAVA_HOME is not defined in $DEFAULT) -JDK_DIRS="/usr/lib/jvm/jre /usr/lib/jvm/java-7-openjdk /usr/lib/jvm/java-7-openjdk-i386 /usr/lib/jvm/java-7-openjdk-amd64 /usr/lib/jvm/java-6-openjdk /usr/lib/jvm/java-6-openjdk-i386 /usr/lib/jvm/java-6-openjdk-amd64 /usr/lib/jvm/java-6-sun" - -for jdir in $JDK_DIRS; do - if [ -r "$jdir/bin/java" -a -z "${JAVA_HOME}" ]; then - JAVA_HOME="$jdir" - fi -done -export JAVA_HOME - -ACP=`ls /usr/share/cloudstack-agent/lib/*.jar | tr '\n' ':' | sed s'/.$//'` -PCP=`ls /usr/share/cloudstack-agent/plugins/*.jar 2>/dev/null | tr '\n' ':' | sed s'/.$//'` - -# We need to append the JSVC daemon JAR to the classpath -# AgentShell implements the JSVC daemon methods -export CLASSPATH="/usr/share/java/commons-daemon.jar:$ACP:$PCP:/etc/cloudstack/agent:/usr/share/cloudstack-common/scripts" - -start() { - echo -n $"Starting $PROGNAME: " - if hostname --fqdn >/dev/null 2>&1 ; then - $JSVC -Xms256m -Xmx2048m -cp "$CLASSPATH" -pidfile "$PIDFILE" \ - -errfile $LOGDIR/cloudstack-agent.err -outfile $LOGDIR/cloudstack-agent.out $CLASS - RETVAL=$? - echo - else - failure - echo - echo The host name does not resolve properly to an IP address. Cannot start "$PROGNAME". > /dev/stderr - RETVAL=9 - fi - [ $RETVAL = 0 ] && touch ${LOCKFILE} - return $RETVAL -} - -stop() { - echo -n $"Stopping $PROGNAME: " - $JSVC -pidfile "$PIDFILE" -stop $CLASS - RETVAL=$? - echo - [ $RETVAL = 0 ] && rm -f ${LOCKFILE} ${PIDFILE} -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status -p ${PIDFILE} $SHORTNAME - RETVAL=$? - ;; - restart) - stop - sleep 3 - start - ;; - condrestart) - if status -p ${PIDFILE} $SHORTNAME >&/dev/null; then - stop - sleep 3 - start - fi - ;; - *) - echo $"Usage: $SHORTNAME {start|stop|restart|condrestart|status|help}" - RETVAL=3 -esac - -exit $RETVAL diff --git a/packaging/fedora21/cloud-ipallocator.rc b/packaging/fedora21/cloud-ipallocator.rc deleted file mode 100755 index d3eadec8a82a..000000000000 --- a/packaging/fedora21/cloud-ipallocator.rc +++ /dev/null @@ -1,96 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# chkconfig: 35 99 10 -# description: Cloud Agent - -# WARNING: if this script is changed, then all other initscripts MUST BE changed to match it as well - -. /etc/rc.d/init.d/functions - -# set environment variables - -SHORTNAME="$(basename $(readlink -f $0))" -PIDFILE=/var/run/"$SHORTNAME".pid -LOCKFILE=/var/lock/subsys/"$SHORTNAME" -LOGFILE=/var/log/cloudstack/ipallocator/ipallocator.log -PROGNAME="External IPAllocator" - -unset OPTIONS -[ -r /etc/sysconfig/"$SHORTNAME" ] && source /etc/sysconfig/"$SHORTNAME" -DAEMONIZE=/usr/bin/cloud-daemonize -PROG=/usr/bin/cloud-external-ipallocator.py -OPTIONS=8083 - -start() { - echo -n $"Starting $PROGNAME: " - if hostname --fqdn >/dev/null 2>&1 ; then - daemon --check=$SHORTNAME --pidfile=${PIDFILE} "$DAEMONIZE" \ - -n "$SHORTNAME" -p "$PIDFILE" -l "$LOGFILE" "$PROG" $OPTIONS - RETVAL=$? - echo - else - failure - echo - echo The host name does not resolve properly to an IP address. Cannot start "$PROGNAME". > /dev/stderr - RETVAL=9 - fi - [ $RETVAL = 0 ] && touch ${LOCKFILE} - return $RETVAL -} - -stop() { - echo -n $"Stopping $PROGNAME: " - killproc -p ${PIDFILE} $SHORTNAME # -d 10 $SHORTNAME - RETVAL=$? - echo - [ $RETVAL = 0 ] && rm -f ${LOCKFILE} ${PIDFILE} -} - - -# See how we were called. -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status -p ${PIDFILE} $SHORTNAME - RETVAL=$? - ;; - restart) - stop - sleep 3 - start - ;; - condrestart) - if status -p ${PIDFILE} $SHORTNAME >&/dev/null; then - stop - sleep 3 - start - fi - ;; - *) - echo $"Usage: $SHORTNAME {start|stop|restart|condrestart|status|help}" - RETVAL=3 -esac - -exit $RETVAL - diff --git a/packaging/fedora21/cloud-management.rc b/packaging/fedora21/cloud-management.rc deleted file mode 100755 index f5ed7a8048ac..000000000000 --- a/packaging/fedora21/cloud-management.rc +++ /dev/null @@ -1,115 +0,0 @@ -#!/bin/bash -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# cloudstack-management This shell script takes care of starting and stopping Tomcat -# -# chkconfig: - 80 20 -# -### BEGIN INIT INFO -# Provides: tomcat6 -# Required-Start: $network $syslog -# Required-Stop: $network $syslog -# Default-Start: -# Default-Stop: -# Description: Release implementation for Servlet 2.5 and JSP 2.1 -# Short-Description: start and stop tomcat -### END INIT INFO -# -# - originally written by Henri Gomez, Keith Irwin, and Nicolas Mailhot -# - heavily rewritten by Deepak Bhole and Jason Corley -# - -if [ -r /etc/rc.d/init.d/functions ]; then - . /etc/rc.d/init.d/functions -fi -if [ -r /lib/lsb/init-functions ]; then - . /lib/lsb/init-functions -fi - - -NAME="$(basename $(readlink -f $0))" -export SERVICE_NAME="$NAME" -stop() { - SHUTDOWN_WAIT="30" - count="0" - if [ -f /var/run/${NAME}.pid ]; then - pid=`cat /var/run/${NAME}.pid` - kill $pid &>/dev/null - until [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ] || \ - [ "$count" -gt "$SHUTDOWN_WAIT" ] - do - sleep 1 - let count="${count}+1" - done - if [ "$(ps --pid $pid | grep -c $pid)" -eq "0" ]; then - log_success_msg "Stopping ${NAME}:" - rm -f /var/run/${NAME}.pid - rm -f /var/lock/subsys/${NAME} - else - log_failure_msg "Stopping ${NAME}:" - fi - else - echo "Cannot find PID file of ${NAME}" - log_failure_msg "Stopping ${NAME}:" - fi -} - -set_ulimit() { - fd_limit=`ulimit -n` - if [ "$fd_limit" != "4096" ]; then - user=`whoami` - if [ $user == "root" ]; then - ulimit -n 4096 - fi - fi -} - -handle_pid_file() { - if [ "$1" -ne 0 ] && [ "$1" -ne 3 ]; then - echo "The pid file locates at /var/run/${NAME}.pid and lock file at /var/lock/subsys/${NAME}. - Starting ${NAME} will take care of them or you can manually clean up." - fi -} - -start() { - readpath=$(readlink -f $0) - source `dirname $readpath`/tomcat.sh -} - -# See how we were called. -case "$1" in - status) - status ${NAME} - RETVAL=$? - handle_pid_file $RETVAL - ;; - stop) - stop - ;; - restart) - stop - set start - set_ulimit - start - ;; - *) - set_ulimit - start -esac - -exit $RETVAL diff --git a/packaging/fedora21/cloud-management.sysconfig b/packaging/fedora21/cloud-management.sysconfig deleted file mode 100644 index cbc8b8b36c1c..000000000000 --- a/packaging/fedora21/cloud-management.sysconfig +++ /dev/null @@ -1,23 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -# This file is loaded in /etc/init.d/vmopsmanagement -# ATM we only do two things here: - -dummy=1 ; export TOMCAT_CFG=/etc/cloudstack/management/tomcat6.conf ; . /etc/cloudstack/management/tomcat6.conf -#-------------------------- - diff --git a/packaging/fedora21/cloud-usage.rc b/packaging/fedora21/cloud-usage.rc deleted file mode 100755 index 774113745d75..000000000000 --- a/packaging/fedora21/cloud-usage.rc +++ /dev/null @@ -1,156 +0,0 @@ -#!/bin/bash - -### BEGIN INIT INFO -# Provides: cloudstack-usage -# Required-Start: $network $local_fs -# Required-Stop: $network $local_fs -# Default-Start: 3 4 5 -# Default-Stop: 0 1 2 6 -# Short-Description: Start/stop Apache CloudStack Usage Monitor -# Description: This scripts Starts/Stops the Apache CloudStack Usage Monitor -## The CloudStack Usage Monitor is a part of the Apache CloudStack project and is used -## for storing usage statistics from instances. -## JSVC (Java daemonizing) is used for starting and stopping the usage monitor. -### END INIT INFO - -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -. /etc/rc.d/init.d/functions - -SHORTNAME="cloudstack-usage" -PIDFILE=/var/run/"$SHORTNAME".pid -LOCKFILE=/var/lock/subsys/"$SHORTNAME" -LOGDIR=/var/log/cloudstack/usage -LOGFILE=${LOGDIR}/usage.log -PROGNAME="CloudStack Usage Monitor" -CLASS="com.cloud.usage.UsageServer" -PROG="jsvc" -DAEMON="/usr/bin/jsvc" -USER=cloud - -unset OPTIONS -[ -r /etc/sysconfig/default/"$SHORTNAME" ] && source /etc/sysconfig/default/"$SHORTNAME" - -setJavaHome() { - # use $JAVA_HOME if defined - if [ -n "$JAVA_HOME" ] ; then - return - fi - - # try java first - java=$(which java 2>/dev/null || :) - - # try javac if java is not found - if [ -z "$java" ] ; then - java=$(which javac 2>/dev/null || :) - fi - - if [ -n "$java" ] ; then - JAVA_HOME=$(dirname $(dirname $(readlink -e $java))) - export JAVA_HOME - return - fi - - # didnt find java home. exiting with error - exit 1 -} - -setJavaHome - -SCP="" -DCP="" -UCP=`ls /usr/share/cloudstack-usage/cloud-usage-*.jar`":"`ls /usr/share/cloudstack-usage/lib/*.jar | tr '\n' ':'` -JCP="/usr/share/java/commons-daemon.jar":"/usr/share/java/mysql-connector-java.jar" - -# We need to append the JSVC daemon and mysql-connector JAR to the classpath -# AgentShell implements the JSVC daemon methods -export CLASSPATH="$SCP:$DCP:$UCP:$JCP:/etc/cloudstack/usage" - -start() { - if [ -s "$PIDFILE" ] && kill -0 $(cat "$PIDFILE") >/dev/null 2>&1; then - echo "$PROGNAME apparently already running" - exit 0 - fi - - if hostname --fqdn >/dev/null 2>&1 ; then - true - else - echo "The host name does not resolve properly to an IP address. Cannot start $PROGNAME" - exit 1 - fi - - echo -n "Starting $PROGNAME" "$SHORTNAME" - - if daemon --pidfile $PIDFILE $DAEMON -home "$JAVA_HOME" -cp "$CLASSPATH" -pidfile "$PIDFILE" -user "$USER" \ - -errfile $LOGDIR/cloudstack-usage.err -outfile $LOGDIR/cloudstack-usage.out -Dpid=$$ $CLASS - RETVAL=$? - then - rc=0 - sleep 1 - if ! kill -0 $(cat "$PIDFILE") >/dev/null 2>&1; then - failure - rc=1 - fi - else - rc=1 - fi - - if [ $rc -eq 0 ]; then - success - else - failure - rm -f "$PIDFILE" - fi - echo -} - -stop() { - echo -n "Stopping $PROGNAME" "$SHORTNAME" - killproc -p $PIDFILE $DAEMON - if [ "$?" -eq 0 ]; then - success - else - failure - fi - rm -f "$PIDFILE" - echo -} - -case "$1" in - start) - start - ;; - stop) - stop - ;; - status) - status -p $PIDFILE $SHORTNAME - RETVAL=$? - ;; - restart | force-reload) - stop - sleep 3 - start - ;; - *) - echo "Usage: $0 {start|stop|restart|force-reload|status}" - RETVAL=3 -esac - -exit $RETVAL - diff --git a/packaging/fedora21/cloud.spec b/packaging/fedora21/cloud.spec deleted file mode 100644 index a749d13254ef..000000000000 --- a/packaging/fedora21/cloud.spec +++ /dev/null @@ -1,655 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -%define __os_install_post %{nil} -%global debug_package %{nil} - -# DISABLE the post-percentinstall java repacking and line number stripping -# we need to find a way to just disable the java repacking and line number stripping, but not the autodeps - -Name: cloudstack -Summary: CloudStack IaaS Platform -#http://fedoraproject.org/wiki/PackageNamingGuidelines#Pre-Release_packages -%if "%{?_prerelease}" != "" -%define _maventag %{_ver}-SNAPSHOT -Release: %{_rel}%{dist} -%else -%define _maventag %{_ver} -Release: %{_rel}%{dist} -%endif - -%{!?python_sitearch: %define python_sitearch %(%{__python} -c "from distutils.sysconfig import get_python_lib; print(get_python_lib(1))")} - -Version: %{_ver} -License: ASL 2.0 -Vendor: Apache CloudStack -Packager: Apache CloudStack -Group: System Environment/Libraries -# FIXME do groups for every single one of the subpackages -Source0: %{name}-%{_maventag}.tgz -BuildRoot: %{_tmppath}/%{name}-%{_maventag}-%{release}-build - -BuildRequires: java-1.8.0-openjdk-devel -BuildRequires: tomcat -BuildRequires: ws-commons-util -BuildRequires: jpackage-utils -BuildRequires: gcc -BuildRequires: glibc-devel -BuildRequires: /usr/bin/mkisofs -BuildRequires: mysql-connector-python -#BuildRequires: maven => 3.0.0 - -%description -CloudStack is a highly-scalable elastic, open source, -intelligent IaaS cloud implementation. - -%package management -Summary: CloudStack management server UI -Requires: tomcat -Requires: java-1.8.0-openjdk -Requires: python -Requires: bash -Requires: bzip2 -Requires: gzip -Requires: unzip -Requires: /sbin/mount.nfs -Requires: openssh-clients -Requires: nfs-utils -Requires: wget -Requires: mysql -Requires: mysql-connector-java -Requires: ws-commons-util -Requires: jpackage-utils -Requires: sudo -Requires: /sbin/service -Requires: /sbin/chkconfig -Requires: /usr/bin/ssh-keygen -Requires: mkisofs -Requires: mysql-connector-python -Requires: python-paramiko -Requires: ipmitool -Requires: %{name}-common = %{_ver} -Obsoletes: cloud-client < 4.1.0 -Obsoletes: cloud-client-ui < 4.1.0 -Obsoletes: cloud-server < 4.1.0 -Obsoletes: cloud-test < 4.1.0 -Provides: cloud-client -Group: System Environment/Libraries -%description management -The CloudStack management server is the central point of coordination, -management, and intelligence in CloudStack. - -%package common -Summary: Apache CloudStack common files and scripts -Requires: python -Obsoletes: cloud-test < 4.1.0 -Obsoletes: cloud-scripts < 4.1.0 -Obsoletes: cloud-utils < 4.1.0 -Obsoletes: cloud-core < 4.1.0 -Obsoletes: cloud-deps < 4.1.0 -Obsoletes: cloud-python < 4.1.0 -Obsoletes: cloud-setup < 4.1.0 -Obsoletes: cloud-cli < 4.1.0 -Obsoletes: cloud-daemonize < 4.1.0 -Group: System Environment/Libraries -%description common -The Apache CloudStack files shared between agent and management server - -%package agent -Summary: CloudStack Agent for KVM hypervisors -Requires: openssh-clients -Requires: java-1.8.0-openjdk -Requires: %{name}-common = %{_ver} -Requires: libvirt -Requires: bridge-utils -Requires: ebtables -Requires: iptables -Requires: ethtool -Requires: vconfig -Requires: ipset -Requires: jsvc -Requires: jakarta-commons-daemon -Requires: jakarta-commons-daemon-jsvc -Requires: perl -Requires: libvirt-python -Requires: qemu-img -Requires: qemu-kvm -Requires: libcgroup-tools -Requires: net-tools -Provides: cloud-agent -Obsoletes: cloud-agent < 4.1.0 -Obsoletes: cloud-agent-libs < 4.1.0 -Obsoletes: cloud-test < 4.1.0 -Group: System Environment/Libraries -%description agent -The CloudStack agent for KVM hypervisors - -%package baremetal-agent -Summary: CloudStack baremetal agent -Requires: tftp-server -Requires: xinetd -Requires: syslinux -Requires: chkconfig -Requires: dhcp -Requires: httpd -Group: System Environment/Libraries -%description baremetal-agent -The CloudStack baremetal agent - -%package usage -Summary: CloudStack Usage calculation server -Requires: java-1.8.0-openjdk -Requires: jsvc -Requires: jakarta-commons-daemon -Requires: jakarta-commons-daemon-jsvc -Group: System Environment/Libraries -Obsoletes: cloud-usage < 4.1.0 -Provides: cloud-usage -%description usage -The CloudStack usage calculation service - -%package cli -Summary: Apache CloudStack CLI -Provides: python-cloudmonkey -Provides: python-marvin -Group: System Environment/Libraries -%description cli -Apache CloudStack command line interface - -%if "%{_ossnoss}" == "noredist" -%package mysql-ha -Summary: Apache CloudStack Balancing Strategy for MySQL -Requires: mysql-connector-java -Requires: tomcat -Group: System Environmnet/Libraries -%description mysql-ha -Apache CloudStack Balancing Strategy for MySQL - -%endif - -%prep -echo Doing CloudStack build - -%setup -q -n %{name}-%{_maventag} - -%build - -cp packaging/centos63/replace.properties build/replace.properties -echo VERSION=%{_maventag} >> build/replace.properties -echo PACKAGE=%{name} >> build/replace.properties -touch build/gitrev.txt -echo $(git rev-parse HEAD) > build/gitrev.txt - -if [ "%{_ossnoss}" == "NOREDIST" -o "%{_ossnoss}" == "noredist" ] ; then - echo "Executing mvn packaging with non-redistributable libraries" - if [ "%{_sim}" == "SIMULATOR" -o "%{_sim}" == "simulator" ] ; then - echo "Executing mvn noredist packaging with simulator ..." - mvn -Psystemvm -Dnoredist -Dsimulator clean package - else - echo "Executing mvn noredist packaging without simulator..." - mvn -Psystemvm -Dnoredist clean package - fi -else - if [ "%{_sim}" == "SIMULATOR" -o "%{_sim}" == "simulator" ] ; then - echo "Executing mvn default packaging simulator ..." - mvn -Psystemvm -Dsimulator clean package - else - echo "Executing mvn default packaging without simulator ..." - mvn -Psystemvm clean package - fi -fi - -%install -[ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT} -# Common directories -mkdir -p ${RPM_BUILD_ROOT}%{_bindir} -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/ipallocator -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/work -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/temp -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/mnt -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/management -mkdir -p ${RPM_BUILD_ROOT}%{_initrddir} -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d - -# Common -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/vms -mkdir -p ${RPM_BUILD_ROOT}%{python_sitearch}/ -mkdir -p ${RPM_BUILD_ROOT}%/usr/bin -cp -r scripts/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts -install -D systemvm/dist/systemvm.iso ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/vms/systemvm.iso -install python/lib/cloud_utils.py ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py -cp -r python/lib/cloudutils ${RPM_BUILD_ROOT}%{python_sitearch}/ -python -m py_compile ${RPM_BUILD_ROOT}%{python_sitearch}/cloud_utils.py -python -m compileall ${RPM_BUILD_ROOT}%{python_sitearch}/cloudutils -cp build/gitrev.txt ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts -cp packaging/centos63/cloudstack-sccs ${RPM_BUILD_ROOT}/usr/bin - -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts/network/cisco -cp -r plugins/network-elements/cisco-vnmc/scripts/network/cisco/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/scripts/network/cisco - -# Management -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/ -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management - -# Specific for tomcat -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost/client -ln -sf /usr/share/tomcat/bin ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/bin -ln -sf /etc/%{name}/management ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/conf -ln -sf /usr/share/tomcat/lib ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/lib -ln -sf /var/log/%{name}/management ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/logs -ln -sf /var/cache/%{name}/management/temp ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/temp -ln -sf /var/cache/%{name}/management/work ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/work - -/bin/touch ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management/catalina.out - -install -D client/target/utilities/bin/cloud-migrate-databases ${RPM_BUILD_ROOT}%{_bindir}/%{name}-migrate-databases -install -D client/target/utilities/bin/cloud-set-guest-password ${RPM_BUILD_ROOT}%{_bindir}/%{name}-set-guest-password -install -D client/target/utilities/bin/cloud-set-guest-sshkey ${RPM_BUILD_ROOT}%{_bindir}/%{name}-set-guest-sshkey -install -D client/target/utilities/bin/cloud-setup-databases ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-databases -install -D client/target/utilities/bin/cloud-setup-encryption ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-encryption -install -D client/target/utilities/bin/cloud-setup-management ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-management -install -D client/target/utilities/bin/cloud-setup-baremetal ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-baremetal -install -D client/target/utilities/bin/cloud-sysvmadm ${RPM_BUILD_ROOT}%{_bindir}/%{name}-sysvmadm -install -D client/target/utilities/bin/cloud-update-xenserver-licenses ${RPM_BUILD_ROOT}%{_bindir}/%{name}-update-xenserver-licenses - -cp -r client/target/utilities/scripts/db/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/setup -cp -r client/target/cloud-client-ui-%{_maventag}/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client - -# Don't package the scripts in the management webapp -rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/scripts -rm -rf ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/vms - -for name in db.properties log4j-cloud.xml tomcat6-nonssl.conf tomcat6-ssl.conf server-ssl.xml server-nonssl.xml \ - catalina.policy catalina.properties classpath.conf tomcat-users.xml web.xml environment.properties java.security.ciphers ; do - mv ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/$name \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/$name -done - -ln -s %{_sysconfdir}/%{name}/management/log4j-cloud.xml \ - ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/log4j-cloud.xml - -mv ${RPM_BUILD_ROOT}%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/context.xml \ - ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost/client - -install python/bindir/cloud-external-ipallocator.py ${RPM_BUILD_ROOT}%{_bindir}/%{name}-external-ipallocator.py -install -D client/target/pythonlibs/jasypt-1.9.2.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-common/lib/jasypt-1.9.2.jar - -install -D packaging/centos63/cloud-ipallocator.rc ${RPM_BUILD_ROOT}%{_initrddir}/%{name}-ipallocator -install -D packaging/centos63/cloud-management.rc ${RPM_BUILD_ROOT}%{_initrddir}/%{name}-management -install -D packaging/centos63/cloud-management.sysconfig ${RPM_BUILD_ROOT}%{_sysconfdir}/sysconfig/%{name}-management -install -D packaging/centos63/tomcat.sh ${RPM_BUILD_ROOT}%{_initrddir}/tomcat.sh -install -D server/target/conf/cloudstack-catalina.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-catalina - -chmod 440 ${RPM_BUILD_ROOT}%{_sysconfdir}/sudoers.d/%{name}-management -chmod 770 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina -chmod 770 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost -chmod 770 ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/management/Catalina/localhost/client -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/mnt -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/%{name}/management -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/work -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/cache/%{name}/management/temp -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/management -chmod 770 ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent - -# KVM Agent -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/agent -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/plugins -install -D packaging/centos63/cloud-agent.rc ${RPM_BUILD_ROOT}%{_sysconfdir}/init.d/%{name}-agent -install -D agent/target/transformed/agent.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/agent.properties -install -D agent/target/transformed/environment.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/environment.properties -install -D agent/target/transformed/log4j-cloud.xml ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/agent/log4j-cloud.xml -install -D agent/target/transformed/cloud-setup-agent ${RPM_BUILD_ROOT}%{_bindir}/%{name}-setup-agent -install -D agent/target/transformed/cloudstack-agent-upgrade ${RPM_BUILD_ROOT}%{_bindir}/%{name}-agent-upgrade -install -D agent/target/transformed/libvirtqemuhook ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib/libvirtqemuhook -install -D agent/target/transformed/cloud-ssh ${RPM_BUILD_ROOT}%{_bindir}/%{name}-ssh -install -D agent/target/transformed/cloudstack-agent-profile.sh ${RPM_BUILD_ROOT}%{_sysconfdir}/profile.d/%{name}-agent-profile.sh -install -D agent/target/transformed/cloudstack-agent.logrotate ${RPM_BUILD_ROOT}%{_sysconfdir}/logrotate.d/%{name}-agent -install -D plugins/hypervisors/kvm/target/cloud-plugin-hypervisor-kvm-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%name-agent/lib/cloud-plugin-hypervisor-kvm-%{_maventag}.jar -cp plugins/hypervisors/kvm/target/dependencies/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib - -# Usage server -mkdir -p ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage -mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib -install -D usage/target/cloud-usage-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/cloud-usage-%{_maventag}.jar -install -D usage/target/transformed/db.properties ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage/db.properties -install -D usage/target/transformed/log4j-cloud_usage.xml ${RPM_BUILD_ROOT}%{_sysconfdir}/%{name}/usage/log4j-cloud.xml -cp usage/target/dependencies/* ${RPM_BUILD_ROOT}%{_datadir}/%{name}-usage/lib/ -install -D packaging/centos63/cloud-usage.rc ${RPM_BUILD_ROOT}/%{_sysconfdir}/init.d/%{name}-usage -mkdir -p ${RPM_BUILD_ROOT}%{_localstatedir}/log/%{name}/usage/ - -# CLI -cp -r cloud-cli/cloudtool ${RPM_BUILD_ROOT}%{python_sitearch}/ -install cloud-cli/cloudapis/cloud.py ${RPM_BUILD_ROOT}%{python_sitearch}/cloudapis.py - -# MYSQL HA -if [ "x%{_ossnoss}" == "xnoredist" ] ; then - mkdir -p ${RPM_BUILD_ROOT}%{_datadir}/%{name}-mysql-ha/lib - cp -r plugins/database/mysql-ha/target/cloud-plugin-database-mysqlha-%{_maventag}.jar ${RPM_BUILD_ROOT}%{_datadir}/%{name}-mysql-ha/lib -fi - -#License files from whisker -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-management-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-management-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-common-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-common-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-agent-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-agent-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-usage-%{version}/LICENSE -install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/NOTICE -install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-cli-%{version}/LICENSE -if [ "x%{_ossnoss}" == "xnoredist" ] ; then - install -D tools/whisker/LICENSE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-mysql-ha-%{version}/LICENSE - install -D tools/whisker/NOTICE ${RPM_BUILD_ROOT}%{_defaultdocdir}/%{name}-mysql-ha-%{version}/NOTICE -fi - -%clean -[ ${RPM_BUILD_ROOT} != "/" ] && rm -rf ${RPM_BUILD_ROOT} - -%preun management -/sbin/service cloudstack-management stop || true -if [ "$1" == "0" ] ; then - /sbin/chkconfig --del cloudstack-management > /dev/null 2>&1 || true - /sbin/service cloudstack-management stop > /dev/null 2>&1 || true -fi - -%pre management -id cloud > /dev/null 2>&1 || /usr/sbin/useradd -M -c "CloudStack unprivileged user" \ - -r -s /bin/sh -d %{_localstatedir}/cloudstack/management cloud|| true - -# set max file descriptors for cloud user to 4096 -sed -i /"cloud hard nofile"/d /etc/security/limits.conf -sed -i /"cloud soft nofile"/d /etc/security/limits.conf -echo "cloud hard nofile 4096" >> /etc/security/limits.conf -echo "cloud soft nofile 4096" >> /etc/security/limits.conf -rm -rf %{_localstatedir}/cache/cloud -rm -rf %{_localstatedir}/cache/cloudstack -# user harcoded here, also hardcoded on wscript - -# save old configs if they exist (for upgrade). Otherwise we may lose them -# when the old packages are erased. There are a lot of properties files here. -if [ -d "%{_sysconfdir}/cloud" ] ; then - mv %{_sysconfdir}/cloud %{_sysconfdir}/cloud.rpmsave -fi - -# in case of upgrade to 4.9+ copy commands.properties if not exists in /etc/cloudstack/management/ -if [ "$1" == "2" ] ; then - if [ -f "%{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/commands.properties" ] && [ ! -f "%{_sysconfdir}/%{name}/management/commands.properties" ] ; then - cp -p %{_datadir}/%{name}-management/webapps/client/WEB-INF/classes/commands.properties %{_sysconfdir}/%{name}/management/commands.properties - fi -fi - -%post management -if [ "$1" == "1" ] ; then - /sbin/chkconfig --add cloudstack-management > /dev/null 2>&1 || true - /sbin/chkconfig --level 345 cloudstack-management on > /dev/null 2>&1 || true -fi - -if [ ! -f %{_datadir}/cloudstack-common/scripts/vm/hypervisor/xenserver/vhd-util ] ; then - echo Please download vhd-util from http://download.cloud.com.s3.amazonaws.com/tools/vhd-util and put it in - echo %{_datadir}/cloudstack-common/scripts/vm/hypervisor/xenserver/ -fi - -# change cloud user's home to 4.1+ version if needed. Would do this via 'usermod', but it -# requires that cloud user not be in use, so RPM could not be installed while management is running -if getent passwd cloud | grep -q /var/lib/cloud; then - sed -i 's/\/var\/lib\/cloud\/management/\/var\/cloudstack\/management/g' /etc/passwd -fi - -# if saved configs from upgrade exist, copy them over -if [ -f "%{_sysconfdir}/cloud.rpmsave/management/db.properties" ]; then - mv %{_sysconfdir}/%{name}/management/db.properties %{_sysconfdir}/%{name}/management/db.properties.rpmnew - cp -p %{_sysconfdir}/cloud.rpmsave/management/db.properties %{_sysconfdir}/%{name}/management - if [ -f "%{_sysconfdir}/cloud.rpmsave/management/key" ]; then - cp -p %{_sysconfdir}/cloud.rpmsave/management/key %{_sysconfdir}/%{name}/management - fi - # make sure we only do this on the first install of this RPM, don't want to overwrite on a reinstall - mv %{_sysconfdir}/cloud.rpmsave/management/db.properties %{_sysconfdir}/cloud.rpmsave/management/db.properties.rpmsave -fi - -# Choose server.xml and tomcat.conf links based on old config, if exists -serverxml=%{_sysconfdir}/%{name}/management/server.xml -oldserverxml=%{_sysconfdir}/cloud.rpmsave/management/server.xml -if [ -f $oldserverxml ] || [ -L $oldserverxml ]; then - if stat -c %N $oldserverxml| grep -q server-ssl ; then - if [ -f $serverxml ] || [ -L $serverxml ]; then rm -f $serverxml; fi - ln -s %{_sysconfdir}/%{name}/management/server-ssl.xml $serverxml - echo Please verify the server.xml in saved folder, and make the required changes manually , saved folder available at $oldserverxml - else - if [ -f $serverxml ] || [ -L $serverxml ]; then rm -f $serverxml; fi - ln -s %{_sysconfdir}/%{name}/management/server-nonssl.xml $serverxml - echo Please verify the server.xml in saved folder, and make the required changes manually , saved folder available at $oldserverxml - - fi -else - echo "Unable to determine ssl settings for server.xml, please run cloudstack-setup-management manually" -fi - - -tomcatconf=%{_sysconfdir}/%{name}/management/tomcat6.conf -oldtomcatconf=%{_sysconfdir}/cloud.rpmsave/management/tomcat6.conf -if [ -f $oldtomcatconf ] || [ -L $oldtomcatconf ] ; then - if stat -c %N $oldtomcatconf| grep -q tomcat6-ssl ; then - if [ -f $tomcatconf ] || [ -L $tomcatconf ]; then rm -f $tomcatconf; fi - ln -s %{_sysconfdir}/%{name}/management/tomcat6-ssl.conf $tomcatconf - echo Please verify the tomcat6.conf in saved folder, and make the required changes manually , saved folder available at $oldtomcatconf - else - if [ -f $tomcatconf ] || [ -L $tomcatconf ]; then rm -f $tomcatconf; fi - ln -s %{_sysconfdir}/%{name}/management/tomcat6-nonssl.conf $tomcatconf - echo Please verify the tomcat6.conf in saved folder, and make the required changes manually , saved folder available at $oldtomcatconf - fi -else - echo "Unable to determine ssl settings for tomcat.conf, please run cloudstack-setup-management manually" -fi - -if [ -f "%{_sysconfdir}/cloud.rpmsave/management/cloud.keystore" ]; then - cp -p %{_sysconfdir}/cloud.rpmsave/management/cloud.keystore %{_sysconfdir}/%{name}/management/cloudmanagementserver.keystore - # make sure we only do this on the first install of this RPM, don't want to overwrite on a reinstall - mv %{_sysconfdir}/cloud.rpmsave/management/cloud.keystore %{_sysconfdir}/cloud.rpmsave/management/cloud.keystore.rpmsave -fi - -%preun agent -/sbin/service cloudstack-agent stop || true -if [ "$1" == "0" ] ; then - /sbin/chkconfig --del cloudstack-agent > /dev/null 2>&1 || true - /sbin/service cloudstack-agent stop > /dev/null 2>&1 || true -fi - -%pre agent - -# save old configs if they exist (for upgrade). Otherwise we may lose them -# when the old packages are erased. There are a lot of properties files here. -if [ -d "%{_sysconfdir}/cloud" ] ; then - mv %{_sysconfdir}/cloud %{_sysconfdir}/cloud.rpmsave -fi - -%post agent -if [ "$1" == "1" ] ; then - echo "Running %{_bindir}/%{name}-agent-upgrade to update bridge name for upgrade from CloudStack 4.0.x (and before) to CloudStack 4.1 (and later)" - %{_bindir}/%{name}-agent-upgrade - if [ ! -d %{_sysconfdir}/libvirt/hooks ] ; then - mkdir %{_sysconfdir}/libvirt/hooks - fi - cp -a ${RPM_BUILD_ROOT}%{_datadir}/%{name}-agent/lib/libvirtqemuhook %{_sysconfdir}/libvirt/hooks/qemu - /sbin/service libvirtd restart - /sbin/chkconfig --add cloudstack-agent > /dev/null 2>&1 || true - /sbin/chkconfig --level 345 cloudstack-agent on > /dev/null 2>&1 || true -fi - -# if saved configs from upgrade exist, copy them over -if [ -f "%{_sysconfdir}/cloud.rpmsave/agent/agent.properties" ]; then - mv %{_sysconfdir}/%{name}/agent/agent.properties %{_sysconfdir}/%{name}/agent/agent.properties.rpmnew - cp -p %{_sysconfdir}/cloud.rpmsave/agent/agent.properties %{_sysconfdir}/%{name}/agent - # make sure we only do this on the first install of this RPM, don't want to overwrite on a reinstall - mv %{_sysconfdir}/cloud.rpmsave/agent/agent.properties %{_sysconfdir}/cloud.rpmsave/agent/agent.properties.rpmsave -fi - -%preun usage -/sbin/service cloudstack-usage stop || true -if [ "$1" == "0" ] ; then - /sbin/chkconfig --del cloudstack-usage > /dev/null 2>&1 || true - /sbin/service cloudstack-usage stop > /dev/null 2>&1 || true -fi - -%post usage -if [ -f "%{_sysconfdir}/%{name}/management/db.properties" ]; then - echo Replacing db.properties with management server db.properties - rm -f %{_sysconfdir}/%{name}/usage/db.properties - ln -s %{_sysconfdir}/%{name}/management/db.properties %{_sysconfdir}/%{name}/usage/db.properties - /sbin/chkconfig --add cloudstack-usage > /dev/null 2>&1 || true - /sbin/chkconfig --level 345 cloudstack-usage on > /dev/null 2>&1 || true -fi - -if [ -f "%{_sysconfdir}/%{name}/management/key" ]; then - echo Replacing key with management server key - rm -f %{_sysconfdir}/%{name}/usage/key - ln -s %{_sysconfdir}/%{name}/management/key %{_sysconfdir}/%{name}/usage/key -fi - -#No default permission as the permission setup is complex -%files management -%defattr(-,root,root,-) -%dir %attr(0770,root,cloud) %{_sysconfdir}/%{name}/management/Catalina -%dir %attr(0770,root,cloud) %{_sysconfdir}/%{name}/management/Catalina/localhost -%dir %attr(0770,root,cloud) %{_sysconfdir}/%{name}/management/Catalina/localhost/client -%dir %{_datadir}/%{name}-management -%dir %attr(0770,root,cloud) %{_localstatedir}/%{name}/mnt -%dir %attr(0770,cloud,cloud) %{_localstatedir}/%{name}/management -%dir %attr(0770,root,cloud) %{_localstatedir}/cache/%{name}/management -%dir %attr(0770,root,cloud) %{_localstatedir}/cache/%{name}/management/work -%dir %attr(0770,root,cloud) %{_localstatedir}/cache/%{name}/management/temp -%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/management -%config(noreplace) %{_sysconfdir}/sysconfig/%{name}-management -%config(noreplace) %attr(0640,root,cloud) %{_sysconfdir}/%{name}/management/db.properties -%config(noreplace) %{_sysconfdir}/%{name}/management/log4j-cloud.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/tomcat6-nonssl.conf -%config(noreplace) %{_sysconfdir}/%{name}/management/tomcat6-ssl.conf -%config(noreplace) %{_sysconfdir}/%{name}/management/Catalina/localhost/client/context.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/catalina.policy -%config(noreplace) %{_sysconfdir}/%{name}/management/catalina.properties -%config(noreplace) %{_sysconfdir}/%{name}/management/classpath.conf -%config(noreplace) %{_sysconfdir}/%{name}/management/server-nonssl.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/server-ssl.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/tomcat-users.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/web.xml -%config(noreplace) %{_sysconfdir}/%{name}/management/environment.properties -%config(noreplace) %{_sysconfdir}/%{name}/management/java.security.ciphers -%config(noreplace) %{_sysconfdir}/%{name}/management/commons-logging.properties -%attr(0755,root,root) %{_initrddir}/%{name}-management -%attr(0755,root,root) %{_initrddir}/tomcat.sh - -%attr(0755,root,root) %{_bindir}/%{name}-setup-management -%attr(0755,root,root) %{_bindir}/%{name}-update-xenserver-licenses -%{_datadir}/%{name}-management/webapps -%{_datadir}/%{name}-management/bin -%{_datadir}/%{name}-management/conf -%{_datadir}/%{name}-management/lib -%{_datadir}/%{name}-management/logs -%{_datadir}/%{name}-management/temp -%{_datadir}/%{name}-management/work -%attr(0755,root,root) %{_bindir}/%{name}-setup-databases -%attr(0755,root,root) %{_bindir}/%{name}-migrate-databases -%attr(0755,root,root) %{_bindir}/%{name}-set-guest-password -%attr(0755,root,root) %{_bindir}/%{name}-set-guest-sshkey -%attr(0755,root,root) %{_bindir}/%{name}-sysvmadm -%attr(0755,root,root) %{_bindir}/%{name}-setup-encryption -%{_datadir}/%{name}-management/setup/*.sql -%{_datadir}/%{name}-management/setup/db/*.sql -%{_datadir}/%{name}-management/setup/*.sh -%{_datadir}/%{name}-management/setup/server-setup.xml -%attr(0755,root,root) %{_bindir}/%{name}-external-ipallocator.py -%attr(0755,root,root) %{_initrddir}/%{name}-ipallocator -%dir %attr(0770,root,root) %{_localstatedir}/log/%{name}/ipallocator -%{_defaultdocdir}/%{name}-management-%{version}/LICENSE -%{_defaultdocdir}/%{name}-management-%{version}/NOTICE -%attr(0644,cloud,cloud) %{_localstatedir}/log/%{name}/management/catalina.out -%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-catalina - -%files agent -%attr(0755,root,root) %{_bindir}/%{name}-setup-agent -%attr(0755,root,root) %{_bindir}/%{name}-agent-upgrade -%attr(0755,root,root) %{_bindir}/%{name}-ssh -%attr(0755,root,root) %{_sysconfdir}/init.d/%{name}-agent -%attr(0644,root,root) %{_sysconfdir}/profile.d/%{name}-agent-profile.sh -%attr(0644,root,root) %{_sysconfdir}/logrotate.d/%{name}-agent -%attr(0755,root,root) %{_datadir}/%{name}-common/scripts/network/cisco -%config(noreplace) %{_sysconfdir}/%{name}/agent -%dir %{_localstatedir}/log/%{name}/agent -%attr(0644,root,root) %{_datadir}/%{name}-agent/lib/*.jar -%attr(0755,root,root) %{_datadir}/%{name}-agent/lib/libvirtqemuhook -%dir %{_datadir}/%{name}-agent/plugins -%{_defaultdocdir}/%{name}-agent-%{version}/LICENSE -%{_defaultdocdir}/%{name}-agent-%{version}/NOTICE - -%files common -%dir %attr(0755,root,root) %{python_sitearch}/cloudutils -%dir %attr(0755,root,root) %{_datadir}/%{name}-common/vms -%attr(0755,root,root) %{_datadir}/%{name}-common/scripts -%attr(0755,root,root) /usr/bin/cloudstack-sccs -%attr(0644, root, root) %{_datadir}/%{name}-common/vms/systemvm.iso -%attr(0644,root,root) %{python_sitearch}/cloud_utils.py -%attr(0644,root,root) %{python_sitearch}/cloud_utils.pyc -%attr(0644,root,root) %{python_sitearch}/cloudutils/* -%attr(0644, root, root) %{_datadir}/%{name}-common/lib/jasypt-1.9.2.jar -%{_defaultdocdir}/%{name}-common-%{version}/LICENSE -%{_defaultdocdir}/%{name}-common-%{version}/NOTICE - -%files usage -%attr(0755,root,root) %{_sysconfdir}/init.d/%{name}-usage -%attr(0644,root,root) %{_datadir}/%{name}-usage/*.jar -%attr(0644,root,root) %{_datadir}/%{name}-usage/lib/*.jar -%dir %attr(0770,root,cloud) %{_localstatedir}/log/%{name}/usage -%attr(0644,root,root) %{_sysconfdir}/%{name}/usage/db.properties -%attr(0644,root,root) %{_sysconfdir}/%{name}/usage/log4j-cloud.xml -%{_defaultdocdir}/%{name}-usage-%{version}/LICENSE -%{_defaultdocdir}/%{name}-usage-%{version}/NOTICE - -%files cli -%attr(0644,root,root) %{python_sitearch}/cloudapis.py -%attr(0644,root,root) %{python_sitearch}/cloudtool/__init__.py -%attr(0644,root,root) %{python_sitearch}/cloudtool/utils.py -%{_defaultdocdir}/%{name}-cli-%{version}/LICENSE -%{_defaultdocdir}/%{name}-cli-%{version}/NOTICE - -%if "%{_ossnoss}" == "noredist" -%files mysql-ha -%defattr(0644,cloud,cloud,0755) -%attr(0644,root,root) %{_datadir}/%{name}-mysql-ha/lib/* -%{_defaultdocdir}/%{name}-mysql-ha-%{version}/LICENSE -%{_defaultdocdir}/%{name}-mysql-ha-%{version}/NOTICE -%endif - -%files baremetal-agent -%attr(0755,root,root) %{_bindir}/cloudstack-setup-baremetal - -%changelog -* Thu Apr 30 2015 Rohit Yadav 4.6.0 -- Remove awsapi package - -* Fri Jul 04 2014 Hugo Trippaers 4.5.0 -- Add a package for the mysql ha module - -* Wed Oct 03 2012 Hugo Trippaers 4.1.0 -- new style spec file diff --git a/packaging/fedora21/cloudstack-agent.te b/packaging/fedora21/cloudstack-agent.te deleted file mode 100644 index 4259e173a46f..000000000000 --- a/packaging/fedora21/cloudstack-agent.te +++ /dev/null @@ -1,33 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -module cloudstack-agent 1.0; - -require { - type nfs_t; - type system_conf_t; - type mount_t; - type qemu_t; - class file unlink; - class filesystem getattr; -} - -#============= mount_t ============== -allow mount_t system_conf_t:file unlink; - -#============= qemu_t ============== -allow qemu_t nfs_t:filesystem getattr; diff --git a/packaging/fedora21/replace.properties b/packaging/fedora21/replace.properties deleted file mode 100644 index bdf6e223b596..000000000000 --- a/packaging/fedora21/replace.properties +++ /dev/null @@ -1,59 +0,0 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. - -DBUSER=cloud -DBPW=cloud -DBROOTPW= -MSLOG=vmops.log -APISERVERLOG=api.log -DBHOST=localhost -DBDRIVER=jdbc:mysql -COMPONENTS-SPEC=components-premium.xml -REMOTEHOST=localhost -AGENTCLASSPATH= -AGENTLOG=/var/log/cloudstack/agent/agent.log -AGENTLOGDIR=/var/log/cloudstack/agent/ -AGENTSYSCONFDIR=/etc/cloudstack/agent -APISERVERLOG=/var/log/cloudstack/management/apilog.log -BINDIR=/usr/bin -COMMONLIBDIR=/usr/share/cloudstack-common -CONFIGUREVARS= -DEPSCLASSPATH= -DOCDIR= -IPALOCATORLOG=/var/log/cloudstack/management/ipallocator.log -JAVADIR=/usr/share/java -LIBEXECDIR=/usr/libexec -LOCKDIR=/var/lock -MSCLASSPATH= -MSCONF=/etc/cloudstack/management -MSENVIRON=/usr/share/cloudstack-management -MSLOG=/var/log/cloudstack/management/management-server.log -MSLOGDIR=/var/log/cloudstack/management/ -MSMNTDIR=/var/cloudstack/mnt -MSUSER=cloud -PIDDIR=/var/run -PLUGINJAVADIR=/usr/share/cloudstack-management/plugin -PREMIUMJAVADIR=/usr/share/cloudstack-management/premium -PYTHONDIR=/usr/lib/python2.6/site-packages/ -SERVERSYSCONFDIR=/etc/sysconfig -SETUPDATADIR=/usr/share/cloudstack-management/setup -SYSCONFDIR=/etc/sysconfig -SYSTEMCLASSPATH= -SYSTEMJARS= -USAGECLASSPATH= -USAGELOG=/var/log/cloudstack/usage/usage.log -USAGESYSCONFDIR=/etc/sysconfig diff --git a/packaging/systemd/cloudstack-management.default b/packaging/systemd/cloudstack-management.default index 6e5fcf9d8d69..fbdb25634a16 100644 --- a/packaging/systemd/cloudstack-management.default +++ b/packaging/systemd/cloudstack-management.default @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -15,35 +15,21 @@ # specific language governing permissions and limitations # under the License. -# Required for a tocmat cloned service -SERVICE_NAME=cloudstack-management - # Where your java installation lives #JAVA_HOME="/usr/lib/jvm/java" -# Where your cloudstack-management installation lives -CATALINA_BASE="/usr/share/cloudstack-management" -CATALINA_HOME="/usr/share/cloudstack-management" -JASPER_HOME="/usr/share/cloudstack-management" -CATALINA_TMPDIR="/usr/share/cloudstack-management/temp" - - -if [ -r "/etc/cloudstack/management/cloudmanagementserver.keystore" ] ; then - JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote=false -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/cloudstack/management/ -XX:PermSize=512M -XX:MaxPermSize=800m -Djavax.net.ssl.trustStore=/etc/cloudstack/management/cloudmanagementserver.keystore -Djavax.net.ssl.trustStorePassword=vmops.com " +if [ -r "/etc/cloudstack/management/cloud.jks" ] ; then + JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote=false -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/cloudstack/management/ -XX:PermSize=512M -XX:MaxPermSize=800m -Djavax.net.ssl.trustStore=/etc/cloudstack/management/cloud.jks -Djavax.net.ssl.trustStorePassword=vmops.com -Djava.security.properties=/etc/cloudstack/management/java.security.ciphers " else - JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote=false -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/cloudstack/management/ -XX:PermSize=512M -XX:MaxPermSize=800m" + JAVA_OPTS="-Djava.awt.headless=true -Dcom.sun.management.jmxremote=false -Xmx2g -XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/var/log/cloudstack/management/ -XX:PermSize=512M -XX:MaxPermSize=800m -Djava.security.properties=/etc/cloudstack/management/java.security.ciphers " fi -TOMCAT_USER="cloud" - -SECURITY_MANAGER="false" - -SHUTDOWN_WAIT="30" +CLOUDSTACK_USER="cloud" -SHUTDOWN_VERBOSE="false" +CLOUDSTACK_PID="/var/run/cloudstack-management.pid" -# Set the TOMCAT_PID location -CATALINA_PID="/var/run/cloudstack-management.pid" +LOGDIR="/var/log/cloudstack/management" -CLASSPATH=/etc/cloudstack/management:/usr/share/cloudstack-common:/usr/share/cloudstack-management/setup +CLASSPATH="/etc/cloudstack/management:/usr/share/cloudstack-common:/usr/share/cloudstack-management/setup:/usr/share/cloudstack-management:/usr/share/java/mysql-connector-java.jar:/usr/share/java/commons-daemon.jar" +BOOTSTRAP_CLASS=org.apache.cloudstack.ServerDaemon diff --git a/packaging/systemd/cloudstack-management.service b/packaging/systemd/cloudstack-management.service index c1ede4bed80c..afcea8ca6f62 100644 --- a/packaging/systemd/cloudstack-management.service +++ b/packaging/systemd/cloudstack-management.service @@ -16,8 +16,6 @@ # under the License. # Systemd unit file for CloudStack Management server -# -# clone tomcat service, see /usr/lib/systemd/system/tomcat.service [Unit] Description=CloudStack Management Server @@ -25,16 +23,14 @@ After=syslog.target network.target [Service] UMask=0022 -Type=simple -EnvironmentFile=/etc/tomcat/tomcat.conf +Type=forking Environment="NAME=cloudstack-management" -EnvironmentFile=-/etc/default/cloudstack-management -ExecStart=/usr/libexec/tomcat/server start -ExecStop=/usr/libexec/tomcat/server stop +EnvironmentFile=/etc/default/cloudstack-management +ExecStartPre=/bin/bash -c "/bin/systemctl set-environment JAVA_HOME=$( readlink -f $( which java ) | sed s:bin/.*$:: )" +ExecStartPre=/bin/bash -c "/bin/systemctl set-environment JARS=$(ls /usr/share/cloudstack-management/lib/*.jar | tr '\n' ':' | sed s'/.$//')" +ExecStart=/usr/bin/jsvc -home "${JAVA_HOME}" -user "${CLOUDSTACK_USER}" -cp "${JARS}:${CLASSPATH}" -errfile ${LOGDIR}/${NAME}.err -cwd ${LOGDIR} -pidfile "${CLOUDSTACK_PID}" ${JAVA_OPTS} "${BOOTSTRAP_CLASS}" +ExecStop=/usr/bin/jsvc -cp "$JARS:$CLASSPATH" -pidfile "$CLOUDSTACK_PID" -stop "$BOOTSTRAP_CLASS" SuccessExitStatus=143 -User=cloud -Group=cloud [Install] WantedBy=multi-user.target - diff --git a/plugins/acl/dynamic-role-based/pom.xml b/plugins/acl/dynamic-role-based/pom.xml index 0d3d6ff76199..3a64428617ba 100644 --- a/plugins/acl/dynamic-role-based/pom.xml +++ b/plugins/acl/dynamic-role-based/pom.xml @@ -26,7 +26,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/acl/dynamic-role-based/resources/META-INF/cloudstack/acl-dynamic-role-based/spring-acl-dynamic-role-based-context.xml b/plugins/acl/dynamic-role-based/resources/META-INF/cloudstack/acl-dynamic-role-based/spring-acl-dynamic-role-based-context.xml index 9ffe465a9aa7..e270743fbd46 100644 --- a/plugins/acl/dynamic-role-based/resources/META-INF/cloudstack/acl-dynamic-role-based/spring-acl-dynamic-role-based-context.xml +++ b/plugins/acl/dynamic-role-based/resources/META-INF/cloudstack/acl-dynamic-role-based/spring-acl-dynamic-role-based-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/acl/dynamic-role-based/src/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java b/plugins/acl/dynamic-role-based/src/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java index 754d4cc86a56..d10c191151f2 100644 --- a/plugins/acl/dynamic-role-based/src/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java +++ b/plugins/acl/dynamic-role-based/src/org/apache/cloudstack/acl/DynamicRoleBasedAPIAccessChecker.java @@ -16,6 +16,18 @@ // under the License. package org.apache.cloudstack.acl; +import java.util.HashMap; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; + +import com.cloud.exception.UnavailableCommandException; +import org.apache.cloudstack.api.APICommand; + import com.cloud.exception.PermissionDeniedException; import com.cloud.user.Account; import com.cloud.user.AccountService; @@ -23,18 +35,7 @@ import com.cloud.utils.component.AdapterBase; import com.cloud.utils.component.PluggableService; import com.google.common.base.Strings; -import org.apache.cloudstack.api.APICommand; - -import javax.ejb.Local; -import javax.inject.Inject; -import javax.naming.ConfigurationException; -import java.util.HashMap; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -@Local(value = APIChecker.class) public class DynamicRoleBasedAPIAccessChecker extends AdapterBase implements APIChecker { @Inject @@ -53,8 +54,7 @@ protected DynamicRoleBasedAPIAccessChecker() { } private void denyApiAccess(final String commandName) throws PermissionDeniedException { - throw new PermissionDeniedException("The API does not exist or is blacklisted for the account's role. " + - "The account with is not allowed to request the api: " + commandName); + throw new PermissionDeniedException("The API " + commandName + " is blacklisted for the account's role."); } public boolean isDisabled() { @@ -99,8 +99,7 @@ public boolean checkAccess(User user, String commandName) throws PermissionDenie } // Default deny all - denyApiAccess(commandName); - return false; + throw new UnavailableCommandException("The API " + commandName + " does not exist or is not available for this account."); } public void addApiToRoleBasedAnnotationsMap(final RoleType roleType, final String commandName) { diff --git a/plugins/acl/static-role-based/pom.xml b/plugins/acl/static-role-based/pom.xml index 3f31282c4f5f..1d3dc3188a67 100644 --- a/plugins/acl/static-role-based/pom.xml +++ b/plugins/acl/static-role-based/pom.xml @@ -26,7 +26,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/acl/static-role-based/resources/META-INF/cloudstack/acl-static-role-based/spring-acl-static-role-based-context.xml b/plugins/acl/static-role-based/resources/META-INF/cloudstack/acl-static-role-based/spring-acl-static-role-based-context.xml index 0b222837f4c0..633602e76c15 100644 --- a/plugins/acl/static-role-based/resources/META-INF/cloudstack/acl-static-role-based/spring-acl-static-role-based-context.xml +++ b/plugins/acl/static-role-based/resources/META-INF/cloudstack/acl-static-role-based/spring-acl-static-role-based-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java b/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java index fc78268fc624..4a33a0876c3c 100644 --- a/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java +++ b/plugins/acl/static-role-based/src/org/apache/cloudstack/acl/StaticRoleBasedAPIAccessChecker.java @@ -25,6 +25,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import com.cloud.exception.UnavailableCommandException; import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; @@ -39,11 +40,13 @@ // This is the default API access checker that grab's the user's account // based on the account type, access is granted +@Deprecated public class StaticRoleBasedAPIAccessChecker extends AdapterBase implements APIChecker { protected static final Logger LOGGER = Logger.getLogger(StaticRoleBasedAPIAccessChecker.class); private Set commandPropertyFiles = new HashSet(); + private Set commandNames = new HashSet(); private Set commandsPropertiesOverrides = new HashSet(); private Map> commandsPropertiesRoleBasedApisMap = new HashMap>(); private Map> annotationRoleBasedApisMap = new HashMap>(); @@ -86,7 +89,11 @@ public boolean checkAccess(User user, String commandName) throws PermissionDenie return true; } - throw new PermissionDeniedException("The API does not exist or is blacklisted. Role type=" + roleType.toString() + " is not allowed to request the api: " + commandName); + if (commandNames.contains(commandName)) { + throw new PermissionDeniedException("The API is blacklisted. Role type=" + roleType.toString() + " is not allowed to request the api: " + commandName); + } else { + throw new UnavailableCommandException("The API " + commandName + " does not exist or is not available for this account."); + } } @Override @@ -109,6 +116,9 @@ public boolean start() { if (!commands.contains(command.name())) commands.add(command.name()); } + if (!commandNames.contains(command.name())) { + commandNames.add(command.name()); + } } } return super.start(); @@ -118,6 +128,9 @@ private void processMapping(Map configMap) { for (Map.Entry entry : configMap.entrySet()) { String apiName = entry.getKey(); String roleMask = entry.getValue(); + if (!commandNames.contains(apiName)) { + commandNames.add(apiName); + } commandsPropertiesOverrides.add(apiName); try { short cmdPermissions = Short.parseShort(roleMask); diff --git a/plugins/affinity-group-processors/explicit-dedication/pom.xml b/plugins/affinity-group-processors/explicit-dedication/pom.xml index 03d4a90001c8..4a7261e7e0cb 100644 --- a/plugins/affinity-group-processors/explicit-dedication/pom.xml +++ b/plugins/affinity-group-processors/explicit-dedication/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/affinity-group-processors/explicit-dedication/resources/META-INF/cloudstack/explicit-dedication/spring-explicit-dedication-context.xml b/plugins/affinity-group-processors/explicit-dedication/resources/META-INF/cloudstack/explicit-dedication/spring-explicit-dedication-context.xml index 5864f9477657..7e98c3880267 100644 --- a/plugins/affinity-group-processors/explicit-dedication/resources/META-INF/cloudstack/explicit-dedication/spring-explicit-dedication-context.xml +++ b/plugins/affinity-group-processors/explicit-dedication/resources/META-INF/cloudstack/explicit-dedication/spring-explicit-dedication-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > + + 4.0.0 + Apache CloudStack Plugin - Host Affinity Processor + cloud-plugin-host-affinity + + cloudstack-plugins + org.apache.cloudstack + 4.11.1.0-SNAPSHOT + ../../pom.xml + + + install + src + + \ No newline at end of file diff --git a/plugins/affinity-group-processors/host-affinity/resources/META-INF/cloudstack/host-affinity/module.properties b/plugins/affinity-group-processors/host-affinity/resources/META-INF/cloudstack/host-affinity/module.properties new file mode 100644 index 000000000000..fe0d91b7c123 --- /dev/null +++ b/plugins/affinity-group-processors/host-affinity/resources/META-INF/cloudstack/host-affinity/module.properties @@ -0,0 +1,18 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. +name=host-affinity +parent=planner \ No newline at end of file diff --git a/plugins/affinity-group-processors/host-affinity/resources/META-INF/cloudstack/host-affinity/spring-host-affinity-context.xml b/plugins/affinity-group-processors/host-affinity/resources/META-INF/cloudstack/host-affinity/spring-host-affinity-context.xml new file mode 100644 index 000000000000..3d42e80b2774 --- /dev/null +++ b/plugins/affinity-group-processors/host-affinity/resources/META-INF/cloudstack/host-affinity/spring-host-affinity-context.xml @@ -0,0 +1,35 @@ + + + + + + + + \ No newline at end of file diff --git a/plugins/affinity-group-processors/host-affinity/src/org/apache/cloudstack/affinity/HostAffinityProcessor.java b/plugins/affinity-group-processors/host-affinity/src/org/apache/cloudstack/affinity/HostAffinityProcessor.java new file mode 100644 index 000000000000..055a6442e1af --- /dev/null +++ b/plugins/affinity-group-processors/host-affinity/src/org/apache/cloudstack/affinity/HostAffinityProcessor.java @@ -0,0 +1,127 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.affinity; + +import java.util.List; +import java.util.Set; +import java.util.HashSet; +import java.util.ArrayList; + +import javax.inject.Inject; + +import com.cloud.vm.VMInstanceVO; +import org.apache.commons.collections.CollectionUtils; +import org.apache.log4j.Logger; + +import org.apache.cloudstack.affinity.dao.AffinityGroupDao; +import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; + +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.deploy.DeploymentPlanner.ExcludeList; +import com.cloud.exception.AffinityConflictException; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.VMInstanceDao; + +public class HostAffinityProcessor extends AffinityProcessorBase implements AffinityGroupProcessor { + + private static final Logger s_logger = Logger.getLogger(HostAffinityProcessor.class); + + @Inject + protected VMInstanceDao _vmInstanceDao; + @Inject + protected AffinityGroupDao _affinityGroupDao; + @Inject + protected AffinityGroupVMMapDao _affinityGroupVMMapDao; + + @Override + public void process(VirtualMachineProfile vmProfile, DeploymentPlan plan, ExcludeList avoid) throws AffinityConflictException { + VirtualMachine vm = vmProfile.getVirtualMachine(); + List vmGroupMappings = _affinityGroupVMMapDao.findByVmIdType(vm.getId(), getType()); + if (CollectionUtils.isNotEmpty(vmGroupMappings)) { + for (AffinityGroupVMMapVO vmGroupMapping : vmGroupMappings) { + processAffinityGroup(vmGroupMapping, plan, vm); + } + } + } + + /** + * Process Affinity Group for VM deployment + */ + protected void processAffinityGroup(AffinityGroupVMMapVO vmGroupMapping, DeploymentPlan plan, VirtualMachine vm) { + AffinityGroupVO group = _affinityGroupDao.findById(vmGroupMapping.getAffinityGroupId()); + s_logger.debug("Processing affinity group " + group.getName() + " for VM Id: " + vm.getId()); + + List groupVMIds = _affinityGroupVMMapDao.listVmIdsByAffinityGroup(group.getId()); + groupVMIds.remove(vm.getId()); + + List preferredHosts = getPreferredHostsFromGroupVMIds(groupVMIds); + plan.setPreferredHosts(preferredHosts); + } + + /** + * Get host ids set from vm ids list + */ + protected Set getHostIdSet(List vmIds) { + Set hostIds = new HashSet<>(); + for (Long groupVMId : vmIds) { + VMInstanceVO groupVM = _vmInstanceDao.findById(groupVMId); + hostIds.add(groupVM.getHostId()); + } + return hostIds; + } + + /** + * Get preferred host ids list from the affinity group VMs + */ + protected List getPreferredHostsFromGroupVMIds(List vmIds) { + return new ArrayList<>(getHostIdSet(vmIds)); + } + + @Override + public boolean check(VirtualMachineProfile vmProfile, DeployDestination plannedDestination) throws AffinityConflictException { + if (plannedDestination.getHost() == null) { + return true; + } + long plannedHostId = plannedDestination.getHost().getId(); + VirtualMachine vm = vmProfile.getVirtualMachine(); + List vmGroupMappings = _affinityGroupVMMapDao.findByVmIdType(vm.getId(), getType()); + + if (CollectionUtils.isNotEmpty(vmGroupMappings)) { + for (AffinityGroupVMMapVO vmGroupMapping : vmGroupMappings) { + if (!checkAffinityGroup(vmGroupMapping, vm, plannedHostId)) { + return false; + } + } + } + + return true; + } + + /** + * Check Affinity Group + */ + protected boolean checkAffinityGroup(AffinityGroupVMMapVO vmGroupMapping, VirtualMachine vm, long plannedHostId) { + List groupVMIds = _affinityGroupVMMapDao.listVmIdsByAffinityGroup(vmGroupMapping.getAffinityGroupId()); + groupVMIds.remove(vm.getId()); + + Set hostIds = getHostIdSet(groupVMIds); + return CollectionUtils.isEmpty(hostIds) || hostIds.contains(plannedHostId); + } + +} diff --git a/plugins/affinity-group-processors/host-affinity/test/org/apache/cloudstack/affinity/HostAffinityProcessorTest.java b/plugins/affinity-group-processors/host-affinity/test/org/apache/cloudstack/affinity/HostAffinityProcessorTest.java new file mode 100644 index 000000000000..5dc9270e69ee --- /dev/null +++ b/plugins/affinity-group-processors/host-affinity/test/org/apache/cloudstack/affinity/HostAffinityProcessorTest.java @@ -0,0 +1,176 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.affinity; + +import com.cloud.deploy.DeployDestination; +import com.cloud.deploy.DeploymentPlan; +import com.cloud.host.Host; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.VirtualMachineProfile; +import com.cloud.vm.dao.VMInstanceDao; +import org.apache.cloudstack.affinity.dao.AffinityGroupDao; +import org.apache.cloudstack.affinity.dao.AffinityGroupVMMapDao; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.junit.runners.JUnit4; +import org.mockito.InjectMocks; +import org.mockito.Mock; +import org.mockito.MockitoAnnotations; +import org.mockito.Spy; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.mockito.Matchers.any; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +@RunWith(JUnit4.class) +public class HostAffinityProcessorTest { + + private static final long AFFINITY_GROUP_ID = 2L; + private static final String AFFINITY_GROUP_NAME = "Host affinity group"; + private static final Long VM_ID = 3L; + private static final Long GROUP_VM_1_ID = 1L; + private static final Long GROUP_VM_2_ID = 2L; + private static final Long HOST_ID = 1L; + private static final Long HOST_2_ID = 2L; + + @Mock + AffinityGroupDao affinityGroupDao; + + @Mock + AffinityGroupVMMapDao affinityGroupVMMapDao; + + @Mock + VMInstanceDao vmInstanceDao; + + @Spy + @InjectMocks + HostAffinityProcessor processor = new HostAffinityProcessor(); + + @Mock + DeploymentPlan plan; + + @Mock + VirtualMachine vm; + + @Mock + VMInstanceVO groupVM1; + + @Mock + VMInstanceVO groupVM2; + + @Mock + AffinityGroupVO affinityGroupVO; + + @Mock + AffinityGroupVMMapVO mapVO; + + @Mock + DeployDestination dest; + + @Mock + Host host; + + @Mock + VirtualMachineProfile profile; + + @Before + public void setup() { + MockitoAnnotations.initMocks(this); + + when(groupVM1.getHostId()).thenReturn(HOST_ID); + when(groupVM2.getHostId()).thenReturn(HOST_ID); + when(vmInstanceDao.findById(GROUP_VM_1_ID)).thenReturn(groupVM1); + when(vmInstanceDao.findById(GROUP_VM_2_ID)).thenReturn(groupVM2); + + when(affinityGroupVMMapDao.listVmIdsByAffinityGroup(AFFINITY_GROUP_ID)).thenReturn(new ArrayList<>(Arrays.asList(GROUP_VM_1_ID, GROUP_VM_2_ID, VM_ID))); + + when(vm.getId()).thenReturn(VM_ID); + + when(affinityGroupVO.getId()).thenReturn(AFFINITY_GROUP_ID); + when(affinityGroupVO.getName()).thenReturn(AFFINITY_GROUP_NAME); + when(mapVO.getAffinityGroupId()).thenReturn(AFFINITY_GROUP_ID); + + when(affinityGroupDao.findById(AFFINITY_GROUP_ID)).thenReturn(affinityGroupVO); + + when(dest.getHost()).thenReturn(host); + when(host.getId()).thenReturn(HOST_ID); + when(profile.getVirtualMachine()).thenReturn(vm); + when(affinityGroupVMMapDao.findByVmIdType(eq(VM_ID), any())).thenReturn(new ArrayList<>(Arrays.asList(mapVO))); + } + + @Test + public void testProcessAffinityGroupMultipleVMs() { + processor.processAffinityGroup(mapVO, plan, vm); + verify(plan).setPreferredHosts(Arrays.asList(HOST_ID)); + } + + @Test + public void testProcessAffinityGroupEmptyGroup() { + when(affinityGroupVMMapDao.listVmIdsByAffinityGroup(AFFINITY_GROUP_ID)).thenReturn(new ArrayList<>()); + processor.processAffinityGroup(mapVO, plan, vm); + verify(plan).setPreferredHosts(new ArrayList<>()); + } + + @Test + public void testGetPreferredHostsFromGroupVMIdsMultipleVMs() { + List list = new ArrayList<>(Arrays.asList(GROUP_VM_1_ID, GROUP_VM_2_ID)); + List preferredHosts = processor.getPreferredHostsFromGroupVMIds(list); + assertNotNull(preferredHosts); + assertEquals(1, preferredHosts.size()); + assertEquals(HOST_ID, preferredHosts.get(0)); + } + + @Test + public void testGetPreferredHostsFromGroupVMIdsEmptyVMsList() { + List list = new ArrayList<>(); + List preferredHosts = processor.getPreferredHostsFromGroupVMIds(list); + assertNotNull(preferredHosts); + assertTrue(preferredHosts.isEmpty()); + } + + @Test + public void testCheckAffinityGroup() { + assertTrue(processor.checkAffinityGroup(mapVO, vm, HOST_ID)); + } + + @Test + public void testCheckAffinityGroupWrongHostId() { + assertFalse(processor.checkAffinityGroup(mapVO, vm, HOST_2_ID)); + } + + @Test + public void testCheck() { + assertTrue(processor.check(profile, dest)); + } + + @Test + public void testCheckWrongHostId() { + when(host.getId()).thenReturn(HOST_2_ID); + assertFalse(processor.check(profile, dest)); + } +} diff --git a/plugins/affinity-group-processors/host-anti-affinity/pom.xml b/plugins/affinity-group-processors/host-anti-affinity/pom.xml index 99701b9e80c2..6539bd3c01d8 100644 --- a/plugins/affinity-group-processors/host-anti-affinity/pom.xml +++ b/plugins/affinity-group-processors/host-anti-affinity/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/affinity-group-processors/host-anti-affinity/resources/META-INF/cloudstack/host-anti-affinity/spring-host-anti-affinity-context.xml b/plugins/affinity-group-processors/host-anti-affinity/resources/META-INF/cloudstack/host-anti-affinity/spring-host-anti-affinity-context.xml index bc09cc3c60d6..362bb470d382 100644 --- a/plugins/affinity-group-processors/host-anti-affinity/resources/META-INF/cloudstack/host-anti-affinity/spring-host-anti-affinity-context.xml +++ b/plugins/affinity-group-processors/host-anti-affinity/resources/META-INF/cloudstack/host-anti-affinity/spring-host-anti-affinity-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > cloudstack-plugins org.apache.cloudstack - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpHelper.java b/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpHelper.java index 576abf3020f0..80f07af8c933 100644 --- a/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpHelper.java +++ b/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpHelper.java @@ -18,6 +18,7 @@ package org.apache.cloudstack.alert.snmp; import java.io.IOException; +import java.lang.management.ManagementFactory; import org.snmp4j.CommunityTarget; import org.snmp4j.PDU; @@ -27,6 +28,7 @@ import org.snmp4j.smi.OctetString; import org.snmp4j.smi.UdpAddress; import org.snmp4j.smi.UnsignedInteger32; +import org.snmp4j.smi.TimeTicks; import org.snmp4j.smi.VariableBinding; import org.snmp4j.transport.DefaultUdpTransportMapping; @@ -65,6 +67,8 @@ private PDU createPDU(SnmpTrapInfo snmpTrapInfo) { int alertType = snmpTrapInfo.getAlertType() + 1; if (alertType > 0) { + long sysUpTimeTicks = ManagementFactory.getRuntimeMXBean().getUptime() / 10; + trap.add(new VariableBinding(SnmpConstants.sysUpTime, new TimeTicks(sysUpTimeTicks))); trap.add(new VariableBinding(SnmpConstants.snmpTrapOID, getOID(CsSnmpConstants.TRAPS_PREFIX + alertType))); if (snmpTrapInfo.getDataCenterId() != 0) { trap.add(new VariableBinding(getOID(CsSnmpConstants.DATA_CENTER_ID), new UnsignedInteger32(snmpTrapInfo.getDataCenterId()))); @@ -99,4 +103,4 @@ private PDU createPDU(SnmpTrapInfo snmpTrapInfo) { private OID getOID(String oidString) { return new OID(oidString); } -} \ No newline at end of file +} diff --git a/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpTrapAppender.java b/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpTrapAppender.java index 3579e245c181..0c9fcf9f68c3 100644 --- a/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpTrapAppender.java +++ b/plugins/alert-handlers/snmp-alerts/src/org/apache/cloudstack/alert/snmp/SnmpTrapAppender.java @@ -161,7 +161,7 @@ private boolean validateIpAddresses() { if (ipAddress.trim().equalsIgnoreCase("localhost")) { continue; } - if (!NetUtils.isValidIp(ipAddress)) { + if (!NetUtils.isValidIp4(ipAddress)) { return false; } } diff --git a/plugins/alert-handlers/syslog-alerts/pom.xml b/plugins/alert-handlers/syslog-alerts/pom.xml index 7630cd8c03d4..30e466907d82 100644 --- a/plugins/alert-handlers/syslog-alerts/pom.xml +++ b/plugins/alert-handlers/syslog-alerts/pom.xml @@ -22,7 +22,7 @@ cloudstack-plugins org.apache.cloudstack - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml 4.0.0 diff --git a/plugins/alert-handlers/syslog-alerts/src/org/apache/cloudstack/syslog/AlertsSyslogAppender.java b/plugins/alert-handlers/syslog-alerts/src/org/apache/cloudstack/syslog/AlertsSyslogAppender.java index 7324c2008827..b73da2fd4219 100644 --- a/plugins/alert-handlers/syslog-alerts/src/org/apache/cloudstack/syslog/AlertsSyslogAppender.java +++ b/plugins/alert-handlers/syslog-alerts/src/org/apache/cloudstack/syslog/AlertsSyslogAppender.java @@ -168,7 +168,7 @@ private boolean validateIpAddresses() { if (ip.equalsIgnoreCase("localhost")) { continue; } - if (!NetUtils.isValidIp(ip)) { + if (!NetUtils.isValidIp4(ip)) { return false; } } else diff --git a/plugins/api/discovery/pom.xml b/plugins/api/discovery/pom.xml index 4f104e6a1ca1..dbdd65c17356 100644 --- a/plugins/api/discovery/pom.xml +++ b/plugins/api/discovery/pom.xml @@ -26,7 +26,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/api/rate-limit/pom.xml b/plugins/api/rate-limit/pom.xml index ef8dd7b05934..8106ef546705 100644 --- a/plugins/api/rate-limit/pom.xml +++ b/plugins/api/rate-limit/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/api/rate-limit/resources/META-INF/cloudstack/rate-limit/spring-rate-limit-context.xml b/plugins/api/rate-limit/resources/META-INF/cloudstack/rate-limit/spring-rate-limit-context.xml index 17153cf1c9de..d25c57cb0c5b 100644 --- a/plugins/api/rate-limit/resources/META-INF/cloudstack/rate-limit/spring-rate-limit-context.xml +++ b/plugins/api/rate-limit/resources/META-INF/cloudstack/rate-limit/spring-rate-limit-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/api/solidfire-intg-test/pom.xml b/plugins/api/solidfire-intg-test/pom.xml index c4567f39696a..6b0fa7ee2f7a 100644 --- a/plugins/api/solidfire-intg-test/pom.xml +++ b/plugins/api/solidfire-intg-test/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/api/solidfire-intg-test/resources/META-INF/cloudstack/solidfire-intg-test/spring-solidfire-intg-test-context.xml b/plugins/api/solidfire-intg-test/resources/META-INF/cloudstack/solidfire-intg-test/spring-solidfire-intg-test-context.xml index 2fe875af6988..28d1e1a9024c 100644 --- a/plugins/api/solidfire-intg-test/resources/META-INF/cloudstack/solidfire-intg-test/spring-solidfire-intg-test-context.xml +++ b/plugins/api/solidfire-intg-test/resources/META-INF/cloudstack/solidfire-intg-test/spring-solidfire-intg-test-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/solidfire/SolidFireIntegrationTestManagerImpl.java b/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/solidfire/SolidFireIntegrationTestManagerImpl.java index ff6e72cb29ac..66b92281efa3 100644 --- a/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/solidfire/SolidFireIntegrationTestManagerImpl.java +++ b/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/solidfire/SolidFireIntegrationTestManagerImpl.java @@ -16,22 +16,22 @@ // under the License. package org.apache.cloudstack.solidfire; -import javax.inject.Inject; - -import org.apache.cloudstack.storage.datastore.util.SolidFireUtil; -import org.apache.cloudstack.util.solidfire.SolidFireIntegrationTestUtil; -import org.springframework.stereotype.Component; - import com.cloud.dc.ClusterDetailsDao; import com.cloud.dc.ClusterDetailsVO; import com.cloud.storage.VolumeDetailVO; import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.dao.VolumeDetailsDao; -import com.cloud.user.AccountDetailsDao; import com.cloud.user.AccountDetailVO; +import com.cloud.user.AccountDetailsDao; import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.storage.datastore.util.SolidFireUtil; +import org.apache.cloudstack.util.solidfire.SolidFireIntegrationTestUtil; +import org.springframework.stereotype.Component; + +import javax.inject.Inject; + @Component public class SolidFireIntegrationTestManagerImpl implements SolidFireIntegrationTestManager { @@ -47,6 +47,11 @@ public long getSolidFireAccountId(String csAccountUuid, String storagePoolUuid) long storagePoolId = util.getStoragePoolIdForStoragePoolUuid(storagePoolUuid); AccountDetailVO accountDetail = accountDetailsDao.findDetail(csAccountId, SolidFireUtil.getAccountKey(storagePoolId)); + + if (accountDetail == null){ + throw new CloudRuntimeException("Unable to find SF account for storage " + storagePoolUuid + " for CS account " + csAccountUuid); + } + String sfAccountId = accountDetail.getValue(); return Long.parseLong(sfAccountId); diff --git a/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/util/solidfire/SolidFireIntegrationTestUtil.java b/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/util/solidfire/SolidFireIntegrationTestUtil.java index 307e8c59691e..4cbf74aba675 100644 --- a/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/util/solidfire/SolidFireIntegrationTestUtil.java +++ b/plugins/api/solidfire-intg-test/src/org/apache/cloudstack/util/solidfire/SolidFireIntegrationTestUtil.java @@ -16,15 +16,6 @@ // under the License. package org.apache.cloudstack.util.solidfire; -import java.util.ArrayList; -import java.util.List; - -import javax.inject.Inject; - -import org.apache.cloudstack.api.response.solidfire.ApiVolumeSnapshotDetailsResponse; -import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; -import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; - import com.cloud.dc.ClusterVO; import com.cloud.dc.dao.ClusterDao; import com.cloud.storage.SnapshotVO; @@ -35,6 +26,16 @@ import com.cloud.storage.dao.VolumeDao; import com.cloud.user.Account; import com.cloud.user.dao.AccountDao; +import com.cloud.utils.exception.CloudRuntimeException; + +import org.apache.cloudstack.api.response.solidfire.ApiVolumeSnapshotDetailsResponse; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; + +import java.util.ArrayList; +import java.util.List; + +import javax.inject.Inject; public class SolidFireIntegrationTestUtil { @Inject private AccountDao accountDao; @@ -49,48 +50,80 @@ private SolidFireIntegrationTestUtil() {} public long getAccountIdForAccountUuid(String accountUuid) { Account account = accountDao.findByUuid(accountUuid); + if (account == null) { + throw new CloudRuntimeException("Unable to find Account for ID: " + accountUuid); + } + return account.getAccountId(); } public long getAccountIdForVolumeUuid(String volumeUuid) { VolumeVO volume = volumeDao.findByUuid(volumeUuid); + if (volume == null) { + throw new CloudRuntimeException("Unable to find Volume for ID: " + volumeUuid); + } + return volume.getAccountId(); } public long getAccountIdForSnapshotUuid(String snapshotUuid) { SnapshotVO snapshot = snapshotDao.findByUuid(snapshotUuid); + if (snapshot == null) { + throw new CloudRuntimeException("Unable to find Volume for ID: " + snapshotUuid); + } + return snapshot.getAccountId(); } public long getClusterIdForClusterUuid(String clusterUuid) { ClusterVO cluster = clusterDao.findByUuid(clusterUuid); + if (cluster == null) { + throw new CloudRuntimeException("Unable to find Volume for ID: " + clusterUuid); + } + return cluster.getId(); } public long getStoragePoolIdForStoragePoolUuid(String storagePoolUuid) { StoragePoolVO storagePool = storagePoolDao.findByUuid(storagePoolUuid); + if (storagePool == null) { + throw new CloudRuntimeException("Unable to find Volume for ID: " + storagePoolUuid); + } + return storagePool.getId(); } public String getPathForVolumeUuid(String volumeUuid) { VolumeVO volume = volumeDao.findByUuid(volumeUuid); + if (volume == null) { + throw new CloudRuntimeException("Unable to find Volume for ID: " + volumeUuid); + } + return volume.getPath(); } public String getVolume_iScsiName(String volumeUuid) { VolumeVO volume = volumeDao.findByUuid(volumeUuid); + if (volume == null) { + throw new CloudRuntimeException("Unable to find Volume for ID: " + volumeUuid); + } + return volume.get_iScsiName(); } public List getSnapshotDetails(String snapshotUuid) { SnapshotVO snapshot = snapshotDao.findByUuid(snapshotUuid); + if (snapshot == null) { + throw new CloudRuntimeException("Unable to find Volume for ID: " + snapshotUuid); + } + List snapshotDetails = snapshotDetailsDao.listDetails(snapshot.getId()); List responses = new ArrayList<>(); diff --git a/plugins/api/vmware-sioc/pom.xml b/plugins/api/vmware-sioc/pom.xml new file mode 100644 index 000000000000..24590f8f2727 --- /dev/null +++ b/plugins/api/vmware-sioc/pom.xml @@ -0,0 +1,47 @@ + + + 4.0.0 + cloud-plugin-api-vmware-sioc + Apache CloudStack Plugin - API VMware SIOC + + org.apache.cloudstack + cloudstack-plugins + 4.11.1.0-SNAPSHOT + ../../pom.xml + + + + org.apache.cloudstack + cloud-plugin-hypervisor-vmware + ${project.version} + + + + + + org.apache.maven.plugins + maven-surefire-plugin + + -Xmx1024m + + + + + diff --git a/plugins/network-elements/midonet/resources/META-INF/cloudstack/midonet/module.properties b/plugins/api/vmware-sioc/resources/META-INF/cloudstack/vmware-sioc/module.properties similarity index 96% rename from plugins/network-elements/midonet/resources/META-INF/cloudstack/midonet/module.properties rename to plugins/api/vmware-sioc/resources/META-INF/cloudstack/vmware-sioc/module.properties index 786ccc8dbe55..826e644b2a14 100644 --- a/plugins/network-elements/midonet/resources/META-INF/cloudstack/midonet/module.properties +++ b/plugins/api/vmware-sioc/resources/META-INF/cloudstack/vmware-sioc/module.properties @@ -14,5 +14,5 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -name=midonet -parent=network \ No newline at end of file +name=vmware-sioc +parent=api \ No newline at end of file diff --git a/plugins/network-elements/midonet/resources/META-INF/cloudstack/midonet/spring-midonet-context.xml b/plugins/api/vmware-sioc/resources/META-INF/cloudstack/vmware-sioc/spring-sioc-context.xml similarity index 82% rename from plugins/network-elements/midonet/resources/META-INF/cloudstack/midonet/spring-midonet-context.xml rename to plugins/api/vmware-sioc/resources/META-INF/cloudstack/vmware-sioc/spring-sioc-context.xml index 400f7dd6ed68..d87b2f5aedcd 100644 --- a/plugins/network-elements/midonet/resources/META-INF/cloudstack/midonet/spring-midonet-context.xml +++ b/plugins/api/vmware-sioc/resources/META-INF/cloudstack/vmware-sioc/spring-sioc-context.xml @@ -27,11 +27,7 @@ http://www.springframework.org/schema/context/spring-context-3.0.xsd" > - - - - - - - + + + diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/command/admin/sioc/UpdateSiocInfoCmd.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/command/admin/sioc/UpdateSiocInfoCmd.java new file mode 100644 index 000000000000..d0561aa1158d --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/command/admin/sioc/UpdateSiocInfoCmd.java @@ -0,0 +1,105 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.command.admin.sioc; + +import javax.inject.Inject; + +import org.apache.log4j.Logger; +import org.apache.cloudstack.acl.RoleType; +import org.apache.cloudstack.api.APICommand; +import org.apache.cloudstack.api.ApiConstants; +import org.apache.cloudstack.api.BaseCmd; +import org.apache.cloudstack.api.Parameter; +import org.apache.cloudstack.api.response.StoragePoolResponse; +import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.api.response.sioc.ApiUpdateSiocInfoResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.cloudstack.sioc.SiocManager; + +import com.cloud.user.Account; + +@APICommand(name = UpdateSiocInfoCmd.APINAME, description = "Update SIOC info", responseObject = ApiUpdateSiocInfoResponse.class, + requestHasSensitiveInfo = false, responseHasSensitiveInfo = false, + since = "4.11.0", + authorized = {RoleType.Admin}) +public class UpdateSiocInfoCmd extends BaseCmd { + private static final Logger s_logger = Logger.getLogger(UpdateSiocInfoCmd.class.getName()); + + public static final String APINAME = "updateSiocInfo"; + + ///////////////////////////////////////////////////// + //////////////// API parameters ///////////////////// + ///////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ZONE_ID, type = CommandType.UUID, entityType = ZoneResponse.class, description = "Zone ID", required = true) + private long zoneId; + + @Parameter(name = ApiConstants.STORAGE_ID, type = CommandType.UUID, entityType = StoragePoolResponse.class, description = "Storage Pool ID", required = true) + private long storagePoolId; + + @Parameter(name = "sharespergb", type = CommandType.INTEGER, description = "Shares per GB", required = true) + private int sharesPerGB; + + @Parameter(name = "limitiopspergb", type = CommandType.INTEGER, description = "Limit IOPS per GB", required = true) + private int limitIopsPerGB; + + @Parameter(name = "iopsnotifythreshold", type = CommandType.INTEGER, description = "Notify if IOPS above this value", required = true) + private int iopsNotifyThreshold; + + @Inject private SiocManager manager; + + ///////////////////////////////////////////////////// + /////////////// API Implementation/////////////////// + ///////////////////////////////////////////////////// + + @Override + public String getCommandName() { + return APINAME.toLowerCase() + BaseCmd.RESPONSE_SUFFIX; + } + + @Override + public long getEntityOwnerId() { + Account account = CallContext.current().getCallingAccount(); + + if (account != null) { + return account.getId(); + } + + return Account.ACCOUNT_ID_SYSTEM; // no account info given, parent this command to SYSTEM so ERROR events are tracked + } + + @Override + public void execute() { + s_logger.info("'UpdateSiocInfoCmd.execute' method invoked"); + + String msg = "Success"; + + try { + manager.updateSiocInfo(zoneId, storagePoolId, sharesPerGB, limitIopsPerGB, iopsNotifyThreshold); + } + catch (Exception ex) { + msg = ex.getMessage(); + } + + ApiUpdateSiocInfoResponse response = new ApiUpdateSiocInfoResponse(msg); + + response.setResponseName(getCommandName()); + response.setObjectName("apiupdatesiocinfo"); + + setResponseObject(response); + } +} diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/response/sioc/ApiUpdateSiocInfoResponse.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/response/sioc/ApiUpdateSiocInfoResponse.java new file mode 100644 index 000000000000..eb4783987f59 --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/response/sioc/ApiUpdateSiocInfoResponse.java @@ -0,0 +1,32 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.response.sioc; + +import org.apache.cloudstack.api.BaseResponse; + +import com.cloud.serializer.Param; +import com.google.gson.annotations.SerializedName; + +public class ApiUpdateSiocInfoResponse extends BaseResponse { + @SerializedName("msg") + @Param(description = "The return message from the operation ('Success' if successful)") + private String _msg; + + public ApiUpdateSiocInfoResponse(String msg) { + _msg = msg; + } +} diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/sioc/ApiSiocService.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/sioc/ApiSiocService.java new file mode 100644 index 000000000000..7b622dc25be2 --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/sioc/ApiSiocService.java @@ -0,0 +1,22 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.sioc; + +import com.cloud.utils.component.PluggableService; + +public interface ApiSiocService extends PluggableService { +} diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/sioc/ApiSiocServiceImpl.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/sioc/ApiSiocServiceImpl.java new file mode 100644 index 000000000000..1a91fd9e20db --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/api/sioc/ApiSiocServiceImpl.java @@ -0,0 +1,37 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.api.sioc; + +import java.util.List; +import java.util.ArrayList; + +import org.apache.cloudstack.api.command.admin.sioc.UpdateSiocInfoCmd; +import org.springframework.stereotype.Component; + +import com.cloud.utils.component.AdapterBase; + +@Component +public class ApiSiocServiceImpl extends AdapterBase implements ApiSiocService { + @Override + public List> getCommands() { + List> cmdList = new ArrayList>(); + + cmdList.add(UpdateSiocInfoCmd.class); + + return cmdList; + } +} diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/sioc/SiocManager.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/sioc/SiocManager.java new file mode 100644 index 000000000000..1bbfbc8f0419 --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/sioc/SiocManager.java @@ -0,0 +1,21 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.sioc; + +public interface SiocManager { + void updateSiocInfo(long zoneId, long storagePoolId, int sharesPerGB, int limitIopsPerGB, int iopsNotifyThreshold) throws Exception; +} diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/sioc/SiocManagerImpl.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/sioc/SiocManagerImpl.java new file mode 100644 index 000000000000..966c83722ec9 --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/sioc/SiocManagerImpl.java @@ -0,0 +1,463 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.sioc; + +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; + +import javax.inject.Inject; + +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolDetailsDao; +import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.cloudstack.util.LoginInfo; +import org.apache.cloudstack.util.vmware.VMwareUtil; +import org.apache.cloudstack.utils.volume.VirtualMachineDiskInfo; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + +import com.cloud.dc.DataCenterVO; +import com.cloud.dc.dao.DataCenterDao; +import com.cloud.hypervisor.vmware.VmwareDatacenterVO; +import com.cloud.hypervisor.vmware.VmwareDatacenterZoneMapVO; +import com.cloud.hypervisor.vmware.dao.VmwareDatacenterDao; +import com.cloud.hypervisor.vmware.dao.VmwareDatacenterZoneMapDao; +import com.cloud.hypervisor.vmware.mo.VirtualMachineDiskInfoBuilder; +import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.storage.Volume; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.DiskOfferingDao; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.utils.db.GlobalLock; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.dao.VMInstanceDao; + +import com.vmware.vim25.ManagedObjectReference; +import com.vmware.vim25.SharesInfo; +import com.vmware.vim25.SharesLevel; +import com.vmware.vim25.StorageIOAllocationInfo; +import com.vmware.vim25.VirtualDevice; +import com.vmware.vim25.VirtualDeviceConfigSpec; +import com.vmware.vim25.VirtualDeviceConfigSpecOperation; +import com.vmware.vim25.VirtualDisk; +import com.vmware.vim25.VirtualDeviceFileBackingInfo; +import com.vmware.vim25.VirtualMachineConfigInfo; +import com.vmware.vim25.VirtualMachineConfigSpec; + +@Component +public class SiocManagerImpl implements SiocManager { + private static final Logger LOGGER = Logger.getLogger(SiocManagerImpl.class); + private static final int LOCK_TIME_IN_SECONDS = 3; + private static final int ONE_GB_IN_BYTES = 1000000000; + private static final int LOWEST_SHARES_PER_VIRTUAL_DISK = 2000; // We want this to be greater than 1,000, which is the VMware default value. + private static final int HIGHEST_SHARES_PER_VIRTUAL_DISK = 4000; // VMware limit + private static final int LOWEST_LIMIT_IOPS_PER_VIRTUAL_DISK = 16; // VMware limit + private static final int HIGHEST_LIMIT_IOPS_PER_VIRTUAL_DISK = 2147483647; // VMware limit + + @Inject private DataCenterDao zoneDao; + @Inject private DiskOfferingDao diskOfferingDao; + @Inject private PrimaryDataStoreDao storagePoolDao; + @Inject private StoragePoolDetailsDao storagePoolDetailsDao; + @Inject private VMInstanceDao vmInstanceDao; + @Inject private VmwareDatacenterDao vmwareDcDao; + @Inject private VmwareDatacenterZoneMapDao vmwareDcZoneMapDao; + @Inject private VolumeDao volumeDao; + + @Override + public void updateSiocInfo(long zoneId, long storagePoolId, int sharesPerGB, int limitIopsPerGB, int iopsNotifyThreshold) throws Exception { + LOGGER.info("'SiocManagerImpl.updateSiocInfo(long, long, int, int, int)' method invoked"); + + DataCenterVO zone = zoneDao.findById(zoneId); + + if (zone == null) { + throw new Exception("Error: No zone could be located for the following zone ID: " + zoneId + "."); + } + + StoragePoolVO storagePool = storagePoolDao.findById(storagePoolId); + + if (storagePool == null) { + throw new Exception("Error: No storage pool could be located for the following pool ID: " + storagePoolId + "."); + } + + if (storagePool.getDataCenterId() != zoneId) { + throw new Exception("Error: Storage pool '" + storagePool.getName() + "' is not in zone ID " + zoneId + "."); + } + + if (!storagePool.getPoolType().equals(StoragePoolType.VMFS)) { + throw new Exception("Error: Storage pool '" + storagePool.getName() + "' does not represent a VMFS datastore."); + } + + String lockName = zone.getUuid() + "-" + storagePool.getUuid(); + GlobalLock lock = GlobalLock.getInternLock(lockName); + + if (!lock.lock(LOCK_TIME_IN_SECONDS)) { + throw new Exception("Busy: The system is already processing this request."); + } + + VMwareUtil.VMwareConnection connection = null; + + try { + connection = VMwareUtil.getVMwareConnection(getLoginInfo(zoneId)); + + Map nameToVm = VMwareUtil.getVms(connection); + + List allTasks = new ArrayList<>(); + + int limitIopsTotal = 0; + + List volumes = volumeDao.findByPoolId(storagePoolId, null); + + if (volumes != null && volumes.size() > 0) { + Set instanceIds = new HashSet<>(); + + for (VolumeVO volume : volumes) { + Long instanceId = volume.getInstanceId(); + + if (instanceId != null) { + instanceIds.add(instanceId); + } + } + + for (Long instanceId : instanceIds) { + ResultWrapper resultWrapper = updateSiocInfo(connection, nameToVm, instanceId, storagePool, sharesPerGB, limitIopsPerGB); + + limitIopsTotal += resultWrapper.getLimitIopsTotal(); + + allTasks.addAll(resultWrapper.getTasks()); + } + } + /* + Set vmNames = nameToVm.keySet(); + + for (String vmName : vmNames) { + // If the VM's name doesn't start with "i-", then it should be a worker VM (which is not stored in the CloudStack datastore). + if (!vmName.startsWith("i-")) { + ResultWrapper resultWrapper = updateSiocInfoForWorkerVM(connection, nameToVm.get(vmName), + getDatastoreName(storagePool.getPath()), limitIopsPerGB); + + limitIopsTotal += resultWrapper.getLimitIopsTotal(); + + allTasks.addAll(resultWrapper.getTasks()); + } + } + */ + for (ManagedObjectReference task : allTasks) { + VMwareUtil.waitForTask(connection, task); + } + + if (limitIopsTotal > iopsNotifyThreshold) { + throw new Exception("Warning: Total number of IOPS: " + limitIopsTotal + "; IOPS notify threshold: " + iopsNotifyThreshold); + } + } + finally { + VMwareUtil.closeVMwareConnection(connection); + + lock.unlock(); + lock.releaseRef(); + } + } + + private ResultWrapper updateSiocInfo(VMwareUtil.VMwareConnection connection, Map nameToVm, Long instanceId, + StoragePoolVO storagePool, int sharesPerGB, int limitIopsPerGB) throws Exception { + int limitIopsTotal = 0; + List tasks = new ArrayList<>(); + + VMInstanceVO vmInstance = vmInstanceDao.findById(instanceId); + + if (vmInstance == null) { + String errMsg = "Error: The VM with ID " + instanceId + " could not be located."; + + throw new Exception(errMsg); + } + + String vmName = vmInstance.getInstanceName(); + + ManagedObjectReference morVm = nameToVm.get(vmName); + + if (morVm == null) { + String errMsg = "Error: The VM with ID " + instanceId + " could not be located (ManagedObjectReference)."; + + throw new Exception(errMsg); + } + + VirtualMachineConfigInfo vmci = (VirtualMachineConfigInfo)VMwareUtil.getEntityProps(connection, morVm, + new String[] { "config" }).get("config"); + List devices = vmci.getHardware().getDevice(); + + for (VirtualDevice device : devices) { + if (device instanceof VirtualDisk) { + VirtualDisk disk = (VirtualDisk)device; + + VolumeVO volumeVO = getVolumeFromVirtualDisk(vmInstance, storagePool.getId(), devices, disk); + + if (volumeVO != null) { + boolean diskUpdated = false; + + StorageIOAllocationInfo sioai = disk.getStorageIOAllocation(); + + SharesInfo sharesInfo = sioai.getShares(); + + int currentShares = sharesInfo.getShares(); + int newShares = getNewSharesBasedOnVolumeSize(volumeVO, sharesPerGB); + + if (currentShares != newShares) { + sharesInfo.setLevel(SharesLevel.CUSTOM); + sharesInfo.setShares(newShares); + + diskUpdated = true; + } + + long currentLimitIops = sioai.getLimit() != null ? sioai.getLimit() : Long.MIN_VALUE; + long newLimitIops = getNewLimitIopsBasedOnVolumeSize(volumeVO, limitIopsPerGB); + + limitIopsTotal += newLimitIops; + + if (currentLimitIops != newLimitIops) { + sioai.setLimit(newLimitIops); + + diskUpdated = true; + } + + if (diskUpdated) { + VirtualDeviceConfigSpec vdcs = new VirtualDeviceConfigSpec(); + + vdcs.setDevice(disk); + vdcs.setOperation(VirtualDeviceConfigSpecOperation.EDIT); + + VirtualMachineConfigSpec vmcs = new VirtualMachineConfigSpec(); + + vmcs.getDeviceChange().add(vdcs); + + try { + ManagedObjectReference task = VMwareUtil.reconfigureVm(connection, morVm, vmcs); + + tasks.add(task); + + LOGGER.info(getInfoMsg(volumeVO, newShares, newLimitIops)); + } catch (Exception ex) { + throw new Exception("Error: " + ex.getMessage()); + } + } + } + } + } + + return new ResultWrapper(limitIopsTotal, tasks); + } + + private String getDatastoreName(String path) throws Exception { + String searchString = "/"; + + int lastIndexOf = path.lastIndexOf(searchString); + + if (lastIndexOf == -1) { + throw new Exception("Error: Invalid datastore path"); + } + + return path.substring(lastIndexOf + searchString.length()); + } + + private ResultWrapper updateSiocInfoForWorkerVM(VMwareUtil.VMwareConnection connection, ManagedObjectReference morVm, String datastoreName, + int limitIopsPerGB) throws Exception { + int limitIopsTotal = 0; + List tasks = new ArrayList<>(); + + VirtualMachineConfigInfo vmci = (VirtualMachineConfigInfo)VMwareUtil.getEntityProps(connection, morVm, + new String[] { "config" }).get("config"); + List devices = vmci.getHardware().getDevice(); + + for (VirtualDevice device : devices) { + if (device instanceof VirtualDisk) { + VirtualDisk disk = (VirtualDisk)device; + + if (disk.getBacking() instanceof VirtualDeviceFileBackingInfo) { + VirtualDeviceFileBackingInfo backingInfo = (VirtualDeviceFileBackingInfo)disk.getBacking(); + + if (backingInfo.getFileName().contains(datastoreName)) { + boolean diskUpdated = false; + + StorageIOAllocationInfo sioai = disk.getStorageIOAllocation(); + + long currentLimitIops = sioai.getLimit() != null ? sioai.getLimit() : Long.MIN_VALUE; + long newLimitIops = getNewLimitIopsBasedOnVolumeSize(disk.getCapacityInBytes(), limitIopsPerGB); + + limitIopsTotal += newLimitIops; + + if (currentLimitIops != newLimitIops) { + sioai.setLimit(newLimitIops); + + diskUpdated = true; + } + + if (diskUpdated) { + VirtualDeviceConfigSpec vdcs = new VirtualDeviceConfigSpec(); + + vdcs.setDevice(disk); + vdcs.setOperation(VirtualDeviceConfigSpecOperation.EDIT); + + VirtualMachineConfigSpec vmcs = new VirtualMachineConfigSpec(); + + vmcs.getDeviceChange().add(vdcs); + + try { + ManagedObjectReference task = VMwareUtil.reconfigureVm(connection, morVm, vmcs); + + tasks.add(task); + + LOGGER.info(getInfoMsgForWorkerVm(newLimitIops)); + } catch (Exception ex) { + throw new Exception("Error: " + ex.getMessage()); + } + } + } + } + } + } + + return new ResultWrapper(limitIopsTotal, tasks); + } + + private String getInfoMsg(Volume volume, Integer newShares, Long newLimitIops) { + String msgPrefix = "VMware SIOC: Volume = " + volume.getName(); + + String msgNewShares = newShares != null ? "; New Shares = " + newShares : ""; + + String msgNewLimitIops = newLimitIops != null ? "; New Limit IOPS = " + newLimitIops : ""; + + return msgPrefix + msgNewShares + msgNewLimitIops; + } + + private String getInfoMsgForWorkerVm(Long newLimitIops) { + return "VMware SIOC: Worker VM's Limit IOPS set to " + newLimitIops; + } + + private VolumeVO getVolumeFromVirtualDisk(VMInstanceVO vmInstance, long storagePoolId, List allDevices, + VirtualDisk disk) throws Exception { + List volumes = volumeDao.findByInstance(vmInstance.getId()); + + if (volumes == null || volumes.size() == 0) { + String errMsg = "Error: The VMware virtual disk '" + disk + "' could not be mapped to a CloudStack volume. " + + "There were no volumes for the VM with the following ID: " + vmInstance.getId() + "."; + + throw new Exception(errMsg); + } + + VirtualMachineDiskInfoBuilder diskInfoBuilder = VMwareUtil.getDiskInfoBuilder(allDevices); + + for (VolumeVO volume : volumes) { + Long poolId = volume.getPoolId(); + + if (poolId != null && poolId == storagePoolId) { + StoragePoolVO storagePool = storagePoolDao.findById(poolId); + String path = storagePool.getPath(); + String charToSearchFor = "/"; + int index = path.lastIndexOf(charToSearchFor) + charToSearchFor.length(); + String datastoreName = path.substring(index); + VirtualMachineDiskInfo diskInfo = diskInfoBuilder.getDiskInfoByBackingFileBaseName(volume.getPath(), datastoreName); + + if (diskInfo != null) { + String deviceBusName = VMwareUtil.getDeviceBusName(allDevices, disk); + + if (deviceBusName.equals(diskInfo.getDiskDeviceBusName())) { + return volume; + } + } + } + } + + return null; + } + + private int getNewSharesBasedOnVolumeSize(VolumeVO volumeVO, int sharesPerGB) { + long volumeSizeInBytes = getVolumeSizeInBytes(volumeVO); + + double sizeInGB = volumeSizeInBytes / (double)ONE_GB_IN_BYTES; + + int shares = LOWEST_SHARES_PER_VIRTUAL_DISK + ((int)(sharesPerGB * sizeInGB)); + + return getAdjustedShares(shares); + } + + private int getAdjustedShares(int shares) { + shares = Math.max(shares, LOWEST_SHARES_PER_VIRTUAL_DISK); + shares = Math.min(shares, HIGHEST_SHARES_PER_VIRTUAL_DISK); + + return shares; + } + + private long getNewLimitIopsBasedOnVolumeSize(VolumeVO volumeVO, int limitIopsPerGB) { + long volumeSizeInBytes = getVolumeSizeInBytes(volumeVO); + + return getNewLimitIopsBasedOnVolumeSize(volumeSizeInBytes, limitIopsPerGB); + } + + private long getNewLimitIopsBasedOnVolumeSize(Long volumeSizeInBytes, int limitIopsPerGB) { + if (volumeSizeInBytes == null) { + volumeSizeInBytes = (long)ONE_GB_IN_BYTES; + } + + double sizeInGB = volumeSizeInBytes / (double)ONE_GB_IN_BYTES; + + long limitIops = (long)(limitIopsPerGB * sizeInGB); + + return getAdjustedLimitIops(limitIops); + } + + private long getAdjustedLimitIops(long limitIops) { + limitIops = Math.max(limitIops, LOWEST_LIMIT_IOPS_PER_VIRTUAL_DISK); + limitIops = Math.min(limitIops, HIGHEST_LIMIT_IOPS_PER_VIRTUAL_DISK); + + return limitIops; + } + + private long getVolumeSizeInBytes(VolumeVO volumeVO) { + return volumeVO.getSize() != null && volumeVO.getSize() > ONE_GB_IN_BYTES ? volumeVO.getSize() : ONE_GB_IN_BYTES; + } + + private LoginInfo getLoginInfo(long zoneId) { + VmwareDatacenterZoneMapVO vmwareDcZoneMap = vmwareDcZoneMapDao.findByZoneId(zoneId); + Long associatedVmwareDcId = vmwareDcZoneMap.getVmwareDcId(); + VmwareDatacenterVO associatedVmwareDc = vmwareDcDao.findById(associatedVmwareDcId); + + String host = associatedVmwareDc.getVcenterHost(); + String username = associatedVmwareDc.getUser(); + String password = associatedVmwareDc.getPassword(); + + return new LoginInfo(host, username, password); + } +} + +class ResultWrapper { + private int limitIopsTotal; + private List tasks; + + ResultWrapper(int limitIopsTotal, List tasks) { + this.limitIopsTotal = limitIopsTotal; + this.tasks = tasks; + } + + int getLimitIopsTotal() { + return limitIopsTotal; + } + + List getTasks() { + return tasks; + } +} diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/util/LoginInfo.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/util/LoginInfo.java new file mode 100644 index 000000000000..192996698c9f --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/util/LoginInfo.java @@ -0,0 +1,41 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.util; + +public class LoginInfo { + private final String _host; + private final String _username; + private final String _password; + + public LoginInfo(String host, String username, String password) { + _host = host; + _username = username; + _password = password; + } + + public String getHost() { + return _host; + } + + public String getUsername() { + return _username; + } + + public String getPassword() { + return _password; + } +} diff --git a/plugins/api/vmware-sioc/src/org/apache/cloudstack/util/vmware/VMwareUtil.java b/plugins/api/vmware-sioc/src/org/apache/cloudstack/util/vmware/VMwareUtil.java new file mode 100644 index 000000000000..209945fa4714 --- /dev/null +++ b/plugins/api/vmware-sioc/src/org/apache/cloudstack/util/vmware/VMwareUtil.java @@ -0,0 +1,570 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package org.apache.cloudstack.util.vmware; + +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.HostnameVerifier; +import javax.net.ssl.HttpsURLConnection; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLSession; +import javax.net.ssl.SSLSessionContext; +import javax.net.ssl.TrustManager; +import javax.net.ssl.X509TrustManager; +import javax.xml.ws.BindingProvider; +import javax.xml.ws.WebServiceException; + +import org.apache.cloudstack.util.LoginInfo; +import org.apache.log4j.Logger; + +import com.cloud.hypervisor.vmware.mo.VirtualMachineDiskInfoBuilder; +import com.vmware.vim25.DynamicProperty; +import com.vmware.vim25.InvalidCollectorVersionFaultMsg; +import com.vmware.vim25.InvalidPropertyFaultMsg; +import com.vmware.vim25.LocalizedMethodFault; +import com.vmware.vim25.ManagedObjectReference; +import com.vmware.vim25.ObjectContent; +import com.vmware.vim25.ObjectSpec; +import com.vmware.vim25.ObjectUpdate; +import com.vmware.vim25.ObjectUpdateKind; +import com.vmware.vim25.PropertyChange; +import com.vmware.vim25.PropertyChangeOp; +import com.vmware.vim25.PropertyFilterSpec; +import com.vmware.vim25.PropertyFilterUpdate; +import com.vmware.vim25.PropertySpec; +import com.vmware.vim25.RetrieveOptions; +import com.vmware.vim25.RetrieveResult; +import com.vmware.vim25.RuntimeFaultFaultMsg; +import com.vmware.vim25.SelectionSpec; +import com.vmware.vim25.ServiceContent; +import com.vmware.vim25.TaskInfoState; +import com.vmware.vim25.TraversalSpec; +import com.vmware.vim25.UpdateSet; +import com.vmware.vim25.VimPortType; +import com.vmware.vim25.VimService; +import com.vmware.vim25.VirtualDevice; +import com.vmware.vim25.VirtualDeviceBackingInfo; +import com.vmware.vim25.VirtualDisk; +import com.vmware.vim25.VirtualDiskFlatVer2BackingInfo; +import com.vmware.vim25.VirtualIDEController; +import com.vmware.vim25.VirtualMachineConfigSpec; +import com.vmware.vim25.VirtualSCSIController; + +public class VMwareUtil { + private static final Logger s_logger = Logger.getLogger(VMwareUtil.class); + + private VMwareUtil() {} + + public static class VMwareConnection { + private VimPortType _vimPortType; + private ServiceContent _serviceContent; + + VMwareConnection(VimPortType vimPortType, ServiceContent serviceContent) { + _vimPortType = vimPortType; + _serviceContent = serviceContent; + } + + VimPortType getVimPortType() { + return _vimPortType; + } + + ServiceContent getServiceContent() { + return _serviceContent; + } + } + + public static VMwareConnection getVMwareConnection(LoginInfo loginInfo) throws Exception { + trustAllHttpsCertificates(); + + HostnameVerifier hv = new HostnameVerifier() { + @Override + public boolean verify(String urlHostName, SSLSession session) { + return true; + } + }; + + HttpsURLConnection.setDefaultHostnameVerifier(hv); + + ManagedObjectReference serviceInstanceRef = new ManagedObjectReference(); + + final String serviceInstanceName = "ServiceInstance"; + + serviceInstanceRef.setType(serviceInstanceName); + serviceInstanceRef.setValue(serviceInstanceName); + + VimService vimService = new VimService(); + + VimPortType vimPortType = vimService.getVimPort(); + + Map ctxt = ((BindingProvider)vimPortType).getRequestContext(); + + ctxt.put(BindingProvider.ENDPOINT_ADDRESS_PROPERTY, "https://" + loginInfo.getHost() + "/sdk"); + ctxt.put(BindingProvider.SESSION_MAINTAIN_PROPERTY, true); + + ServiceContent serviceContent = vimPortType.retrieveServiceContent(serviceInstanceRef); + + vimPortType.login(serviceContent.getSessionManager(), loginInfo.getUsername(), loginInfo.getPassword(), null); + + return new VMwareConnection(vimPortType, serviceContent); + } + + public static void closeVMwareConnection(VMwareConnection connection) throws Exception { + if (connection != null) { + connection.getVimPortType().logout(connection.getServiceContent().getSessionManager()); + } + } + + public static Map getVms(VMwareConnection connection) throws Exception { + Map nameToVm = new HashMap<>(); + + ManagedObjectReference rootFolder = connection.getServiceContent().getRootFolder(); + + TraversalSpec tSpec = getVMTraversalSpec(); + + PropertySpec propertySpec = new PropertySpec(); + + propertySpec.setAll(Boolean.FALSE); + propertySpec.getPathSet().add("name"); + propertySpec.setType("VirtualMachine"); + + ObjectSpec objectSpec = new ObjectSpec(); + + objectSpec.setObj(rootFolder); + objectSpec.setSkip(Boolean.TRUE); + objectSpec.getSelectSet().add(tSpec); + + PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec(); + + propertyFilterSpec.getPropSet().add(propertySpec); + propertyFilterSpec.getObjectSet().add(objectSpec); + + List lstPfs = new ArrayList<>(1); + + lstPfs.add(propertyFilterSpec); + + VimPortType vimPortType = connection.getVimPortType(); + ManagedObjectReference propertyCollector = connection.getServiceContent().getPropertyCollector(); + + List lstObjectContent = retrievePropertiesAllObjects(lstPfs, vimPortType, propertyCollector); + + if (lstObjectContent != null) { + for (ObjectContent oc : lstObjectContent) { + ManagedObjectReference mor = oc.getObj(); + List dps = oc.getPropSet(); + String vmName = null; + + if (dps != null) { + for (DynamicProperty dp : dps) { + vmName = (String)dp.getVal(); + } + } + + if (vmName != null) { + nameToVm.put(vmName, mor); + } + } + } + + return nameToVm; + } + + public static Map getEntityProps(VMwareConnection connection, ManagedObjectReference entityMor, String[] props) + throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg { + Map retVal = new HashMap<>(); + + PropertySpec propertySpec = new PropertySpec(); + + propertySpec.setAll(Boolean.FALSE); + propertySpec.setType(entityMor.getType()); + propertySpec.getPathSet().addAll(Arrays.asList(props)); + + ObjectSpec objectSpec = new ObjectSpec(); + + objectSpec.setObj(entityMor); + + // Create PropertyFilterSpec using the PropertySpec and ObjectPec created above. + PropertyFilterSpec propertyFilterSpec = new PropertyFilterSpec(); + + propertyFilterSpec.getPropSet().add(propertySpec); + propertyFilterSpec.getObjectSet().add(objectSpec); + + List propertyFilterSpecs = new ArrayList<>(); + + propertyFilterSpecs.add(propertyFilterSpec); + + RetrieveResult rslts = connection.getVimPortType().retrievePropertiesEx(connection.getServiceContent().getPropertyCollector(), + propertyFilterSpecs, new RetrieveOptions()); + List listobjcontent = new ArrayList<>(); + + if (rslts != null && rslts.getObjects() != null && !rslts.getObjects().isEmpty()) { + listobjcontent.addAll(rslts.getObjects()); + } + + String token = null; + + if (rslts != null && rslts.getToken() != null) { + token = rslts.getToken(); + } + + while (token != null && !token.isEmpty()) { + rslts = connection.getVimPortType().continueRetrievePropertiesEx(connection.getServiceContent().getPropertyCollector(), + token); + + token = null; + + if (rslts != null) { + token = rslts.getToken(); + + if (rslts.getObjects() != null && !rslts.getObjects().isEmpty()) { + listobjcontent.addAll(rslts.getObjects()); + } + } + } + + for (ObjectContent oc : listobjcontent) { + List dps = oc.getPropSet(); + + if (dps != null) { + for (DynamicProperty dp : dps) { + retVal.put(dp.getName(), dp.getVal()); + } + } + } + + return retVal; + } + + public static ManagedObjectReference reconfigureVm(VMwareConnection connection, ManagedObjectReference morVm, + VirtualMachineConfigSpec vmcs) throws Exception { + return connection.getVimPortType().reconfigVMTask(morVm, vmcs); + } + + public static VirtualMachineDiskInfoBuilder getDiskInfoBuilder(List devices) throws Exception { + VirtualMachineDiskInfoBuilder builder = new VirtualMachineDiskInfoBuilder(); + + if (devices != null) { + for (VirtualDevice device : devices) { + if (device instanceof VirtualDisk) { + VirtualDisk virtualDisk = (VirtualDisk)device; + VirtualDeviceBackingInfo backingInfo = virtualDisk.getBacking(); + + if (backingInfo instanceof VirtualDiskFlatVer2BackingInfo) { + VirtualDiskFlatVer2BackingInfo diskBackingInfo = (VirtualDiskFlatVer2BackingInfo)backingInfo; + + String deviceBusName = VMwareUtil.getDeviceBusName(devices, virtualDisk); + + while (diskBackingInfo != null) { + builder.addDisk(deviceBusName, diskBackingInfo.getFileName()); + + diskBackingInfo = diskBackingInfo.getParent(); + } + } + } + } + } + + return builder; + } + + public static String getDeviceBusName(List allDevices, VirtualDisk disk) throws Exception { + for (VirtualDevice device : allDevices) { + if (device.getKey() == disk.getControllerKey()) { + if (device instanceof VirtualIDEController) { + return String.format("ide%d:%d", ((VirtualIDEController)device).getBusNumber(), disk.getUnitNumber()); + } else if (device instanceof VirtualSCSIController) { + return String.format("scsi%d:%d", ((VirtualSCSIController)device).getBusNumber(), disk.getUnitNumber()); + } else { + throw new Exception("The device controller is not supported."); + } + } + } + + throw new Exception("The device controller could not be located."); + } + + public static boolean waitForTask(VMwareConnection connection, ManagedObjectReference task) throws Exception { + try { + Object[] result = waitForValues(connection, task, new String[] { "info.state", "info.error" }, new String[] { "state" }, + new Object[][] { new Object[] { TaskInfoState.SUCCESS, TaskInfoState.ERROR } }); + + if (result[0].equals(TaskInfoState.SUCCESS)) { + return true; + } + + if (result[1] instanceof LocalizedMethodFault) { + throw new Exception(((LocalizedMethodFault)result[1]).getLocalizedMessage()); + } + } catch (WebServiceException we) { + s_logger.debug("Cancelling vCenter task because the task failed with the following error: " + we.getLocalizedMessage()); + + connection.getVimPortType().cancelTask(task); + + throw new Exception("The vCenter task failed due to the following error: " + we.getLocalizedMessage()); + } + + return false; + } + + private static Object[] waitForValues(VMwareConnection connection, ManagedObjectReference morObj, String[] filterProps, + String[] endWaitProps, Object[][] expectedVals) throws InvalidPropertyFaultMsg, RuntimeFaultFaultMsg, + InvalidCollectorVersionFaultMsg { + String version = ""; + Object[] endVals = new Object[endWaitProps.length]; + Object[] filterVals = new Object[filterProps.length]; + + PropertyFilterSpec spec = new PropertyFilterSpec(); + + ObjectSpec oSpec = new ObjectSpec(); + + oSpec.setObj(morObj); + oSpec.setSkip(Boolean.FALSE); + + spec.getObjectSet().add(oSpec); + + PropertySpec pSpec = new PropertySpec(); + + pSpec.getPathSet().addAll(Arrays.asList(filterProps)); + pSpec.setType(morObj.getType()); + + spec.getPropSet().add(pSpec); + + ManagedObjectReference propertyCollector = connection.getServiceContent().getPropertyCollector(); + ManagedObjectReference filterSpecRef = connection.getVimPortType().createFilter(propertyCollector, spec, true); + + boolean reached = false; + + UpdateSet updateSet; + List lstPropertyFilterUpdates; + List lstObjectUpdates; + List lstPropertyChanges; + + while (!reached) { + updateSet = connection.getVimPortType().waitForUpdates(propertyCollector, version); + + if (updateSet == null || updateSet.getFilterSet() == null) { + continue; + } + + version = updateSet.getVersion(); + + lstPropertyFilterUpdates = updateSet.getFilterSet(); + + for (PropertyFilterUpdate propertyFilterUpdate : lstPropertyFilterUpdates) { + lstObjectUpdates = propertyFilterUpdate.getObjectSet(); + + for (ObjectUpdate objUpdate : lstObjectUpdates) { + if (objUpdate.getKind() == ObjectUpdateKind.MODIFY || objUpdate.getKind() == ObjectUpdateKind.ENTER || + objUpdate.getKind() == ObjectUpdateKind.LEAVE) { + lstPropertyChanges = objUpdate.getChangeSet(); + + for (PropertyChange propchg : lstPropertyChanges) { + updateValues(endWaitProps, endVals, propchg); + updateValues(filterProps, filterVals, propchg); + } + } + } + } + + Object expectedValue; + + // Check if the expected values have been reached and exit the loop if done. + // Also, exit the WaitForUpdates loop if this is the case. + for (int chgi = 0; chgi < endVals.length && !reached; chgi++) { + for (int vali = 0; vali < expectedVals[chgi].length && !reached; vali++) { + expectedValue = expectedVals[chgi][vali]; + + reached = expectedValue.equals(endVals[chgi]) || reached; + } + } + } + + // Destroy the filter when we are done. + connection.getVimPortType().destroyPropertyFilter(filterSpecRef); + + return filterVals; + } + + private static void updateValues(String[] props, Object[] vals, PropertyChange propertyChange) { + for (int findi = 0; findi < props.length; findi++) { + if (propertyChange.getName().lastIndexOf(props[findi]) >= 0) { + if (propertyChange.getOp() == PropertyChangeOp.REMOVE) { + vals[findi] = ""; + } else { + vals[findi] = propertyChange.getVal(); + } + } + } + } + + private static List retrievePropertiesAllObjects(List lstPfs, + VimPortType vimPortType, ManagedObjectReference propCollectorRef) throws Exception { + List lstObjectContent = new ArrayList<>(); + + RetrieveOptions retrieveOptions = new RetrieveOptions(); + + RetrieveResult rslts = vimPortType.retrievePropertiesEx(propCollectorRef, lstPfs, retrieveOptions); + + if (rslts != null && rslts.getObjects() != null && rslts.getObjects().size() > 0) { + List lstOc = new ArrayList<>(); + + for (ObjectContent oc : rslts.getObjects()) { + lstOc.add(oc); + } + + lstObjectContent.addAll(lstOc); + } + + String token = null; + + if (rslts != null && rslts.getToken() != null) { + token = rslts.getToken(); + } + + while (token != null && !token.isEmpty()) { + rslts = vimPortType.continueRetrievePropertiesEx(propCollectorRef, token); + token = null; + + if (rslts != null) { + token = rslts.getToken(); + + if (rslts.getObjects() != null && rslts.getObjects().size() > 0) { + List lstOc = new ArrayList<>(); + + for (ObjectContent oc : rslts.getObjects()) { + lstOc.add(oc); + } + + lstObjectContent.addAll(lstOc); + } + } + } + + return lstObjectContent; + } + + private static TraversalSpec getVMTraversalSpec() { + // Create a TraversalSpec that starts from the 'root' objects + // and traverses the inventory tree to get to the VirtualMachines. + // Build the traversal specs bottoms up + + // TraversalSpec to get to the VM in a vApp + TraversalSpec vAppToVM = new TraversalSpec(); + + vAppToVM.setName("vAppToVM"); + vAppToVM.setType("VirtualApp"); + vAppToVM.setPath("vm"); + + // TraversalSpec for vApp to vApp + TraversalSpec vAppToVApp = new TraversalSpec(); + + vAppToVApp.setName("vAppToVApp"); + vAppToVApp.setType("VirtualApp"); + vAppToVApp.setPath("resourcePool"); + + // SelectionSpec for vApp-to-vApp recursion + SelectionSpec vAppRecursion = new SelectionSpec(); + + vAppRecursion.setName("vAppToVApp"); + + // SelectionSpec to get to a VM in the vApp + SelectionSpec vmInVApp = new SelectionSpec(); + + vmInVApp.setName("vAppToVM"); + + // SelectionSpec for both vApp to vApp and vApp to VM + List vAppToVMSS = new ArrayList<>(); + + vAppToVMSS.add(vAppRecursion); + vAppToVMSS.add(vmInVApp); + + vAppToVApp.getSelectSet().addAll(vAppToVMSS); + + // This SelectionSpec is used for recursion for Folder recursion + SelectionSpec sSpec = new SelectionSpec(); + + sSpec.setName("VisitFolders"); + + // Traversal to get to the vmFolder from DataCenter + TraversalSpec dataCenterToVMFolder = new TraversalSpec(); + + dataCenterToVMFolder.setName("DataCenterToVMFolder"); + dataCenterToVMFolder.setType("Datacenter"); + dataCenterToVMFolder.setPath("vmFolder"); + dataCenterToVMFolder.setSkip(false); + + dataCenterToVMFolder.getSelectSet().add(sSpec); + + // TraversalSpec to get to the DataCenter from rootFolder + TraversalSpec traversalSpec = new TraversalSpec(); + + traversalSpec.setName("VisitFolders"); + traversalSpec.setType("Folder"); + traversalSpec.setPath("childEntity"); + traversalSpec.setSkip(false); + + List sSpecArr = new ArrayList<>(); + + sSpecArr.add(sSpec); + sSpecArr.add(dataCenterToVMFolder); + sSpecArr.add(vAppToVM); + sSpecArr.add(vAppToVApp); + + traversalSpec.getSelectSet().addAll(sSpecArr); + + return traversalSpec; + } + + private static void trustAllHttpsCertificates() throws Exception { + // Create a trust manager that does not validate certificate chains: + TrustManager[] trustAllCerts = new TrustManager[1]; + + TrustManager tm = new TrustAllTrustManager(); + + trustAllCerts[0] = tm; + + SSLContext sc = SSLContext.getInstance("SSL"); + + SSLSessionContext sslsc = sc.getServerSessionContext(); + + sslsc.setSessionTimeout(0); + + sc.init(null, trustAllCerts, null); + + HttpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory()); + } + + private static class TrustAllTrustManager implements TrustManager, X509TrustManager { + @Override + public X509Certificate[] getAcceptedIssuers() { + return null; + } + + @Override + public void checkServerTrusted(X509Certificate[] certs, String authType) throws CertificateException { + } + + @Override + public void checkClientTrusted(X509Certificate[] certs, String authType) throws CertificateException { + } + } +} diff --git a/plugins/network-elements/midonet/pom.xml b/plugins/ca/root-ca/pom.xml similarity index 61% rename from plugins/network-elements/midonet/pom.xml rename to plugins/ca/root-ca/pom.xml index 2f7f24d56b2c..17922d07ddd5 100644 --- a/plugins/network-elements/midonet/pom.xml +++ b/plugins/ca/root-ca/pom.xml @@ -18,43 +18,29 @@ --> 4.0.0 - cloud-plugin-network-midonet - Apache CloudStack Plugin - Midokura Midonet + cloud-plugin-ca-rootca + Apache CloudStack Plugin - Inbuilt Root Certificate Authority org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml - - - mido-maven-public-releases - mido-maven-public-releases - http://cs-maven.midokura.com/releases - - - - org.midonet - midonet-client - 1.1.0 - org.apache.cloudstack - cloud-plugin-hypervisor-kvm + cloud-utils ${project.version} - org.codehaus.jackson - jackson-core-asl - 1.9.11 - runtime + org.apache.cloudstack + cloud-api + ${project.version} - org.codehaus.jackson - jackson-mapper-asl - 1.9.11 - runtime + org.apache.cloudstack + cloud-framework-ca + ${project.version} diff --git a/tools/devcloud/src/deps/boxes/basebox-build/Vagrantfile b/plugins/ca/root-ca/resources/META-INF/cloudstack/root-ca/module.properties similarity index 97% rename from tools/devcloud/src/deps/boxes/basebox-build/Vagrantfile rename to plugins/ca/root-ca/resources/META-INF/cloudstack/root-ca/module.properties index 245692337bc3..e086bc03073b 100644 --- a/tools/devcloud/src/deps/boxes/basebox-build/Vagrantfile +++ b/plugins/ca/root-ca/resources/META-INF/cloudstack/root-ca/module.properties @@ -14,4 +14,5 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. - +name=root-ca +parent=ca diff --git a/plugins/ca/root-ca/resources/META-INF/cloudstack/root-ca/spring-root-ca-context.xml b/plugins/ca/root-ca/resources/META-INF/cloudstack/root-ca/spring-root-ca-context.xml new file mode 100644 index 000000000000..46503febd7b6 --- /dev/null +++ b/plugins/ca/root-ca/resources/META-INF/cloudstack/root-ca/spring-root-ca-context.xml @@ -0,0 +1,29 @@ + + + + + + + + diff --git a/plugins/ca/root-ca/src/org/apache/cloudstack/ca/provider/RootCACustomTrustManager.java b/plugins/ca/root-ca/src/org/apache/cloudstack/ca/provider/RootCACustomTrustManager.java new file mode 100644 index 000000000000..90f620393ee2 --- /dev/null +++ b/plugins/ca/root-ca/src/org/apache/cloudstack/ca/provider/RootCACustomTrustManager.java @@ -0,0 +1,146 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ca.provider; + +import java.math.BigInteger; +import java.security.cert.CertificateException; +import java.security.cert.CertificateExpiredException; +import java.security.cert.CertificateNotYetValidException; +import java.security.cert.X509Certificate; +import java.util.List; +import java.util.Map; + +import javax.net.ssl.X509TrustManager; + +import org.apache.log4j.Logger; + +import com.cloud.certificate.dao.CrlDao; +import com.google.common.base.Strings; + +public final class RootCACustomTrustManager implements X509TrustManager { + private static final Logger LOG = Logger.getLogger(RootCACustomTrustManager.class); + + private String clientAddress = "Unknown"; + private boolean authStrictness = true; + private boolean allowExpiredCertificate = true; + private CrlDao crlDao; + private X509Certificate caCertificate; + private Map activeCertMap; + + public RootCACustomTrustManager(final String clientAddress, final boolean authStrictness, final boolean allowExpiredCertificate, final Map activeCertMap, final X509Certificate caCertificate, final CrlDao crlDao) { + if (!Strings.isNullOrEmpty(clientAddress)) { + this.clientAddress = clientAddress.replace("/", "").split(":")[0]; + } + this.authStrictness = authStrictness; + this.allowExpiredCertificate = allowExpiredCertificate; + this.activeCertMap = activeCertMap; + this.caCertificate = caCertificate; + this.crlDao = crlDao; + } + + private void printCertificateChain(final X509Certificate[] certificates, final String s) throws CertificateException { + if (certificates == null) { + return; + } + final StringBuilder builder = new StringBuilder(); + builder.append("A client/agent attempting connection from address=").append(clientAddress).append(" has presented these certificate(s):"); + int counter = 1; + for (final X509Certificate certificate: certificates) { + builder.append("\nCertificate [").append(counter++).append("] :"); + builder.append(String.format("\n Serial: %x", certificate.getSerialNumber())); + builder.append("\n Not Before:" + certificate.getNotBefore()); + builder.append("\n Not After:" + certificate.getNotAfter()); + builder.append("\n Signature Algorithm:" + certificate.getSigAlgName()); + builder.append("\n Version:" + certificate.getVersion()); + builder.append("\n Subject DN:" + certificate.getSubjectDN()); + builder.append("\n Issuer DN:" + certificate.getIssuerDN()); + builder.append("\n Alternative Names:" + certificate.getSubjectAlternativeNames()); + } + LOG.debug(builder.toString()); + } + + @Override + public void checkClientTrusted(final X509Certificate[] certificates, final String s) throws CertificateException { + if (LOG.isDebugEnabled()) { + printCertificateChain(certificates, s); + } + if (!authStrictness) { + return; + } + if (certificates == null || certificates.length < 1 || certificates[0] == null) { + throw new CertificateException("In strict auth mode, certificate(s) are expected from client:" + clientAddress); + } + final X509Certificate primaryClientCertificate = certificates[0]; + + // Revocation check + final BigInteger serialNumber = primaryClientCertificate.getSerialNumber(); + if (serialNumber == null || crlDao.findBySerial(serialNumber) != null) { + final String errorMsg = String.format("Client is using revoked certificate of serial=%x, subject=%s from address=%s", + primaryClientCertificate.getSerialNumber(), primaryClientCertificate.getSubjectDN(), clientAddress); + LOG.error(errorMsg); + throw new CertificateException(errorMsg); + } + + // Validity check + if (!allowExpiredCertificate) { + try { + primaryClientCertificate.checkValidity(); + } catch (final CertificateExpiredException | CertificateNotYetValidException e) { + final String errorMsg = String.format("Client certificate has expired with serial=%x, subject=%s from address=%s", + primaryClientCertificate.getSerialNumber(), primaryClientCertificate.getSubjectDN(), clientAddress); + LOG.error(errorMsg); + throw new CertificateException(errorMsg); } + } + + // Ownership check + boolean certMatchesOwnership = false; + if (primaryClientCertificate.getSubjectAlternativeNames() != null) { + for (final List list : primaryClientCertificate.getSubjectAlternativeNames()) { + if (list != null && list.size() == 2 && list.get(1) instanceof String) { + final String alternativeName = (String) list.get(1); + if (clientAddress.equals(alternativeName)) { + certMatchesOwnership = true; + } + } + } + } + if (!certMatchesOwnership) { + final String errorMsg = "Certificate ownership verification failed for client: " + clientAddress; + LOG.error(errorMsg); + throw new CertificateException(errorMsg); + } + if (activeCertMap != null && !Strings.isNullOrEmpty(clientAddress)) { + activeCertMap.put(clientAddress, primaryClientCertificate); + } + if (LOG.isDebugEnabled()) { + LOG.debug("Client/agent connection from ip=" + clientAddress + " has been validated and trusted."); + } + } + + @Override + public void checkServerTrusted(X509Certificate[] x509Certificates, String s) throws CertificateException { + } + + @Override + public X509Certificate[] getAcceptedIssuers() { + if (!authStrictness) { + return null; + } + return new X509Certificate[]{caCertificate}; + } +} diff --git a/plugins/ca/root-ca/src/org/apache/cloudstack/ca/provider/RootCAProvider.java b/plugins/ca/root-ca/src/org/apache/cloudstack/ca/provider/RootCAProvider.java new file mode 100644 index 000000000000..f36d06799b33 --- /dev/null +++ b/plugins/ca/root-ca/src/org/apache/cloudstack/ca/provider/RootCAProvider.java @@ -0,0 +1,452 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.ca.provider; + +import java.io.IOException; +import java.io.StringReader; +import java.math.BigInteger; +import java.net.InetAddress; +import java.security.InvalidKeyException; +import java.security.KeyManagementException; +import java.security.KeyPair; +import java.security.KeyStore; +import java.security.KeyStoreException; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.SecureRandom; +import java.security.Security; +import java.security.SignatureException; +import java.security.UnrecoverableKeyException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.security.spec.InvalidKeySpecException; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.Map; + +import javax.inject.Inject; +import javax.naming.ConfigurationException; +import javax.net.ssl.KeyManagerFactory; +import javax.net.ssl.SSLContext; +import javax.net.ssl.SSLEngine; +import javax.net.ssl.TrustManager; +import javax.net.ssl.TrustManagerFactory; +import javax.xml.bind.DatatypeConverter; + +import org.apache.cloudstack.ca.CAManager; +import org.apache.cloudstack.framework.ca.CAProvider; +import org.apache.cloudstack.framework.ca.Certificate; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; +import org.apache.cloudstack.framework.config.dao.ConfigurationDao; +import org.apache.cloudstack.utils.security.CertUtils; +import org.apache.cloudstack.utils.security.KeyStoreUtils; +import org.apache.log4j.Logger; +import org.bouncycastle.asn1.pkcs.Attribute; +import org.bouncycastle.asn1.pkcs.PKCSObjectIdentifiers; +import org.bouncycastle.asn1.x509.Extension; +import org.bouncycastle.asn1.x509.Extensions; +import org.bouncycastle.asn1.x509.GeneralName; +import org.bouncycastle.asn1.x509.GeneralNames; +import org.bouncycastle.jce.provider.BouncyCastleProvider; +import org.bouncycastle.operator.OperatorCreationException; +import org.bouncycastle.pkcs.jcajce.JcaPKCS10CertificationRequest; +import org.bouncycastle.util.io.pem.PemObject; +import org.bouncycastle.util.io.pem.PemReader; + +import com.cloud.certificate.dao.CrlDao; +import com.cloud.utils.component.AdapterBase; +import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; +import com.google.common.base.Strings; + +public final class RootCAProvider extends AdapterBase implements CAProvider, Configurable { + private static final Logger LOG = Logger.getLogger(RootCAProvider.class); + + public static final Integer caValidityYears = 30; + public static final String caAlias = "root"; + public static final String managementAlias = "management"; + + private static KeyPair caKeyPair = null; + private static X509Certificate caCertificate = null; + private static KeyStore managementKeyStore = null; + + @Inject + private ConfigurationDao configDao; + @Inject + private CrlDao crlDao; + + //////////////////////////////////////////////////// + /////////////// Root CA Settings /////////////////// + //////////////////////////////////////////////////// + + private static ConfigKey rootCAPrivateKey = new ConfigKey<>("Hidden", String.class, + "ca.plugin.root.private.key", + null, + "The ROOT CA private key.", true); + + private static ConfigKey rootCAPublicKey = new ConfigKey<>("Hidden", String.class, + "ca.plugin.root.public.key", + null, + "The ROOT CA public key.", true); + + private static ConfigKey rootCACertificate = new ConfigKey<>("Hidden", String.class, + "ca.plugin.root.ca.certificate", + null, + "The ROOT CA certificate.", true); + + private static ConfigKey rootCAIssuerDN = new ConfigKey<>("Advanced", String.class, + "ca.plugin.root.issuer.dn", + "CN=ca.cloudstack.apache.org", + "The ROOT CA issuer distinguished name.", true); + + protected static ConfigKey rootCAAuthStrictness = new ConfigKey<>("Advanced", Boolean.class, + "ca.plugin.root.auth.strictness", + "false", + "Set client authentication strictness, setting to true will enforce and require client certificate for authentication in applicable CA providers.", true); + + private static ConfigKey rootCAAllowExpiredCert = new ConfigKey<>("Advanced", Boolean.class, + "ca.plugin.root.allow.expired.cert", + "true", + "When set to true, it will allow expired client certificate during SSL handshake.", true); + + + /////////////////////////////////////////////////////////// + /////////////// Root CA Private Methods /////////////////// + /////////////////////////////////////////////////////////// + + private Certificate generateCertificate(final List domainNames, final List ipAddresses, final int validityDays) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, CertificateException, SignatureException, IOException, OperatorCreationException { + if (domainNames == null || domainNames.size() < 1 || Strings.isNullOrEmpty(domainNames.get(0))) { + throw new CloudRuntimeException("No domain name is specified, cannot generate certificate"); + } + final String subject = "CN=" + domainNames.get(0); + + final KeyPair keyPair = CertUtils.generateRandomKeyPair(CAManager.CertKeySize.value()); + final X509Certificate clientCertificate = CertUtils.generateV3Certificate( + caCertificate, caKeyPair, keyPair.getPublic(), + subject, CAManager.CertSignatureAlgorithm.value(), + validityDays, domainNames, ipAddresses); + return new Certificate(clientCertificate, keyPair.getPrivate(), Collections.singletonList(caCertificate)); + } + + private Certificate generateCertificateUsingCsr(final String csr, final List names, final List ips, final int validityDays) throws NoSuchAlgorithmException, InvalidKeyException, NoSuchProviderException, CertificateException, SignatureException, IOException, OperatorCreationException { + final List dnsNames = new ArrayList<>(); + final List ipAddresses = new ArrayList<>(); + + if (names != null) { + dnsNames.addAll(names); + } + if (ips != null) { + ipAddresses.addAll(ips); + } + + PemObject pemObject = null; + + try { + final PemReader pemReader = new PemReader(new StringReader(csr)); + pemObject = pemReader.readPemObject(); + } catch (IOException e) { + LOG.error("Failed to read provided CSR string as a PEM object", e); + } + + if (pemObject == null) { + throw new CloudRuntimeException("Unable to read/process CSR: " + csr); + } + + final JcaPKCS10CertificationRequest request = new JcaPKCS10CertificationRequest(pemObject.getContent()); + final String subject = request.getSubject().toString(); + for (final Attribute attribute : request.getAttributes()) { + if (attribute == null) { + continue; + } + if (attribute.getAttrType().equals(PKCSObjectIdentifiers.pkcs_9_at_extensionRequest)) { + final Extensions extensions = Extensions.getInstance(attribute.getAttrValues().getObjectAt(0)); + final GeneralNames gns = GeneralNames.fromExtensions(extensions, Extension.subjectAlternativeName); + if (gns != null && gns.getNames() != null && gns.getNames().length > 0) { + for (final GeneralName name : gns.getNames()) { + if (name.getTagNo() == GeneralName.dNSName) { + dnsNames.add(name.getName().toString()); + } + if (name.getTagNo() == GeneralName.iPAddress) { + final InetAddress address = InetAddress.getByAddress(DatatypeConverter.parseHexBinary(name.getName().toString().substring(1))); + ipAddresses.add(address.toString().replace("/", "")); + } + } + } + } + } + + final X509Certificate clientCertificate = CertUtils.generateV3Certificate( + caCertificate, caKeyPair, request.getPublicKey(), + subject, CAManager.CertSignatureAlgorithm.value(), + validityDays, dnsNames, ipAddresses); + return new Certificate(clientCertificate, null, Collections.singletonList(caCertificate)); + } + + //////////////////////////////////////////////////////// + /////////////// Root CA API Handlers /////////////////// + //////////////////////////////////////////////////////// + + @Override + public boolean canProvisionCertificates() { + return true; + } + + @Override + public List getCaCertificate() { + return Collections.singletonList(caCertificate); + } + + @Override + public Certificate issueCertificate(final List domainNames, final List ipAddresses, final int validityDays) { + try { + return generateCertificate(domainNames, ipAddresses, validityDays); + } catch (final CertificateException | IOException | SignatureException | NoSuchAlgorithmException | NoSuchProviderException | InvalidKeyException | OperatorCreationException e) { + LOG.error("Failed to create client certificate, due to: ", e); + throw new CloudRuntimeException("Failed to generate certificate due to:" + e.getMessage()); + } + } + + @Override + public Certificate issueCertificate(final String csr, final List domainNames, final List ipAddresses, final int validityDays) { + try { + return generateCertificateUsingCsr(csr, domainNames, ipAddresses, validityDays); + } catch (final CertificateException | IOException | SignatureException | NoSuchAlgorithmException | NoSuchProviderException | InvalidKeyException | OperatorCreationException e) { + LOG.error("Failed to generate certificate from CSR: ", e); + throw new CloudRuntimeException("Failed to generate certificate using CSR due to:" + e.getMessage()); + } + } + + @Override + public boolean revokeCertificate(final BigInteger certSerial, final String certCn) { + return true; + } + + //////////////////////////////////////////////////////////// + /////////////// Root CA Trust Management /////////////////// + //////////////////////////////////////////////////////////// + + private KeyStore getCaKeyStore() throws CertificateException, NoSuchAlgorithmException, IOException, KeyStoreException { + final KeyStore ks = KeyStore.getInstance("JKS"); + ks.load(null, null); + if (caKeyPair != null && caCertificate != null) { + ks.setKeyEntry(caAlias, caKeyPair.getPrivate(), getKeyStorePassphrase(), new X509Certificate[]{caCertificate}); + } else { + return null; + } + return ks; + } + + @Override + public SSLEngine createSSLEngine(final SSLContext sslContext, final String remoteAddress, final Map certMap) throws KeyManagementException, UnrecoverableKeyException, NoSuchAlgorithmException, KeyStoreException, IOException, CertificateException { + final KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509"); + final TrustManagerFactory tmf = TrustManagerFactory.getInstance("SunX509"); + + final KeyStore ks = getCaKeyStore(); + kmf.init(ks, getKeyStorePassphrase()); + tmf.init(ks); + + final boolean authStrictness = rootCAAuthStrictness.value(); + final boolean allowExpiredCertificate = rootCAAllowExpiredCert.value(); + + TrustManager[] tms = new TrustManager[]{new RootCACustomTrustManager(remoteAddress, authStrictness, allowExpiredCertificate, certMap, caCertificate, crlDao)}; + sslContext.init(kmf.getKeyManagers(), tms, new SecureRandom()); + final SSLEngine sslEngine = sslContext.createSSLEngine(); + sslEngine.setNeedClientAuth(authStrictness); + return sslEngine; + } + + @Override + public KeyStore getManagementKeyStore() throws KeyStoreException { + return managementKeyStore; + } + + @Override + public char[] getKeyStorePassphrase() { + return KeyStoreUtils.DEFAULT_KS_PASSPHRASE; + } + + ///////////////////////////////////////////////// + /////////////// Root CA Setup /////////////////// + ///////////////////////////////////////////////// + + private int getCaValidityDays() { + return 365 * caValidityYears; + } + + private boolean saveNewRootCAKeypair() { + try { + LOG.debug("Generating root CA public/private keys"); + final KeyPair keyPair = CertUtils.generateRandomKeyPair(2 * CAManager.CertKeySize.value()); + if (!configDao.update(rootCAPublicKey.key(), rootCAPublicKey.category(), CertUtils.publicKeyToPem(keyPair.getPublic()))) { + LOG.error("Failed to save RootCA public key"); + } + if (!configDao.update(rootCAPrivateKey.key(), rootCAPrivateKey.category(), CertUtils.privateKeyToPem(keyPair.getPrivate()))) { + LOG.error("Failed to save RootCA private key"); + } + } catch (final NoSuchProviderException | NoSuchAlgorithmException | IOException e) { + LOG.error("Failed to generate/save RootCA private/public keys due to exception:", e); + } + return loadRootCAKeyPair(); + } + + private boolean saveNewRootCACertificate() { + if (caKeyPair == null) { + throw new CloudRuntimeException("Cannot issue self-signed root CA certificate as CA keypair is not initialized"); + } + try { + LOG.debug("Generating root CA certificate"); + final X509Certificate rootCaCertificate = CertUtils.generateV3Certificate( + null, caKeyPair, caKeyPair.getPublic(), + rootCAIssuerDN.value(), CAManager.CertSignatureAlgorithm.value(), + getCaValidityDays(), null, null); + if (!configDao.update(rootCACertificate.key(), rootCACertificate.category(), CertUtils.x509CertificateToPem(rootCaCertificate))) { + LOG.error("Failed to update RootCA public/x509 certificate"); + } + } catch (final CertificateException | NoSuchAlgorithmException | NoSuchProviderException | SignatureException | InvalidKeyException | OperatorCreationException | IOException e) { + LOG.error("Failed to generate RootCA certificate from private/public keys due to exception:", e); + return false; + } + return loadRootCACertificate(); + } + + private boolean loadRootCAKeyPair() { + if (Strings.isNullOrEmpty(rootCAPublicKey.value()) || Strings.isNullOrEmpty(rootCAPrivateKey.value())) { + return false; + } + try { + caKeyPair = new KeyPair(CertUtils.pemToPublicKey(rootCAPublicKey.value()), CertUtils.pemToPrivateKey(rootCAPrivateKey.value())); + } catch (InvalidKeySpecException | IOException e) { + LOG.error("Failed to load saved RootCA private/public keys due to exception:", e); + return false; + } + return caKeyPair.getPrivate() != null && caKeyPair.getPublic() != null; + } + + private boolean loadRootCACertificate() { + if (Strings.isNullOrEmpty(rootCACertificate.value())) { + return false; + } + try { + caCertificate = CertUtils.pemToX509Certificate(rootCACertificate.value()); + caCertificate.verify(caKeyPair.getPublic()); + } catch (final IOException | CertificateException | NoSuchAlgorithmException | InvalidKeyException | SignatureException | NoSuchProviderException e) { + LOG.error("Failed to load saved RootCA certificate due to exception:", e); + return false; + } + return caCertificate != null; + } + + private boolean loadManagementKeyStore() { + if (managementKeyStore != null) { + return true; + } + final Certificate serverCertificate = issueCertificate(Collections.singletonList(NetUtils.getHostName()), + Collections.singletonList(NetUtils.getDefaultHostIp()), getCaValidityDays()); + if (serverCertificate == null || serverCertificate.getPrivateKey() == null) { + throw new CloudRuntimeException("Failed to generate management server certificate and load management server keystore"); + } + LOG.info("Creating new management server certificate and keystore"); + try { + managementKeyStore = KeyStore.getInstance("JKS"); + managementKeyStore.load(null, null); + managementKeyStore.setCertificateEntry(caAlias, caCertificate); + managementKeyStore.setKeyEntry(managementAlias, serverCertificate.getPrivateKey(), getKeyStorePassphrase(), + new X509Certificate[]{serverCertificate.getClientCertificate(), caCertificate}); + } catch (final CertificateException | NoSuchAlgorithmException | KeyStoreException | IOException e) { + LOG.error("Failed to load root CA management-server keystore due to exception: ", e); + return false; + } + return managementKeyStore != null; + } + + private boolean setupCA() { + if (!loadRootCAKeyPair() && !saveNewRootCAKeypair()) { + LOG.error("Failed to save and load root CA keypair"); + return false; + } + if (!loadRootCACertificate() && !saveNewRootCACertificate()) { + LOG.error("Failed to save and load root CA certificate"); + return false; + } + if (!loadManagementKeyStore()) { + LOG.error("Failed to check and configure management server keystore"); + return false; + } + return true; + } + + @Override + public boolean start() { + return loadRootCAKeyPair() && loadRootCAKeyPair() && loadManagementKeyStore(); + } + + @Override + public boolean configure(String name, Map params) throws ConfigurationException { + super.configure(name, params); + Security.addProvider(new BouncyCastleProvider()); + final GlobalLock caLock = GlobalLock.getInternLock("RootCAProviderSetup"); + try { + if (caLock.lock(5 * 60)) { + try { + return setupCA(); + } finally { + caLock.unlock(); + } + } else { + LOG.error("Failed to grab lock and setup CA, startup method will try to load the CA certificate and keypair."); + } + } finally { + caLock.releaseRef(); + } + return true; + } + + /////////////////////////////////////////////////////// + /////////////// Root CA Descriptors /////////////////// + /////////////////////////////////////////////////////// + + @Override + public String getConfigComponentName() { + return RootCAProvider.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[]{ + rootCAPrivateKey, + rootCAPublicKey, + rootCACertificate, + rootCAIssuerDN, + rootCAAuthStrictness, + rootCAAllowExpiredCert + }; + } + + @Override + public String getProviderName() { + return "root"; + } + + @Override + public String getDescription() { + return "CloudStack's Root CA provider plugin"; + } +} diff --git a/plugins/ca/root-ca/test/org/apache/cloudstack/ca/provider/RootCACustomTrustManagerTest.java b/plugins/ca/root-ca/test/org/apache/cloudstack/ca/provider/RootCACustomTrustManagerTest.java new file mode 100644 index 000000000000..8161d75e0ef1 --- /dev/null +++ b/plugins/ca/root-ca/test/org/apache/cloudstack/ca/provider/RootCACustomTrustManagerTest.java @@ -0,0 +1,110 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package org.apache.cloudstack.ca.provider; + +import java.math.BigInteger; +import java.security.KeyPair; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Collections; +import java.util.HashMap; +import java.util.Map; + +import org.apache.cloudstack.utils.security.CertUtils; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.Mock; +import org.mockito.Mockito; +import org.mockito.runners.MockitoJUnitRunner; + +import com.cloud.certificate.CrlVO; +import com.cloud.certificate.dao.CrlDao; + +@RunWith(MockitoJUnitRunner.class) +public class RootCACustomTrustManagerTest { + + @Mock + private CrlDao crlDao; + private KeyPair caKeypair; + private KeyPair clientKeypair; + private X509Certificate caCertificate; + private X509Certificate expiredClientCertificate; + private String clientIp = "1.2.3.4"; + private Map certMap = new HashMap<>(); + + @Before + public void setUp() throws Exception { + certMap.clear(); + caKeypair = CertUtils.generateRandomKeyPair(1024); + clientKeypair = CertUtils.generateRandomKeyPair(1024); + caCertificate = CertUtils.generateV3Certificate(null, caKeypair, caKeypair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null); + expiredClientCertificate = CertUtils.generateV3Certificate(caCertificate, caKeypair, clientKeypair.getPublic(), + "CN=cloudstack.apache.org", "SHA256withRSA", 0, Collections.singletonList("cloudstack.apache.org"), Collections.singletonList(clientIp)); + } + + @Test + public void testAuthNotStrict() throws Exception { + final RootCACustomTrustManager trustManager = new RootCACustomTrustManager(clientIp, false, true, certMap, caCertificate, crlDao); + trustManager.checkClientTrusted(null, null); + Assert.assertNull(trustManager.getAcceptedIssuers()); + } + + @Test(expected = CertificateException.class) + public void testAuthStrictWithInvalidCert() throws Exception { + final RootCACustomTrustManager trustManager = new RootCACustomTrustManager(clientIp, true, true, certMap, caCertificate, crlDao); + trustManager.checkClientTrusted(null, null); + } + + @Test(expected = CertificateException.class) + public void testAuthStrictWithRevokedCert() throws Exception { + Mockito.when(crlDao.findBySerial(Mockito.any(BigInteger.class))).thenReturn(new CrlVO()); + final RootCACustomTrustManager trustManager = new RootCACustomTrustManager(clientIp, true, true, certMap, caCertificate, crlDao); + trustManager.checkClientTrusted(new X509Certificate[]{caCertificate}, "RSA"); + } + + @Test(expected = CertificateException.class) + public void testAuthStrictWithInvalidCertOwnership() throws Exception { + Mockito.when(crlDao.findBySerial(Mockito.any(BigInteger.class))).thenReturn(null); + final RootCACustomTrustManager trustManager = new RootCACustomTrustManager(clientIp, true, true, certMap, caCertificate, crlDao); + trustManager.checkClientTrusted(new X509Certificate[]{caCertificate}, "RSA"); + } + + @Test(expected = CertificateException.class) + public void testAuthStrictWithDenyExpiredCertAndOwnership() throws Exception { + Mockito.when(crlDao.findBySerial(Mockito.any(BigInteger.class))).thenReturn(null); + final RootCACustomTrustManager trustManager = new RootCACustomTrustManager(clientIp, true, false, certMap, caCertificate, crlDao); + trustManager.checkClientTrusted(new X509Certificate[]{expiredClientCertificate}, "RSA"); + } + + @Test + public void testAuthStrictWithAllowExpiredCertAndOwnership() throws Exception { + Mockito.when(crlDao.findBySerial(Mockito.any(BigInteger.class))).thenReturn(null); + final RootCACustomTrustManager trustManager = new RootCACustomTrustManager(clientIp, true, true, certMap, caCertificate, crlDao); + Assert.assertTrue(trustManager.getAcceptedIssuers() != null); + Assert.assertTrue(trustManager.getAcceptedIssuers().length == 1); + Assert.assertEquals(trustManager.getAcceptedIssuers()[0], caCertificate); + trustManager.checkClientTrusted(new X509Certificate[]{expiredClientCertificate}, "RSA"); + Assert.assertTrue(certMap.containsKey(clientIp)); + Assert.assertEquals(certMap.get(clientIp), expiredClientCertificate); + } + +} \ No newline at end of file diff --git a/plugins/ca/root-ca/test/org/apache/cloudstack/ca/provider/RootCAProviderTest.java b/plugins/ca/root-ca/test/org/apache/cloudstack/ca/provider/RootCAProviderTest.java new file mode 100644 index 000000000000..d5d64289da28 --- /dev/null +++ b/plugins/ca/root-ca/test/org/apache/cloudstack/ca/provider/RootCAProviderTest.java @@ -0,0 +1,155 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package org.apache.cloudstack.ca.provider; + +import java.lang.reflect.Field; +import java.security.InvalidKeyException; +import java.security.KeyPair; +import java.security.NoSuchAlgorithmException; +import java.security.NoSuchProviderException; +import java.security.SignatureException; +import java.security.cert.CertificateException; +import java.security.cert.X509Certificate; +import java.util.Arrays; + +import javax.net.ssl.SSLEngine; + +import org.apache.cloudstack.framework.ca.Certificate; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.utils.security.CertUtils; +import org.apache.cloudstack.utils.security.SSLUtils; +import org.joda.time.DateTime; +import org.junit.After; +import org.junit.Assert; +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.runners.MockitoJUnitRunner; + +@RunWith(MockitoJUnitRunner.class) +public class RootCAProviderTest { + + private KeyPair caKeyPair; + private X509Certificate caCertificate; + + private RootCAProvider provider; + + private void addField(final RootCAProvider provider, final String name, final Object o) throws IllegalAccessException, NoSuchFieldException { + Field f = RootCAProvider.class.getDeclaredField(name); + f.setAccessible(true); + f.set(provider, o); + } + + private void overrideDefaultConfigValue(final ConfigKey configKey, final String name, final Object o) throws IllegalAccessException, NoSuchFieldException { + Field f = ConfigKey.class.getDeclaredField(name); + f.setAccessible(true); + f.set(configKey, o); + } + + @Before + public void setUp() throws Exception { + caKeyPair = CertUtils.generateRandomKeyPair(1024); + caCertificate = CertUtils.generateV3Certificate(null, caKeyPair, caKeyPair.getPublic(), "CN=ca", "SHA256withRSA", 365, null, null); + + provider = new RootCAProvider(); + + addField(provider, "caKeyPair", caKeyPair); + addField(provider, "caCertificate", caCertificate); + addField(provider, "caKeyPair", caKeyPair); + } + + @After + public void tearDown() throws Exception { + } + + @Test + public void testCanProvisionCertificates() { + Assert.assertTrue(provider.canProvisionCertificates()); + } + + @Test + public void testGetCaCertificate() { + Assert.assertTrue(provider.getCaCertificate().size() == 1); + Assert.assertEquals(provider.getCaCertificate().get(0), caCertificate); + } + + @Test + public void testIssueCertificateWithoutCsr() throws NoSuchProviderException, CertificateException, NoSuchAlgorithmException, InvalidKeyException, SignatureException { + final Certificate certificate = provider.issueCertificate(Arrays.asList("domain1.com", "domain2.com"), null, 1); + Assert.assertTrue(certificate != null); + Assert.assertTrue(certificate.getPrivateKey() != null); + Assert.assertEquals(certificate.getCaCertificates().get(0), caCertificate); + Assert.assertEquals(certificate.getClientCertificate().getIssuerDN(), caCertificate.getIssuerDN()); + Assert.assertTrue(certificate.getClientCertificate().getNotAfter().before(new DateTime().plusDays(1).toDate())); + certificate.getClientCertificate().verify(caCertificate.getPublicKey()); + } + + @Test + public void testIssueCertificateWithCsr() throws NoSuchProviderException, CertificateException, NoSuchAlgorithmException, InvalidKeyException, SignatureException { + final String csr = "-----BEGIN NEW CERTIFICATE REQUEST-----\n" + + "MIICxTCCAa0CAQAwUDETMBEGA1UEBhMKY2xvdWRzdGFjazETMBEGA1UEChMKY2xvdWRzdGFjazET\n" + + "MBEGA1UECxMKY2xvdWRzdGFjazEPMA0GA1UEAxMGdi0xLVZNMIIBIjANBgkqhkiG9w0BAQEFAAOC\n" + + "AQ8AMIIBCgKCAQEAhi3hOrt/p0hUmoW2A+2gFAMxSINItRrHfQ6VUnHhYKZGcTN9honVFuu30tz7\n" + + "oSLUUx1laWEWLlIozpUcPSjOuPa5a0JS8kjplMd8DLfLNeQ6gcuEWznMRJqCaKM72qn/FAK3r11l\n" + + "2NofEfWbHU5QVQ5CsYF0JndspLcnmf0tnmreAzz6vlSEPQd4g2hTSsPb72eAqYd0eJnl2oXe7cF3\n" + + "iemg6/lWoxlh8njVFDKJ5ibNQA/RSc5syzzaQ8fn/AkZlChR5pml47elfC3GuqetfZPAEP4rebXV\n" + + "zEw+UVbMo5bWx4AYm1S2HxhmsWC/1J5oxluZDtC6tjMqnkKQze8HbQIDAQABoDAwLgYJKoZIhvcN\n" + + "AQkOMSEwHzAdBgNVHQ4EFgQUdgA1C/7vW3lUcb/dnolGjZB55/AwDQYJKoZIhvcNAQELBQADggEB\n" + + "AH6ynWbyW5o4h2yEvmcr+upmu/LZYkpfwIWIo+dfrHX9OHu0rhHDIgMgqEStWzrOfhAkcEocQo21\n" + + "E4Q39nECO+cgTCQ1nfH5BVqaMEg++n6tqXBwLmAQJkftEmB+YUPFB9OGn5TQY9Pcnof95Y8xnvtR\n" + + "0DvVQa9RM9IsqxgvU4wQCcaNHuEC46Wzo7lyYJ6p//GLw8UQnHxsWktt8U+vyaqXjOvz0+nJobUz\n" + + "Jv7r7DFkOwgS6ObBczaZsv1yx2YklcKfbsI7xVsvZAXFey2RsvSJi1QPEJC5XbwDenWnCSrPfjJg\n" + + "SLJ0p9tV70D6v07r1OOmBtvU5AH4N+vioAZA0BE=\n" + + "-----END NEW CERTIFICATE REQUEST-----\n"; + final Certificate certificate = provider.issueCertificate(csr, Arrays.asList("v-1-VM", "domain1.com", "domain2.com"), null, 1); + Assert.assertTrue(certificate != null); + Assert.assertTrue(certificate.getPrivateKey() == null); + Assert.assertEquals(certificate.getCaCertificates().get(0), caCertificate); + Assert.assertTrue(certificate.getClientCertificate().getSubjectDN().toString().startsWith("CN=v-1-VM,")); + certificate.getClientCertificate().verify(caCertificate.getPublicKey()); + } + + @Test + public void testRevokeCertificate() throws Exception { + Assert.assertTrue(provider.revokeCertificate(CertUtils.generateRandomBigInt(), "anyString")); + } + + @Test + public void testCreateSSLEngineWithoutAuthStrictness() throws Exception { + overrideDefaultConfigValue(RootCAProvider.rootCAAuthStrictness, "_defaultValue", "false"); + final SSLEngine e = provider.createSSLEngine(SSLUtils.getSSLContext(), "/1.2.3.4:5678", null); + Assert.assertFalse(e.getUseClientMode()); + Assert.assertFalse(e.getNeedClientAuth()); + } + + @Test + public void testCreateSSLEngineWithAuthStrictness() throws Exception { + overrideDefaultConfigValue(RootCAProvider.rootCAAuthStrictness, "_defaultValue", "true"); + final SSLEngine e = provider.createSSLEngine(SSLUtils.getSSLContext(), "/1.2.3.4:5678", null); + Assert.assertFalse(e.getUseClientMode()); + Assert.assertTrue(e.getNeedClientAuth()); + } + + @Test + public void testGetProviderName() throws Exception { + Assert.assertEquals(provider.getProviderName(), "root"); + } + +} \ No newline at end of file diff --git a/plugins/database/mysql-ha/pom.xml b/plugins/database/mysql-ha/pom.xml index dab4bfdb4733..64dd95864924 100644 --- a/plugins/database/mysql-ha/pom.xml +++ b/plugins/database/mysql-ha/pom.xml @@ -15,7 +15,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/database/quota/pom.xml b/plugins/database/quota/pom.xml index 3f4004f2deb2..625b09088ef3 100644 --- a/plugins/database/quota/pom.xml +++ b/plugins/database/quota/pom.xml @@ -16,7 +16,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/database/quota/resources/META-INF/cloudstack/quota/spring-quota-context.xml b/plugins/database/quota/resources/META-INF/cloudstack/quota/spring-quota-context.xml index 15bc144e31a7..86a7da5aee67 100644 --- a/plugins/database/quota/resources/META-INF/cloudstack/quota/spring-quota-context.xml +++ b/plugins/database/quota/resources/META-INF/cloudstack/quota/spring-quota-context.xml @@ -20,10 +20,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/plugins/database/quota/src/org/apache/cloudstack/api/command/QuotaStatementCmd.java b/plugins/database/quota/src/org/apache/cloudstack/api/command/QuotaStatementCmd.java index 3efdf113da53..ebf3f1c636b7 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/api/command/QuotaStatementCmd.java +++ b/plugins/database/quota/src/org/apache/cloudstack/api/command/QuotaStatementCmd.java @@ -21,7 +21,6 @@ import javax.inject.Inject; -import org.apache.log4j.Logger; import org.apache.cloudstack.api.APICommand; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseCmd; @@ -29,10 +28,10 @@ import org.apache.cloudstack.api.response.AccountResponse; import org.apache.cloudstack.api.response.DomainResponse; import org.apache.cloudstack.api.response.QuotaResponseBuilder; +import org.apache.cloudstack.api.response.QuotaStatementItemResponse; import org.apache.cloudstack.api.response.QuotaStatementResponse; -import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.quota.vo.QuotaUsageVO; -import org.apache.cloudstack.api.response.QuotaStatementItemResponse; +import org.apache.log4j.Logger; import com.cloud.user.Account; @@ -62,7 +61,7 @@ public class QuotaStatementCmd extends BaseCmd { private Long accountId; @Inject - QuotaResponseBuilder _responseBuilder; + private QuotaResponseBuilder _responseBuilder; public Long getAccountId() { return accountId; @@ -119,9 +118,9 @@ public String getCommandName() { @Override public long getEntityOwnerId() { - Long accountId = _accountService.getActiveAccountByName(accountName, domainId).getAccountId(); - if (accountId == null) { - return CallContext.current().getCallingAccount().getId(); + Account activeAccountByName = _accountService.getActiveAccountByName(accountName, domainId); + if (activeAccountByName != null) { + return activeAccountByName.getAccountId(); } return Account.ACCOUNT_ID_SYSTEM; } diff --git a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java index 5748de589655..0fbf50e9a8f9 100644 --- a/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java +++ b/plugins/database/quota/src/org/apache/cloudstack/api/response/QuotaResponseBuilderImpl.java @@ -16,15 +16,22 @@ //under the License. package org.apache.cloudstack.api.response; -import com.cloud.domain.DomainVO; -import com.cloud.domain.dao.DomainDao; -import com.cloud.exception.InvalidParameterValueException; -import com.cloud.user.Account; -import com.cloud.user.AccountManager; -import com.cloud.user.AccountVO; -import com.cloud.user.User; -import com.cloud.user.dao.AccountDao; -import com.cloud.user.dao.UserDao; +import java.math.BigDecimal; +import java.math.RoundingMode; +import java.time.LocalDate; +import java.time.ZoneId; +import java.util.ArrayList; +import java.util.Calendar; +import java.util.Collection; +import java.util.Collections; +import java.util.Comparator; +import java.util.Date; +import java.util.HashMap; +import java.util.Iterator; +import java.util.List; +import java.util.ListIterator; + +import javax.inject.Inject; import org.apache.cloudstack.api.command.QuotaBalanceCmd; import org.apache.cloudstack.api.command.QuotaEmailTemplateListCmd; @@ -53,24 +60,17 @@ import org.apache.log4j.Logger; import org.springframework.stereotype.Component; -import javax.ejb.Local; -import javax.inject.Inject; - -import java.math.BigDecimal; -import java.math.RoundingMode; -import java.util.ArrayList; -import java.util.Calendar; -import java.util.Collection; -import java.util.Collections; -import java.util.Comparator; -import java.util.Date; -import java.util.HashMap; -import java.util.Iterator; -import java.util.List; -import java.util.ListIterator; +import com.cloud.domain.DomainVO; +import com.cloud.domain.dao.DomainDao; +import com.cloud.exception.InvalidParameterValueException; +import com.cloud.user.Account; +import com.cloud.user.AccountManager; +import com.cloud.user.AccountVO; +import com.cloud.user.User; +import com.cloud.user.dao.AccountDao; +import com.cloud.user.dao.UserDao; @Component -@Local(value = QuotaResponseBuilderImpl.class) public class QuotaResponseBuilderImpl implements QuotaResponseBuilder { private static final Logger s_logger = Logger.getLogger(QuotaResponseBuilderImpl.class); @@ -141,7 +141,9 @@ public List createQuotaSummaryResponse(Boolean listAll) { } else { for (final QuotaAccountVO quotaAccount : _quotaAccountDao.listAllQuotaAccount()) { AccountVO account = _accountDao.findById(quotaAccount.getId()); - if (account == null) continue; + if (account == null) { + continue; + } QuotaSummaryResponse qr = getQuotaSummaryResponse(account); result.add(qr); } @@ -181,6 +183,7 @@ public QuotaBalanceResponse createQuotaBalanceResponse(List quot throw new InvalidParameterValueException("The request period does not contain balance entries."); } Collections.sort(quotaBalance, new Comparator() { + @Override public int compare(QuotaBalanceVO o1, QuotaBalanceVO o2) { o1 = o1 == null ? new QuotaBalanceVO() : o1; o2 = o2 == null ? new QuotaBalanceVO() : o2; @@ -287,13 +290,15 @@ public QuotaStatementResponse createQuotaStatementResponse(final List , Integer> listDedicatedZones(Lis String accountName = cmd.getAccountName(); Long accountId = null; Long affinityGroupId = cmd.getAffinityGroupId(); + Long startIndex = cmd.getStartIndex(); + Long pageSize = cmd.getPageSizeVal(); if (accountName != null) { if (domainId != null) { @@ -830,7 +830,8 @@ public Pair, Integer> listDedicatedZones(Lis throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName); } } - Pair, Integer> result = _dedicatedDao.searchDedicatedZones(zoneId, domainId, accountId, affinityGroupId); + Filter searchFilter = new Filter(DedicatedResourceVO.class, "id", true, startIndex, pageSize); + Pair, Integer> result = _dedicatedDao.searchDedicatedZones(zoneId, domainId, accountId, affinityGroupId, searchFilter); return new Pair, Integer>(result.first(), result.second()); } @@ -841,6 +842,8 @@ public Pair, Integer> listDedicatedPods(List String accountName = cmd.getAccountName(); Long accountId = null; Long affinityGroupId = cmd.getAffinityGroupId(); + Long startIndex = cmd.getStartIndex(); + Long pageSize = cmd.getPageSizeVal(); if (accountName != null) { if (domainId != null) { @@ -852,7 +855,8 @@ public Pair, Integer> listDedicatedPods(List throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName); } } - Pair, Integer> result = _dedicatedDao.searchDedicatedPods(podId, domainId, accountId, affinityGroupId); + Filter searchFilter = new Filter(DedicatedResourceVO.class, "id", true, startIndex, pageSize); + Pair, Integer> result = _dedicatedDao.searchDedicatedPods(podId, domainId, accountId, affinityGroupId, searchFilter); return new Pair, Integer>(result.first(), result.second()); } @@ -863,6 +867,8 @@ public Pair, Integer> listDedicatedClusters( String accountName = cmd.getAccountName(); Long accountId = null; Long affinityGroupId = cmd.getAffinityGroupId(); + Long startIndex = cmd.getStartIndex(); + Long pageSize = cmd.getPageSizeVal(); if (accountName != null) { if (domainId != null) { @@ -874,7 +880,8 @@ public Pair, Integer> listDedicatedClusters( throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName); } } - Pair, Integer> result = _dedicatedDao.searchDedicatedClusters(clusterId, domainId, accountId, affinityGroupId); + Filter searchFilter = new Filter(DedicatedResourceVO.class, "id", true, startIndex, pageSize); + Pair, Integer> result = _dedicatedDao.searchDedicatedClusters(clusterId, domainId, accountId, affinityGroupId, searchFilter); return new Pair, Integer>(result.first(), result.second()); } @@ -884,6 +891,8 @@ public Pair, Integer> listDedicatedHosts(Lis Long domainId = cmd.getDomainId(); String accountName = cmd.getAccountName(); Long affinityGroupId = cmd.getAffinityGroupId(); + Long startIndex = cmd.getStartIndex(); + Long pageSize = cmd.getPageSizeVal(); Long accountId = null; if (accountName != null) { @@ -896,8 +905,8 @@ public Pair, Integer> listDedicatedHosts(Lis throw new InvalidParameterValueException("Please specify the domain id of the account: " + accountName); } } - - Pair, Integer> result = _dedicatedDao.searchDedicatedHosts(hostId, domainId, accountId, affinityGroupId); + Filter searchFilter = new Filter(DedicatedResourceVO.class, "id", true, startIndex, pageSize); + Pair, Integer> result = _dedicatedDao.searchDedicatedHosts(hostId, domainId, accountId, affinityGroupId, searchFilter); return new Pair, Integer>(result.first(), result.second()); } diff --git a/plugins/dedicated-resources/test/resource/dedicatedContext.xml b/plugins/dedicated-resources/test/resource/dedicatedContext.xml index 9ce8362d4b0f..62219beffe23 100644 --- a/plugins/dedicated-resources/test/resource/dedicatedContext.xml +++ b/plugins/dedicated-resources/test/resource/dedicatedContext.xml @@ -12,13 +12,13 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/tx - http://www.springframework.org/schema/tx/spring-tx-3.0.xsd + http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop - http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/deployment-planners/implicit-dedication/resources/META-INF/cloudstack/implicit-dedication/spring-implicit-dedication-context.xml b/plugins/deployment-planners/implicit-dedication/resources/META-INF/cloudstack/implicit-dedication/spring-implicit-dedication-context.xml index d14b4502ab90..3f1a715bfc54 100644 --- a/plugins/deployment-planners/implicit-dedication/resources/META-INF/cloudstack/implicit-dedication/spring-implicit-dedication-context.xml +++ b/plugins/deployment-planners/implicit-dedication/resources/META-INF/cloudstack/implicit-dedication/spring-implicit-dedication-context.xml @@ -12,10 +12,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/plugins/deployment-planners/implicit-dedication/test/org/apache/cloudstack/implicitplanner/ImplicitPlannerTest.java b/plugins/deployment-planners/implicit-dedication/test/org/apache/cloudstack/implicitplanner/ImplicitPlannerTest.java index 754f36e8edbb..79cb1b4596d8 100644 --- a/plugins/deployment-planners/implicit-dedication/test/org/apache/cloudstack/implicitplanner/ImplicitPlannerTest.java +++ b/plugins/deployment-planners/implicit-dedication/test/org/apache/cloudstack/implicitplanner/ImplicitPlannerTest.java @@ -94,6 +94,7 @@ import com.cloud.vm.VMInstanceVO; import com.cloud.vm.VirtualMachineProfileImpl; import com.cloud.vm.dao.UserVmDao; +import com.cloud.vm.dao.UserVmDetailsDao; import com.cloud.vm.dao.VMInstanceDao; @RunWith(SpringJUnit4ClassRunner.class) @@ -121,6 +122,8 @@ public class ImplicitPlannerTest { @Inject UserVmDao vmDao; @Inject + UserVmDetailsDao vmDetailsDao; + @Inject VMInstanceDao vmInstanceDao; @Inject VolumeDao volsDao; @@ -520,6 +523,11 @@ public UserVmDao userVmDao() { return Mockito.mock(UserVmDao.class); } + @Bean + public UserVmDetailsDao userVmDetailsDao() { + return Mockito.mock(UserVmDetailsDao.class); + } + @Bean public VMInstanceDao vmInstanceDao() { return Mockito.mock(VMInstanceDao.class); diff --git a/plugins/deployment-planners/user-concentrated-pod/pom.xml b/plugins/deployment-planners/user-concentrated-pod/pom.xml index b1152fb4a760..981e360010f0 100644 --- a/plugins/deployment-planners/user-concentrated-pod/pom.xml +++ b/plugins/deployment-planners/user-concentrated-pod/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/deployment-planners/user-concentrated-pod/resources/META-INF/cloudstack/user-concentrated-pod/spring-user-concentrated-pod-context.xml b/plugins/deployment-planners/user-concentrated-pod/resources/META-INF/cloudstack/user-concentrated-pod/spring-user-concentrated-pod-context.xml index e26cb2be57ea..89246a49585a 100644 --- a/plugins/deployment-planners/user-concentrated-pod/resources/META-INF/cloudstack/user-concentrated-pod/spring-user-concentrated-pod-context.xml +++ b/plugins/deployment-planners/user-concentrated-pod/resources/META-INF/cloudstack/user-concentrated-pod/spring-user-concentrated-pod-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/deployment-planners/user-dispersing/pom.xml b/plugins/deployment-planners/user-dispersing/pom.xml index efc10ce97d33..2af5e3565445 100644 --- a/plugins/deployment-planners/user-dispersing/pom.xml +++ b/plugins/deployment-planners/user-dispersing/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/event-bus/inmemory/pom.xml b/plugins/event-bus/inmemory/pom.xml index 3cc579849409..07bd0d38adb6 100644 --- a/plugins/event-bus/inmemory/pom.xml +++ b/plugins/event-bus/inmemory/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/event-bus/kafka/pom.xml b/plugins/event-bus/kafka/pom.xml index a1735ce3baad..95007a0c00c5 100644 --- a/plugins/event-bus/kafka/pom.xml +++ b/plugins/event-bus/kafka/pom.xml @@ -24,7 +24,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml @@ -36,7 +36,7 @@ org.apache.kafka kafka-clients - 0.9.0.1 + 0.11.0.1 diff --git a/plugins/event-bus/rabbitmq/pom.xml b/plugins/event-bus/rabbitmq/pom.xml index 961a63d39c10..adfa757cc4ab 100644 --- a/plugins/event-bus/rabbitmq/pom.xml +++ b/plugins/event-bus/rabbitmq/pom.xml @@ -24,14 +24,14 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml com.rabbitmq amqp-client - 3.6.1 + 5.1.1 org.apache.cloudstack diff --git a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java index 5c0d6ce60478..0b0b0839e704 100644 --- a/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java +++ b/plugins/event-bus/rabbitmq/src/org/apache/cloudstack/mom/rabbitmq/RabbitMQEventBus.java @@ -61,7 +61,7 @@ public class RabbitMQEventBus extends ManagerBase implements EventBus { private static Integer port; private static String username; private static String password; - private static String secureProtocol = "TLSv1"; + private static String secureProtocol = "TLSv1.2"; public synchronized static void setVirtualHost(String virtualHost) { RabbitMQEventBus.virtualHost = virtualHost; @@ -623,4 +623,4 @@ public void handleDelivery(String queueName, Envelope envelope, AMQP.BasicProper return; } } -} \ No newline at end of file +} diff --git a/plugins/file-systems/netapp/pom.xml b/plugins/file-systems/netapp/pom.xml index e024a68e2fea..0025e6866077 100644 --- a/plugins/file-systems/netapp/pom.xml +++ b/plugins/file-systems/netapp/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/ha-planners/skip-heurestics/pom.xml b/plugins/ha-planners/skip-heurestics/pom.xml index f9388cd3f80c..91747b6d12ee 100644 --- a/plugins/ha-planners/skip-heurestics/pom.xml +++ b/plugins/ha-planners/skip-heurestics/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/spring-skip-heurestics-context.xml b/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/spring-skip-heurestics-context.xml index 93a015874af3..21a5064908b9 100644 --- a/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/spring-skip-heurestics-context.xml +++ b/plugins/ha-planners/skip-heurestics/resources/META-INF/cloudstack/skip-heurestics/spring-skip-heurestics-context.xml @@ -12,10 +12,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/plugins/host-allocators/random/pom.xml b/plugins/host-allocators/random/pom.xml index 48786ee7ed40..1c8d0992597c 100644 --- a/plugins/host-allocators/random/pom.xml +++ b/plugins/host-allocators/random/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/host-allocators/random/resources/META-INF/cloudstack/host-allocator-random/spring-host-allocator-random-context.xml b/plugins/host-allocators/random/resources/META-INF/cloudstack/host-allocator-random/spring-host-allocator-random-context.xml index 8df1bdb97cc2..979ccc43e088 100644 --- a/plugins/host-allocators/random/resources/META-INF/cloudstack/host-allocator-random/spring-host-allocator-random-context.xml +++ b/plugins/host-allocators/random/resources/META-INF/cloudstack/host-allocator-random/spring-host-allocator-random-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml cloud-plugin-hypervisor-baremetal diff --git a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-compute/spring-baremetal-compute-context.xml b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-compute/spring-baremetal-compute-context.xml index d0b52a1bb0fc..b8cd53f9663b 100644 --- a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-compute/spring-baremetal-compute-context.xml +++ b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-compute/spring-baremetal-compute-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-discoverer/spring-baremetal-discoverer-context.xml b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-discoverer/spring-baremetal-discoverer-context.xml index c01d9c62afae..12b287714a84 100644 --- a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-discoverer/spring-baremetal-discoverer-context.xml +++ b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-discoverer/spring-baremetal-discoverer-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-network/spring-baremetal-network-context.xml b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-network/spring-baremetal-network-context.xml index c5068e7b1491..2ce81c23892b 100644 --- a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-network/spring-baremetal-network-context.xml +++ b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-network/spring-baremetal-network-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-storage/spring-baremetal-storage-context.xml b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-storage/spring-baremetal-storage-context.xml index e0a9e36ef7d4..56ede99da09e 100644 --- a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-storage/spring-baremetal-storage-context.xml +++ b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/baremetal-storage/spring-baremetal-storage-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/core/spring-baremetal-core-context.xml b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/core/spring-baremetal-core-context.xml index a153e7fb0c6a..993fe40458c0 100755 --- a/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/core/spring-baremetal-core-context.xml +++ b/plugins/hypervisors/baremetal/resources/META-INF/cloudstack/core/spring-baremetal-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalTemplateAdapter.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalTemplateAdapter.java index 53683fd01b72..d2d0029701a6 100644 --- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalTemplateAdapter.java +++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/manager/BareMetalTemplateAdapter.java @@ -84,20 +84,22 @@ private void templateCreateUsage(VMTemplateVO template, long dcId) { @Override public VMTemplateVO create(TemplateProfile profile) { VMTemplateVO template = persistTemplate(profile, State.Active); - Long zoneId = profile.getZoneId(); + List zones = profile.getZoneIdList(); // create an entry at template_store_ref with store_id = null to represent that this template is ready for use. TemplateDataStoreVO vmTemplateHost = new TemplateDataStoreVO(null, template.getId(), new Date(), 100, Status.DOWNLOADED, null, null, null, null, template.getUrl()); this._tmpltStoreDao.persist(vmTemplateHost); - if (zoneId == null || zoneId == -1) { + if (zones == null) { List dcs = _dcDao.listAllIncludingRemoved(); if (dcs != null && dcs.size() > 0) { templateCreateUsage(template, dcs.get(0).getId()); } } else { - templateCreateUsage(template, zoneId); + for (Long zoneId: zones) { + templateCreateUsage(template, zoneId); + } } _resourceLimitMgr.incrementResourceCount(profile.getAccountId(), ResourceType.template); @@ -123,8 +125,12 @@ public boolean delete(TemplateProfile profile) { boolean success = true; String zoneName; - if (!template.isCrossZones() && profile.getZoneId() != null) { - zoneName = profile.getZoneId().toString(); + if (profile.getZoneIdList() != null && profile.getZoneIdList().size() > 1) + throw new CloudRuntimeException("Operation is not supported for more than one zone id at a time"); + + if (!template.isCrossZones() && profile.getZoneIdList() != null) { + //get the first element in the list + zoneName = profile.getZoneIdList().get(0).toString(); } else { zoneName = "all zones"; } @@ -154,9 +160,16 @@ public boolean delete(TemplateProfile profile) { } } - if (profile.getZoneId() != null) { - UsageEventVO usageEvent = new UsageEventVO(eventType, account.getId(), profile.getZoneId(), templateId, null); + if (profile.getZoneIdList() != null) { + UsageEventVO usageEvent = new UsageEventVO(eventType, account.getId(), profile.getZoneIdList().get(0), + templateId, null); _usageEventDao.persist(usageEvent); + + VMTemplateZoneVO templateZone = _tmpltZoneDao.findByZoneTemplate(profile.getZoneIdList().get(0), templateId); + + if (templateZone != null) { + _tmpltZoneDao.remove(templateZone.getId()); + } } else { List dcs = _dcDao.listAllIncludingRemoved(); for (DataCenterVO dc : dcs) { @@ -165,12 +178,6 @@ public boolean delete(TemplateProfile profile) { } } - VMTemplateZoneVO templateZone = _tmpltZoneDao.findByZoneTemplate(profile.getZoneId(), templateId); - - if (templateZone != null) { - _tmpltZoneDao.remove(templateZone.getId()); - } - s_logger.debug("Successfully marked template host refs for template: " + template.getName() + " as destroyed in zone: " + zoneName); // If there are no more non-destroyed template host entries for this template, delete it diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java index e1477926091f..68acee88abe1 100644 --- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java +++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetaNetworkGuru.java @@ -154,7 +154,7 @@ private void getBaremetalIp(NicProfile nic, Pod pod, VirtualMachineProfile vm, N DataCenter dc = _dcDao.findById(pod.getDataCenterId()); if (nic.getIPv4Address() == null) { s_logger.debug(String.format("Requiring ip address: %s", nic.getIPv4Address())); - PublicIp ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), requiredIp, false); + PublicIp ip = _ipAddrMgr.assignPublicIpAddress(dc.getId(), pod.getId(), vm.getOwner(), VlanType.DirectAttached, network.getId(), requiredIp, false, false); nic.setIPv4Address(ip.getAddress().toString()); nic.setFormat(AddressFormat.Ip4); nic.setIPv4Gateway(ip.getGateway()); diff --git a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java index 77f77dd93d62..5696048b847c 100644 --- a/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java +++ b/plugins/hypervisors/baremetal/src/com/cloud/baremetal/networkservice/BaremetalDhcpElement.java @@ -180,4 +180,9 @@ public boolean removeDhcpSupportForSubnet(Network network) { return true; } + @Override + public boolean setExtraDhcpOptions(Network network, long nicId, Map dhcpOptions) { + return false; + } + } diff --git a/plugins/hypervisors/hyperv/pom.xml b/plugins/hypervisors/hyperv/pom.xml index c7cad0b39981..452024be7eb4 100644 --- a/plugins/hypervisors/hyperv/pom.xml +++ b/plugins/hypervisors/hyperv/pom.xml @@ -23,7 +23,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml diff --git a/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/core/spring-hyperv-core-context.xml b/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/core/spring-hyperv-core-context.xml index 84d50ca97e05..75bdaa1236a5 100644 --- a/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/core/spring-hyperv-core-context.xml +++ b/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/core/spring-hyperv-core-context.xml @@ -21,10 +21,10 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > diff --git a/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-compute/spring-hyperv-compute-context.xml b/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-compute/spring-hyperv-compute-context.xml index a128fbc88763..ffb6440d3cfa 100644 --- a/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-compute/spring-hyperv-compute-context.xml +++ b/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-compute/spring-hyperv-compute-context.xml @@ -12,10 +12,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-discoverer/spring-hyperv-discoverer-context.xml b/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-discoverer/spring-hyperv-discoverer-context.xml index ee394f08877e..1fcdd64d5ed6 100644 --- a/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-discoverer/spring-hyperv-discoverer-context.xml +++ b/plugins/hypervisors/hyperv/resources/META-INF/cloudstack/hyperv-discoverer/spring-hyperv-discoverer-context.xml @@ -12,10 +12,10 @@ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd"> + http://www.springframework.org/schema/context/spring-context.xsd"> diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java index fd54d43241bc..51b423052ea9 100644 --- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java +++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/discoverer/HypervServerDiscoverer.java @@ -42,8 +42,8 @@ import com.cloud.agent.api.SetupCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupRoutingCommand; -import com.cloud.configuration.Config; import com.cloud.alert.AlertManager; +import com.cloud.configuration.Config; import com.cloud.dc.ClusterVO; import com.cloud.dc.DataCenterVO; import com.cloud.dc.HostPodVO; @@ -257,7 +257,7 @@ public final Map> find(final long return null; } - s_logger.info("Creating" + HypervDirectConnectResource.class.getName() + " HypervDummyResourceBase for zone/pod/cluster " + dcId + "/" + podId + "/" + + s_logger.info("Creating" + HypervDirectConnectResource.class.getName() + " HypervDirectConnectResource for zone/pod/cluster " + dcId + "/" + podId + "/" + clusterId); // Some Hypervisors organise themselves in pools. diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/manager/HypervManagerImpl.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/manager/HypervManagerImpl.java index c512445752a3..9d63726d3474 100644 --- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/manager/HypervManagerImpl.java +++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/manager/HypervManagerImpl.java @@ -26,16 +26,14 @@ import java.util.Map; import java.util.Random; -import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.log4j.Logger; - import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.framework.config.dao.ConfigurationDao; import org.apache.cloudstack.utils.identity.ManagementServerNode; +import org.apache.log4j.Logger; import com.cloud.configuration.Config; import com.cloud.storage.JavaStorageLayer; @@ -48,7 +46,6 @@ import com.cloud.vm.dao.NicDao; import com.cloud.vm.dao.VMInstanceDao; -@Local(value = {HypervManager.class}) public class HypervManagerImpl implements HypervManager { public static final Logger s_logger = Logger.getLogger(HypervManagerImpl.class); @@ -126,6 +123,7 @@ public void setRunLevel(int level) { runLevel = level; } + @Override public String prepareSecondaryStorageStore(long zoneId) { String secondaryStorageUri = getSecondaryStorageStoreUrl(zoneId); if (secondaryStorageUri == null) { diff --git a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java index 862cc30a2e5b..1f9ad02b61fd 100644 --- a/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java +++ b/plugins/hypervisors/hyperv/src/com/cloud/hypervisor/hyperv/resource/HypervDirectConnectResource.java @@ -32,7 +32,6 @@ import java.security.UnrecoverableKeyException; import java.security.cert.CertificateException; import java.security.cert.X509Certificate; -import org.joda.time.Duration; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; @@ -40,7 +39,6 @@ import java.util.Map; import javax.annotation.PostConstruct; -import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; @@ -63,6 +61,7 @@ import org.apache.http.impl.conn.BasicClientConnectionManager; import org.apache.http.util.EntityUtils; import org.apache.log4j.Logger; +import org.joda.time.Duration; import com.cloud.agent.api.Answer; import com.cloud.agent.api.CheckRouterAnswer; @@ -161,7 +160,6 @@ /** * Implementation of dummy resource to be returned from discoverer. **/ -@Local(value = ServerResource.class) public class HypervDirectConnectResource extends ServerResourceBase implements ServerResource, VirtualRouterDeployer { public static final int DEFAULT_AGENT_PORT = 8250; public static final String HOST_VM_STATE_REPORT_COMMAND = "org.apache.cloudstack.HostVmStateReportCommand"; @@ -1377,7 +1375,7 @@ protected Answer execute(final LoadBalancerConfigCommand cmd) { if (!result.first()) { s_logger.error("Unable to copy haproxy configuration file"); - return new Answer(cmd, false, "LoadBalancerConfigCommand failed due to uanble to copy haproxy configuration file"); + return new Answer(cmd, false, "LoadBalancerConfigCommand failed due to unable to copy haproxy configuration file"); } final String command = String.format("%s%s %s", "/root/", VRScripts.LB, args); diff --git a/plugins/hypervisors/kvm/pom.xml b/plugins/hypervisors/kvm/pom.xml index a3198590c76f..1d0dd66cf878 100644 --- a/plugins/hypervisors/kvm/pom.xml +++ b/plugins/hypervisors/kvm/pom.xml @@ -15,7 +15,7 @@ org.apache.cloudstack cloudstack-plugins - 4.9.4.0-SNAPSHOT + 4.11.1.0-SNAPSHOT ../../pom.xml @@ -39,6 +39,11 @@ cloud-plugin-network-ovs ${project.version} + + org.apache.cloudstack + cloud-engine-storage-configdrive + ${project.version} + com.ceph rados diff --git a/plugins/hypervisors/kvm/resources/META-INF/cloudstack/kvm-compute/spring-kvm-compute-context.xml b/plugins/hypervisors/kvm/resources/META-INF/cloudstack/kvm-compute/spring-kvm-compute-context.xml index ce596f22bbf1..9bcfdd9c3061 100644 --- a/plugins/hypervisors/kvm/resources/META-INF/cloudstack/kvm-compute/spring-kvm-compute-context.xml +++ b/plugins/hypervisors/kvm/resources/META-INF/cloudstack/kvm-compute/spring-kvm-compute-context.xml @@ -21,14 +21,21 @@ xmlns:context="http://www.springframework.org/schema/context" xmlns:aop="http://www.springframework.org/schema/aop" xsi:schemaLocation="http://www.springframework.org/schema/beans - http://www.springframework.org/schema/beans/spring-beans-3.0.xsd - http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-3.0.xsd + http://www.springframework.org/schema/beans/spring-beans.xsd + http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd http://www.springframework.org/schema/context - http://www.springframework.org/schema/context/spring-context-3.0.xsd" + http://www.springframework.org/schema/context/spring-context.xsd" > + + + + + + + diff --git a/plugins/hypervisors/kvm/src/com/cloud/ha/KVMInvestigator.java b/plugins/hypervisors/kvm/src/com/cloud/ha/KVMInvestigator.java index 8337a7b76461..a6cddc7dfabb 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/ha/KVMInvestigator.java +++ b/plugins/hypervisors/kvm/src/com/cloud/ha/KVMInvestigator.java @@ -29,7 +29,7 @@ import com.cloud.resource.ResourceManager; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.component.AdapterBase; - +import org.apache.cloudstack.ha.HAManager; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; import org.apache.log4j.Logger; @@ -40,17 +40,23 @@ public class KVMInvestigator extends AdapterBase implements Investigator { private final static Logger s_logger = Logger.getLogger(KVMInvestigator.class); @Inject - HostDao _hostDao; + private HostDao _hostDao; + @Inject + private AgentManager _agentMgr; @Inject - AgentManager _agentMgr; + private ResourceManager _resourceMgr; @Inject - ResourceManager _resourceMgr; + private PrimaryDataStoreDao _storagePoolDao; @Inject - PrimaryDataStoreDao _storagePoolDao; + private HAManager haManager; @Override public boolean isVmAlive(com.cloud.vm.VirtualMachine vm, Host host) throws UnknownVM { + if (haManager.isHAEligible(host)) { + return haManager.isVMAliveOnHost(host); + } Status status = isAgentAlive(host); + s_logger.debug("HA: HOST is ineligible legacy state " + status + " for host " + host.getId()); if (status == null) { throw new UnknownVM(); } @@ -67,6 +73,10 @@ public Status isAgentAlive(Host agent) { return null; } + if (haManager.isHAEligible(agent)) { + return haManager.getHostStatus(agent); + } + List clusterPools = _storagePoolDao.listPoolsByCluster(agent.getClusterId()); boolean hasNfs = false; for (StoragePoolVO pool : clusterPools) { @@ -123,6 +133,7 @@ public Status isAgentAlive(Host agent) { if (neighbourStatus == Status.Down && (hostStatus == Status.Disconnected || hostStatus == Status.Down)) { hostStatus = Status.Down; } + s_logger.debug("HA: HOST is ineligible legacy state " + hostStatus + " for host " + agent.getId()); return hostStatus; } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java index 2fab9a83cf72..11b22c494f46 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/BridgeVifDriver.java @@ -20,16 +20,19 @@ package com.cloud.hypervisor.kvm.resource; import java.io.File; +import java.util.ArrayList; +import java.util.List; import java.util.Map; import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.naming.ConfigurationException; -import com.google.common.base.Strings; import org.apache.log4j.Logger; import org.libvirt.LibvirtException; +import com.google.common.base.Strings; + import com.cloud.agent.api.to.NicTO; import com.cloud.exception.InternalErrorException; import com.cloud.network.Networks; @@ -54,6 +57,8 @@ public void configure(Map params) throws ConfigurationException super.configure(params); + getPifs(); + // Set the domr scripts directory params.put("domr.scripts.dir", "scripts/network/domr/kvm"); @@ -80,12 +85,125 @@ public void configure(Map params) throws ConfigurationException if (libvirtVersion == null) { libvirtVersion = 0L; } + } - try { - createControlNetwork(); - } catch (LibvirtException e) { - throw new ConfigurationException(e.getMessage()); + public void getPifs() { + final File dir = new File("/sys/devices/virtual/net"); + final File[] netdevs = dir.listFiles(); + final List bridges = new ArrayList(); + for (File netdev : netdevs) { + final File isbridge = new File(netdev.getAbsolutePath() + "/bridge"); + final String netdevName = netdev.getName(); + s_logger.debug("looking in file " + netdev.getAbsolutePath() + "/bridge"); + if (isbridge.exists()) { + s_logger.debug("Found bridge " + netdevName); + bridges.add(netdevName); + } + } + + String guestBridgeName = _libvirtComputingResource.getGuestBridgeName(); + String publicBridgeName = _libvirtComputingResource.getPublicBridgeName(); + + for (final String bridge : bridges) { + s_logger.debug("looking for pif for bridge " + bridge); + final String pif = getPif(bridge); + if (_libvirtComputingResource.isPublicBridge(bridge)) { + _pifs.put("public", pif); + } + if (guestBridgeName != null && bridge.equals(guestBridgeName)) { + _pifs.put("private", pif); + } + _pifs.put(bridge, pif); + } + + // guest(private) creates bridges on a pif, if private bridge not found try pif direct + // This addresses the unnecessary requirement of someone to create an unused bridge just for traffic label + if (_pifs.get("private") == null) { + s_logger.debug("guest(private) traffic label '" + guestBridgeName + "' not found as bridge, looking for physical interface"); + final File dev = new File("/sys/class/net/" + guestBridgeName); + if (dev.exists()) { + s_logger.debug("guest(private) traffic label '" + guestBridgeName + "' found as a physical device"); + _pifs.put("private", guestBridgeName); + } + } + + // public creates bridges on a pif, if private bridge not found try pif direct + // This addresses the unnecessary requirement of someone to create an unused bridge just for traffic label + if (_pifs.get("public") == null) { + s_logger.debug("public traffic label '" + publicBridgeName+ "' not found as bridge, looking for physical interface"); + final File dev = new File("/sys/class/net/" + publicBridgeName); + if (dev.exists()) { + s_logger.debug("public traffic label '" + publicBridgeName + "' found as a physical device"); + _pifs.put("public", publicBridgeName); + } + } + + s_logger.debug("done looking for pifs, no more bridges"); + } + + private String getPif(final String bridge) { + String pif = matchPifFileInDirectory(bridge); + final File vlanfile = new File("/proc/net/vlan/" + pif); + + if (vlanfile.isFile()) { + pif = Script.runSimpleBashScript("grep ^Device\\: /proc/net/vlan/" + pif + " | awk {'print $2'}"); } + + return pif; + } + + private String matchPifFileInDirectory(final String bridgeName) { + final File brif = new File("/sys/devices/virtual/net/" + bridgeName + "/brif"); + + if (!brif.isDirectory()) { + final File pif = new File("/sys/class/net/" + bridgeName); + if (pif.isDirectory()) { + // if bridgeName already refers to a pif, return it as-is + return bridgeName; + } + s_logger.debug("failing to get physical interface from bridge " + bridgeName + ", does " + brif.getAbsolutePath() + "exist?"); + return ""; + } + + final File[] interfaces = brif.listFiles(); + + for (File anInterface : interfaces) { + final String fname = anInterface.getName(); + s_logger.debug("matchPifFileInDirectory: file name '" + fname + "'"); + if (isInterface(fname)) { + return fname; + } + } + + s_logger.debug("failing to get physical interface from bridge " + bridgeName + ", did not find an eth*, bond*, team*, vlan*, em*, p*p*, ens*, eno*, enp*, or enx* in " + brif.getAbsolutePath()); + return ""; + } + + private static final String [] IF_NAME_PATTERNS = { + "^eth", + "^bond", + "^vlan", + "^vx", + "^em", + "^ens", + "^eno", + "^enp", + "^team", + "^enx", + "^p\\d+p\\d+" + }; + + /** + * @param fname + * @return + */ + private static boolean isInterface(final String fname) { + StringBuilder commonPattern = new StringBuilder(); + for (final String ifNamePattern : IF_NAME_PATTERNS) { + commonPattern.append("|(").append(ifNamePattern).append(".*)"); + } + + return fname.matches(commonPattern.toString()); } @Override @@ -161,6 +279,7 @@ public LibvirtVMDef.InterfaceDef plug(NicTO nic, String guestOsType, String nicA if (nic.getPxeDisable() == true) { intf.setPxeDisable(true); } + return intf; } @@ -169,6 +288,16 @@ public void unplug(LibvirtVMDef.InterfaceDef iface) { deleteVnetBr(iface.getBrName()); } + @Override + public void attach(LibvirtVMDef.InterfaceDef iface) { + Script.runSimpleBashScript("brctl addif " + iface.getBrName() + " " + iface.getDevName()); + } + + @Override + public void detach(LibvirtVMDef.InterfaceDef iface) { + Script.runSimpleBashScript("test -d /sys/class/net/" + iface.getBrName() + "/brif/" + iface.getDevName() + " && brctl delif " + iface.getBrName() + " " + iface.getDevName()); + } + private String setVnetBrName(String pifName, String vnetId) { return "br" + pifName + "-" + vnetId; } @@ -272,10 +401,6 @@ private void deleteVnetBr(String brName) { } } - private void createControlNetwork() throws LibvirtException { - createControlNetwork(_bridges.get("linklocal")); - } - private void deleteExistingLinkLocalRouteTable(String linkLocalBr) { Script command = new Script("/bin/bash", _timeout); command.add("-c"); @@ -304,16 +429,21 @@ private void deleteExistingLinkLocalRouteTable(String linkLocalBr) { } } - private void createControlNetwork(String privBrName) { + private void createControlNetwork() { + createControlNetwork(_bridges.get("linklocal")); + } + + @Override + public void createControlNetwork(String privBrName) { deleteExistingLinkLocalRouteTable(privBrName); - if (!isBridgeExists(privBrName)) { + if (!isExistingBridge(privBrName)) { Script.runSimpleBashScript("brctl addbr " + privBrName + "; ip link set " + privBrName + " up; ip address add 169.254.0.1/16 dev " + privBrName, _timeout); } - } - private boolean isBridgeExists(String bridgeName) { - File f = new File("/sys/devices/virtual/net/" + bridgeName); + @Override + public boolean isExistingBridge(String bridgeName) { + File f = new File("/sys/devices/virtual/net/" + bridgeName + "/bridge"); if (f.exists()) { return true; } else { diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java index 3cc8839176c3..b8763fa8da7a 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/DirectVifDriver.java @@ -63,4 +63,18 @@ public void unplug(LibvirtVMDef.InterfaceDef iface) { // not needed, libvirt will cleanup } + @Override + public void attach(LibvirtVMDef.InterfaceDef iface) { + + } + + @Override + public void detach(LibvirtVMDef.InterfaceDef iface) { + + } + + @Override + public void createControlNetwork(String privBrName) { + } + } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java index 1aae2b58933c..8e73d859039f 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/IvsVifDriver.java @@ -74,8 +74,6 @@ public void configure(Map params) throws ConfigurationException if (libvirtVersion == null) { libvirtVersion = 0L; } - - createControlNetwork(_bridges.get("linklocal")); } @Override @@ -145,6 +143,17 @@ public InterfaceDef plug(NicTO nic, String guestOsType, String nicAdapter) throw public void unplug(InterfaceDef iface) { } + @Override + public void attach(LibvirtVMDef.InterfaceDef iface) { + Script.runSimpleBashScript("/usr/sbin/ivs-ctl add-port " + iface.getDevName()); + } + + @Override + public void detach(LibvirtVMDef.InterfaceDef iface) { + Script.runSimpleBashScript("/usr/sbin/ivs-ctl del-port " + iface.getDevName()); + } + + private void createControlNetwork() throws LibvirtException { createControlNetwork(_bridges.get("linklocal")); } @@ -268,7 +277,8 @@ private void deleteExitingLinkLocalRouteTable(String linkLocalBr) { } } - private void createControlNetwork(String privBrName) { + @Override + public void createControlNetwork(String privBrName) { deleteExitingLinkLocalRouteTable(privBrName); if (!isBridgeExists(privBrName)) { Script.runSimpleBashScript("brctl addbr " + privBrName + "; ip link set " + privBrName + " up; ip address add 169.254.0.1/16 dev " + privBrName, _timeout); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHABase.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHABase.java index b829f78f625f..f180848a8d5c 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHABase.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHABase.java @@ -34,7 +34,8 @@ public class KVMHABase { protected static String s_heartBeatPath; protected long _heartBeatUpdateTimeout = 60000; protected long _heartBeatUpdateFreq = 60000; - protected long _heartBeatUpdateMaxRetry = 3; + protected long _heartBeatUpdateMaxTries = 5; + protected long _heartBeatUpdateRetrySleep = 15000; public static enum PoolType { PrimaryStorage, SecondaryStorage @@ -179,4 +180,9 @@ protected String runScriptRetry(String cmdString, OutputInterpreter interpreter) return result; } + + public Boolean checkingHB() { + // TODO Auto-generated method stub + return null; + } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAChecker.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAChecker.java index c2af191cae67..3905b1ede304 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAChecker.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAChecker.java @@ -40,10 +40,10 @@ public KVMHAChecker(List pools, String host) { * True means heartbeaing is on going, or we can't get it's status. False * means heartbeating is stopped definitely */ - private Boolean checkingHB() { + @Override + public Boolean checkingHB() { List results = new ArrayList(); for (NfsStoragePool pool : _pools) { - Script cmd = new Script(s_heartBeatPath, _heartBeatCheckerTimeout, s_logger); cmd.add("-i", pool._poolIp); cmd.add("-p", pool._poolMountSourcePath); @@ -53,11 +53,11 @@ private Boolean checkingHB() { cmd.add("-t", String.valueOf(_heartBeatUpdateFreq / 1000)); OutputInterpreter.OneLineParser parser = new OutputInterpreter.OneLineParser(); String result = cmd.execute(parser); - s_logger.debug("pool: " + pool._poolIp); - s_logger.debug("reture: " + result); - s_logger.debug("parser: " + parser.getLine()); + s_logger.debug("KVMHAChecker pool: " + pool._poolIp); + s_logger.debug("KVMHAChecker result: " + result); + s_logger.debug("KVMHAChecker parser: " + parser.getLine()); if (result == null && parser.getLine().contains("> DEAD <")) { - s_logger.debug("read heartbeat failed: " + result); + s_logger.debug("read heartbeat failed: "); results.add(false); } else { results.add(true); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAMonitor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAMonitor.java index 49aa99cea689..8a11b7fc962c 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAMonitor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAMonitor.java @@ -16,22 +16,20 @@ // under the License. package com.cloud.hypervisor.kvm.resource; -import java.util.ArrayList; -import java.util.HashSet; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.concurrent.ConcurrentHashMap; - +import com.cloud.utils.script.Script; +import org.apache.cloudstack.managed.context.ManagedContextRunnable; import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.LibvirtException; import org.libvirt.StoragePool; import org.libvirt.StoragePoolInfo.StoragePoolState; -import org.apache.cloudstack.managed.context.ManagedContextRunnable; - -import com.cloud.utils.script.Script; +import java.util.ArrayList; +import java.util.HashSet; +import java.util.List; +import java.util.Map; +import java.util.Set; +import java.util.concurrent.ConcurrentHashMap; public class KVMHAMonitor extends KVMHABase implements Runnable { private static final Logger s_logger = Logger.getLogger(KVMHAMonitor.class); @@ -73,6 +71,12 @@ public List getStoragePools() { } } + public NfsStoragePool getStoragePool(String uuid) { + synchronized (_storagePool) { + return _storagePool.get(uuid); + } + } + private class Monitor extends ManagedContextRunnable { @Override @@ -115,7 +119,8 @@ protected void runInContext() { } String result = null; - for (int i = 0; i < 5; i++) { + // Try multiple times, but sleep in between tries to ensure it isn't a short lived transient error + for (int i = 1; i <= _heartBeatUpdateMaxTries; i++) { Script cmd = new Script(s_heartBeatPath, _heartBeatUpdateTimeout, s_logger); cmd.add("-i", primaryStoragePool._poolIp); cmd.add("-p", primaryStoragePool._poolMountSourcePath); @@ -123,14 +128,21 @@ protected void runInContext() { cmd.add("-h", _hostIP); result = cmd.execute(); if (result != null) { - s_logger.warn("write heartbeat failed: " + result + ", retry: " + i); + s_logger.warn("write heartbeat failed: " + result + ", try: " + i + " of " + _heartBeatUpdateMaxTries); + try { + Thread.sleep(_heartBeatUpdateRetrySleep); + } catch (InterruptedException e) { + s_logger.debug("[ignored] interupted between heartbeat retries."); + } } else { break; } } if (result != null) { - s_logger.warn("write heartbeat failed: " + result + "; reboot the host"); + // Stop cloudstack-agent if can't write to heartbeat file. + // This will raise an alert on the mgmt server + s_logger.warn("write heartbeat failed: " + result + "; stopping cloudstack-agent"); Script cmd = new Script(s_heartBeatPath, _heartBeatUpdateTimeout, s_logger); cmd.add("-i", primaryStoragePool._poolIp); cmd.add("-p", primaryStoragePool._poolMountSourcePath); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAVMActivityChecker.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAVMActivityChecker.java new file mode 100644 index 000000000000..f14d0a25b7fb --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/KVMHAVMActivityChecker.java @@ -0,0 +1,70 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.hypervisor.kvm.resource; + +import com.cloud.utils.script.OutputInterpreter; +import com.cloud.utils.script.Script; +import org.apache.log4j.Logger; +import org.joda.time.Duration; + +import java.util.concurrent.Callable; + +public class KVMHAVMActivityChecker extends KVMHABase implements Callable { + private static final Logger LOG = Logger.getLogger(KVMHAVMActivityChecker.class); + + final private NfsStoragePool nfsStoragePool; + final private String hostIP; + final private String volumeUuidList; + final private String vmActivityCheckPath; + final private Duration activityScriptTimeout = Duration.standardSeconds(3600L); + final private long suspectTimeInSeconds; + + public KVMHAVMActivityChecker(final NfsStoragePool pool, final String host, final String volumeUUIDListString, String vmActivityCheckPath, final long suspectTime) { + this.nfsStoragePool = pool; + this.hostIP = host; + this.volumeUuidList = volumeUUIDListString; + this.vmActivityCheckPath = vmActivityCheckPath; + this.suspectTimeInSeconds = suspectTime; + } + + @Override + public Boolean checkingHB() { + Script cmd = new Script(vmActivityCheckPath, activityScriptTimeout.getStandardSeconds(), LOG); + cmd.add("-i", nfsStoragePool._poolIp); + cmd.add("-p", nfsStoragePool._poolMountSourcePath); + cmd.add("-m", nfsStoragePool._mountDestPath); + cmd.add("-h", hostIP); + cmd.add("-u", volumeUuidList); + cmd.add("-t", String.valueOf(String.valueOf(System.currentTimeMillis() / 1000))); + cmd.add("-d", String.valueOf(suspectTimeInSeconds)); + OutputInterpreter.OneLineParser parser = new OutputInterpreter.OneLineParser(); + String result = cmd.execute(parser); + LOG.debug("KVMHAVMActivityChecker pool: " + nfsStoragePool._poolIp); + LOG.debug("KVMHAVMActivityChecker result: " + result); + LOG.debug("KVMHAVMActivityChecker parser: " + parser.getLine()); + if (result == null && parser.getLine().contains("DEAD")) { + return false; + } else { + return true; + } + } + + @Override + public Boolean call() throws Exception { + return checkingHB(); + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java index db47f466bfe6..424280cc66ca 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -22,10 +22,10 @@ import java.io.FileReader; import java.io.IOException; import java.io.Reader; +import java.io.StringReader; import java.net.InetAddress; import java.net.URI; import java.net.URISyntaxException; -import org.joda.time.Duration; import java.util.ArrayList; import java.util.Arrays; import java.util.Calendar; @@ -42,8 +42,10 @@ import java.util.regex.Matcher; import java.util.regex.Pattern; -import javax.ejb.Local; import javax.naming.ConfigurationException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; import org.apache.cloudstack.storage.to.VolumeObjectTO; @@ -51,20 +53,29 @@ import org.apache.cloudstack.utils.linux.CPUStat; import org.apache.cloudstack.utils.linux.MemStat; import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; +import org.apache.cloudstack.utils.security.KeyStoreUtils; import org.apache.commons.io.FileUtils; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.ArrayUtils; import org.apache.commons.lang.math.NumberUtils; import org.apache.log4j.Logger; +import org.joda.time.Duration; import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainBlockStats; import org.libvirt.DomainInfo; import org.libvirt.DomainInfo.DomainState; import org.libvirt.DomainInterfaceStats; +import org.libvirt.DomainSnapshot; import org.libvirt.LibvirtException; import org.libvirt.MemoryStatistic; import org.libvirt.NodeInfo; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.InputSource; +import org.xml.sax.SAXException; import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; @@ -77,6 +88,7 @@ import com.cloud.agent.api.StartupRoutingCommand; import com.cloud.agent.api.StartupStorageCommand; import com.cloud.agent.api.VmDiskStatsEntry; +import com.cloud.agent.api.VmNetworkStatsEntry; import com.cloud.agent.api.VmStatsEntry; import com.cloud.agent.api.routing.IpAssocCommand; import com.cloud.agent.api.routing.IpAssocVpcCommand; @@ -96,6 +108,7 @@ import com.cloud.exception.InternalErrorException; import com.cloud.host.Host.Type; import com.cloud.hypervisor.Hypervisor.HypervisorType; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ClockDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ConsoleDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.CpuModeDef; @@ -103,6 +116,7 @@ import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DevicesDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DeviceType; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiscardType; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiskProtocol; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.FeaturesDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.FilesystemDef; @@ -112,10 +126,15 @@ import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InputDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef.GuestNetType; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef.RngBackendModel; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.SCSIDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.SerialDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.TermPolicy; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.VideoDef; -import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.VirtioSerialDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogAction; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogModel; import com.cloud.hypervisor.kvm.resource.wrapper.LibvirtRequestWrapper; import com.cloud.hypervisor.kvm.resource.wrapper.LibvirtUtilitiesHelper; import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; @@ -138,6 +157,8 @@ import com.cloud.utils.NumbersUtil; import com.cloud.utils.Pair; import com.cloud.utils.PropertiesUtil; +import com.cloud.utils.StringUtils; +import com.cloud.utils.Ternary; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.net.NetUtils; import com.cloud.utils.script.OutputInterpreter; @@ -146,6 +167,8 @@ import com.cloud.utils.ssh.SshHelper; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.PowerState; +import com.cloud.vm.VmDetailConstants; +import com.google.common.base.Strings; /** * LibvirtComputingResource execute requests on the computing/routing host using @@ -169,7 +192,6 @@ * private mac addresses for domrs | mac address | start + 126 || || * pool | the parent of the storage pool hierarchy * } **/ -@Local(value = {ServerResource.class}) public class LibvirtComputingResource extends ServerResourceBase implements ServerResource, VirtualRouterDeployer { private static final Logger s_logger = Logger.getLogger(LibvirtComputingResource.class); @@ -181,6 +203,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv private String _resizeVolumePath; private String _createTmplPath; private String _heartBeatPath; + private String _vmActivityCheckPath; private String _securityGroupPath; private String _ovsPvlanDhcpHostPath; private String _ovsPvlanVmPath; @@ -217,6 +240,7 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv protected long _hypervisorLibvirtVersion; protected long _hypervisorQemuVersion; protected String _hypervisorPath; + protected String _hostDistro; protected String _networkDirectSourceMode; protected String _networkDirectDevice; protected String _sysvmISOPath; @@ -245,6 +269,16 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv protected long _diskActivityCheckFileSizeMin = 10485760; // 10MB protected int _diskActivityCheckTimeoutSeconds = 120; // 120s protected long _diskActivityInactiveThresholdMilliseconds = 30000; // 30s + protected boolean _rngEnable = false; + protected RngBackendModel _rngBackendModel = RngBackendModel.RANDOM; + protected String _rngPath = "/dev/random"; + protected int _rngRatePeriod = 1000; + protected int _rngRateBytes = 2048; + private File _qemuSocketsPath; + private final String _qemuGuestAgentSocketName = "org.qemu.guest_agent.0"; + private long _totalMemory; + protected WatchDogAction _watchDogAction = WatchDogAction.NONE; + protected WatchDogModel _watchDogModel = WatchDogModel.I6300ESB; private final Map _pifs = new HashMap(); private final Map _vmStats = new ConcurrentHashMap(); @@ -270,6 +304,8 @@ public class LibvirtComputingResource extends ServerResourceBase implements Serv private long _dom0MinMem; + private long _dom0OvercommitMem; + protected boolean _disconnected = true; protected int _cmdsTimeout; protected int _stopTimeout; @@ -296,21 +332,27 @@ public ExecutionResult executeInVR(final String routerIp, final String script, f if (details == null) { details = parser.getLines(); } + + s_logger.debug("Executing script in VR: " + script); + return new ExecutionResult(command.getExitValue() == 0, details); } @Override public ExecutionResult createFileInVR(final String routerIp, final String path, final String filename, final String content) { final File permKey = new File("/root/.ssh/id_rsa.cloud"); - String error = null; + boolean success = true; + String details = "Creating file in VR, with ip: " + routerIp + ", file: " + filename; + s_logger.debug(details); try { SshHelper.scpTo(routerIp, 3922, "root", permKey, null, path, content.getBytes(), filename, null); } catch (final Exception e) { s_logger.warn("Fail to create file " + path + filename + " in VR " + routerIp, e); - error = e.getMessage(); + details = e.getMessage(); + success = false; } - return new ExecutionResult(error == null, error); + return new ExecutionResult(success, details); } @Override @@ -419,6 +461,10 @@ public String getGuestBridgeName() { return _guestBridgeName; } + public String getVmActivityCheckPath() { + return _vmActivityCheckPath; + } + public String getOvsPvlanDhcpHostPath() { return _ovsPvlanDhcpHostPath; } @@ -659,6 +705,11 @@ public boolean configure(final String name, final Map params) th throw new ConfigurationException("Unable to find the resizevolume.sh"); } + _vmActivityCheckPath = Script.findScript(kvmScriptsDir, "kvmvmactivity.sh"); + if (_vmActivityCheckPath == null) { + throw new ConfigurationException("Unable to find kvmvmactivity.sh"); + } + _createTmplPath = Script.findScript(storageScriptsDir, "createtmplt.sh"); if (_createTmplPath == null) { throw new ConfigurationException("Unable to find the createtmplt.sh"); @@ -769,6 +820,13 @@ public boolean configure(final String name, final Map params) th _localStoragePath = "/var/lib/libvirt/images/"; } + /* Directory to use for Qemu sockets like for the Qemu Guest Agent */ + _qemuSocketsPath = new File("/var/lib/libvirt/qemu"); + String _qemuSocketsPathVar = (String)params.get("qemu.sockets.path"); + if (_qemuSocketsPathVar != null && StringUtils.isNotBlank(_qemuSocketsPathVar)) { + _qemuSocketsPath = new File(_qemuSocketsPathVar); + } + final File storagePath = new File(_localStoragePath); _localStoragePath = storagePath.getAbsolutePath(); @@ -799,11 +857,47 @@ public boolean configure(final String name, final Map params) th // Reserve 1GB unless admin overrides _dom0MinMem = NumbersUtil.parseInt(value, 1024) * 1024 * 1024L; + value = (String)params.get("host.overcommit.mem.mb"); + // Support overcommit memory for host if host uses ZSWAP, KSM and other memory + // compressing technologies + _dom0OvercommitMem = NumbersUtil.parseInt(value, 0) * 1024 * 1024L; + value = (String) params.get("kvmclock.disable"); if (Boolean.parseBoolean(value)) { _noKvmClock = true; } + value = (String) params.get("vm.rng.enable"); + if (Boolean.parseBoolean(value)) { + _rngEnable = true; + + value = (String) params.get("vm.rng.model"); + if (!Strings.isNullOrEmpty(value)) { + _rngBackendModel = RngBackendModel.valueOf(value.toUpperCase()); + } + + value = (String) params.get("vm.rng.path"); + if (!Strings.isNullOrEmpty(value)) { + _rngPath = value; + } + + value = (String) params.get("vm.rng.rate.bytes"); + _rngRateBytes = NumbersUtil.parseInt(value, new Integer(_rngRateBytes)); + + value = (String) params.get("vm.rng.rate.period"); + _rngRatePeriod = NumbersUtil.parseInt(value, new Integer(_rngRatePeriod)); + } + + value = (String) params.get("vm.watchdog.model"); + if (!Strings.isNullOrEmpty(value)) { + _watchDogModel = WatchDogModel.valueOf(value.toUpperCase()); + } + + value = (String) params.get("vm.watchdog.action"); + if (!Strings.isNullOrEmpty(value)) { + _watchDogAction = WatchDogAction.valueOf(value.toUpperCase()); + } + LibvirtConnection.initialize(_hypervisorURI); Connect conn = null; try { @@ -882,6 +976,18 @@ public boolean configure(final String name, final Map params) th } } + final Map bridges = new HashMap(); + + params.put("libvirt.host.bridges", bridges); + params.put("libvirt.host.pifs", _pifs); + + params.put("libvirt.computing.resource", this); + params.put("libvirtVersion", _hypervisorLibvirtVersion); + + + configureVifDrivers(params); + + /* switch (_bridgeType) { case OPENVSWITCH: getOvsPifs(); @@ -891,6 +997,7 @@ public boolean configure(final String name, final Map params) th getPifs(); break; } + */ if (_pifs.get("private") == null) { s_logger.debug("Failed to get private nic name"); @@ -941,19 +1048,13 @@ public boolean configure(final String name, final Map params) th params.put("vm.migrate.speed", String.valueOf(_migrateSpeed)); } - final Map bridges = new HashMap(); bridges.put("linklocal", _linkLocalBridgeName); bridges.put("public", _publicBridgeName); bridges.put("private", _privBridgeName); bridges.put("guest", _guestBridgeName); - params.put("libvirt.host.bridges", bridges); - params.put("libvirt.host.pifs", _pifs); + getVifDriver(TrafficType.Control).createControlNetwork(_linkLocalBridgeName); - params.put("libvirt.computing.resource", this); - params.put("libvirtVersion", _hypervisorLibvirtVersion); - - configureVifDrivers(params); configureDiskActivityChecks(params); final KVMStorageProcessor storageProcessor = new KVMStorageProcessor(_storagePoolMgr, this); @@ -1046,6 +1147,23 @@ public VifDriver getVifDriver(final TrafficType trafficType) { return vifDriver; } + public VifDriver getVifDriver(final TrafficType trafficType, final String bridgeName) { + VifDriver vifDriver = null; + + for (VifDriver driver : getAllVifDrivers()) { + if (driver.isExistingBridge(bridgeName)) { + vifDriver = driver; + break; + } + } + + if (vifDriver == null) { + vifDriver = getVifDriver(trafficType); + } + + return vifDriver; + } + public List getAllVifDrivers() { final Set vifDrivers = new HashSet(); @@ -1074,10 +1192,10 @@ private void getPifs() { for (final String bridge : bridges) { s_logger.debug("looking for pif for bridge " + bridge); final String pif = getPif(bridge); - if (_publicBridgeName != null && bridge.equals(_publicBridgeName)) { + if (isPublicBridge(bridge)) { _pifs.put("public", pif); } - if (_guestBridgeName != null && bridge.equals(_guestBridgeName)) { + if (isGuestBridge(bridge)) { _pifs.put("private", pif); } _pifs.put(bridge, pif); @@ -1108,6 +1226,10 @@ private void getPifs() { s_logger.debug("done looking for pifs, no more bridges"); } + boolean isGuestBridge(String bridge) { + return _guestBridgeName != null && bridge.equals(_guestBridgeName); + } + private void getOvsPifs() { final String cmdout = Script.runSimpleBashScript("ovs-vsctl list-br | sed '{:q;N;s/\\n/%/g;t q}'"); s_logger.debug("cmdout was " + cmdout); @@ -1118,10 +1240,10 @@ private void getOvsPifs() { // Not really interested in the pif name at this point for ovs // bridges final String pif = bridge; - if (_publicBridgeName != null && bridge.equals(_publicBridgeName)) { + if (isPublicBridge(bridge)) { _pifs.put("public", pif); } - if (_guestBridgeName != null && bridge.equals(_guestBridgeName)) { + if (isGuestBridge(bridge)) { _pifs.put("private", pif); } _pifs.put(bridge, pif); @@ -1129,6 +1251,10 @@ private void getOvsPifs() { s_logger.debug("done looking for pifs, no more bridges"); } + public boolean isPublicBridge(String bridge) { + return _publicBridgeName != null && bridge.equals(_publicBridgeName); + } + private String getPif(final String bridge) { String pif = matchPifFileInDirectory(bridge); final File vlanfile = new File("/proc/net/vlan/" + pif); @@ -1195,12 +1321,12 @@ boolean isInterface(final String fname) { return false; } - public boolean checkNetwork(final String networkName) { + public boolean checkNetwork(final TrafficType trafficType, final String networkName) { if (networkName == null) { return true; } - if (_bridgeType == BridgeType.OPENVSWITCH) { + if (getVifDriver(trafficType, networkName) instanceof OvsVifDriver) { return checkOvsNetwork(networkName); } else { return checkBridgeNetwork(networkName); @@ -1335,7 +1461,7 @@ public synchronized boolean destroyTunnelNetwork(final String bridge) { public synchronized boolean findOrCreateTunnelNetwork(final String nwName) { try { - if (checkNetwork(nwName)) { + if (checkNetwork(TrafficType.Guest, nwName)) { return true; } // if not found, create a new one @@ -1672,6 +1798,7 @@ protected ExecutionResult cleanupNetworkElementCommand(final IpAssocCommand cmd) final String routerName = cmd.getAccessDetail(NetworkElementCommand.ROUTER_NAME); final String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); + final String lastIp = cmd.getAccessDetail(NetworkElementCommand.NETWORK_PUB_LAST_IP); Connect conn; @@ -1697,7 +1824,6 @@ protected ExecutionResult cleanupNetworkElementCommand(final IpAssocCommand cmd) } final IpAddressTO[] ips = cmd.getIpAddresses(); - final int numOfIps = ips.length; int nicNum = 0; for (final IpAddressTO ip : ips) { @@ -1708,9 +1834,12 @@ protected ExecutionResult cleanupNetworkElementCommand(final IpAssocCommand cmd) } nicNum = broadcastUriAllocatedToVM.get(ip.getBroadcastUri()); - if (numOfIps == 1 && !ip.isAdd()) { - vifHotUnPlug(conn, routerName, ip.getVifMacAddress()); - networkUsage(routerIp, "deleteVif", "eth" + nicNum); + if (org.apache.commons.lang.StringUtils.equalsIgnoreCase(lastIp, "true") && !ip.isAdd()) { + // in isolated network eth2 is the default public interface. We don't want to delete it. + if (nicNum != 2) { + vifHotUnPlug(conn, routerName, ip.getVifMacAddress()); + networkUsage(routerIp, "deleteVif", "eth" + nicNum); + } } } @@ -1857,6 +1986,31 @@ protected String getUuid(String uuid) { return uuid; } + /** + * Set quota and period tags on 'ctd' when CPU limit use is set + */ + protected void setQuotaAndPeriod(VirtualMachineTO vmTO, CpuTuneDef ctd) { + if (vmTO.getLimitCpuUse() && vmTO.getCpuQuotaPercentage() != null) { + Double cpuQuotaPercentage = vmTO.getCpuQuotaPercentage(); + int period = CpuTuneDef.DEFAULT_PERIOD; + int quota = (int) (period * cpuQuotaPercentage); + if (quota < CpuTuneDef.MIN_QUOTA) { + s_logger.info("Calculated quota (" + quota + ") below the minimum (" + CpuTuneDef.MIN_QUOTA + ") for VM domain " + vmTO.getUuid() + ", setting it to minimum " + + "and calculating period instead of using the default"); + quota = CpuTuneDef.MIN_QUOTA; + period = (int) ((double) quota / cpuQuotaPercentage); + if (period > CpuTuneDef.MAX_PERIOD) { + s_logger.info("Calculated period (" + period + ") exceeds the maximum (" + CpuTuneDef.MAX_PERIOD + + "), setting it to the maximum"); + period = CpuTuneDef.MAX_PERIOD; + } + } + ctd.setQuota(quota); + ctd.setPeriod(period); + s_logger.info("Setting quota=" + quota + ", period=" + period + " to VM domain " + vmTO.getUuid()); + } + } + public LibvirtVMDef createVMFromSpec(final VirtualMachineTO vmTO) { final LibvirtVMDef vm = new LibvirtVMDef(); vm.setDomainName(vmTO.getName()); @@ -1932,6 +2086,9 @@ So if getMinSpeed() returns null we fall back to getSpeed(). } else { ctd.setShares(vmTO.getCpus() * vmTO.getSpeed()); } + + setQuotaAndPeriod(vmTO, ctd); + vm.addComp(ctd); } @@ -1974,11 +2131,23 @@ So if getMinSpeed() returns null we fall back to getSpeed(). final SerialDef serial = new SerialDef("pty", null, (short)0); devices.addDevice(serial); + /* Add a VirtIO channel for SystemVMs for communication and provisioning */ if (vmTO.getType() != VirtualMachine.Type.User) { - final VirtioSerialDef vserial = new VirtioSerialDef(vmTO.getName(), null); - devices.addDevice(vserial); + devices.addDevice(new ChannelDef(vmTO.getName() + ".vport", ChannelDef.ChannelType.UNIX, + new File(_qemuSocketsPath + "/" + vmTO.getName() + ".agent"))); + } + + if (_rngEnable) { + final RngDef rngDevice = new RngDef(_rngPath, _rngBackendModel, _rngRateBytes, _rngRatePeriod); + devices.addDevice(rngDevice); } + /* Add a VirtIO channel for the Qemu Guest Agent tools */ + devices.addDevice(new ChannelDef(_qemuGuestAgentSocketName, ChannelDef.ChannelType.UNIX, + new File(_qemuSocketsPath + "/" + vmTO.getName() + "." + _qemuGuestAgentSocketName))); + + devices.addDevice(new WatchDogDef(_watchDogAction, _watchDogModel)); + final VideoDef videoCard = new VideoDef(_videoHw, _videoRam); devices.addDevice(videoCard); @@ -1993,6 +2162,19 @@ So if getMinSpeed() returns null we fall back to getSpeed(). final InputDef input = new InputDef("tablet", "usb"); devices.addDevice(input); + + DiskDef.DiskBus busT = getDiskModelFromVMDetail(vmTO); + + if (busT == null) { + busT = getGuestDiskModel(vmTO.getPlatformEmulator()); + } + + // If we're using virtio scsi, then we need to add a virtual scsi controller + if (busT == DiskDef.DiskBus.SCSI) { + final SCSIDef sd = new SCSIDef((short)0, 0, 0, 9, 0); + devices.addDevice(sd); + } + vm.addComp(devices); return vm; @@ -2018,9 +2200,8 @@ public String getVolumePath(final Connect conn, final DiskTO volume) throws Libv final DataTO data = volume.getData(); final DataStoreTO store = data.getDataStore(); - if (volume.getType() == Volume.Type.ISO && data.getPath() != null) { - final NfsTO nfsStore = (NfsTO)store; - final String isoPath = nfsStore.getUrl() + File.separator + data.getPath(); + if (volume.getType() == Volume.Type.ISO && data.getPath() != null && (store instanceof NfsTO || store instanceof PrimaryDataStoreTO)) { + final String isoPath = store.getUrl().split("\\?")[0] + File.separator + data.getPath(); final int index = isoPath.lastIndexOf("/"); final String path = isoPath.substring(0, index); final String name = isoPath.substring(index + 1); @@ -2046,8 +2227,18 @@ public int compare(final DiskTO arg0, final DiskTO arg1) { KVMStoragePool pool = null; final DataTO data = volume.getData(); if (volume.getType() == Volume.Type.ISO && data.getPath() != null) { - final NfsTO nfsStore = (NfsTO)data.getDataStore(); - final String volPath = nfsStore.getUrl() + File.separator + data.getPath(); + DataStoreTO dataStore = data.getDataStore(); + String dataStoreUrl = null; + if (dataStore instanceof NfsTO) { + NfsTO nfsStore = (NfsTO)data.getDataStore(); + dataStoreUrl = nfsStore.getUrl(); + } else if (dataStore instanceof PrimaryDataStoreTO && ((PrimaryDataStoreTO) dataStore).getPoolType().equals(StoragePoolType.NetworkFilesystem)) { + //In order to support directly downloaded ISOs + String psHost = ((PrimaryDataStoreTO) dataStore).getHost(); + String psPath = ((PrimaryDataStoreTO) dataStore).getPath(); + dataStoreUrl = "nfs://" + psHost + File.separator + psPath; + } + final String volPath = dataStoreUrl + File.separator + data.getPath(); final int index = volPath.lastIndexOf("/"); final String volDir = volPath.substring(0, index); final String volName = volPath.substring(index + 1); @@ -2076,33 +2267,30 @@ public int compare(final DiskTO arg0, final DiskTO arg1) { } // if params contains a rootDiskController key, use its value (this is what other HVs are doing) - DiskDef.DiskBus diskBusType = null; - final Map params = vmSpec.getDetails(); - if (params != null && params.get("rootDiskController") != null && !params.get("rootDiskController").isEmpty()) { - final String rootDiskController = params.get("rootDiskController"); - s_logger.debug("Passed custom disk bus " + rootDiskController); - for (final DiskDef.DiskBus bus : DiskDef.DiskBus.values()) { - if (bus.toString().equalsIgnoreCase(rootDiskController)) { - s_logger.debug("Found matching enum for disk bus " + rootDiskController); - diskBusType = bus; - break; - } - } - } + DiskDef.DiskBus diskBusType = getDiskModelFromVMDetail(vmSpec); if (diskBusType == null) { diskBusType = getGuestDiskModel(vmSpec.getPlatformEmulator()); } + + // I'm not sure why previously certain DATADISKs were hard-coded VIRTIO and others not, however this + // maintains existing functionality with the exception that SCSI will override VIRTIO. + DiskDef.DiskBus diskBusTypeData = (diskBusType == DiskDef.DiskBus.SCSI) ? diskBusType : DiskDef.DiskBus.VIRTIO; + final DiskDef disk = new DiskDef(); + int devId = volume.getDiskSeq().intValue(); if (volume.getType() == Volume.Type.ISO) { if (volPath == null) { /* Add iso as placeholder */ - disk.defISODisk(null); + disk.defISODisk(null, devId); } else { - disk.defISODisk(volPath); + disk.defISODisk(volPath, devId); } } else { - final int devId = volume.getDiskSeq().intValue(); + if (diskBusType == DiskDef.DiskBus.SCSI ) { + disk.setQemuDriver(true); + disk.setDiscard(DiscardType.UNMAP); + } if (pool.getType() == StoragePoolType.RBD) { /* @@ -2122,7 +2310,7 @@ public int compare(final DiskTO arg0, final DiskTO arg1) { disk.defBlockBasedDisk(physicalDisk.getPath(), devId, diskBusType); } else { if (volume.getType() == Volume.Type.DATADISK) { - disk.defFileBasedDisk(physicalDisk.getPath(), devId, DiskDef.DiskBus.VIRTIO, DiskDef.DiskFmtType.QCOW2); + disk.defFileBasedDisk(physicalDisk.getPath(), devId, diskBusTypeData, DiskDef.DiskFmtType.QCOW2); } else { disk.defFileBasedDisk(physicalDisk.getPath(), devId, diskBusType, DiskDef.DiskFmtType.QCOW2); } @@ -2150,6 +2338,7 @@ public int compare(final DiskTO arg0, final DiskTO arg1) { disk.setCacheMode(DiskDef.DiskCacheMode.valueOf(volumeObjectTO.getCacheMode().toString().toUpperCase())); } } + vm.getDevices().addDevice(disk); } @@ -2204,7 +2393,11 @@ private void createVif(final LibvirtVMDef vm, final NicTO nic, final String nicA } } - vm.getDevices().addDevice(getVifDriver(nic.getType()).plug(nic, vm.getPlatformEmulator().toString(), nicAdapter).toString()); + vm.getDevices().addDevice(getVifDriver(nic.getType(), nic.getName()).plug(nic, vm.getPlatformEmulator(), nicAdapter)); + } + + public boolean cleanupDisk(Map volumeToDisconnect) { + return _storagePoolMgr.disconnectPhysicalDisk(volumeToDisconnect); } public boolean cleanupDisk(final DiskDef disk) { @@ -2227,9 +2420,9 @@ protected KVMStoragePoolManager getPoolManager() { return _storagePoolMgr; } - public synchronized String attachOrDetachISO(final Connect conn, final String vmName, String isoPath, final boolean isAttach) throws LibvirtException, URISyntaxException, + public synchronized String attachOrDetachISO(final Connect conn, final String vmName, String isoPath, final boolean isAttach, final Integer diskSeq) throws LibvirtException, URISyntaxException, InternalErrorException { - String isoXml = null; + final DiskDef iso = new DiskDef(); if (isoPath != null && isAttach) { final int index = isoPath.lastIndexOf("/"); final String path = isoPath.substring(0, index); @@ -2238,20 +2431,17 @@ public synchronized String attachOrDetachISO(final Connect conn, final String vm final KVMPhysicalDisk isoVol = secondaryPool.getPhysicalDisk(name); isoPath = isoVol.getPath(); - final DiskDef iso = new DiskDef(); - iso.defISODisk(isoPath); - isoXml = iso.toString(); + iso.defISODisk(isoPath, diskSeq); } else { - final DiskDef iso = new DiskDef(); - iso.defISODisk(null); - isoXml = iso.toString(); + iso.defISODisk(null, diskSeq); } - final List disks = getDisks(conn, vmName); - final String result = attachOrDetachDevice(conn, true, vmName, isoXml); + final String result = attachOrDetachDevice(conn, true, vmName, iso.toString()); if (result == null && !isAttach) { + final List disks = getDisks(conn, vmName); for (final DiskDef disk : disks) { - if (disk.getDeviceType() == DiskDef.DeviceType.CDROM) { + if (disk.getDeviceType() == DiskDef.DeviceType.CDROM + && (diskSeq == null || disk.getDiskLabel() == iso.getDiskLabel())) { cleanupDisk(disk); } } @@ -2268,13 +2458,13 @@ public synchronized String attachOrDetachDisk(final Connect conn, DiskDef diskdef = null; final KVMStoragePool attachingPool = attachingDisk.getPool(); try { - if (!attach) { - dm = conn.domainLookupByName(vmName); - final LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser(); - final String xml = dm.getXMLDesc(0); - parser.parseDomainXML(xml); - disks = parser.getDisks(); + dm = conn.domainLookupByName(vmName); + final LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser(); + final String domXml = dm.getXMLDesc(0); + parser.parseDomainXML(domXml); + disks = parser.getDisks(); + if (!attach) { for (final DiskDef disk : disks) { final String file = disk.getDiskPath(); if (file != null && file.equalsIgnoreCase(attachingDisk.getPath())) { @@ -2286,17 +2476,31 @@ public synchronized String attachOrDetachDisk(final Connect conn, throw new InternalErrorException("disk: " + attachingDisk.getPath() + " is not attached before"); } } else { + DiskDef.DiskBus busT = DiskDef.DiskBus.VIRTIO; + for (final DiskDef disk : disks) { + if (disk.getDeviceType() == DeviceType.DISK) { + if (disk.getBusType() == DiskDef.DiskBus.SCSI) { + busT = DiskDef.DiskBus.SCSI; + } + break; + } + } + diskdef = new DiskDef(); + if (busT == DiskDef.DiskBus.SCSI) { + diskdef.setQemuDriver(true); + diskdef.setDiscard(DiscardType.UNMAP); + } if (attachingPool.getType() == StoragePoolType.RBD) { diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), attachingPool.getAuthUserName(), - attachingPool.getUuid(), devId, DiskDef.DiskBus.VIRTIO, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW); + attachingPool.getUuid(), devId, busT, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW); } else if (attachingPool.getType() == StoragePoolType.Gluster) { diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), null, - null, devId, DiskDef.DiskBus.VIRTIO, DiskProtocol.GLUSTER, DiskDef.DiskFmtType.QCOW2); + null, devId, busT, DiskProtocol.GLUSTER, DiskDef.DiskFmtType.QCOW2); } else if (attachingDisk.getFormat() == PhysicalDiskFormat.QCOW2) { - diskdef.defFileBasedDisk(attachingDisk.getPath(), devId, DiskDef.DiskBus.VIRTIO, DiskDef.DiskFmtType.QCOW2); + diskdef.defFileBasedDisk(attachingDisk.getPath(), devId, busT, DiskDef.DiskFmtType.QCOW2); } else if (attachingDisk.getFormat() == PhysicalDiskFormat.RAW) { - diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, DiskDef.DiskBus.VIRTIO); + diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, busT); } if (bytesReadRate != null && bytesReadRate > 0) { diskdef.setBytesReadRate(bytesReadRate); @@ -2387,6 +2591,7 @@ private Map getVersionStrings() { public StartupCommand[] initialize() { final List info = getHostInfo(); + _totalMemory = (Long)info.get(2); final StartupRoutingCommand cmd = new StartupRoutingCommand((Integer)info.get(0), (Long)info.get(1), (Long)info.get(2), (Long)info.get(4), (String)info.get(3), _hypervisorType, @@ -2395,11 +2600,16 @@ public StartupCommand[] initialize() { fillNetworkInformation(cmd); _privateIp = cmd.getPrivateIpAddress(); cmd.getHostDetails().putAll(getVersionStrings()); + cmd.getHostDetails().put(KeyStoreUtils.SECURED, String.valueOf(isHostSecured()).toLowerCase()); cmd.setPool(_pool); cmd.setCluster(_clusterId); cmd.setGatewayIpAddress(_localGateway); cmd.setIqn(getIqn()); + if (cmd.getHostDetails().containsKey("Host.OS")) { + _hostDistro = cmd.getHostDetails().get("Host.OS"); + } + StartupStorageCommand sscmd = null; try { @@ -2651,12 +2861,12 @@ protected List getHostInfo() { info.add((int)cpus); info.add(speed); // Report system's RAM as actual RAM minus host OS reserved RAM - ram = ram - _dom0MinMem; + ram = ram - _dom0MinMem + _dom0OvercommitMem; info.add(ram); info.add(cap); info.add(_dom0MinMem); info.add(cpuSockets); - s_logger.debug("cpus=" + cpus + ", speed=" + speed + ", ram=" + ram + ", _dom0MinMem=" + _dom0MinMem + ", cpu sockets=" + cpuSockets); + s_logger.debug("cpus=" + cpus + ", speed=" + speed + ", ram=" + ram + ", _dom0MinMem=" + _dom0MinMem + ", _dom0OvercommitMem=" + _dom0OvercommitMem + ", cpu sockets=" + cpuSockets); return info; } @@ -2722,6 +2932,22 @@ public String stopVM(final Connect conn, final String vmName, final boolean forc DomainState state = null; Domain dm = null; + // delete the metadata of vm snapshots before stopping + try { + dm = conn.domainLookupByName(vmName); + cleanVMSnapshotMetadata(dm); + } catch (LibvirtException e) { + s_logger.debug("Failed to get vm :" + e.getMessage()); + } finally { + try { + if (dm != null) { + dm.free(); + } + } catch (LibvirtException l) { + s_logger.trace("Ignoring libvirt error.", l); + } + } + s_logger.debug("Try to stop the vm at first"); if (forceStop) { return stopVMInternal(conn, vmName, true); @@ -2882,19 +3108,8 @@ private String getHypervisorPath(final Connect conn) { } boolean isGuestPVEnabled(final String guestOSName) { - if (guestOSName == null) { - return false; - } - if (guestOSName.startsWith("Ubuntu") || guestOSName.startsWith("Fedora 13") || guestOSName.startsWith("Fedora 12") || guestOSName.startsWith("Fedora 11") || - guestOSName.startsWith("Fedora 10") || guestOSName.startsWith("Fedora 9") || guestOSName.startsWith("CentOS 5.3") || guestOSName.startsWith("CentOS 5.4") || - guestOSName.startsWith("CentOS 5.5") || guestOSName.startsWith("CentOS") || guestOSName.startsWith("Fedora") || - guestOSName.startsWith("Red Hat Enterprise Linux 5.3") || guestOSName.startsWith("Red Hat Enterprise Linux 5.4") || - guestOSName.startsWith("Red Hat Enterprise Linux 5.5") || guestOSName.startsWith("Red Hat Enterprise Linux 6") || guestOSName.startsWith("Debian GNU/Linux") || - guestOSName.startsWith("FreeBSD 10") || guestOSName.startsWith("Oracle") || guestOSName.startsWith("Other PV")) { - return true; - } else { - return false; - } + DiskDef.DiskBus db = getGuestDiskModel(guestOSName); + return db != DiskDef.DiskBus.IDE; } public boolean isCentosHost() { @@ -2905,14 +3120,42 @@ public boolean isCentosHost() { } } + public DiskDef.DiskBus getDiskModelFromVMDetail(final VirtualMachineTO vmTO) { + Map details = vmTO.getDetails(); + if (details == null) { + return null; + } + + final String rootDiskController = details.get(VmDetailConstants.ROOT_DISK_CONTROLLER); + if (StringUtils.isNotBlank(rootDiskController)) { + s_logger.debug("Passed custom disk bus " + rootDiskController); + for (final DiskDef.DiskBus bus : DiskDef.DiskBus.values()) { + if (bus.toString().equalsIgnoreCase(rootDiskController)) { + s_logger.debug("Found matching enum for disk bus " + rootDiskController); + return bus; + } + } + } + return null; + } + private DiskDef.DiskBus getGuestDiskModel(final String platformEmulator) { - if (isGuestPVEnabled(platformEmulator)) { + if (platformEmulator == null) { + return DiskDef.DiskBus.IDE; + } else if (platformEmulator.startsWith("Other PV Virtio-SCSI")) { + return DiskDef.DiskBus.SCSI; + } else if (platformEmulator.startsWith("Ubuntu") || platformEmulator.startsWith("Fedora 13") || platformEmulator.startsWith("Fedora 12") || platformEmulator.startsWith("Fedora 11") || + platformEmulator.startsWith("Fedora 10") || platformEmulator.startsWith("Fedora 9") || platformEmulator.startsWith("CentOS 5.3") || platformEmulator.startsWith("CentOS 5.4") || + platformEmulator.startsWith("CentOS 5.5") || platformEmulator.startsWith("CentOS") || platformEmulator.startsWith("Fedora") || + platformEmulator.startsWith("Red Hat Enterprise Linux 5.3") || platformEmulator.startsWith("Red Hat Enterprise Linux 5.4") || + platformEmulator.startsWith("Red Hat Enterprise Linux 5.5") || platformEmulator.startsWith("Red Hat Enterprise Linux 6") || platformEmulator.startsWith("Debian GNU/Linux") || + platformEmulator.startsWith("FreeBSD 10") || platformEmulator.startsWith("Oracle") || platformEmulator.startsWith("Other PV")) { return DiskDef.DiskBus.VIRTIO; } else { return DiskDef.DiskBus.IDE; } - } + } private void cleanupVMNetworks(final Connect conn, final List nics) { if (nics != null) { for (final InterfaceDef nic : nics) { @@ -2978,6 +3221,30 @@ private String executeBashScript(final String script) { return command.execute(); } + public List getVmNetworkStat(Connect conn, String vmName) throws LibvirtException { + Domain dm = null; + try { + dm = getDomain(conn, vmName); + + List stats = new ArrayList(); + + List nics = getInterfaces(conn, vmName); + + for (InterfaceDef nic : nics) { + DomainInterfaceStats nicStats = dm.interfaceStats(nic.getDevName()); + String macAddress = nic.getMacAddress(); + VmNetworkStatsEntry stat = new VmNetworkStatsEntry(vmName, macAddress, nicStats.tx_bytes, nicStats.rx_bytes); + stats.add(stat); + } + + return stats; + } finally { + if (dm != null) { + dm.free(); + } + } + } + public List getVmDiskStat(final Connect conn, final String vmName) throws LibvirtException { Domain dm = null; try { @@ -3206,6 +3473,9 @@ public boolean defaultNetworkRules(final Connect conn, final String vmName, fina if (nic.getIp() != null) { cmd.add("--vmip", nic.getIp()); } + if (nic.getIp6Address() != null) { + cmd.add("--vmip6", nic.getIp6Address()); + } cmd.add("--vmmac", nic.getMac()); cmd.add("--vif", vif); cmd.add("--brname", brname); @@ -3268,7 +3538,7 @@ public boolean configureDefaultNetworkRulesForSystemVm(final Connect conn, final return true; } - public boolean addNetworkRules(final String vmName, final String vmId, final String guestIP, final String sig, final String seq, final String mac, final String rules, final String vif, final String brname, + public boolean addNetworkRules(final String vmName, final String vmId, final String guestIP, final String guestIP6, final String sig, final String seq, final String mac, final String rules, final String vif, final String brname, final String secIps) { if (!_canBridgeFirewall) { return false; @@ -3280,6 +3550,9 @@ public boolean addNetworkRules(final String vmName, final String vmId, final Str cmd.add("--vmname", vmName); cmd.add("--vmid", vmId); cmd.add("--vmip", guestIP); + if (StringUtils.isNotBlank(guestIP6)) { + cmd.add("--vmip6", guestIP6); + } cmd.add("--sig", sig); cmd.add("--seq", seq); cmd.add("--vmmac", mac); @@ -3433,4 +3706,101 @@ public String mapRbdDevice(final KVMPhysicalDisk disk){ } return device; } + + public List> cleanVMSnapshotMetadata(Domain dm) throws LibvirtException { + s_logger.debug("Cleaning the metadata of vm snapshots of vm " + dm.getName()); + List> vmsnapshots = new ArrayList>(); + if (dm.snapshotNum() == 0) { + return vmsnapshots; + } + String currentSnapshotName = null; + try { + DomainSnapshot snapshotCurrent = dm.snapshotCurrent(); + String snapshotXML = snapshotCurrent.getXMLDesc(); + snapshotCurrent.free(); + DocumentBuilder builder; + try { + builder = DocumentBuilderFactory.newInstance().newDocumentBuilder(); + + InputSource is = new InputSource(); + is.setCharacterStream(new StringReader(snapshotXML)); + Document doc = builder.parse(is); + Element rootElement = doc.getDocumentElement(); + + currentSnapshotName = getTagValue("name", rootElement); + } catch (ParserConfigurationException e) { + s_logger.debug(e.toString()); + } catch (SAXException e) { + s_logger.debug(e.toString()); + } catch (IOException e) { + s_logger.debug(e.toString()); + } + } catch (LibvirtException e) { + s_logger.debug("Fail to get the current vm snapshot for vm: " + dm.getName() + ", continue"); + } + int flags = 2; // VIR_DOMAIN_SNAPSHOT_DELETE_METADATA_ONLY = 2 + String[] snapshotNames = dm.snapshotListNames(); + Arrays.sort(snapshotNames); + for (String snapshotName: snapshotNames) { + DomainSnapshot snapshot = dm.snapshotLookupByName(snapshotName); + Boolean isCurrent = (currentSnapshotName != null && currentSnapshotName.equals(snapshotName)) ? true: false; + vmsnapshots.add(new Ternary(snapshotName, isCurrent, snapshot.getXMLDesc())); + } + for (String snapshotName: snapshotNames) { + DomainSnapshot snapshot = dm.snapshotLookupByName(snapshotName); + snapshot.delete(flags); // clean metadata of vm snapshot + } + return vmsnapshots; + } + + private static String getTagValue(String tag, Element eElement) { + NodeList nlList = eElement.getElementsByTagName(tag).item(0).getChildNodes(); + Node nValue = nlList.item(0); + + return nValue.getNodeValue(); + } + + public void restoreVMSnapshotMetadata(Domain dm, String vmName, List> vmsnapshots) { + s_logger.debug("Restoring the metadata of vm snapshots of vm " + vmName); + for (Ternary vmsnapshot: vmsnapshots) { + String snapshotName = vmsnapshot.first(); + Boolean isCurrent = vmsnapshot.second(); + String snapshotXML = vmsnapshot.third(); + s_logger.debug("Restoring vm snapshot " + snapshotName + " on " + vmName + " with XML:\n " + snapshotXML); + try { + int flags = 1; // VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE = 1 + if (isCurrent) { + flags += 2; // VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT = 2 + } + dm.snapshotCreateXML(snapshotXML, flags); + } catch (LibvirtException e) { + s_logger.debug("Failed to restore vm snapshot " + snapshotName + ", continue"); + continue; + } + } + } + + public long getTotalMemory() { + return _totalMemory; + } + + public String getHostDistro() { + return _hostDistro; + } + + public boolean isHostSecured() { + // Test for host certificates + final File confFile = PropertiesUtil.findConfigFile(KeyStoreUtils.AGENT_PROPSFILE); + if (confFile == null || !confFile.exists() || !new File(confFile.getParent() + "/" + KeyStoreUtils.CERT_FILENAME).exists()) { + return false; + } + + // Test for libvirt TLS configuration + try { + new Connect(String.format("qemu+tls://%s/system", _privateIp)); + } catch (final LibvirtException ignored) { + return false; + } + return true; + } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java index 0b6b9d989c8e..2eeff88e0816 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParser.java @@ -16,15 +16,17 @@ // under the License. package com.cloud.hypervisor.kvm.resource; +import java.io.File; import java.io.IOException; import java.io.StringReader; import java.util.ArrayList; +import java.util.Collections; import java.util.List; - import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.ParserConfigurationException; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.w3c.dom.Document; import org.w3c.dom.Element; @@ -33,14 +35,25 @@ import org.xml.sax.InputSource; import org.xml.sax.SAXException; +import com.google.common.base.Strings; + +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef.NicModel; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef.RngBackendModel; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogModel; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef.WatchDogAction; public class LibvirtDomainXMLParser { private static final Logger s_logger = Logger.getLogger(LibvirtDomainXMLParser.class); private final List interfaces = new ArrayList(); private final List diskDefs = new ArrayList(); + private final List rngDefs = new ArrayList(); + private final List channels = new ArrayList(); + private final List watchDogDefs = new ArrayList(); private Integer vncPort; private String desc; @@ -102,13 +115,13 @@ public boolean parseDomainXML(String domXML) { } def.defFileBasedDisk(diskFile, diskLabel, DiskDef.DiskBus.valueOf(bus.toUpperCase()), fmt); } else if (device.equalsIgnoreCase("cdrom")) { - def.defISODisk(diskFile); + def.defISODisk(diskFile , i+1); } } else if (type.equalsIgnoreCase("block")) { def.defBlockBasedDisk(diskDev, diskLabel, DiskDef.DiskBus.valueOf(bus.toUpperCase())); } - if (diskCacheMode != null) { + if (StringUtils.isNotBlank(diskCacheMode)) { def.setCacheMode(DiskDef.DiskCacheMode.valueOf(diskCacheMode.toUpperCase())); } } @@ -148,6 +161,8 @@ public boolean parseDomainXML(String domXML) { String mac = getAttrValue("mac", "address", nic); String dev = getAttrValue("target", "dev", nic); String model = getAttrValue("model", "type", nic); + String slot = StringUtils.removeStart(getAttrValue("address", "slot", nic), "0x"); + InterfaceDef def = new InterfaceDef(); NodeList bandwidth = nic.getElementsByTagName("bandwidth"); Integer networkRateKBps = 0; @@ -168,9 +183,34 @@ public boolean parseDomainXML(String domXML) { String scriptPath = getAttrValue("script", "path", nic); def.defEthernet(dev, mac, NicModel.valueOf(model.toUpperCase()), scriptPath, networkRateKBps); } + + if (StringUtils.isNotBlank(slot)) { + def.setSlot(Integer.parseInt(slot, 16)); + } + interfaces.add(def); } + NodeList ports = devices.getElementsByTagName("channel"); + for (int i = 0; i < ports.getLength(); i++) { + Element channel = (Element)ports.item(i); + + String type = channel.getAttribute("type"); + String path = getAttrValue("source", "path", channel); + String name = getAttrValue("target", "name", channel); + String state = getAttrValue("target", "state", channel); + + ChannelDef def = null; + if (!StringUtils.isNotBlank(state)) { + def = new ChannelDef(name, ChannelDef.ChannelType.valueOf(type.toUpperCase()), new File(path)); + } else { + def = new ChannelDef(name, ChannelDef.ChannelType.valueOf(type.toUpperCase()), + ChannelDef.ChannelState.valueOf(state.toUpperCase()), new File(path)); + } + + channels.add(def); + } + Element graphic = (Element)devices.getElementsByTagName("graphics").item(0); if (graphic != null) { @@ -189,6 +229,46 @@ public boolean parseDomainXML(String domXML) { } } + NodeList rngs = devices.getElementsByTagName("rng"); + for (int i = 0; i < rngs.getLength(); i++) { + RngDef def = null; + Element rng = (Element)rngs.item(i); + String backendModel = getAttrValue("backend", "model", rng); + String path = getTagValue("backend", rng); + String bytes = getAttrValue("rate", "bytes", rng); + String period = getAttrValue("rate", "period", rng); + + if (Strings.isNullOrEmpty(backendModel)) { + def = new RngDef(path, Integer.parseInt(bytes), Integer.parseInt(period)); + } else { + def = new RngDef(path, RngBackendModel.valueOf(backendModel.toUpperCase()), + Integer.parseInt(bytes), Integer.parseInt(period)); + } + + rngDefs.add(def); + } + + NodeList watchDogs = devices.getElementsByTagName("watchdog"); + for (int i = 0; i < watchDogs.getLength(); i++) { + WatchDogDef def = null; + Element watchDog = (Element)watchDogs.item(i); + String action = watchDog.getAttribute("action"); + String model = watchDog.getAttribute("model"); + + if (Strings.isNullOrEmpty(model)) { + continue; + } + + if (Strings.isNullOrEmpty(action)) { + def = new WatchDogDef(WatchDogModel.valueOf(model.toUpperCase())); + } else { + def = new WatchDogDef(WatchDogAction.valueOf(action.toUpperCase()), + WatchDogModel.valueOf(model.toUpperCase())); + } + + watchDogDefs.add(def); + } + return true; } catch (ParserConfigurationException e) { s_logger.debug(e.toString()); @@ -234,6 +314,18 @@ public List getDisks() { return diskDefs; } + public List getRngs() { + return rngDefs; + } + + public List getChannels() { + return Collections.unmodifiableList(channels); + } + + public List getWatchDogs() { + return watchDogDefs; + } + public String getDescription() { return desc; } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java index 7d44ae43baec..08ece9a104ed 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtVMDef.java @@ -16,15 +16,17 @@ // under the License. package com.cloud.hypervisor.kvm.resource; -import com.google.common.collect.Maps; -import org.apache.commons.lang.StringEscapeUtils; -import org.apache.log4j.Logger; - +import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; +import org.apache.commons.lang.StringEscapeUtils; +import org.apache.log4j.Logger; + +import com.google.common.collect.Maps; + public class LibvirtVMDef { private static final Logger s_logger = Logger.getLogger(LibvirtVMDef.class); @@ -544,6 +546,23 @@ public String toString() { } } + public enum DiscardType { + IGNORE("ignore"), UNMAP("unmap"); + String _discardType; + DiscardType(String discardType) { + _discardType = discardType; + } + + @Override + public String toString() { + if (_discardType == null) { + return "ignore"; + } + return _discardType; + } + + } + private DeviceType _deviceType; /* floppy, disk, cdrom */ private DiskType _diskType; private DiskProtocol _diskProtocol; @@ -565,6 +584,15 @@ public String toString() { private DiskCacheMode _diskCacheMode; private String _serial; private boolean qemuDriver = true; + private DiscardType _discard = DiscardType.IGNORE; + + public DiscardType getDiscard() { + return _discard; + } + + public void setDiscard(DiscardType discard) { + this._discard = discard; + } public void setDeviceType(DeviceType deviceType) { _deviceType = deviceType; @@ -581,22 +609,24 @@ public void defFileBasedDisk(String filePath, String diskLabel, DiskBus bus, Dis } - /* skip iso label */ - private String getDevLabel(int devId, DiskBus bus) { + /* skip iso labels */ + private String getDevLabel(int devId, DiskBus bus, boolean forIso) { if (devId < 0) { return ""; } - if (devId == 2) { - devId++; - } - if (bus == DiskBus.SCSI) { return "sd" + getDevLabelSuffix(devId); } else if (bus == DiskBus.VIRTIO) { return "vd" + getDevLabelSuffix(devId); } + if (forIso) { + devId --; + } else if(devId >= 2) { + devId += 2; + } return "hd" + getDevLabelSuffix(devId); + } private String getDevLabelSuffix(int deviceIndex) { @@ -621,7 +651,7 @@ public void defFileBasedDisk(String filePath, int devId, DiskBus bus, DiskFmtTyp _deviceType = DeviceType.DISK; _diskCacheMode = DiskCacheMode.NONE; _sourcePath = filePath; - _diskLabel = getDevLabel(devId, bus); + _diskLabel = getDevLabel(devId, bus, false); _diskFmtType = diskFmtType; _bus = bus; @@ -631,19 +661,33 @@ public void defISODisk(String volPath) { _diskType = DiskType.FILE; _deviceType = DeviceType.CDROM; _sourcePath = volPath; - _diskLabel = "hdc"; + _diskLabel = getDevLabel(3, DiskBus.IDE, true); _diskFmtType = DiskFmtType.RAW; _diskCacheMode = DiskCacheMode.NONE; _bus = DiskBus.IDE; } + public void defISODisk(String volPath, Integer devId) { + if (devId == null) { + defISODisk(volPath); + } else { + _diskType = DiskType.FILE; + _deviceType = DeviceType.CDROM; + _sourcePath = volPath; + _diskLabel = getDevLabel(devId, DiskBus.IDE, true); + _diskFmtType = DiskFmtType.RAW; + _diskCacheMode = DiskCacheMode.NONE; + _bus = DiskBus.IDE; + } + } + public void defBlockBasedDisk(String diskName, int devId, DiskBus bus) { _diskType = DiskType.BLOCK; _deviceType = DeviceType.DISK; _diskFmtType = DiskFmtType.RAW; _diskCacheMode = DiskCacheMode.NONE; _sourcePath = diskName; - _diskLabel = getDevLabel(devId, bus); + _diskLabel = getDevLabel(devId, bus, false); _bus = bus; } @@ -668,7 +712,7 @@ public void defNetworkBasedDisk(String diskName, String sourceHost, int sourcePo _sourcePort = sourcePort; _authUserName = authUserName; _authSecretUUID = authSecretUUID; - _diskLabel = getDevLabel(devId, bus); + _diskLabel = getDevLabel(devId, bus, false); _bus = bus; _diskProtocol = protocol; } @@ -775,8 +819,16 @@ public String toString() { diskBuilder.append(" type='" + _diskType + "'"); diskBuilder.append(">\n"); if(qemuDriver) { - diskBuilder.append("\n"); + diskBuilder.append("\n"); } if (_diskType == DiskType.FILE) { @@ -859,7 +911,7 @@ public String toString() { } } - enum NicModel { + public enum NicModel { E1000("e1000"), VIRTIO("virtio"), RTL8139("rtl8139"), NE2KPCI("ne2k_pci"), VMXNET3("vmxnet3"); String _model; @@ -894,6 +946,8 @@ enum HostNicType { private String _virtualPortInterfaceId; private int _vlanTag = -1; private boolean _pxeDisable = false; + private boolean _linkStateUp = true; + private Integer _slot; public void defBridgeNet(String brName, String targetBrName, String macAddr, NicModel model) { defBridgeNet(brName, targetBrName, macAddr, model, 0); @@ -981,6 +1035,10 @@ public String getDevName() { return _networkName; } + public void setDevName(String networkName) { + _networkName = networkName; + } + public String getMacAddress() { return _macAddr; } @@ -1013,6 +1071,22 @@ public int getVlanTag() { return _vlanTag; } + public void setSlot(Integer slot) { + _slot = slot; + } + + public Integer getSlot() { + return _slot; + } + + public void setLinkStateUp(boolean linkStateUp) { + _linkStateUp = linkStateUp; + } + + public boolean isLinkStateUp() { + return _linkStateUp; + } + @Override public String toString() { StringBuilder netBuilder = new StringBuilder(); @@ -1055,6 +1129,12 @@ public String toString() { if (_vlanTag > 0 && _vlanTag < 4095) { netBuilder.append("\n\n"); } + + netBuilder.append("\n"); + + if (_slot != null) { + netBuilder.append(String.format("
\n", _slot)); + } netBuilder.append("\n"); return netBuilder.toString(); } @@ -1095,6 +1175,11 @@ public String toString() { public static class CpuTuneDef { private int _shares = 0; + private int quota = 0; + private int period = 0; + static final int DEFAULT_PERIOD = 10000; + static final int MIN_QUOTA = 1000; + static final int MAX_PERIOD = 1000000; public void setShares(int shares) { _shares = shares; @@ -1104,6 +1189,22 @@ public int getShares() { return _shares; } + public int getQuota() { + return quota; + } + + public void setQuota(int quota) { + this.quota = quota; + } + + public int getPeriod() { + return period; + } + + public void setPeriod(int period) { + this.period = period; + } + @Override public String toString() { StringBuilder cpuTuneBuilder = new StringBuilder(); @@ -1111,6 +1212,12 @@ public String toString() { if (_shares > 0) { cpuTuneBuilder.append("" + _shares + "\n"); } + if (quota > 0) { + cpuTuneBuilder.append("" + quota + "\n"); + } + if (period > 0) { + cpuTuneBuilder.append("" + period + "\n"); + } cpuTuneBuilder.append("\n"); return cpuTuneBuilder.toString(); } @@ -1222,25 +1329,95 @@ public String toString() { } } - public static class VirtioSerialDef { - private final String _name; - private String _path; + public final static class ChannelDef { + enum ChannelType { + UNIX("unix"), SERIAL("serial"); + String type; - public VirtioSerialDef(String name, String path) { - _name = name; - _path = path; + ChannelType(String type) { + this.type = type; + } + + @Override + public String toString() { + return this.type; + } + } + + enum ChannelState { + DISCONNECTED("disconnected"), CONNECTED("connected"); + String type; + + ChannelState(String type) { + this.type = type; + } + + @Override + public String toString() { + return type; + } + } + + private final String name; + private File path = new File(""); + private final ChannelType type; + private ChannelState state; + + public ChannelDef(String name, ChannelType type) { + this.name = name; + this.type = type; + } + + public ChannelDef(String name, ChannelType type, File path) { + this.name = name; + this.path = path; + this.type = type; + } + + public ChannelDef(String name, ChannelType type, ChannelState state) { + this.name = name; + this.state = state; + this.type = type; + } + + public ChannelDef(String name, ChannelType type, ChannelState state, File path) { + this.name = name; + this.path = path; + this.state = state; + this.type = type; + } + + public ChannelType getChannelType() { + return type; + } + + public ChannelState getChannelState() { + return state; + } + + public String getName() { + return name; + } + + public File getPath() { + return path; } @Override public String toString() { StringBuilder virtioSerialBuilder = new StringBuilder(); - if (_path == null) { - _path = "/var/lib/libvirt/qemu"; + virtioSerialBuilder.append("\n"); + if (path == null) { + virtioSerialBuilder.append("\n"); + } else { + virtioSerialBuilder.append("\n"); } - virtioSerialBuilder.append("\n"); - virtioSerialBuilder.append("\n"); - virtioSerialBuilder.append("\n"); virtioSerialBuilder.append("
\n"); + if (state == null) { + virtioSerialBuilder.append("\n"); + } else { + virtioSerialBuilder.append("\n"); + } virtioSerialBuilder.append("\n"); return virtioSerialBuilder.toString(); } @@ -1287,6 +1464,37 @@ public String toString() { } } + public static class SCSIDef { + private short index = 0; + private int domain = 0; + private int bus = 0; + private int slot = 9; + private int function = 0; + + public SCSIDef(short index, int domain, int bus, int slot, int function) { + this.index = index; + this.domain = domain; + this.bus = bus; + this.slot = slot; + this.function = function; + } + + public SCSIDef() { + + } + + @Override + public String toString() { + StringBuilder scsiBuilder = new StringBuilder(); + + scsiBuilder.append(String.format("\n", this.index )); + scsiBuilder.append(String.format("
\n", + this.domain, this.bus, this.slot, this.function ) ); + scsiBuilder.append("\n"); + return scsiBuilder.toString(); + } + } + public static class InputDef { private final String _type; /* tablet, mouse */ private final String _bus; /* ps2, usb, xen */ @@ -1366,16 +1574,177 @@ public void addNuageExtension(String macAddress, String vrIp) { @Override public String toString() { StringBuilder fsBuilder = new StringBuilder(); + fsBuilder.append("\n"); for (Map.Entry address : addresses.entrySet()) { - fsBuilder.append("\n") - .append(" \n") - .append("\n"); + fsBuilder.append(" \n"); } - return fsBuilder.toString(); + return fsBuilder.append("\n").toString(); + } + } + + public static class RngDef { + enum RngModel { + VIRTIO("virtio"); + String model; + + RngModel(String model) { + this.model = model; + } + + @Override + public String toString() { + return model; + } + } + + enum RngBackendModel { + RANDOM("random"), EGD("egd"); + String model; + + RngBackendModel(String model) { + this.model = model; + } + + @Override + public String toString() { + return model; + } + } + + private String path = "/dev/random"; + private RngModel rngModel = RngModel.VIRTIO; + private RngBackendModel rngBackendModel = RngBackendModel.RANDOM; + private int rngRateBytes = 2048; + private int rngRatePeriod = 1000; + + public RngDef(String path) { + this.path = path; + } + + public RngDef(String path, int rngRateBytes, int rngRatePeriod) { + this.path = path; + this.rngRateBytes = rngRateBytes; + this.rngRatePeriod = rngRatePeriod; + } + + public RngDef(RngModel rngModel) { + this.rngModel = rngModel; + } + + public RngDef(RngBackendModel rngBackendModel) { + this.rngBackendModel = rngBackendModel; + } + + public RngDef(String path, RngBackendModel rngBackendModel) { + this.path = path; + this.rngBackendModel = rngBackendModel; + } + + public RngDef(String path, RngBackendModel rngBackendModel, int rngRateBytes, int rngRatePeriod) { + this.path = path; + this.rngBackendModel = rngBackendModel; + this.rngRateBytes = rngRateBytes; + this.rngRatePeriod = rngRatePeriod; + } + + public RngDef(String path, RngModel rngModel) { + this.path = path; + this.rngModel = rngModel; + } + + public String getPath() { + return path; + } + + public RngBackendModel getRngBackendModel() { + return rngBackendModel; + } + + public RngModel getRngModel() { + return rngModel; + } + + public int getRngRateBytes() { + return rngRateBytes; + } + + public int getRngRatePeriod() { + return rngRatePeriod; + } + + @Override + public String toString() { + StringBuilder rngBuilder = new StringBuilder(); + rngBuilder.append("\n"); + rngBuilder.append("\n"); + rngBuilder.append("" + path + ""); + rngBuilder.append("\n"); + return rngBuilder.toString(); + } + } + + public static class WatchDogDef { + enum WatchDogModel { + I6300ESB("i6300esb"), IB700("ib700"), DIAG288("diag288"); + String model; + + WatchDogModel(String model) { + this.model = model; + } + + @Override + public String toString() { + return model; + } + } + + enum WatchDogAction { + RESET("reset"), SHUTDOWN("shutdown"), POWEROFF("poweroff"), PAUSE("pause"), NONE("none"), DUMP("dump"); + String action; + + WatchDogAction(String action) { + this.action = action; + } + + @Override + public String toString() { + return action; + } + } + + WatchDogModel model = WatchDogModel.I6300ESB; + WatchDogAction action = WatchDogAction.NONE; + + public WatchDogDef(WatchDogAction action) { + this.action = action; + } + + public WatchDogDef(WatchDogModel model) { + this.model = model; + } + + public WatchDogDef(WatchDogAction action, WatchDogModel model) { + this.action = action; + this.model = model; + } + + public WatchDogAction getAction() { + return action; + } + + public WatchDogModel getModel() { + return model; + } + + @Override + public String toString() { + StringBuilder wacthDogBuilder = new StringBuilder(); + wacthDogBuilder.append("\n"); + return wacthDogBuilder.toString(); } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/MigrateKVMAsync.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/MigrateKVMAsync.java index 2df6c651e3de..4b2afa6a59ba 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/MigrateKVMAsync.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/MigrateKVMAsync.java @@ -33,24 +33,39 @@ public class MigrateKVMAsync implements Callable { private String dxml = ""; private String vmName = ""; private String destIp = ""; + private boolean migrateStorage; + private boolean autoConvergence; - public MigrateKVMAsync(final LibvirtComputingResource libvirtComputingResource, final Domain dm, final Connect dconn, final String dxml, final String vmName, final String destIp) { + public MigrateKVMAsync(final LibvirtComputingResource libvirtComputingResource, final Domain dm, final Connect dconn, final String dxml, + final boolean migrateStorage, final boolean autoConvergence, final String vmName, final String destIp) { this.libvirtComputingResource = libvirtComputingResource; this.dm = dm; this.dconn = dconn; this.dxml = dxml; + this.migrateStorage = migrateStorage; + this.autoConvergence = autoConvergence; this.vmName = vmName; this.destIp = destIp; } @Override public Domain call() throws LibvirtException { - // set compression flag for migration if libvirt version supports it - if (dconn.getLibVirVersion() < 1003000) { - return dm.migrate(dconn, 1 << 0, dxml, vmName, "tcp:" + destIp, libvirtComputingResource.getMigrateSpeed()); - } else { - return dm.migrate(dconn, 1 << 0|1 << 11, dxml, vmName, "tcp:" + destIp, libvirtComputingResource.getMigrateSpeed()); + long flags = 1 << 0; + + // set compression flag for migration, if libvirt version supports it + if (dconn.getLibVirVersion() >= 1000003) { + flags |= 1 << 11; + } + + if (migrateStorage) { + flags |= 1 << 6; } + + if (autoConvergence && dconn.getLibVirVersion() >= 1002003) { + flags |= 1 << 13; + } + + return dm.migrate(dconn, flags, dxml, vmName, "tcp:" + destIp, libvirtComputingResource.getMigrateSpeed()); } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java index 6462df7cf308..06cd1617b782 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/OvsVifDriver.java @@ -18,6 +18,8 @@ */ package com.cloud.hypervisor.kvm.resource; +import java.util.Arrays; +import java.util.List; import java.util.Map; import javax.naming.ConfigurationException; @@ -42,6 +44,8 @@ public class OvsVifDriver extends VifDriverBase { public void configure(Map params) throws ConfigurationException { super.configure(params); + getPifs(); + String networkScriptsDir = (String)params.get("network.scripts.dir"); if (networkScriptsDir == null) { networkScriptsDir = "scripts/vm/network/vnet"; @@ -49,8 +53,27 @@ public void configure(Map params) throws ConfigurationException String value = (String)params.get("scripts.timeout"); _timeout = NumbersUtil.parseInt(value, 30 * 60) * 1000; + } - createControlNetwork(_bridges.get("linklocal")); + public void getPifs() { + final String cmdout = Script.runSimpleBashScript("ovs-vsctl list-br | sed '{:q;N;s/\\n/%/g;t q}'"); + s_logger.debug("cmdout was " + cmdout); + final List bridges = Arrays.asList(cmdout.split("%")); + for (final String bridge : bridges) { + s_logger.debug("looking for pif for bridge " + bridge); + // String pif = getOvsPif(bridge); + // Not really interested in the pif name at this point for ovs + // bridges + final String pif = bridge; + if (_libvirtComputingResource.isPublicBridge(bridge)) { + _pifs.put("public", pif); + } + if (_libvirtComputingResource.isGuestBridge(bridge)) { + _pifs.put("private", pif); + } + _pifs.put(bridge, pif); + } + s_logger.debug("done looking for pifs, no more bridges"); } @Override @@ -132,6 +155,17 @@ public void unplug(InterfaceDef iface) { // Libvirt apparently takes care of this, see BridgeVifDriver unplug } + + @Override + public void attach(LibvirtVMDef.InterfaceDef iface) { + Script.runSimpleBashScript("ovs-vsctl add-port " + iface.getBrName() + " " + iface.getDevName()); + } + + @Override + public void detach(LibvirtVMDef.InterfaceDef iface) { + Script.runSimpleBashScript("ovs-vsctl port-to-br " + iface.getDevName() + " && ovs-vsctl del-port " + iface.getBrName() + " " + iface.getDevName()); + } + private void deleteExitingLinkLocalRouteTable(String linkLocalBr) { Script command = new Script("/bin/bash", _timeout); command.add("-c"); @@ -156,14 +190,16 @@ private void deleteExitingLinkLocalRouteTable(String linkLocalBr) { } } - private void createControlNetwork(String privBrName) { + @Override + public void createControlNetwork(String privBrName) { deleteExitingLinkLocalRouteTable(privBrName); - if (!isBridgeExists(privBrName)) { + if (!isExistingBridge(privBrName)) { Script.runSimpleBashScript("ovs-vsctl add-br " + privBrName + "; ip link set " + privBrName + " up; ip address add 169.254.0.1/16 dev " + privBrName, _timeout); } } - private boolean isBridgeExists(String bridgeName) { + @Override + public boolean isExistingBridge(String bridgeName) { Script command = new Script("/bin/sh", _timeout); command.add("-c"); command.add("ovs-vsctl br-exists " + bridgeName); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriver.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriver.java index 5cd2d6151a4f..387a552b55e2 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriver.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriver.java @@ -36,4 +36,12 @@ public interface VifDriver { public void unplug(LibvirtVMDef.InterfaceDef iface); + void attach(LibvirtVMDef.InterfaceDef iface); + + void detach(LibvirtVMDef.InterfaceDef iface); + + void createControlNetwork(String privBrName); + + boolean isExistingBridge(String bridgeName); + } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriverBase.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriverBase.java index 2baec276a0fa..dad73f28c168 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriverBase.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/VifDriverBase.java @@ -63,4 +63,8 @@ protected LibvirtVMDef.InterfaceDef.NicModel getGuestNicModel(String platformEmu return LibvirtVMDef.InterfaceDef.NicModel.E1000; } } + + public boolean isExistingBridge(String bridgeName) { + return false; + } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtAttachIsoCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtAttachIsoCommandWrapper.java index 3c6da922e464..a2f62e6cdce5 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtAttachIsoCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtAttachIsoCommandWrapper.java @@ -24,7 +24,7 @@ import org.libvirt.Connect; import org.libvirt.LibvirtException; -import com.cloud.agent.api.Answer; +import com.cloud.agent.api.AttachIsoAnswer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.exception.InternalErrorException; import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; @@ -32,23 +32,19 @@ import com.cloud.resource.ResourceWrapper; @ResourceWrapper(handles = AttachIsoCommand.class) -public final class LibvirtAttachIsoCommandWrapper extends CommandWrapper { +public final class LibvirtAttachIsoCommandWrapper extends CommandWrapper { @Override - public Answer execute(final AttachIsoCommand command, final LibvirtComputingResource libvirtComputingResource) { + public AttachIsoAnswer execute(final AttachIsoCommand command, final LibvirtComputingResource libvirtComputingResource) { try { final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); final Connect conn = libvirtUtilitiesHelper.getConnectionByVmName(command.getVmName()); - libvirtComputingResource.attachOrDetachISO(conn, command.getVmName(), command.getIsoPath(), command.isAttach()); - } catch (final LibvirtException e) { - return new Answer(command, false, e.toString()); - } catch (final URISyntaxException e) { - return new Answer(command, false, e.toString()); - } catch (final InternalErrorException e) { - return new Answer(command, false, e.toString()); + libvirtComputingResource.attachOrDetachISO(conn, command.getVmName(), command.getIsoPath(), command.isAttach(), command.getDeviceKey()); + } catch (final LibvirtException|URISyntaxException|InternalErrorException e) { + return new AttachIsoAnswer(command, e); } - return new Answer(command); + return new AttachIsoAnswer(command, command.getDeviceKey()); } } \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java index 0d3df1f274c6..1ce491cd16c9 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckNetworkCommandWrapper.java @@ -25,6 +25,7 @@ import com.cloud.agent.api.CheckNetworkAnswer; import com.cloud.agent.api.CheckNetworkCommand; import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.network.Networks; import com.cloud.network.PhysicalNetworkSetupInfo; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; @@ -38,13 +39,13 @@ public Answer execute(final CheckNetworkCommand command, final LibvirtComputingR String errMsg = null; for (final PhysicalNetworkSetupInfo nic : phyNics) { - if (!libvirtComputingResource.checkNetwork(nic.getGuestNetworkName())) { + if (!libvirtComputingResource.checkNetwork(Networks.TrafficType.Guest, nic.getGuestNetworkName())) { errMsg = "Can not find network: " + nic.getGuestNetworkName(); break; - } else if (!libvirtComputingResource.checkNetwork(nic.getPrivateNetworkName())) { + } else if (!libvirtComputingResource.checkNetwork(Networks.TrafficType.Management, nic.getPrivateNetworkName())) { errMsg = "Can not find network: " + nic.getPrivateNetworkName(); break; - } else if (!libvirtComputingResource.checkNetwork(nic.getPublicNetworkName())) { + } else if (!libvirtComputingResource.checkNetwork(Networks.TrafficType.Public, nic.getPublicNetworkName())) { errMsg = "Can not find network: " + nic.getPublicNetworkName(); break; } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckOnHostCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckOnHostCommandWrapper.java index bc648f2f446c..651cdc9e888c 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckOnHostCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckOnHostCommandWrapper.java @@ -53,14 +53,14 @@ public Answer execute(final CheckOnHostCommand command, final LibvirtComputingRe try { final Boolean result = future.get(); if (result) { - return new Answer(command, false, "Heart is still beating..."); + return new Answer(command, false, "Heart is beating..."); } else { return new Answer(command); } } catch (final InterruptedException e) { - return new Answer(command, false, "can't get status of host:"); + return new Answer(command, false, "CheckOnHostCommand: can't get status of host: InterruptedException"); } catch (final ExecutionException e) { - return new Answer(command, false, "can't get status of host:"); + return new Answer(command, false, "CheckOnHostCommand: can't get status of host: ExecutionException"); } } } \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckUrlCommand.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckUrlCommand.java new file mode 100644 index 000000000000..efc009037b9c --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckUrlCommand.java @@ -0,0 +1,50 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// +package com.cloud.hypervisor.kvm.resource.wrapper; + +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.UriUtils; +import org.apache.cloudstack.agent.directdownload.CheckUrlAnswer; +import org.apache.cloudstack.agent.directdownload.CheckUrlCommand; +import org.apache.log4j.Logger; + +@ResourceWrapper(handles = CheckUrlCommand.class) +public class LibvirtCheckUrlCommand extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtCheckUrlCommand.class); + + @Override + public CheckUrlAnswer execute(CheckUrlCommand cmd, LibvirtComputingResource serverResource) { + final String url = cmd.getUrl(); + s_logger.info("Checking URL: " + url); + boolean checkResult = true; + Long remoteSize = null; + try { + UriUtils.checkUrlExistence(url); + remoteSize = UriUtils.getRemoteSize(url); + } + catch (IllegalArgumentException e) { + s_logger.warn(e.getMessage()); + checkResult = false; + } + return new CheckUrlAnswer(checkResult, remoteSize); + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVMActivityOnStoragePoolCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVMActivityOnStoragePoolCommandWrapper.java new file mode 100644 index 000000000000..9c899a040550 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCheckVMActivityOnStoragePoolCommandWrapper.java @@ -0,0 +1,65 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.CheckVMActivityOnStoragePoolCommand; +import com.cloud.agent.api.to.StorageFilerTO; +import com.cloud.hypervisor.kvm.resource.KVMHABase.NfsStoragePool; +import com.cloud.hypervisor.kvm.resource.KVMHAMonitor; +import com.cloud.hypervisor.kvm.resource.KVMHAVMActivityChecker; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.storage.Storage; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.ExecutorService; +import java.util.concurrent.Executors; +import java.util.concurrent.Future; + +@ResourceWrapper(handles = CheckVMActivityOnStoragePoolCommand.class) +public final class LibvirtCheckVMActivityOnStoragePoolCommandWrapper extends CommandWrapper { + + @Override + public Answer execute(final CheckVMActivityOnStoragePoolCommand command, final LibvirtComputingResource libvirtComputingResource) { + final ExecutorService executors = Executors.newSingleThreadExecutor(); + final KVMHAMonitor monitor = libvirtComputingResource.getMonitor(); + final StorageFilerTO pool = command.getPool(); + if (Storage.StoragePoolType.NetworkFilesystem == pool.getType()){ + final NfsStoragePool nfspool = monitor.getStoragePool(pool.getUuid()); + final KVMHAVMActivityChecker ha = new KVMHAVMActivityChecker(nfspool, command.getHost().getPrivateNetwork().getIp(), command.getVolumeList(), libvirtComputingResource.getVmActivityCheckPath(), command.getSuspectTimeInSeconds()); + final Future future = executors.submit(ha); + try { + final Boolean result = future.get(); + if (result) { + return new Answer(command, false, "VMHA disk activity detected ..."); + } else { + return new Answer(command); + } + } catch (InterruptedException e) { + return new Answer(command, false, "CheckVMActivityOnStoragePoolCommand: can't get status of host: InterruptedException"); + } catch (ExecutionException e) { + return new Answer(command, false, "CheckVMActivityOnStoragePoolCommand: can't get status of host: ExecutionException"); + } + } + return new Answer(command, false, "Unsupported Storage"); + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCopyVolumeCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCopyVolumeCommandWrapper.java index b2248b990625..0795abf06888 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCopyVolumeCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCopyVolumeCommandWrapper.java @@ -20,10 +20,12 @@ package com.cloud.hypervisor.kvm.resource.wrapper; import java.io.File; +import java.util.Map; import com.cloud.agent.api.Answer; import com.cloud.agent.api.storage.CopyVolumeAnswer; import com.cloud.agent.api.storage.CopyVolumeCommand; +import com.cloud.agent.api.to.DiskTO; import com.cloud.agent.api.to.StorageFilerTO; import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; @@ -33,8 +35,13 @@ import com.cloud.resource.ResourceWrapper; import com.cloud.utils.exception.CloudRuntimeException; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.log4j.Logger; + @ResourceWrapper(handles = CopyVolumeCommand.class) public final class LibvirtCopyVolumeCommandWrapper extends CommandWrapper { + private static final Logger LOGGER = Logger.getLogger(LibvirtCopyVolumeCommandWrapper.class); @Override public Answer execute(final CopyVolumeCommand command, final LibvirtComputingResource libvirtComputingResource) { @@ -46,20 +53,30 @@ public Answer execute(final CopyVolumeCommand command, final LibvirtComputingRes * ManagementServerImpl shows that it always sets copyToSecondary to * true */ + + Map srcDetails = command.getSrcDetails(); + + if (srcDetails != null) { + return handleCopyDataFromVolumeToSecondaryStorageUsingSrcDetails(command, libvirtComputingResource); + } + + final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + final boolean copyToSecondary = command.toSecondaryStorage(); - String volumePath = command.getVolumePath(); final StorageFilerTO pool = command.getPool(); final String secondaryStorageUrl = command.getSecondaryStorageURL(); + KVMStoragePool secondaryStoragePool = null; - KVMStoragePool primaryPool = null; + String volumePath; + KVMStoragePool primaryPool; - final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); try { try { primaryPool = storagePoolMgr.getStoragePool(pool.getType(), pool.getUuid()); } catch (final CloudRuntimeException e) { if (e.getMessage().contains("not found")) { - primaryPool = storagePoolMgr.createStoragePool(pool.getUuid(), pool.getHost(), pool.getPort(), pool.getPath(), pool.getUserInfo(), pool.getType()); + primaryPool = storagePoolMgr.createStoragePool(pool.getUuid(), pool.getHost(), pool.getPort(), pool.getPath(), + pool.getUserInfo(), pool.getType()); } else { return new CopyVolumeAnswer(command, false, e.getMessage(), null, null); } @@ -85,6 +102,7 @@ public Answer execute(final CopyVolumeCommand command, final LibvirtComputingRes secondaryStoragePool = storagePoolMgr.getStoragePoolByURI(secondaryStorageUrl + volumePath); final KVMPhysicalDisk volume = secondaryStoragePool.getPhysicalDisk(command.getVolumePath() + ".qcow2"); + storagePoolMgr.copyPhysicalDisk(volume, volumeName, primaryPool, 0); return new CopyVolumeAnswer(command, true, null, null, volumeName); @@ -97,4 +115,61 @@ public Answer execute(final CopyVolumeCommand command, final LibvirtComputingRes } } } -} \ No newline at end of file + + private Answer handleCopyDataFromVolumeToSecondaryStorageUsingSrcDetails(CopyVolumeCommand command, LibvirtComputingResource libvirtComputingResource) { + KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + PrimaryDataStoreTO srcPrimaryDataStore = null; + KVMStoragePool secondaryStoragePool = null; + + Map srcDetails = command.getSrcDetails(); + + String srcPath = srcDetails.get(DiskTO.IQN); + + if (srcPath == null) { + return new CopyVolumeAnswer(command, false, "No IQN was specified", null, null); + } + + try { + LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); + String destVolumeName = libvirtUtilitiesHelper.generateUUIDName() + ".qcow2"; + String destVolumePath = command.getVolumePath() + File.separator; + + String secondaryStorageUrl = command.getSecondaryStorageURL(); + + secondaryStoragePool = storagePoolMgr.getStoragePoolByURI(secondaryStorageUrl); + + secondaryStoragePool.createFolder(File.separator + destVolumePath); + + storagePoolMgr.deleteStoragePool(secondaryStoragePool.getType(), secondaryStoragePool.getUuid()); + + secondaryStoragePool = storagePoolMgr.getStoragePoolByURI(secondaryStorageUrl + File.separator + destVolumePath); + + VolumeObjectTO srcVolumeObjectTO = (VolumeObjectTO)command.getSrcData(); + + srcPrimaryDataStore = (PrimaryDataStoreTO)srcVolumeObjectTO.getDataStore(); + + storagePoolMgr.connectPhysicalDisk(srcPrimaryDataStore.getPoolType(), srcPrimaryDataStore.getUuid(), srcPath, srcDetails); + + KVMPhysicalDisk srcPhysicalDisk = storagePoolMgr.getPhysicalDisk(srcPrimaryDataStore.getPoolType(), srcPrimaryDataStore.getUuid(), srcPath); + + storagePoolMgr.copyPhysicalDisk(srcPhysicalDisk, destVolumeName, secondaryStoragePool, command.getWait() * 1000); + + return new CopyVolumeAnswer(command, true, null, null, destVolumePath + destVolumeName); + } catch (final CloudRuntimeException e) { + return new CopyVolumeAnswer(command, false, e.toString(), null, null); + } finally { + try { + if (srcPrimaryDataStore != null) { + storagePoolMgr.disconnectPhysicalDisk(srcPrimaryDataStore.getPoolType(), srcPrimaryDataStore.getUuid(), srcPath); + } + } + catch (Exception e) { + LOGGER.warn("Unable to disconnect from the source device.", e); + } + + if (secondaryStoragePool != null) { + storagePoolMgr.deleteStoragePool(secondaryStoragePool.getType(), secondaryStoragePool.getUuid()); + } + } + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCreateVMSnapshotCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCreateVMSnapshotCommandWrapper.java new file mode 100644 index 000000000000..c7941e7fc897 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtCreateVMSnapshotCommandWrapper.java @@ -0,0 +1,82 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.DomainInfo.DomainState; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.CreateVMSnapshotAnswer; +import com.cloud.agent.api.CreateVMSnapshotCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; + +@ResourceWrapper(handles = CreateVMSnapshotCommand.class) +public final class LibvirtCreateVMSnapshotCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtCreateVMSnapshotCommandWrapper.class); + + @Override + public Answer execute(final CreateVMSnapshotCommand cmd, final LibvirtComputingResource libvirtComputingResource) { + String vmName = cmd.getVmName(); + String vmSnapshotName = cmd.getTarget().getSnapshotName(); + + Domain dm = null; + try { + final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); + Connect conn = libvirtUtilitiesHelper.getConnection(); + dm = libvirtComputingResource.getDomain(conn, vmName); + + if (dm == null) { + return new CreateVMSnapshotAnswer(cmd, false, + "Create VM Snapshot Failed due to can not find vm: " + vmName); + } + + DomainState domainState = dm.getInfo().state ; + if (domainState != DomainState.VIR_DOMAIN_RUNNING) { + return new CreateVMSnapshotAnswer(cmd, false, + "Create VM Snapshot Failed due to vm is not running: " + vmName + " with domainState = " + domainState); + } + + String vmSnapshotXML = "" + " " + vmSnapshotName + "" + + " " + ""; + + dm.snapshotCreateXML(vmSnapshotXML); + + return new CreateVMSnapshotAnswer(cmd, cmd.getTarget(), cmd.getVolumeTOs()); + } catch (LibvirtException e) { + String msg = " Create VM snapshot failed due to " + e.toString(); + s_logger.warn(msg, e); + return new CreateVMSnapshotAnswer(cmd, false, msg); + } finally { + if (dm != null) { + try { + dm.free(); + } catch (LibvirtException l) { + s_logger.trace("Ignoring libvirt error.", l); + }; + } + } + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteStoragePoolCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteStoragePoolCommandWrapper.java index 12ba874cf61a..08e414a106b1 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteStoragePoolCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteStoragePoolCommandWrapper.java @@ -30,13 +30,17 @@ @ResourceWrapper(handles = DeleteStoragePoolCommand.class) public final class LibvirtDeleteStoragePoolCommandWrapper extends CommandWrapper { - @Override public Answer execute(final DeleteStoragePoolCommand command, final LibvirtComputingResource libvirtComputingResource) { try { - final StorageFilerTO pool = command.getPool(); - final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); - storagePoolMgr.deleteStoragePool(pool.getType(), pool.getUuid()); + // if getRemoveDatastore() is true, then we are dealing with managed storage and can skip the delete logic here + if (!command.getRemoveDatastore()) { + final StorageFilerTO pool = command.getPool(); + final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + + storagePoolMgr.deleteStoragePool(pool.getType(), pool.getUuid()); + } + return new Answer(command); } catch (final CloudRuntimeException e) { return new Answer(command, false, e.toString()); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java new file mode 100644 index 000000000000..9efec950af3a --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtDeleteVMSnapshotCommandWrapper.java @@ -0,0 +1,110 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.DomainSnapshot; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.DeleteVMSnapshotAnswer; +import com.cloud.agent.api.DeleteVMSnapshotCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; +import com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.storage.Volume; +import com.cloud.storage.Storage.ImageFormat; +import com.cloud.utils.script.Script; + +@ResourceWrapper(handles = DeleteVMSnapshotCommand.class) +public final class LibvirtDeleteVMSnapshotCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtDeleteVMSnapshotCommandWrapper.class); + + @Override + public Answer execute(final DeleteVMSnapshotCommand cmd, final LibvirtComputingResource libvirtComputingResource) { + String vmName = cmd.getVmName(); + + final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + Domain dm = null; + DomainSnapshot snapshot = null; + try { + final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); + Connect conn = libvirtUtilitiesHelper.getConnection(); + dm = libvirtComputingResource.getDomain(conn, vmName); + + snapshot = dm.snapshotLookupByName(cmd.getTarget().getSnapshotName()); + + snapshot.delete(0); // only remove this snapshot, not children + + return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs()); + } catch (LibvirtException e) { + String msg = " Delete VM snapshot failed due to " + e.toString(); + + if (dm == null) { + s_logger.debug("Can not find running vm: " + vmName + ", now we are trying to delete the vm snapshot using qemu-img if the format of root volume is QCOW2"); + VolumeObjectTO rootVolume = null; + for (VolumeObjectTO volume: cmd.getVolumeTOs()) { + if (volume.getVolumeType() == Volume.Type.ROOT) { + rootVolume = volume; + break; + } + } + if (rootVolume != null && ImageFormat.QCOW2.equals(rootVolume.getFormat())) { + PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO) rootVolume.getDataStore(); + KVMPhysicalDisk rootDisk = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), + primaryStore.getUuid(), rootVolume.getPath()); + String qemu_img_snapshot = Script.runSimpleBashScript("qemu-img snapshot -l " + rootDisk.getPath() + " | tail -n +3 | awk -F ' ' '{print $2}' | grep ^" + cmd.getTarget().getSnapshotName() + "$"); + if (qemu_img_snapshot == null) { + s_logger.info("Cannot find snapshot " + cmd.getTarget().getSnapshotName() + " in file " + rootDisk.getPath() + ", return true"); + return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs()); + } + int result = Script.runSimpleBashScriptForExitValue("qemu-img snapshot -d " + cmd.getTarget().getSnapshotName() + " " + rootDisk.getPath()); + if (result != 0) { + return new DeleteVMSnapshotAnswer(cmd, false, + "Delete VM Snapshot Failed due to can not remove snapshot from image file " + rootDisk.getPath() + " : " + result); + } else { + return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs()); + } + } + } else if (snapshot == null) { + s_logger.debug("Can not find vm snapshot " + cmd.getTarget().getSnapshotName() + " on vm: " + vmName + ", return true"); + return new DeleteVMSnapshotAnswer(cmd, cmd.getVolumeTOs()); + } + + s_logger.warn(msg, e); + return new DeleteVMSnapshotAnswer(cmd, false, msg); + } finally { + if (dm != null) { + try { + dm.free(); + } catch (LibvirtException l) { + s_logger.trace("Ignoring libvirt error.", l); + }; + } + } + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVmIpAddressCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVmIpAddressCommandWrapper.java new file mode 100644 index 000000000000..1d3a60b75e35 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVmIpAddressCommandWrapper.java @@ -0,0 +1,82 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.GetVmIpAddressCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.net.NetUtils; +import com.cloud.utils.script.Script; +import org.apache.log4j.Logger; + +@ResourceWrapper(handles = GetVmIpAddressCommand.class) +public final class LibvirtGetVmIpAddressCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtGetVmIpAddressCommandWrapper.class); + + @Override + public Answer execute(final GetVmIpAddressCommand command, final LibvirtComputingResource libvirtComputingResource) { + String ip = null; + boolean result = false; + String networkCidr = command.getVmNetworkCidr(); + if(!command.isWindows()) { + //List all dhcp lease files inside guestVm + String leasesList = Script.runSimpleBashScript(new StringBuilder().append("virt-ls ").append(command.getVmName()) + .append(" /var/lib/dhclient/ | grep .*\\*.leases").toString()); + if(leasesList != null) { + String[] leasesFiles = leasesList.split("\n"); + for(String leaseFile : leasesFiles){ + //Read from each dhclient lease file inside guest Vm using virt-cat libguestfs ulitiy + String ipAddr = Script.runSimpleBashScript(new StringBuilder().append("virt-cat ").append(command.getVmName()) + .append(" /var/lib/dhclient/" + leaseFile + " | tail -16 | grep 'fixed-address' | awk '{print $2}' | sed -e 's/;//'").toString()); + // Check if the IP belongs to the network + if((ipAddr != null) && NetUtils.isIpWithInCidrRange(ipAddr, networkCidr)){ + ip = ipAddr; + break; + } + s_logger.debug("GetVmIp: "+command.getVmName()+ " Ip: "+ipAddr+" does not belong to network "+networkCidr); + } + } + } else { + // For windows, read from guest Vm registry using virt-win-reg libguestfs ulitiy. Registry Path: HKEY_LOCAL_MACHINE\SYSTEM\ControlSet001\Services\Tcpip\Parameters\Interfaces\\DhcpIPAddress + String ipList = Script.runSimpleBashScript(new StringBuilder().append("virt-win-reg --unsafe-printable-strings ").append(command.getVmName()) + .append(" 'HKEY_LOCAL_MACHINE\\SYSTEM\\ControlSet001\\Services\\Tcpip\\Parameters\\Interfaces' | grep DhcpIPAddress | awk -F : '{print $2}' | sed -e 's/^\"//' -e 's/\"$//'").toString()); + if(ipList != null) { + s_logger.debug("GetVmIp: "+command.getVmName()+ "Ips: "+ipList); + String[] ips = ipList.split("\n"); + for (String ipAddr : ips){ + // Check if the IP belongs to the network + if((ipAddr != null) && NetUtils.isIpWithInCidrRange(ipAddr, networkCidr)){ + ip = ipAddr; + break; + } + s_logger.debug("GetVmIp: "+command.getVmName()+ " Ip: "+ipAddr+" does not belong to network "+networkCidr); + } + } + } + if(ip != null){ + result = true; + s_logger.debug("GetVmIp: "+command.getVmName()+ " Found Ip: "+ip); + } + return new Answer(command, result, ip); + } +} \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVmNetworkStatsCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVmNetworkStatsCommandWrapper.java new file mode 100644 index 000000000000..20ee4fd9dea8 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVmNetworkStatsCommandWrapper.java @@ -0,0 +1,68 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import java.util.HashMap; +import java.util.List; + +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.GetVmNetworkStatsAnswer; +import com.cloud.agent.api.GetVmNetworkStatsCommand; +import com.cloud.agent.api.VmNetworkStatsEntry; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; + +@ResourceWrapper(handles = GetVmNetworkStatsCommand.class) +public final class LibvirtGetVmNetworkStatsCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtGetVmNetworkStatsCommandWrapper.class); + + @Override + public Answer execute(final GetVmNetworkStatsCommand command, final LibvirtComputingResource libvirtComputingResource) { + final List vmNames = command.getVmNames(); + final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); + + try { + final HashMap> vmNetworkStatsNameMap = new HashMap>(); + final Connect conn = libvirtUtilitiesHelper.getConnection(); + for (final String vmName : vmNames) { + try { + final List statEntry = libvirtComputingResource.getVmNetworkStat(conn, vmName); + if (statEntry == null) { + continue; + } + + vmNetworkStatsNameMap.put(vmName, statEntry); + } catch (LibvirtException e) { + s_logger.warn("Can't get vm network stats: " + e.toString() + ", continue"); + } + } + return new GetVmNetworkStatsAnswer(command, "", command.getHostName(), vmNetworkStatsNameMap); + } catch (final LibvirtException e) { + s_logger.debug("Can't get vm network stats: " + e.toString()); + return new GetVmNetworkStatsAnswer(command, null, null, null); + } + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVolumeStatsCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVolumeStatsCommandWrapper.java new file mode 100644 index 000000000000..6d945b1448d6 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtGetVolumeStatsCommandWrapper.java @@ -0,0 +1,66 @@ +// +//Licensed to the Apache Software Foundation (ASF) under one +//or more contributor license agreements. See the NOTICE file +//distributed with this work for additional information +//regarding copyright ownership. The ASF licenses this file +//to you under the Apache License, Version 2.0 (the +//"License"); you may not use this file except in compliance +//with the License. You may obtain a copy of the License at +// +//http://www.apache.org/licenses/LICENSE-2.0 +// +//Unless required by applicable law or agreed to in writing, +//software distributed under the License is distributed on an +//"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +//KIND, either express or implied. See the License for the +//specific language governing permissions and limitations +//under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import java.util.HashMap; + +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.hypervisor.kvm.resource.LibvirtConnection; +import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; +import com.cloud.hypervisor.kvm.storage.KVMStoragePool; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.agent.api.GetVolumeStatsAnswer; +import com.cloud.agent.api.GetVolumeStatsCommand; +import com.cloud.agent.api.VolumeStatsEntry; + +@ResourceWrapper(handles = GetVolumeStatsCommand.class) +public final class LibvirtGetVolumeStatsCommandWrapper extends CommandWrapper { + private static final Logger s_logger = Logger.getLogger(LibvirtGetVmDiskStatsCommandWrapper.class); + + @Override + public Answer execute(final GetVolumeStatsCommand cmd, final LibvirtComputingResource libvirtComputingResource) { + try { + Connect conn = LibvirtConnection.getConnection(); + String storeUuid = cmd.getPoolUuid(); + StoragePoolType poolType = cmd.getPoolType(); + HashMap statEntry = new HashMap(); + for (String volumeUuid : cmd.getVolumeUuids()) { + statEntry.put(volumeUuid, getVolumeStat(libvirtComputingResource, conn, volumeUuid, storeUuid, poolType)); + } + return new GetVolumeStatsAnswer(cmd, "", statEntry); + } catch (LibvirtException e) { + return new GetVolumeStatsAnswer(cmd, "Can't get vm disk stats: " + e.getMessage(), null); + } + } + + + private VolumeStatsEntry getVolumeStat(final LibvirtComputingResource libvirtComputingResource, final Connect conn, final String volumeUuid, final String storeUuid, final StoragePoolType poolType) throws LibvirtException { + KVMStoragePool sourceKVMPool = libvirtComputingResource.getStoragePoolMgr().getStoragePool(poolType, storeUuid); + KVMPhysicalDisk sourceKVMVolume = sourceKVMPool.getPhysicalDisk(volumeUuid); + return new VolumeStatsEntry(volumeUuid, sourceKVMVolume.getSize(), sourceKVMVolume.getVirtualSize()); + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtHandleConfigDriveCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtHandleConfigDriveCommandWrapper.java new file mode 100644 index 000000000000..6baae85e2214 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtHandleConfigDriveCommandWrapper.java @@ -0,0 +1,78 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import java.io.File; +import java.io.IOException; +import java.nio.file.Files; +import java.nio.file.Path; +import java.nio.file.Paths; + +import org.apache.cloudstack.storage.configdrive.ConfigDriveBuilder; +import org.apache.log4j.Logger; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.HandleConfigDriveIsoCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.hypervisor.kvm.storage.KVMStoragePool; +import com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.storage.Storage; + +@ResourceWrapper(handles = HandleConfigDriveIsoCommand.class) +public final class LibvirtHandleConfigDriveCommandWrapper extends CommandWrapper { + private static final Logger LOG = Logger.getLogger(LibvirtHandleConfigDriveCommandWrapper.class); + + @Override + public Answer execute(final HandleConfigDriveIsoCommand command, final LibvirtComputingResource libvirtComputingResource) { + final KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + final KVMStoragePool pool = storagePoolMgr.getStoragePool(Storage.StoragePoolType.NetworkFilesystem, command.getDestStore().getUuid()); + if (pool == null) { + return new Answer(command, false, "Pool not found, config drive for KVM is only supported for NFS"); + } + + final String mountPoint = pool.getLocalPath(); + final Path isoPath = Paths.get(mountPoint, command.getIsoFile()); + final File isoFile = new File(mountPoint, command.getIsoFile()); + if (command.isCreate()) { + LOG.debug("Creating config drive: " + command.getIsoFile()); + if (command.getIsoData() == null) { + return new Answer(command, false, "Invalid config drive ISO data received"); + } + if (isoFile.exists()) { + LOG.debug("An old config drive iso already exists"); + } + try { + Files.createDirectories(isoPath.getParent()); + ConfigDriveBuilder.base64StringToFile(command.getIsoData(), mountPoint, command.getIsoFile()); + } catch (IOException e) { + return new Answer(command, false, "Failed due to exception: " + e.getMessage()); + } + } else { + try { + Files.deleteIfExists(isoPath); + } catch (IOException e) { + LOG.warn("Failed to delete config drive: " + isoPath.toAbsolutePath().toString()); + return new Answer(command, false, "Failed due to exception: " + e.getMessage()); + } + } + + return new Answer(command); + } +} \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java index 6736c512dd60..067e77df3cfc 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapper.java @@ -19,7 +19,12 @@ package com.cloud.hypervisor.kvm.resource.wrapper; +import java.io.ByteArrayOutputStream; +import java.io.IOException; +import java.io.InputStream; import java.util.List; +import java.util.Map; +import java.util.Set; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; @@ -28,11 +33,30 @@ import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import javax.xml.parsers.DocumentBuilder; +import javax.xml.parsers.DocumentBuilderFactory; +import javax.xml.parsers.ParserConfigurationException; +import javax.xml.transform.Transformer; +import javax.xml.transform.TransformerConfigurationException; +import javax.xml.transform.TransformerException; +import javax.xml.transform.TransformerFactory; +import javax.xml.transform.dom.DOMSource; +import javax.xml.transform.stream.StreamResult; + +import org.apache.commons.collections.MapUtils; +import org.apache.commons.io.IOUtils; +import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainInfo.DomainState; import org.libvirt.LibvirtException; +import org.w3c.dom.Document; +import org.w3c.dom.Element; +import org.w3c.dom.NamedNodeMap; +import org.w3c.dom.Node; +import org.w3c.dom.NodeList; +import org.xml.sax.SAXException; import com.cloud.agent.api.Answer; import com.cloud.agent.api.MigrateAnswer; @@ -44,6 +68,9 @@ import com.cloud.hypervisor.kvm.resource.VifDriver; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.Ternary; +import com.cloud.utils.exception.CloudRuntimeException; +import com.google.common.base.Strings; @ResourceWrapper(handles = MigrateCommand.class) public final class LibvirtMigrateCommandWrapper extends CommandWrapper { @@ -53,20 +80,30 @@ public final class LibvirtMigrateCommandWrapper extends CommandWrapper ifaces = null; - List disks = null; + List disks; Domain dm = null; Connect dconn = null; Domain destDomain = null; Connect conn = null; String xmlDesc = null; + List> vmsnapshots = null; + try { final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); @@ -77,7 +114,7 @@ public Answer execute(final MigrateCommand command, final LibvirtComputingResour /* We replace the private IP address with the address of the destination host. This is because the VNC listens on the private IP address of the hypervisor, - but that address is ofcourse different on the target host. + but that address is of course different on the target host. MigrateCommand.getDestinationIp() returns the private IP address of the target hypervisor. So it's safe to use. @@ -99,12 +136,25 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0. xmlDesc = dm.getXMLDesc(xmlFlag); xmlDesc = replaceIpForVNCInDescFile(xmlDesc, target); - dconn = libvirtUtilitiesHelper.retrieveQemuConnection("qemu+tcp://" + command.getDestinationIp() + "/system"); + // delete the metadata of vm snapshots before migration + vmsnapshots = libvirtComputingResource.cleanVMSnapshotMetadata(dm); + + Map mapMigrateStorage = command.getMigrateStorage(); + // migrateStorage is declared as final because the replaceStorage method may mutate mapMigrateStorage, but + // migrateStorage's value should always only be associated with the initial state of mapMigrateStorage. + final boolean migrateStorage = MapUtils.isNotEmpty(mapMigrateStorage); + + if (migrateStorage) { + xmlDesc = replaceStorage(xmlDesc, mapMigrateStorage); + } + + dconn = libvirtUtilitiesHelper.retrieveQemuConnection(destinationUri); //run migration in thread so we can monitor it - s_logger.info("Live migration of instance " + vmName + " initiated"); + s_logger.info("Live migration of instance " + vmName + " initiated to destination host: " + dconn.getURI()); final ExecutorService executor = Executors.newFixedThreadPool(1); - final Callable worker = new MigrateKVMAsync(libvirtComputingResource, dm, dconn, xmlDesc, vmName, command.getDestinationIp()); + final Callable worker = new MigrateKVMAsync(libvirtComputingResource, dm, dconn, xmlDesc, migrateStorage, + command.isAutoConvergence(), vmName, command.getDestinationIp()); final Future migrateThread = executor.submit(worker); executor.shutdown(); long sleeptime = 0; @@ -130,13 +180,21 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0. // pause vm if we meet the vm.migrate.pauseafter threshold and not already paused final int migratePauseAfter = libvirtComputingResource.getMigratePauseAfter(); - if (migratePauseAfter > 0 && sleeptime > migratePauseAfter && dm.getInfo().state == DomainState.VIR_DOMAIN_RUNNING ) { - s_logger.info("Pausing VM " + vmName + " due to property vm.migrate.pauseafter setting to " + migratePauseAfter+ "ms to complete migration"); + if (migratePauseAfter > 0 && sleeptime > migratePauseAfter) { + DomainState state = null; try { - dm.suspend(); + state = dm.getInfo().state; } catch (final LibvirtException e) { - // pause could be racy if it attempts to pause right when vm is finished, simply warn - s_logger.info("Failed to pause vm " + vmName + " : " + e.getMessage()); + s_logger.info("Couldn't get VM domain state after " + sleeptime + "ms: " + e.getMessage()); + } + if (state != null && state == DomainState.VIR_DOMAIN_RUNNING) { + try { + s_logger.info("Pausing VM " + vmName + " due to property vm.migrate.pauseafter setting to " + migratePauseAfter + "ms to complete migration"); + dm.suspend(); + } catch (final LibvirtException e) { + // pause could be racy if it attempts to pause right when vm is finished, simply warn + s_logger.info("Failed to pause vm " + vmName + " : " + e.getMessage()); + } } } } @@ -149,9 +207,13 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0. libvirtComputingResource.cleanupDisk(disk); } } + } catch (final LibvirtException e) { s_logger.debug("Can't migrate domain: " + e.getMessage()); result = e.getMessage(); + if (result.startsWith("unable to connect to server") && result.endsWith("refused")) { + result = String.format("Migration was refused connection to destination: %s. Please check libvirt configuration compatibility and firewall rules on the source and destination hosts.", destinationUri); + } } catch (final InterruptedException e) { s_logger.debug("Interrupted while migrating domain: " + e.getMessage()); result = e.getMessage(); @@ -161,8 +223,29 @@ Use VIR_DOMAIN_XML_SECURE (value = 1) prior to v1.0.0. } catch (final TimeoutException e) { s_logger.debug("Timed out while migrating domain: " + e.getMessage()); result = e.getMessage(); + } catch (final IOException e) { + s_logger.debug("IOException: " + e.getMessage()); + result = e.getMessage(); + } catch (final ParserConfigurationException e) { + s_logger.debug("ParserConfigurationException: " + e.getMessage()); + result = e.getMessage(); + } catch (final SAXException e) { + s_logger.debug("SAXException: " + e.getMessage()); + result = e.getMessage(); + } catch (final TransformerConfigurationException e) { + s_logger.debug("TransformerConfigurationException: " + e.getMessage()); + result = e.getMessage(); + } catch (final TransformerException e) { + s_logger.debug("TransformerException: " + e.getMessage()); + result = e.getMessage(); } finally { try { + if (dm != null && result != null) { + // restore vm snapshots in case of failed migration + if (vmsnapshots != null) { + libvirtComputingResource.restoreVMSnapshotMetadata(dm, vmName, vmsnapshots); + } + } if (dm != null) { if (dm.isPersistent() == 1) { dm.undefine(); @@ -218,4 +301,152 @@ String replaceIpForVNCInDescFile(String xmlDesc, final String target) { } return xmlDesc; } + + // Pass in a list of the disks to update in the XML (xmlDesc). Each disk passed in needs to have a serial number. If any disk's serial number in the + // list does not match a disk in the XML, an exception should be thrown. + // In addition to the serial number, each disk in the list needs the following info: + // * The value of the 'type' of the disk (ex. file, block) + // * The value of the 'type' of the driver of the disk (ex. qcow2, raw) + // * The source of the disk needs an attribute that is either 'file' or 'dev' as well as its corresponding value. + private String replaceStorage(String xmlDesc, Map migrateStorage) + throws IOException, ParserConfigurationException, SAXException, TransformerException { + InputStream in = IOUtils.toInputStream(xmlDesc); + + DocumentBuilderFactory docFactory = DocumentBuilderFactory.newInstance(); + DocumentBuilder docBuilder = docFactory.newDocumentBuilder(); + Document doc = docBuilder.parse(in); + + // Get the root element + Node domainNode = doc.getFirstChild(); + + NodeList domainChildNodes = domainNode.getChildNodes(); + + for (int i = 0; i < domainChildNodes.getLength(); i++) { + Node domainChildNode = domainChildNodes.item(i); + + if ("devices".equals(domainChildNode.getNodeName())) { + NodeList devicesChildNodes = domainChildNode.getChildNodes(); + + for (int x = 0; x < devicesChildNodes.getLength(); x++) { + Node deviceChildNode = devicesChildNodes.item(x); + + if ("disk".equals(deviceChildNode.getNodeName())) { + Node diskNode = deviceChildNode; + + String sourceText = getSourceText(diskNode); + + String path = getPathFromSourceText(migrateStorage.keySet(), sourceText); + + if (path != null) { + MigrateCommand.MigrateDiskInfo migrateDiskInfo = migrateStorage.remove(path); + + NamedNodeMap diskNodeAttributes = diskNode.getAttributes(); + Node diskNodeAttribute = diskNodeAttributes.getNamedItem("type"); + + diskNodeAttribute.setTextContent(migrateDiskInfo.getDiskType().toString()); + + NodeList diskChildNodes = diskNode.getChildNodes(); + + for (int z = 0; z < diskChildNodes.getLength(); z++) { + Node diskChildNode = diskChildNodes.item(z); + + if ("driver".equals(diskChildNode.getNodeName())) { + Node driverNode = diskChildNode; + + NamedNodeMap driverNodeAttributes = driverNode.getAttributes(); + Node driverNodeAttribute = driverNodeAttributes.getNamedItem("type"); + + driverNodeAttribute.setTextContent(migrateDiskInfo.getDriverType().toString()); + } else if ("source".equals(diskChildNode.getNodeName())) { + diskNode.removeChild(diskChildNode); + + Element newChildSourceNode = doc.createElement("source"); + + newChildSourceNode.setAttribute(migrateDiskInfo.getSource().toString(), migrateDiskInfo.getSourceText()); + + diskNode.appendChild(newChildSourceNode); + } else if ("auth".equals(diskChildNode.getNodeName())) { + diskNode.removeChild(diskChildNode); + } else if ("iotune".equals(diskChildNode.getNodeName())) { + diskNode.removeChild(diskChildNode); + } + } + } + } + } + } + } + + if (!migrateStorage.isEmpty()) { + throw new CloudRuntimeException("Disk info was passed into LibvirtMigrateCommandWrapper.replaceStorage that was not used."); + } + + return getXml(doc); + } + + private String getPathFromSourceText(Set paths, String sourceText) { + if (paths != null && !StringUtils.isBlank(sourceText)) { + for (String path : paths) { + if (sourceText.contains(path)) { + return path; + } + } + } + + return null; + } + + private String getSourceText(Node diskNode) { + NodeList diskChildNodes = diskNode.getChildNodes(); + + for (int i = 0; i < diskChildNodes.getLength(); i++) { + Node diskChildNode = diskChildNodes.item(i); + + if ("source".equals(diskChildNode.getNodeName())) { + NamedNodeMap diskNodeAttributes = diskChildNode.getAttributes(); + + Node diskNodeAttribute = diskNodeAttributes.getNamedItem("file"); + + if (diskNodeAttribute != null) { + return diskNodeAttribute.getTextContent(); + } + + diskNodeAttribute = diskNodeAttributes.getNamedItem("dev"); + + if (diskNodeAttribute != null) { + return diskNodeAttribute.getTextContent(); + } + + diskNodeAttribute = diskNodeAttributes.getNamedItem("protocol"); + + if (diskNodeAttribute != null) { + String textContent = diskNodeAttribute.getTextContent(); + + if ("rbd".equalsIgnoreCase(textContent)) { + diskNodeAttribute = diskNodeAttributes.getNamedItem("name"); + + if (diskNodeAttribute != null) { + return diskNodeAttribute.getTextContent(); + } + } + } + } + } + + return null; + } + + private String getXml(Document doc) throws TransformerException { + TransformerFactory transformerFactory = TransformerFactory.newInstance(); + Transformer transformer = transformerFactory.newTransformer(); + + DOMSource source = new DOMSource(doc); + + ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); + StreamResult result = new StreamResult(byteArrayOutputStream); + + transformer.transform(source, result); + + return byteArrayOutputStream.toString(); + } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java new file mode 100644 index 000000000000..311eb670e99f --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateVolumeCommandWrapper.java @@ -0,0 +1,95 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.storage.MigrateVolumeAnswer; +import com.cloud.agent.api.storage.MigrateVolumeCommand; +import com.cloud.agent.api.to.DiskTO; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; +import com.cloud.hypervisor.kvm.storage.KVMStoragePool; +import com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; + +import java.util.Map; +import java.util.UUID; + +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.log4j.Logger; + +@ResourceWrapper(handles = MigrateVolumeCommand.class) +public final class LibvirtMigrateVolumeCommandWrapper extends CommandWrapper { + private static final Logger LOGGER = Logger.getLogger(LibvirtMigrateVolumeCommandWrapper.class); + + @Override + public Answer execute(final MigrateVolumeCommand command, final LibvirtComputingResource libvirtComputingResource) { + KVMStoragePoolManager storagePoolManager = libvirtComputingResource.getStoragePoolMgr(); + + VolumeObjectTO srcVolumeObjectTO = (VolumeObjectTO)command.getSrcData(); + PrimaryDataStoreTO srcPrimaryDataStore = (PrimaryDataStoreTO)srcVolumeObjectTO.getDataStore(); + + Map srcDetails = command.getSrcDetails(); + + String srcPath = srcDetails != null ? srcDetails.get(DiskTO.IQN) : srcVolumeObjectTO.getPath(); + + VolumeObjectTO destVolumeObjectTO = (VolumeObjectTO)command.getDestData(); + PrimaryDataStoreTO destPrimaryDataStore = (PrimaryDataStoreTO)destVolumeObjectTO.getDataStore(); + + Map destDetails = command.getDestDetails(); + + String destPath = destDetails != null && destDetails.get(DiskTO.IQN) != null ? destDetails.get(DiskTO.IQN) : + (destVolumeObjectTO.getPath() != null ? destVolumeObjectTO.getPath() : UUID.randomUUID().toString()); + + try { + storagePoolManager.connectPhysicalDisk(srcPrimaryDataStore.getPoolType(), srcPrimaryDataStore.getUuid(), srcPath, srcDetails); + + KVMPhysicalDisk srcPhysicalDisk = storagePoolManager.getPhysicalDisk(srcPrimaryDataStore.getPoolType(), srcPrimaryDataStore.getUuid(), srcPath); + + KVMStoragePool destPrimaryStorage = storagePoolManager.getStoragePool(destPrimaryDataStore.getPoolType(), destPrimaryDataStore.getUuid()); + + storagePoolManager.connectPhysicalDisk(destPrimaryDataStore.getPoolType(), destPrimaryDataStore.getUuid(), destPath, destDetails); + + storagePoolManager.copyPhysicalDisk(srcPhysicalDisk, destPath, destPrimaryStorage, command.getWaitInMillSeconds()); + } + catch (Exception ex) { + return new MigrateVolumeAnswer(command, false, ex.getMessage(), null); + } + finally { + try { + storagePoolManager.disconnectPhysicalDisk(destPrimaryDataStore.getPoolType(), destPrimaryDataStore.getUuid(), destPath); + } + catch (Exception e) { + LOGGER.warn("Unable to disconnect from the destination device.", e); + } + + try { + storagePoolManager.disconnectPhysicalDisk(srcPrimaryDataStore.getPoolType(), srcPrimaryDataStore.getUuid(), srcPath); + } + catch (Exception e) { + LOGGER.warn("Unable to disconnect from the source device.", e); + } + } + + return new MigrateVolumeAnswer(command, true, null, destPath); + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyTargetsCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyTargetsCommandWrapper.java new file mode 100644 index 000000000000..724caad3f227 --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtModifyTargetsCommandWrapper.java @@ -0,0 +1,80 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import java.util.ArrayList; +import java.util.List; +import java.util.Map; + +import org.apache.log4j.Logger; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.ModifyTargetsAnswer; +import com.cloud.agent.api.ModifyTargetsCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.hypervisor.kvm.storage.KVMPhysicalDisk; +import com.cloud.hypervisor.kvm.storage.KVMStoragePoolManager; +import com.cloud.storage.Storage.StoragePoolType; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.exception.CloudRuntimeException; + +@ResourceWrapper(handles = ModifyTargetsCommand.class) +public final class LibvirtModifyTargetsCommandWrapper extends CommandWrapper { + private static final Logger s_logger = Logger.getLogger(LibvirtModifyTargetsCommandWrapper.class); + + @Override + public Answer execute(final ModifyTargetsCommand command, final LibvirtComputingResource libvirtComputingResource) { + KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + + List> targets = command.getTargets(); + + // When attempting to connect to one or more targets, place the successfully connected path into this List. + List connectedPaths = new ArrayList<>(targets.size()); + + for (Map target : targets) { + StoragePoolType storagePoolType = StoragePoolType.valueOf(target.get(ModifyTargetsCommand.STORAGE_TYPE)); + String storageUuid = target.get(ModifyTargetsCommand.STORAGE_UUID); + String path = target.get(ModifyTargetsCommand.IQN); + + if (command.getAdd()) { + if (storagePoolMgr.connectPhysicalDisk(storagePoolType, storageUuid, path, target)) { + KVMPhysicalDisk kvmPhysicalDisk = storagePoolMgr.getPhysicalDisk(storagePoolType, storageUuid, path); + + connectedPaths.add(kvmPhysicalDisk.getPath()); + } + else { + throw new CloudRuntimeException("Unable to connect to the following target: " + path); + } + } + else { + if (!storagePoolMgr.disconnectPhysicalDisk(storagePoolType, storageUuid, path)) { + throw new CloudRuntimeException("Unable to disconnect from the following target: " + path); + } + } + } + + ModifyTargetsAnswer modifyTargetsAnswer = new ModifyTargetsAnswer(); + + modifyTargetsAnswer.setConnectedPaths(connectedPaths); + + return modifyTargetsAnswer; + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPlugNicCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPlugNicCommandWrapper.java index 018d6a784c34..2ee9b953d84e 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPlugNicCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPlugNicCommandWrapper.java @@ -19,13 +19,6 @@ package com.cloud.hypervisor.kvm.resource.wrapper; -import java.util.List; - -import org.apache.log4j.Logger; -import org.libvirt.Connect; -import org.libvirt.Domain; -import org.libvirt.LibvirtException; - import com.cloud.agent.api.Answer; import com.cloud.agent.api.PlugNicAnswer; import com.cloud.agent.api.PlugNicCommand; @@ -36,6 +29,12 @@ import com.cloud.hypervisor.kvm.resource.VifDriver; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.LibvirtException; + +import java.util.List; @ResourceWrapper(handles = PlugNicCommand.class) public final class LibvirtPlugNicCommandWrapper extends CommandWrapper { @@ -61,7 +60,7 @@ public Answer execute(final PlugNicCommand command, final LibvirtComputingResour } nicnum++; } - final VifDriver vifDriver = libvirtComputingResource.getVifDriver(nic.getType()); + final VifDriver vifDriver = libvirtComputingResource.getVifDriver(nic.getType(), nic.getName()); final InterfaceDef interfaceDef = vifDriver.plug(nic, "Other PV", ""); vm.attachDevice(interfaceDef.toString()); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPostCertificateRenewalCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPostCertificateRenewalCommandWrapper.java new file mode 100644 index 000000000000..df89d2470dda --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPostCertificateRenewalCommandWrapper.java @@ -0,0 +1,52 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import org.apache.cloudstack.ca.PostCertificateRenewalCommand; +import org.apache.cloudstack.ca.SetupCertificateAnswer; +import org.apache.log4j.Logger; + +import com.cloud.agent.api.Answer; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.utils.script.Script; + +@ResourceWrapper(handles = PostCertificateRenewalCommand.class) +public final class LibvirtPostCertificateRenewalCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtPostCertificateRenewalCommandWrapper.class); + + @Override + public Answer execute(final PostCertificateRenewalCommand command, final LibvirtComputingResource serverResource) { + s_logger.info("Restarting libvirt after certificate provisioning/renewal"); + if (command != null) { + final int timeout = 30000; + Script script = new Script(true, "service", timeout, s_logger); + if ("Ubuntu".equals(serverResource.getHostDistro()) || "Debian".equals(serverResource.getHostDistro())) { + script.add("libvirt-bin"); + } else { + script.add("libvirtd"); + } + script.add("restart"); + script.execute(); + return new SetupCertificateAnswer(true); + } + return new SetupCertificateAnswer(false); + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java index 2dfca5d6fc41..ac9f884042a7 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtPrepareForMigrationCommandWrapper.java @@ -19,12 +19,6 @@ package com.cloud.hypervisor.kvm.resource.wrapper; -import java.net.URISyntaxException; - -import org.apache.log4j.Logger; -import org.libvirt.Connect; -import org.libvirt.LibvirtException; - import com.cloud.agent.api.Answer; import com.cloud.agent.api.PrepareForMigrationAnswer; import com.cloud.agent.api.PrepareForMigrationCommand; @@ -37,6 +31,11 @@ import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; import com.cloud.storage.Volume; +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.LibvirtException; + +import java.net.URISyntaxException; @ResourceWrapper(handles = PrepareForMigrationCommand.class) public final class LibvirtPrepareForMigrationCommandWrapper extends CommandWrapper { @@ -46,6 +45,11 @@ public final class LibvirtPrepareForMigrationCommandWrapper extends CommandWrapp @Override public Answer execute(final PrepareForMigrationCommand command, final LibvirtComputingResource libvirtComputingResource) { final VirtualMachineTO vm = command.getVirtualMachine(); + + if (command.isRollback()) { + return handleRollback(command, libvirtComputingResource); + } + if (s_logger.isDebugEnabled()) { s_logger.debug("Preparing host for migrating " + vm); } @@ -60,7 +64,7 @@ public Answer execute(final PrepareForMigrationCommand command, final LibvirtCom final Connect conn = libvirtUtilitiesHelper.getConnectionByVmName(vm.getName()); for (final NicTO nic : nics) { - libvirtComputingResource.getVifDriver(nic.getType()).plug(nic, null, ""); + libvirtComputingResource.getVifDriver(nic.getType(), nic.getName()).plug(nic, null, ""); } /* setup disks, e.g for iso */ @@ -90,4 +94,15 @@ public Answer execute(final PrepareForMigrationCommand command, final LibvirtCom } } } -} \ No newline at end of file + + private Answer handleRollback(PrepareForMigrationCommand command, LibvirtComputingResource libvirtComputingResource) { + KVMStoragePoolManager storagePoolMgr = libvirtComputingResource.getStoragePoolMgr(); + VirtualMachineTO vmTO = command.getVirtualMachine(); + + if (!storagePoolMgr.disconnectPhysicalDisksViaVmSpec(vmTO)) { + return new PrepareForMigrationAnswer(command, "failed to disconnect physical disks from host"); + } + + return new PrepareForMigrationAnswer(command); + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java new file mode 100644 index 000000000000..c91e719aabea --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapper.java @@ -0,0 +1,125 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import java.util.List; + +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.ReplugNicAnswer; +import com.cloud.agent.api.ReplugNicCommand; +import com.cloud.agent.api.to.NicTO; +import com.cloud.exception.InternalErrorException; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; +import com.cloud.hypervisor.kvm.resource.VifDriver; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; + +@ResourceWrapper(handles = ReplugNicCommand.class) +public final class LibvirtReplugNicCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtReplugNicCommandWrapper.class); + public enum DomainAffect { + CURRENT(0), LIVE(1), CONFIG(2), BOTH(3); + + private int value; + DomainAffect(int value) { + this.value = value; + } + + public int getValue() { + return value; + } + } + + @Override + public Answer execute(final ReplugNicCommand command, final LibvirtComputingResource libvirtComputingResource) { + final NicTO nic = command.getNic(); + final String vmName = command.getVmName(); + Domain vm = null; + try { + final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); + final Connect conn = libvirtUtilitiesHelper.getConnectionByVmName(vmName); + vm = libvirtComputingResource.getDomain(conn, vmName); + + InterfaceDef oldPluggedNic = findPluggedNic(libvirtComputingResource, nic, vmName, conn); + + final VifDriver newVifDriver = libvirtComputingResource.getVifDriver(nic.getType(), nic.getName()); + final InterfaceDef interfaceDef = newVifDriver.plug(nic, "Other PV", oldPluggedNic.getModel().toString()); + + interfaceDef.setSlot(oldPluggedNic.getSlot()); + interfaceDef.setDevName(oldPluggedNic.getDevName()); + interfaceDef.setLinkStateUp(false); + + oldPluggedNic.setSlot(null); + + int i = 0; + do { + i++; + s_logger.debug("ReplugNic: Detaching interface" + oldPluggedNic + " (Attempt: " + i + ")"); + vm.detachDevice(oldPluggedNic.toString()); + } while (findPluggedNic(libvirtComputingResource, nic, vmName, conn) != null && i <= 10); + + s_logger.debug("ReplugNic: Attaching interface" + interfaceDef); + vm.attachDevice(interfaceDef.toString()); + + interfaceDef.setLinkStateUp(true); + s_logger.debug("ReplugNic: Updating interface" + interfaceDef); + vm.updateDeviceFlags(interfaceDef.toString(), DomainAffect.LIVE.getValue()); + + // We don't know which "traffic type" is associated with + // each interface at this point, so inform all vif drivers + for (final VifDriver vifDriver : libvirtComputingResource.getAllVifDrivers()) { + vifDriver.unplug(oldPluggedNic); + } + + return new ReplugNicAnswer(command, true, "success"); + } catch (final LibvirtException | InternalErrorException e) { + final String msg = " Plug Nic failed due to " + e.toString(); + s_logger.warn(msg, e); + return new ReplugNicAnswer(command, false, msg); + } finally { + if (vm != null) { + try { + vm.free(); + } catch (final LibvirtException l) { + s_logger.trace("Ignoring libvirt error.", l); + } + } + } + } + + private InterfaceDef findPluggedNic(LibvirtComputingResource libvirtComputingResource, NicTO nic, String vmName, Connect conn) { + InterfaceDef oldPluggedNic = null; + + final List pluggedNics = libvirtComputingResource.getInterfaces(conn, vmName); + + for (final InterfaceDef pluggedNic : pluggedNics) { + if (pluggedNic.getMacAddress().equalsIgnoreCase(nic.getMac())) { + oldPluggedNic = pluggedNic; + } + } + + return oldPluggedNic; + } +} \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreVMSnapshotCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreVMSnapshotCommandWrapper.java new file mode 100644 index 000000000000..ce8c2095660f --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRestoreVMSnapshotCommandWrapper.java @@ -0,0 +1,96 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import java.util.List; +import java.util.Map; + +import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.RestoreVMSnapshotAnswer; +import com.cloud.agent.api.RestoreVMSnapshotCommand; +import com.cloud.agent.api.VMSnapshotTO; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.vm.VirtualMachine; + +@ResourceWrapper(handles = RestoreVMSnapshotCommand.class) +public final class LibvirtRestoreVMSnapshotCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtRestoreVMSnapshotCommandWrapper.class); + + @Override + public Answer execute(final RestoreVMSnapshotCommand cmd, final LibvirtComputingResource libvirtComputingResource) { + String vmName = cmd.getVmName(); + List listVolumeTo = cmd.getVolumeTOs(); + VirtualMachine.PowerState vmState = VirtualMachine.PowerState.PowerOn; + + Domain dm = null; + try { + final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); + Connect conn = libvirtUtilitiesHelper.getConnection(); + dm = libvirtComputingResource.getDomain(conn, vmName); + + if (dm == null) { + return new RestoreVMSnapshotAnswer(cmd, false, + "Restore VM Snapshot Failed due to can not find vm: " + vmName); + } + String xmlDesc = dm.getXMLDesc(0); + + List snapshots = cmd.getSnapshots(); + Map snapshotAndParents = cmd.getSnapshotAndParents(); + for (VMSnapshotTO snapshot: snapshots) { + VMSnapshotTO parent = snapshotAndParents.get(snapshot.getId()); + String vmSnapshotXML = libvirtUtilitiesHelper.generateVMSnapshotXML(snapshot, parent, xmlDesc); + s_logger.debug("Restoring vm snapshot " + snapshot.getSnapshotName() + " on " + vmName + " with XML:\n " + vmSnapshotXML); + try { + int flags = 1; // VIR_DOMAIN_SNAPSHOT_CREATE_REDEFINE = 1 + if (snapshot.getCurrent()) { + flags += 2; // VIR_DOMAIN_SNAPSHOT_CREATE_CURRENT = 2 + } + dm.snapshotCreateXML(vmSnapshotXML, flags); + } catch (LibvirtException e) { + s_logger.debug("Failed to restore vm snapshot " + snapshot.getSnapshotName() + " on " + vmName); + return new RestoreVMSnapshotAnswer(cmd, false, e.toString()); + } + } + + return new RestoreVMSnapshotAnswer(cmd, listVolumeTo, vmState); + } catch (LibvirtException e) { + String msg = " Restore snapshot failed due to " + e.toString(); + s_logger.warn(msg, e); + return new RestoreVMSnapshotAnswer(cmd, false, msg); + } finally { + if (dm != null) { + try { + dm.free(); + } catch (LibvirtException l) { + s_logger.trace("Ignoring libvirt error.", l); + }; + } + } + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRevertToVMSnapshotCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRevertToVMSnapshotCommandWrapper.java new file mode 100644 index 000000000000..086d6ef7a89f --- /dev/null +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtRevertToVMSnapshotCommandWrapper.java @@ -0,0 +1,95 @@ +// +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +// + +package com.cloud.hypervisor.kvm.resource.wrapper; + +import java.util.List; + +import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.log4j.Logger; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.DomainSnapshot; +import org.libvirt.LibvirtException; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.RevertToVMSnapshotAnswer; +import com.cloud.agent.api.RevertToVMSnapshotCommand; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.resource.CommandWrapper; +import com.cloud.resource.ResourceWrapper; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.snapshot.VMSnapshot; + +@ResourceWrapper(handles = RevertToVMSnapshotCommand.class) +public final class LibvirtRevertToVMSnapshotCommandWrapper extends CommandWrapper { + + private static final Logger s_logger = Logger.getLogger(LibvirtRevertToVMSnapshotCommandWrapper.class); + + @Override + public Answer execute(final RevertToVMSnapshotCommand cmd, final LibvirtComputingResource libvirtComputingResource) { + String vmName = cmd.getVmName(); + List listVolumeTo = cmd.getVolumeTOs(); + VMSnapshot.Type vmSnapshotType = cmd.getTarget().getType(); + Boolean snapshotMemory = vmSnapshotType == VMSnapshot.Type.DiskAndMemory; + VirtualMachine.PowerState vmState = null; + + Domain dm = null; + try { + final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); + Connect conn = libvirtUtilitiesHelper.getConnection(); + dm = libvirtComputingResource.getDomain(conn, vmName); + + if (dm == null) { + return new RevertToVMSnapshotAnswer(cmd, false, + "Revert to VM Snapshot Failed due to can not find vm: " + vmName); + } + + DomainSnapshot snapshot = dm.snapshotLookupByName(cmd.getTarget().getSnapshotName()); + if (snapshot == null) + return new RevertToVMSnapshotAnswer(cmd, false, "Cannot find vmSnapshot with name: " + cmd.getTarget().getSnapshotName()); + + dm.revertToSnapshot(snapshot); + snapshot.free(); + + if (!snapshotMemory) { + dm.destroy(); + if (dm.isPersistent() == 1) + dm.undefine(); + vmState = VirtualMachine.PowerState.PowerOff; + } else { + vmState = VirtualMachine.PowerState.PowerOn; + } + + return new RevertToVMSnapshotAnswer(cmd, listVolumeTo, vmState); + } catch (LibvirtException e) { + String msg = " Revert to VM snapshot failed due to " + e.toString(); + s_logger.warn(msg, e); + return new RevertToVMSnapshotAnswer(cmd, false, msg); + } finally { + if (dm != null) { + try { + dm.free(); + } catch (LibvirtException l) { + s_logger.trace("Ignoring libvirt error.", l); + }; + } + } + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSecurityGroupRulesCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSecurityGroupRulesCommandWrapper.java index ef9fd896dd1b..ded8ce31b9c7 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSecurityGroupRulesCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtSecurityGroupRulesCommandWrapper.java @@ -54,7 +54,7 @@ public Answer execute(final SecurityGroupRulesCmd command, final LibvirtComputin return new SecurityGroupRuleAnswer(command, false, e.toString()); } - final boolean result = libvirtComputingResource.addNetworkRules(command.getVmName(), Long.toString(command.getVmId()), command.getGuestIp(), command.getSignature(), + final boolean result = libvirtComputingResource.addNetworkRules(command.getVmName(), Long.toString(command.getVmId()), command.getGuestIp(), command.getGuestIp6(), command.getSignature(), Long.toString(command.getSeqNum()), command.getGuestMac(), command.stringifyRules(), vif, brname, command.getSecIpsString()); if (!result) { diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java index d9606194b1d7..5a75f078f9ee 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStartCommandWrapper.java @@ -24,6 +24,7 @@ import org.apache.log4j.Logger; import org.libvirt.Connect; +import org.libvirt.Domain; import org.libvirt.DomainInfo.DomainState; import org.libvirt.LibvirtException; @@ -60,6 +61,17 @@ public Answer execute(final StartCommand command, final LibvirtComputingResource final LibvirtUtilitiesHelper libvirtUtilitiesHelper = libvirtComputingResource.getLibvirtUtilitiesHelper(); Connect conn = null; try { + + vm = libvirtComputingResource.createVMFromSpec(vmSpec); + conn = libvirtUtilitiesHelper.getConnectionByType(vm.getHvsType()); + + Long remainingMem = getFreeMemory(conn, libvirtComputingResource); + if (remainingMem == null){ + return new StartAnswer(command, "failed to get free memory"); + } else if (remainingMem < vmSpec.getMinRam()) { + return new StartAnswer(command, "Not enough memory on the host, remaining: " + remainingMem + ", asking: " + vmSpec.getMinRam()); + } + final NicTO[] nics = vmSpec.getNics(); for (final NicTO nic : nics) { @@ -68,8 +80,6 @@ public Answer execute(final StartCommand command, final LibvirtComputingResource } } - vm = libvirtComputingResource.createVMFromSpec(vmSpec); - conn = libvirtUtilitiesHelper.getConnectionByType(vm.getHvsType()); libvirtComputingResource.createVbd(conn, vmSpec, vmName, vm); if (!storagePoolMgr.connectPhysicalDisksViaVmSpec(vmSpec)) { @@ -92,11 +102,11 @@ public Answer execute(final StartCommand command, final LibvirtComputingResource final StringBuilder sb = new StringBuilder(); if (nicSecIps != null) { for (final String ip : nicSecIps) { - sb.append(ip).append(":"); + sb.append(ip).append(";"); } secIpsStr = sb.toString(); } else { - secIpsStr = "0:"; + secIpsStr = "0;"; } libvirtComputingResource.defaultNetworkRules(conn, vmName, nic, vmSpec.getId(), secIpsStr); } @@ -150,4 +160,22 @@ public Answer execute(final StartCommand command, final LibvirtComputingResource } } } -} \ No newline at end of file + + private Long getFreeMemory(final Connect conn, final LibvirtComputingResource libvirtComputingResource){ + try { + long allocatedMem = 0; + int[] ids = conn.listDomains(); + for(int id :ids) { + Domain dm = conn.domainLookupByID(id); + allocatedMem += dm.getMaxMemory() * 1024L; + s_logger.debug("vm: " + dm.getName() + " mem: " + dm.getMaxMemory() * 1024L); + } + Long remainingMem = libvirtComputingResource.getTotalMemory() - allocatedMem; + s_logger.debug("remaining mem" + remainingMem); + return remainingMem; + } catch (Exception e) { + s_logger.debug("failed to get free memory", e); + return null; + } + } +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java index feec1c339d91..7a0375f25128 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtStopCommandWrapper.java @@ -19,13 +19,16 @@ package com.cloud.hypervisor.kvm.resource.wrapper; +import java.io.File; import java.util.List; +import java.util.Map; +import com.cloud.utils.Pair; +import com.cloud.utils.ssh.SshHelper; import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainInfo.DomainState; -import org.libvirt.LibvirtException; import com.cloud.agent.api.Answer; import com.cloud.agent.api.StopAnswer; @@ -36,11 +39,14 @@ import com.cloud.hypervisor.kvm.resource.VifDriver; import com.cloud.resource.CommandWrapper; import com.cloud.resource.ResourceWrapper; +import org.libvirt.LibvirtException; @ResourceWrapper(handles = StopCommand.class) public final class LibvirtStopCommandWrapper extends CommandWrapper { private static final Logger s_logger = Logger.getLogger(LibvirtStopCommandWrapper.class); + private static final String CMDLINE_PATH = "/var/cache/cloud/cmdline"; + private static final String CMDLINE_BACKUP_PATH = "/var/cache/cloud/cmdline.backup"; @Override public Answer execute(final StopCommand command, final LibvirtComputingResource libvirtComputingResource) { @@ -59,8 +65,21 @@ public Answer execute(final StopCommand command, final LibvirtComputingResource s_logger.debug("Failed to get vm status in case of checkboforecleanup is true", e); } } - + File pemFile = new File(LibvirtComputingResource.SSHPRVKEYPATH); try { + if(vmName.startsWith("s-") || vmName.startsWith("v-")){ + //move the command line file to backup. + s_logger.debug("backing up the cmdline"); + try{ + Pair ret = SshHelper.sshExecute(command.getControlIp(), 3922, "root", pemFile, null,"cp -f "+CMDLINE_PATH+" "+CMDLINE_BACKUP_PATH); + if(!ret.first()){ + s_logger.debug("Failed to backup cmdline file due to "+ret.second()); + } + } catch (Exception e){ + s_logger.debug("Failed to backup cmdline file due to "+e.getMessage()); + } + } + final Connect conn = libvirtUtilitiesHelper.getConnectionByVmName(vmName); final List disks = libvirtComputingResource.getDisks(conn, vmName); @@ -70,9 +89,23 @@ public Answer execute(final StopCommand command, final LibvirtComputingResource final String result = libvirtComputingResource.stopVM(conn, vmName, command.isForceStop()); if (result == null) { - for (final DiskDef disk : disks) { - libvirtComputingResource.cleanupDisk(disk); + if (disks != null && disks.size() > 0) { + for (final DiskDef disk : disks) { + libvirtComputingResource.cleanupDisk(disk); + } + } + else { + // When using iSCSI-based managed storage, if the user shuts a VM down from the guest OS (as opposed to doing so from CloudStack), + // info needs to be passed to the KVM agent to have it disconnect KVM from the applicable iSCSI volumes. + List> volumesToDisconnect = command.getVolumesToDisconnect(); + + if (volumesToDisconnect != null) { + for (Map volumeToDisconnect : volumesToDisconnect) { + libvirtComputingResource.cleanupDisk(volumeToDisconnect); + } + } } + for (final InterfaceDef iface : ifaces) { // We don't know which "traffic type" is associated with // each interface at this point, so inform all vif drivers @@ -84,7 +117,18 @@ public Answer execute(final StopCommand command, final LibvirtComputingResource return new StopAnswer(command, result, true); } catch (final LibvirtException e) { + s_logger.debug("unable to stop VM:"+vmName+" due to"+e.getMessage()); + try{ + if(vmName.startsWith("s-") || vmName.startsWith("v-")) + s_logger.debug("restoring cmdline file from backup"); + Pair ret = SshHelper.sshExecute(command.getControlIp(), 3922, "root", pemFile, null, "mv "+CMDLINE_BACKUP_PATH+" "+CMDLINE_PATH); + if(!ret.first()){ + s_logger.debug("unable to restore cmdline due to "+ret.second()); + } + }catch (final Exception ex){ + s_logger.debug("unable to restore cmdline due to:"+ex.getMessage()); + } return new StopAnswer(command, e.getMessage(), false); } } -} \ No newline at end of file +} diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUtilitiesHelper.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUtilitiesHelper.java index 7a93e1f31700..2881ed042200 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUtilitiesHelper.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtUtilitiesHelper.java @@ -25,6 +25,7 @@ import org.libvirt.Connect; import org.libvirt.LibvirtException; +import com.cloud.agent.api.VMSnapshotTO; import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; import com.cloud.hypervisor.kvm.resource.LibvirtConnection; import com.cloud.storage.StorageLayer; @@ -96,4 +97,16 @@ public Script buildScript(final String scriptPath) { final Script script = new Script(scriptPath, TIMEOUT); return script; } + + public String generateVMSnapshotXML(VMSnapshotTO snapshot, VMSnapshotTO parent, String domainXmlDesc) { + String parentName = (parent == null)? "": (" " + parent.getSnapshotName() + "\n"); + String vmSnapshotXML = "\n" + + " " + snapshot.getSnapshotName() + "\n" + + " running\n" + + parentName + + " " + (int) Math.rint(snapshot.getCreateTime()/1000) + "\n" + + domainXmlDesc + + ""; + return vmSnapshotXML; + } } \ No newline at end of file diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java index 46a48c95bb7f..a90c97fef8ea 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/IscsiAdmStorageAdaptor.java @@ -20,12 +20,15 @@ import java.util.List; import java.util.Map; -import com.cloud.storage.Storage; +import org.apache.cloudstack.utils.qemu.QemuImg; +import org.apache.cloudstack.utils.qemu.QemuImgException; +import org.apache.cloudstack.utils.qemu.QemuImgFile; import org.apache.log4j.Logger; import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; import com.cloud.agent.api.to.DiskTO; +import com.cloud.storage.Storage; import com.cloud.storage.Storage.ProvisioningType; import com.cloud.storage.Storage.StoragePoolType; import com.cloud.utils.StringUtils; @@ -37,7 +40,7 @@ public class IscsiAdmStorageAdaptor implements StorageAdaptor { private static final Logger s_logger = Logger.getLogger(IscsiAdmStorageAdaptor.class); - private static final Map MapStorageUuidToStoragePool = new HashMap(); + private static final Map MapStorageUuidToStoragePool = new HashMap<>(); @Override public KVMStoragePool createStoragePool(String uuid, String host, int port, String path, String userInfo, StoragePoolType storagePoolType) { @@ -115,7 +118,7 @@ public boolean connectPhysicalDisk(String volumeUuid, KVMStoragePool pool, Map 0 && numberOfTries > 0) { + numberOfTries--; + + try { + Thread.sleep(timeBetweenTries); + } catch (Exception ex) { + // don't do anything + } + } + } + private void executeChapCommand(String path, KVMStoragePool pool, String nParameter, String vParameter, String detail) throws Exception { Script iScsiAdmCmd = new Script(true, "iscsiadm", 0, s_logger); @@ -193,13 +213,13 @@ private void executeChapCommand(String path, KVMStoragePool pool, String nParame } // example by-path: /dev/disk/by-path/ip-192.168.233.10:3260-iscsi-iqn.2012-03.com.solidfire:storagepool2-lun-0 - private String getByPath(String host, String path) { - return "/dev/disk/by-path/ip-" + host + "-iscsi-" + getIqn(path) + "-lun-" + getLun(path); + private static String getByPath(String host, int port, String path) { + return "/dev/disk/by-path/ip-" + host + ":" + port + "-iscsi-" + getIqn(path) + "-lun-" + getLun(path); } @Override public KVMPhysicalDisk getPhysicalDisk(String volumeUuid, KVMStoragePool pool) { - String deviceByPath = getByPath(pool.getSourceHost() + ":" + pool.getSourcePort(), volumeUuid); + String deviceByPath = getByPath(pool.getSourceHost(), pool.getSourcePort(), volumeUuid); KVMPhysicalDisk physicalDisk = new KVMPhysicalDisk(deviceByPath, volumeUuid, pool); physicalDisk.setFormat(PhysicalDiskFormat.RAW); @@ -226,6 +246,9 @@ private long getDeviceSize(String deviceByPath) { return 0; } + else { + s_logger.info("Successfully retrieved the size of device " + deviceByPath); + } return Long.parseLong(parser.getLine()); } @@ -252,10 +275,10 @@ private static String getComponent(String path, int index) { return tmp[index].trim(); } - public boolean disconnectPhysicalDisk(String host, int port, String iqn, String lun) { + private boolean disconnectPhysicalDisk(String host, int port, String iqn, String lun) { // use iscsiadm to log out of the iSCSI target and un-discover it - // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10 --logout + // ex. sudo iscsiadm -m node -T iqn.2012-03.com.test:volume1 -p 192.168.233.10:3260 --logout Script iScsiAdmCmd = new Script(true, "iscsiadm", 0, s_logger); iScsiAdmCmd.add("-m", "node"); @@ -295,6 +318,8 @@ public boolean disconnectPhysicalDisk(String host, int port, String iqn, String System.out.println("Removed iSCSI target /" + iqn + "/" + lun); } + waitForDiskToBecomeUnavailable(host, port, iqn, lun); + return true; } @@ -303,6 +328,19 @@ public boolean disconnectPhysicalDisk(String volumeUuid, KVMStoragePool pool) { return disconnectPhysicalDisk(pool.getSourceHost(), pool.getSourcePort(), getIqn(volumeUuid), getLun(volumeUuid)); } + @Override + public boolean disconnectPhysicalDisk(Map volumeToDisconnect) { + String host = volumeToDisconnect.get(DiskTO.STORAGE_HOST); + String port = volumeToDisconnect.get(DiskTO.STORAGE_PORT); + String path = volumeToDisconnect.get(DiskTO.IQN); + + if (host != null && port != null && path != null) { + return disconnectPhysicalDisk(host, Integer.parseInt(port), getIqn(path), getLun(path)); + } + + return false; + } + @Override public boolean disconnectPhysicalDiskByPath(String localPath) { String search1 = "/dev/disk/by-path/ip-"; @@ -310,7 +348,7 @@ public boolean disconnectPhysicalDiskByPath(String localPath) { String search3 = "-iscsi-"; String search4 = "-lun-"; - if (localPath.indexOf(search3) == -1) { + if (!localPath.contains(search3)) { // this volume doesn't below to this adaptor, so just return true return true; } @@ -356,8 +394,37 @@ public KVMPhysicalDisk createTemplateFromDisk(KVMPhysicalDisk disk, String name, } @Override - public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk disk, String name, KVMStoragePool destPool, int timeout) { - throw new UnsupportedOperationException("Copying a disk is not supported in this configuration."); + public KVMPhysicalDisk copyPhysicalDisk(KVMPhysicalDisk srcDisk, String destVolumeUuid, KVMStoragePool destPool, int timeout) { + QemuImg q = new QemuImg(timeout); + + QemuImgFile srcFile; + + KVMStoragePool srcPool = srcDisk.getPool(); + + if (srcPool.getType() == StoragePoolType.RBD) { + srcFile = new QemuImgFile(KVMPhysicalDisk.RBDStringBuilder(srcPool.getSourceHost(), srcPool.getSourcePort(), + srcPool.getAuthUserName(), srcPool.getAuthSecret(), + srcDisk.getPath()),srcDisk.getFormat()); + } else { + srcFile = new QemuImgFile(srcDisk.getPath(), srcDisk.getFormat()); + } + + KVMPhysicalDisk destDisk = destPool.getPhysicalDisk(destVolumeUuid); + + QemuImgFile destFile = new QemuImgFile(destDisk.getPath(), destDisk.getFormat()); + + try { + q.convert(srcFile, destFile); + } catch (QemuImgException ex) { + String msg = "Failed to copy data from " + srcDisk.getPath() + " to " + + destDisk.getPath() + ". The error was the following: " + ex.getMessage(); + + s_logger.error(msg); + + throw new CloudRuntimeException(msg); + } + + return destPool.getPhysicalDisk(destVolumeUuid); } @Override diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java index c344e8ce4e5c..eaa143ac29d6 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMPhysicalDisk.java @@ -56,6 +56,11 @@ public KVMPhysicalDisk(String path, String name, KVMStoragePool pool) { this.pool = pool; } + @Override + public String toString() { + return "KVMPhysicalDisk [path=" + path + ", name=" + name + ", pool=" + pool + ", format=" + format + ", size=" + size + ", virtualSize=" + virtualSize + "]"; + } + public void setFormat(PhysicalDiskFormat format) { this.format = format; } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java index 28e5f03d5124..4d0523c9a063 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStoragePoolManager.java @@ -158,6 +158,18 @@ public boolean connectPhysicalDisksViaVmSpec(VirtualMachineTO vmSpec) { return result; } + public boolean disconnectPhysicalDisk(Map volumeToDisconnect) { + for (Map.Entry set : _storageMapper.entrySet()) { + StorageAdaptor adaptor = set.getValue(); + + if (adaptor.disconnectPhysicalDisk(volumeToDisconnect)) { + return true; + } + } + + return false; + } + public boolean disconnectPhysicalDiskByPath(String path) { for (Map.Entry set : _storageMapper.entrySet()) { StorageAdaptor adaptor = set.getValue(); @@ -253,7 +265,7 @@ public KVMStoragePool getStoragePoolByURI(String uri) { String uuid = null; String sourceHost = ""; StoragePoolType protocol = null; - if (storageUri.getScheme().equalsIgnoreCase("nfs")) { + if (storageUri.getScheme().equalsIgnoreCase("nfs") || storageUri.getScheme().equalsIgnoreCase("NetworkFilesystem")) { sourcePath = storageUri.getPath(); sourcePath = sourcePath.replace("//", "/"); sourceHost = storageUri.getHost(); diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java index 29655d10784c..36be2d39a2e1 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/KVMStorageProcessor.java @@ -36,6 +36,19 @@ import javax.naming.ConfigurationException; +import com.cloud.agent.direct.download.DirectTemplateDownloader; +import com.cloud.agent.direct.download.DirectTemplateDownloader.DirectTemplateInformation; +import com.cloud.agent.direct.download.HttpDirectTemplateDownloader; +import com.cloud.agent.direct.download.MetalinkDirectTemplateDownloader; +import com.cloud.agent.direct.download.NfsDirectTemplateDownloader; +import com.cloud.agent.direct.download.HttpsDirectTemplateDownloader; +import com.cloud.exception.InvalidParameterValueException; +import org.apache.cloudstack.agent.directdownload.HttpsDirectDownloadCommand; +import org.apache.cloudstack.agent.directdownload.DirectDownloadCommand; +import org.apache.cloudstack.agent.directdownload.HttpDirectDownloadCommand; +import org.apache.cloudstack.agent.directdownload.MetalinkDirectDownloadCommand; +import org.apache.cloudstack.agent.directdownload.NfsDirectDownloadCommand; +import org.apache.cloudstack.agent.directdownload.DirectDownloadAnswer; import org.apache.cloudstack.storage.command.AttachAnswer; import org.apache.cloudstack.storage.command.AttachCommand; import org.apache.cloudstack.storage.command.CopyCmdAnswer; @@ -88,6 +101,8 @@ import com.cloud.hypervisor.kvm.resource.LibvirtConnection; import com.cloud.hypervisor.kvm.resource.LibvirtDomainXMLParser; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DeviceType; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiscardType; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef.DiskProtocol; import com.cloud.storage.JavaStorageLayer; import com.cloud.storage.Storage.ImageFormat; @@ -223,8 +238,17 @@ public Answer copyTemplateToPrimaryStorage(final CopyCommand cmd) { } primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, volume.getUuid(), primaryPool, cmd.getWaitInMillSeconds()); } else if (destData instanceof TemplateObjectTO) { - final TemplateObjectTO destTempl = (TemplateObjectTO)destData; - primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, destTempl.getUuid(), primaryPool, cmd.getWaitInMillSeconds()); + TemplateObjectTO destTempl = (TemplateObjectTO)destData; + + Map details = primaryStore.getDetails(); + + String path = details != null ? details.get("managedStoreTarget") : null; + + storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details); + + primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, path != null ? path : destTempl.getUuid(), primaryPool, cmd.getWaitInMillSeconds()); + + storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path); } else { primaryVol = storagePoolMgr.copyPhysicalDisk(tmplVol, UUID.randomUUID().toString(), primaryPool, cmd.getWaitInMillSeconds()); } @@ -408,24 +432,41 @@ public Answer copyVolumeFromImageCacheToPrimary(final CopyCommand cmd) { } } + Map details = cmd.getOptions2(); + + String path = details != null ? details.get(DiskTO.IQN) : null; + + storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details); + final String volumeName = UUID.randomUUID().toString(); final int index = srcVolumePath.lastIndexOf(File.separator); final String volumeDir = srcVolumePath.substring(0, index); String srcVolumeName = srcVolumePath.substring(index + 1); + secondaryStoragePool = storagePoolMgr.getStoragePoolByURI(secondaryStorageUrl + File.separator + volumeDir); + if (!srcVolumeName.endsWith(".qcow2") && srcFormat == ImageFormat.QCOW2) { srcVolumeName = srcVolumeName + ".qcow2"; } + final KVMPhysicalDisk volume = secondaryStoragePool.getPhysicalDisk(srcVolumeName); + volume.setFormat(PhysicalDiskFormat.valueOf(srcFormat.toString())); - final KVMPhysicalDisk newDisk = storagePoolMgr.copyPhysicalDisk(volume, volumeName, primaryPool, cmd.getWaitInMillSeconds()); + + final KVMPhysicalDisk newDisk = storagePoolMgr.copyPhysicalDisk(volume, path != null ? path : volumeName, primaryPool, cmd.getWaitInMillSeconds()); + + storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path); + final VolumeObjectTO newVol = new VolumeObjectTO(); + newVol.setFormat(ImageFormat.valueOf(newDisk.getFormat().toString().toUpperCase())); - newVol.setPath(volumeName); + newVol.setPath(path != null ? path : volumeName); + return new CopyCmdAnswer(newVol); } catch (final CloudRuntimeException e) { - s_logger.debug("Failed to ccopyVolumeFromImageCacheToPrimary: ", e); + s_logger.debug("Failed to copyVolumeFromImageCacheToPrimary: ", e); + return new CopyCmdAnswer(e.toString()); } finally { if (secondaryStoragePool != null) { @@ -482,6 +523,13 @@ public Answer copyVolumeFromPrimaryToSecondary(final CopyCommand cmd) { @Override public Answer createTemplateFromVolume(final CopyCommand cmd) { + Map details = cmd.getOptions(); + + if (details != null && details.get(DiskTO.IQN) != null) { + // use the managed-storage approach + return createTemplateFromVolumeOrSnapshot(cmd); + } + final DataTO srcData = cmd.getSrcTO(); final DataTO destData = cmd.getDestTO(); final int wait = cmd.getWaitInMillSeconds(); @@ -496,7 +544,8 @@ public Answer createTemplateFromVolume(final CopyCommand cmd) { final NfsTO nfsImageStore = (NfsTO)imageStore; KVMStoragePool secondaryStorage = null; - KVMStoragePool primary = null; + KVMStoragePool primary; + try { final String templateFolder = template.getPath(); @@ -600,8 +649,139 @@ public Answer createTemplateFromVolume(final CopyCommand cmd) { } @Override - public Answer createTemplateFromSnapshot(final CopyCommand cmd) { - return null; //To change body of implemented methods use File | Settings | File Templates. + public Answer createTemplateFromSnapshot(CopyCommand cmd) { + Map details = cmd.getOptions(); + + if (details != null && details.get(DiskTO.IQN) != null) { + // use the managed-storage approach + return createTemplateFromVolumeOrSnapshot(cmd); + } + + return new CopyCmdAnswer("operation not supported"); + } + + private Answer createTemplateFromVolumeOrSnapshot(CopyCommand cmd) { + DataTO srcData = cmd.getSrcTO(); + + final boolean isVolume; + + if (srcData instanceof VolumeObjectTO) { + isVolume = true; + } + else if (srcData instanceof SnapshotObjectTO) { + isVolume = false; + } + else { + return new CopyCmdAnswer("unsupported object type"); + } + + PrimaryDataStoreTO primaryStore = (PrimaryDataStoreTO)srcData.getDataStore(); + + DataTO destData = cmd.getDestTO(); + TemplateObjectTO template = (TemplateObjectTO)destData; + DataStoreTO imageStore = template.getDataStore(); + + if (!(imageStore instanceof NfsTO)) { + return new CopyCmdAnswer("unsupported protocol"); + } + + NfsTO nfsImageStore = (NfsTO)imageStore; + + KVMStoragePool secondaryStorage = null; + + try { + Map details = cmd.getOptions(); + + String path = details != null ? details.get(DiskTO.IQN) : null; + + if (path == null) { + new CloudRuntimeException("The 'path' field must be specified."); + } + + storagePoolMgr.connectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path, details); + + KVMPhysicalDisk srcDisk = storagePoolMgr.getPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path); + + secondaryStorage = storagePoolMgr.getStoragePoolByURI(nfsImageStore.getUrl()); + + String templateFolder = template.getPath(); + String tmpltPath = secondaryStorage.getLocalPath() + File.separator + templateFolder; + + storageLayer.mkdirs(tmpltPath); + + String templateName = UUID.randomUUID().toString(); + + s_logger.debug("Converting " + srcDisk.getFormat().toString() + " disk " + srcDisk.getPath() + " into template " + templateName); + + String destName = templateFolder + "/" + templateName + ".qcow2"; + + storagePoolMgr.copyPhysicalDisk(srcDisk, destName, secondaryStorage, cmd.getWaitInMillSeconds()); + + File templateProp = new File(tmpltPath + "/template.properties"); + + if (!templateProp.exists()) { + templateProp.createNewFile(); + } + + String templateContent = "filename=" + templateName + ".qcow2" + System.getProperty("line.separator"); + + DateFormat dateFormat = new SimpleDateFormat("MM_dd_yyyy"); + Date date = new Date(); + + if (isVolume) { + templateContent += "volume.name=" + dateFormat.format(date) + System.getProperty("line.separator"); + } + else { + templateContent += "snapshot.name=" + dateFormat.format(date) + System.getProperty("line.separator"); + } + + FileOutputStream templFo = new FileOutputStream(templateProp); + + templFo.write(templateContent.getBytes()); + templFo.flush(); + templFo.close(); + + Map params = new HashMap<>(); + + params.put(StorageLayer.InstanceConfigKey, storageLayer); + + Processor qcow2Processor = new QCOW2Processor(); + + qcow2Processor.configure("QCOW2 Processor", params); + + FormatInfo info = qcow2Processor.process(tmpltPath, null, templateName); + + TemplateLocation loc = new TemplateLocation(storageLayer, tmpltPath); + + loc.create(1, true, templateName); + loc.addFormat(info); + loc.save(); + + storagePoolMgr.disconnectPhysicalDisk(primaryStore.getPoolType(), primaryStore.getUuid(), path); + + TemplateObjectTO newTemplate = new TemplateObjectTO(); + + newTemplate.setPath(templateFolder + File.separator + templateName + ".qcow2"); + newTemplate.setSize(info.virtualSize); + newTemplate.setPhysicalSize(info.size); + newTemplate.setFormat(ImageFormat.QCOW2); + newTemplate.setName(templateName); + + return new CopyCmdAnswer(newTemplate); + } catch (Exception ex) { + if (isVolume) { + s_logger.debug("Failed to create template from volume: ", ex); + } + else { + s_logger.debug("Failed to create template from snapshot: ", ex); + } + + return new CopyCmdAnswer(ex.toString()); + } finally { + if (secondaryStorage != null) { + secondaryStorage.delete(); + } + } } protected String copyToS3(final File srcFile, final S3TO destStore, final String destPath) throws InterruptedException { @@ -695,8 +875,10 @@ public Answer backupSnapshot(final CopyCommand cmd) { final String secondaryStoragePoolUrl = nfsImageStore.getUrl(); // NOTE: snapshot name is encoded in snapshot path final int index = snapshot.getPath().lastIndexOf("/"); + final boolean isCreatedFromVmSnapshot = (index == -1) ? true: false; // -1 means the snapshot is created from existing vm snapshot final String snapshotName = snapshot.getPath().substring(index + 1); + String descName = snapshotName; final String volumePath = snapshot.getVolume().getPath(); String snapshotDestPath = null; String snapshotRelPath = null; @@ -737,10 +919,10 @@ public Answer backupSnapshot(final CopyCommand cmd) { final QemuImgFile srcFile = new QemuImgFile(KVMPhysicalDisk.RBDStringBuilder(primaryPool.getSourceHost(), primaryPool.getSourcePort(), primaryPool.getAuthUserName(), primaryPool.getAuthSecret(), rbdSnapshot)); - srcFile.setFormat(PhysicalDiskFormat.RAW); + srcFile.setFormat(snapshotDisk.getFormat()); final QemuImgFile destFile = new QemuImgFile(snapshotFile); - destFile.setFormat(snapshotDisk.getFormat()); + destFile.setFormat(PhysicalDiskFormat.QCOW2); s_logger.debug("Backing up RBD snapshot " + rbdSnapshot + " to " + snapshotFile); final QemuImg q = new QemuImg(cmd.getWaitInMillSeconds()); @@ -768,20 +950,23 @@ public Answer backupSnapshot(final CopyCommand cmd) { command.add("-b", snapshotDisk.getPath()); command.add("-n", snapshotName); command.add("-p", snapshotDestPath); - command.add("-t", snapshotName); + if (isCreatedFromVmSnapshot) { + descName = UUID.randomUUID().toString(); + } + command.add("-t", descName); final String result = command.execute(); if (result != null) { s_logger.debug("Failed to backup snaptshot: " + result); return new CopyCmdAnswer(result); } - final File snapFile = new File(snapshotDestPath + "/" + snapshotName); + final File snapFile = new File(snapshotDestPath + "/" + descName); if(snapFile.exists()){ size = snapFile.length(); } } final SnapshotObjectTO newSnapshot = new SnapshotObjectTO(); - newSnapshot.setPath(snapshotRelPath + File.separator + snapshotName); + newSnapshot.setPath(snapshotRelPath + File.separator + descName); newSnapshot.setPhysicalSize(size); return new CopyCmdAnswer(newSnapshot); } catch (final LibvirtException e) { @@ -791,48 +976,52 @@ public Answer backupSnapshot(final CopyCommand cmd) { s_logger.debug("Failed to backup snapshot: ", e); return new CopyCmdAnswer(e.toString()); } finally { - try { - /* Delete the snapshot on primary */ - DomainInfo.DomainState state = null; - Domain vm = null; - if (vmName != null) { - try { - vm = resource.getDomain(conn, vmName); - state = vm.getInfo().state; - } catch (final LibvirtException e) { - s_logger.trace("Ignoring libvirt error.", e); + if (isCreatedFromVmSnapshot) { + s_logger.debug("Ignoring removal of vm snapshot on primary as this snapshot is created from vm snapshot"); + } else { + try { + /* Delete the snapshot on primary */ + DomainInfo.DomainState state = null; + Domain vm = null; + if (vmName != null) { + try { + vm = resource.getDomain(conn, vmName); + state = vm.getInfo().state; + } catch (final LibvirtException e) { + s_logger.trace("Ignoring libvirt error.", e); + } } - } - final KVMStoragePool primaryStorage = storagePoolMgr.getStoragePool(primaryStore.getPoolType(), - primaryStore.getUuid()); - if (state == DomainInfo.DomainState.VIR_DOMAIN_RUNNING && !primaryStorage.isExternalSnapshot()) { - final DomainSnapshot snap = vm.snapshotLookupByName(snapshotName); - snap.delete(0); + final KVMStoragePool primaryStorage = storagePoolMgr.getStoragePool(primaryStore.getPoolType(), + primaryStore.getUuid()); + if (state == DomainInfo.DomainState.VIR_DOMAIN_RUNNING && !primaryStorage.isExternalSnapshot()) { + final DomainSnapshot snap = vm.snapshotLookupByName(snapshotName); + snap.delete(0); - /* - * libvirt on RHEL6 doesn't handle resume event emitted from - * qemu - */ - vm = resource.getDomain(conn, vmName); - state = vm.getInfo().state; - if (state == DomainInfo.DomainState.VIR_DOMAIN_PAUSED) { - vm.resume(); - } - } else { - if (primaryPool.getType() != StoragePoolType.RBD) { - final Script command = new Script(_manageSnapshotPath, _cmdsTimeout, s_logger); - command.add("-d", snapshotDisk.getPath()); - command.add("-n", snapshotName); - final String result = command.execute(); - if (result != null) { - s_logger.debug("Failed to delete snapshot on primary: " + result); - // return new CopyCmdAnswer("Failed to backup snapshot: " + result); + /* + * libvirt on RHEL6 doesn't handle resume event emitted from + * qemu + */ + vm = resource.getDomain(conn, vmName); + state = vm.getInfo().state; + if (state == DomainInfo.DomainState.VIR_DOMAIN_PAUSED) { + vm.resume(); + } + } else { + if (primaryPool.getType() != StoragePoolType.RBD) { + final Script command = new Script(_manageSnapshotPath, _cmdsTimeout, s_logger); + command.add("-d", snapshotDisk.getPath()); + command.add("-n", snapshotName); + final String result = command.execute(); + if (result != null) { + s_logger.debug("Failed to delete snapshot on primary: " + result); + // return new CopyCmdAnswer("Failed to backup snapshot: " + result); + } } } + } catch (final Exception ex) { + s_logger.debug("Failed to delete snapshots on primary", ex); } - } catch (final Exception ex) { - s_logger.debug("Failed to delete snapshots on primary", ex); } try { @@ -883,19 +1072,19 @@ public Answer attachIso(final AttachCommand cmd) { final DiskTO disk = cmd.getDisk(); final TemplateObjectTO isoTO = (TemplateObjectTO)disk.getData(); final DataStoreTO store = isoTO.getDataStore(); - if (!(store instanceof NfsTO)) { - return new AttachAnswer("unsupported protocol"); - } - final NfsTO nfsStore = (NfsTO)store; + try { + String dataStoreUrl = getDataStoreUrlFromStore(store); final Connect conn = LibvirtConnection.getConnectionByVmName(cmd.getVmName()); - attachOrDetachISO(conn, cmd.getVmName(), nfsStore.getUrl() + File.separator + isoTO.getPath(), true); + attachOrDetachISO(conn, cmd.getVmName(), dataStoreUrl + File.separator + isoTO.getPath(), true); } catch (final LibvirtException e) { return new Answer(cmd, false, e.toString()); } catch (final URISyntaxException e) { return new Answer(cmd, false, e.toString()); } catch (final InternalErrorException e) { return new Answer(cmd, false, e.toString()); + } catch (final InvalidParameterValueException e) { + return new Answer(cmd, false, e.toString()); } return new Answer(cmd); @@ -906,24 +1095,45 @@ public Answer dettachIso(final DettachCommand cmd) { final DiskTO disk = cmd.getDisk(); final TemplateObjectTO isoTO = (TemplateObjectTO)disk.getData(); final DataStoreTO store = isoTO.getDataStore(); - if (!(store instanceof NfsTO)) { - return new AttachAnswer("unsupported protocol"); - } - final NfsTO nfsStore = (NfsTO)store; + try { + String dataStoreUrl = getDataStoreUrlFromStore(store); final Connect conn = LibvirtConnection.getConnectionByVmName(cmd.getVmName()); - attachOrDetachISO(conn, cmd.getVmName(), nfsStore.getUrl() + File.separator + isoTO.getPath(), false); + attachOrDetachISO(conn, cmd.getVmName(), dataStoreUrl + File.separator + isoTO.getPath(), false); } catch (final LibvirtException e) { return new Answer(cmd, false, e.toString()); } catch (final URISyntaxException e) { return new Answer(cmd, false, e.toString()); } catch (final InternalErrorException e) { return new Answer(cmd, false, e.toString()); + } catch (final InvalidParameterValueException e) { + return new Answer(cmd, false, e.toString()); } return new Answer(cmd); } + /** + * Return data store URL from store + */ + private String getDataStoreUrlFromStore(DataStoreTO store) { + if (!(store instanceof NfsTO) && (!(store instanceof PrimaryDataStoreTO) || + store instanceof PrimaryDataStoreTO && !((PrimaryDataStoreTO) store).getPoolType().equals(StoragePoolType.NetworkFilesystem))) { + throw new InvalidParameterValueException("unsupported protocol"); + } + + if (store instanceof NfsTO) { + NfsTO nfsStore = (NfsTO)store; + return nfsStore.getUrl(); + } else if (store instanceof PrimaryDataStoreTO && ((PrimaryDataStoreTO) store).getPoolType().equals(StoragePoolType.NetworkFilesystem)) { + //In order to support directly downloaded ISOs + String psHost = ((PrimaryDataStoreTO) store).getHost(); + String psPath = ((PrimaryDataStoreTO) store).getPath(); + return "nfs://" + psHost + File.separator + psPath; + } + return store.getUrl(); + } + protected synchronized String attachOrDetachDevice(final Connect conn, final boolean attach, final String vmName, final String xml) throws LibvirtException, InternalErrorException { Domain dm = null; try { @@ -963,13 +1173,12 @@ protected synchronized String attachOrDetachDisk(final Connect conn, final boole DiskDef diskdef = null; final KVMStoragePool attachingPool = attachingDisk.getPool(); try { + dm = conn.domainLookupByName(vmName); + final LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser(); + final String domXml = dm.getXMLDesc(0); + parser.parseDomainXML(domXml); + disks = parser.getDisks(); if (!attach) { - dm = conn.domainLookupByName(vmName); - final LibvirtDomainXMLParser parser = new LibvirtDomainXMLParser(); - final String xml = dm.getXMLDesc(0); - parser.parseDomainXML(xml); - disks = parser.getDisks(); - if (attachingPool.getType() == StoragePoolType.RBD) { if (resource.getHypervisorType() == Hypervisor.HypervisorType.LXC) { final String device = resource.mapRbdDevice(attachingDisk); @@ -991,7 +1200,20 @@ protected synchronized String attachOrDetachDisk(final Connect conn, final boole throw new InternalErrorException("disk: " + attachingDisk.getPath() + " is not attached before"); } } else { + DiskDef.DiskBus busT = DiskDef.DiskBus.VIRTIO; + for (final DiskDef disk : disks) { + if (disk.getDeviceType() == DeviceType.DISK) { + if (disk.getBusType() == DiskDef.DiskBus.SCSI) { + busT = DiskDef.DiskBus.SCSI; + } + break; + } + } diskdef = new DiskDef(); + if (busT == DiskDef.DiskBus.SCSI) { + diskdef.setQemuDriver(true); + diskdef.setDiscard(DiscardType.UNMAP); + } diskdef.setSerial(serial); if (attachingPool.getType() == StoragePoolType.RBD) { if(resource.getHypervisorType() == Hypervisor.HypervisorType.LXC){ @@ -999,24 +1221,24 @@ protected synchronized String attachOrDetachDisk(final Connect conn, final boole final String device = resource.mapRbdDevice(attachingDisk); if (device != null) { s_logger.debug("RBD device on host is: "+device); - diskdef.defBlockBasedDisk(device, devId, DiskDef.DiskBus.VIRTIO); + diskdef.defBlockBasedDisk(device, devId, busT); } else { throw new InternalErrorException("Error while mapping disk "+attachingDisk.getPath()+" on host"); } } else { diskdef.defNetworkBasedDisk(attachingDisk.getPath(), attachingPool.getSourceHost(), attachingPool.getSourcePort(), attachingPool.getAuthUserName(), - attachingPool.getUuid(), devId, DiskDef.DiskBus.VIRTIO, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW); + attachingPool.getUuid(), devId, busT, DiskProtocol.RBD, DiskDef.DiskFmtType.RAW); } } else if (attachingPool.getType() == StoragePoolType.Gluster) { final String mountpoint = attachingPool.getLocalPath(); final String path = attachingDisk.getPath(); final String glusterVolume = attachingPool.getSourceDir().replace("/", ""); diskdef.defNetworkBasedDisk(glusterVolume + path.replace(mountpoint, ""), attachingPool.getSourceHost(), attachingPool.getSourcePort(), null, - null, devId, DiskDef.DiskBus.VIRTIO, DiskProtocol.GLUSTER, DiskDef.DiskFmtType.QCOW2); + null, devId, busT, DiskProtocol.GLUSTER, DiskDef.DiskFmtType.QCOW2); } else if (attachingDisk.getFormat() == PhysicalDiskFormat.QCOW2) { - diskdef.defFileBasedDisk(attachingDisk.getPath(), devId, DiskDef.DiskBus.VIRTIO, DiskDef.DiskFmtType.QCOW2); + diskdef.defFileBasedDisk(attachingDisk.getPath(), devId, busT, DiskDef.DiskFmtType.QCOW2); } else if (attachingDisk.getFormat() == PhysicalDiskFormat.RAW) { - diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, DiskDef.DiskBus.VIRTIO); + diskdef.defBlockBasedDisk(attachingDisk.getPath(), devId, busT); } if ((bytesReadRate != null) && (bytesReadRate > 0)) { @@ -1284,7 +1506,17 @@ public Answer createVolumeFromSnapshot(final CopyCommand cmd) { final String primaryUuid = pool.getUuid(); final KVMStoragePool primaryPool = storagePoolMgr.getStoragePool(pool.getPoolType(), primaryUuid); final String volUuid = UUID.randomUUID().toString(); - final KVMPhysicalDisk disk = storagePoolMgr.copyPhysicalDisk(snapshotDisk, volUuid, primaryPool, cmd.getWaitInMillSeconds()); + + Map details = cmd.getOptions2(); + + String path = details != null ? details.get(DiskTO.IQN) : null; + + storagePoolMgr.connectPhysicalDisk(pool.getPoolType(), pool.getUuid(), path, details); + + KVMPhysicalDisk disk = storagePoolMgr.copyPhysicalDisk(snapshotDisk, path != null ? path : volUuid, primaryPool, cmd.getWaitInMillSeconds()); + + storagePoolMgr.disconnectPhysicalDisk(pool.getPoolType(), pool.getUuid(), path); + final VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(disk.getName()); newVol.setSize(disk.getVirtualSize()); @@ -1364,4 +1596,58 @@ public Answer forgetObject(final ForgetObjectCmd cmd) { return new Answer(cmd, false, "not implememented yet"); } + /** + * Get direct template downloader from direct download command and destination pool + */ + private DirectTemplateDownloader getDirectTemplateDownloaderFromCommand(DirectDownloadCommand cmd, KVMStoragePool destPool) { + if (cmd instanceof HttpDirectDownloadCommand) { + return new HttpDirectTemplateDownloader(cmd.getUrl(), cmd.getTemplateId(), destPool.getLocalPath(), cmd.getChecksum(), cmd.getHeaders()); + } else if (cmd instanceof HttpsDirectDownloadCommand) { + return new HttpsDirectTemplateDownloader(cmd.getUrl(), cmd.getTemplateId(), destPool.getLocalPath(), cmd.getChecksum(), cmd.getHeaders()); + } else if (cmd instanceof NfsDirectDownloadCommand) { + return new NfsDirectTemplateDownloader(cmd.getUrl(), destPool.getLocalPath(), cmd.getTemplateId(), cmd.getChecksum()); + } else if (cmd instanceof MetalinkDirectDownloadCommand) { + return new MetalinkDirectTemplateDownloader(cmd.getUrl(), destPool.getLocalPath(), cmd.getTemplateId(), cmd.getChecksum(), cmd.getHeaders()); + } else { + throw new IllegalArgumentException("Unsupported protocol, please provide HTTP(S), NFS or a metalink"); + } + } + + @Override + public Answer handleDownloadTemplateToPrimaryStorage(DirectDownloadCommand cmd) { + final PrimaryDataStoreTO pool = cmd.getDestPool(); + if (!pool.getPoolType().equals(StoragePoolType.NetworkFilesystem)) { + return new DirectDownloadAnswer(false, "Unsupported pool type " + pool.getPoolType().toString(), true); + } + KVMStoragePool destPool = storagePoolMgr.getStoragePool(pool.getPoolType(), pool.getUuid()); + DirectTemplateDownloader downloader; + + try { + downloader = getDirectTemplateDownloaderFromCommand(cmd, destPool); + } catch (IllegalArgumentException e) { + return new DirectDownloadAnswer(false, "Unable to create direct downloader: " + e.getMessage(), true); + } + + try { + s_logger.info("Trying to download template"); + if (!downloader.downloadTemplate()) { + s_logger.warn("Couldn't download template"); + return new DirectDownloadAnswer(false, "Unable to download template", true); + } + if (!downloader.validateChecksum()) { + s_logger.warn("Couldn't validate template checksum"); + return new DirectDownloadAnswer(false, "Checksum validation failed", false); + } + if (!downloader.extractAndInstallDownloadedTemplate()) { + s_logger.warn("Couldn't extract and install template"); + return new DirectDownloadAnswer(false, "Extraction and installation failed", false); + } + } catch (CloudRuntimeException e) { + s_logger.warn("Error downloading template " + cmd.getTemplateId() + " due to: " + e.getMessage()); + return new DirectDownloadAnswer(false, "Unable to download template: " + e.getMessage(), true); + } + + DirectTemplateInformation info = downloader.getTemplateInformation(); + return new DirectDownloadAnswer(true, info.getSize(), info.getInstallPath()); + } } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java index 6e8ba30ea4aa..24cf0312046a 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStorageAdaptor.java @@ -147,44 +147,24 @@ private StoragePool createNetfsStoragePool(PoolType fsType, Connect conn, String StoragePool sp = null; try { s_logger.debug(spd.toString()); - sp = conn.storagePoolCreateXML(spd.toString(), 0); - return sp; - } catch (LibvirtException e) { - s_logger.error(e.toString()); - // if error is that pool is mounted, try to handle it - if (e.toString().contains("already mounted")) { - s_logger.error("Attempting to unmount old mount libvirt is unaware of at " + targetPath); + // check whether the pool is already mounted + int mountpointResult = Script.runSimpleBashScriptForExitValue("mountpoint -q " + targetPath); + // if the pool is mounted, try to unmount it + if(mountpointResult == 0) { + s_logger.info("Attempting to unmount old mount at " + targetPath); String result = Script.runSimpleBashScript("umount -l " + targetPath); if (result == null) { - s_logger.error("Succeeded in unmounting " + targetPath); - try { - sp = conn.storagePoolCreateXML(spd.toString(), 0); - s_logger.error("Succeeded in redefining storage"); - return sp; - } catch (LibvirtException l) { - s_logger.error("Target was already mounted, unmounted it but failed to redefine storage:" + l); - } + s_logger.info("Succeeded in unmounting " + targetPath); } else { - s_logger.error("Failed in unmounting and redefining storage"); - } - } else { - s_logger.error("Internal error occurred when attempting to mount: specified path may be invalid"); - throw e; - } - if (sp != null) { - try { - if (sp.isPersistent() == 1) { - sp.destroy(); - sp.undefine(); - } else { - sp.destroy(); - } - sp.free(); - } catch (LibvirtException l) { - s_logger.debug("Failed to undefine " + fsType.toString() + " storage pool with: " + l.toString()); + s_logger.error("Failed in unmounting storage"); } } - return null; + + sp = conn.storagePoolCreateXML(spd.toString(), 0); + return sp; + } catch (LibvirtException e) { + s_logger.error(e.toString()); + throw e; } } @@ -659,25 +639,25 @@ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, s_logger.info("Attempting to create volume " + name + " (" + pool.getType().toString() + ") in pool " + pool.getUuid() + " with size " + size); - switch (pool.getType()){ - case RBD: - return createPhysicalDiskOnRBD(name, pool, format, provisioningType, size); - case NetworkFilesystem: - case Filesystem: - switch (format){ - case QCOW2: - return createPhysicalDiskByQemuImg(name, pool, format, provisioningType, size); - case RAW: - return createPhysicalDiskByQemuImg(name, pool, format, provisioningType, size); - case DIR: - return createPhysicalDiskByLibVirt(name, pool, format, provisioningType, size); - case TAR: - return createPhysicalDiskByLibVirt(name, pool, format, provisioningType, size); + switch (pool.getType()) { + case RBD: + return createPhysicalDiskByLibVirt(name, pool, PhysicalDiskFormat.RAW, provisioningType, size); + case NetworkFilesystem: + case Filesystem: + switch (format) { + case QCOW2: + return createPhysicalDiskByQemuImg(name, pool, format, provisioningType, size); + case RAW: + return createPhysicalDiskByQemuImg(name, pool, format, provisioningType, size); + case DIR: + return createPhysicalDiskByLibVirt(name, pool, format, provisioningType, size); + case TAR: + return createPhysicalDiskByLibVirt(name, pool, format, provisioningType, size); + default: + throw new CloudRuntimeException("Unexpected disk format is specified."); + } default: - throw new CloudRuntimeException("Unexpected disk format is specified."); - } - default: - return createPhysicalDiskByLibVirt(name, pool, format, provisioningType, size); + return createPhysicalDiskByLibVirt(name, pool, format, provisioningType, size); } } @@ -748,50 +728,6 @@ private KVMPhysicalDisk createPhysicalDiskByQemuImg(String name, KVMStoragePool return disk; } - private KVMPhysicalDisk createPhysicalDiskOnRBD(String name, KVMStoragePool pool, - PhysicalDiskFormat format, Storage.ProvisioningType provisioningType, long size) { - String volPath = null; - - /** - * To have RBD function properly we want RBD images of format 2 - * libvirt currently defaults to format 1 - * - * This has been fixed in libvirt 1.2.2, but that's not upstream - * in all distributions - * - * For that reason we use the native RBD bindings to create the - * RBD image until libvirt creates RBD format 2 by default - */ - - try { - s_logger.info("Creating RBD image " + pool.getSourceDir() + "/" + name + " with size " + size); - - Rados r = new Rados(pool.getAuthUserName()); - r.confSet("mon_host", pool.getSourceHost() + ":" + pool.getSourcePort()); - r.confSet("key", pool.getAuthSecret()); - r.confSet("client_mount_timeout", "30"); - r.connect(); - s_logger.debug("Succesfully connected to Ceph cluster at " + r.confGet("mon_host")); - - IoCTX io = r.ioCtxCreate(pool.getSourceDir()); - Rbd rbd = new Rbd(io); - rbd.create(name, size, rbdFeatures, rbdOrder); - - r.ioCtxDestroy(io); - } catch (RadosException e) { - throw new CloudRuntimeException(e.toString()); - } catch (RbdException e) { - throw new CloudRuntimeException(e.toString()); - } - - volPath = pool.getSourceDir() + "/" + name; - KVMPhysicalDisk disk = new KVMPhysicalDisk(volPath, name, pool); - disk.setFormat(PhysicalDiskFormat.RAW); - disk.setSize(size); - disk.setVirtualSize(size); - return disk; - } - @Override public boolean connectPhysicalDisk(String name, KVMStoragePool pool, Map details) { // this is for managed storage that needs to prep disks prior to use @@ -804,6 +740,12 @@ public boolean disconnectPhysicalDisk(String uuid, KVMStoragePool pool) { return true; } + @Override + public boolean disconnectPhysicalDisk(Map volumeToDisconnect) { + // this is for managed storage that needs to cleanup disks after use + return false; + } + @Override public boolean disconnectPhysicalDiskByPath(String localPath) { // we've only ever cleaned up ISOs that are NFS mounted @@ -1385,4 +1327,5 @@ private void deleteVol(LibvirtStoragePool pool, StorageVol vol) throws LibvirtEx private void deleteDirVol(LibvirtStoragePool pool, StorageVol vol) throws LibvirtException { Script.runSimpleBashScript("rm -r --interactive=never " + vol.getPath()); } + } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java index 66018dd899de..1b554f7037f7 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/LibvirtStoragePool.java @@ -140,7 +140,7 @@ public KVMPhysicalDisk getPhysicalDisk(String volumeUid) { if (disk != null) { return disk; } - s_logger.debug("find volume bypass libvirt"); + s_logger.debug("find volume bypass libvirt volumeUid " + volumeUid); //For network file system or file system, try to use java file to find the volume, instead of through libvirt. BUG:CLOUDSTACK-4459 String localPoolPath = this.getLocalPath(); File f = new File(localPoolPath + File.separator + volumeUuid); @@ -152,6 +152,7 @@ public KVMPhysicalDisk getPhysicalDisk(String volumeUid) { disk.setFormat(PhysicalDiskFormat.QCOW2); disk.setSize(f.length()); disk.setVirtualSize(f.length()); + s_logger.debug("find volume bypass libvirt disk " + disk.toString()); return disk; } diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java index 72edb134608b..596582db34dc 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/ManagedNfsStorageAdaptor.java @@ -260,6 +260,11 @@ public boolean disconnectPhysicalDisk(String volumeUuid, KVMStoragePool pool) { } } + @Override + public boolean disconnectPhysicalDisk(Map volumeToDisconnect) { + return false; + } + @Override public boolean disconnectPhysicalDiskByPath(String localPath) { return false; diff --git a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java index dceb2910c575..2c1ed233b40a 100644 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/storage/StorageAdaptor.java @@ -48,6 +48,8 @@ public KVMPhysicalDisk createPhysicalDisk(String name, KVMStoragePool pool, // given disk path (per database) and pool, clean up disk on host public boolean disconnectPhysicalDisk(String volumePath, KVMStoragePool pool); + public boolean disconnectPhysicalDisk(Map volumeToDisconnect); + // given local path to file/device (per Libvirt XML), 1) check that device is // handled by your adaptor, return false if not. 2) clean up device, return true public boolean disconnectPhysicalDiskByPath(String localPath); @@ -71,5 +73,4 @@ public KVMPhysicalDisk createDiskFromTemplate(KVMPhysicalDisk template, public boolean deleteStoragePool(KVMStoragePool pool); public boolean createFolder(String uuid, String path); - } diff --git a/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHAConfig.java b/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHAConfig.java new file mode 100644 index 000000000000..59ea720328f5 --- /dev/null +++ b/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHAConfig.java @@ -0,0 +1,56 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.kvm.ha; + +import org.apache.cloudstack.framework.config.ConfigKey; + +public class KVMHAConfig { + + public static final ConfigKey KvmHAHealthCheckTimeout = new ConfigKey<>("Advanced", Long.class, "kvm.ha.health.check.timeout", "10", + "The maximum length of time, in seconds, expected for an health check to complete.", true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHAActivityCheckTimeout = new ConfigKey<>("Advanced", Long.class, "kvm.ha.activity.check.timeout", "60", + "The maximum length of time, in seconds, expected for an activity check to complete.", true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHAActivityCheckInterval = new ConfigKey<>("Advanced", Long.class, "kvm.ha.activity.check.interval", "60", + "The interval, in seconds, between activity checks.", true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHAActivityCheckMaxAttempts = new ConfigKey<>("Advanced", Long.class, "kvm.ha.activity.check.max.attempts", "10", + "The maximum number of activity check attempts to perform before deciding to recover or degrade a resource.", true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHAActivityCheckFailureThreshold = new ConfigKey<>("Advanced", Double.class, "kvm.ha.activity.check.failure.ratio", "0.7", + "The activity check failure threshold ratio. This is used with the activity check maximum attempts for deciding to recover or degrade a resource. For most environments, please keep this value above 0.5.", + true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHADegradedMaxPeriod = new ConfigKey<>("Advanced", Long.class, "kvm.ha.degraded.max.period", "300", + "The maximum length of time, in seconds, a resource can be in degraded state where only health checks are performed.", true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHARecoverTimeout = new ConfigKey<>("Advanced", Long.class, "kvm.ha.recover.timeout", "60", + "The maximum length of time, in seconds, expected for a recovery operation to complete.", true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHARecoverWaitPeriod = new ConfigKey<>("Advanced", Long.class, "kvm.ha.recover.wait.period", "600", + "The maximum length of time, in seconds, to wait for a resource to recover.", true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHARecoverAttemptThreshold = new ConfigKey<>("Advanced", Long.class, "kvm.ha.recover.failure.threshold", "1", + "The maximum recovery attempts to be made for a resource, after which the resource is fenced. The recovery counter resets when a health check passes for a resource.", + true, ConfigKey.Scope.Cluster); + + public static final ConfigKey KvmHAFenceTimeout = new ConfigKey<>("Advanced", Long.class, "kvm.ha.fence.timeout", "60", + "The maximum length of time, in seconds, expected for a fence operation to complete.", true, ConfigKey.Scope.Cluster); + +} diff --git a/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHAProvider.java b/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHAProvider.java new file mode 100644 index 000000000000..5399fd23a1cd --- /dev/null +++ b/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHAProvider.java @@ -0,0 +1,157 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, + * software distributed under the License is distributed on an + * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY + * KIND, either express or implied. See the License for the + * specific language governing permissions and limitations + * under the License. + */ + +package org.apache.cloudstack.kvm.ha; + +import com.cloud.host.Host; +import com.cloud.hypervisor.Hypervisor; + +import org.apache.cloudstack.api.response.OutOfBandManagementResponse; +import org.apache.cloudstack.framework.config.ConfigKey; +import org.apache.cloudstack.framework.config.Configurable; +import org.apache.cloudstack.ha.HAResource; +import org.apache.cloudstack.ha.provider.HACheckerException; +import org.apache.cloudstack.ha.provider.HAFenceException; +import org.apache.cloudstack.ha.provider.HAProvider; +import org.apache.cloudstack.ha.provider.HARecoveryException; +import org.apache.cloudstack.ha.provider.host.HAAbstractHostProvider; +import org.apache.cloudstack.outofbandmanagement.OutOfBandManagement.PowerOperation; +import org.apache.cloudstack.outofbandmanagement.OutOfBandManagementService; +import org.apache.log4j.Logger; +import org.joda.time.DateTime; + +import javax.inject.Inject; +import java.security.InvalidParameterException; + +public final class KVMHAProvider extends HAAbstractHostProvider implements HAProvider, Configurable { + private final static Logger LOG = Logger.getLogger(KVMHAProvider.class); + + @Inject + protected KVMHostActivityChecker hostActivityChecker; + @Inject + protected OutOfBandManagementService outOfBandManagementService; + + @Override + public boolean isEligible(final Host host) { + if (outOfBandManagementService.isOutOfBandManagementEnabled(host)){ + return !isInMaintenanceMode(host) && !isDisabled(host) && + hostActivityChecker.getNeighbors(host).length > 0 && + (Hypervisor.HypervisorType.KVM.equals(host.getHypervisorType()) || + Hypervisor.HypervisorType.LXC.equals(host.getHypervisorType())); + } + return false; + } + + @Override + public boolean isHealthy(final Host r) throws HACheckerException { + return hostActivityChecker.isHealthy(r); + } + + @Override + public boolean hasActivity(final Host r, final DateTime suspectTime) throws HACheckerException { + return hostActivityChecker.isActive(r, suspectTime); + } + + @Override + public boolean recover(Host r) throws HARecoveryException { + try { + if (outOfBandManagementService.isOutOfBandManagementEnabled(r)){ + final OutOfBandManagementResponse resp = outOfBandManagementService.executePowerOperation(r, PowerOperation.RESET, null); + return resp.getSuccess(); + } else { + LOG.warn("OOBM recover operation failed for the host " + r.getName()); + return false; + } + } catch (Exception e){ + LOG.warn("OOBM service is not configured or enabled for this host " + r.getName() + " error is " + e.getMessage()); + throw new HARecoveryException(" OOBM service is not configured or enabled for this host " + r.getName(), e); + } + } + + @Override + public boolean fence(Host r) throws HAFenceException { + try { + if (outOfBandManagementService.isOutOfBandManagementEnabled(r)){ + final OutOfBandManagementResponse resp = outOfBandManagementService.executePowerOperation(r, PowerOperation.OFF, null); + return resp.getSuccess(); + } else { + LOG.warn("OOBM fence operation failed for this host " + r.getName()); + return false; + } + } catch (Exception e){ + LOG.warn("OOBM service is not configured or enabled for this host " + r.getName() + " error is " + e.getMessage()); + throw new HAFenceException("OOBM service is not configured or enabled for this host " + r.getName() , e); + } + } + + @Override + public HAResource.ResourceSubType resourceSubType() { + return HAResource.ResourceSubType.KVM; + } + + @Override + public Object getConfigValue(final HAProviderConfig name, final Host host) { + final Long clusterId = host.getClusterId(); + switch (name) { + case HealthCheckTimeout: + return KVMHAConfig.KvmHAHealthCheckTimeout.valueIn(clusterId); + case ActivityCheckTimeout: + return KVMHAConfig.KvmHAActivityCheckTimeout.valueIn(clusterId); + case MaxActivityCheckInterval: + return KVMHAConfig.KvmHAActivityCheckInterval.valueIn(clusterId); + case MaxActivityChecks: + return KVMHAConfig.KvmHAActivityCheckMaxAttempts.valueIn(clusterId); + case ActivityCheckFailureRatio: + return KVMHAConfig.KvmHAActivityCheckFailureThreshold.valueIn(clusterId); + case RecoveryWaitTimeout: + return KVMHAConfig.KvmHARecoverWaitPeriod.valueIn(clusterId); + case RecoveryTimeout: + return KVMHAConfig.KvmHARecoverTimeout.valueIn(clusterId); + case FenceTimeout: + return KVMHAConfig.KvmHAFenceTimeout.valueIn(clusterId); + case MaxRecoveryAttempts: + return KVMHAConfig.KvmHARecoverAttemptThreshold.valueIn(clusterId); + case MaxDegradedWaitTimeout: + return KVMHAConfig.KvmHADegradedMaxPeriod.valueIn(clusterId); + default: + throw new InvalidParameterException("Unknown HAProviderConfig " + name.toString()); + } + } + + @Override + public String getConfigComponentName() { + return KVMHAConfig.class.getSimpleName(); + } + + @Override + public ConfigKey[] getConfigKeys() { + return new ConfigKey[] { + KVMHAConfig.KvmHAHealthCheckTimeout, + KVMHAConfig.KvmHAActivityCheckTimeout, + KVMHAConfig.KvmHARecoverTimeout, + KVMHAConfig.KvmHAFenceTimeout, + KVMHAConfig.KvmHAActivityCheckInterval, + KVMHAConfig.KvmHAActivityCheckMaxAttempts, + KVMHAConfig.KvmHAActivityCheckFailureThreshold, + KVMHAConfig.KvmHADegradedMaxPeriod, + KVMHAConfig.KvmHARecoverWaitPeriod, + KVMHAConfig.KvmHARecoverAttemptThreshold + }; + } +} diff --git a/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHostActivityChecker.java b/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHostActivityChecker.java new file mode 100644 index 000000000000..060b484fec7d --- /dev/null +++ b/plugins/hypervisors/kvm/src/org/apache/cloudstack/kvm/ha/KVMHostActivityChecker.java @@ -0,0 +1,205 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. + +package org.apache.cloudstack.kvm.ha; + +import com.cloud.agent.AgentManager; +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.CheckOnHostCommand; +import com.cloud.agent.api.CheckVMActivityOnStoragePoolCommand; +import com.cloud.exception.StorageUnavailableException; +import com.cloud.host.Host; +import com.cloud.host.HostVO; +import com.cloud.host.Status; +import com.cloud.hypervisor.Hypervisor; +import com.cloud.resource.ResourceManager; +import com.cloud.storage.StorageManager; +import com.cloud.storage.StoragePool; +import com.cloud.storage.Volume; +import com.cloud.storage.VolumeVO; +import com.cloud.storage.dao.VolumeDao; +import com.cloud.utils.component.AdapterBase; +import com.cloud.vm.VMInstanceVO; +import com.cloud.vm.VirtualMachine; +import com.cloud.vm.dao.VMInstanceDao; +import org.apache.cloudstack.ha.provider.ActivityCheckerInterface; +import org.apache.cloudstack.ha.provider.HACheckerException; +import org.apache.cloudstack.ha.provider.HealthCheckerInterface; +import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; +import org.apache.commons.lang.ArrayUtils; +import org.apache.log4j.Logger; + +import javax.inject.Inject; +import java.util.ArrayList; +import org.joda.time.DateTime; +import java.util.HashMap; +import java.util.List; + +public class KVMHostActivityChecker extends AdapterBase implements ActivityCheckerInterface, HealthCheckerInterface { + private final static Logger LOG = Logger.getLogger(KVMHostActivityChecker.class); + + @Inject + private VolumeDao volumeDao; + @Inject + private VMInstanceDao vmInstanceDao; + @Inject + private AgentManager agentMgr; + @Inject + private PrimaryDataStoreDao storagePool; + @Inject + private StorageManager storageManager; + @Inject + private ResourceManager resourceManager; + + @Override + public boolean isActive(Host r, DateTime suspectTime) throws HACheckerException { + try { + return isVMActivtyOnHost(r, suspectTime); + } + catch (StorageUnavailableException e){ + throw new HACheckerException("Storage is unavailable to do the check, mostly host is not reachable ", e); + } + catch (Exception e){ + throw new HACheckerException("Operation timed out, mostly host is not reachable ", e); + } + } + + @Override + public boolean isHealthy(Host r) { + return isAgentActive(r); + } + + private boolean isAgentActive(Host agent) { + if (agent.getHypervisorType() != Hypervisor.HypervisorType.KVM && agent.getHypervisorType() != Hypervisor.HypervisorType.LXC) { + throw new IllegalStateException("Calling KVM investigator for non KVM Host of type " + agent.getHypervisorType()); + } + Status hostStatus = Status.Unknown; + Status neighbourStatus = Status.Unknown; + final CheckOnHostCommand cmd = new CheckOnHostCommand(agent); + try { + Answer answer = agentMgr.easySend(agent.getId(), cmd); + if (answer != null) { + hostStatus = answer.getResult() ? Status.Down : Status.Up; + if ( hostStatus == Status.Up ){ + return true; + } + } + else { + hostStatus = Status.Disconnected; + } + } catch (Exception e) { + LOG.warn("Failed to send command to host: " + agent.getId()); + } + + List neighbors = resourceManager.listHostsInClusterByStatus(agent.getClusterId(), Status.Up); + for (HostVO neighbor : neighbors) { + if (neighbor.getId() == agent.getId() || (neighbor.getHypervisorType() != Hypervisor.HypervisorType.KVM && neighbor.getHypervisorType() != Hypervisor.HypervisorType.LXC)) { + continue; + } + if (LOG.isTraceEnabled()){ + LOG.trace("Investigating host:" + agent.getId() + " via neighbouring host:" + neighbor.getId()); + } + try { + Answer answer = agentMgr.easySend(neighbor.getId(), cmd); + if (answer != null) { + neighbourStatus = answer.getResult() ? Status.Down : Status.Up; + if (LOG.isTraceEnabled()){ + LOG.trace("Neighbouring host:" + neighbor.getId() + " returned status:" + neighbourStatus + " for the investigated host:" + agent.getId()); + } + if (neighbourStatus == Status.Up) { + break; + } + } + } catch (Exception e) { + if (LOG.isTraceEnabled()) { + LOG.trace("Failed to send command to host: " + neighbor.getId()); + } + } + } + if (neighbourStatus == Status.Up && (hostStatus == Status.Disconnected || hostStatus == Status.Down)) { + hostStatus = Status.Disconnected; + } + if (neighbourStatus == Status.Down && (hostStatus == Status.Disconnected || hostStatus == Status.Down)) { + hostStatus = Status.Down; + } + + if (LOG.isTraceEnabled()){ + LOG.trace("Resource state = " + hostStatus.name()); + } + return hostStatus == Status.Up; + } + + private boolean isVMActivtyOnHost(Host agent, DateTime suspectTime) throws StorageUnavailableException { + if (agent.getHypervisorType() != Hypervisor.HypervisorType.KVM && agent.getHypervisorType() != Hypervisor.HypervisorType.LXC) { + throw new IllegalStateException("Calling KVM investigator for non KVM Host of type " + agent.getHypervisorType()); + } + boolean activityStatus = true; + HashMap> poolVolMap = getVolumeUuidOnHost(agent); + for (StoragePool pool : poolVolMap.keySet()) { + //for each storage pool find activity + List volume_list = poolVolMap.get(pool); + final CheckVMActivityOnStoragePoolCommand cmd = new CheckVMActivityOnStoragePoolCommand(agent, pool, volume_list, suspectTime); + //send the command to appropriate storage pool + Answer answer = storageManager.sendToPool(pool, getNeighbors(agent), cmd); + if (answer != null) { + activityStatus = ! answer.getResult(); + } else { + throw new IllegalStateException("Did not get a valid response for VM activity check for host " + agent.getId()); + } + } + if (LOG.isDebugEnabled()){ + LOG.debug("Resource active = " + activityStatus); + } + return activityStatus; + } + + private HashMap> getVolumeUuidOnHost(Host agent) { + List vm_list = vmInstanceDao.listByHostId(agent.getId()); + List volume_list = new ArrayList(); + for (VirtualMachine vm : vm_list) { + List vm_volume_list = volumeDao.findByInstance(vm.getId()); + volume_list.addAll(vm_volume_list); + } + + HashMap> poolVolMap = new HashMap>(); + for (Volume vol : volume_list) { + StoragePool sp = storagePool.findById(vol.getPoolId()); + if (!poolVolMap.containsKey(sp)) { + List list = new ArrayList(); + list.add(vol); + + poolVolMap.put(sp, list); + } else { + poolVolMap.get(sp).add(vol); + } + } + return poolVolMap; + } + + public long[] getNeighbors(Host agent) { + List neighbors = new ArrayList(); + List cluster_hosts = resourceManager.listHostsInClusterByStatus(agent.getClusterId(), Status.Up); + for (HostVO host : cluster_hosts) { + if (host.getId() == agent.getId() || (host.getHypervisorType() != Hypervisor.HypervisorType.KVM && host.getHypervisorType() != Hypervisor.HypervisorType.LXC)) { + continue; + } + neighbors.add(host.getId()); + } + return ArrayUtils.toPrimitive(neighbors.toArray(new Long[neighbors.size()])); + } + +} diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java index b4e1375ed485..795b96175abc 100644 --- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtComputingResourceTest.java @@ -19,16 +19,6 @@ package com.cloud.hypervisor.kvm.resource; -import static org.junit.Assert.assertFalse; -import static org.junit.Assert.assertNotNull; -import static org.junit.Assert.assertTrue; -import static org.junit.Assert.fail; -import static org.mockito.Mockito.doNothing; -import static org.mockito.Mockito.doThrow; -import static org.mockito.Mockito.times; -import static org.mockito.Mockito.verify; -import static org.mockito.Mockito.when; - import java.io.ByteArrayInputStream; import java.io.File; import java.io.IOException; @@ -48,11 +38,7 @@ import javax.xml.xpath.XPathExpressionException; import javax.xml.xpath.XPathFactory; -import org.apache.cloudstack.storage.command.AttachAnswer; -import org.apache.cloudstack.storage.command.AttachCommand; -import org.apache.cloudstack.utils.linux.CPUStat; -import org.apache.cloudstack.utils.linux.MemStat; -import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.CpuTuneDef; import org.apache.commons.lang.SystemUtils; import org.joda.time.Duration; import org.junit.Assert; @@ -78,6 +64,12 @@ import org.w3c.dom.Document; import org.xml.sax.SAXException; +import org.apache.cloudstack.storage.command.AttachAnswer; +import org.apache.cloudstack.storage.command.AttachCommand; +import org.apache.cloudstack.utils.linux.CPUStat; +import org.apache.cloudstack.utils.linux.MemStat; +import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; + import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.BackupSnapshotCommand; @@ -150,6 +142,7 @@ import com.cloud.agent.resource.virtualnetwork.VirtualRoutingResource; import com.cloud.exception.InternalErrorException; import com.cloud.hypervisor.kvm.resource.KVMHABase.NfsStoragePool; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; import com.cloud.hypervisor.kvm.resource.wrapper.LibvirtRequestWrapper; @@ -177,11 +170,23 @@ import com.cloud.vm.VirtualMachine.PowerState; import com.cloud.vm.VirtualMachine.Type; +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertNotNull; +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doThrow; +import static org.mockito.Mockito.times; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + @RunWith(MockitoJUnitRunner.class) public class LibvirtComputingResourceTest { @Mock private LibvirtComputingResource libvirtComputingResource; + @Mock + VirtualMachineTO vmTO; String hyperVisorType = "kvm"; Random random = new Random(); @@ -336,6 +341,19 @@ private void verifyVm(final VirtualMachineTO to, final LibvirtVMDef vm) { assertXpath(domainDoc, "/domain/devices/input/@type", "tablet"); assertXpath(domainDoc, "/domain/devices/input/@bus", "usb"); + assertNodeExists(domainDoc, "/domain/devices/channel"); + assertXpath(domainDoc, "/domain/devices/channel/@type", ChannelDef.ChannelType.UNIX.toString()); + + /* + The configure() method of LibvirtComputingResource has not been called, so the default path for the sockets + hasn't been initialized. That's why we check for 'null' + + Calling configure is also not possible since that looks for certain files on the system which are not present + during testing + */ + assertXpath(domainDoc, "/domain/devices/channel/source/@path", "null/" + to.getName() + ".org.qemu.guest_agent.0"); + assertXpath(domainDoc, "/domain/devices/channel/target/@name", "org.qemu.guest_agent.0"); + assertXpath(domainDoc, "/domain/memory/text()", String.valueOf( to.getMaxRam() / 1024 )); assertXpath(domainDoc, "/domain/currentMemory/text()", String.valueOf( to.getMinRam() / 1024 )); @@ -352,6 +370,9 @@ private void verifyVm(final VirtualMachineTO to, final LibvirtVMDef vm) { assertXpath(domainDoc, "/domain/on_reboot/text()", "restart"); assertXpath(domainDoc, "/domain/on_poweroff/text()", "destroy"); assertXpath(domainDoc, "/domain/on_crash/text()", "destroy"); + + assertXpath(domainDoc, "/domain/devices/watchdog/@model", "i6300esb"); + assertXpath(domainDoc, "/domain/devices/watchdog/@action", "none"); } static Document parse(final String input) { @@ -1004,7 +1025,7 @@ public void testPrepareForMigrationCommand() { when(nicTO.getType()).thenReturn(TrafficType.Guest); when(diskTO.getType()).thenReturn(Volume.Type.ISO); - when(libvirtComputingResource.getVifDriver(nicTO.getType())).thenReturn(vifDriver); + when(libvirtComputingResource.getVifDriver(nicTO.getType(), nicTO.getName())).thenReturn(vifDriver); when(libvirtComputingResource.getStoragePoolMgr()).thenReturn(storagePoolManager); final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); @@ -1052,7 +1073,7 @@ public void testPrepareForMigrationCommandMigration() { when(nicTO.getType()).thenReturn(TrafficType.Guest); when(diskTO.getType()).thenReturn(Volume.Type.ISO); - when(libvirtComputingResource.getVifDriver(nicTO.getType())).thenReturn(vifDriver); + when(libvirtComputingResource.getVifDriver(nicTO.getType(), nicTO.getName())).thenReturn(vifDriver); when(libvirtComputingResource.getStoragePoolMgr()).thenReturn(storagePoolManager); when(storagePoolManager.connectPhysicalDisksViaVmSpec(vm)).thenReturn(true); @@ -1144,7 +1165,7 @@ public void testPrepareForMigrationCommandURISyntaxException() { when(nicTO.getType()).thenReturn(TrafficType.Guest); when(volume.getType()).thenReturn(Volume.Type.ISO); - when(libvirtComputingResource.getVifDriver(nicTO.getType())).thenReturn(vifDriver); + when(libvirtComputingResource.getVifDriver(nicTO.getType(), nicTO.getName())).thenReturn(vifDriver); when(libvirtComputingResource.getStoragePoolMgr()).thenReturn(storagePoolManager); try { when(libvirtComputingResource.getVolumePath(conn, volume)).thenThrow(URISyntaxException.class); @@ -1196,7 +1217,7 @@ public void testPrepareForMigrationCommandInternalErrorException() { when(vm.getNics()).thenReturn(new NicTO[]{nicTO}); when(nicTO.getType()).thenReturn(TrafficType.Guest); - when(libvirtComputingResource.getVifDriver(nicTO.getType())).thenThrow(InternalErrorException.class); + when(libvirtComputingResource.getVifDriver(nicTO.getType(), nicTO.getName())).thenThrow(InternalErrorException.class); when(libvirtComputingResource.getStoragePoolMgr()).thenReturn(storagePoolManager); try { when(libvirtComputingResource.getVolumePath(conn, volume)).thenReturn("/path"); @@ -2533,9 +2554,9 @@ public void testCheckNetworkCommand() { final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); - when(libvirtComputingResource.checkNetwork(nic.getGuestNetworkName())).thenReturn(true); - when(libvirtComputingResource.checkNetwork(nic.getPrivateNetworkName())).thenReturn(true); - when(libvirtComputingResource.checkNetwork(nic.getPublicNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(TrafficType.Guest, nic.getGuestNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(TrafficType.Management, nic.getPrivateNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(TrafficType.Public, nic.getPublicNetworkName())).thenReturn(true); final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); assertNotNull(wrapper); @@ -2543,9 +2564,9 @@ public void testCheckNetworkCommand() { final Answer answer = wrapper.execute(command, libvirtComputingResource); assertTrue(answer.getResult()); - verify(libvirtComputingResource, times(3)).checkNetwork(nic.getGuestNetworkName()); - verify(libvirtComputingResource, times(3)).checkNetwork(nic.getPrivateNetworkName()); - verify(libvirtComputingResource, times(3)).checkNetwork(nic.getPublicNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Guest, nic.getGuestNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Management, nic.getPrivateNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Public, nic.getPublicNetworkName()); } @Test @@ -2557,7 +2578,7 @@ public void testCheckNetworkCommandFail1() { final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); - when(libvirtComputingResource.checkNetwork(networkSetupInfo.getGuestNetworkName())).thenReturn(false); + when(libvirtComputingResource.checkNetwork(TrafficType.Guest, networkSetupInfo.getGuestNetworkName())).thenReturn(false); final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); assertNotNull(wrapper); @@ -2565,7 +2586,7 @@ public void testCheckNetworkCommandFail1() { final Answer answer = wrapper.execute(command, libvirtComputingResource); assertFalse(answer.getResult()); - verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getGuestNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Guest, networkSetupInfo.getGuestNetworkName()); } @Test @@ -2577,8 +2598,8 @@ public void testCheckNetworkCommandFail2() { final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); - when(libvirtComputingResource.checkNetwork(networkSetupInfo.getGuestNetworkName())).thenReturn(true); - when(libvirtComputingResource.checkNetwork(networkSetupInfo.getPrivateNetworkName())).thenReturn(false); + when(libvirtComputingResource.checkNetwork(TrafficType.Guest, networkSetupInfo.getGuestNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(TrafficType.Management, networkSetupInfo.getPrivateNetworkName())).thenReturn(false); final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); assertNotNull(wrapper); @@ -2586,8 +2607,8 @@ public void testCheckNetworkCommandFail2() { final Answer answer = wrapper.execute(command, libvirtComputingResource); assertFalse(answer.getResult()); - verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getGuestNetworkName()); - verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getPrivateNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Guest, networkSetupInfo.getGuestNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Management, networkSetupInfo.getPrivateNetworkName()); } @Test @@ -2599,9 +2620,9 @@ public void testCheckNetworkCommandFail3() { final CheckNetworkCommand command = new CheckNetworkCommand(networkInfoList); - when(libvirtComputingResource.checkNetwork(networkSetupInfo.getGuestNetworkName())).thenReturn(true); - when(libvirtComputingResource.checkNetwork(networkSetupInfo.getPrivateNetworkName())).thenReturn(true); - when(libvirtComputingResource.checkNetwork(networkSetupInfo.getPublicNetworkName())).thenReturn(false); + when(libvirtComputingResource.checkNetwork(TrafficType.Guest, networkSetupInfo.getGuestNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(TrafficType.Management, networkSetupInfo.getPrivateNetworkName())).thenReturn(true); + when(libvirtComputingResource.checkNetwork(TrafficType.Public, networkSetupInfo.getPublicNetworkName())).thenReturn(false); final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); assertNotNull(wrapper); @@ -2609,8 +2630,8 @@ public void testCheckNetworkCommandFail3() { final Answer answer = wrapper.execute(command, libvirtComputingResource); assertFalse(answer.getResult()); - verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getGuestNetworkName()); - verify(libvirtComputingResource, times(1)).checkNetwork(networkSetupInfo.getPrivateNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Guest, networkSetupInfo.getGuestNetworkName()); + verify(libvirtComputingResource, times(1)).checkNetwork(TrafficType.Management, networkSetupInfo.getPrivateNetworkName()); } @Test @@ -2898,6 +2919,7 @@ public void testFenceCommand() { @Test public void testSecurityGroupRulesCmdFalse() { final String guestIp = "127.0.0.1"; + final String guestIp6 = "2001:db8::cad:40ff:fefd:75c4"; final String guestMac = "00:00:00:00"; final String vmName = "Test"; final Long vmId = 1l; @@ -2909,7 +2931,7 @@ public void testSecurityGroupRulesCmdFalse() { final List cidrs = new Vector(); cidrs.add("0.0.0.0/0"); - final SecurityGroupRulesCmd command = new SecurityGroupRulesCmd(guestIp, guestMac, vmName, vmId, signature, seqNum, ingressRuleSet, egressRuleSet, secIps); + final SecurityGroupRulesCmd command = new SecurityGroupRulesCmd(guestIp, guestIp6, guestMac, vmName, vmId, signature, seqNum, ingressRuleSet, egressRuleSet, secIps); final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class); final Connect conn = Mockito.mock(Connect.class); @@ -2953,6 +2975,7 @@ public void testSecurityGroupRulesCmdFalse() { @Test public void testSecurityGroupRulesCmdTrue() { final String guestIp = "127.0.0.1"; + final String guestIp6 = "2001:db8::cad:40ff:fefd:75c4"; final String guestMac = "00:00:00:00"; final String vmName = "Test"; final Long vmId = 1l; @@ -2964,7 +2987,7 @@ public void testSecurityGroupRulesCmdTrue() { final List cidrs = new Vector(); cidrs.add("0.0.0.0/0"); - final SecurityGroupRulesCmd command = new SecurityGroupRulesCmd(guestIp, guestMac, vmName, vmId, signature, seqNum, ingressRuleSet, egressRuleSet, secIps); + final SecurityGroupRulesCmd command = new SecurityGroupRulesCmd(guestIp, guestIp6, guestMac, vmName, vmId, signature, seqNum, ingressRuleSet, egressRuleSet, secIps); final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class); final Connect conn = Mockito.mock(Connect.class); @@ -2997,7 +3020,7 @@ public void testSecurityGroupRulesCmdTrue() { when(egressRuleSet[0].getEndPort()).thenReturn(22); when(egressRuleSet[0].getAllowedCidrs()).thenReturn(cidrs); - when(libvirtComputingResource.addNetworkRules(command.getVmName(), Long.toString(command.getVmId()), command.getGuestIp(), command.getSignature(), + when(libvirtComputingResource.addNetworkRules(command.getVmName(), Long.toString(command.getVmId()), command.getGuestIp(), command.getGuestIp6(), command.getSignature(), Long.toString(command.getSeqNum()), command.getGuestMac(), command.stringifyRules(), vif, brname, command.getSecIpsString())).thenReturn(true); final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); @@ -3018,6 +3041,7 @@ public void testSecurityGroupRulesCmdTrue() { @Test public void testSecurityGroupRulesCmdException() { final String guestIp = "127.0.0.1"; + final String guestIp6 = "2001:db8::cad:40ff:fefd:75c4"; final String guestMac = "00:00:00:00"; final String vmName = "Test"; final Long vmId = 1l; @@ -3027,7 +3051,7 @@ public void testSecurityGroupRulesCmdException() { final IpPortAndProto[] egressRuleSet = new IpPortAndProto[]{Mockito.mock(IpPortAndProto.class)}; final List secIps = new Vector(); - final SecurityGroupRulesCmd command = new SecurityGroupRulesCmd(guestIp, guestMac, vmName, vmId, signature, seqNum, ingressRuleSet, egressRuleSet, secIps); + final SecurityGroupRulesCmd command = new SecurityGroupRulesCmd(guestIp, guestIp6, guestMac, vmName, vmId, signature, seqNum, ingressRuleSet, egressRuleSet, secIps); final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class); final Connect conn = Mockito.mock(Connect.class); @@ -3131,12 +3155,13 @@ public void testPlugNicCommandNoMatchMack() { when(intDef.getMacAddress()).thenReturn("00:00:00:00"); when(nic.getMac()).thenReturn("00:00:00:01"); + when(nic.getName()).thenReturn("br0"); try { when(libvirtUtilitiesHelper.getConnectionByVmName(command.getVmName())).thenReturn(conn); when(libvirtComputingResource.getDomain(conn, instanceName)).thenReturn(vm); - when(libvirtComputingResource.getVifDriver(nic.getType())).thenReturn(vifDriver); + when(libvirtComputingResource.getVifDriver(nic.getType(), nic.getName())).thenReturn(vifDriver); when(vifDriver.plug(nic, "Other PV", "")).thenReturn(interfaceDef); when(interfaceDef.toString()).thenReturn("Interface"); @@ -3160,7 +3185,7 @@ public void testPlugNicCommandNoMatchMack() { try { verify(libvirtUtilitiesHelper, times(1)).getConnectionByVmName(command.getVmName()); verify(libvirtComputingResource, times(1)).getDomain(conn, instanceName); - verify(libvirtComputingResource, times(1)).getVifDriver(nic.getType()); + verify(libvirtComputingResource, times(1)).getVifDriver(nic.getType(), nic.getName()); verify(vifDriver, times(1)).plug(nic, "Other PV", ""); } catch (final LibvirtException e) { fail(e.getMessage()); @@ -3233,7 +3258,7 @@ public void testPlugNicCommandInternalError() { when(libvirtUtilitiesHelper.getConnectionByVmName(command.getVmName())).thenReturn(conn); when(libvirtComputingResource.getDomain(conn, instanceName)).thenReturn(vm); - when(libvirtComputingResource.getVifDriver(nic.getType())).thenReturn(vifDriver); + when(libvirtComputingResource.getVifDriver(nic.getType(), nic.getName())).thenReturn(vifDriver); when(vifDriver.plug(nic, "Other PV", "")).thenThrow(InternalErrorException.class); @@ -3253,7 +3278,7 @@ public void testPlugNicCommandInternalError() { try { verify(libvirtUtilitiesHelper, times(1)).getConnectionByVmName(command.getVmName()); verify(libvirtComputingResource, times(1)).getDomain(conn, instanceName); - verify(libvirtComputingResource, times(1)).getVifDriver(nic.getType()); + verify(libvirtComputingResource, times(1)).getVifDriver(nic.getType(), nic.getName()); verify(vifDriver, times(1)).plug(nic, "Other PV", ""); } catch (final LibvirtException e) { fail(e.getMessage()); @@ -4838,6 +4863,7 @@ public void testStartCommand() { final NicTO nic = Mockito.mock(NicTO.class); final NicTO[] nics = new NicTO[]{nic}; + final int[] vms = new int[0]; final String vmName = "Test"; final String controlIp = "127.0.0.1"; @@ -4851,6 +4877,7 @@ public void testStartCommand() { when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper); try { when(libvirtUtilitiesHelper.getConnectionByType(vmDef.getHvsType())).thenReturn(conn); + when(conn.listDomains()).thenReturn(vms); doNothing().when(libvirtComputingResource).createVbd(conn, vmSpec, vmName, vmDef); } catch (final LibvirtException e) { fail(e.getMessage()); @@ -4910,6 +4937,7 @@ public void testStartCommandIsolationEc2() { final NicTO nic = Mockito.mock(NicTO.class); final NicTO[] nics = new NicTO[]{nic}; + final int[] vms = new int[0]; final String vmName = "Test"; final String controlIp = "127.0.0.1"; @@ -4923,6 +4951,7 @@ public void testStartCommandIsolationEc2() { when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper); try { when(libvirtUtilitiesHelper.getConnectionByType(vmDef.getHvsType())).thenReturn(conn); + when(conn.listDomains()).thenReturn(vms); doNothing().when(libvirtComputingResource).createVbd(conn, vmSpec, vmName, vmDef); } catch (final LibvirtException e) { fail(e.getMessage()); @@ -4972,6 +5001,61 @@ public void testStartCommandIsolationEc2() { } } + @Test + public void testStartCommandHostMemory() { + final VirtualMachineTO vmSpec = Mockito.mock(VirtualMachineTO.class); + final com.cloud.host.Host host = Mockito.mock(com.cloud.host.Host.class); + final boolean executeInSequence = false; + + final StartCommand command = new StartCommand(vmSpec, host, executeInSequence); + + final KVMStoragePoolManager storagePoolMgr = Mockito.mock(KVMStoragePoolManager.class); + final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class); + final Connect conn = Mockito.mock(Connect.class); + final LibvirtVMDef vmDef = Mockito.mock(LibvirtVMDef.class); + + final NicTO nic = Mockito.mock(NicTO.class); + final NicTO[] nics = new NicTO[]{nic}; + int vmId = 1; + final int[] vms = new int[]{vmId}; + final Domain dm = Mockito.mock(Domain.class); + + final String vmName = "Test"; + + when(libvirtComputingResource.getStoragePoolMgr()).thenReturn(storagePoolMgr); + when(vmSpec.getNics()).thenReturn(nics); + when(vmSpec.getType()).thenReturn(VirtualMachine.Type.User); + when(vmSpec.getName()).thenReturn(vmName); + when(vmSpec.getMaxRam()).thenReturn(512L); + when(libvirtComputingResource.createVMFromSpec(vmSpec)).thenReturn(vmDef); + + when(libvirtComputingResource.getLibvirtUtilitiesHelper()).thenReturn(libvirtUtilitiesHelper); + try { + when(libvirtUtilitiesHelper.getConnectionByType(vmDef.getHvsType())).thenReturn(conn); + when(conn.listDomains()).thenReturn(vms); + when(conn.domainLookupByID(vmId)).thenReturn(dm); + when(dm.getMaxMemory()).thenReturn(1024L); + when(dm.getName()).thenReturn(vmName); + when(libvirtComputingResource.getTotalMemory()).thenReturn(2048*1024L); + doNothing().when(libvirtComputingResource).createVbd(conn, vmSpec, vmName, vmDef); + } catch (final LibvirtException e) { + fail(e.getMessage()); + } catch (final InternalErrorException e) { + fail(e.getMessage()); + } catch (final URISyntaxException e) { + fail(e.getMessage()); + } + + when(storagePoolMgr.connectPhysicalDisksViaVmSpec(vmSpec)).thenReturn(true); + + final LibvirtRequestWrapper wrapper = LibvirtRequestWrapper.getInstance(); + assertNotNull(wrapper); + + final Answer answer = wrapper.execute(command, libvirtComputingResource); + assertTrue(answer.getResult()); + } + + @Test public void testUpdateHostPasswordCommand() { final LibvirtUtilitiesHelper libvirtUtilitiesHelper = Mockito.mock(LibvirtUtilitiesHelper.class); @@ -5071,4 +5155,40 @@ private Domain getDomainConfiguredToReturnMemoryStatistic(MemoryStatistic[] mem) when(domainMock.memoryStats(2)).thenReturn(mem); return domainMock; } + + @Test + public void testSetQuotaAndPeriod() { + double pct = 0.33d; + Mockito.when(vmTO.getLimitCpuUse()).thenReturn(true); + Mockito.when(vmTO.getCpuQuotaPercentage()).thenReturn(pct); + CpuTuneDef cpuTuneDef = new CpuTuneDef(); + final LibvirtComputingResource lcr = new LibvirtComputingResource(); + lcr.setQuotaAndPeriod(vmTO, cpuTuneDef); + Assert.assertEquals((int) (CpuTuneDef.DEFAULT_PERIOD * pct), cpuTuneDef.getQuota()); + Assert.assertEquals(CpuTuneDef.DEFAULT_PERIOD, cpuTuneDef.getPeriod()); + } + + @Test + public void testSetQuotaAndPeriodNoCpuLimitUse() { + double pct = 0.33d; + Mockito.when(vmTO.getLimitCpuUse()).thenReturn(false); + Mockito.when(vmTO.getCpuQuotaPercentage()).thenReturn(pct); + CpuTuneDef cpuTuneDef = new CpuTuneDef(); + final LibvirtComputingResource lcr = new LibvirtComputingResource(); + lcr.setQuotaAndPeriod(vmTO, cpuTuneDef); + Assert.assertEquals(0, cpuTuneDef.getQuota()); + Assert.assertEquals(0, cpuTuneDef.getPeriod()); + } + + @Test + public void testSetQuotaAndPeriodMinQuota() { + double pct = 0.01d; + Mockito.when(vmTO.getLimitCpuUse()).thenReturn(true); + Mockito.when(vmTO.getCpuQuotaPercentage()).thenReturn(pct); + CpuTuneDef cpuTuneDef = new CpuTuneDef(); + final LibvirtComputingResource lcr = new LibvirtComputingResource(); + lcr.setQuotaAndPeriod(vmTO, cpuTuneDef); + Assert.assertEquals(CpuTuneDef.MIN_QUOTA, cpuTuneDef.getQuota()); + Assert.assertEquals((int) (CpuTuneDef.MIN_QUOTA / pct), cpuTuneDef.getPeriod()); + } } diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java index eb28d8b9d9f6..9197013af20b 100644 --- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtDomainXMLParserTest.java @@ -19,10 +19,16 @@ package com.cloud.hypervisor.kvm.resource; -import junit.framework.TestCase; +import java.io.File; import java.util.List; + +import junit.framework.TestCase; + +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.RngDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.WatchDogDef; public class LibvirtDomainXMLParserTest extends TestCase { @@ -38,6 +44,13 @@ public void testDomainXMLParser() { InterfaceDef.NicModel ifModel = InterfaceDef.NicModel.VIRTIO; InterfaceDef.GuestNetType ifType = InterfaceDef.GuestNetType.BRIDGE; + ChannelDef.ChannelType channelType = ChannelDef.ChannelType.UNIX; + ChannelDef.ChannelState channelState = ChannelDef.ChannelState.DISCONNECTED; + String ssvmAgentPath = "/var/lib/libvirt/qemu/s-2970-VM.agent"; + String ssvmAgentName = "s-2970-VM.vport"; + String guestAgentPath = "/var/lib/libvirt/qemu/guest-agent.org.qemu.guest_agent.0"; + String guestAgentName = "org.qemu.guest_agent.0"; + String diskLabel ="vda"; String diskPath = "/var/lib/libvirt/images/my-test-image.qcow2"; @@ -144,7 +157,7 @@ public void testDomainXMLParser() { "" + "" + "" + - "" + + "" + "" + "
" + "" + @@ -164,6 +177,17 @@ public void testDomainXMLParser() { "" + "
" + "" + + "" + + "" + + "/dev/random" + + "" + + "" + + "" + + "" + + "" + + "
" + + "" + + "" + "" + "" + ""; @@ -185,10 +209,37 @@ public void testDomainXMLParser() { assertEquals(deviceType, disks.get(diskId).getDeviceType()); assertEquals(diskFormat, disks.get(diskId).getDiskFormatType()); + List channels = parser.getChannels(); + for (int i = 0; i < channels.size(); i++) { + assertEquals(channelType, channels.get(i).getChannelType()); + assertEquals(channelType, channels.get(i).getChannelType()); + } + + /* SSVM provisioning port/channel */ + assertEquals(channelState, channels.get(0).getChannelState()); + assertEquals(new File(ssvmAgentPath), channels.get(0).getPath()); + assertEquals(ssvmAgentName, channels.get(0).getName()); + + /* Qemu Guest Agent port/channel */ + assertEquals(new File(guestAgentPath), channels.get(1).getPath()); + assertEquals(guestAgentName, channels.get(1).getName()); + List ifs = parser.getInterfaces(); for (int i = 0; i < ifs.size(); i++) { assertEquals(ifModel, ifs.get(i).getModel()); assertEquals(ifType, ifs.get(i).getNetType()); + assertEquals(Integer.valueOf(i + 3), ifs.get(i).getSlot()); + assertEquals("vnet" + i, ifs.get(i).getDevName()); } + + List rngs = parser.getRngs(); + assertEquals("/dev/random", rngs.get(0).getPath()); + assertEquals(RngDef.RngBackendModel.RANDOM, rngs.get(0).getRngBackendModel()); + assertEquals(4096, rngs.get(0).getRngRateBytes()); + assertEquals(5000, rngs.get(0).getRngRatePeriod()); + + List watchDogs = parser.getWatchDogs(); + assertEquals(WatchDogDef.WatchDogModel.I6300ESB, watchDogs.get(0).getModel()); + assertEquals(WatchDogDef.WatchDogAction.RESET, watchDogs.get(0).getAction()); } -} \ No newline at end of file +} diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java index a9261291a028..b391b94e7406 100644 --- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/LibvirtVMDefTest.java @@ -19,8 +19,13 @@ package com.cloud.hypervisor.kvm.resource; +import java.io.File; + import junit.framework.TestCase; + +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.ChannelDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.DiskDef; +import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.SCSIDef; import com.cloud.utils.Pair; public class LibvirtVMDefTest extends TestCase { @@ -30,8 +35,12 @@ public void testInterfaceEtehrnet() { ifDef.defEthernet("targetDeviceName", "00:11:22:aa:bb:dd", LibvirtVMDef.InterfaceDef.NicModel.VIRTIO); String expected = - "\n" + "\n" + "\n" + "\n" - + "\n"; + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n"; assertEquals(expected, ifDef.toString()); } @@ -41,8 +50,44 @@ public void testInterfaceDirectNet() { ifDef.defDirectNet("targetDeviceName", null, "00:11:22:aa:bb:dd", LibvirtVMDef.InterfaceDef.NicModel.VIRTIO, "private"); String expected = - "\n" + "\n" + - "\n" + "\n" + "\n"; + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n"; + + assertEquals(expected, ifDef.toString()); + } + + public void testInterfaceBridgeSlot() { + LibvirtVMDef.InterfaceDef ifDef = new LibvirtVMDef.InterfaceDef(); + ifDef.defBridgeNet("targetDeviceName", null, "00:11:22:aa:bb:dd", LibvirtVMDef.InterfaceDef.NicModel.VIRTIO); + ifDef.setSlot(16); + + String expected = + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
\n" + + "\n"; + + assertEquals(expected, ifDef.toString()); + + ifDef.setLinkStateUp(false); + ifDef.setDevName("vnet11"); + + expected = + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "\n" + + "
\n" + + "\n"; assertEquals(expected, ifDef.toString()); } @@ -118,4 +163,67 @@ public void testHypervEnlightDef() { assertTrue((hostOsVersion.first() == 6 && hostOsVersion.second() >= 5) || (hostOsVersion.first() >= 7)); } + public void testRngDef() { + LibvirtVMDef.RngDef.RngBackendModel backendModel = LibvirtVMDef.RngDef.RngBackendModel.RANDOM; + String path = "/dev/random"; + int period = 2000; + int bytes = 2048; + + LibvirtVMDef.RngDef def = new LibvirtVMDef.RngDef(path, backendModel, bytes, period); + assertEquals(def.getPath(), path); + assertEquals(def.getRngBackendModel(), backendModel); + assertEquals(def.getRngModel(), LibvirtVMDef.RngDef.RngModel.VIRTIO); + assertEquals(def.getRngRateBytes(), bytes); + assertEquals(def.getRngRatePeriod(), period); + } + + public void testChannelDef() { + ChannelDef.ChannelType type = ChannelDef.ChannelType.UNIX; + ChannelDef.ChannelState state = ChannelDef.ChannelState.CONNECTED; + String name = "v-136-VM.vport"; + File path = new File("/var/lib/libvirt/qemu/" + name); + + ChannelDef channelDef = new ChannelDef(name, type, state, path); + + assertEquals(state, channelDef.getChannelState()); + assertEquals(type, channelDef.getChannelType()); + assertEquals(name, channelDef.getName()); + assertEquals(path, channelDef.getPath()); + } + + public void testWatchDogDef() { + LibvirtVMDef.WatchDogDef.WatchDogModel model = LibvirtVMDef.WatchDogDef.WatchDogModel.I6300ESB; + LibvirtVMDef.WatchDogDef.WatchDogAction action = LibvirtVMDef.WatchDogDef.WatchDogAction.RESET; + + LibvirtVMDef.WatchDogDef def = new LibvirtVMDef.WatchDogDef(action, model); + assertEquals(def.getModel(), model); + assertEquals(def.getAction(), action); + } + + public void testSCSIDef() { + SCSIDef def = new SCSIDef(); + String str = def.toString(); + String expected = "\n" + + "
\n" + + "\n"; + assertEquals(str, expected); + } + + public void testMetadataDef() { + LibvirtVMDef.MetadataDef metadataDef = new LibvirtVMDef.MetadataDef(); + + metadataDef.getMetadataNode(LibvirtVMDef.NuageExtensionDef.class).addNuageExtension("mac1", "ip1"); + metadataDef.getMetadataNode(LibvirtVMDef.NuageExtensionDef.class).addNuageExtension("mac2", "ip2"); + + String xmlDef = metadataDef.toString(); + String expectedXml = "\n" + + "\n" + + " \n" + + " \n" + + "\n" + + "\n"; + + assertEquals(xmlDef, expectedXml); + } + } diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java index ed13cb25f0c8..da71e40c30f0 100644 --- a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtMigrateCommandWrapperTest.java @@ -18,10 +18,14 @@ // package com.cloud.hypervisor.kvm.resource.wrapper; +import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import org.junit.Test; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.utils.exception.CloudRuntimeException; + public class LibvirtMigrateCommandWrapperTest { String fullfile = "\n" + @@ -303,4 +307,22 @@ public void testReplaceFqdnForVNCInDesc() { final String result = lw.replaceIpForVNCInDescFile(xmlDesc, targetIp); assertTrue("transformation does not live up to expectation:\n" + result, expectedXmlDesc.equals(result)); } + + @Test + public void testMigrationUri() { + final String ip = "10.1.1.1"; + LibvirtMigrateCommandWrapper lw = new LibvirtMigrateCommandWrapper(); + LibvirtComputingResource lcr = new LibvirtComputingResource(); + if (lcr.isHostSecured()) { + assertEquals(lw.createMigrationURI(ip, lcr), String.format("qemu+tls://%s/system", ip)); + } else { + assertEquals(lw.createMigrationURI(ip, lcr), String.format("qemu+tcp://%s/system", ip)); + } + } + + @Test(expected = CloudRuntimeException.class) + public void testMigrationUriException() { + LibvirtMigrateCommandWrapper lw = new LibvirtMigrateCommandWrapper(); + lw.createMigrationURI(null, new LibvirtComputingResource()); + } } diff --git a/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapperTest.java b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapperTest.java new file mode 100644 index 000000000000..86e455be2712 --- /dev/null +++ b/plugins/hypervisors/kvm/test/com/cloud/hypervisor/kvm/resource/wrapper/LibvirtReplugNicCommandWrapperTest.java @@ -0,0 +1,274 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// with the License. You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, +// software distributed under the License is distributed on an +// "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +// KIND, either express or implied. See the License for the +// specific language governing permissions and limitations +// under the License. +package com.cloud.hypervisor.kvm.resource.wrapper; + +import static org.mockito.AdditionalMatchers.not; +import static org.mockito.Matchers.anyString; +import static org.mockito.Matchers.eq; +import static org.mockito.Mockito.doNothing; +import static org.mockito.Mockito.doReturn; +import static org.mockito.Mockito.mock; +import static org.mockito.Mockito.spy; +import static org.mockito.Mockito.verify; +import static org.mockito.Mockito.when; + +import java.util.Arrays; +import java.util.HashMap; +import java.util.Map; + +import javax.naming.ConfigurationException; + +import org.junit.Before; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.libvirt.Connect; +import org.libvirt.Domain; +import org.libvirt.LibvirtException; +import org.mockito.BDDMockito; +import org.powermock.api.mockito.PowerMockito; +import org.powermock.core.classloader.annotations.PrepareForTest; +import org.powermock.modules.junit4.PowerMockRunner; + +import com.cloud.agent.api.Answer; +import com.cloud.agent.api.ReplugNicCommand; +import com.cloud.agent.api.to.NicTO; +import com.cloud.hypervisor.kvm.resource.BridgeVifDriver; +import com.cloud.hypervisor.kvm.resource.LibvirtComputingResource; +import com.cloud.hypervisor.kvm.resource.OvsVifDriver; +import com.cloud.network.Networks; +import com.cloud.utils.script.Script; +import com.cloud.vm.VirtualMachine; +@RunWith(PowerMockRunner.class) +@PrepareForTest(Script.class) +public class LibvirtReplugNicCommandWrapperTest { + private static final String part_1 = + "\n" + + " i-85-285-VM\n" + + " 8825b180-468f-4227-beb7-6b06fd342116\n" + + " CentOS 5.5 (64-bit)\n" + + " 262144\n" + + " 262144\n" + + " 1\n" + + " \n" + + " 256\n" + + " \n" + + " \n" + + " \n" + + " Apache Software Foundation\n" + + " CloudStack KVM Hypervisor\n" + + " 8825b180-468f-4227-beb7-6b06fd342116\n" + + " \n" + + " \n" + + " \n" + + " hvm\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " destroy\n" + + " restart\n" + + " destroy\n" + + " \n" + + " /usr/libexec/qemu-kvm\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " 0c4aae6926524a04b460\n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n"; + private static final String part_2 = + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n"; + private static final String part_3 = + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "
\n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + " \n" + + "