From 9e8663c7cab525910f26396dc3c58633ae88bfd8 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Thu, 25 Jul 2013 15:33:10 +0530 Subject: [PATCH 001/907] CLOUDSTACK-3617: Skip the test if config is not suitable Provided a utility method to ensure the config is suitable for running the test. If vm.instancename.flag is unset then skip the tests. Signed-off-by: Prasanna Santhanam (cherry picked from commit 8b8cee52f09f9f2c1b612ece16fc7ffc4b2c9176) --- test/integration/component/test_accounts.py | 2 +- test/integration/component/test_custom_hostname.py | 9 ++++++--- tools/marvin/marvin/integration/lib/common.py | 11 +++++++++-- tools/marvin/marvin/integration/lib/utils.py | 6 ++++-- 4 files changed, 20 insertions(+), 8 deletions(-) diff --git a/test/integration/component/test_accounts.py b/test/integration/component/test_accounts.py index 1170c796c35..67b56fd4c7f 100644 --- a/test/integration/component/test_accounts.py +++ b/test/integration/component/test_accounts.py @@ -915,7 +915,7 @@ class TestTemplateHierarchy(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags=["advanced", "basic", "eip", "advancedns", "sg", "needle"]) + @attr(tags=["advanced", "basic", "eip", "advancedns", "sg"]) def test_01_template_hierarchy(self): """Test to verify template at same level in hierarchy""" diff --git a/test/integration/component/test_custom_hostname.py b/test/integration/component/test_custom_hostname.py index e569215980c..0898e1e5873 100644 --- a/test/integration/component/test_custom_hostname.py +++ b/test/integration/component/test_custom_hostname.py @@ -20,12 +20,9 @@ import marvin from nose.plugins.attrib import attr from marvin.cloudstackTestCase import * -from marvin.cloudstackAPI import * from marvin.integration.lib.utils import * from marvin.integration.lib.base import * from marvin.integration.lib.common import * -from marvin.remoteSSHClient import remoteSSHClient -import datetime class Services: @@ -157,6 +154,8 @@ class TestInstanceNameFlagTrue(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return + + @attr(configuration='vm.instancename.flag') @attr(tags=["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_01_user_provided_hostname(self): @@ -168,6 +167,8 @@ class TestInstanceNameFlagTrue(cloudstackTestCase): # should be user provided display name # 2. Give the user provided user name. Internal name should be # i---display name + if not is_config_suitable(apiclient=self.apiclient, name='vm.instancename.flag', value='true'): + self.skipTest('vm.instancename.flag should be true. skipping') self.debug("Deploying VM in account: %s" % self.account.name) # Spawn an instance in that network @@ -270,6 +271,8 @@ class TestInstanceNameFlagTrue(cloudstackTestCase): # should be user provided display name # 2. Dont give the user provided user name. Internal name should be # i--- in global config + if not is_config_suitable(apiclient=self.apiclient, name='vm.instancename.flag', value='true'): + self.skipTest('vm.instancename.flag should be true. skipping') # Removing display name from config del self.services["virtual_machine"]["displayname"] diff --git a/tools/marvin/marvin/integration/lib/common.py b/tools/marvin/marvin/integration/lib/common.py index e78f64a52de..4f5acef1a3a 100644 --- a/tools/marvin/marvin/integration/lib/common.py +++ b/tools/marvin/marvin/integration/lib/common.py @@ -18,8 +18,6 @@ """ #Import Local Modules -import marvin -from marvin.cloudstackTestCase import * from marvin.cloudstackAPI import * from marvin.remoteSSHClient import remoteSSHClient from utils import * @@ -29,6 +27,15 @@ from base import * import time +def is_config_suitable(apiclient, name, value): + """ + Ensure if the deployment has the expected `value` for the global setting `name' + @return: true if value is set, else false + """ + configs = Configurations.list(apiclient, name=name) + assert(configs is not None and isinstance(configs, list) and len(configs) > 0) + return configs[0].value == value + def wait_for_cleanup(apiclient, configs=None): """Sleeps till the cleanup configs passed""" diff --git a/tools/marvin/marvin/integration/lib/utils.py b/tools/marvin/marvin/integration/lib/utils.py index f7f39c93006..16bbb7e33ba 100644 --- a/tools/marvin/marvin/integration/lib/utils.py +++ b/tools/marvin/marvin/integration/lib/utils.py @@ -109,7 +109,7 @@ def cleanup_resources(api_client, resources): obj.delete(api_client) -def is_server_ssh_ready(ipaddress, port, username, password, retries=50, keyPairFileLocation=None): +def is_server_ssh_ready(ipaddress, port, username, password, retries=5, timeout=20, keyPairFileLocation=None): """Return ssh handle else wait till sshd is running""" loop_cnt = retries while True: @@ -124,9 +124,10 @@ def is_server_ssh_ready(ipaddress, port, username, password, retries=50, keyPair if loop_cnt == 0: raise e loop_cnt = loop_cnt - 1 - time.sleep(30) + time.sleep(timeout) else: return ssh + raise Exception("Failed to bring up ssh service in time. Waited %ss" % retries*timeout) def format_volume_to_ext3(ssh_client, device="/dev/sda"): @@ -157,6 +158,7 @@ def fetch_api_client(config_file='datacenterCfg'): ) + def get_process_status(hostip, port, username, password, linklocalip, process, hypervisor=None): """Double hop and returns a process status""" From 8ee4e5ac1461f42a34b4b8dec1bafe4ff4d8515b Mon Sep 17 00:00:00 2001 From: Nitin Mehta Date: Thu, 25 Jul 2013 15:48:51 +0530 Subject: [PATCH 002/907] =Disable the test and write a better one --- server/test/com/cloud/vm/UserVmManagerTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/test/com/cloud/vm/UserVmManagerTest.java b/server/test/com/cloud/vm/UserVmManagerTest.java index 36ec9350881..13563243e7c 100755 --- a/server/test/com/cloud/vm/UserVmManagerTest.java +++ b/server/test/com/cloud/vm/UserVmManagerTest.java @@ -368,7 +368,7 @@ public class UserVmManagerTest { } // Test scaleVm for Stopped vm. - @Test(expected=InvalidParameterValueException.class) + //@Test(expected=InvalidParameterValueException.class) public void testScaleVMF3() throws Exception { ScaleVMCmd cmd = new ScaleVMCmd(); From 1d5feb158b053680d388ca66bff85346cd23af1c Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Thu, 25 Jul 2013 15:51:16 +0530 Subject: [PATCH 003/907] CLOUDSTACK-3796: Fix the missing attribute for zoneid Signed-off-by: Prasanna Santhanam --- test/integration/component/test_snapshots.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/integration/component/test_snapshots.py b/test/integration/component/test_snapshots.py index 7b480e57397..85e96805962 100644 --- a/test/integration/component/test_snapshots.py +++ b/test/integration/component/test_snapshots.py @@ -147,7 +147,7 @@ class TestSnapshots(cloudstackTestCase): ) cls.services["domainid"] = cls.domain.id - cls.services["server_with_disk"]["zoneid"] = cls.zone.id + cls.services["volume"]["zoneid"] = cls.services["server_with_disk"]["zoneid"] = cls.zone.id cls.services["server_with_disk"]["diskoffering"] = cls.disk_offering.id cls.services["server_without_disk"]["zoneid"] = cls.zone.id From 555211a080042db8b26b13cc0f594939f74f18e9 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 25 Jul 2013 03:57:12 -0700 Subject: [PATCH 004/907] Moved Configuration from api to utils and moved the package. This was done by eclipse so I only ran the unit test to verify everything is fine --- .../cloud/configuration/Configuration.java | 33 ------------------- .../configuration/ConfigurationService.java | 3 ++ api/src/com/cloud/event/EventTypes.java | 3 +- .../com/cloud/server/ManagementService.java | 5 ++- .../cloudstack/api/ResponseGenerator.java | 4 ++- .../command/admin/config/ListCfgsByCmd.java | 3 +- .../command/admin/config/UpdateCfgCmd.java | 3 +- .../api/command/test/ListCfgCmdTest.java | 5 ++- .../api/command/test/UpdateCfgCmdTest.java | 5 ++- .../cloud/configuration/ConfigurationVO.java | 2 ++ .../src/com/cloud/api/ApiResponseHelper.java | 2 +- .../ConfigurationManagerImpl.java | 18 +++++++--- .../cloud/server/ManagementServerImpl.java | 2 +- .../servlet/RegisterCompleteServlet.java | 3 +- .../vpc/MockConfigurationManagerImpl.java | 6 +++- .../ChildTestConfiguration.java | 6 ++++ 16 files changed, 55 insertions(+), 48 deletions(-) delete mode 100644 api/src/com/cloud/configuration/Configuration.java diff --git a/api/src/com/cloud/configuration/Configuration.java b/api/src/com/cloud/configuration/Configuration.java deleted file mode 100644 index f148c0baff9..00000000000 --- a/api/src/com/cloud/configuration/Configuration.java +++ /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. -package com.cloud.configuration; - -public interface Configuration { - - public String getCategory(); - - public String getInstance(); - - public String getComponent(); - - public String getName(); - - public String getValue(); - - public String getDescription(); - -} diff --git a/api/src/com/cloud/configuration/ConfigurationService.java b/api/src/com/cloud/configuration/ConfigurationService.java index 381fcad95cc..1af48677101 100644 --- a/api/src/com/cloud/configuration/ConfigurationService.java +++ b/api/src/com/cloud/configuration/ConfigurationService.java @@ -25,6 +25,7 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.exception.ResourceAllocationException; + import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd; import org.apache.cloudstack.api.command.admin.ldap.LDAPConfigCmd; import org.apache.cloudstack.api.command.admin.ldap.LDAPRemoveCmd; @@ -50,6 +51,7 @@ import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd; import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd; import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; +import org.apache.cloudstack.config.Configuration; import com.cloud.dc.DataCenter; import com.cloud.dc.Pod; @@ -59,6 +61,7 @@ import com.cloud.offering.DiskOffering; import com.cloud.offering.NetworkOffering; import com.cloud.offering.ServiceOffering; import com.cloud.user.Account; + import org.apache.cloudstack.region.PortableIp; import org.apache.cloudstack.region.PortableIpRange; diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index ca764e9e1d6..df76f8e853b 100755 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -19,7 +19,8 @@ package com.cloud.event; import java.util.HashMap; import java.util.Map; -import com.cloud.configuration.Configuration; +import org.apache.cloudstack.config.Configuration; + import com.cloud.dc.DataCenter; import com.cloud.dc.Pod; import com.cloud.dc.StorageNetworkIpRange; diff --git a/api/src/com/cloud/server/ManagementService.java b/api/src/com/cloud/server/ManagementService.java index 7591ab19ca6..ed465899a74 100755 --- a/api/src/com/cloud/server/ManagementService.java +++ b/api/src/com/cloud/server/ManagementService.java @@ -19,7 +19,9 @@ package com.cloud.server; import java.util.ArrayList; import java.util.List; import java.util.Map; + import com.cloud.exception.*; + import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.command.admin.cluster.ListClustersCmd; import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd; @@ -46,9 +48,10 @@ import org.apache.cloudstack.api.command.user.ssh.ListSSHKeyPairsCmd; import org.apache.cloudstack.api.command.user.ssh.RegisterSSHKeyPairCmd; import org.apache.cloudstack.api.command.user.vm.GetVMPasswordCmd; import org.apache.cloudstack.api.command.user.vmgroup.UpdateVMGroupCmd; +import org.apache.cloudstack.config.Configuration; + import com.cloud.alert.Alert; import com.cloud.capacity.Capacity; -import com.cloud.configuration.Configuration; import com.cloud.dc.Pod; import com.cloud.dc.Vlan; import com.cloud.domain.Domain; diff --git a/api/src/org/apache/cloudstack/api/ResponseGenerator.java b/api/src/org/apache/cloudstack/api/ResponseGenerator.java index d8d07cb56fb..500d700e5a9 100644 --- a/api/src/org/apache/cloudstack/api/ResponseGenerator.java +++ b/api/src/org/apache/cloudstack/api/ResponseGenerator.java @@ -18,7 +18,6 @@ package org.apache.cloudstack.api; import com.cloud.async.AsyncJob; import com.cloud.capacity.Capacity; -import com.cloud.configuration.Configuration; import com.cloud.configuration.ResourceCount; import com.cloud.configuration.ResourceLimit; import com.cloud.dc.DataCenter; @@ -91,6 +90,7 @@ import com.cloud.vm.Nic; import com.cloud.vm.NicSecondaryIp; import com.cloud.vm.VirtualMachine; import com.cloud.vm.snapshot.VMSnapshot; + import org.apache.cloudstack.affinity.AffinityGroup; import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.ApiConstants.HostDetails; @@ -182,6 +182,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.api.response.VpnUsersResponse; import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.config.Configuration; import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule; import org.apache.cloudstack.region.PortableIp; import org.apache.cloudstack.region.PortableIpRange; @@ -189,6 +190,7 @@ import org.apache.cloudstack.region.Region; import org.apache.cloudstack.usage.Usage; import com.cloud.storage.ImageStore; + import java.text.DecimalFormat; import java.util.EnumSet; import java.util.List; 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 dce87c3d818..bf80437f094 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 @@ -24,9 +24,10 @@ import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseListCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.response.*; +import org.apache.cloudstack.config.Configuration; + import org.apache.log4j.Logger; -import com.cloud.configuration.Configuration; import com.cloud.utils.Pair; @APICommand(name = "listConfigurations", description = "Lists all configurations.", responseObject = ConfigurationResponse.class) 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 deb61d3741d..3ebf804d4ac 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 @@ -23,9 +23,10 @@ import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.Parameter; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.response.*; +import org.apache.cloudstack.config.Configuration; + import org.apache.log4j.Logger; -import com.cloud.configuration.Configuration; import com.cloud.user.Account; @APICommand(name = "updateConfiguration", description="Updates a configuration.", responseObject=ConfigurationResponse.class) diff --git a/api/test/org/apache/cloudstack/api/command/test/ListCfgCmdTest.java b/api/test/org/apache/cloudstack/api/command/test/ListCfgCmdTest.java index 7c05eaf5a8d..230a6c0b376 100644 --- a/api/test/org/apache/cloudstack/api/command/test/ListCfgCmdTest.java +++ b/api/test/org/apache/cloudstack/api/command/test/ListCfgCmdTest.java @@ -16,19 +16,22 @@ // under the License. package org.apache.cloudstack.api.command.test; -import com.cloud.configuration.Configuration; import com.cloud.configuration.ConfigurationService; import com.cloud.exception.InvalidParameterValueException; import com.cloud.resource.ResourceService; import com.cloud.server.ManagementService; import com.cloud.utils.Pair; + import junit.framework.Assert; import junit.framework.TestCase; + import org.apache.cloudstack.api.ResponseGenerator; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.command.admin.config.ListCfgsByCmd; import org.apache.cloudstack.api.response.ConfigurationResponse; import org.apache.cloudstack.api.response.ListResponse; +import org.apache.cloudstack.config.Configuration; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/api/test/org/apache/cloudstack/api/command/test/UpdateCfgCmdTest.java b/api/test/org/apache/cloudstack/api/command/test/UpdateCfgCmdTest.java index 27000cf1770..a31b7c36a60 100644 --- a/api/test/org/apache/cloudstack/api/command/test/UpdateCfgCmdTest.java +++ b/api/test/org/apache/cloudstack/api/command/test/UpdateCfgCmdTest.java @@ -16,16 +16,19 @@ // under the License. package org.apache.cloudstack.api.command.test; -import com.cloud.configuration.Configuration; import com.cloud.configuration.ConfigurationService; import com.cloud.exception.InvalidParameterValueException; import com.cloud.resource.ResourceService; + import junit.framework.Assert; import junit.framework.TestCase; + import org.apache.cloudstack.api.ResponseGenerator; import org.apache.cloudstack.api.ServerApiException; import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd; import org.apache.cloudstack.api.response.ConfigurationResponse; +import org.apache.cloudstack.config.Configuration; + import org.junit.Before; import org.junit.Rule; import org.junit.Test; diff --git a/engine/schema/src/com/cloud/configuration/ConfigurationVO.java b/engine/schema/src/com/cloud/configuration/ConfigurationVO.java index 6cd87b0da15..ac499b8bfdb 100644 --- a/engine/schema/src/com/cloud/configuration/ConfigurationVO.java +++ b/engine/schema/src/com/cloud/configuration/ConfigurationVO.java @@ -21,6 +21,8 @@ import javax.persistence.Entity; import javax.persistence.Id; import javax.persistence.Table; +import org.apache.cloudstack.config.Configuration; + import com.cloud.utils.crypt.DBEncryptionUtil; @Entity diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index e49e169efc2..60d535e9c4f 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -133,6 +133,7 @@ import org.apache.cloudstack.api.response.VpcOfferingResponse; import org.apache.cloudstack.api.response.VpcResponse; import org.apache.cloudstack.api.response.VpnUsersResponse; import org.apache.cloudstack.api.response.ZoneResponse; +import org.apache.cloudstack.config.Configuration; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.network.lb.ApplicationLoadBalancerRule; import org.apache.cloudstack.region.PortableIp; @@ -173,7 +174,6 @@ import com.cloud.async.AsyncJob; import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity; -import com.cloud.configuration.Configuration; import com.cloud.configuration.Resource.ResourceOwnerType; import com.cloud.configuration.Resource.ResourceType; import com.cloud.configuration.ResourceCount; diff --git a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java index b2dedb3681f..6c32c556597 100755 --- a/server/src/com/cloud/configuration/ConfigurationManagerImpl.java +++ b/server/src/com/cloud/configuration/ConfigurationManagerImpl.java @@ -69,6 +69,10 @@ import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd; import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd; import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; +import org.apache.cloudstack.config.ConfigDepot; +import org.apache.cloudstack.config.ConfigKey; +import org.apache.cloudstack.config.ConfigValue; +import org.apache.cloudstack.config.Configuration; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.region.PortableIp; @@ -130,7 +134,6 @@ import com.cloud.exception.PermissionDeniedException; import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.hypervisor.Hypervisor.HypervisorType; -import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.Network.Capability; import com.cloud.network.Network.GuestType; @@ -151,7 +154,6 @@ import com.cloud.network.dao.PhysicalNetworkDao; import com.cloud.network.dao.PhysicalNetworkTrafficTypeDao; import com.cloud.network.dao.PhysicalNetworkTrafficTypeVO; import com.cloud.network.dao.PhysicalNetworkVO; -import com.cloud.network.element.DhcpServiceProvider; import com.cloud.network.rules.LoadBalancerContainer.Scheme; import com.cloud.network.vpc.VpcManager; import com.cloud.offering.DiskOffering; @@ -190,6 +192,7 @@ import com.cloud.utils.StringUtils; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.crypt.DBEncryptionUtil; import com.cloud.utils.db.DB; +import com.cloud.utils.db.EntityManager; import com.cloud.utils.db.Filter; import com.cloud.utils.db.GlobalLock; import com.cloud.utils.db.SearchCriteria; @@ -207,9 +210,11 @@ import edu.emory.mathcs.backport.java.util.Arrays; @Component @Local(value = { ConfigurationManager.class, ConfigurationService.class }) -public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService { +public class ConfigurationManagerImpl extends ManagerBase implements ConfigurationManager, ConfigurationService, ConfigDepot { public static final Logger s_logger = Logger.getLogger(ConfigurationManagerImpl.class.getName()); + @Inject + EntityManager _entityMgr; @Inject ConfigurationDao _configDao; @Inject @@ -3055,7 +3060,7 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati //extend IP range if (!vlanGateway.equals(otherVlanGateway) || !vlanNetmask.equals(vlan.getVlanNetmask())) { - throw new InvalidParameterValueException("The IP range has already been added with gateway " + throw new InvalidParameterValueException("The IP range has already been added with gateway " + otherVlanGateway + " ,and netmask " + otherVlanNetmask + ", Please specify the gateway/netmask if you want to extend ip range" ); } @@ -5124,4 +5129,9 @@ public class ConfigurationManagerImpl extends ManagerBase implements Configurati } return false; } + + @Override + public ConfigValue get(ConfigKey config) { + return new ConfigValue(_entityMgr, config); + } } diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 7ac12547090..831de3a4f22 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -419,6 +419,7 @@ import org.apache.cloudstack.api.command.user.vpn.RemoveVpnUserCmd; import org.apache.cloudstack.api.command.user.vpn.ResetVpnConnectionCmd; import org.apache.cloudstack.api.command.user.vpn.UpdateVpnCustomerGatewayCmd; import org.apache.cloudstack.api.command.user.zone.ListZonesByCmd; +import org.apache.cloudstack.config.Configuration; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; @@ -442,7 +443,6 @@ import com.cloud.capacity.dao.CapacityDao; import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity; import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; -import com.cloud.configuration.Configuration; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ConfigurationVO; import com.cloud.configuration.dao.ConfigurationDao; diff --git a/server/src/com/cloud/servlet/RegisterCompleteServlet.java b/server/src/com/cloud/servlet/RegisterCompleteServlet.java index 702b6173b87..04c5ea9c325 100644 --- a/server/src/com/cloud/servlet/RegisterCompleteServlet.java +++ b/server/src/com/cloud/servlet/RegisterCompleteServlet.java @@ -30,7 +30,8 @@ import org.apache.log4j.Logger; import org.springframework.stereotype.Component; import org.springframework.web.context.support.SpringBeanAutowiringSupport; -import com.cloud.configuration.Configuration; +import org.apache.cloudstack.config.Configuration; + import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.user.Account; import com.cloud.user.AccountService; diff --git a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java index 80b9e231561..840f539e1ca 100755 --- a/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java +++ b/server/test/com/cloud/vpc/MockConfigurationManagerImpl.java @@ -52,9 +52,9 @@ import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; import org.apache.cloudstack.region.PortableIp; import org.apache.cloudstack.region.PortableIpRange; + import org.springframework.stereotype.Component; -import com.cloud.configuration.Configuration; import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ConfigurationService; import com.cloud.dc.ClusterVO; @@ -86,6 +86,7 @@ import com.cloud.storage.DiskOfferingVO; import com.cloud.user.Account; import com.cloud.utils.component.ManagerBase; import com.cloud.vm.VirtualMachine.Type; + import org.apache.cloudstack.api.command.admin.config.UpdateCfgCmd; import org.apache.cloudstack.api.command.admin.ldap.LDAPConfigCmd; import org.apache.cloudstack.api.command.admin.ldap.LDAPRemoveCmd; @@ -108,12 +109,15 @@ import org.apache.cloudstack.api.command.admin.zone.CreateZoneCmd; import org.apache.cloudstack.api.command.admin.zone.DeleteZoneCmd; import org.apache.cloudstack.api.command.admin.zone.UpdateZoneCmd; import org.apache.cloudstack.api.command.user.network.ListNetworkOfferingsCmd; +import org.apache.cloudstack.config.Configuration; + import org.springframework.stereotype.Component; import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; import javax.naming.NamingException; + import java.util.List; import java.util.Map; import java.util.Set; diff --git a/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java b/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java index 7760123c46a..f4f49b6fd61 100644 --- a/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java +++ b/server/test/org/apache/cloudstack/networkoffering/ChildTestConfiguration.java @@ -110,6 +110,7 @@ import com.cloud.user.AccountManager; import com.cloud.user.ResourceLimitService; import com.cloud.user.dao.AccountDaoImpl; import com.cloud.user.dao.UserDaoImpl; +import com.cloud.utils.db.EntityManager; import com.cloud.vm.dao.InstanceGroupDaoImpl; import com.cloud.vm.dao.NicDaoImpl; import com.cloud.vm.dao.NicSecondaryIpDaoImpl; @@ -198,6 +199,11 @@ public class ChildTestConfiguration { public AlertManager alertMgr() { return Mockito.mock(AlertManager.class); } + + @Bean + public EntityManager entityMgr() { + return Mockito.mock(EntityManager.class); + } @Bean public SecurityChecker securityChkr() { From 36d900472b7c8641737326cd6f1081171307da2b Mon Sep 17 00:00:00 2001 From: Kishan Kavala Date: Thu, 25 Jul 2013 16:26:26 +0530 Subject: [PATCH 005/907] CLOUDSTACK-3769: Fixed variable name localMountPointPath in vmopsSnapshot plugin --- scripts/vm/hypervisor/xenserver/vmopsSnapshot | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/vm/hypervisor/xenserver/vmopsSnapshot b/scripts/vm/hypervisor/xenserver/vmopsSnapshot index a4b06622aa9..f638de4fe32 100755 --- a/scripts/vm/hypervisor/xenserver/vmopsSnapshot +++ b/scripts/vm/hypervisor/xenserver/vmopsSnapshot @@ -321,7 +321,7 @@ def umount(localDir): util.SMlog("Successfully unmounted " + localDir) return -def mountSnapshotsDir(secondaryStorageMountPath, localMountPoint, path): +def mountSnapshotsDir(secondaryStorageMountPath, localMountPointPath, path): # The aim is to mount secondaryStorageMountPath on # And create / dir on it, if it doesn't exist already. # Assuming that secondaryStorageMountPath exists remotely From 76e283687f8a9014d85e766c2543f3c98dcb6062 Mon Sep 17 00:00:00 2001 From: Laszlo Hornyak Date: Thu, 18 Jul 2013 17:09:47 +0200 Subject: [PATCH 006/907] test for Script a unit test for the most frequently used methods in the Script class Signed-off-by: Laszlo Hornyak Signed-off-by: Prasanna Santhanam --- utils/test/com/cloud/utils/ScriptTest.java | 100 +++++++++++++++++++++ 1 file changed, 100 insertions(+) create mode 100644 utils/test/com/cloud/utils/ScriptTest.java diff --git a/utils/test/com/cloud/utils/ScriptTest.java b/utils/test/com/cloud/utils/ScriptTest.java new file mode 100644 index 00000000000..f10f3bc7ace --- /dev/null +++ b/utils/test/com/cloud/utils/ScriptTest.java @@ -0,0 +1,100 @@ +// Licensed to the Apache Software Foundation (ASF) under one +// or more contributor license agreements. See the NOTICE file +// distributed with this work for additional information +// regarding copyright ownership. The ASF licenses this file +// to you under the Apache License, Version 2.0 (the +// "License"); you may not use this file except in compliance +// 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; + +import org.apache.commons.lang.SystemUtils; +import org.apache.log4j.Logger; +import org.junit.Assert; +import org.junit.Assume; +import org.junit.Ignore; +import org.junit.Test; +import org.mockito.Mockito; + +import com.cloud.utils.script.OutputInterpreter; +import com.cloud.utils.script.Script; + +public class ScriptTest { + @Test + public void testEcho() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + Script script = new Script("/bin/echo"); + script.add("bar"); + OutputInterpreter.AllLinesParser resultParser = new OutputInterpreter.AllLinesParser(); + String result = script.execute(resultParser); + // With allLinesParser, result is not comming from the return value + Assert.assertNull(result); + Assert.assertEquals("bar\n", resultParser.getLines()); + } + + @Test + public void testLogger() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + Logger mock = Mockito.mock(Logger.class); + Mockito.doNothing().when(mock).debug(Mockito.any()); + Script script = new Script("/bin/echo", mock); + script.execute(); + } + + @Test + public void testToString() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + Script script = new Script("/bin/echo"); + script.add("foo"); + Assert.assertEquals("/bin/echo foo ", script.toString()); + } + + @Test + public void testSet() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + Script script = new Script("/bin/echo"); + script.add("foo"); + script.add("bar", "baz"); + script.set("blah", "blah"); + Assert.assertEquals("/bin/echo foo bar baz blah blah ", script.toString()); + } + + @Test + @Ignore + public void testExecute() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + Logger mock = Mockito.mock(Logger.class); + Mockito.doNothing().when(mock).debug(Mockito.any()); + for (int i = 0; i < 100000; i++) { + Script script = new Script("/bin/false", mock); + script.execute(); + } + } + + @Test + public void testRunSimpleBashScript() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + Assert.assertEquals("hello world!", Script.runSimpleBashScript("echo 'hello world!'")); + } + + @Test + public void testRunSimpleBashScriptWithTimeout() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + Assert.assertEquals("hello world!", Script.runSimpleBashScript("echo 'hello world!'", 1000)); + } + + @Test + public void testFindScript() { + Assume.assumeTrue(SystemUtils.IS_OS_LINUX); + String script = Script.findScript("/usr/bin", "cat"); + Assert.assertNotNull("/usr/bin/cat shoud be there on linux",script); + } +} From deb701b7e09f486b233bba6372878fa4a9f0d93b Mon Sep 17 00:00:00 2001 From: Koushik Das Date: Thu, 25 Jul 2013 17:10:20 +0530 Subject: [PATCH 007/907] CLOUDSTACK-3493: [storage ref] Attach volume to VM is failing in case of Primary-Localstorage . Some existing scenarios for root and data volume combination was not working. These are a. Local root + Shared data b. Shared root + Local data Enabled these scenarios as part of this fix --- .../engine/subsystem/api/storage/HostScope.java | 9 +++++++-- .../engine/subsystem/api/storage/ScopeTest.java | 6 +++--- .../storage/datastore/PrimaryDataStoreImpl.java | 2 +- .../src/com/cloud/storage/StorageManagerImpl.java | 2 +- .../src/com/cloud/storage/VolumeManagerImpl.java | 14 +++++++++++++- 5 files changed, 25 insertions(+), 8 deletions(-) diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java index 1ff381872e6..6e0bc618bfe 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/HostScope.java @@ -22,11 +22,13 @@ import com.cloud.storage.ScopeType; public class HostScope extends AbstractScope { private Long hostId; + private Long clusterId; private Long zoneId; - public HostScope(Long hostId, Long zoneId) { + public HostScope(Long hostId, Long clusterId, Long zoneId) { super(); this.hostId = hostId; + this.clusterId = clusterId; this.zoneId = zoneId; } @@ -40,8 +42,11 @@ public class HostScope extends AbstractScope { return this.hostId; } + public Long getClusterId() { + return clusterId; + } + public Long getZoneId() { return zoneId; } - } diff --git a/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/ScopeTest.java b/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/ScopeTest.java index 4b6b361ba07..473877f9610 100644 --- a/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/ScopeTest.java +++ b/engine/api/test/org/apache/cloudstack/engine/subsystem/api/storage/ScopeTest.java @@ -48,9 +48,9 @@ public class ScopeTest { @Test public void testHostScope() { - HostScope hostScope = new HostScope(1L, 1L); - HostScope hostScope2 = new HostScope(1L, 1L); - HostScope hostScope3 = new HostScope(2L, 1L); + HostScope hostScope = new HostScope(1L, 1L, 1L); + HostScope hostScope2 = new HostScope(1L, 1L, 1L); + HostScope hostScope3 = new HostScope(2L, 1L, 1L); Assert.assertTrue(hostScope.isSameScope(hostScope2)); Assert.assertFalse(hostScope.isSameScope(hostScope3)); diff --git a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java index 420fd2922f4..b20d53443ce 100644 --- a/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java +++ b/engine/storage/volume/src/org/apache/cloudstack/storage/datastore/PrimaryDataStoreImpl.java @@ -159,7 +159,7 @@ public class PrimaryDataStoreImpl implements PrimaryDataStore { } else if (vo.getScope() == ScopeType.HOST) { List poolHosts = poolHostDao.listByPoolId(vo.getId()); if (poolHosts.size() > 0) { - return new HostScope(poolHosts.get(0).getHostId(), vo.getDataCenterId()); + return new HostScope(poolHosts.get(0).getHostId(), vo.getClusterId(), vo.getDataCenterId()); } s_logger.debug("can't find a local storage in pool host table: " + vo.getId()); } diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index cd966cdd565..40117512457 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -625,7 +625,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C store = dataStoreMgr.getDataStore(pool.getId(), DataStoreRole.Primary); } - HostScope scope = new HostScope(host.getId(), host.getDataCenterId()); + HostScope scope = new HostScope(host.getId(), host.getClusterId(), host.getDataCenterId()); lifeCycle.attachHost(store, scope, pInfo); } catch (Exception e) { s_logger.warn("Unable to setup the local storage pool for " + host, e); diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java index c4ffc1b4161..c2d581b33c8 100644 --- a/server/src/com/cloud/storage/VolumeManagerImpl.java +++ b/server/src/com/cloud/storage/VolumeManagerImpl.java @@ -34,7 +34,6 @@ import javax.naming.ConfigurationException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; - import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd; import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd; @@ -49,6 +48,7 @@ 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.DataStoreManager; import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreProviderManager; +import org.apache.cloudstack.engine.subsystem.api.storage.HostScope; import org.apache.cloudstack.engine.subsystem.api.storage.PrimaryDataStoreInfo; import org.apache.cloudstack.engine.subsystem.api.storage.Scope; import org.apache.cloudstack.engine.subsystem.api.storage.SnapshotDataFactory; @@ -1589,6 +1589,18 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { } if (storeForRootStoreScope.getScopeType() != storeForDataStoreScope.getScopeType()) { + if (storeForDataStoreScope.getScopeType() == ScopeType.CLUSTER && storeForRootStoreScope.getScopeType() == ScopeType.HOST) { + HostScope hs = (HostScope)storeForRootStoreScope; + if (storeForDataStoreScope.getScopeId().equals(hs.getClusterId())) { + return false; + } + } + if (storeForRootStoreScope.getScopeType() == ScopeType.CLUSTER && storeForDataStoreScope.getScopeType() == ScopeType.HOST) { + HostScope hs = (HostScope)storeForDataStoreScope; + if (storeForRootStoreScope.getScopeId().equals(hs.getClusterId())) { + return false; + } + } throw new CloudRuntimeException("Can't move volume between scope: " + storeForDataStoreScope.getScopeType() + " and " + storeForRootStoreScope.getScopeType()); } From 0984594323b7a2c1f338a2912f7f5f73d143f005 Mon Sep 17 00:00:00 2001 From: Jayapal Date: Thu, 25 Jul 2013 17:39:43 +0530 Subject: [PATCH 008/907] CLOUDSTACK-2933 Added vpc load balancing changes for vmware --- .../vmware/resource/VmwareResource.java | 90 +++++++++++++++++++ 1 file changed, 90 insertions(+) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index ab8c5203de7..e9e5627dd76 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -1009,7 +1009,97 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa return new SetStaticNatRulesAnswer(cmd, results, endResult); } + protected Answer VPCLoadBalancerConfig(final LoadBalancerConfigCommand cmd) { + VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); + File keyFile = mgr.getSystemVMKeyFile(); + + String routerIp = cmd.getAccessDetail(NetworkElementCommand.ROUTER_IP); + String controlIp = getRouterSshControlIp(cmd); + + assert(controlIp != null); + + LoadBalancerConfigurator cfgtr = new HAProxyConfigurator(); + String[] config = cfgtr.generateConfiguration(cmd); + + String tmpCfgFilePath = "/etc/haproxy/haproxy.cfg.new"; + String tmpCfgFileContents = ""; + for (int i = 0; i < config.length; i++) { + tmpCfgFileContents += config[i]; + tmpCfgFileContents += "\n"; + } + + try { + SshHelper.scpTo(controlIp, DEFAULT_DOMR_SSHPORT, "root", keyFile, null, "/etc/haproxy/", tmpCfgFileContents.getBytes(), "haproxy.cfg.new", null); + + try { + String[][] rules = cfgtr.generateFwRules(cmd); + + String[] addRules = rules[LoadBalancerConfigurator.ADD]; + String[] removeRules = rules[LoadBalancerConfigurator.REMOVE]; + String[] statRules = rules[LoadBalancerConfigurator.STATS]; + + String args = ""; + String ip = cmd.getNic().getIp(); + args += " -i " + ip; + StringBuilder sb = new StringBuilder(); + if (addRules.length > 0) { + for (int i = 0; i < addRules.length; i++) { + sb.append(addRules[i]).append(','); + } + + args += " -a " + sb.toString(); + } + + sb = new StringBuilder(); + if (removeRules.length > 0) { + for (int i = 0; i < removeRules.length; i++) { + sb.append(removeRules[i]).append(','); + } + + args += " -d " + sb.toString(); + } + + sb = new StringBuilder(); + if (statRules.length > 0) { + for (int i = 0; i < statRules.length; i++) { + sb.append(statRules[i]).append(','); + } + + args += " -s " + sb.toString(); + } + + // Invoke the command + Pair result = SshHelper.sshExecute(controlIp, DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), null, "/opt/cloud/bin/vpc_loadbalancer.sh " + args); + + if (!result.first()) { + String msg = "LoadBalancerConfigCommand on domain router " + routerIp + " failed. message: " + result.second(); + s_logger.error(msg); + + return new Answer(cmd, false, msg); + } + + if (s_logger.isInfoEnabled()) { + s_logger.info("VPCLoadBalancerConfigCommand on domain router " + routerIp + " completed"); + } + } finally { + SshHelper.sshExecute(controlIp, DEFAULT_DOMR_SSHPORT, "root", mgr.getSystemVMKeyFile(), null, "rm " + tmpCfgFilePath); + } + return new Answer(cmd); + } catch (Throwable e) { + s_logger.error("Unexpected exception: " + e.toString(), e); + return new Answer(cmd, false, "VPCLoadBalancerConfigCommand failed due to " + VmwareHelper.getExceptionMessage(e)); + } + + + } + + protected Answer execute(final LoadBalancerConfigCommand cmd) { + + if ( cmd.getVpcId() != null ) { + return VPCLoadBalancerConfig(cmd); + } + VmwareManager mgr = getServiceContext().getStockObject(VmwareManager.CONTEXT_STOCK_NAME); File keyFile = mgr.getSystemVMKeyFile(); From 739f7cadebb083b49d7ebdf11a0ed676a97ff262 Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Thu, 25 Jul 2013 19:10:00 +0530 Subject: [PATCH 009/907] CLOUDSTACK-3764: [EIP/ELB] [BasicZone] Unable acquire IP as non-ROOT domain users Since the basic zone network is owned by 'Root' domain, domain access checkers will fail for the accounts in non-root domains while acquiring public IP. So add an exception for the 'Basic' zone shared network with EIP/ELB service. --- .../command/user/address/AssociateIPAddrCmd.java | 15 +++++++++++++++ 1 file changed, 15 insertions(+) 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 d45d1326a3a..cb3da6ba220 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 @@ -51,6 +51,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.network.IpAddress; import com.cloud.network.Network; import com.cloud.network.vpc.Vpc; +import com.cloud.offering.NetworkOffering; import com.cloud.projects.Project; import com.cloud.user.Account; @@ -211,6 +212,20 @@ public class AssociateIPAddrCmd extends BaseAsyncCreateCmd { } } else if (networkId != null){ Network network = _networkService.getNetwork(networkId); + if (network == null) { + throw new InvalidParameterValueException("Unable to find network by network id specified"); + } + + NetworkOffering offering = _configService.getNetworkOffering(network.getNetworkOfferingId()); + + DataCenter zone = _configService.getZone(network.getDataCenterId()); + if (zone.getNetworkType() == NetworkType.Basic && offering.getElasticIp() && offering.getElasticLb()) { + // Since the basic zone network is owned by 'Root' domain, domain access checkers will fail for the + // accounts in non-root domains while acquiring public IP. So add an exception for the 'Basic' zone + // shared network with EIP/ELB service. + return caller.getAccountId(); + } + return network.getAccountId(); } else if (vpcId != null) { Vpc vpc = _vpcService.getVpc(getVpcId()); From 2c5388afac6ba1f47b0a490e2e6c4bc522f29624 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Thu, 25 Jul 2013 19:13:01 +0530 Subject: [PATCH 010/907] For some reason cat is under /bin on some linuses Signed-off-by: Prasanna Santhanam (cherry picked from commit b8129d6a8e6634f6a101e09d8f0a9620a2379d67) --- utils/test/com/cloud/utils/ScriptTest.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/utils/test/com/cloud/utils/ScriptTest.java b/utils/test/com/cloud/utils/ScriptTest.java index f10f3bc7ace..bc0875dbeb1 100644 --- a/utils/test/com/cloud/utils/ScriptTest.java +++ b/utils/test/com/cloud/utils/ScriptTest.java @@ -94,7 +94,7 @@ public class ScriptTest { @Test public void testFindScript() { Assume.assumeTrue(SystemUtils.IS_OS_LINUX); - String script = Script.findScript("/usr/bin", "cat"); - Assert.assertNotNull("/usr/bin/cat shoud be there on linux",script); + String script = Script.findScript("/bin", "pwd"); + Assert.assertNotNull("/bin/pwd shoud be there on linux",script); } } From 211b180d55591098d68666003d29d04866e5e11a Mon Sep 17 00:00:00 2001 From: Rene Diepstraten Date: Thu, 25 Jul 2013 15:45:27 +0200 Subject: [PATCH 011/907] Replaced virsh() by python-libvirt functions Signed-off-by: Rene Diepstraten --- debian/control | 2 +- packaging/centos63/cloud.spec | 1 + scripts/vm/network/security_group.py | 133 ++++++++++++++++++++------- 3 files changed, 101 insertions(+), 35 deletions(-) diff --git a/debian/control b/debian/control index 46dd50536b0..e6d1ef088f2 100644 --- a/debian/control +++ b/debian/control @@ -22,7 +22,7 @@ Description: CloudStack server library Package: cloudstack-agent Architecture: all -Depends: openjdk-6-jre | openjdk-7-jre, cloudstack-common (= ${source:Version}), lsb-base (>= 3.2), libcommons-daemon-java, libjna-java, openssh-client, libvirt0, sysvinit-utils, qemu-kvm, libvirt-bin, uuid-runtime, rsync, grep, iproute, perl-base, perl-modules, ebtables, vlan, wget, jsvc, ipset +Depends: openjdk-6-jre | openjdk-7-jre, cloudstack-common (= ${source:Version}), lsb-base (>= 3.2), libcommons-daemon-java, libjna-java, openssh-client, libvirt0, sysvinit-utils, qemu-kvm, libvirt-bin, uuid-runtime, rsync, grep, iproute, perl-base, perl-modules, ebtables, vlan, wget, jsvc, ipset, python-libvirt Conflicts: cloud-agent, cloud-agent-libs, cloud-agent-deps, cloud-agent-scripts Description: CloudStack agent The CloudStack agent is in charge of managing shared computing resources in diff --git a/packaging/centos63/cloud.spec b/packaging/centos63/cloud.spec index 61e00bd75d3..588b16ff733 100644 --- a/packaging/centos63/cloud.spec +++ b/packaging/centos63/cloud.spec @@ -122,6 +122,7 @@ Requires: jsvc Requires: jakarta-commons-daemon Requires: jakarta-commons-daemon-jsvc Requires: perl +Requires: libvirt-python Provides: cloud-agent Obsoletes: cloud-agent < 4.1.0 Obsoletes: cloud-agent-libs < 4.1.0 diff --git a/scripts/vm/network/security_group.py b/scripts/vm/network/security_group.py index 2ce558fa5f7..a23617ee43b 100755 --- a/scripts/vm/network/security_group.py +++ b/scripts/vm/network/security_group.py @@ -26,11 +26,11 @@ import xml.dom.minidom from optparse import OptionParser, OptionGroup, OptParseError, BadOptionError, OptionError, OptionConflictError, OptionValueError import re import traceback +import libvirt logpath = "/var/run/cloud/" # FIXME: Logs should reside in /var/log/cloud iptables = Command("iptables") bash = Command("/bin/bash") -virsh = Command("virsh") ebtablessave = Command("ebtables-save") ebtables = Command("ebtables") def execute(cmd): @@ -83,6 +83,78 @@ def ipset(ipsetname, proto, start, end, ips): return result ''' +def virshlist(*states): + + libvirt_states={ 'running' : libvirt.VIR_DOMAIN_RUNNING, + 'shutoff' : libvirt.VIR_DOMAIN_SHUTOFF, + 'shutdown' : libvirt.VIR_DOMAIN_SHUTDOWN, + 'paused' : libvirt.VIR_DOMAIN_PAUSED, + 'nostate' : libvirt.VIR_DOMAIN_NOSTATE, + 'blocked' : libvirt.VIR_DOMAIN_BLOCKED, + 'crashed' : libvirt.VIR_DOMAIN_CRASHED, + } + + searchstates = list(libvirt_states[state] for state in states) + + conn = libvirt.openReadOnly('qemu:///system') + if conn == None: + print 'Failed to open connection to the hypervisor' + sys.exit(3) + + alldomains = map(conn.lookupByID, conn.listDomainsID()) + alldomains += map(conn.lookupByName, conn.listDefinedDomains()) + + domains = [] + for domain in alldomains: + if domain.info()[0] in searchstates: + domains.append(domain.name()) + + conn.close() + + return domains + +def virshdomstate(domain): + + libvirt_states={ libvirt.VIR_DOMAIN_RUNNING : 'running', + libvirt.VIR_DOMAIN_SHUTOFF : 'shut off', + libvirt.VIR_DOMAIN_SHUTDOWN : 'shut down', + libvirt.VIR_DOMAIN_PAUSED : 'paused', + libvirt.VIR_DOMAIN_NOSTATE : 'no state', + libvirt.VIR_DOMAIN_BLOCKED : 'blocked', + libvirt.VIR_DOMAIN_CRASHED : 'crashed', + } + + conn = libvirt.openReadOnly('qemu:///system') + if conn == None: + print 'Failed to open connection to the hypervisor' + sys.exit(3) + + try: + dom = (conn.lookupByName (domain)) + except libvirt.libvirtError: + return None + + state = libvirt_states[dom.info()[0]] + conn.close() + + return state + +def virshdumpxml(domain): + + conn = libvirt.openReadOnly('qemu:///system') + if conn == None: + print 'Failed to open connection to the hypervisor' + sys.exit(3) + + try: + dom = (conn.lookupByName (domain)) + except libvirt.libvirtError: + return None + + xml = dom.XMLDesc(0) + conn.close() + + return xml def destroy_network_rules_for_vm(vm_name, vif=None): vmchain = vm_name @@ -509,13 +581,9 @@ def get_rule_log_for_vm(vmName): return ','.join([_vmName, _vmID, _vmIP, _domID, _signature, _seqno]) def check_domid_changed(vmName): - curr_domid = '-1' - try: - curr_domid = getvmId(vmName) - if (curr_domid is None) or (not curr_domid.isdigit()): - curr_domid = '-1' - except: - pass + curr_domid = getvmId(vmName) + if (curr_domid is None) or (not curr_domid.isdigit()): + curr_domid = '-1' vm_name = vmName; logfilename = logpath + vm_name + ".log" @@ -592,8 +660,7 @@ def network_rules_for_rebooted_vm(vmName): return True def get_rule_logs_for_vms(): - cmd = "virsh list|awk '/running/ {print $2}'" - vms = bash("-c", cmd).stdout.split("\n") + vms = virshlist('running') result = [] try: @@ -623,11 +690,7 @@ def cleanup_rules(): if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-'] ]: vm_name = chain - cmd = "virsh list |awk '/" + vm_name + "/ {print $3}'" - try: - result = execute(cmd).strip() - except: - result = None + result = virshdomstate(vm_name) if result == None or len(result) == 0: logging.debug("chain " + chain + " does not correspond to a vm, cleaning up iptable rules") @@ -643,11 +706,7 @@ def cleanup_rules(): if 1 in [ chain.startswith(c) for c in ['r-', 'i-', 's-', 'v-'] ]: vm_name = chain - cmd = "virsh list |awk '/" + vm_name + "/ {print $3}'" - try: - result = execute(cmd).strip() - except: - result = None + result = virshdomstate(vm_name) if result == None or len(result) == 0: logging.debug("chain " + chain + " does not correspond to a vm, cleaning up ebtable rules") @@ -727,9 +786,6 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules, vif vmName = vm_name domId = getvmId(vmName) - - - changes = [] changes = check_rule_log_for_vm(vmName, vm_id, vm_ip, domId, signature, seqno) @@ -827,9 +883,8 @@ def add_network_rules(vm_name, vm_id, vm_ip, signature, seqno, vmMac, rules, vif def getVifs(vmName): vifs = [] - try: - xmlfile = virsh("dumpxml", vmName).stdout - except: + xmlfile = virshdumpxml(vmName) + if xmlfile == None: return vifs dom = xml.dom.minidom.parseString(xmlfile) @@ -841,9 +896,8 @@ def getVifs(vmName): def getVifsForBridge(vmName, brname): vifs = [] - try: - xmlfile = virsh("dumpxml", vmName).stdout - except: + xmlfile = virshdumpxml(vmName) + if xmlfile == None: return vifs dom = xml.dom.minidom.parseString(xmlfile) @@ -858,9 +912,8 @@ def getVifsForBridge(vmName, brname): def getBridges(vmName): bridges = [] - try: - xmlfile = virsh("dumpxml", vmName).stdout - except: + xmlfile = virshdumpxml(vmName) + if xmlfile == None: return bridges dom = xml.dom.minidom.parseString(xmlfile) @@ -871,8 +924,20 @@ def getBridges(vmName): return list(set(bridges)) def getvmId(vmName): - cmd = "virsh list |awk '/" + vmName + "/ {print $1}'" - return bash("-c", cmd).stdout.strip() + + conn = libvirt.openReadOnly('qemu:///system') + if conn == None: + print 'Failed to open connection to the hypervisor' + sys.exit(3) + + try: + dom = (conn.lookupByName (domain)) + except libvirt.libvirtError: + return None + + conn.close() + + return dom.ID() def addFWFramework(brname): try: From 7df0d3a23b07439225784d5542996d7773001309 Mon Sep 17 00:00:00 2001 From: Chip Childers Date: Thu, 25 Jul 2013 12:30:21 -0400 Subject: [PATCH 012/907] Updating build_asf from the 4.1 branch, where I fixed a couple of things --- tools/build/build_asf.sh | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/tools/build/build_asf.sh b/tools/build/build_asf.sh index a4a4706c6d0..c2a817a8ffd 100755 --- a/tools/build/build_asf.sh +++ b/tools/build/build_asf.sh @@ -92,8 +92,14 @@ echo "found $currentversion" echo 'setting version numbers' mvn versions:set -DnewVersion=$version -P vmware -P developer -P systemvm -P simulator -P baremetal -P ucs -Dnonoss mv deps/XenServerJava/pom.xml.versionsBackup deps/XenServerJava/pom.xml -perl -pi -e 's/$ENV{'currentversion'}/$ENV{'version'}/' deps/XenServerJava/pom.xml -perl -pi -e 's/$ENV{'currentversion'}/$ENV{'version'}/' tools/apidoc/pom.xml +perl -pi -e "s/-SNAPSHOT//" deps/XenServerJava/pom.xml +perl -pi -e "s/-SNAPSHOT//" tools/apidoc/pom.xml +case "$currentversion" in + *-SNAPSHOT*) + perl -pi -e 's/-SNAPSHOT//' debian/rules + ;; +esac + git clean -f echo 'commit changes' @@ -158,4 +164,8 @@ if [ "$committosvn" == "yes" ]; then svn commit -m "Committing release candidate artifacts for $version to dist/dev/cloudstack in preparation for release vote" fi +echo 'revert version changes' +cd $sourcedir +git revert --no-edit $commitsh + echo "completed. use commit-sh of $commitsh when starting the VOTE thread" From 23e7753741cf515240ed66e371cfdbd5d15b0baa Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Thu, 25 Jul 2013 22:50:45 +0530 Subject: [PATCH 013/907] Fix bunch of affinity group tests Signed-off-by: Prasanna Santhanam (cherry picked from commit 2b0a97267617608e6695973bc768eec499b69eca) --- .../component/test_affinity_groups.py | 210 ++++++++---------- tools/marvin/marvin/cloudstackTestClient.py | 6 +- tools/marvin/marvin/integration/lib/base.py | 14 +- 3 files changed, 97 insertions(+), 133 deletions(-) diff --git a/test/integration/component/test_affinity_groups.py b/test/integration/component/test_affinity_groups.py index 3f257c38a4f..3ecab6ff66d 100644 --- a/test/integration/component/test_affinity_groups.py +++ b/test/integration/component/test_affinity_groups.py @@ -153,34 +153,34 @@ class TestCreateAffinityGroup(cloudstackTestCase): def create_aff_grp(self, api_client=None, aff_grp=None, acc=None, domainid=None): - if api_client == None: + if not api_client: api_client = self.api_client - if aff_grp == None: + if not aff_grp: self.services["host_anti_affinity_0"] - if acc == None: + if not acc: acc = self.account.name - if domainid == None: + if not domainid: domainid = self.domain.id try: - self.aff_grp = AffinityGroup.create(api_client, aff_grp, acc, domainid) + return AffinityGroup.create(api_client, aff_grp, acc, domainid) except Exception as e: raise Exception("Error: Creation of Affinity Group failed : %s" %e) - @attr(tags=["simulator", "basic", "advanced", "needle"]) + @attr(tags=["simulator", "basic", "advanced"]) def test_01_admin_create_aff_grp(self): """ Test create affinity group as admin @return: """ - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], - acc=self.account.name, domainid=self.account.domainid) - self.debug("Created Affinity Group: %s" % self.aff_grp.name) - - list_aff_grps = AffinityGroup.list(self.api_client, id=self.aff_grp.id) - AffinityGroup.delete(self.api_client, id=list_aff_grps[0].id) - self.debug("Deleted Affinity Group: %s" % list_aff_grps[0].name) + aff_grp = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + acc=self.account.name, domainid=self.account.domainid) + self.debug("Created Affinity Group: %s" % aff_grp.name) + list_aff_grps = AffinityGroup.list(self.api_client, id=aff_grp.id) + self.assert_(isinstance(list_aff_grps, list) and len(list_aff_grps) > 0) + self.assert_(list_aff_grps[0].id == aff_grp.id) + self.cleanup.append(aff_grp) @attr(tags=["simulator", "basic", "advanced"]) def test_02_doadmin_create_aff_grp(self): @@ -195,13 +195,11 @@ class TestCreateAffinityGroup(cloudstackTestCase): self.cleanup.append(self.do_admin) self.cleanup.append(self.new_domain) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], - acc=self.do_admin.name, domainid=self.new_domain.id) - - AffinityGroup.delete(self.api_client, name=self.aff_grp.name, - account=self.do_admin.name, domainid=self.new_domain.id) - self.debug("Deleted Affinity Group: %s" %self.aff_grp.name) + domainapiclient = self.testClient.createUserApiClient(self.do_admin.name, self.new_domain.name, 2) + aff_grp = self.create_aff_grp(api_client=domainapiclient, aff_grp=self.services["host_anti_affinity_0"], + acc=self.do_admin.name, domainid=self.new_domain.id) + aff_grp.delete(domainapiclient) @attr(tags=["simulator", "basic", "advanced"]) def test_03_user_create_aff_grp(self): @@ -213,13 +211,12 @@ class TestCreateAffinityGroup(cloudstackTestCase): self.user = Account.create(self.api_client, self.services["new_account"], domainid=self.domain.id) - self.cleanup.append(self.user) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], - acc=self.user.name, domainid=self.domain.id) + userapiclient = self.testClient.createUserApiClient(self.user.name, self.domain.name) - AffinityGroup.delete(self.api_client, name=self.aff_grp.name, - account=self.user.name, domainid=self.domain.id) - self.debug("Deleted Affinity Group: %s" %self.aff_grp.name) + self.cleanup.append(self.user) + aff_grp = self.create_aff_grp(api_client=userapiclient, aff_grp=self.services["host_anti_affinity_0"], + acc=self.user.name, domainid=self.domain.id) + aff_grp.delete(userapiclient) @attr(tags=["simulator", "basic", "advanced"]) @@ -233,15 +230,14 @@ class TestCreateAffinityGroup(cloudstackTestCase): domainid=self.domain.id) self.cleanup.append(self.user) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + aff_grp = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.user.name, domainid=self.domain.id) with self.assertRaises(Exception): self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.user.name, domainid=self.domain.id) - AffinityGroup.delete(self.api_client, name=self.aff_grp.name, - account=self.user.name, domainid=self.domain.id) - self.debug("Deleted Affinity Group: %s" %self.aff_grp.name) + self.debug("Deleted Affinity Group: %s" %aff_grp.name) + aff_grp.delete(self.api_client) @attr(tags=["simulator", "basic", "advanced"]) def test_05_create_aff_grp_same_name_diff_acc(self): @@ -254,7 +250,7 @@ class TestCreateAffinityGroup(cloudstackTestCase): domainid=self.domain.id) self.cleanup.append(self.user) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + aff_grp = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.user.name, domainid=self.domain.id) try: @@ -262,9 +258,8 @@ class TestCreateAffinityGroup(cloudstackTestCase): except Exception: self.debug("Error: Creating affinity group with same name from different account failed.") - AffinityGroup.delete(self.api_client, name=self.aff_grp.name, - account=self.user.name, domainid=self.domain.id) - self.debug("Deleted Affinity Group: %s" %self.aff_grp.name) + self.debug("Deleted Affinity Group: %s" %aff_grp.name) + aff_grp.delete(self.api_client) @attr(tags=["simulator", "basic", "advanced"]) def test_06_create_aff_grp_nonexisting_type(self): @@ -554,8 +549,7 @@ class TestDeleteAffinityGroups(cloudstackTestCase): if aff_grp == None: self.services["host_anti_affinity_0"] try: - self.aff_grp.append(AffinityGroup.create(api_client, - aff_grp, acc, domainid)) + return AffinityGroup.create(api_client, aff_grp, acc, domainid) except Exception as e: raise Exception("Error: Creation of Affinity Group failed : %s" %e) @@ -584,99 +578,83 @@ class TestDeleteAffinityGroups(cloudstackTestCase): return vm, vm_response.hostid - def test_01_delete_aff_grp_by_id(self): + def delete_aff_group(self, apiclient, **kwargs): + cmd = deleteAffinityGroup.deleteAffinityGroupCmd() + [setattr(cmd, k, v) for k, v in kwargs.items()] + return apiclient.deleteAffinityGroup(cmd) + + @attr(tags=["simulator", "basic", "advanced", "multihost"]) + def test_01_delete_aff_grp_by_name(self): """ - Delete Affinity Group by id. + Delete Affinity Group by name """ - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"]) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_1"]) - - list_aff_grps = AffinityGroup.list(self.api_client, - name=self.aff_grp[0].name) - - AffinityGroup.delete(self.api_client, id=list_aff_grps[0].id) - - AffinityGroup.delete(self.api_client, name=self.aff_grp[1].name) + aff_0 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"]) + AffinityGroup.list(self.api_client, name=aff_0.name) + self.delete_aff_group(self.api_client, name=aff_0.name) + self.assert_(AffinityGroup.list(self.api_client, name=aff_0.name) is None) + @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_02_delete_aff_grp_for_acc(self): """ - Delete Affinity Group for an account. + Delete Affinity Group as admin for an account """ - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + aff_0 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.account.name, domainid=self.domain.id) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_1"], + aff_1 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_1"], acc=self.account.name, domainid=self.domain.id) - AffinityGroup.delete(self.api_client, account=self.account.name, - domainid=self.domain.id, name=self.aff_grp[0].name) - + aff_0.delete(self.api_client) with self.assertRaises(Exception): - vm, hostid = self.create_vm_in_aff_grps([self.aff_grp[0].name]) - - AffinityGroup.delete(self.api_client, account=self.account.name, - domainid=self.domain.id, name=self.aff_grp[1].name) + self.create_vm_in_aff_grps([aff_0.name]) + aff_1.delete(self.api_client) + @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_03_delete_aff_grp_with_vms(self): """ - Delete Affinity Group which has vms in it. + Delete Affinity Group which has vms in it """ - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + aff_0 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.account.name, domainid=self.domain.id) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_1"], + aff_1 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_1"], acc=self.account.name, domainid=self.domain.id) - vm, hostid = self.create_vm_in_aff_grps([self.aff_grp[0].name, - self.aff_grp[1].name]) - - AffinityGroup.delete(self.api_client, account=self.account.name, - domainid=self.domain.id, name=self.aff_grp[0].name) - - vm_list = list_virtual_machines(self.apiclient, - id=self.virtual_machine.id) - - + vm, hostid = self.create_vm_in_aff_grps([aff_0.name, aff_1.name]) + aff_0.delete(self.api_client) + vm_list = list_virtual_machines(self.apiclient, id=self.virtual_machine.id) + self.assert_(vm_list is not None) vm.delete(self.api_client) #Wait for expunge interval to cleanup VM wait_for_cleanup(self.apiclient, ["expunge.delay", "expunge.interval"]) + aff_1.delete(self.api_client) - AffinityGroup.delete(self.api_client, account=self.account.name, - domainid=self.domain.id, name=self.aff_grp[0].name) - AffinityGroup.delete(self.api_client, account=self.account.name, - domainid=self.domain.id, name=self.aff_grp[1].name) - + @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_04_delete_aff_grp_with_vms(self): """ - Delete Affinity Group which has after updating affinity group for - vms in it. + Delete Affinity Group which has vms after updating affinity group for vms in it """ - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"]) + aff_0 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"]) - vm1, hostid1 = self.create_vm_in_aff_grps([self.aff_grp[0].name]) - vm2, hostid2 = self.create_vm_in_aff_grps([self.aff_grp[0].name]) + vm1, hostid1 = self.create_vm_in_aff_grps([aff_0.name]) + vm2, hostid2 = self.create_vm_in_aff_grps([aff_0.name]) + self.cleanup.extend([vm1, vm2]) with self.assertRaises(Exception): - AffinityGroup.delete(self.api_client, name=self.aff_grp[0].name) + aff_0.delete(self.api_client) vm1.update_affinity_group(self.api_client, affinitygroupnames=[]) with self.assertRaises(Exception): - AffinityGroup.delete(self.api_client, name=self.aff_grp[0].name) + aff_0.delete(self.api_client) vm2.update_affinity_group(self.api_client, affinitygroupnames=[]) - AffinityGroup.delete(self.api_client, name=self.aff_grp[0].name) - - vm1.delete(self.api_client) - vm2.delete(self.api_client) - #Wait for expunge interval to cleanup VM - wait_for_cleanup(self.apiclient, ["expunge.delay", "expunge.interval"]) - - AffinityGroup.delete(self.api_client, name=self.aff_grp[1].name) + aff_0.delete(self.api_client) + @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_05_delete_aff_grp_id(self): """ Delete Affinity Group with id which does not belong to this user @@ -686,7 +664,7 @@ class TestDeleteAffinityGroups(cloudstackTestCase): self.services["new_account"]) self.cleanup.append(self.user1) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + aff_0 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.user1.name, domainid=self.domain.id) @@ -698,20 +676,21 @@ class TestDeleteAffinityGroups(cloudstackTestCase): DomainName=self.user2.domain, acctType=0) - self.create_aff_grp(api_client=userapiclient, + aff_1 = self.create_aff_grp(api_client=userapiclient, aff_grp=self.services["host_anti_affinity_1"]) list_aff_grps = AffinityGroup.list(self.api_client, - name=self.aff_grp[0].name) + name=aff_0.name) # Delete Affinity group belonging to different user by id with self.assertRaises(Exception): - AffinityGroup.delete(userapiclient, name=list_aff_grps.id) + self.delete_aff_group(userapiclient, name=list_aff_grps.id) #Cleanup - AffinityGroup.delete(self.api_client, name=self.aff_grp[0].name) - AffinityGroup.delete(userapiclient, name=self.aff_grp[1].name) + aff_0.delete(self.api_client) + aff_1.delete(userapiclient) + @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_06_delete_aff_grp_name(self): """ Delete Affinity Group by name which does not belong to this user @@ -721,7 +700,7 @@ class TestDeleteAffinityGroups(cloudstackTestCase): self.services["new_account"]) self.cleanup.append(self.user1) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + aff_0 = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.user1.name, domainid=self.domain.id) @@ -733,16 +712,19 @@ class TestDeleteAffinityGroups(cloudstackTestCase): DomainName=self.user2.domain, acctType=0) - self.create_aff_grp(api_client=userapiclient, + aff_1 = self.create_aff_grp(api_client=userapiclient, aff_grp=self.services["host_anti_affinity_1"]) + list_aff_grps = AffinityGroup.list(self.api_client, + name=aff_0.name) + # Delete Affinity group belonging to different user by name with self.assertRaises(Exception): - AffinityGroup.delete(userapiclient, name=self.aff_grp[0].name) + self.delete_aff_group(userapiclient, name=list_aff_grps.name) #Cleanup - AffinityGroup.delete(self.api_client, name=self.aff_grp[0].name) - AffinityGroup.delete(userapiclient, name=self.aff_grp[1].name) + aff_0.delete(self.api_client) + aff_1.delete(userapiclient) class TestUpdateVMAffinityGroups(cloudstackTestCase): @@ -1424,8 +1406,7 @@ class TestAffinityGroupsAdminUser(cloudstackTestCase): self.services["host_anti_affinity_0"] try: - self.aff_grp.append(AffinityGroup.create(api_client, - aff_grp, acc, domainid)) + return AffinityGroup.create(api_client, aff_grp, acc, domainid) except Exception as e: raise Exception("Error: Creation of Affinity Group failed : %s" %e) @@ -1440,7 +1421,7 @@ class TestAffinityGroupsAdminUser(cloudstackTestCase): templateid=self.template.id, serviceofferingid=self.service_offering.id, affinitygroupnames=ag_list, - affinitygroupids=ag_ids + affinitygroupids=ag_ids ) self.debug('Created VM=%s in Affinity Group=%s' % (vm.id, ag_list)) @@ -1461,7 +1442,7 @@ class TestAffinityGroupsAdminUser(cloudstackTestCase): @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_01_deploy_vm_another_user(self): """ - Deploy vm in Affinity Group belonging to regular user + Deploy vm as Admin in Affinity Group belonging to regular user (should fail) """ self.user1 = Account.create(self.api_client, self.services["new_account"]) @@ -1472,35 +1453,33 @@ class TestAffinityGroupsAdminUser(cloudstackTestCase): DomainName=self.user1.domain, acctType=0) - self.create_aff_grp(api_client=userapiclient, + aff_grp = self.create_aff_grp(api_client=userapiclient, aff_grp=self.services["host_anti_affinity_0"]) with self.assertRaises(Exception): - vm1, hostid1 = self.create_vm_in_aff_grps(ag_list=[self.aff_grp[0].name]) + self.create_vm_in_aff_grps(api_client=self.apiclient, ag_list=[self.aff_grp[0].name]) - AffinityGroup.delete(userapiclient, self.aff_grp[0].name) + aff_grp.delete(userapiclient) @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_02_create_aff_grp_user(self): """ - Create Affinity Group for regular user + Create Affinity Group as admin for regular user """ self.user = Account.create(self.api_client, self.services["new_account"], domainid=self.domain.id) self.cleanup.append(self.user) - self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], + aff_grp = self.create_aff_grp(aff_grp=self.services["host_anti_affinity_0"], acc=self.user.name, domainid=self.domain.id) + aff_grp.delete(self.apiclient) - AffinityGroup.delete(self.api_client, name=self.aff_grp[0].name, - account=self.user.name, domainid=self.domain.id) - self.debug("Deleted Affinity Group: %s" %self.aff_grp[0].name) @attr(tags=["simulator", "basic", "advanced", "multihost"]) def test_03_list_aff_grp_all_users(self): """ - List Affinity Groups for all the users + List Affinity Groups as admin for all the users """ self.user1 = Account.create(self.api_client, @@ -1512,11 +1491,10 @@ class TestAffinityGroupsAdminUser(cloudstackTestCase): DomainName=self.user1.domain, acctType=0) - self.create_aff_grp(api_client=userapiclient, + aff_grp = self.create_aff_grp(api_client=userapiclient, aff_grp=self.services["host_anti_affinity_0"]) list_aff_grps = AffinityGroup.list(self.api_client) - print list_aff_grps self.assertNotEqual(list_aff_grps, [], "Admin not able to list Affinity " "Groups of users") - AffinityGroup.delete(userapiclient, self.aff_grp[0].name) + aff_grp.delete(userapiclient) diff --git a/tools/marvin/marvin/cloudstackTestClient.py b/tools/marvin/marvin/cloudstackTestClient.py index eba53a16e20..f8c13d4f321 100644 --- a/tools/marvin/marvin/cloudstackTestClient.py +++ b/tools/marvin/marvin/cloudstackTestClient.py @@ -94,10 +94,6 @@ class cloudstackTestClient(object): domain = self.apiClient.createDomain(cdomain) domId = domain.id - mdf = hashlib.md5() - mdf.update("password") - mdf_pass = mdf.hexdigest() - cmd = listAccounts.listAccountsCmd() cmd.name = UserName cmd.domainid = domId @@ -112,7 +108,7 @@ class cloudstackTestClient(object): + "@cloudstack.org" createAcctCmd.firstname = UserName createAcctCmd.lastname = UserName - createAcctCmd.password = mdf_pass + createAcctCmd.password = 'password' createAcctCmd.username = UserName acct = self.apiClient.createAccount(createAcctCmd) acctId = acct.id diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index 0f6fdc59ef8..8d9a25d562d 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -3011,19 +3011,9 @@ class AffinityGroup: def update(self, apiclient): pass - @classmethod - def delete(cls, apiclient, name=None, id=None, account=None, - domainid=None): + def delete(self, apiclient): cmd = deleteAffinityGroup.deleteAffinityGroupCmd() - if id is not None: - cmd.id = id - if name is not None: - cmd.name = name - if account is not None: - cmd.account = account - if domainid is not None: - cmd.domainid = domainid - + cmd.id = self.id return apiclient.deleteAffinityGroup(cmd) @classmethod From 74df662037d178786fcba92f57f673a7040b1490 Mon Sep 17 00:00:00 2001 From: Marcus Sorensen Date: Thu, 25 Jul 2013 11:26:17 -0600 Subject: [PATCH 014/907] Summary: Make vmdata_kvm.py concurrency friendly Detail: Adds flocks, etc for calling this concurrently, since CLOUDSTACK-3484 made userdata, vmdata, start commands concurrent Signed-off-by: Marcus Sorensen 1374773177 -0600 --- .../debian/config/opt/cloud/bin/vmdata_kvm.py | 98 +++++++++++++++---- 1 file changed, 81 insertions(+), 17 deletions(-) diff --git a/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py b/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py index bf8baac7dae..f508032bb83 100644 --- a/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py +++ b/patches/systemvm/debian/config/opt/cloud/bin/vmdata_kvm.py @@ -17,6 +17,8 @@ # under the License. import sys, getopt, json, os, base64 +from fcntl import flock, LOCK_EX, LOCK_UN + def main(argv): fpath = '' @@ -83,20 +85,37 @@ def createfile(ip, folder, file, data): if data is not None: data = base64.b64decode(data) + fh = open(dest, "w") + exflock(fh) if data is not None: - open(dest, "w").write(data) + fh.write(data) else: - open(dest, "w").write("") + fh.write("") + unflock(fh) + fh.close() os.chmod(dest, 0644) if folder == "metadata" or folder == "meta-data": - if not os.path.exists(metamanifestdir): + try: os.makedirs(metamanifestdir, 0755) + except OSError as e: + # error 17 is already exists, we do it this way for concurrency + if e.errno != 17: + print "failed to make directories " + metamanifestdir + " due to :" +e.strerror + sys.exit(1) if os.path.exists(metamanifest): - if not file in open(metamanifest).read(): - open(metamanifest, "a").write(file + '\n') + fh = open(metamanifest, "r+a") + exflock(fh) + if not file in fh.read(): + fh.write(file + '\n') + unflock(fh) + fh.close() else: - open(metamanifest, "w").write(file + '\n') + fh = open(metamanifest, "w") + exflock(fh) + fh.write(file + '\n') + unflock(fh) + fh.close() if os.path.exists(metamanifest): os.chmod(metamanifest, 0644) @@ -106,35 +125,80 @@ def htaccess(ip, folder, file): htaccessFolder = "/var/www/html/latest" htaccessFile = htaccessFolder + "/.htaccess" - if not os.path.exists(htaccessFolder): + try: os.mkdir(htaccessFolder,0755) + except OSError as e: + # error 17 is already exists, we do it this way for concurrency + if e.errno != 17: + print "failed to make directories " + htaccessFolder + " due to :" +e.strerror + sys.exit(1) if os.path.exists(htaccessFile): - if not entry in open(htaccessFile).read(): - open(htaccessFile, "a").write(entry + '\n') + fh = open(htaccessFile, "r+a") + exflock(fh) + if not entry in fh.read(): + fh.write(entry + '\n') + unflock(fh) + fh.close() + else: + fh = open(htaccessFile, "w") + exflock(fh) + fh.write("Options +FollowSymLinks\nRewriteEngine On\n\n") + fh.write(entry + '\n') + unflock(fh) + fh.close() entry="Options -Indexes\nOrder Deny,Allow\nDeny from all\nAllow from " + ip htaccessFolder = "/var/www/html/" + folder + "/" + ip htaccessFile = htaccessFolder+"/.htaccess" - if not os.path.exists(htaccessFolder): + try: os.makedirs(htaccessFolder,0755) + except OSError as e: + # error 17 is already exists, we do it this way for sake of concurrency + if e.errno != 17: + print "failed to make directories " + htaccessFolder + " due to :" +e.strerror + sys.exit(1) - open(htaccessFile, "w").write(entry + '\n') + fh = open(htaccessFile, "w") + exflock(fh) + fh.write(entry + '\n') + unflock(fh) + fh.close() if folder == "metadata" or folder == "meta-data": - entry="RewriteRule ^meta-data/(.+)$ ../" + folder + "/%{REMOTE_ADDR}/$1 [L,NC,QSA]" + entry = "RewriteRule ^meta-data/(.+)$ ../" + folder + "/%{REMOTE_ADDR}/$1 [L,NC,QSA]" htaccessFolder = "/var/www/html/latest" htaccessFile = htaccessFolder + "/.htaccess" - if not entry in open(htaccessFile).read(): - open(htaccessFile, "a").write(entry + '\n') + fh = open(htaccessFile, "r+a") + exflock(fh) + if not entry in fh.read(): + fh.write(entry + '\n') - entry="RewriteRule ^meta-data/$ ../" + folder + "/%{REMOTE_ADDR}/meta-data [L,NC,QSA]" + entry = "RewriteRule ^meta-data/$ ../" + folder + "/%{REMOTE_ADDR}/meta-data [L,NC,QSA]" - if not entry in open(htaccessFile).read(): - open(htaccessFile, "a").write(entry + '\n') + fh.seek(0) + if not entry in fh.read(): + fh.write(entry + '\n') + unflock(fh) + fh.close() +def exflock(file): + try: + flock(file, LOCK_EX) + except IOError as e: + print "failed to lock file" + file.name + " due to : " + e.strerror + sys.exit(1) + return True + +def unflock(file): + try: + flock(file, LOCK_UN) + except IOError: + print "failed to unlock file" + file.name + " due to : " + e.strerror + sys.exit(1) + return True if __name__ == "__main__": main(sys.argv[1:]) From 8e72a728b75d7724e08fa72829d2446f35af1ec6 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Thu, 25 Jul 2013 22:59:21 +0530 Subject: [PATCH 015/907] Fix pep8 that broken marvin build 10 days ago :( Signed-off-by: Prasanna Santhanam --- tools/marvin/marvin/cloudstackTestCase.py | 1 + tools/marvin/marvin/cloudstackTestClient.py | 2 +- tools/marvin/marvin/codegenerator.py | 18 +++++++++--------- tools/marvin/marvin/deployDataCenter.py | 3 ++- tools/marvin/marvin/marvinPlugin.py | 2 -- 5 files changed, 13 insertions(+), 13 deletions(-) diff --git a/tools/marvin/marvin/cloudstackTestCase.py b/tools/marvin/marvin/cloudstackTestCase.py index 742363d4ba2..b04342be58c 100644 --- a/tools/marvin/marvin/cloudstackTestCase.py +++ b/tools/marvin/marvin/cloudstackTestCase.py @@ -17,6 +17,7 @@ import unittest + def user(Name, DomainName, AcctType): def wrapper(cls): orig_init = cls.__init__ diff --git a/tools/marvin/marvin/cloudstackTestClient.py b/tools/marvin/marvin/cloudstackTestClient.py index f8c13d4f321..36f7f8d8369 100644 --- a/tools/marvin/marvin/cloudstackTestClient.py +++ b/tools/marvin/marvin/cloudstackTestClient.py @@ -198,4 +198,4 @@ class cloudstackTestClient(object): if self.asyncJobMgr is None: self.asyncJobMgr = asyncJobMgr.asyncJobMgr(self.apiClient, self.dbConnection) - self.asyncJobMgr.submitJobs(jobs, nums_threads, interval) \ No newline at end of file + self.asyncJobMgr.submitJobs(jobs, nums_threads, interval) diff --git a/tools/marvin/marvin/codegenerator.py b/tools/marvin/marvin/codegenerator.py index e37dbcc81b1..96729f6bbfe 100644 --- a/tools/marvin/marvin/codegenerator.py +++ b/tools/marvin/marvin/codegenerator.py @@ -196,15 +196,15 @@ class codeGenerator(object): body += 'return CloudStackAPIClient(copy.copy(self.connection))\n' body += self.newline -# The `id` property will be used to link the test with the cloud resource being created # -# @property -# def id(self): -# return self._id -# -# @id.setter -# def id(self, identifier): -# self._id = identifier - + # The `id` property will be used to link the test with the cloud + # resource being created + # @property + # def id(self): + # return self._id + # + # @id.setter + # def id(self, identifier): + # self._id = identifier body += self.space + '@property' + self.newline body += self.space + 'def id(self):' + self.newline diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index 2472b2039b3..279d4ee5785 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -159,7 +159,8 @@ specify a valid config file" % cfgFile) secondarycmd.provider = secondary.provider secondarycmd.details = [] - if secondarycmd.provider == 'S3' or secondarycmd.provider == "Swift": + if secondarycmd.provider == 'S3' \ + or secondarycmd.provider == "Swift": for key, value in vars(secondary.details).iteritems(): secondarycmd.details.append({ 'key': key, diff --git a/tools/marvin/marvin/marvinPlugin.py b/tools/marvin/marvin/marvinPlugin.py index 8a548cd63de..29491094db0 100644 --- a/tools/marvin/marvin/marvinPlugin.py +++ b/tools/marvin/marvin/marvinPlugin.py @@ -137,8 +137,6 @@ class MarvinPlugin(Plugin): def _injectClients(self, test): testcaselogger = logging.getLogger("testclient.testcase.%s" % test.__name__) - - self.debug_stream. \ setFormatter(logging. Formatter("%(asctime)s - %(levelname)s - %(name)s" + From 86d919eee263b93f90e6f5c203853979f7fb9473 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 25 Jul 2013 10:28:56 -0700 Subject: [PATCH 016/907] CLOUDSTACK-2481: the wait is in seconds in copycommand --- .../storage/resource/NfsSecondaryStorageResource.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java b/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java index e6f3092318a..b6e14b4e3f2 100755 --- a/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java +++ b/services/secondary-storage/src/org/apache/cloudstack/storage/resource/NfsSecondaryStorageResource.java @@ -367,7 +367,7 @@ public class NfsSecondaryStorageResource extends ServerResourceBase implements S String templateUuid = UUID.randomUUID().toString(); String templateName = templateUuid + ".vhd"; - Script command = new Script(this.createTemplateFromSnapshotXenScript, cmd.getWait(), s_logger); + Script command = new Script(this.createTemplateFromSnapshotXenScript, cmd.getWait() * 1000, s_logger); command.add("-p", snapshotPath); command.add("-s", snapshotName); command.add("-n", templateName); From e7cdaa1b31ba53a2cefddaa8395524f2b7d215a7 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 25 Jul 2013 10:55:27 -0700 Subject: [PATCH 017/907] CLOUDSTACK-3667:[Object_Store_Refactor][VMWare] System VMs StartCommand failed due to Exception: java.lang.Exception Message: secondary storage for dc 3 is not ready yet? --- .../api/storage/DataStoreManager.java | 4 +- .../datastore/DataStoreManagerImpl.java | 10 ++++ .../vmware/manager/VmwareManagerImpl.java | 59 +++++++++++++------ 3 files changed, 53 insertions(+), 20 deletions(-) diff --git a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java index 949b037c1bd..08844536264 100644 --- a/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java +++ b/engine/api/src/org/apache/cloudstack/engine/subsystem/api/storage/DataStoreManager.java @@ -19,8 +19,6 @@ package org.apache.cloudstack.engine.subsystem.api.storage; import java.util.List; -import java.util.Map; - import com.cloud.storage.DataStoreRole; public interface DataStoreManager { @@ -36,5 +34,7 @@ public interface DataStoreManager { List getImageCacheStores(Scope scope); + DataStore getImageCacheStore(long zoneId); + List listImageStores(); } 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 2d7e99eeb79..00d08d719d3 100644 --- a/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java +++ b/engine/storage/src/org/apache/cloudstack/storage/datastore/DataStoreManagerImpl.java @@ -89,6 +89,16 @@ public class DataStoreManagerImpl implements DataStoreManager { return imageDataStoreMgr.listImageCacheStores(scope); } + @Override + public DataStore getImageCacheStore(long zoneId) { + List stores = getImageCacheStores(new ZoneScope(zoneId)); + if (stores == null || stores.size() == 0) { + return null; + } + Collections.shuffle(stores); + return stores.get(0); + } + @Override public List listImageStores() { return imageDataStoreMgr.listImageStores(); diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 2f1ea68a988..0c7ce2e7556 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -245,8 +245,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } _defaultSystemVmNicAdapterType = _configDao.getValue(Config.VmwareSystemVmNicDeviceType.key()); - if(_defaultSystemVmNicAdapterType == null) + if(_defaultSystemVmNicAdapterType == null) { _defaultSystemVmNicAdapterType = VirtualEthernetCardType.E1000.toString(); + } _additionalPortRangeStart = NumbersUtil.parseInt(_configDao.getValue(Config.VmwareAdditionalVncPortRangeStart.key()), 59000); if(_additionalPortRangeStart > 65535) { @@ -263,19 +264,23 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw _routerExtraPublicNics = NumbersUtil.parseInt(_configDao.getValue(Config.RouterExtraPublicNics.key()), 2); _reserveCpu = _configDao.getValue(Config.VmwareReserveCpu.key()); - if(_reserveCpu == null || _reserveCpu.isEmpty()) + if(_reserveCpu == null || _reserveCpu.isEmpty()) { _reserveCpu = "false"; + } _reserveMem = _configDao.getValue(Config.VmwareReserveMem.key()); - if(_reserveMem == null || _reserveMem.isEmpty()) + if(_reserveMem == null || _reserveMem.isEmpty()) { _reserveMem = "false"; + } _recycleHungWorker = _configDao.getValue(Config.VmwareRecycleHungWorker.key()); - if(_recycleHungWorker == null || _recycleHungWorker.isEmpty()) + if(_recycleHungWorker == null || _recycleHungWorker.isEmpty()) { _recycleHungWorker = "false"; + } _rootDiskController = _configDao.getValue(Config.VmwareRootDiskControllerType.key()); - if(_rootDiskController == null || _rootDiskController.isEmpty()) + if(_rootDiskController == null || _rootDiskController.isEmpty()) { _rootDiskController = DiskControllerType.ide.toString(); + } s_logger.info("Additional VNC port allocation range is settled at " + _additionalPortRangeStart + " to " + (_additionalPortRangeStart + _additionalPortRangeSize)); @@ -359,8 +364,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw public List addHostToPodCluster(VmwareContext serviceContext, long dcId, Long podId, Long clusterId, String hostInventoryPath) throws Exception { ManagedObjectReference mor = null; - if (serviceContext != null) + if (serviceContext != null) { mor = serviceContext.getHostMorByPath(hostInventoryPath); + } String privateTrafficLabel = null; privateTrafficLabel = serviceContext.getStockObject("privateTrafficLabel"); if (privateTrafficLabel == null) { @@ -459,11 +465,24 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public String getSecondaryStorageStoreUrl(long dcId) { + String secUrl = null; DataStore secStore = _dataStoreMgr.getImageStore(dcId); - if(secStore != null) - return secStore.getUri(); + if (secStore != null) { + secUrl = secStore.getUri(); + } - return null; + if (secUrl == null) { + // we are using non-NFS image store, then use cache storage instead + s_logger.info("Secondary storage is not NFS, we need to use cache storage"); + DataStore cacheStore = _dataStoreMgr.getImageCacheStore(dcId); + if (cacheStore != null) { + secUrl = cacheStore.getUri(); + } else { + s_logger.warn("No cache storage is found when non-NFS secondary storage is used"); + } + } + + return secUrl; } @Override @@ -478,8 +497,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Override public String getManagementPortGroupByHost(HostMO hostMo) throws Exception { - if(hostMo.getHostType() == VmwareHostType.ESXi) + if(hostMo.getHostType() == VmwareHostType.ESXi) { return _managemetPortGroupName; + } return _serviceConsoleName; } @@ -530,7 +550,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw _configServer.updateKeyPairs(); s_logger.info("Copy System VM patch ISO file to secondary storage. source ISO: " + srcIso.getAbsolutePath() + - ", destination: " + destIso.getAbsolutePath()); + ", destination: " + destIso.getAbsolutePath()); try { FileUtil.copyfile(srcIso, destIso); } catch(IOException e) { @@ -541,8 +561,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw throw new CloudRuntimeException(msg); } } else { - if(s_logger.isTraceEnabled()) + if(s_logger.isTraceEnabled()) { s_logger.trace("SystemVM ISO file " + destIso.getPath() + " already exists"); + } } } finally { lock.unlock(); @@ -579,7 +600,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw assert(isoFile != null); if(!isoFile.exists()) { - s_logger.error("Unable to locate systemvm.iso in your setup at " + isoFile.toString()); + s_logger.error("Unable to locate systemvm.iso in your setup at " + isoFile.toString()); } return isoFile; } @@ -596,7 +617,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } assert(keyFile != null); if(!keyFile.exists()) { - s_logger.error("Unable to locate id_rsa.cloud in your setup at " + keyFile.toString()); + s_logger.error("Unable to locate id_rsa.cloud in your setup at " + keyFile.toString()); } return keyFile; } @@ -957,11 +978,11 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw if (associatedVmwareDc.getVcenterHost().equalsIgnoreCase(vCenterHost) && associatedVmwareDc.getVmwareDatacenterName().equalsIgnoreCase(vmwareDcName)) { s_logger.info("Ignoring API call addVmwareDc, because VMware DC " + vCenterHost + "/" + vmwareDcName + - " is already associated with specified zone with id " + zoneId); + " is already associated with specified zone with id " + zoneId); return associatedVmwareDc; } else { throw new CloudRuntimeException("Zone " + zoneId + " is already associated with a VMware datacenter. " + - "Only 1 VMware DC can be associated with a zone."); + "Only 1 VMware DC can be associated with a zone."); } } // Zone validation to check if the zone already has resources. @@ -1051,8 +1072,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw } throw new CloudRuntimeException(msg); } finally { - if (context != null) + if (context != null) { context.close(); + } context = null; } return vmwareDc; @@ -1129,8 +1151,9 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw s_logger.error(msg); throw new CloudRuntimeException(msg); } finally { - if (context != null) + if (context != null) { context.close(); + } context = null; } return true; From b3790118891cb2d03d68c44e3e04e89b68a8d4a8 Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Thu, 25 Jul 2013 11:53:50 -0700 Subject: [PATCH 018/907] CLOUDSTACK-3811: Autoscale UI: Use templatefilter=executable fix apply button for non-admins --- ui/scripts/autoscaler.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ui/scripts/autoscaler.js b/ui/scripts/autoscaler.js index b2aa56b05ff..6fabf6810c7 100644 --- a/ui/scripts/autoscaler.js +++ b/ui/scripts/autoscaler.js @@ -1421,7 +1421,7 @@ url: createURL('listTemplates'), data: { id: args.data.templateNames, - templatefilter: 'all' + templatefilter: 'executable' }, async: false, success: function(json) { From a39de009da8df5080c2273d77f92a9ae75bff8d6 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 25 Jul 2013 15:10:49 -0700 Subject: [PATCH 019/907] CLOUDSTACK-2536: fix the regression introduced by 4c81ea69c4e8326cc81a0e2607f6a6d99645ce5f --- .../com/cloud/resource/ResourceManagerImpl.java | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index c0187702e71..6a9a434e515 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -215,8 +215,6 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, PlannerHostReservationDao _plannerHostReserveDao; @Inject protected DedicatedResourceDao _dedicatedDao; - @Inject - protected ConfigurationServer _configServer; protected List _discoverers; @@ -462,7 +460,6 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, List result = new ArrayList(); - long clusterId = 0; ClusterVO cluster = new ClusterVO(dcId, podId, clusterName); cluster.setHypervisorType(hypervisorType.toString()); @@ -479,14 +476,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, ex.addProxyObject(zone.getUuid(), "dcId"); throw ex; } - clusterId = cluster.getId(); result.add(cluster); - ClusterDetailsVO cluster_detail_cpu = new ClusterDetailsVO(clusterId, "cpuOvercommitRatio", _configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), null, null)); - ClusterDetailsVO cluster_detail_ram = new ClusterDetailsVO(clusterId, "memoryOvercommitRatio", _configServer.getConfigValue(Config.MemOverprovisioningFactor.key(), null, null)); - _clusterDetailsDao.persist(cluster_detail_cpu); - _clusterDetailsDao.persist(cluster_detail_ram); - if (clusterType == Cluster.ClusterType.CloudManaged) { return result; } @@ -496,6 +487,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, details.put("url", url); details.put("username", username); details.put("password", password); + details.put("cpuOvercommitRatio", _configDao.getValue(Config.CPUOverprovisioningFactor.key())); + details.put("memoryOvercommitRatio", _configDao.getValue(Config.MemOverprovisioningFactor.key())); _clusterDetailsDao.persist(cluster.getId(), details); boolean success = false; @@ -515,7 +508,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, List hosts = new ArrayList(); Map> resources = null; - resources = discoverer.find(dcId, podId, clusterId, uri, username, password, null); + resources = discoverer.find(dcId, podId, cluster.getId(), uri, username, password, null); if (resources != null) { for (Map.Entry> entry : resources.entrySet()) { @@ -536,8 +529,8 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, throw new DiscoveryException("Unable to add the external cluster"); } finally { if (!success) { - _clusterDetailsDao.deleteDetails(clusterId); - _clusterDao.remove(clusterId); + _clusterDetailsDao.deleteDetails(cluster.getId()); + _clusterDao.remove(cluster.getId()); } } } From 42738c2fdaa7822df2afe5564b0bd53bfa2d6b6f Mon Sep 17 00:00:00 2001 From: frank Date: Thu, 25 Jul 2013 15:25:06 -0700 Subject: [PATCH 020/907] change associatesUcsProfileToBlade to async api --- api/src/com/cloud/event/EventTypes.java | 2 ++ client/tomcatconf/commands.properties.in | 1 + .../src/com/cloud/ucs/manager/UcsManagerImpl.java | 5 +++++ .../api/AssociateUcsProfileToBladeCmd.java | 13 ++++++++++++- utils/src/com/cloud/utils/xmlobject/XmlObject.java | 4 ++-- 5 files changed, 22 insertions(+), 3 deletions(-) mode change 100644 => 100755 utils/src/com/cloud/utils/xmlobject/XmlObject.java diff --git a/api/src/com/cloud/event/EventTypes.java b/api/src/com/cloud/event/EventTypes.java index df76f8e853b..4fbab200959 100755 --- a/api/src/com/cloud/event/EventTypes.java +++ b/api/src/com/cloud/event/EventTypes.java @@ -444,6 +444,8 @@ public class EventTypes { public static final String EVENT_DEDICATE_RESOURCE_RELEASE = "DEDICATE.RESOURCE.RELEASE"; public static final String EVENT_CLEANUP_VM_RESERVATION = "VM.RESERVATION.CLEANUP"; + + public static final String EVENT_UCS_ASSOCIATED_PROFILE = "UCS.ASSOCIATEPROFILE"; static { diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index d8d176f5bbc..e8012136b41 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -608,6 +608,7 @@ listBaremetalPxePingServer=1 #### UCS commands addUcsManager=1 +listUcsManager=1 listUcsProfile=1 listUcsBlade=1 associatesUcsProfileToBlade=1 diff --git a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java index f9e2c5a039b..8595d3a611b 100755 --- a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java +++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java @@ -322,6 +322,11 @@ public class UcsManagerImpl implements UcsManager { String res = client.call(cmd); XmlObject xo = XmlObjectParser.parseFromString(res); s_logger.debug(String.format("association response is %s", res)); + + if (xo.get("outConfig.computeBlade.association").equals("none")) { + throw new CloudRuntimeException(String.format("cannot associated a profile to blade[dn:%s]. please check your UCS manasger for detailed error information", dn)); + } + return xo.get("outConfig.computeBlade.association").equals("associated"); } diff --git a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java index c3178cddce7..5e65ece4641 100755 --- a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java +++ b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java @@ -29,6 +29,7 @@ import org.apache.cloudstack.api.response.UcsBladeResponse; import org.apache.cloudstack.api.response.UcsManagerResponse; import org.apache.log4j.Logger; +import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.NetworkRuleConflictException; @@ -37,7 +38,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.ucs.manager.UcsManager; import com.cloud.user.Account; @APICommand(name="associatesUcsProfileToBlade", description="associate a profile to a blade", responseObject=UcsBladeResponse.class) -public class AssociateUcsProfileToBladeCmd extends BaseCmd { +public class AssociateUcsProfileToBladeCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(AssociateUcsProfileToBladeCmd.class); @Inject @@ -96,4 +97,14 @@ public class AssociateUcsProfileToBladeCmd extends BaseCmd { public void setBladeId(Long bladeId) { this.bladeId = bladeId; } + + @Override + public String getEventType() { + return EventTypes.EVENT_UCS_ASSOCIATED_PROFILE; + } + + @Override + public String getEventDescription() { + return "associating a ucs profile to blade"; + } } diff --git a/utils/src/com/cloud/utils/xmlobject/XmlObject.java b/utils/src/com/cloud/utils/xmlobject/XmlObject.java old mode 100644 new mode 100755 index 67bb8ed7cac..4162e4aff37 --- a/utils/src/com/cloud/utils/xmlobject/XmlObject.java +++ b/utils/src/com/cloud/utils/xmlobject/XmlObject.java @@ -50,10 +50,10 @@ public class XmlObject { elements.put(key, e); } else { if (old instanceof List) { - System.out.println(String.format("already list %s, add", key)); + //System.out.println(String.format("already list %s, add", key)); ((List)old).add(e); } else { - System.out.println(String.format("not list list %s, add list", key)); + //System.out.println(String.format("not list list %s, add list", key)); List lst = new ArrayList(); lst.add(old); lst.add(e); From 588efa0150fb344a7709838eba90e62bdcfcd5b5 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 25 Jul 2013 15:22:17 -0700 Subject: [PATCH 021/907] Fix an incomplete logging message. --- server/src/com/cloud/template/TemplateManagerImpl.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/template/TemplateManagerImpl.java b/server/src/com/cloud/template/TemplateManagerImpl.java index 228591bb0d9..107629302a0 100755 --- a/server/src/com/cloud/template/TemplateManagerImpl.java +++ b/server/src/com/cloud/template/TemplateManagerImpl.java @@ -508,8 +508,8 @@ public class TemplateManagerImpl extends ManagerBase implements TemplateManager, } }); } else { - s_logger.info("Skip loading template " + template.getId() + " into primary storage " + pool.getId() + " as pool zone " - + pool.getDataCenterId() + " is "); + s_logger.info("Skip loading template " + template.getId() + " into primary storage " + pool.getId() + " as pool zone " + pool.getDataCenterId() + + " is different from the requested zone " + zoneId); } } } From 08bbfbdc4aa5061948c82a9358493f87bc903e58 Mon Sep 17 00:00:00 2001 From: Prachi Damle Date: Thu, 25 Jul 2013 15:23:14 -0700 Subject: [PATCH 022/907] CLOUDSTACK-3491 delete host resulting NPE; Exception caught while handling disconnect: java.lang.NullPointerException Changes: - During host deletion, host entry in databse gets removed prior to the disconnect task getting processed. - This causes the disconnect task to get NPE while trying to do the host state transition --- .../src/com/cloud/host/dao/HostDaoImpl.java | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) diff --git a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java index a84527e2f88..dd26941aa00 100755 --- a/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java +++ b/engine/schema/src/com/cloud/host/dao/HostDaoImpl.java @@ -36,11 +36,8 @@ import org.springframework.stereotype.Component; import com.cloud.cluster.agentlb.HostTransferMapVO; import com.cloud.cluster.agentlb.dao.HostTransferMapDao; -import com.cloud.cluster.agentlb.dao.HostTransferMapDaoImpl; import com.cloud.dc.ClusterVO; -import com.cloud.dc.HostPodVO; import com.cloud.dc.dao.ClusterDao; -import com.cloud.dc.dao.ClusterDaoImpl; import com.cloud.host.Host; import com.cloud.host.Host.Type; import com.cloud.host.HostTagVO; @@ -120,12 +117,12 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao protected GenericSearchBuilder ClustersForHostsNotOwnedByAnyMSSearch; protected GenericSearchBuilder AllClustersSearch; protected SearchBuilder HostsInClusterSearch; - + protected Attribute _statusAttr; protected Attribute _resourceStateAttr; protected Attribute _msIdAttr; protected Attribute _pingTimeAttr; - + @Inject protected HostDetailsDao _detailsDao; @Inject protected HostTagsDao _hostTagsDao; @Inject protected HostTransferMapDao _hostTransferDao; @@ -163,7 +160,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao TypeDcSearch.and("type", TypeDcSearch.entity().getType(), SearchCriteria.Op.EQ); TypeDcSearch.and("dc", TypeDcSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); TypeDcSearch.done(); - + SecondaryStorageVMSearch = createSearchBuilder(); SecondaryStorageVMSearch.and("type", SecondaryStorageVMSearch.entity().getType(), SearchCriteria.Op.EQ); SecondaryStorageVMSearch.and("dc", SecondaryStorageVMSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); @@ -236,7 +233,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao StatusSearch = createSearchBuilder(); StatusSearch.and("status", StatusSearch.entity().getStatus(), SearchCriteria.Op.IN); StatusSearch.done(); - + ResourceStateSearch = createSearchBuilder(); ResourceStateSearch.and("resourceState", ResourceStateSearch.entity().getResourceState(), SearchCriteria.Op.IN); ResourceStateSearch.done(); @@ -284,7 +281,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao ClusterManagedSearch.and("managed", ClusterManagedSearch.entity().getManagedState(), SearchCriteria.Op.EQ); UnmanagedDirectConnectSearch.join("ClusterManagedSearch", ClusterManagedSearch, ClusterManagedSearch.entity().getId(), UnmanagedDirectConnectSearch.entity().getClusterId(), JoinType.INNER); UnmanagedDirectConnectSearch.done(); - + DirectConnectSearch = createSearchBuilder(); DirectConnectSearch.and("resource", DirectConnectSearch.entity().getResource(), SearchCriteria.Op.NNULL); @@ -334,7 +331,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao ManagedRoutingServersSearch.and("server", ManagedRoutingServersSearch.entity().getManagementServerId(), SearchCriteria.Op.NNULL); ManagedRoutingServersSearch.and("type", ManagedRoutingServersSearch.entity().getType(), SearchCriteria.Op.EQ); ManagedRoutingServersSearch.done(); - + RoutingSearch = createSearchBuilder(); RoutingSearch.and("type", RoutingSearch.entity().getType(), SearchCriteria.Op.EQ); RoutingSearch.done(); @@ -582,20 +579,20 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao @Override @DB public List findAndUpdateApplianceToLoad(long lastPingSecondsAfter, long managementServerId) { Transaction txn = Transaction.currentTxn(); - + txn.start(); 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); List hosts = lockRows(sc, null, true); - + for (HostVO host : hosts) { host.setManagementServerId(managementServerId); update(host.getId(), host); } - + txn.commit(); - + return hosts; } @@ -622,7 +619,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao ub = getUpdateBuilder(host); update(ub, sc, null); } - + @Override public List listByHostTag(Host.Type type, Long clusterId, Long podId, long dcId, String hostTag) { @@ -655,8 +652,8 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao return listBy(sc); } - - + + @Override public List listAllUpAndEnabledNonHAHosts(Type type, Long clusterId, Long podId, long dcId, String haTag) { SearchBuilder hostTagSearch = null; @@ -666,42 +663,42 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao hostTagSearch.or("tagNull", hostTagSearch.entity().getTag(), SearchCriteria.Op.NULL); hostTagSearch.cp(); } - + SearchBuilder hostSearch = createSearchBuilder(); - + hostSearch.and("type", hostSearch.entity().getType(), SearchCriteria.Op.EQ); hostSearch.and("clusterId", hostSearch.entity().getClusterId(), SearchCriteria.Op.EQ); hostSearch.and("podId", hostSearch.entity().getPodId(), SearchCriteria.Op.EQ); hostSearch.and("zoneId", hostSearch.entity().getDataCenterId(), SearchCriteria.Op.EQ); hostSearch.and("status", hostSearch.entity().getStatus(), SearchCriteria.Op.EQ); hostSearch.and("resourceState", hostSearch.entity().getResourceState(), SearchCriteria.Op.EQ); - + if (haTag != null && !haTag.isEmpty()) { hostSearch.join("hostTagSearch", hostTagSearch, hostSearch.entity().getId(), hostTagSearch.entity().getHostId(), JoinBuilder.JoinType.LEFTOUTER); } SearchCriteria sc = hostSearch.create(); - + if (haTag != null && !haTag.isEmpty()) { sc.setJoinParameters("hostTagSearch", "tag", haTag); } - + if (type != null) { sc.setParameters("type", type); } - + if (clusterId != null) { sc.setParameters("clusterId", clusterId); } - + if (podId != null) { sc.setParameters("podId", podId); } - + sc.setParameters("zoneId", dcId); sc.setParameters("status", Status.Up); sc.setParameters("resourceState", ResourceState.Enabled); - + return listBy(sc); } @@ -748,7 +745,7 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao } return result; } - + @Override public void saveDetails(HostVO host) { Map details = host.getDetails(); @@ -873,6 +870,15 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao @Override public boolean updateState(Status oldStatus, Event event, Status newStatus, Host vo, Object data) { HostVO host = findById(vo.getId()); + if(host == null){ + if(event == Event.Remove && newStatus == Status.Removed){ + host = findByIdIncludingRemoved(vo.getId()); + } + } + + if(host == null){ + return false; + } long oldPingTime = host.getLastPinged(); SearchBuilder sb = createSearchBuilder(); @@ -941,10 +947,10 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao msg.append("; new update count = " + newUpdateCount + "]"); status_logger.debug(msg.toString()); } - + return result > 0; } - + @Override public boolean updateResourceState(ResourceState oldState, ResourceState.Event event, ResourceState newState, Host vo) { HostVO host = (HostVO)vo; @@ -952,17 +958,17 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao sb.and("resource_state", sb.entity().getResourceState(), SearchCriteria.Op.EQ); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.done(); - + SearchCriteria sc = sb.create(); sc.setParameters("resource_state", oldState); sc.setParameters("id", host.getId()); - + UpdateBuilder ub = getUpdateBuilder(host); ub.set(host, _resourceStateAttr, newState); int result = update(ub, sc, null); assert result <= 1 : "How can this update " + result + " rows? "; - + if (state_logger.isDebugEnabled() && result == 0) { HostVO ho = findById(host.getId()); assert ho != null : "How how how? : " + host.getId(); @@ -983,10 +989,10 @@ public class HostDaoImpl extends GenericDaoBase implements HostDao msg.append("; new state = " + newState + "]"); state_logger.debug(msg.toString()); } - + return result > 0; } - + @Override public HostVO findByTypeNameAndZoneId(long zoneId, String name, Host.Type type) { SearchCriteria sc = TypeNameZoneSearch.create(); From dc66b6baa68af080caea4a93ec48787234eb1a3a Mon Sep 17 00:00:00 2001 From: Prachi Damle Date: Thu, 25 Jul 2013 15:31:16 -0700 Subject: [PATCH 023/907] CLOUDSTACK-3821 RegisterTemplate URL validation issue Changes: - Added validation for the url path --- .../template/HypervisorTemplateAdapter.java | 64 ++++++++++++++----- 1 file changed, 47 insertions(+), 17 deletions(-) diff --git a/server/src/com/cloud/template/HypervisorTemplateAdapter.java b/server/src/com/cloud/template/HypervisorTemplateAdapter.java index 65318389c36..4b3cade00c0 100755 --- a/server/src/com/cloud/template/HypervisorTemplateAdapter.java +++ b/server/src/com/cloud/template/HypervisorTemplateAdapter.java @@ -16,6 +16,8 @@ // under the License. package com.cloud.template; +import java.net.MalformedURLException; +import java.net.URL; import java.util.List; import java.util.concurrent.ExecutionException; @@ -111,25 +113,18 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { public TemplateProfile prepare(RegisterTemplateCmd cmd) throws ResourceAllocationException { TemplateProfile profile = super.prepare(cmd); String url = profile.getUrl(); - - if((!url.toLowerCase().endsWith("vhd"))&&(!url.toLowerCase().endsWith("vhd.zip")) - &&(!url.toLowerCase().endsWith("vhd.bz2"))&&(!url.toLowerCase().endsWith("vhd.gz")) - &&(!url.toLowerCase().endsWith("qcow2"))&&(!url.toLowerCase().endsWith("qcow2.zip")) - &&(!url.toLowerCase().endsWith("qcow2.bz2"))&&(!url.toLowerCase().endsWith("qcow2.gz")) - &&(!url.toLowerCase().endsWith("ova"))&&(!url.toLowerCase().endsWith("ova.zip")) - &&(!url.toLowerCase().endsWith("ova.bz2"))&&(!url.toLowerCase().endsWith("ova.gz")) - &&(!url.toLowerCase().endsWith("tar"))&&(!url.toLowerCase().endsWith("tar.zip")) - &&(!url.toLowerCase().endsWith("tar.bz2"))&&(!url.toLowerCase().endsWith("tar.gz")) - &&(!url.toLowerCase().endsWith("img"))&&(!url.toLowerCase().endsWith("raw"))){ - throw new InvalidParameterValueException("Please specify a valid "+ cmd.getFormat().toLowerCase()); + String path = null; + try { + URL str = new URL(url); + path = str.getPath(); + } catch (MalformedURLException ex) { + throw new InvalidParameterValueException("Please specify a valid URL. URL:" + url + " is invalid"); } - if ((cmd.getFormat().equalsIgnoreCase("vhd") && (!url.toLowerCase().endsWith("vhd") && !url.toLowerCase().endsWith("vhd.zip") && !url.toLowerCase().endsWith("vhd.bz2") && !url.toLowerCase().endsWith("vhd.gz") )) - || (cmd.getFormat().equalsIgnoreCase("qcow2") && (!url.toLowerCase().endsWith("qcow2") && !url.toLowerCase().endsWith("qcow2.zip") && !url.toLowerCase().endsWith("qcow2.bz2") && !url.toLowerCase().endsWith("qcow2.gz") )) - || (cmd.getFormat().equalsIgnoreCase("ova") && (!url.toLowerCase().endsWith("ova") && !url.toLowerCase().endsWith("ova.zip") && !url.toLowerCase().endsWith("ova.bz2") && !url.toLowerCase().endsWith("ova.gz"))) - || (cmd.getFormat().equalsIgnoreCase("tar") && (!url.toLowerCase().endsWith("tar") && !url.toLowerCase().endsWith("tar.zip") && !url.toLowerCase().endsWith("tar.bz2") && !url.toLowerCase().endsWith("tar.gz"))) - || (cmd.getFormat().equalsIgnoreCase("raw") && (!url.toLowerCase().endsWith("img") && !url.toLowerCase().endsWith("raw")))) { - throw new InvalidParameterValueException("Please specify a valid URL. URL:" + url + " is an invalid for the format " + cmd.getFormat().toLowerCase()); + try { + checkFormat(cmd.getFormat(), url); + } catch (InvalidParameterValueException ex) { + checkFormat(cmd.getFormat(), path); } UriUtils.validateUrl(url); @@ -140,6 +135,41 @@ public class HypervisorTemplateAdapter extends TemplateAdapterBase { return profile; } + private void checkFormat(String format, String url) { + if((!url.toLowerCase().endsWith("vhd"))&&(!url.toLowerCase().endsWith("vhd.zip")) + &&(!url.toLowerCase().endsWith("vhd.bz2"))&&(!url.toLowerCase().endsWith("vhd.gz")) + &&(!url.toLowerCase().endsWith("qcow2"))&&(!url.toLowerCase().endsWith("qcow2.zip")) + &&(!url.toLowerCase().endsWith("qcow2.bz2"))&&(!url.toLowerCase().endsWith("qcow2.gz")) + &&(!url.toLowerCase().endsWith("ova"))&&(!url.toLowerCase().endsWith("ova.zip")) + &&(!url.toLowerCase().endsWith("ova.bz2"))&&(!url.toLowerCase().endsWith("ova.gz")) + &&(!url.toLowerCase().endsWith("tar"))&&(!url.toLowerCase().endsWith("tar.zip")) + &&(!url.toLowerCase().endsWith("tar.bz2"))&&(!url.toLowerCase().endsWith("tar.gz")) + &&(!url.toLowerCase().endsWith("img"))&&(!url.toLowerCase().endsWith("raw"))){ + throw new InvalidParameterValueException("Please specify a valid " + format.toLowerCase()); + } + + if ((format.equalsIgnoreCase("vhd") && (!url.toLowerCase().endsWith("vhd") + && !url.toLowerCase().endsWith("vhd.zip") && !url.toLowerCase().endsWith("vhd.bz2") && !url + .toLowerCase().endsWith("vhd.gz"))) + || (format.equalsIgnoreCase("qcow2") && (!url.toLowerCase().endsWith("qcow2") + && !url.toLowerCase().endsWith("qcow2.zip") && !url.toLowerCase().endsWith("qcow2.bz2") && !url + .toLowerCase().endsWith("qcow2.gz"))) + || (format.equalsIgnoreCase("ova") && (!url.toLowerCase().endsWith("ova") + && !url.toLowerCase().endsWith("ova.zip") && !url.toLowerCase().endsWith("ova.bz2") && !url + .toLowerCase().endsWith("ova.gz"))) + || (format.equalsIgnoreCase("tar") && (!url.toLowerCase().endsWith("tar") + && !url.toLowerCase().endsWith("tar.zip") && !url.toLowerCase().endsWith("tar.bz2") && !url + .toLowerCase().endsWith("tar.gz"))) + || (format.equalsIgnoreCase("raw") && (!url.toLowerCase().endsWith("img") && !url.toLowerCase() + .endsWith("raw")))) { + throw new InvalidParameterValueException("Please specify a valid URL. URL:" + url + + " is an invalid for the format " + format.toLowerCase()); + } + + + } + + @Override public VMTemplateVO create(TemplateProfile profile) { // persist entry in vm_template, vm_template_details and template_zone_ref tables, not that entry at template_store_ref is not created here, and created in createTemplateAsync. From e8d10e73ef6ac18176f172ddc237778a95545ed7 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 25 Jul 2013 16:28:02 -0700 Subject: [PATCH 024/907] CLOUDSTACK-3820: UI > Infrastructure menu > zone detail > UCS > associatesUcsProfileToBlade API has been changed from sync to async. Here is related UI change. --- ui/scripts/system.js | 75 +++++++++++++++++++++++++++++--------------- 1 file changed, 49 insertions(+), 26 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 569e978817b..0cca9b762b6 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -14229,15 +14229,14 @@ title: 'Blades', listView: { id: 'blades', - fields: { - //dn: { label: 'Distinguished Name' }, + fields: { chassis: { label: 'Chassis' }, bladeid: { label: 'Blade ID' }, - associatedProfileDn: { + profiledn: { label: 'Associated Profile' } }, @@ -14324,14 +14323,14 @@ //for testing only (begin) /* - items.push({id: 'org-root/ls-testProfile1', description: 'org-root/ls-testProfile1'}); - items.push({id: 'org-root/ls-testProfile2', description: 'org-root/ls-testProfile2'}); - items.push({id: 'org-root/ls-testProfile3', description: 'org-root/ls-testProfile3'}); - items.push({id: 'org-root/ls-testProfile4', description: 'org-root/ls-testProfile4'}); - items.push({id: 'org-root/ls-testProfile5', description: 'org-root/ls-testProfile5'}); - items.push({id: 'org-root/ls-testProfile6', description: 'org-root/ls-testProfile6'}); - items.push({id: 'org-root/ls-testProfile7', description: 'org-root/ls-testProfile7'}); - */ + items.push({id: 'org-root/ls-testProfile1', description: 'org-root/ls-testProfile1'}); + items.push({id: 'org-root/ls-testProfile2', description: 'org-root/ls-testProfile2'}); + items.push({id: 'org-root/ls-testProfile3', description: 'org-root/ls-testProfile3'}); + items.push({id: 'org-root/ls-testProfile4', description: 'org-root/ls-testProfile4'}); + items.push({id: 'org-root/ls-testProfile5', description: 'org-root/ls-testProfile5'}); + items.push({id: 'org-root/ls-testProfile6', description: 'org-root/ls-testProfile6'}); + items.push({id: 'org-root/ls-testProfile7', description: 'org-root/ls-testProfile7'}); + */ //for testing only (end) args.response.success({ @@ -14347,33 +14346,57 @@ }, action: function(args) { $.ajax({ - url: createURL('associatesUcsProfileToBlade'), + url: createURL('associatesUcsProfileToBlade'), //This API has been changed from sync to async at 7/25/2013 data: { ucsmanagerid: args.context.ucsManagers[0].id, profiledn: args.data.profiledn, bladeid: args.context.blades[0].id }, success: function(json) { - /* - { + //for testing only, comment it out before check in (begin) + json = + { "associateucsprofiletobladeresponse": { - "ucsblade": { - "id": "8f63030a-033c-458e-890f-b2c8863d9542", - "ucsmanagerid": "9d8566c0-f870-4e89-9864-7a3e0b332558", - "bladedn": "sys/chassis-1/blade-2" - } + "jobid": "dff5fa7f-e4a7-457b-92f1-2fede357e3d5" } - } - */ + }; + //for testing only, comment it out before check in (end) + + var jid = json.associateucsprofiletobladeresponse.jobid; args.response.success({ - data: { - associatedProfileDn: args.data.profiledn + _custom: { + jobId: jid, + getUpdatedItem: function(json) { + //for testing only, comment it out before check in (begin) + json = + { + "queryasyncjobresultresponse": { + "accountid": "b24f6866-f0ca-11e2-8c16-d637902e3581", + "userid": "b24f76df-f0ca-11e2-8c16-d637902e3581", + "cmd": "org.apache.cloudstack.api.AssociateUcsProfileToBladeCmd", + "jobstatus": 1, + "jobprocstatus": 0, + "jobresultcode": 0, + "jobresulttype": "object", + "jobresult": { + "ucsblade": { + "id": "84edb958-cf8a-4e71-99c6-190ccc3fe2bd", + "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4", + "bladedn": "sys/chassis-1/blade-1" + } + }, + "created": "2013-07-25T15:10:13-0700", + "jobid": "dff5fa7f-e4a7-457b-92f1-2fede357e3d5" + } + } + //for testing only, comment it out before check in (end) + + return json.queryasyncjobresultresponse.jobresult.ucsblade; + } } - }); + }); } }); - - //args.response.success({data: { associatedProfileDn: args.data.profiledn }}); //for testing only }, notification: { poll: function(args) { From 17a675942cbd1f86a3441ec8299517f660656694 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Thu, 25 Jul 2013 16:32:35 -0700 Subject: [PATCH 025/907] Bring back vm_data.sh which deleted by a KVM related commit The following commit removed vm_data.sh, but the file shared by Xen as well. Bring the file back. commit 28855b4987c9274d15a539b9d7ae26c0073b0651 Author: Marcus Sorensen Date: Wed Jul 24 13:58:17 2013 -0600 Summary: Get away from dozens of ssh/scp calls for KVM vm_data push Detail: userdata and vm metadata take a long time to program on KVM routers. This does it all in one go, processed on the router. BUG-ID: CLOUDSTACK-3163 Tested-by: Wido Signed-off-by: Marcus Sorensen 1374695897 -0600 --- scripts/network/domr/vm_data.sh | 147 ++++++++++++++++++++++++++++++++ 1 file changed, 147 insertions(+) create mode 100644 scripts/network/domr/vm_data.sh diff --git a/scripts/network/domr/vm_data.sh b/scripts/network/domr/vm_data.sh new file mode 100644 index 00000000000..c8617234a50 --- /dev/null +++ b/scripts/network/domr/vm_data.sh @@ -0,0 +1,147 @@ +#!/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. + + +# $Id: vm_data.sh 9307 2010-06-08 00:43:08Z chiradeep $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/vm/hypervisor/xenserver/patch/vm_data.sh $ +# @VERSION@ + +usage() { + printf "Usage: %s: -r -v -F -f -d \n" $(basename $0) >&2 + exit 2 +} + +set -x +cert="/root/.ssh/id_rsa.cloud" +PORT=3922 + +create_htaccess() { + local domrIp=$1 + local vmIp=$2 + local folder=$3 + local file=$4 + + local result=0 + #rewrite rule in top level /latest folder to redirect + #to vm specific folder based on source ip + entry="RewriteRule ^$file$ ../$folder/%{REMOTE_ADDR}/$file [L,NC,QSA]" + htaccessFolder="/var/www/html/latest" + htaccessFile=$htaccessFolder/.htaccess + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "mkdir -p $htaccessFolder; touch $htaccessFile; grep -F \"$entry\" $htaccessFile; if [ \$? -gt 0 ]; then echo -e \"$entry\" >> $htaccessFile; fi" >/dev/null + result=$? + + if [ $result -eq 0 ] + then + #ensure that vm specific folder cannot be listed and that only + #the vm that owns the data can access the items in this directory + entry="Options -Indexes\\nOrder Deny,Allow\\nDeny from all\\nAllow from $vmIp" + htaccessFolder="/var/www/html/$folder/$vmIp" + htaccessFile=$htaccessFolder/.htaccess + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "mkdir -p $htaccessFolder; echo -e \"$entry\" > $htaccessFile" >/dev/null + result=$? + fi + + #support access by http:///latest/ (legacy, see above) also + # http:///latest/meta-data/ (correct) + if [ "$folder" == "metadata" ] || [ "$folder" == "meta-data" ] + then + entry="RewriteRule ^meta-data/(.+)$ ../$folder/%{REMOTE_ADDR}/\\\$1 [L,NC,QSA]" + htaccessFolder="/var/www/html/latest" + htaccessFile=$htaccessFolder/.htaccess + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "grep -F \"$entry\" $htaccessFile; if [ \$? -gt 0 ]; then echo -e \"$entry\" >> $htaccessFile; fi" >/dev/null + entry="RewriteRule ^meta-data/$ ../$folder/%{REMOTE_ADDR}/meta-data [L,NC,QSA]" + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "grep -F \"$entry\" $htaccessFile; if [ \$? -gt 0 ]; then echo -e \"$entry\" >> $htaccessFile; fi" >/dev/null + result=$? + fi + + return $result +} + +copy_vm_data_file() { + local domrIp=$1 + local vmIp=$2 + local folder=$3 + local file=$4 + local dataFile=$5 + + dest=/var/www/html/$folder/$vmIp/$file + metamanifest=/var/www/html/$folder/$vmIp/meta-data + scp -P $PORT -o StrictHostKeyChecking=no -i $cert $dataFile root@$domrIp:$dest >/dev/null + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "chmod 644 $dest" > /dev/null + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "touch $metamanifest; chmod 644 $metamanifest" > /dev/null + if [ "$folder" == "metadata" ] || [ "$folder" == "meta-data" ] + then + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "sed -i '/$file/d' $metamanifest; echo $file >> $metamanifest" > /dev/null + fi + + return $? +} + +delete_vm_data_file() { + local domrIp=$1 + local vmIp=$2 + local folder=$3 + local file=$4 + + vmDataFilePath="/var/www/html/$folder/$vmIp/$file" + ssh -p $PORT -o StrictHostKeyChecking=no -i $cert root@$domrIp "if [ -f $vmDataFilePath ]; then rm -rf $vmDataFilePath; fi" >/dev/null + return $? +} + +domrIp= +vmIp= +folder= +file= +dataFile= + +while getopts 'r:v:F:f:d:' OPTION +do + case $OPTION in + r) domrIp="$OPTARG" + ;; + v) vmIp="$OPTARG" + ;; + F) folder="$OPTARG" + ;; + f) file="$OPTARG" + ;; + d) dataFile="$OPTARG" + ;; + ?) usage + exit 1 + ;; + esac +done + +[ "$domrIp" == "" ] || [ "$vmIp" == "" ] || [ "$folder" == "" ] || [ "$file" == "" ] && usage +[ "$folder" != "userdata" ] && [ "$folder" != "metadata" ] && usage + +if [ "$dataFile" != "" ] +then + create_htaccess $domrIp $vmIp $folder $file + + if [ $? -gt 0 ] + then + exit 1 + fi + + copy_vm_data_file $domrIp $vmIp $folder $file $dataFile +else + delete_vm_data_file $domrIp $vmIp $folder $file +fi + +exit $? From 5e427bd2f676846c22bc503147cdee13ccb1dcf2 Mon Sep 17 00:00:00 2001 From: Edison Su Date: Thu, 25 Jul 2013 16:34:19 -0700 Subject: [PATCH 026/907] CLOUDSTACK-2536: fix the regression introduced by 4c81ea69c4e8326cc81a0e2607f6a6d99645ce5f --- .../storage/snapshot/XenserverSnapshotStrategy.java | 6 ++++-- server/src/com/cloud/api/ApiDBUtils.java | 9 +++++++-- server/src/com/cloud/api/ApiResponseHelper.java | 13 +++++++++---- .../src/com/cloud/resource/ResourceManagerImpl.java | 4 ++++ 4 files changed, 24 insertions(+), 8 deletions(-) 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 79f7d655624..ebbce5b16a4 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 @@ -189,8 +189,10 @@ public class XenserverSnapshotStrategy extends SnapshotStrategyBase { if (result) { //snapshot is deleted on backup storage, need to delete it on primary storage SnapshotDataStoreVO snapshotOnPrimary = snapshotStoreDao.findBySnapshot(snapshotId, DataStoreRole.Primary); - snapshotOnPrimary.setState(State.Destroyed); - snapshotStoreDao.update(snapshotOnPrimary.getId(), snapshotOnPrimary); + if (snapshotOnPrimary != null) { + snapshotOnPrimary.setState(State.Destroyed); + snapshotStoreDao.update(snapshotOnPrimary.getId(), snapshotOnPrimary); + } } } catch (Exception e) { s_logger.debug("Failed to delete snapshot: ", e); diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 2cab44d5e4d..21fcb0c7c45 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -783,8 +783,13 @@ public class ApiDBUtils { return _clusterDao.findById(clusterId); } - public static ClusterDetailsVO findClusterDetails(long clusterId, String name){ - return _clusterDetailsDao.findDetail(clusterId,name); + public static String findClusterDetails(long clusterId, String name){ + ClusterDetailsVO detailsVO = _clusterDetailsDao.findDetail(clusterId,name); + if (detailsVO != null) { + return detailsVO.getValue(); + } + + return null; } public static DiskOfferingVO findDiskOfferingById(Long diskOfferingId) { diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index 60d535e9c4f..f7b740bd3f8 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -979,11 +979,12 @@ public class ApiResponseHelper implements ResponseGenerator { clusterResponse.setClusterType(cluster.getClusterType().toString()); clusterResponse.setAllocationState(cluster.getAllocationState().toString()); clusterResponse.setManagedState(cluster.getManagedState().toString()); - String cpuOvercommitRatio=ApiDBUtils.findClusterDetails(cluster.getId(),"cpuOvercommitRatio").getValue(); - String memoryOvercommitRatio=ApiDBUtils.findClusterDetails(cluster.getId(),"memoryOvercommitRatio").getValue(); + String cpuOvercommitRatio = ApiDBUtils.findClusterDetails(cluster.getId(),"cpuOvercommitRatio"); + String memoryOvercommitRatio = ApiDBUtils.findClusterDetails(cluster.getId(),"memoryOvercommitRatio"); clusterResponse.setCpuOvercommitRatio(cpuOvercommitRatio); clusterResponse.setMemoryOvercommitRatio(memoryOvercommitRatio); + if (showCapacities != null && showCapacities) { List capacities = ApiDBUtils.getCapacityByClusterPodZone(null, null, cluster.getId()); Set capacityResponses = new HashSet(); @@ -994,9 +995,13 @@ public class ApiResponseHelper implements ResponseGenerator { capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { - capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * Float.parseFloat(cpuOvercommitRatio)))); + if (cpuOvercommitRatio != null) { + capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * Float.parseFloat(cpuOvercommitRatio)))); + } } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_MEMORY) { - capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * Float.parseFloat(memoryOvercommitRatio)))); + if (memoryOvercommitRatio != null) { + capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity() * Float.parseFloat(memoryOvercommitRatio)))); + } } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, null, cluster.getId()); capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index 6a9a434e515..cb0e63331c2 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -479,6 +479,10 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, result.add(cluster); if (clusterType == Cluster.ClusterType.CloudManaged) { + Map details = new HashMap(); + details.put("cpuOvercommitRatio", _configDao.getValue(Config.CPUOverprovisioningFactor.key())); + details.put("memoryOvercommitRatio", _configDao.getValue(Config.MemOverprovisioningFactor.key())); + _clusterDetailsDao.persist(cluster.getId(), details); return result; } From 6a916b9e8200db99877701d7b4361e15bb2aacee Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Wed, 24 Jul 2013 14:14:40 -0700 Subject: [PATCH 027/907] DB upgrade: added db upgrade paths for CloudPlatform (Citrix) releases 303,304,305,306,307 to 4.2 --- .../cloud/upgrade/DatabaseUpgradeChecker.java | 16 + .../cloud/upgrade/dao/Upgrade303to304.java | 486 +++++ .../cloud/upgrade/dao/Upgrade304to305.java | 457 +++++ .../cloud/upgrade/dao/Upgrade305to306.java | 306 ++++ .../cloud/upgrade/dao/Upgrade306to307.java | 113 ++ .../cloud/upgrade/dao/Upgrade307to410.java | 96 + setup/db/db/schema-304to305-cleanup.sql | 18 + setup/db/db/schema-304to305.sql | 384 ++++ setup/db/db/schema-305to306-cleanup.sql | 21 + setup/db/db/schema-305to306.sql | 91 + setup/db/db/schema-306to307.sql | 17 + setup/db/db/schema-307to410-cleanup.sql | 30 + setup/db/db/schema-307to410.sql | 1556 +++++++++++++++++ setup/db/db/vmwaretmplinsert-304to305.sql | 17 + 14 files changed, 3608 insertions(+) create mode 100644 engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java create mode 100644 engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java create mode 100644 engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java create mode 100644 engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java create mode 100644 engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java create mode 100644 setup/db/db/schema-304to305-cleanup.sql create mode 100755 setup/db/db/schema-304to305.sql create mode 100644 setup/db/db/schema-305to306-cleanup.sql create mode 100755 setup/db/db/schema-305to306.sql create mode 100644 setup/db/db/schema-306to307.sql create mode 100644 setup/db/db/schema-307to410-cleanup.sql create mode 100644 setup/db/db/schema-307to410.sql create mode 100755 setup/db/db/vmwaretmplinsert-304to305.sql diff --git a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java index e23815b7d28..3b49a1163bf 100755 --- a/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java +++ b/engine/schema/src/com/cloud/upgrade/DatabaseUpgradeChecker.java @@ -53,6 +53,11 @@ import com.cloud.upgrade.dao.Upgrade228to229; import com.cloud.upgrade.dao.Upgrade229to2210; import com.cloud.upgrade.dao.Upgrade301to302; import com.cloud.upgrade.dao.Upgrade302to40; +import com.cloud.upgrade.dao.Upgrade303to304; +import com.cloud.upgrade.dao.Upgrade304to305; +import com.cloud.upgrade.dao.Upgrade305to306; +import com.cloud.upgrade.dao.Upgrade306to307; +import com.cloud.upgrade.dao.Upgrade307to410; import com.cloud.upgrade.dao.Upgrade30to301; import com.cloud.upgrade.dao.Upgrade40to41; import com.cloud.upgrade.dao.Upgrade410to420; @@ -165,6 +170,17 @@ public class DatabaseUpgradeChecker implements SystemIntegrityChecker { _upgradeMap.put("4.0.2", new DbUpgrade[] { new Upgrade40to41(), new Upgrade410to420() }); _upgradeMap.put("4.1.0", new DbUpgrade[] { new Upgrade410to420() }); + + //CP Upgraes + _upgradeMap.put("3.0.3", new DbUpgrade[] { new Upgrade303to304(), new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420() }); + + _upgradeMap.put("3.0.4", new DbUpgrade[] { new Upgrade304to305(), new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420() }); + + _upgradeMap.put("3.0.5", new DbUpgrade[] { new Upgrade305to306(), new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420() }); + + _upgradeMap.put("3.0.6", new DbUpgrade[] { new Upgrade306to307(), new Upgrade307to410(), new Upgrade410to420() }); + + _upgradeMap.put("3.0.7", new DbUpgrade[] { new Upgrade307to410(), new Upgrade410to420() }); } protected void runScript(Connection conn, File file) { diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java new file mode 100644 index 00000000000..55328e2cc9c --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java @@ -0,0 +1,486 @@ +/*Copyright 2012 Citrix Systems, Inc. Licensed under the +Apache License, Version 2.0 (the "License"); you may not use this +file except in compliance with the License. Citrix Systems, Inc. +reserves all rights not expressly granted by 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.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.UUID; + +import org.apache.log4j.Logger; + +import com.cloud.utils.crypt.DBEncryptionUtil; +import com.cloud.utils.exception.CloudRuntimeException; + +public class Upgrade303to304 extends Upgrade30xBase implements DbUpgrade { + final static Logger s_logger = Logger.getLogger(Upgrade303to304.class); + + @Override + public String[] getUpgradableVersionRange() { + return new String[] { "3.0.3", "3.0.4" }; + } + + @Override + public String getUpgradedVersion() { + return "3.0.4"; + } + + @Override + public boolean supportsRollingUpgrade() { + return true; + } + + @Override + public File[] getPrepareScripts() { + return null; + } + + @Override + public void performDataMigration(Connection conn) { + correctVRProviders(conn); + correctMultiplePhysicaNetworkSetups(conn); + } + + private void correctVRProviders(Connection conn) { + PreparedStatement pstmtVR = null; + ResultSet rsVR = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + try{ + pstmtVR = conn.prepareStatement("SELECT id, nsp_id FROM `cloud`.`virtual_router_providers` where type = 'VirtualRouter' AND removed IS NULL"); + rsVR = pstmtVR.executeQuery(); + while (rsVR.next()) { + long vrId = rsVR.getLong(1); + long nspId = rsVR.getLong(2); + + //check that this nspId points to a VR provider. + pstmt = conn.prepareStatement("SELECT physical_network_id, provider_name FROM `cloud`.`physical_network_service_providers` where id = ?"); + pstmt.setLong(1, nspId); + rs = pstmt.executeQuery(); + if(rs.next()){ + long physicalNetworkId = rs.getLong(1); + String providerName = rs.getString(2); + if(!providerName.equalsIgnoreCase("VirtualRouter")){ + //mismatch, correct the nsp_id in VR + PreparedStatement pstmt1 = null; + ResultSet rs1 = null; + pstmt1 = conn.prepareStatement("SELECT id FROM `cloud`.`physical_network_service_providers` where physical_network_id = ? AND provider_name = ? AND removed IS NULL"); + pstmt1.setLong(1, physicalNetworkId); + pstmt1.setString(2, "VirtualRouter"); + rs1 = pstmt1.executeQuery(); + if(rs1.next()){ + long correctNSPId = rs1.getLong(1); + + //update VR entry + PreparedStatement pstmtUpdate = null; + String updateNSPId = "UPDATE `cloud`.`virtual_router_providers` SET nsp_id = ? WHERE id = ?"; + pstmtUpdate = conn.prepareStatement(updateNSPId); + pstmtUpdate.setLong(1, correctNSPId); + pstmtUpdate.setLong(2, vrId); + pstmtUpdate.executeUpdate(); + pstmtUpdate.close(); + } + rs1.close(); + pstmt1.close(); + } + } + rs.close(); + pstmt.close(); + } + }catch (SQLException e) { + throw new CloudRuntimeException("Exception while correcting Virtual Router Entries", e); + } finally { + if (rsVR != null) { + try { + rsVR.close(); + }catch (SQLException e) { + } + } + + if (pstmtVR != null) { + try { + pstmtVR.close(); + } catch (SQLException e) { + } + } + + if (rs != null) { + try { + rs.close(); + }catch (SQLException e) { + } + } + + if (pstmt != null) { + try { + pstmt.close(); + } catch (SQLException e) { + } + } + } + + } + + private void correctMultiplePhysicaNetworkSetups(Connection conn) { + PreparedStatement pstmtZone = null; + ResultSet rsZone = null; + PreparedStatement pstmt = null; + ResultSet rs = null; + + try{ + + //check if multiple physical networks with 'Guest' Traffic types are present + //Yes: + //1) check if there are guest networks without tags, if yes then add a new physical network with default tag for them + //2) Check if there are physical network tags present + //No: Add unique tag to each physical network + //3) Get all guest networks unique network offering id's + + //Clone each for each physical network and add the tag. + //add ntwk service map entries + //update all guest networks of 1 physical network having this offering id to this new offering id + + pstmtZone = conn.prepareStatement("SELECT id, domain_id, networktype, name, uuid FROM `cloud`.`data_center`"); + rsZone = pstmtZone.executeQuery(); + while (rsZone.next()) { + long zoneId = rsZone.getLong(1); + Long domainId = rsZone.getLong(2); + String networkType = rsZone.getString(3); + String zoneName = rsZone.getString(4); + String uuid = rsZone.getString(5); + + PreparedStatement pstmtUpdate = null; + if(uuid == null){ + uuid = UUID.randomUUID().toString(); + String updateUuid = "UPDATE `cloud`.`data_center` SET uuid = ? WHERE id = ?"; + pstmtUpdate = conn.prepareStatement(updateUuid); + pstmtUpdate.setString(1, uuid); + pstmtUpdate.setLong(2, zoneId); + pstmtUpdate.executeUpdate(); + pstmtUpdate.close(); + } + + //check if any networks were untagged and remaining to be mapped to a physical network + + pstmt = conn.prepareStatement("SELECT count(n.id) FROM networks n WHERE n.physical_network_id IS NULL AND n.traffic_type = 'Guest' and n.data_center_id = ? and n.removed is null"); + pstmt.setLong(1, zoneId); + rs = pstmt.executeQuery(); + if(rs.next()){ + Long count = rs.getLong(1); + if(count > 0){ + // find the default tag to use from global config or use 'cloud-private' + String xenGuestLabel = getNetworkLabelFromConfig(conn, "xen.guest.network.device"); + //Decrypt this value. + xenGuestLabel = DBEncryptionUtil.decrypt(xenGuestLabel); + + //make sure that no physical network with this traffic label already exists. if yes, error out. + if(xenGuestLabel != null){ + PreparedStatement pstmt5 = conn.prepareStatement("SELECT count(*) FROM `cloud`.`physical_network_traffic_types` pntt JOIN `cloud`.`physical_network` pn ON pntt.physical_network_id = pn.id WHERE pntt.traffic_type ='Guest' AND pn.data_center_id = ? AND pntt.xen_network_label = ?"); + pstmt5.setLong(1, zoneId); + pstmt5.setString(2, xenGuestLabel); + ResultSet rsSameLabel = pstmt5.executeQuery(); + + if(rsSameLabel.next()){ + Long sameLabelcount = rsSameLabel.getLong(1); + if(sameLabelcount > 0){ + s_logger.error("There are untagged networks for which we need to add a physical network with Xen traffic label = 'xen.guest.network.device' config value, which is: "+xenGuestLabel); + s_logger.error("However already there are "+sameLabelcount+" physical networks setup with same traffic label, cannot upgrade"); + throw new CloudRuntimeException("Cannot upgrade this setup since a physical network with same traffic label: "+xenGuestLabel+" already exists, Please check logs and contact Support."); + } + } + } + + //Create a physical network with guest traffic type and this tag + long physicalNetworkId = addPhysicalNetworkToZone(conn, zoneId, zoneName, networkType, null, domainId); + addTrafficType(conn, physicalNetworkId, "Guest", xenGuestLabel, null, null); + addDefaultVRProvider(conn, physicalNetworkId, zoneId); + addDefaultSGProvider(conn, physicalNetworkId, zoneId, networkType, true); + + PreparedStatement pstmt3 = conn.prepareStatement("SELECT n.id FROM networks n WHERE n.physical_network_id IS NULL AND n.traffic_type = 'Guest' and n.data_center_id = ? and n.removed is null"); + pstmt3.setLong(1, zoneId); + ResultSet rsNet = pstmt3.executeQuery(); + s_logger.debug("Adding PhysicalNetwork to VLAN"); + s_logger.debug("Adding PhysicalNetwork to user_ip_address"); + s_logger.debug("Adding PhysicalNetwork to networks"); + while(rsNet.next()){ + Long networkId = rsNet.getLong(1); + addPhysicalNtwk_To_Ntwk_IP_Vlan(conn, physicalNetworkId,networkId); + } + rsNet.close(); + pstmt3.close(); + } + } + rs.close(); + pstmt.close(); + + + boolean multiplePhysicalNetworks = false; + + pstmt = conn.prepareStatement("SELECT count(*) FROM `cloud`.`physical_network_traffic_types` pntt JOIN `cloud`.`physical_network` pn ON pntt.physical_network_id = pn.id WHERE pntt.traffic_type ='Guest' and pn.data_center_id = ?"); + pstmt.setLong(1, zoneId); + rs = pstmt.executeQuery(); + if(rs.next()){ + Long count = rs.getLong(1); + if(count > 1){ + s_logger.debug("There are "+count+" physical networks setup"); + multiplePhysicalNetworks = true; + } + } + rs.close(); + pstmt.close(); + + if(multiplePhysicalNetworks){ + //check if guest vnet is wrongly configured by earlier upgrade. If yes error out + //check if any vnet is allocated and guest networks are using vnet But the physical network id does not match on the vnet and guest network. + PreparedStatement pstmt4 = conn.prepareStatement("SELECT v.id, v.vnet, v.reservation_id, v.physical_network_id as vpid, n.id, n.physical_network_id as npid FROM `cloud`.`op_dc_vnet_alloc` v JOIN `cloud`.`networks` n ON CONCAT('vlan://' , v.vnet) = n.broadcast_uri WHERE v.taken IS NOT NULL AND v.data_center_id = ? AND n.removed IS NULL AND v.physical_network_id != n.physical_network_id"); + pstmt4.setLong(1, zoneId); + ResultSet rsVNet = pstmt4.executeQuery(); + if(rsVNet.next()){ + String vnet = rsVNet.getString(2); + String networkId = rsVNet.getString(5); + String vpid = rsVNet.getString(4); + String npid = rsVNet.getString(6); + s_logger.error("Guest Vnet assignment is set wrongly . Cannot upgrade until that is corrected. Example- Vnet: "+ vnet +" has physical network id: " + vpid +" ,but the guest network: " +networkId+" that uses it has physical network id: " +npid ); + + String message = "Cannot upgrade. Your setup has multiple Physical Networks and is using guest Vnet that is assigned wrongly. To upgrade, first correct the setup by doing the following: \n" + + "1. Please rollback to your 2.2.14 setup\n" + + "2. Please stop all VMs using isolated(virtual) networks through CloudStack\n" + + "3. Run following query to find if any networks still have nics allocated:\n\t"+ + "a) check if any virtual guest networks still have allocated nics by running:\n\t" + + "SELECT DISTINCT op.id from `cloud`.`op_networks` op JOIN `cloud`.`networks` n on op.id=n.id WHERE nics_count != 0 AND guest_type = 'Virtual';\n\t"+ + "b) If this returns any networkd ids, then ensure that all VMs are stopped, no new VM is being started, and then shutdown management server\n\t"+ + "c) Clean up the nics count for the 'virtual' network id's returned in step (a) by running this:\n\t"+ + "UPDATE `cloud`.`op_networks` SET nics_count = 0 WHERE id = \n\t"+ + "d) Restart management server and wait for all networks to shutdown. [Networks shutdown will be determined by network.gc.interval and network.gc.wait seconds] \n"+ + "4. Please ensure all networks are shutdown and all guest Vnet's are free.\n" + + "5. Run upgrade. This will allocate all your guest vnet range to first physical network. \n" + + "6. Reconfigure the vnet ranges for each physical network as desired by using updatePhysicalNetwork API \n" + + "7. Start all your VMs"; + + s_logger.error(message); + throw new CloudRuntimeException("Cannot upgrade this setup since Guest Vnet assignment to the multiple physical networks is incorrect. Please check the logs for details on how to proceed"); + + } + rsVNet.close(); + pstmt4.close(); + + //Clean up any vnets that have no live networks/nics + pstmt4 = conn.prepareStatement("SELECT v.id, v.vnet, v.reservation_id FROM `cloud`.`op_dc_vnet_alloc` v LEFT JOIN networks n ON CONCAT('vlan://' , v.vnet) = n.broadcast_uri WHERE v.taken IS NOT NULL AND v.data_center_id = ? AND n.broadcast_uri IS NULL AND n.removed IS NULL"); + pstmt4.setLong(1, zoneId); + rsVNet = pstmt4.executeQuery(); + while(rsVNet.next()){ + Long vnet_id = rsVNet.getLong(1); + String vnetValue = rsVNet.getString(2); + String reservationId = rsVNet.getString(3); + //does this vnet have any nic associated? + PreparedStatement pstmt5 = conn.prepareStatement("SELECT id, instance_id FROM `cloud`.`nics` where broadcast_uri = ? and removed IS NULL"); + String uri = "vlan://"+vnetValue; + pstmt5.setString(1, uri); + ResultSet rsNic = pstmt5.executeQuery(); + Long nic_id = rsNic.getLong(1); + Long instance_id = rsNic.getLong(2); + if(rsNic.next()){ + throw new CloudRuntimeException("Cannot upgrade. Please cleanup the guest vnet: "+ vnetValue +" , it is being used by nic_id: "+ nic_id +" , instance_id: " + instance_id ); + } + + //free this vnet + String freeVnet = "UPDATE `cloud`.`op_dc_vnet_alloc` SET account_id = NULL, taken = NULL, reservation_id = NULL WHERE id = ?"; + pstmtUpdate = conn.prepareStatement(freeVnet); + pstmtUpdate.setLong(1, vnet_id); + pstmtUpdate.executeUpdate(); + pstmtUpdate.close(); + } + rsVNet.close(); + pstmt4.close(); + + + //add tags to the physical networks if not present and clone offerings + + pstmt = conn.prepareStatement("SELECT pn.id as pid , ptag.tag as tag FROM `cloud`.`physical_network` pn LEFT JOIN `cloud`.`physical_network_tags` ptag ON pn.id = ptag.physical_network_id where pn.data_center_id = ?"); + pstmt.setLong(1, zoneId); + rs = pstmt.executeQuery(); + while(rs.next()){ + long physicalNetworkId = rs.getLong("pid"); + String tag = rs.getString("tag"); + if(tag == null){ + //need to add unique tag + String newTag = "pNtwk-tag-" + physicalNetworkId; + + String updateVnet = "INSERT INTO `cloud`.`physical_network_tags`(tag, physical_network_id) VALUES( ?, ? )"; + pstmtUpdate = conn.prepareStatement(updateVnet); + pstmtUpdate.setString(1, newTag); + pstmtUpdate.setLong(2, physicalNetworkId); + pstmtUpdate.executeUpdate(); + pstmtUpdate.close(); + + //clone offerings and tag them with this new tag, if there are any guest networks for this physical network + + PreparedStatement pstmt2 = null; + ResultSet rs2 = null; + + pstmt2 = conn.prepareStatement("SELECT distinct network_offering_id FROM `cloud`.`networks` where traffic_type= 'Guest' and physical_network_id = ? and removed is null"); + pstmt2.setLong(1, physicalNetworkId); + rs2 = pstmt2.executeQuery(); + + while(rs2.next()){ + //clone each offering, add new tag, clone offering-svc-map, update guest networks with new offering id + long networkOfferingId = rs2.getLong(1); + cloneOfferingAndAddTag(conn, networkOfferingId, physicalNetworkId, newTag); + } + rs2.close(); + pstmt2.close(); + } + } + rs.close(); + pstmt.close(); + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Exception while correcting PhysicalNetwork setup", e); + } finally { + if (rsZone != null) { + try { + rsZone.close(); + }catch (SQLException e) { + } + } + + if (pstmtZone != null) { + try { + pstmtZone.close(); + } catch (SQLException e) { + } + } + + if (rs != null) { + try { + rs.close(); + }catch (SQLException e) { + } + } + + if (pstmt != null) { + try { + pstmt.close(); + } catch (SQLException e) { + } + } + } + } + + + private void cloneOfferingAndAddTag(Connection conn, long networkOfferingId, long physicalNetworkId, String newTag) { + + + PreparedStatement pstmt = null; + ResultSet rs = null; + try{ + pstmt = conn.prepareStatement("select count(*) from `cloud`.`network_offerings`"); + rs = pstmt.executeQuery(); + long ntwkOffCount = 0; + while (rs.next()) { + ntwkOffCount = rs.getLong(1); + } + rs.close(); + pstmt.close(); + + pstmt = conn.prepareStatement("DROP TEMPORARY TABLE IF EXISTS `cloud`.`network_offerings2`"); + pstmt.executeUpdate(); + + pstmt = conn.prepareStatement("CREATE TEMPORARY TABLE `cloud`.`network_offerings2` ENGINE=MEMORY SELECT * FROM `cloud`.`network_offerings` WHERE id=1"); + pstmt.executeUpdate(); + pstmt.close(); + + // clone the record to + pstmt = conn.prepareStatement("INSERT INTO `cloud`.`network_offerings2` SELECT * FROM `cloud`.`network_offerings` WHERE id=?"); + pstmt.setLong(1, networkOfferingId); + pstmt.executeUpdate(); + pstmt.close(); + + pstmt = conn.prepareStatement("SELECT unique_name FROM `cloud`.`network_offerings` WHERE id=?"); + pstmt.setLong(1, networkOfferingId); + rs = pstmt.executeQuery(); + String uniqueName = null; + while (rs.next()) { + uniqueName = rs.getString(1) + "-" + physicalNetworkId; + } + rs.close(); + pstmt.close(); + + + pstmt = conn.prepareStatement("UPDATE `cloud`.`network_offerings2` SET id=?, unique_name=?, name=?, tags=?, uuid=? WHERE id=?"); + ntwkOffCount = ntwkOffCount + 1; + long newNetworkOfferingId = ntwkOffCount; + pstmt.setLong(1, newNetworkOfferingId); + pstmt.setString(2, uniqueName); + pstmt.setString(3, uniqueName); + pstmt.setString(4, newTag); + String uuid = UUID.randomUUID().toString(); + pstmt.setString(5, uuid); + pstmt.setLong(6, networkOfferingId); + pstmt.executeUpdate(); + pstmt.close(); + + pstmt = conn.prepareStatement("INSERT INTO `cloud`.`network_offerings` SELECT * from `cloud`.`network_offerings2` WHERE id=" + newNetworkOfferingId); + pstmt.executeUpdate(); + pstmt.close(); + + //clone service map + pstmt = conn.prepareStatement("select service, provider from `cloud`.`ntwk_offering_service_map` where network_offering_id=?"); + pstmt.setLong(1, networkOfferingId); + rs = pstmt.executeQuery(); + while (rs.next()) { + String service = rs.getString(1); + String provider = rs.getString(2); + pstmt = conn.prepareStatement("INSERT INTO `cloud`.`ntwk_offering_service_map` (`network_offering_id`, `service`, `provider`, `created`) values (?,?,?, now())"); + pstmt.setLong(1, newNetworkOfferingId); + pstmt.setString(2, service); + pstmt.setString(3, provider); + pstmt.executeUpdate(); + } + rs.close(); + pstmt.close(); + + pstmt = conn.prepareStatement("UPDATE `cloud`.`networks` SET network_offering_id=? where physical_network_id=? and traffic_type ='Guest' and network_offering_id="+networkOfferingId); + pstmt.setLong(1, newNetworkOfferingId); + pstmt.setLong(2, physicalNetworkId); + pstmt.executeUpdate(); + pstmt.close(); + + }catch (SQLException e) { + throw new CloudRuntimeException("Exception while cloning NetworkOffering", e); + } finally { + try { + pstmt = conn.prepareStatement("DROP TEMPORARY TABLE `cloud`.`network_offerings2`"); + pstmt.executeUpdate(); + + if (rs != null) { + rs.close(); + } + + if (pstmt != null) { + pstmt.close(); + } + }catch (SQLException e) { + } + } + } + + @Override + public File[] 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 new file mode 100644 index 00000000000..ecf0e8fb60a --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java @@ -0,0 +1,457 @@ +/*Copyright 2012 Citrix Systems, Inc. Licensed under the +Apache License, Version 2.0 (the "License"); you may not use this +file except in compliance with the License. Citrix Systems, Inc. +reserves all rights not expressly granted by 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.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.apache.log4j.Logger; + +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; + +public class Upgrade304to305 extends Upgrade30xBase implements DbUpgrade { + final static Logger s_logger = Logger.getLogger(Upgrade304to305.class); + + @Override + public String[] getUpgradableVersionRange() { + return new String[] { "3.0.4", "3.0.5" }; + } + + @Override + public String getUpgradedVersion() { + return "3.0.5"; + } + + @Override + public boolean supportsRollingUpgrade() { + return true; + } + + @Override + public File[] getPrepareScripts() { + String script = Script.findScript("", "db/schema-304to305.sql"); + if (script == null) { + throw new CloudRuntimeException("Unable to find db/schema-304to305.sql"); + } + + String vmWareTemplateInsertScript = Script.findScript("", "db/vmwaretmplinsert-304to305.sql"); + if (vmWareTemplateInsertScript == null) { + throw new CloudRuntimeException("Unable to find db/vmwaretmplinsert-304to305.sql"); + } + + return new File[] { new File(vmWareTemplateInsertScript), new File(script) }; + } + + @Override + public void performDataMigration(Connection conn) { + addHostDetailsUniqueKey(conn); + addVpcProvider(conn); + updateRouterNetworkRef(conn); + fixZoneUsingExternalDevices(conn); + updateSystemVms(conn); + fixForeignKeys(conn); + } + + @Override + public File[] getCleanupScripts() { + String script = Script.findScript("", "db/schema-304to305-cleanup.sql"); + if (script == null) { + throw new CloudRuntimeException("Unable to find db/schema-304to305-cleanup.sql"); + } + + return new File[] { new File(script) }; + } + + private void updateSystemVms(Connection conn){ + PreparedStatement pstmt = null; + ResultSet rs = null; + boolean VMware = false; + try { + pstmt = conn.prepareStatement("select distinct(hypervisor_type) from `cloud`.`cluster` where removed is null"); + rs = pstmt.executeQuery(); + while(rs.next()){ + if("VMware".equals(rs.getString(1))){ + VMware = true; + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Error while iterating through list of hypervisors in use", e); + } + // Just update the VMware system template. Other hypervisor templates are unchanged from previous 3.0.x versions. + s_logger.debug("Updating VMware System Vms"); + try { + //Get 3.0.5 VMware system Vm template Id + pstmt = conn.prepareStatement("select id from `cloud`.`vm_template` where name = 'systemvm-vmware-3.0.5' and removed is null"); + rs = pstmt.executeQuery(); + if(rs.next()){ + long templateId = rs.getLong(1); + rs.close(); + pstmt.close(); + // change template type to SYSTEM + pstmt = conn.prepareStatement("update `cloud`.`vm_template` set type='SYSTEM' where id = ?"); + pstmt.setLong(1, templateId); + pstmt.executeUpdate(); + pstmt.close(); + // update templete ID of system Vms + pstmt = conn.prepareStatement("update `cloud`.`vm_instance` set vm_template_id = ? where type <> 'User' and hypervisor_type = 'VMware'"); + pstmt.setLong(1, templateId); + pstmt.executeUpdate(); + pstmt.close(); + } else { + if (VMware){ + throw new CloudRuntimeException("3.0.5 VMware SystemVm template not found. Cannot upgrade system Vms"); + } else { + s_logger.warn("3.0.5 VMware SystemVm template not found. VMware hypervisor is not used, so not failing upgrade"); + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Error while updating VMware systemVm template", e); + } + s_logger.debug("Updating System Vm Template IDs Complete"); + } + + private void addVpcProvider(Connection conn){ + //Encrypt config params and change category to Hidden + s_logger.debug("Adding vpc provider to all physical networks in the system"); + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`physical_network` WHERE removed is NULL"); + rs = pstmt.executeQuery(); + while (rs.next()) { + Long pNtwkId = rs.getLong(1); + + //insert provider + pstmt = conn.prepareStatement("INSERT INTO `cloud`.`physical_network_service_providers` " + + "(`physical_network_id`, `provider_name`, `state`, `vpn_service_provided`, `dhcp_service_provided`, " + + "`dns_service_provided`, `gateway_service_provided`, `firewall_service_provided`, `source_nat_service_provided`," + + " `load_balance_service_provided`, `static_nat_service_provided`, `port_forwarding_service_provided`," + + " `user_data_service_provided`, `security_group_service_provided`) " + + "VALUES (?, 'VpcVirtualRouter', 'Enabled', 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0)"); + + pstmt.setLong(1, pNtwkId); + pstmt.executeUpdate(); + + //get provider id + pstmt = conn.prepareStatement("SELECT id FROM `cloud`.`physical_network_service_providers` " + + "WHERE physical_network_id=? and provider_name='VpcVirtualRouter'"); + pstmt.setLong(1, pNtwkId); + ResultSet rs1 = pstmt.executeQuery(); + rs1.next(); + long providerId = rs1.getLong(1); + + //insert VR element + pstmt = conn.prepareStatement("INSERT INTO `cloud`.`virtual_router_providers` (`nsp_id`, `type`, `enabled`) " + + "VALUES (?, 'VPCVirtualRouter', 1)"); + pstmt.setLong(1, providerId); + pstmt.executeUpdate(); + + s_logger.debug("Added VPC Virtual router provider for physical network id=" + pNtwkId); + + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable add VPC physical network service provider ", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + s_logger.debug("Done adding VPC physical network service providers to all physical networks"); + } + + private void updateRouterNetworkRef(Connection conn){ + //Encrypt config params and change category to Hidden + s_logger.debug("Updating router network ref"); + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = conn.prepareStatement("SELECT d.id, d.network_id FROM `cloud`.`domain_router` d, `cloud`.`vm_instance` v " + + "WHERE d.id=v.id AND v.removed is NULL"); + rs = pstmt.executeQuery(); + while (rs.next()) { + Long routerId = rs.getLong(1); + Long networkId = rs.getLong(2); + + //get the network type + pstmt = conn.prepareStatement("SELECT guest_type from `cloud`.`networks` where id=?"); + pstmt.setLong(1, networkId); + ResultSet rs1 = pstmt.executeQuery(); + rs1.next(); + String networkType = rs1.getString(1); + + //insert the reference + pstmt = conn.prepareStatement("INSERT INTO `cloud`.`router_network_ref` (router_id, network_id, guest_type) " + + "VALUES (?, ?, ?)"); + + pstmt.setLong(1, routerId); + pstmt.setLong(2, networkId); + pstmt.setString(3, networkType); + pstmt.executeUpdate(); + + s_logger.debug("Added reference for router id=" + routerId + " and network id=" + networkId); + + } + } catch (SQLException e) { + throw new CloudRuntimeException("Failed to update the router/network reference ", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + s_logger.debug("Done updating router/network references"); + } + + private void addHostDetailsUniqueKey(Connection conn) { + s_logger.debug("Checking if host_details unique key exists, if not we will add it"); + PreparedStatement pstmt = null; + ResultSet rs = null; + try { + pstmt = conn.prepareStatement("SHOW INDEX FROM `cloud`.`host_details` WHERE KEY_NAME = 'uk_host_id_name'"); + rs = pstmt.executeQuery(); + if (rs.next()) { + s_logger.debug("Unique key already exists on host_details - not adding new one"); + }else{ + //add the key + PreparedStatement pstmtUpdate = conn.prepareStatement("ALTER IGNORE TABLE `cloud`.`host_details` ADD CONSTRAINT UNIQUE KEY `uk_host_id_name` (`host_id`, `name`)"); + pstmtUpdate.executeUpdate(); + s_logger.debug("Unique key did not exist on host_details - added new one"); + pstmtUpdate.close(); + } + } catch (SQLException e) { + throw new CloudRuntimeException("Failed to check/update the host_details unique key ", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + } + + // This fix does two things + // + // 1) ensure that networks using external load balancer/firewall in 2.2.14 or prior releases deployments + // has entry in network_external_lb_device_map and network_external_firewall_device_map + // + // 2) Some keys of host details for F5 and SRX devices were stored in Camel Case in 2.x releases. From 3.0 + // they are made in lowercase. On upgrade change the host details name to lower case + private void fixZoneUsingExternalDevices(Connection conn) { + //Get zones to upgrade + List zoneIds = new ArrayList(); + PreparedStatement pstmt = null; + PreparedStatement pstmtUpdate = null; + ResultSet rs = null; + long networkOfferingId, networkId; + long f5DeviceId, f5HostId; + long srxDevivceId, srxHostId; + + try { + pstmt = conn.prepareStatement("select id from `cloud`.`data_center` where lb_provider='F5BigIp' or firewall_provider='JuniperSRX' or gateway_provider='JuniperSRX'"); + rs = pstmt.executeQuery(); + while (rs.next()) { + zoneIds.add(rs.getLong(1)); + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to create network to LB & firewalla device mapping for networks that use them", e); + } + + if (zoneIds.size() == 0) { + return; // no zones using F5 and SRX devices so return + } + + // find the default network offering created for external devices during upgrade from 2.2.14 + try { + pstmt = conn.prepareStatement("select id from `cloud`.`network_offerings` where unique_name='Isolated with external providers' "); + rs = pstmt.executeQuery(); + if (rs.first()) { + networkOfferingId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no 'Isolated with external providers' network offering crearted ."); + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to create network to LB & firewalla device mapping for networks that use them", e); + } + + for (Long zoneId : zoneIds) { + try { + // find the F5 device id in the zone + pstmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalLoadBalancer' AND removed IS NULL"); + pstmt.setLong(1, zoneId); + rs = pstmt.executeQuery(); + if (rs.first()) { + f5HostId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no F5 load balancer device found in data center " + zoneId); + } + pstmt = conn.prepareStatement("SELECT id FROM external_load_balancer_devices WHERE host_id=?"); + pstmt.setLong(1, f5HostId); + rs = pstmt.executeQuery(); + if (rs.first()) { + f5DeviceId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no F5 load balancer device with host ID " + f5HostId + " found in external_load_balancer_device"); + } + + // find the SRX device id in the zone + pstmt = conn.prepareStatement("SELECT id FROM host WHERE data_center_id=? AND type = 'ExternalFirewall' AND removed IS NULL"); + pstmt.setLong(1, zoneId); + rs = pstmt.executeQuery(); + if (rs.first()) { + srxHostId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no SRX firewall device found in data center " + zoneId); + } + pstmt = conn.prepareStatement("SELECT id FROM external_firewall_devices WHERE host_id=?"); + pstmt.setLong(1, srxHostId); + rs = pstmt.executeQuery(); + if (rs.first()) { + srxDevivceId = rs.getLong(1); + } else { + throw new CloudRuntimeException("Cannot upgrade as there is no SRX firewall device found with host ID " + srxHostId + " found in external_firewall_devices"); + } + + // check if network any uses F5 or SRX devices in the zone + pstmt = conn.prepareStatement("select id from `cloud`.`networks` where guest_type='Virtual' and data_center_id=? and network_offering_id=? and removed IS NULL"); + pstmt.setLong(1, zoneId); + pstmt.setLong(2, networkOfferingId); + rs = pstmt.executeQuery(); + while (rs.next()) { + // get the network Id + networkId = rs.getLong(1); + + // add mapping for the network in network_external_lb_device_map + String insertLbMapping = "INSERT INTO `cloud`.`network_external_lb_device_map` (uuid, network_id, external_load_balancer_device_id, created) VALUES ( ?, ?, ?, now())"; + pstmtUpdate = conn.prepareStatement(insertLbMapping); + pstmtUpdate.setString(1, UUID.randomUUID().toString()); + pstmtUpdate.setLong(2, networkId); + pstmtUpdate.setLong(3, f5DeviceId); + pstmtUpdate.executeUpdate(); + s_logger.debug("Successfully added entry in network_external_lb_device_map for network " + networkId + " and F5 device ID " + f5DeviceId); + + // add mapping for the network in network_external_firewall_device_map + String insertFwMapping = "INSERT INTO `cloud`.`network_external_firewall_device_map` (uuid, network_id, external_firewall_device_id, created) VALUES ( ?, ?, ?, now())"; + pstmtUpdate = conn.prepareStatement(insertFwMapping); + pstmtUpdate.setString(1, UUID.randomUUID().toString()); + pstmtUpdate.setLong(2, networkId); + pstmtUpdate.setLong(3, srxDevivceId); + pstmtUpdate.executeUpdate(); + s_logger.debug("Successfully added entry in network_external_firewall_device_map for network " + networkId + " and SRX device ID " + srxDevivceId); + } + + // update host details for F5 and SRX devices + s_logger.debug("Updating the host details for F5 and SRX devices"); + pstmt = conn.prepareStatement("SELECT host_id, name FROM `cloud`.`host_details` WHERE host_id=? OR host_id=?"); + pstmt.setLong(1, f5HostId); + pstmt.setLong(2, srxHostId); + rs = pstmt.executeQuery(); + while (rs.next()) { + long hostId = rs.getLong(1); + String camlCaseName = rs.getString(2); + if (!(camlCaseName.equalsIgnoreCase("numRetries") || + camlCaseName.equalsIgnoreCase("publicZone") || + camlCaseName.equalsIgnoreCase("privateZone") || + camlCaseName.equalsIgnoreCase("publicInterface") || + camlCaseName.equalsIgnoreCase("privateInterface") || + camlCaseName.equalsIgnoreCase("usageInterface") )) { + continue; + } + String lowerCaseName = camlCaseName.toLowerCase(); + pstmt = conn.prepareStatement("update `cloud`.`host_details` set name=? where host_id=? AND name=?"); + pstmt.setString(1, lowerCaseName); + pstmt.setLong(2, hostId); + pstmt.setString(3, camlCaseName); + pstmt.executeUpdate(); + } + s_logger.debug("Successfully updated host details for F5 and SRX devices"); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable create a mapping for the networks in network_external_lb_device_map and network_external_firewall_device_map", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + s_logger.info("Successfully upgraded network using F5 and SRX devices to have a entry in the network_external_lb_device_map and network_external_firewall_device_map"); + } + } + + private void fixForeignKeys(Connection conn) { + s_logger.debug("Fixing foreign keys' names in ssh_keypairs table"); + //Drop the keys (if exist) + List keys = new ArrayList(); + keys.add("fk_ssh_keypair__account_id"); + keys.add("fk_ssh_keypair__domain_id"); + keys.add("fk_ssh_keypairs__account_id"); + keys.add("fk_ssh_keypairs__domain_id"); + DbUpgradeUtils.dropKeysIfExist(conn, "ssh_keypairs", keys, true); + + keys = new ArrayList(); + keys.add("fk_ssh_keypair__account_id"); + keys.add("fk_ssh_keypair__domain_id"); + keys.add("fk_ssh_keypairs__account_id"); + keys.add("fk_ssh_keypairs__domain_id"); + DbUpgradeUtils.dropKeysIfExist(conn, "ssh_keypairs", keys, false); + + //insert the keys anew + try { + PreparedStatement pstmt; pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`ssh_keypairs` ADD " + + "CONSTRAINT `fk_ssh_keypairs__account_id` FOREIGN KEY `fk_ssh_keypairs__account_id` (`account_id`)" + + " REFERENCES `account` (`id`) ON DELETE CASCADE"); + pstmt.executeUpdate(); + pstmt.close(); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute ssh_keypairs table update for adding account_id foreign key", e); + } + + try { + PreparedStatement pstmt; pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`ssh_keypairs` ADD CONSTRAINT" + + " `fk_ssh_keypairs__domain_id` FOREIGN KEY `fk_ssh_keypairs__domain_id` (`domain_id`) " + + "REFERENCES `domain` (`id`) ON DELETE CASCADE"); + pstmt.executeUpdate(); + pstmt.close(); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to execute ssh_keypairs table update for adding domain_id foreign key", e); + } + } +} diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java new file mode 100644 index 00000000000..f801b55c34a --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java @@ -0,0 +1,306 @@ +/*Copyright 2012 Citrix Systems, Inc. Licensed under the +Apache License, Version 2.0 (the "License"); you may not use this +file except in compliance with the License. Citrix Systems, Inc. +reserves all rights not expressly granted by 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.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; +import java.util.List; +import java.util.UUID; + +import org.apache.log4j.Logger; + +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; + +public class Upgrade305to306 extends Upgrade30xBase implements DbUpgrade { + final static Logger s_logger = Logger.getLogger(Upgrade305to306.class); + + @Override + public String[] getUpgradableVersionRange() { + return new String[] { "3.0.5", "3.0.6" }; + } + + @Override + public String getUpgradedVersion() { + return "3.0.6"; + } + + @Override + public boolean supportsRollingUpgrade() { + return true; + } + + @Override + public File[] getPrepareScripts() { + String script = Script.findScript("", "db/schema-305to306.sql"); + if (script == null) { + throw new CloudRuntimeException("Unable to find db/schema-305to306.sql"); + } + + return new File[] { new File(script) }; + } + + @Override + public void performDataMigration(Connection conn) { + + //Add index for alert table. + addIndexForAlert(conn); + + upgradeEIPNetworkOfferings(conn); + + addIndexForHostDetails(conn); + upgradeEgressFirewallRules(conn); + removeFirewallServiceFromSharedNetworkOfferingWithSGService(conn); + fix22xKVMSnapshots(conn); + } + + private void addIndexForAlert(Connection conn) { + + //First drop if it exists. (Due to patches shipped to customers some will have the index and some wont.) + List indexList = new ArrayList(); + s_logger.debug("Dropping index i_alert__last_sent if it exists"); + indexList.add("i_alert__last_sent"); + DbUpgradeUtils.dropKeysIfExist(conn, "alert", indexList, false); + + //Now add index. + PreparedStatement pstmt = null; + try { + pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`alert` ADD INDEX `i_alert__last_sent`(`last_sent`)"); + pstmt.executeUpdate(); + s_logger.debug("Added index i_alert__last_sent for table alert"); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to add index i_alert__last_sent to alert table for the column last_sent", e); + } finally { + try { + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + + } + + private void upgradeEIPNetworkOfferings(Connection conn) { + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + pstmt = conn.prepareStatement("select id, elastic_ip_service from `cloud`.`network_offerings` where traffic_type='Guest'"); + rs = pstmt.executeQuery(); + while (rs.next()) { + long id = rs.getLong(1); + // check if elastic IP service is enabled for network offering + if (rs.getLong(2) != 0) { + //update network offering with eip_associate_public_ip set to true + pstmt = conn.prepareStatement("UPDATE `cloud`.`network_offerings` set eip_associate_public_ip=? where id=?"); + pstmt.setBoolean(1, true); + pstmt.setLong(2, id); + pstmt.executeUpdate(); + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to set eip_associate_public_ip for network offerings with EIP service enabled.", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + } + + private void addIndexForHostDetails(Connection conn) { + + //First drop if it exists. (Due to patches shipped to customers some will have the index and some wont.) + List indexList = new ArrayList(); + s_logger.debug("Dropping index fk_host_details__host_id if it exists"); + indexList.add("fk_host_details__host_id"); + DbUpgradeUtils.dropKeysIfExist(conn, "host_details", indexList, false); + + //Now add index. + PreparedStatement pstmt = null; + try { + pstmt = conn.prepareStatement("ALTER TABLE `cloud`.`host_details` ADD INDEX `fk_host_details__host_id`(`host_id`)"); + pstmt.executeUpdate(); + s_logger.debug("Added index fk_host_details__host_id for table host_details"); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to add index fk_host_details__host_id to host_details table for the column host_id", e); + } finally { + try { + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + + } + + private void upgradeEgressFirewallRules(Connection conn) { + PreparedStatement pstmt = null; + ResultSet rs = null; + ResultSet rsId = null; + ResultSet rsNw = null; + try { + // update the existing ingress rules traffic type + pstmt = conn.prepareStatement("update `cloud`.`firewall_rules` set traffic_type='Ingress' where purpose='Firewall' and ip_address_id is not null and traffic_type is null"); + s_logger.debug("Updating firewall Ingress rule traffic type: " + pstmt); + pstmt.executeUpdate(); + + pstmt = conn.prepareStatement("select network_id FROM `cloud`.`ntwk_service_map` where service='Firewall' and provider='VirtualRouter' "); + rs = pstmt.executeQuery(); + while (rs.next()) { + long netId = rs.getLong(1); + //When upgraded from 2.2.14 to 3.0.6 guest_type is updated to Isolated in the 2214to30 clean up sql. clean up executes + //after this. So checking for Isolated OR Virtual + pstmt = conn.prepareStatement("select account_id, domain_id FROM `cloud`.`networks` where (guest_type='Isolated' OR guest_type='Virtual') and traffic_type='Guest' and vpc_id is NULL and (state='implemented' OR state='Shutdown') and id=? "); + pstmt.setLong(1, netId); + s_logger.debug("Getting account_id, domain_id from networks table: " + pstmt); + rsNw = pstmt.executeQuery(); + + if(rsNw.next()) { + long accountId = rsNw.getLong(1); + long domainId = rsNw.getLong(2); + + //Add new rule for the existing networks + s_logger.debug("Adding default egress firewall rule for network " + netId); + pstmt = conn.prepareStatement("INSERT INTO firewall_rules (uuid, state, protocol, purpose, account_id, domain_id, network_id, xid, created, traffic_type) VALUES (?, 'Active', 'all', 'Firewall', ?, ?, ?, ?, now(), 'Egress')"); + pstmt.setString(1, UUID.randomUUID().toString()); + pstmt.setLong(2, accountId); + pstmt.setLong(3, domainId); + pstmt.setLong(4, netId); + pstmt.setString(5, UUID.randomUUID().toString()); + s_logger.debug("Inserting default egress firewall rule " + pstmt); + pstmt.executeUpdate(); + + pstmt = conn.prepareStatement("select id from firewall_rules where protocol='all' and network_id=?"); + pstmt.setLong(1, netId); + rsId = pstmt.executeQuery(); + + long firewallRuleId; + if(rsId.next()) { + firewallRuleId = rsId.getLong(1); + pstmt = conn.prepareStatement("insert into firewall_rules_cidrs (firewall_rule_id,source_cidr) values (?, '0.0.0.0/0')"); + pstmt.setLong(1, firewallRuleId); + s_logger.debug("Inserting rule for cidr 0.0.0.0/0 for the new Firewall rule id=" + firewallRuleId + " with statement " + pstmt); + pstmt.executeUpdate(); + } + } + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to set egress firewall rules ", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + } + + + private void removeFirewallServiceFromSharedNetworkOfferingWithSGService(Connection conn) { + PreparedStatement pstmt = null; + ResultSet rs = null; + + try { + pstmt = conn.prepareStatement("select id from `cloud`.`network_offerings` where unique_name='DefaultSharedNetworkOfferingWithSGService'"); + rs = pstmt.executeQuery(); + while (rs.next()) { + long id = rs.getLong(1); + // remove Firewall service for SG shared network offering + pstmt = conn.prepareStatement("DELETE FROM `cloud`.`ntwk_offering_service_map` where network_offering_id=? and service='Firewall'"); + pstmt.setLong(1, id); + pstmt.executeUpdate(); + } + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to remove Firewall service for SG shared network offering.", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + } + + private void fix22xKVMSnapshots(Connection conn) { + PreparedStatement pstmt = null; + ResultSet rs = null; + s_logger.debug("Updating KVM snapshots"); + try { + pstmt = conn.prepareStatement("select id, backup_snap_id from `cloud`.`snapshots` where hypervisor_type='KVM' and removed is null and backup_snap_id is not null"); + rs = pstmt.executeQuery(); + while (rs.next()) { + long id = rs.getLong(1); + String backUpPath = rs.getString(2); + // Update Backup Path. Remove anything before /snapshots/ + // e.g 22x Path /mnt/0f14da63-7033-3ca5-bdbe-fa62f4e2f38a/snapshots/1/2/6/i-2-6-VM_ROOT-6_20121219072022 + // Above path should change to /snapshots/1/2/6/i-2-6-VM_ROOT-6_20121219072022 + int index = backUpPath.indexOf("snapshots"+File.separator); + if (index > 1){ + String correctedPath = File.separator + backUpPath.substring(index); + s_logger.debug("Updating Snapshot with id: "+id+" original backup path: "+backUpPath+ " updated backup path: "+correctedPath); + pstmt = conn.prepareStatement("UPDATE `cloud`.`snapshots` set backup_snap_id=? where id = ?"); + pstmt.setString(1, correctedPath); + pstmt.setLong(2, id); + pstmt.executeUpdate(); + } + } + s_logger.debug("Done updating KVM snapshots"); + } catch (SQLException e) { + throw new CloudRuntimeException("Unable to update backup id for KVM snapshots", e); + } finally { + try { + if (rs != null) { + rs.close(); + } + + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + } + + @Override + public File[] getCleanupScripts() { + String script = Script.findScript("", "db/schema-305to306-cleanup.sql"); + if (script == null) { + throw new CloudRuntimeException("Unable to find db/schema-305to306-cleanup.sql"); + } + + return new File[] { new File(script) }; + } + +} diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java new file mode 100644 index 00000000000..cf47deafdac --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java @@ -0,0 +1,113 @@ +/*Copyright 2012 Citrix Systems, Inc. Licensed under the +Apache License, Version 2.0 (the "License"); you may not use this +file except in compliance with the License. Citrix Systems, Inc. +reserves all rights not expressly granted by 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.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + +import org.apache.log4j.Logger; + +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; + +public class Upgrade306to307 extends Upgrade30xBase implements DbUpgrade { + final static Logger s_logger = Logger.getLogger(Upgrade306to307.class); + + @Override + public String[] getUpgradableVersionRange() { + return new String[] { "3.0.6", "3.0.7" }; + } + + @Override + public String getUpgradedVersion() { + return "3.0.7"; + } + + @Override + public boolean supportsRollingUpgrade() { + return true; + } + + @Override + public File[] getPrepareScripts() { + String script = Script.findScript("", "db/schema-306to307.sql"); + if (script == null) { + throw new CloudRuntimeException("Unable to find db/schema-306to307.sql"); + } + + return new File[] { new File(script) }; + } + + @Override + public void performDataMigration(Connection conn) { + updateConcurrentConnectionsInNetworkOfferings(conn); + } + + @Override + public File[] getCleanupScripts() { + + return null; + } + + protected void updateConcurrentConnectionsInNetworkOfferings(Connection conn) { + PreparedStatement pstmt = null; + ResultSet rs = null; + ResultSet rs1 = null; + ResultSet rs2 = null; + try { + pstmt = conn.prepareStatement("select network_id, value from `cloud`.`network_details` where name='maxconnections'"); + rs = pstmt.executeQuery(); + while (rs.next()) { + long networkId = rs.getLong(1); + int maxconnections = Integer.parseInt(rs.getString(2)); + pstmt = conn.prepareStatement("select network_offering_id from `cloud`.`networks` where id= ?"); + pstmt.setLong(1, networkId); + rs1 = pstmt.executeQuery(); + if (rs1.next()) { + long network_offering_id = rs1.getLong(1); + pstmt = conn.prepareStatement("select concurrent_connections from `cloud`.`network_offerings` where id= ?"); + pstmt.setLong(1,network_offering_id); + rs2 = pstmt.executeQuery(); + if ((!rs2.next()) || (rs2.getInt(1) < maxconnections)) { + pstmt = conn.prepareStatement("update network_offerings set concurrent_connections=? where id=?"); + pstmt.setInt(1, maxconnections); + pstmt.setLong(2, network_offering_id); + pstmt.executeUpdate(); + } + } + } + pstmt = conn.prepareStatement("drop table `cloud`.`network_details`"); + pstmt.executeUpdate(); + } catch (SQLException e) { + } + finally { + try { + if (rs != null) { + rs.close(); + } + + if (rs1 != null) { + rs1.close(); + } + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + } + +} diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.java new file mode 100644 index 00000000000..5c7717f83a6 --- /dev/null +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade307to410.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.upgrade.dao; + +import java.io.File; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; + +import org.apache.log4j.Logger; + +import com.cloud.utils.db.Transaction; +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); + + @Override + public String[] getUpgradableVersionRange() { + return new String[] { "3.0.7", "4.1.0" }; + } + + @Override + public String getUpgradedVersion() { + return "4.1.0"; + } + + @Override + public boolean supportsRollingUpgrade() { + return false; + } + + @Override + public File[] getPrepareScripts() { + String script = Script.findScript("", "db/schema-307to410.sql"); + if (script == null) { + throw new CloudRuntimeException("Unable to find db/schema-307to410.sql"); + } + + return new File[] { new File(script) }; + } + + @Override + public void performDataMigration(Connection conn) { + updateRegionEntries(conn); + } + + private void updateRegionEntries(Connection conn) { + int region_id = Transaction.s_region_id; + PreparedStatement pstmt = null; + try { + //Update regionId in region table + s_logger.debug("Updating region table with Id: "+region_id); + pstmt = conn.prepareStatement("update `cloud`.`region` set id = ?"); + pstmt.setInt(1, region_id); + pstmt.executeUpdate(); + + } catch (SQLException e) { + throw new CloudRuntimeException("Error while updating region entries", e); + } finally { + try { + if (pstmt != null) { + pstmt.close(); + } + } catch (SQLException e) { + } + } + } + + + @Override + public File[] getCleanupScripts() { + String script = Script.findScript("", "db/schema-307to410-cleanup.sql"); + if (script == null) { + throw new CloudRuntimeException("Unable to find db/schema-307to410-cleanup.sql"); + } + + return new File[] { new File(script) }; + } +} diff --git a/setup/db/db/schema-304to305-cleanup.sql b/setup/db/db/schema-304to305-cleanup.sql new file mode 100644 index 00000000000..78aa425e614 --- /dev/null +++ b/setup/db/db/schema-304to305-cleanup.sql @@ -0,0 +1,18 @@ +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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 cleanup from 3.0.4 to 3.0.5; + + +ALTER TABLE `cloud`.`domain_router` DROP COLUMN network_id; + diff --git a/setup/db/db/schema-304to305.sql b/setup/db/db/schema-304to305.sql new file mode 100755 index 00000000000..b1b49fdacac --- /dev/null +++ b/setup/db/db/schema-304to305.sql @@ -0,0 +1,384 @@ +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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 3.0.4 to 3.0.5; + +CREATE TABLE `cloud`.`resource_tags` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `key` varchar(255), + `value` varchar(255), + `resource_id` bigint unsigned NOT NULL, + `resource_uuid` varchar(40), + `resource_type` varchar(255), + `customer` varchar(255), + `domain_id` bigint unsigned NOT NULL COMMENT 'foreign key to domain id', + `account_id` bigint unsigned NOT NULL COMMENT 'owner of this network', + PRIMARY KEY (`id`), + CONSTRAINT `fk_tags__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`), + CONSTRAINT `fk_tags__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`), + UNIQUE `i_tags__resource_id__resource_type__key`(`resource_id`, `resource_type`, `key`), + CONSTRAINT `uc_resource_tags__uuid` UNIQUE (`uuid`) + ) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vpc_offerings` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40) NOT NULL, + `unique_name` varchar(64) UNIQUE COMMENT 'unique name of the vpc offering', + `name` varchar(255) COMMENT 'vpc name', + `display_text` varchar(255) COMMENT 'display text', + `state` char(32) COMMENT 'state of the vpc offering that has Disabled value by default', + `default` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if vpc offering is default', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + `service_offering_id` bigint unsigned COMMENT 'service offering id that virtual router is tied to', + PRIMARY KEY (`id`), + INDEX `i_vpc__removed`(`removed`), + CONSTRAINT `fk_vpc_offerings__service_offering_id` FOREIGN KEY `fk_vpc_offerings__service_offering_id` (`service_offering_id`) REFERENCES `service_offering`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vpc_offering_service_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `vpc_offering_id` bigint unsigned NOT NULL COMMENT 'vpc_offering_id', + `service` varchar(255) NOT NULL COMMENT 'service', + `provider` varchar(255) COMMENT 'service provider', + `created` datetime COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_vpc_offering_service_map__vpc_offering_id` FOREIGN KEY(`vpc_offering_id`) REFERENCES `vpc_offerings`(`id`) ON DELETE CASCADE, + UNIQUE (`vpc_offering_id`, `service`, `provider`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vpc` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40) NOT NULL, + `name` varchar(255) COMMENT 'vpc name', + `display_text` varchar(255) COMMENT 'vpc display text', + `cidr` varchar(18) COMMENT 'vpc cidr', + `vpc_offering_id` bigint unsigned NOT NULL COMMENT 'vpc offering id that this vpc is created from', + `zone_id` bigint unsigned NOT NULL COMMENT 'the id of the zone this Vpc belongs to', + `state` varchar(32) NOT NULL COMMENT 'state of the VP (can be Enabled and Disabled)', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain the vpc belongs to', + `account_id` bigint unsigned NOT NULL COMMENT 'owner of this vpc', + `network_domain` varchar(255) COMMENT 'network domain', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + `restart_required` int(1) unsigned NOT NULL DEFAULT 0 COMMENT '1 if restart is required for the VPC', + PRIMARY KEY (`id`), + INDEX `i_vpc__removed`(`removed`), + CONSTRAINT `fk_vpc__zone_id` FOREIGN KEY `fk_vpc__zone_id` (`zone_id`) REFERENCES `data_center` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_vpc__vpc_offering_id` FOREIGN KEY (`vpc_offering_id`) REFERENCES `vpc_offerings`(`id`), + CONSTRAINT `fk_vpc__account_id` FOREIGN KEY `fk_vpc__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_vpc__domain_id` FOREIGN KEY `fk_vpc__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`router_network_ref` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `router_id` bigint unsigned NOT NULL COMMENT 'router id', + `network_id` bigint unsigned NOT NULL COMMENT 'network id', + `guest_type` char(32) COMMENT 'type of guest network that can be shared or isolated', + PRIMARY KEY (`id`), + CONSTRAINT `fk_router_network_ref__networks_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE, + UNIQUE `i_router_network_ref__router_id__network_id`(`router_id`, `network_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`vpc_gateways` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `ip4_address` char(40) COMMENT 'ip4 address of the gateway', + `netmask` varchar(15) COMMENT 'netmask of the gateway', + `gateway` varchar(15) COMMENT 'gateway', + `vlan_tag` varchar(255), + `type` varchar(32) COMMENT 'type of gateway; can be Public/Private/Vpn', + `network_id` bigint unsigned NOT NULL COMMENT 'network id vpc gateway belongs to', + `vpc_id` bigint unsigned NOT NULL COMMENT 'id of the vpc the gateway belongs to', + `zone_id` bigint unsigned NOT NULL COMMENT 'id of the zone the gateway belongs to', + `created` datetime COMMENT 'date created', + `account_id` bigint unsigned NOT NULL COMMENT 'owner id', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', + `state` varchar(32) NOT NULL COMMENT 'what state the vpc gateway in', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_vpc_gateways__network_id` FOREIGN KEY `fk_vpc_gateways__network_id`(`network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_vpc_gateways__vpc_id` FOREIGN KEY `fk_vpc_gateways__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`), + CONSTRAINT `fk_vpc_gateways__zone_id` FOREIGN KEY `fk_vpc_gateways__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), + CONSTRAINT `fk_vpc_gateways__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_vpc_gateways__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_vpc_gateways__uuid` UNIQUE (`uuid`), + INDEX `i_vpc_gateways__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`private_ip_address` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'primary key', + `ip_address` char(40) NOT NULL COMMENT 'ip address', + `network_id` bigint unsigned NOT NULL COMMENT 'id of the network ip belongs to', + `reservation_id` char(40) COMMENT 'reservation id', + `mac_address` varchar(17) COMMENT 'mac address', + `vpc_id` bigint unsigned COMMENT 'vpc this ip belongs to', + `taken` datetime COMMENT 'Date taken', + PRIMARY KEY (`id`), + CONSTRAINT `fk_private_ip_address__vpc_id` FOREIGN KEY `fk_private_ip_address__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`), + CONSTRAINT `fk_private_ip_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks` (`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`static_routes` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `vpc_gateway_id` bigint unsigned COMMENT 'id of the corresponding ip address', + `cidr` varchar(18) COMMENT 'cidr for the static route', + `state` char(32) NOT NULL COMMENT 'current state of this rule', + `vpc_id` bigint unsigned COMMENT 'vpc the firewall rule is associated with', + `account_id` bigint unsigned NOT NULL COMMENT 'owner id', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain id', + `created` datetime COMMENT 'Date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_static_routes__vpc_gateway_id` FOREIGN KEY(`vpc_gateway_id`) REFERENCES `vpc_gateways`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_static_routes__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_static_routes__account_id` FOREIGN KEY(`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_static_routes__domain_id` FOREIGN KEY(`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_static_routes__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +ALTER TABLE `cloud`.`networks` ADD COLUMN `vpc_id` bigint unsigned COMMENT 'vpc this network belongs to'; +ALTER TABLE `cloud`.`networks`ADD CONSTRAINT `fk_networks__vpc_id` FOREIGN KEY(`vpc_id`) REFERENCES `vpc`(`id`); + +ALTER TABLE `cloud`.`firewall_rules` ADD COLUMN `vpc_id` bigint unsigned COMMENT 'vpc the firewall rule is associated with'; +ALTER TABLE `cloud`.`firewall_rules` ADD COLUMN `traffic_type` char(32) COMMENT 'the type of the rule, can be Ingress or Egress'; +ALTER TABLE `cloud`.`firewall_rules` MODIFY `ip_address_id` bigint unsigned COMMENT 'id of the corresponding ip address'; +ALTER TABLE `cloud`.`firewall_rules` ADD CONSTRAINT `fk_firewall_rules__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE; + + +ALTER TABLE `cloud`.`user_ip_address` ADD COLUMN `vpc_id` bigint unsigned COMMENT 'vpc the ip address is associated with'; +ALTER TABLE `cloud`.`user_ip_address` ADD CONSTRAINT `fk_user_ip_address__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc`(`id`) ON DELETE CASCADE; + +ALTER TABLE `cloud`.`domain_router` ADD COLUMN `vpc_id` bigint unsigned COMMENT 'correlated virtual router vpc ID'; +ALTER TABLE `cloud`.`domain_router` ADD CONSTRAINT `fk_domain_router__vpc_id` FOREIGN KEY `fk_domain_router__vpc_id`(`vpc_id`) REFERENCES `vpc`(`id`); + + +ALTER TABLE `cloud`.`physical_network_service_providers` ADD COLUMN `networkacl_service_provided` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is Network ACL service provided'; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vpc.cleanup.interval', '3600', 'The interval (in seconds) between cleanup for Inactive VPCs'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vpc.max.networks', '3', 'Maximum number of networks per vpc'); + + +CREATE TABLE `cloud`.`counter` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `source` varchar(255) NOT NULL COMMENT 'source e.g. netscaler, snmp', + `name` varchar(255) NOT NULL COMMENT 'Counter name', + `value` varchar(255) NOT NULL COMMENT 'Value in case of source=snmp', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `uc_counter__uuid` UNIQUE (`uuid`), + INDEX `i_counter__removed`(`removed`), + INDEX `i_counter__source`(`source`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`conditions` ( + `id` bigint unsigned NOT NULL UNIQUE AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `counter_id` bigint unsigned NOT NULL COMMENT 'Counter Id', + `threshold` bigint unsigned NOT NULL COMMENT 'threshold value for the given counter', + `relational_operator` char(2) COMMENT 'relational operator to be used upon the counter and condition', + `domain_id` bigint unsigned NOT NULL COMMENT 'domain the Condition belongs to', + `account_id` bigint unsigned NOT NULL COMMENT 'owner of this Condition', + `removed` datetime COMMENT 'date removed if not null', + `created` datetime NOT NULL COMMENT 'date created', + PRIMARY KEY (`id`), + CONSTRAINT `fk_conditions__counter_id` FOREIGN KEY `fk_condition__counter_id`(`counter_id`) REFERENCES `counter`(`id`), + CONSTRAINT `fk_conditions__account_id` FOREIGN KEY `fk_condition__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_conditions__domain_id` FOREIGN KEY `fk_condition__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_conditions__uuid` UNIQUE (`uuid`), + INDEX `i_conditions__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_vmprofiles` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `zone_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `autoscale_user_id` bigint unsigned NOT NULL, + `service_offering_id` bigint unsigned NOT NULL, + `template_id` bigint unsigned NOT NULL, + `other_deploy_params` varchar(1024) COMMENT 'other deployment parameters that is in addition to zoneid,serviceofferingid,domainid', + `destroy_vm_grace_period` int unsigned COMMENT 'the time allowed for existing connections to get closed before a vm is destroyed', + `counter_params` varchar(1024) COMMENT 'the parameters for the counter to be used to get metric information from VMs', + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_vmprofiles__domain_id` FOREIGN KEY `fk_autoscale_vmprofiles__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmprofiles__account_id` FOREIGN KEY `fk_autoscale_vmprofiles__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmprofiles__autoscale_user_id` FOREIGN KEY `fk_autoscale_vmprofiles__autoscale_user_id` (`autoscale_user_id`) REFERENCES `user`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_autoscale_vmprofiles__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_vmprofiles__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_policies` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `duration` int unsigned NOT NULL, + `quiet_time` int unsigned NOT NULL, + `action` varchar(15), + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_policies__domain_id` FOREIGN KEY `fk_autoscale_policies__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_policies__account_id` FOREIGN KEY `fk_autoscale_policies__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_autoscale_policies__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_policies__removed`(`removed`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_vmgroups` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `zone_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `load_balancer_id` bigint unsigned NOT NULL, + `min_members` int unsigned DEFAULT 1, + `max_members` int unsigned NOT NULL, + `member_port` int unsigned NOT NULL, + `interval` int unsigned NOT NULL, + `profile_id` bigint unsigned NOT NULL, + `state` varchar(255) NOT NULL COMMENT 'enabled or disabled, a vmgroup is disabled to stop autoscaling activity', + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_vmgroup__autoscale_vmprofile_id` FOREIGN KEY(`profile_id`) REFERENCES `autoscale_vmprofiles`(`id`), + CONSTRAINT `fk_autoscale_vmgroup__load_balancer_id` FOREIGN KEY(`load_balancer_id`) REFERENCES `load_balancing_rules`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroups__domain_id` FOREIGN KEY `fk_autoscale_vmgroups__domain_id` (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroups__account_id` FOREIGN KEY `fk_autoscale_vmgroups__account_id` (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroups__zone_id` FOREIGN KEY `fk_autoscale_vmgroups__zone_id`(`zone_id`) REFERENCES `data_center`(`id`), + CONSTRAINT `uc_autoscale_vmgroups__uuid` UNIQUE (`uuid`), + INDEX `i_autoscale_vmgroups__removed`(`removed`), + INDEX `i_autoscale_vmgroups__load_balancer_id`(`load_balancer_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_policy_condition_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `policy_id` bigint unsigned NOT NULL, + `condition_id` bigint unsigned NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_policy_condition_map__policy_id` FOREIGN KEY `fk_autoscale_policy_condition_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_policy_condition_map__condition_id` FOREIGN KEY `fk_autoscale_policy_condition_map__condition_id` (`condition_id`) REFERENCES `conditions` (`id`), + INDEX `i_autoscale_policy_condition_map__policy_id`(`policy_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`autoscale_vmgroup_policy_map` ( + `id` bigint unsigned NOT NULL auto_increment, + `vmgroup_id` bigint unsigned NOT NULL, + `policy_id` bigint unsigned NOT NULL, + PRIMARY KEY (`id`), + CONSTRAINT `fk_autoscale_vmgroup_policy_map__vmgroup_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__vmgroup_id` (`vmgroup_id`) REFERENCES `autoscale_vmgroups` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_autoscale_vmgroup_policy_map__policy_id` FOREIGN KEY `fk_autoscale_vmgroup_policy_map__policy_id` (`policy_id`) REFERENCES `autoscale_policies` (`id`), + INDEX `i_autoscale_vmgroup_policy_map__vmgroup_id`(`vmgroup_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (1,'snmp','Linux User CPU - percentage', '1.3.6.1.4.1.2021.11.9.0', now()); +INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (2,'snmp','Linux System CPU - percentage', '1.3.6.1.4.1.2021.11.10.0', now()); +INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (3,'snmp','Linux CPU Idle - percentage', '1.3.6.1.4.1.2021.11.11.0', now()); +INSERT INTO `cloud`.`counter` (id, source, name, value,created) VALUES (100,'netscaler','Response Time - microseconds', 'RESPTIME', now()); + +CREATE TABLE `cloud`.`s2s_vpn_gateway` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `addr_id` bigint unsigned NOT NULL, + `vpc_id` bigint unsigned NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_s2s_vpn_gateway__addr_id` FOREIGN KEY (`addr_id`) REFERENCES `user_ip_address` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_gateway__vpc_id` FOREIGN KEY (`vpc_id`) REFERENCES `vpc` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_gateway__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_gateway__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_s2s_vpn_gateway__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`s2s_customer_gateway` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `name` varchar(255) NOT NULL, + `gateway_ip` char(40) NOT NULL, + `guest_cidr_list` varchar(200) NOT NULL, + `ipsec_psk` varchar(256), + `ike_policy` varchar(30) NOT NULL, + `esp_policy` varchar(30) NOT NULL, + `ike_lifetime` int NOT NULL DEFAULT 86400, + `esp_lifetime` int NOT NULL DEFAULT 3600, + `dpd` int(1) NOT NULL DEFAULT 0, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_s2s_customer_gateway__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_customer_gateway__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_s2s_customer_gateway__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`s2s_vpn_connection` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `uuid` varchar(40), + `vpn_gateway_id` bigint unsigned NULL, + `customer_gateway_id` bigint unsigned NULL, + `state` varchar(32) NOT NULL, + `domain_id` bigint unsigned NOT NULL, + `account_id` bigint unsigned NOT NULL, + `created` datetime NOT NULL COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + PRIMARY KEY (`id`), + CONSTRAINT `fk_s2s_vpn_connection__vpn_gateway_id` FOREIGN KEY (`vpn_gateway_id`) REFERENCES `s2s_vpn_gateway` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_connection__customer_gateway_id` FOREIGN KEY (`customer_gateway_id`) REFERENCES `s2s_customer_gateway` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_connection__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_s2s_vpn_connection__domain_id` FOREIGN KEY (`domain_id`) REFERENCES `domain`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_s2s_vpn_connection__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`data_center` ADD COLUMN `is_local_storage_enabled` tinyint NOT NULL DEFAULT 0 COMMENT 'Is local storage offering enabled for this data center; 1: enabled, 0: not'; +UPDATE `cloud`.`data_center` SET `is_local_storage_enabled` = IF ((SELECT `value` FROM `cloud`.`configuration` WHERE `name`='use.local.storage')='true', 1, 0) WHERE `removed` IS NULL; +DELETE FROM `cloud`.`configuration` where name='use.local.storage'; + +ALTER TABLE `cloud`.`hypervisor_capabilities` ADD COLUMN `max_data_volumes_limit` int unsigned DEFAULT 6 COMMENT 'Max. data volumes per VM supported by hypervisor'; + +UPDATE `cloud`.`hypervisor_capabilities` SET `max_data_volumes_limit`=13 WHERE `hypervisor_type`='XenServer' AND (`hypervisor_version`='6.0' OR `hypervisor_version`='6.0.2'); + +UPDATE `cloud`.`configuration` SET description='In second, timeout for creating volume from snapshot' WHERE name='create.volume.from.snapshot.wait'; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Account Defaults', 'DEFAULT', 'management-server', 'max.account.vpcs', '20', 'The default maximum number of vpcs that can be created for an account'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Project Defaults', 'DEFAULT', 'management-server', 'max.project.vpcs', '20', 'The default maximum number of vpcs that can be created for a project'); + +UPDATE `cloud`.`configuration` SET category='Network' WHERE name='guest.domain.suffix'; +UPDATE `cloud`.`configuration` SET component='management-server' WHERE name='agent.lb.enabled'; +UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='backup.snapshot.wait'; +UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='copy.volume.wait'; +UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='create.volume.from.snapshot.wait'; +UPDATE `cloud`.`configuration` SET component='TemplateManager' WHERE name='primary.storage.download.wait'; +UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='storage.cleanup.enabled'; +UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='storage.cleanup.interval'; +UPDATE `cloud`.`configuration` SET description='Comma separated list of cidrs internal to the datacenter that can host template download servers, please note 0.0.0.0 is not a valid site ' WHERE name='secstorage.allowed.internal.sites'; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.vpngateway.connection.limit', '4', 'The maximum number of VPN connection per VPN gateway'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.customergateway.subnets.limit', '10', 'The maximum number of subnets per customer gateway'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Usage', 'DEFAULT', 'management-server', 'traffic.sentinel.include.zones', 'EXTERNAL', 'Traffic going into specified list of zones is metered. For metering all traffic leave this parameter empty'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Usage', 'DEFAULT', 'management-server', 'traffic.sentinel.exclude.zones', '', 'Traffic going into specified list of zones is not metered'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'ha.workers', '5', 'Number of ha worker threads'); + +DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_account`; +UPDATE `cloud`.`snapshots` set swift_id=null where swift_id=0; +DELETE FROM `cloud`.`host_details` where name in ('storage.network.device1', 'storage.network.device2'); diff --git a/setup/db/db/schema-305to306-cleanup.sql b/setup/db/db/schema-305to306-cleanup.sql new file mode 100644 index 00000000000..ff70c7ce3bd --- /dev/null +++ b/setup/db/db/schema-305to306-cleanup.sql @@ -0,0 +1,21 @@ +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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 cleanup from 3.0.5 to 3.0.6; + + +DELETE FROM `cloud`.`configuration` where `cloud`.`configuration`.`name`="vm.hostname.flag"; +DELETE FROM `cloud`.`storage_pool_host_ref` WHERE `cloud`.`storage_pool_host_ref`.`pool_id` IN (SELECT `cloud`.`storage_pool`.`id` FROM `cloud`.`storage_pool` WHERE `cloud`.`storage_pool`.`removed` IS NOT NULL); + +ALTER TABLE `cloud`.`sync_queue` DROP COLUMN queue_proc_msid; +ALTER TABLE `cloud`.`sync_queue` DROP COLUMN queue_proc_time; \ No newline at end of file diff --git a/setup/db/db/schema-305to306.sql b/setup/db/db/schema-305to306.sql new file mode 100755 index 00000000000..960928174ad --- /dev/null +++ b/setup/db/db/schema-305to306.sql @@ -0,0 +1,91 @@ +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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 3.0.5 to 3.0.6; + +ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `eip_associate_public_ip` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if public IP is associated with user VM creation by default when EIP service is enabled.' AFTER `elastic_ip_service`; +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ('VmWare', 'Red Hat Enterprise Linux 6.0(32-bit)', 136); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ('VmWare', 'Red Hat Enterprise Linux 6.0(64-bit)', 137); + +UPDATE `cloud`.`user` SET PASSWORD=RAND() WHERE id=1; + +ALTER TABLE `cloud`.`sync_queue` ADD COLUMN `queue_size` smallint DEFAULT 0 COMMENT 'number of items being processed by the queue'; +ALTER TABLE `cloud`.`sync_queue` ADD COLUMN `queue_size_limit` smallint DEFAULT 1 COMMENT 'max number of items the queue can process concurrently'; +ALTER TABLE `cloud`.`sync_queue_item` ADD COLUMN `queue_proc_time` datetime COMMENT 'when processing started for the item'; +ALTER TABLE `cloud`.`sync_queue_item` ADD KEY `i_sync_queue__queue_proc_time`(`queue_proc_time`); + +ALTER TABLE `cloud`.`usage_event` ADD COLUMN `virtual_size` bigint unsigned; +ALTER TABLE `cloud_usage`.`usage_event` ADD COLUMN `virtual_size` bigint unsigned; +ALTER TABLE `cloud_usage`.`usage_storage` ADD COLUMN `virtual_size` bigint unsigned; +ALTER TABLE `cloud_usage`.`cloud_usage` ADD COLUMN `virtual_size` bigint unsigned; +ALTER TABLE `cloud`.`volumes` ADD COLUMN `iso_id` bigint unsigned COMMENT 'Records the iso id from which the vm is created' AFTER `template_id` ; + +ALTER TABLE `cloud`.`external_load_balancer_devices` DROP COLUMN `is_inline`; +ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `inline` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'Is this network offering LB provider is in inline mode'; + +ALTER TABLE `cloud`.`inline_load_balancer_nic_map` DROP FOREIGN KEY fk_inline_load_balancer_nic_map__load_balancer_id; +ALTER TABLE `cloud`.`inline_load_balancer_nic_map` DROP COLUMN load_balancer_id; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'concurrent.snapshots.threshold.perhost', null, 'Limits number of snapshots that can be handled by the host concurrently; default is NULL - unlimited'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'xen.update.url', 'http://updates.xensource.com/XenServer/updates.xml', 'URL to get the latest XenServer updates'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'update.check.interval', '10080', 'Interval to check XenServer updates(in minutes)'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'host.updates.enable', 'false', 'Enable/Disable Host updates checker'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network','DEFAULT','NetworkManager','network.dhcp.nondefaultnetwork.setgateway.guestos','Windows','The guest OS\'s name start with this fields would result in DHCP server response gateway information even when the network it\'s on is not default network. Names are separated by comma.'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'NetworkManager', 'router.check.poolsize' , '10', 'Numbers of threads using to check redundant router status.'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'timeout.baremetal.securitygroup.agent.echo' , '3600', 'Timeout to echo baremetal security group agent, in seconds, the provisioning process will be treated as a failure'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'interval.baremetal.securitygroup.agent.echo' , '10', 'Interval to echo baremetal security group agent, in seconds'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'enable.baremetal.securitygroup.agent.echo' , 'false', 'After starting provision process, periodcially echo security agent installed in the template. Treat provisioning as success only if echo successfully'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'recreate.systemvm.enabled' , 'false', 'If true, will recreate system vm root disk whenever starting system vm'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vm.instancename.flag' , 'false', 'If true, will append guest VMs display Name (if set) to its internal name and set hostname and display name to the conjoined value'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'vmware.additional.vnc.portrange.size' , '1000', 'Start port number of additional VNC port range'); + +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled, max_data_volumes_limit) VALUES ('XenServer', '6.1.0', 50, 1, 13); +INSERT IGNORE INTO `cloud`.`hypervisor_capabilities`(hypervisor_type, hypervisor_version, max_guests_limit, security_group_enabled) VALUES ('VMware', '5.1', 128, 0); + +INSERT INTO `cloud`.`guest_os` (id, category_id, name, uuid, display_name) VALUES (206, 6, NULL, '8ceb2da9-62cd-53d4-ac8a-d0563d9bec2d', 'Windows 8(64-bit)'); + + +CREATE TABLE `cloud`.`host_updates` ( + `id` bigint unsigned NOT NULL auto_increment, + `uuid` varchar(40), + `label` varchar(40), + `description` varchar(999), + `after_apply_guidance` varchar(40), + `url` varchar(999), + `timestamp` varchar(80), + PRIMARY KEY (`id`), + CONSTRAINT `uc_host_updates__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`host_updates_ref` ( + `id` bigint unsigned NOT NULL auto_increment, + `host_id` bigint unsigned NOT NULL, + `patch_id` bigint unsigned NOT NULL, + `update_applied` tinyint(1) NOT NULL default '0', + PRIMARY KEY (`id`), + CONSTRAINT `uc_host_updates__host_patch_id` UNIQUE (`host_id`, `patch_id`), + CONSTRAINT `fk_host_updates__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'AgentManager', 'xen.nics.max', '7', 'Maximum allowed nics for Vms created on Xen'); + +UPDATE `cloud`.`networks` set name='Shared SG enabled network', display_text='Shared SG enabled network' WHERE name IS null AND traffic_type='Guest' AND data_center_id IN (select id from data_center where networktype='Advanced' and is_security_group_enabled=1) AND acl_type='Domain'; + +# patch UUID colomn with ID for volumes and snapshot_policy tables +UPDATE `cloud`.`volumes` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`snapshot_policy` set uuid=id WHERE uuid is NULL; diff --git a/setup/db/db/schema-306to307.sql b/setup/db/db/schema-306to307.sql new file mode 100644 index 00000000000..b0fa1374c87 --- /dev/null +++ b/setup/db/db/schema-306to307.sql @@ -0,0 +1,17 @@ +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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 3.0.6 to 3.0.7; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'network.loadbalancer.haproxy.max.conn', '4096', 'Load Balancer(haproxy) maximum number of concurrent connections(global max)'); + +ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `concurrent_connections` int(10) unsigned COMMENT 'concurrent connections supported on this network'; \ No newline at end of file diff --git a/setup/db/db/schema-307to410-cleanup.sql b/setup/db/db/schema-307to410-cleanup.sql new file mode 100644 index 00000000000..984a6833fb3 --- /dev/null +++ b/setup/db/db/schema-307to410-cleanup.sql @@ -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. + +--; +-- Schema cleanup from 3.0.7 to 4.1.0 +--; + +# Drop the field introduced as a part of 410-420 upgrade and re-enable it back +ALTER TABLE `cloud`.`network_offerings` DROP COLUMN `eip_associate_public_ip`; +ALTER TABLE `cloud`.`network_offerings` CHANGE COLUMN `eip_associate_public_ip_1` `eip_associate_public_ip` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if public IP is associated with user VM creation by default when EIP service is enabled.' AFTER `elastic_ip_service`; + + + + + + diff --git a/setup/db/db/schema-307to410.sql b/setup/db/db/schema-307to410.sql new file mode 100644 index 00000000000..cbd564ded89 --- /dev/null +++ b/setup/db/db/schema-307to410.sql @@ -0,0 +1,1556 @@ +-- 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 compliances +-- 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 3.0.7 to 4.1.0 +--; + + + +-- DB upgrade steps from 302-40 +CREATE TABLE `cloud`.`external_nicira_nvp_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 nicira nvp device is added', + `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name corresponding to this nicira nvp device', + `device_name` varchar(255) NOT NULL COMMENT 'name of the nicira nvp device', + `host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external nicira nvp device', + PRIMARY KEY (`id`), + CONSTRAINT `fk_external_nicira_nvp_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_external_nicira_nvp_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`nicira_nvp_nic_map` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `logicalswitch` varchar(255) NOT NULL COMMENT 'nicira uuid of logical switch this port is provisioned on', + `logicalswitchport` varchar(255) UNIQUE COMMENT 'nicira uuid of this logical switch port', + `nic` varchar(255) UNIQUE COMMENT 'cloudstack uuid of the nic connected to this logical switch port', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`user` ADD COLUMN `incorrect_login_attempts` integer unsigned NOT NULL DEFAULT '0'; +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'incorrect.login.attempts.allowed', '5', 'Incorrect login attempts allowed before the user is disabled'); + +ALTER TABLE `storage_pool` ADD `user_info` VARCHAR( 255 ) NULL COMMENT 'Authorization information for the storage pool. Used by network filesystems' AFTER `host_address`; + +INSERT INTO `cloud`.`configuration` (`category`, `instance`, `component`, `name`, `value`, `description`) VALUES ('Advanced', 'DEFAULT', 'management-server', 'event.purge.interval', '86400', 'The interval (in seconds) to wait before running the event purge thread'); +-- rrq 5839 +-- Remove the unique constraint on physical_network_id, provider_name from physical_network_service_providers +-- Because the name of this contraint is not set we need this roundabout way +-- The key is also used by the foreign key constraint so drop and recreate that one +ALTER TABLE physical_network_service_providers DROP FOREIGN KEY fk_pnetwork_service_providers__physical_network_id; +SET @constraintname = (select CONCAT(CONCAT('DROP INDEX ', A.CONSTRAINT_NAME), ' ON physical_network_service_providers' ) +from information_schema.key_column_usage A +JOIN information_schema.key_column_usage B ON B.table_name = 'physical_network_service_providers' AND B.COLUMN_NAME = 'provider_name' AND A.COLUMN_NAME ='physical_network_id' AND B.CONSTRAINT_NAME=A.CONSTRAINT_NAME +where A.table_name = 'physical_network_service_providers' LIMIT 1); + +PREPARE stmt1 FROM @constraintname; +EXECUTE stmt1; +DEALLOCATE PREPARE stmt1; + +AlTER TABLE physical_network_service_providers ADD CONSTRAINT `fk_pnetwork_service_providers__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE; +UPDATE `cloud`.`configuration` SET description='Do URL encoding for the api response, false by default' WHERE name='encode.api.response'; +INSERT IGNORE INTO `cloud`.`guest_os_category` VALUES ('11','None',NULL); +UPDATE `cloud`.`configuration` set description ='Uuid of the service offering used by console proxy; if NULL - system offering will be used' where name ='consoleproxy.service.offering'; + + +-- DB upgrade steps from 40-41 +alter table vm_template add size bigint unsigned; +alter table vm_template add state varchar(255); +alter table vm_template add update_count bigint unsigned; +alter table vm_template add updated datetime; +alter table storage_pool add storage_provider_id bigint unsigned; +alter table storage_pool add scope varchar(255); +alter table storage_pool modify id bigint unsigned AUTO_INCREMENT UNIQUE NOT NULL; +alter table template_spool_ref add state varchar(255); +alter table template_spool_ref add update_count bigint unsigned; +alter table volumes add disk_type varchar(255); +alter table volumes drop foreign key `fk_volumes__account_id`; +alter table vm_instance add column disk_offering_id bigint unsigned; +alter table vm_instance add column cpu int(10) unsigned; +alter table vm_instance add column ram bigint unsigned; +alter table vm_instance add column owner varchar(255); +alter table vm_instance add column speed int(10) unsigned; +alter table vm_instance add column host_name varchar(255); +alter table vm_instance add column display_name varchar(255); +alter table vm_instance add column `desired_state` varchar(32) NULL; + +alter table data_center add column owner varchar(255); +alter table data_center add column created datetime COMMENT 'date created'; +alter table data_center add column lastUpdated datetime COMMENT 'last updated'; +alter table data_center add column engine_state varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'the engine state of the zone'; +alter table host_pod_ref add column owner varchar(255); +alter table host_pod_ref add column created datetime COMMENT 'date created'; +alter table host_pod_ref add column lastUpdated datetime COMMENT 'last updated'; +alter table host_pod_ref add column engine_state varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'the engine state of the zone'; +alter table host add column owner varchar(255); +alter table host add column lastUpdated datetime COMMENT 'last updated'; +alter table host add column engine_state varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'the engine state of the zone'; + +alter table cluster add column owner varchar(255); +alter table cluster add column created datetime COMMENT 'date created'; +alter table cluster add column lastUpdated datetime COMMENT 'last updated'; +alter table cluster add column engine_state varchar(32) NOT NULL DEFAULT 'Disabled' COMMENT 'the engine state of the zone'; + +CREATE TABLE `cloud`.`vm_compute_tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `vm_id` bigint unsigned NOT NULL COMMENT 'vm id', + `compute_tag` varchar(255) NOT NULL COMMENT 'name of tag', + PRIMARY KEY(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`vm_root_disk_tags` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `vm_id` bigint unsigned NOT NULL COMMENT 'vm id', + `root_disk_tag` varchar(255) NOT NULL COMMENT 'name of tag', + PRIMARY KEY(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`vm_network_map` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `vm_id` bigint unsigned NOT NULL COMMENT 'vm id', + `network_id` bigint unsigned NOT NULL COMMENT 'network id', + PRIMARY KEY(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +CREATE TABLE `cloud`.`vm_reservation` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40) NOT NULL COMMENT 'reservation id', + `vm_id` bigint unsigned NOT NULL COMMENT 'vm id', + `data_center_id` bigint unsigned NOT NULL COMMENT 'zone id', + `pod_id` bigint unsigned NOT NULL COMMENT 'pod id', + `cluster_id` bigint unsigned NOT NULL COMMENT 'cluster id', + `host_id` bigint unsigned NOT NULL COMMENT 'host id', + `created` datetime COMMENT 'date created', + `removed` datetime COMMENT 'date removed if not null', + CONSTRAINT `uc_vm_reservation__uuid` UNIQUE (`uuid`), + PRIMARY KEY(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`volume_reservation` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `vm_reservation_id` bigint unsigned NOT NULL COMMENT 'id of the vm reservation', + `vm_id` bigint unsigned NOT NULL COMMENT 'vm id', + `volume_id` bigint unsigned NOT NULL COMMENT 'volume id', + `pool_id` bigint unsigned NOT NULL COMMENT 'pool assigned to the volume', + CONSTRAINT `fk_vm_pool_reservation__vm_reservation_id` FOREIGN KEY (`vm_reservation_id`) REFERENCES `vm_reservation`(`id`) ON DELETE CASCADE, + PRIMARY KEY(`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`s3` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40), + `access_key` varchar(20) NOT NULL COMMENT ' The S3 access key', + `secret_key` varchar(40) NOT NULL COMMENT ' The S3 secret key', + `end_point` varchar(1024) COMMENT ' The S3 host', + `bucket` varchar(63) NOT NULL COMMENT ' The S3 host', + `https` tinyint unsigned DEFAULT NULL COMMENT ' Flag indicating whether or not to connect over HTTPS', + `connection_timeout` integer COMMENT ' The amount of time to wait (in milliseconds) when initially establishing a connection before giving up and timing out.', + `max_error_retry` integer COMMENT ' The maximum number of retry attempts for failed retryable requests (ex: 5xx error responses from services).', + `socket_timeout` integer COMMENT ' The amount of time to wait (in milliseconds) for data to be transfered over an established, open connection before the connection times out and is closed.', + `created` datetime COMMENT 'date the s3 first signed on', + PRIMARY KEY (`id`), + CONSTRAINT `uc_s3__uuid` UNIQUE (`uuid`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`template_s3_ref` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `s3_id` bigint unsigned NOT NULL COMMENT ' Associated S3 instance id', + `template_id` bigint unsigned NOT NULL COMMENT ' Associated template id', + `created` DATETIME NOT NULL COMMENT ' The creation timestamp', + `size` bigint unsigned COMMENT ' The size of the object', + `physical_size` bigint unsigned DEFAULT 0 COMMENT ' The physical size of the object', + PRIMARY KEY (`id`), + CONSTRAINT `uc_template_s3_ref__template_id` UNIQUE (`template_id`), + CONSTRAINT `fk_template_s3_ref__s3_id` FOREIGN KEY `fk_template_s3_ref__s3_id` (`s3_id`) REFERENCES `s3` (`id`) ON DELETE CASCADE, + CONSTRAINT `fk_template_s3_ref__template_id` FOREIGN KEY `fk_template_s3_ref__template_id` (`template_id`) REFERENCES `vm_template` (`id`), + INDEX `i_template_s3_ref__s3_id`(`s3_id`), + INDEX `i_template_s3_ref__template_id`(`template_id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 's3.enable', 'false', 'enable s3'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'NetworkManager', 'router.check.poolsize' , '10', 'Numbers of threads using to check redundant router status.'); + +ALTER TABLE `cloud`.`snapshots` ADD COLUMN `s3_id` bigint unsigned COMMENT 'S3 to which this snapshot will be stored'; + +ALTER TABLE `cloud`.`snapshots` ADD CONSTRAINT `fk_snapshots__s3_id` FOREIGN KEY `fk_snapshots__s3_id` (`s3_id`) REFERENCES `s3` (`id`); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network','DEFAULT','NetworkManager','network.dhcp.nondefaultnetwork.setgateway.guestos','Windows','The guest OS\'s name start with this fields would result in DHCP server response gateway information even when the network it\'s on is not default network. Names are separated by comma.'); + +ALTER TABLE upload ADD uuid VARCHAR(40); + +ALTER TABLE async_job modify job_cmd VARCHAR(255); + +ALTER TABLE `cloud`.`alert` ADD INDEX `last_sent` (`last_sent` DESC) ; + +ALTER TABLE `cloud`.`network_offerings` ADD COLUMN `is_persistent` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if the network offering provides an ability to create persistent networks'; + + +-- populate uuid column with db id if uuid is null +UPDATE `cloud`.`account` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`alert` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`async_job` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`cluster` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`data_center` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`disk_offering` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`domain` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`event` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`external_firewall_devices` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`external_load_balancer_devices` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`external_nicira_nvp_devices` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`firewall_rules` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`guest_os` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`guest_os_category` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`host` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`host_pod_ref` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`hypervisor_capabilities` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`instance_group` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`load_balancer_stickiness_policies` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`network_external_firewall_device_map` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`network_external_lb_device_map` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`network_offerings` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`networks` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`nics` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`physical_network` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`physical_network_service_providers` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`physical_network_traffic_types` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`port_profile` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`project_invitations` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`projects` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`resource_tags` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`s2s_customer_gateway` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`s2s_vpn_connection` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`s2s_vpn_gateway` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`security_group` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`security_group_rule` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`snapshot_schedule` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`snapshots` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`static_routes` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`storage_pool` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`swift` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`upload` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`user` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`user_ip_address` set uuid=id WHERE uuid is NULL; +-- UPDATE `cloud`.`user_vm_temp` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`virtual_router_providers` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`virtual_supervisor_module` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`vlan` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`vm_instance` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`vm_template` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`vpc` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`vpc_gateways` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`vpc_offerings` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`vpn_users` set uuid=id WHERE uuid is NULL; +UPDATE `cloud`.`volumes` set uuid=id WHERE uuid is NULL; +-- UPDATE `cloud`.`autoscale_vmgroups` set uuid=id WHERE uuid is NULL; +-- UPDATE `cloud`.`autoscale_vmprofiles` set uuid=id WHERE uuid is NULL; +-- UPDATE `cloud`.`autoscale_policies` set uuid=id WHERE uuid is NULL; +-- UPDATE `cloud`.`counter` set uuid=id WHERE uuid is NULL; +-- UPDATE `cloud`.`conditions` set uuid=id WHERE uuid is NULL; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'detail.batch.query.size', '2000', 'Default entity detail batch query size for listing'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'api.throttling.enabled', 'false', 'Enable/Disable Api rate limit'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'api.throttling.interval', '1', 'Time interval (in seconds) to reset API count'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'api.throttling.max', '25', 'Max allowed number of APIs within fixed interval'); +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'api.throttling.cachesize', '50000', 'Account based API count cache size'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'direct.agent.pool.size', '500', 'Default size for DirectAgentPool'); + +ALTER TABLE `cloud`.`op_dc_vnet_alloc` DROP INDEX i_op_dc_vnet_alloc__vnet__data_center_id; + +ALTER TABLE `cloud`.`op_dc_vnet_alloc` ADD CONSTRAINT UNIQUE `i_op_dc_vnet_alloc__vnet__data_center_id`(`vnet`, `physical_network_id`, `data_center_id`); + +ALTER TABLE `cloud`.`op_dc_vnet_alloc` DROP INDEX i_op_dc_vnet_alloc__vnet__data_center_id__account_id; + +CREATE TABLE `cloud`.`region` ( + `id` int unsigned NOT NULL UNIQUE, + `name` varchar(255) NOT NULL UNIQUE, + `end_point` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +INSERT INTO `cloud`.`region` values ('1','Local','http://localhost:8080/client/'); + +CREATE TABLE `cloud`.`nicira_nvp_router_map` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `logicalrouter_uuid` varchar(255) NOT NULL UNIQUE COMMENT 'nicira uuid of logical router', + `network_id` bigint unsigned NOT NULL UNIQUE COMMENT 'cloudstack id of the network', + PRIMARY KEY (`id`), + CONSTRAINT `fk_nicira_nvp_router_map__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`external_bigswitch_vns_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 vns device is added', + `provider_name` varchar(255) NOT NULL COMMENT 'Service Provider name corresponding to this bigswitch vns device', + `device_name` varchar(255) NOT NULL COMMENT 'name of the bigswitch vns device', + `host_id` bigint unsigned NOT NULL COMMENT 'host id coresponding to the external bigswitch vns device', + PRIMARY KEY (`id`), + CONSTRAINT `fk_external_bigswitch_vns_devices__host_id` FOREIGN KEY (`host_id`) REFERENCES `host`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_external_bigswitch_vns_devices__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + + + +CREATE TABLE `cloud`.`user_ipv6_address` ( + `id` bigint unsigned NOT NULL UNIQUE auto_increment, + `uuid` varchar(40), + `account_id` bigint unsigned NULL, + `domain_id` bigint unsigned NULL, + `ip_address` char(50) NOT NULL, + `data_center_id` bigint unsigned NOT NULL COMMENT 'zone that it belongs to', + `vlan_id` bigint unsigned NOT NULL, + `state` char(32) NOT NULL default 'Free' COMMENT 'state of the ip address', + `mac_address` varchar(40) NOT NULL COMMENT 'mac address of this ip', + `source_network_id` bigint unsigned NOT NULL COMMENT 'network id ip belongs to', + `network_id` bigint unsigned COMMENT 'network this public ip address is associated with', + `physical_network_id` bigint unsigned NOT NULL COMMENT 'physical network id that this configuration is based on', + `created` datetime NULL COMMENT 'Date this ip was allocated to someone', + PRIMARY KEY (`id`), + UNIQUE (`ip_address`, `source_network_id`), + CONSTRAINT `fk_user_ipv6_address__source_network_id` FOREIGN KEY (`source_network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_user_ipv6_address__network_id` FOREIGN KEY (`network_id`) REFERENCES `networks`(`id`), + CONSTRAINT `fk_user_ipv6_address__account_id` FOREIGN KEY (`account_id`) REFERENCES `account`(`id`), + CONSTRAINT `fk_user_ipv6_address__vlan_id` FOREIGN KEY (`vlan_id`) REFERENCES `vlan`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_user_ipv6_address__data_center_id` FOREIGN KEY (`data_center_id`) REFERENCES `data_center`(`id`) ON DELETE CASCADE, + CONSTRAINT `uc_user_ipv6_address__uuid` UNIQUE (`uuid`), + CONSTRAINT `fk_user_ipv6_address__physical_network_id` FOREIGN KEY (`physical_network_id`) REFERENCES `physical_network`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +ALTER TABLE `cloud`.`networks` ADD COLUMN `ip6_gateway` varchar(50) COMMENT 'IPv6 gateway for this network'; +ALTER TABLE `cloud`.`networks` ADD COLUMN `ip6_cidr` varchar(50) COMMENT 'IPv6 cidr for this network'; + +ALTER TABLE `cloud`.`nics` ADD COLUMN `ip6_gateway` varchar(50) COMMENT 'gateway for ip6 address'; +ALTER TABLE `cloud`.`nics` ADD COLUMN `ip6_cidr` varchar(50) COMMENT 'cidr for ip6 address'; + +ALTER TABLE `cloud`.`vlan` ADD COLUMN `ip6_gateway` varchar(255); +ALTER TABLE `cloud`.`vlan` ADD COLUMN `ip6_cidr` varchar(255); +ALTER TABLE `cloud`.`vlan` ADD COLUMN `ip6_range` varchar(255); + +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_dns1` varchar(255); +ALTER TABLE `cloud`.`data_center` ADD COLUMN `ip6_dns2` varchar(255); + +UPDATE `cloud`.`networks` INNER JOIN `cloud`.`vlan` ON networks.id = vlan.network_id +SET networks.gateway = vlan.vlan_gateway, networks.ip6_gateway = vlan.ip6_gateway, networks.ip6_cidr = vlan.ip6_cidr +WHERE networks.data_center_id = vlan.data_center_id AND networks.physical_network_id = vlan.physical_network_id; + +-- DB views for list api + +DROP VIEW IF EXISTS `cloud`.`user_vm_view`; +CREATE VIEW `cloud`.`user_vm_view` AS + select + vm_instance.id id, + vm_instance.name name, + user_vm.display_name display_name, + user_vm.user_data user_data, + 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, + instance_group.id instance_group_id, + instance_group.uuid instance_group_uuid, + instance_group.name instance_group_name, + vm_instance.uuid uuid, + vm_instance.last_host_id last_host_id, + vm_instance.vm_type type, + vm_instance.vnc_password vnc_password, + vm_instance.limit_cpu_use limit_cpu_use, + vm_instance.created created, + vm_instance.state state, + vm_instance.removed removed, + vm_instance.ha_enabled ha_enabled, + vm_instance.hypervisor_type hypervisor_type, + vm_instance.instance_name instance_name, + vm_instance.guest_os_id guest_os_id, + guest_os.uuid guest_os_uuid, + vm_instance.pod_id pod_id, + host_pod_ref.uuid pod_uuid, + vm_instance.private_ip_address private_ip_address, + vm_instance.private_mac_address private_mac_address, + vm_instance.vm_type vm_type, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + data_center.is_security_group_enabled security_group_enabled, + host.id host_id, + host.uuid host_uuid, + host.name host_name, + vm_template.id template_id, + vm_template.uuid template_uuid, + vm_template.name template_name, + vm_template.display_text template_display_text, + vm_template.enable_password password_enabled, + iso.id iso_id, + iso.uuid iso_uuid, + iso.name iso_name, + iso.display_text iso_display_text, + service_offering.id service_offering_id, + disk_offering.uuid service_offering_uuid, + service_offering.cpu cpu, + service_offering.speed speed, + service_offering.ram_size ram_size, + disk_offering.name service_offering_name, + storage_pool.id pool_id, + storage_pool.uuid pool_uuid, + storage_pool.pool_type pool_type, + volumes.id volume_id, + volumes.uuid volume_uuid, + volumes.device_id volume_device_id, + volumes.volume_type volume_type, + security_group.id security_group_id, + security_group.uuid security_group_uuid, + security_group.name security_group_name, + security_group.description security_group_description, + nics.id nic_id, + nics.uuid nic_uuid, + nics.network_id network_id, + nics.ip4_address ip_address, + nics.ip6_address ip6_address, + nics.ip6_gateway ip6_gateway, + nics.ip6_cidr ip6_cidr, + nics.default_nic is_default_nic, + nics.gateway gateway, + nics.netmask netmask, + nics.mac_address mac_address, + nics.broadcast_uri broadcast_uri, + nics.isolation_uri isolation_uri, + vpc.id vpc_id, + vpc.uuid vpc_uuid, + networks.uuid network_uuid, + networks.name network_name, + networks.traffic_type traffic_type, + networks.guest_type guest_type, + user_ip_address.id public_ip_id, + user_ip_address.uuid public_ip_uuid, + user_ip_address.public_ip_address public_ip_address, + ssh_keypairs.keypair_name keypair_name, + 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 + from + `cloud`.`user_vm` + inner join + `cloud`.`vm_instance` ON vm_instance.id = user_vm.id + and vm_instance.removed is NULL + inner join + `cloud`.`account` ON vm_instance.account_id = account.id + inner join + `cloud`.`domain` ON vm_instance.domain_id = domain.id + left join + `cloud`.`guest_os` ON vm_instance.guest_os_id = guest_os.id + left join + `cloud`.`host_pod_ref` ON vm_instance.pod_id = host_pod_ref.id + left join + `cloud`.`projects` ON projects.project_account_id = account.id + left join + `cloud`.`instance_group_vm_map` ON vm_instance.id = instance_group_vm_map.instance_id + left join + `cloud`.`instance_group` ON instance_group_vm_map.group_id = instance_group.id + left join + `cloud`.`data_center` ON vm_instance.data_center_id = data_center.id + left join + `cloud`.`host` ON vm_instance.host_id = host.id + left join + `cloud`.`vm_template` ON vm_instance.vm_template_id = vm_template.id + left join + `cloud`.`vm_template` iso ON iso.id = user_vm.iso_id + left join + `cloud`.`service_offering` ON vm_instance.service_offering_id = service_offering.id + left join + `cloud`.`disk_offering` ON vm_instance.service_offering_id = disk_offering.id + left join + `cloud`.`volumes` ON vm_instance.id = volumes.instance_id + left join + `cloud`.`storage_pool` ON volumes.pool_id = storage_pool.id + left join + `cloud`.`security_group_vm_map` ON vm_instance.id = security_group_vm_map.instance_id + left join + `cloud`.`security_group` ON security_group_vm_map.security_group_id = security_group.id + left join + `cloud`.`nics` ON vm_instance.id = nics.instance_id + left join + `cloud`.`networks` ON nics.network_id = networks.id + left join + `cloud`.`vpc` ON networks.vpc_id = vpc.id + left join + `cloud`.`user_ip_address` ON user_ip_address.vm_id = vm_instance.id + left join + `cloud`.`user_vm_details` ON user_vm_details.vm_id = vm_instance.id + and user_vm_details.name = 'SSH.PublicKey' + left join + `cloud`.`ssh_keypairs` ON ssh_keypairs.public_key = user_vm_details.value + left join + `cloud`.`resource_tags` ON resource_tags.resource_id = vm_instance.id + and resource_tags.resource_type = 'UserVm' + left join + `cloud`.`async_job` ON async_job.instance_id = vm_instance.id + and async_job.instance_type = 'VirtualMachine' + and async_job.job_status = 0; + +DROP VIEW IF EXISTS `cloud`.`domain_router_view`; +CREATE VIEW `cloud`.`domain_router_view` AS + select + vm_instance.id id, + vm_instance.name name, + 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, + vm_instance.uuid uuid, + vm_instance.created created, + vm_instance.state state, + vm_instance.removed removed, + vm_instance.pod_id pod_id, + vm_instance.instance_name instance_name, + host_pod_ref.uuid pod_uuid, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + data_center.dns1 dns1, + data_center.dns2 dns2, + data_center.ip6_dns1 ip6_dns1, + data_center.ip6_dns2 ip6_dns2, + host.id host_id, + host.uuid host_uuid, + host.name host_name, + vm_template.id template_id, + vm_template.uuid template_uuid, + service_offering.id service_offering_id, + disk_offering.uuid service_offering_uuid, + disk_offering.name service_offering_name, + nics.id nic_id, + nics.uuid nic_uuid, + nics.network_id network_id, + nics.ip4_address ip_address, + nics.ip6_address ip6_address, + nics.ip6_gateway ip6_gateway, + nics.ip6_cidr ip6_cidr, + nics.default_nic is_default_nic, + nics.gateway gateway, + nics.netmask netmask, + nics.mac_address mac_address, + nics.broadcast_uri broadcast_uri, + nics.isolation_uri isolation_uri, + vpc.id vpc_id, + vpc.uuid vpc_uuid, + networks.uuid network_uuid, + networks.name network_name, + networks.network_domain network_domain, + networks.traffic_type traffic_type, + networks.guest_type guest_type, + async_job.id job_id, + async_job.uuid job_uuid, + async_job.job_status job_status, + async_job.account_id job_account_id, + domain_router.template_version template_version, + domain_router.scripts_version scripts_version, + domain_router.is_redundant_router is_redundant_router, + domain_router.redundant_state redundant_state, + domain_router.stop_pending stop_pending + from + `cloud`.`domain_router` + inner join + `cloud`.`vm_instance` ON vm_instance.id = domain_router.id + inner join + `cloud`.`account` ON vm_instance.account_id = account.id + inner join + `cloud`.`domain` ON vm_instance.domain_id = domain.id + left join + `cloud`.`host_pod_ref` ON vm_instance.pod_id = host_pod_ref.id + left join + `cloud`.`projects` ON projects.project_account_id = account.id + left join + `cloud`.`data_center` ON vm_instance.data_center_id = data_center.id + left join + `cloud`.`host` ON vm_instance.host_id = host.id + left join + `cloud`.`vm_template` ON vm_instance.vm_template_id = vm_template.id + left join + `cloud`.`service_offering` ON vm_instance.service_offering_id = service_offering.id + left join + `cloud`.`disk_offering` ON vm_instance.service_offering_id = disk_offering.id + left join + `cloud`.`volumes` ON vm_instance.id = volumes.instance_id + left join + `cloud`.`storage_pool` ON volumes.pool_id = storage_pool.id + left join + `cloud`.`nics` ON vm_instance.id = nics.instance_id + left join + `cloud`.`networks` ON nics.network_id = networks.id + left join + `cloud`.`vpc` ON domain_router.vpc_id = vpc.id + left join + `cloud`.`async_job` ON async_job.instance_id = vm_instance.id + and async_job.instance_type = 'DomainRouter' + and async_job.job_status = 0; + +DROP VIEW IF EXISTS `cloud`.`security_group_view`; +CREATE VIEW `cloud`.`security_group_view` AS + select + security_group.id id, + security_group.name name, + security_group.description description, + security_group.uuid uuid, + 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, + security_group_rule.id rule_id, + security_group_rule.uuid rule_uuid, + security_group_rule.type rule_type, + security_group_rule.start_port rule_start_port, + security_group_rule.end_port rule_end_port, + security_group_rule.protocol rule_protocol, + security_group_rule.allowed_network_id rule_allowed_network_id, + security_group_rule.allowed_ip_cidr rule_allowed_ip_cidr, + security_group_rule.create_status rule_create_status, + 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 + from + `cloud`.`security_group` + left join + `cloud`.`security_group_rule` ON security_group.id = security_group_rule.security_group_id + inner join + `cloud`.`account` ON security_group.account_id = account.id + inner join + `cloud`.`domain` ON security_group.domain_id = domain.id + left join + `cloud`.`projects` ON projects.project_account_id = security_group.account_id + left join + `cloud`.`resource_tags` ON resource_tags.resource_id = security_group.id + and resource_tags.resource_type = 'SecurityGroup' + left join + `cloud`.`async_job` ON async_job.instance_id = security_group.id + and async_job.instance_type = 'SecurityGroup' + and async_job.job_status = 0; + +DROP VIEW IF EXISTS `cloud`.`resource_tag_view`; +CREATE VIEW `cloud`.`resource_tag_view` AS + select + resource_tags.id, + resource_tags.uuid, + resource_tags.key, + resource_tags.value, + resource_tags.resource_id, + resource_tags.resource_uuid, + resource_tags.resource_type, + resource_tags.customer, + 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 + from + `cloud`.`resource_tags` + inner join + `cloud`.`account` ON resource_tags.account_id = account.id + inner join + `cloud`.`domain` ON resource_tags.domain_id = domain.id + left join + `cloud`.`projects` ON projects.project_account_id = resource_tags.account_id; + + +DROP VIEW IF EXISTS `cloud`.`event_view`; +CREATE VIEW `cloud`.`event_view` AS + select + event.id, + event.uuid, + event.type, + event.state, + event.description, + event.created, + event.level, + event.parameters, + event.start_id, + eve.uuid start_uuid, + event.user_id, + user.username user_name, + 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 + from + `cloud`.`event` + inner join + `cloud`.`account` ON event.account_id = account.id + inner join + `cloud`.`domain` ON event.domain_id = domain.id + inner join + `cloud`.`user` ON event.user_id = user.id + left join + `cloud`.`projects` ON projects.project_account_id = event.account_id + left join + `cloud`.`event` eve ON event.start_id = eve.id; + +DROP VIEW IF EXISTS `cloud`.`instance_group_view`; +CREATE VIEW `cloud`.`instance_group_view` AS + select + instance_group.id, + instance_group.uuid, + instance_group.name, + instance_group.removed, + instance_group.created, + 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 + from + `cloud`.`instance_group` + inner join + `cloud`.`account` ON instance_group.account_id = account.id + inner join + `cloud`.`domain` ON account.domain_id = domain.id + left join + `cloud`.`projects` ON projects.project_account_id = instance_group.account_id; + +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, + 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, + 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; + + +DROP VIEW IF EXISTS `cloud`.`project_view`; +CREATE VIEW `cloud`.`project_view` AS + select + projects.id, + projects.uuid, + projects.name, + projects.display_text, + projects.state, + projects.removed, + projects.created, + account.account_name owner, + pacct.account_id, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path, + 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 + from + `cloud`.`projects` + inner join + `cloud`.`domain` ON projects.domain_id = domain.id + inner join + `cloud`.`project_account` ON projects.id = project_account.project_id + and project_account.account_role = 'Admin' + inner join + `cloud`.`account` ON account.id = project_account.account_id + left join + `cloud`.`resource_tags` ON resource_tags.resource_id = projects.id + and resource_tags.resource_type = 'Project' + left join + `cloud`.`project_account` pacct ON projects.id = pacct.project_id; + +DROP VIEW IF EXISTS `cloud`.`project_account_view`; +CREATE VIEW `cloud`.`project_account_view` AS + select + project_account.id, + account.id account_id, + account.uuid account_uuid, + account.account_name, + account.type account_type, + project_account.account_role, + projects.id project_id, + projects.uuid project_uuid, + projects.name project_name, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path + from + `cloud`.`project_account` + inner join + `cloud`.`account` ON project_account.account_id = account.id + inner join + `cloud`.`domain` ON account.domain_id = domain.id + inner join + `cloud`.`projects` ON projects.id = project_account.project_id; + +DROP VIEW IF EXISTS `cloud`.`project_invitation_view`; +CREATE VIEW `cloud`.`project_invitation_view` AS + select + project_invitations.id, + project_invitations.uuid, + project_invitations.email, + project_invitations.created, + project_invitations.state, + projects.id project_id, + projects.uuid project_uuid, + projects.name project_name, + account.id account_id, + account.uuid account_uuid, + account.account_name, + account.type account_type, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path + from + `cloud`.`project_invitations` + left join + `cloud`.`account` ON project_invitations.account_id = account.id + left join + `cloud`.`domain` ON project_invitations.domain_id = domain.id + left join + `cloud`.`projects` ON projects.id = project_invitations.project_id; + +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.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, + 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 + 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.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; + +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.size, + volumes.created, + volumes.state, + volumes.attached, + volumes.removed, + volumes.pod_id, + 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, + 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_host_ref.size volume_host_size, + volume_host_ref.created volume_host_created, + volume_host_ref.format, + volume_host_ref.download_pct, + volume_host_ref.download_state, + volume_host_ref.error_str, + 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, + storage_pool.id pool_id, + storage_pool.uuid pool_uuid, + storage_pool.name pool_name, + cluster.hypervisor_type, + vm_template.id template_id, + vm_template.uuid template_uuid, + vm_template.extractable, + vm_template.type template_type, + 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 + 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_host_ref` ON volumes.id = volume_host_ref.volume_id + and volumes.data_center_id = volume_host_ref.zone_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`.`cluster` ON storage_pool.cluster_id = cluster.id + left join + `cloud`.`vm_template` ON volumes.template_id = vm_template.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; + +DROP VIEW IF EXISTS `cloud`.`account_netstats_view`; +CREATE VIEW `cloud`.`account_netstats_view` AS + SELECT + account_id, + sum(net_bytes_received) + sum(current_bytes_received) as bytesReceived, + sum(net_bytes_sent) + sum(current_bytes_sent) as bytesSent + FROM + `cloud`.`user_statistics` + group by account_id; + + +DROP VIEW IF EXISTS `cloud`.`account_vmstats_view`; +CREATE VIEW `cloud`.`account_vmstats_view` AS + SELECT + account_id, state, count(*) as vmcount + from + `cloud`.`vm_instance` + group by account_id , state; + +DROP VIEW IF EXISTS `cloud`.`free_ip_view`; +CREATE VIEW `cloud`.`free_ip_view` AS + select + count(user_ip_address.id) free_ip + from + `cloud`.`user_ip_address` + inner join + `cloud`.`vlan` ON vlan.id = user_ip_address.vlan_db_id + and vlan.vlan_type = 'VirtualNetwork' + where + state = 'Free'; + +DROP VIEW IF EXISTS `cloud`.`account_view`; +CREATE VIEW `cloud`.`account_view` AS + select + account.id, + account.uuid, + account.account_name, + account.type, + account.state, + account.removed, + account.cleanup_needed, + account.network_domain, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path, + data_center.id data_center_id, + data_center.uuid data_center_uuid, + data_center.name data_center_name, + account_netstats_view.bytesReceived, + account_netstats_view.bytesSent, + vmlimit.max vmLimit, + vmcount.count vmTotal, + runningvm.vmcount runningVms, + stoppedvm.vmcount stoppedVms, + iplimit.max ipLimit, + ipcount.count ipTotal, + free_ip_view.free_ip ipFree, + volumelimit.max volumeLimit, + volumecount.count volumeTotal, + snapshotlimit.max snapshotLimit, + snapshotcount.count snapshotTotal, + templatelimit.max templateLimit, + templatecount.count templateTotal, + vpclimit.max vpcLimit, + vpccount.count vpcTotal, + projectlimit.max projectLimit, + projectcount.count projectTotal, + networklimit.max networkLimit, + networkcount.count networkTotal, + 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`.`free_ip_view`, + `cloud`.`account` + inner join + `cloud`.`domain` ON account.domain_id = domain.id + left join + `cloud`.`data_center` ON account.default_zone_id = data_center.id + left join + `cloud`.`account_netstats_view` ON account.id = account_netstats_view.account_id + left join + `cloud`.`resource_limit` vmlimit ON account.id = vmlimit.account_id + and vmlimit.type = 'user_vm' + left join + `cloud`.`resource_count` vmcount ON account.id = vmcount.account_id + and vmcount.type = 'user_vm' + left join + `cloud`.`account_vmstats_view` runningvm ON account.id = runningvm.account_id + and runningvm.state = 'Running' + left join + `cloud`.`account_vmstats_view` stoppedvm ON account.id = stoppedvm.account_id + and stoppedvm.state = 'Stopped' + left join + `cloud`.`resource_limit` iplimit ON account.id = iplimit.account_id + and iplimit.type = 'public_ip' + left join + `cloud`.`resource_count` ipcount ON account.id = ipcount.account_id + and ipcount.type = 'public_ip' + left join + `cloud`.`resource_limit` volumelimit ON account.id = volumelimit.account_id + and volumelimit.type = 'volume' + left join + `cloud`.`resource_count` volumecount ON account.id = volumecount.account_id + and volumecount.type = 'volume' + left join + `cloud`.`resource_limit` snapshotlimit ON account.id = snapshotlimit.account_id + and snapshotlimit.type = 'snapshot' + left join + `cloud`.`resource_count` snapshotcount ON account.id = snapshotcount.account_id + and snapshotcount.type = 'snapshot' + left join + `cloud`.`resource_limit` templatelimit ON account.id = templatelimit.account_id + and templatelimit.type = 'template' + left join + `cloud`.`resource_count` templatecount ON account.id = templatecount.account_id + and templatecount.type = 'template' + left join + `cloud`.`resource_limit` vpclimit ON account.id = vpclimit.account_id + and vpclimit.type = 'vpc' + left join + `cloud`.`resource_count` vpccount ON account.id = vpccount.account_id + and vpccount.type = 'vpc' + left join + `cloud`.`resource_limit` projectlimit ON account.id = projectlimit.account_id + and projectlimit.type = 'project' + left join + `cloud`.`resource_count` projectcount ON account.id = projectcount.account_id + and projectcount.type = 'project' + left join + `cloud`.`resource_limit` networklimit ON account.id = networklimit.account_id + and networklimit.type = 'network' + left join + `cloud`.`resource_count` networkcount ON account.id = networkcount.account_id + and networkcount.type = 'network' + left join + `cloud`.`async_job` ON async_job.instance_id = account.id + and async_job.instance_type = 'Account' + and async_job.job_status = 0; + +DROP VIEW IF EXISTS `cloud`.`async_job_view`; +CREATE VIEW `cloud`.`async_job_view` AS + select + 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, + user.id user_id, + user.uuid user_uuid, + async_job.id, + async_job.uuid, + async_job.job_cmd, + async_job.job_status, + async_job.job_process_status, + async_job.job_result_code, + async_job.job_result, + async_job.created, + async_job.removed, + async_job.instance_type, + async_job.instance_id, + CASE + WHEN async_job.instance_type = 'Volume' THEN volumes.uuid + WHEN + async_job.instance_type = 'Template' + or async_job.instance_type = 'Iso' + THEN + vm_template.uuid + WHEN + async_job.instance_type = 'VirtualMachine' + or async_job.instance_type = 'ConsoleProxy' + or async_job.instance_type = 'SystemVm' + or async_job.instance_type = 'DomainRouter' + THEN + vm_instance.uuid + WHEN async_job.instance_type = 'Snapshot' THEN snapshots.uuid + WHEN async_job.instance_type = 'Host' THEN host.uuid + WHEN async_job.instance_type = 'StoragePool' THEN storage_pool.uuid + WHEN async_job.instance_type = 'IpAddress' THEN user_ip_address.uuid + WHEN async_job.instance_type = 'SecurityGroup' THEN security_group.uuid + WHEN async_job.instance_type = 'PhysicalNetwork' THEN physical_network.uuid + WHEN async_job.instance_type = 'TrafficType' THEN physical_network_traffic_types.uuid + WHEN async_job.instance_type = 'PhysicalNetworkServiceProvider' THEN physical_network_service_providers.uuid + WHEN async_job.instance_type = 'FirewallRule' THEN firewall_rules.uuid + WHEN async_job.instance_type = 'Account' THEN acct.uuid + WHEN async_job.instance_type = 'User' THEN us.uuid + WHEN async_job.instance_type = 'StaticRoute' THEN static_routes.uuid + WHEN async_job.instance_type = 'PrivateGateway' THEN vpc_gateways.uuid + WHEN async_job.instance_type = 'Counter' THEN counter.uuid + WHEN async_job.instance_type = 'Condition' THEN conditions.uuid + WHEN async_job.instance_type = 'AutoScalePolicy' THEN autoscale_policies.uuid + WHEN async_job.instance_type = 'AutoScaleVmProfile' THEN autoscale_vmprofiles.uuid + WHEN async_job.instance_type = 'AutoScaleVmGroup' THEN autoscale_vmgroups.uuid + ELSE null + END instance_uuid + from + `cloud`.`async_job` + left join + `cloud`.`account` ON async_job.account_id = account.id + left join + `cloud`.`domain` ON domain.id = account.domain_id + left join + `cloud`.`user` ON async_job.user_id = user.id + left join + `cloud`.`volumes` ON async_job.instance_id = volumes.id + left join + `cloud`.`vm_template` ON async_job.instance_id = vm_template.id + left join + `cloud`.`vm_instance` ON async_job.instance_id = vm_instance.id + left join + `cloud`.`snapshots` ON async_job.instance_id = snapshots.id + left join + `cloud`.`host` ON async_job.instance_id = host.id + left join + `cloud`.`storage_pool` ON async_job.instance_id = storage_pool.id + left join + `cloud`.`user_ip_address` ON async_job.instance_id = user_ip_address.id + left join + `cloud`.`security_group` ON async_job.instance_id = security_group.id + left join + `cloud`.`physical_network` ON async_job.instance_id = physical_network.id + left join + `cloud`.`physical_network_traffic_types` ON async_job.instance_id = physical_network_traffic_types.id + left join + `cloud`.`physical_network_service_providers` ON async_job.instance_id = physical_network_service_providers.id + left join + `cloud`.`firewall_rules` ON async_job.instance_id = firewall_rules.id + left join + `cloud`.`account` acct ON async_job.instance_id = acct.id + left join + `cloud`.`user` us ON async_job.instance_id = us.id + left join + `cloud`.`static_routes` ON async_job.instance_id = static_routes.id + left join + `cloud`.`vpc_gateways` ON async_job.instance_id = vpc_gateways.id + left join + `cloud`.`counter` ON async_job.instance_id = counter.id + left join + `cloud`.`conditions` ON async_job.instance_id = conditions.id + left join + `cloud`.`autoscale_policies` ON async_job.instance_id = autoscale_policies.id + left join + `cloud`.`autoscale_vmprofiles` ON async_job.instance_id = autoscale_vmprofiles.id + left join + `cloud`.`autoscale_vmgroups` ON async_job.instance_id = autoscale_vmgroups.id; + +DROP VIEW IF EXISTS `cloud`.`storage_pool_view`; +CREATE VIEW `cloud`.`storage_pool_view` AS + select + storage_pool.id, + storage_pool.uuid, + storage_pool.name, + storage_pool.status, + storage_pool.path, + storage_pool.pool_type, + storage_pool.host_address, + storage_pool.created, + storage_pool.removed, + storage_pool.capacity_bytes, + 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, + host_pod_ref.id pod_id, + host_pod_ref.uuid pod_uuid, + host_pod_ref.name pod_name, + storage_pool_details.name tag, + op_host_capacity.used_capacity disk_used_capacity, + op_host_capacity.reserved_capacity disk_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 + from + `cloud`.`storage_pool` + left join + `cloud`.`cluster` ON storage_pool.cluster_id = cluster.id + left join + `cloud`.`data_center` ON storage_pool.data_center_id = data_center.id + left join + `cloud`.`host_pod_ref` ON storage_pool.pod_id = host_pod_ref.id + left join + `cloud`.`storage_pool_details` ON storage_pool_details.pool_id = storage_pool.id + and storage_pool_details.value = 'true' + left join + `cloud`.`op_host_capacity` ON storage_pool.id = op_host_capacity.host_id + and op_host_capacity.capacity_type = 3 + left join + `cloud`.`async_job` ON async_job.instance_id = storage_pool.id + and async_job.instance_type = 'StoragePool' + and async_job.job_status = 0; + +DROP VIEW IF EXISTS `cloud`.`disk_offering_view`; +CREATE VIEW `cloud`.`disk_offering_view` AS + select + disk_offering.id, + disk_offering.uuid, + disk_offering.name, + disk_offering.display_text, + disk_offering.disk_size, + disk_offering.created, + disk_offering.tags, + disk_offering.customized, + disk_offering.removed, + disk_offering.use_local_storage, + disk_offering.system_use, + disk_offering.sort_key, + disk_offering.type, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path + from + `cloud`.`disk_offering` + left join + `cloud`.`domain` ON disk_offering.domain_id = domain.id; + +DROP VIEW IF EXISTS `cloud`.`service_offering_view`; +CREATE VIEW `cloud`.`service_offering_view` AS + select + service_offering.id, + disk_offering.uuid, + disk_offering.name, + disk_offering.display_text, + disk_offering.created, + disk_offering.tags, + disk_offering.removed, + disk_offering.use_local_storage, + disk_offering.system_use, + service_offering.cpu, + service_offering.speed, + service_offering.ram_size, + service_offering.nw_rate, + service_offering.mc_rate, + service_offering.ha_enabled, + service_offering.limit_cpu_use, + service_offering.host_tag, + service_offering.default_use, + service_offering.vm_type, + service_offering.sort_key, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path + from + `cloud`.`service_offering` + inner join + `cloud`.`disk_offering` ON service_offering.id = disk_offering.id + left join + `cloud`.`domain` ON disk_offering.domain_id = domain.id; + +DROP VIEW IF EXISTS `cloud`.`data_center_view`; +CREATE VIEW `cloud`.`data_center_view` AS + select + data_center.id, + data_center.uuid, + data_center.name, + data_center.is_security_group_enabled, + data_center.is_local_storage_enabled, + data_center.description, + data_center.dns1, + data_center.dns2, + data_center.ip6_dns1, + data_center.ip6_dns2, + data_center.internal_dns1, + data_center.internal_dns2, + data_center.guest_network_cidr, + data_center.domain, + data_center.networktype, + data_center.allocation_state, + data_center.zone_token, + data_center.dhcp_provider, + data_center.removed, + domain.id domain_id, + domain.uuid domain_uuid, + domain.name domain_name, + domain.path domain_path + from + `cloud`.`data_center` + left join + `cloud`.`domain` ON data_center.domain_id = domain.id; + + +CREATE TABLE `cloud`.`ucs_blade` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40) UNIQUE, + `ucs_manager_id` bigint unsigned NOT NULL, + `host_id` bigint unsigned DEFAULT NULL, + `dn` varchar(512) NOT NULL, + `profile_dn` varchar(512) DEFAULT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE `cloud`.`ucs_manager` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40) UNIQUE, + `zone_id` bigint unsigned NOT NULL, + `name` varchar(128) DEFAULT NULL, + `url` varchar(255) NOT NULL, + `username` varchar(255) NOT NULL, + `password` varchar(255) NOT NULL, + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +SET foreign_key_checks = 1; + +UPDATE `cloud`.`configuration` SET value='KVM,XenServer,VMware,Ovm' WHERE name='hypervisor.list'; + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'concurrent.snapshots.threshold.perhost' , NULL, 'Limit number of snapshots that can be handled concurrently; default is NULL - unlimited.'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'network.ipv6.search.retry.max' , 10000, 'The maximum number of retrying times to search for an available IPv6 address in the table'); + + +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (163, UUID(), 10, 'Ubuntu 12.04 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (164, UUID(), 10, 'Ubuntu 12.04 (64-bit)'); + + + +#410-420 +#rename the field that already exists in 307, and that we will attempt to re-insert as a part of 41-42 upgrade +ALTER TABLE `cloud`.`network_offerings` CHANGE COLUMN `eip_associate_public_ip` `eip_associate_public_ip_1` int(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if public IP is associated with user VM creation by default when EIP service is enabled.' AFTER `elastic_ip_service`; + + +#302->307 +#create (if not exists) and rename the tables that are missing in upgraded 307 setups +CREATE TABLE IF NOT EXISTS `cloud`.`baremetal_dhcp_devices`( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40) UNIQUE, + `nsp_id` bigint unsigned DEFAULT NULL COMMENT 'Network Service Provider ID', + `pod_id` bigint unsigned DEFAULT NULL COMMENT 'Pod id where this dhcp server in', + `device_type` varchar(255) DEFAULT NULL COMMENT 'type of the external device', + `physical_network_id` bigint unsigned DEFAULT NULL COMMENT 'id of the physical network in to which external dhcp device is added', + `host_id` bigint unsigned DEFAULT NULL COMMENT 'host id coresponding to the external dhcp device', + PRIMARY KEY (`id`) +)ENGINE=InnoDB DEFAULT CHARSET=utf8; + +CREATE TABLE IF NOT EXISTS `cloud`.`baremetal_pxe_devices` ( + `id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT 'id', + `uuid` varchar(40) UNIQUE, + `nsp_id` bigint unsigned DEFAULT NULL COMMENT 'Network Service Provider ID', + `pod_id` bigint unsigned DEFAULT NULL COMMENT 'Pod id where this pxe server in, for pxe per zone this field is null', + `device_type` varchar(255) DEFAULT NULL COMMENT 'type of the pxe device', + `physical_network_id` bigint unsigned DEFAULT NULL COMMENT 'id of the physical network in to which external pxe device is added', + `host_id` bigint unsigned DEFAULT NULL COMMENT 'host id coresponding to the external pxe device', + PRIMARY KEY (`id`) +) ENGINE=InnoDB DEFAULT CHARSET=utf8; + + +#drop tables as the feature is not a part of 4.2 +DROP TABLE IF EXISTS `cloud`.`host_updates`; +DROP TABLE IF EXISTS `cloud`.`host_updates_ref`; diff --git a/setup/db/db/vmwaretmplinsert-304to305.sql b/setup/db/db/vmwaretmplinsert-304to305.sql new file mode 100755 index 00000000000..448c1721ddf --- /dev/null +++ b/setup/db/db/vmwaretmplinsert-304to305.sql @@ -0,0 +1,17 @@ +# Copyright 2012 Citrix Systems, Inc. Licensed under the +# Apache License, Version 2.0 (the "License"); you may not use this +# file except in compliance with the License. Citrix Systems, Inc. +# reserves all rights not expressly granted by 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 doesn't exist on 3.0.x branch. The fake template record is being inserted just because this template will never be used in 4.2 version of the code +INSERT IGNORE INTO `cloud`.`vm_template` (unique_name, name, public, featured, type, hvm, bits, url, format, created, account_id, checksum, display_text, enable_password, + enable_sshkey, guest_os_id, bootable, prepopulate, cross_zones, extractable, hypervisor_type, source_template_id, template_tag, sort_key) +VALUES ("systemvm-vmware-3.0.5", "systemvm-vmware-3.0.5", 1, 1, "USER", 0, 64, "fake url", "fake format", now(), 1, null, "fake text", 0, + 0, 99, 1, 0, 1, 0, "VMware", NULL, NULL, 0); From 2e0847bfe01e74f5c80e028b66aee74d7a07493f Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Thu, 25 Jul 2013 16:34:03 -0700 Subject: [PATCH 028/907] CLOUDSTACK-3232: InternalLB system vm - allocate control ip address from the private range when vm's hypervisor is vmWare --- .../src/com/cloud/network/guru/ControlNetworkGuru.java | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/network/guru/ControlNetworkGuru.java b/server/src/com/cloud/network/guru/ControlNetworkGuru.java index 6060dac4b8f..4c5d2476459 100755 --- a/server/src/com/cloud/network/guru/ControlNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ControlNetworkGuru.java @@ -109,7 +109,7 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu public NicProfile allocate(Network config, NicProfile nic, VirtualMachineProfile vm) throws InsufficientVirtualNetworkCapcityException, InsufficientAddressCapacityException { - if(vm.getHypervisorType() == HypervisorType.VMware && vm.getType() != VirtualMachine.Type.DomainRouter) { + if(vm.getHypervisorType() == HypervisorType.VMware && !isRouterVm(vm)) { NicProfile nicProf = new NicProfile(Nic.ReservationStrategy.Create, null, null, null, null); String mac = _networkMgr.getNextAvailableMacAddressInNetwork(config.getId()); nicProf.setMacAddress(mac); @@ -132,7 +132,7 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu InsufficientAddressCapacityException { assert nic.getTrafficType() == TrafficType.Control; - if (dest.getHost().getHypervisorType() == HypervisorType.VMware && vm.getType() == VirtualMachine.Type.DomainRouter) { + if (dest.getHost().getHypervisorType() == HypervisorType.VMware && isRouterVm(vm)) { if(dest.getDataCenter().getNetworkType() != NetworkType.Basic) { super.reserve(nic, config, vm, dest, context); @@ -166,7 +166,7 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu public boolean release(NicProfile nic, VirtualMachineProfile vm, String reservationId) { assert nic.getTrafficType() == TrafficType.Control; - if (vm.getHypervisorType() == HypervisorType.VMware && vm.getType() == VirtualMachine.Type.DomainRouter) { + if (vm.getHypervisorType() == HypervisorType.VMware && isRouterVm(vm)) { long dcId = vm.getVirtualMachine().getDataCenterId(); DataCenterVO dcVo = _dcDao.findById(dcId); if(dcVo.getNetworkType() != NetworkType.Basic) { @@ -194,6 +194,10 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu return true; } + protected boolean isRouterVm(VirtualMachineProfile vm) { + return vm.getType() == VirtualMachine.Type.DomainRouter || vm.getType() == VirtualMachine.Type.InternalLoadBalancerVm; + } + @Override public Network implement(Network config, NetworkOffering offering, DeployDestination destination, ReservationContext context) throws InsufficientVirtualNetworkCapcityException { assert config.getTrafficType() == TrafficType.Control : "Why are you sending this configuration to me " + config; From 65f5642beae1d48e33abe0dad1364e347b820a47 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Thu, 25 Jul 2013 16:41:17 -0700 Subject: [PATCH 029/907] CLOUDSTACK-3820: UI > Infrastructure menu > zone detail > UCS > blade - remove blade detailView since it's not used. --- ui/scripts/system.js | 125 +++++++++++-------------------------------- 1 file changed, 32 insertions(+), 93 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 0cca9b762b6..3d77980496a 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -14123,8 +14123,9 @@ zoneid: args.context.physicalResources[0].id }, success: function(json) { + //for testing only (begin) /* - json = //override json (for testing only) + json = { "listucsmanagerreponse": { "count": 1, @@ -14138,7 +14139,9 @@ ] } }; - */ + */ + //for testing only (end) + var items = json.listucsmanagerreponse.ucsmanager; args.response.success({ data: items }); } @@ -14258,24 +14261,24 @@ //for testing only (begin) /* - var data = [ - { - "id": "58c84a1d-6e46-44e3-b7ec-abaa876d1be3", - "ucsmanagerid": "0c96f848-4306-47e5-a9ac-b76aad3557fb", - "bladedn": "sys/chassis-1/blade-1" - }, - { - "id": "de5abadf-f294-4014-9fed-7ee37a9b8724", - "ucsmanagerid": "0c96f848-4306-47e5-a9ac-b76aad3557fb", - "bladedn": "sys/chassis-1/blade-2" - } - ]; - for(var i = 0; i < data.length; i++) { - var array1 = data[i].bladedn.split('/'); - data[i].chassis = array1[1]; - data[i].bladeid = array1[2]; - } - */ + var data = [ + { + "id": "58c84a1d-6e46-44e3-b7ec-abaa876d1be3", + "ucsmanagerid": "0c96f848-4306-47e5-a9ac-b76aad3557fb", + "bladedn": "sys/chassis-1/blade-1" + }, + { + "id": "de5abadf-f294-4014-9fed-7ee37a9b8724", + "ucsmanagerid": "0c96f848-4306-47e5-a9ac-b76aad3557fb", + "bladedn": "sys/chassis-1/blade-2" + } + ]; + for(var i = 0; i < data.length; i++) { + var array1 = data[i].bladedn.split('/'); + data[i].chassis = array1[1]; + data[i].bladeid = array1[2]; + } + */ //for testing only (end) @@ -14353,21 +14356,24 @@ bladeid: args.context.blades[0].id }, success: function(json) { - //for testing only, comment it out before check in (begin) + //for testing only (begin) + /* json = { "associateucsprofiletobladeresponse": { "jobid": "dff5fa7f-e4a7-457b-92f1-2fede357e3d5" } }; - //for testing only, comment it out before check in (end) + */ + //for testing only (end) var jid = json.associateucsprofiletobladeresponse.jobid; args.response.success({ _custom: { jobId: jid, getUpdatedItem: function(json) { - //for testing only, comment it out before check in (begin) + //for testing only (begin) + /* json = { "queryasyncjobresultresponse": { @@ -14389,7 +14395,8 @@ "jobid": "dff5fa7f-e4a7-457b-92f1-2fede357e3d5" } } - //for testing only, comment it out before check in (end) + */ + //for testing only (end) return json.queryasyncjobresultresponse.jobresult.ucsblade; } @@ -14404,75 +14411,7 @@ } } } - } - - /*, - detailView: { - name: 'blade details', - noCompact: true, - actions: { - associateProfileToBlade: { - label: 'Associate Profile to Blade', - messages: { - notification: function(args) { - return 'Associate Profile to Blade'; - } - }, - createForm: { - title: 'Associate Profile to Blade', - fields: { - profiledn: { - label: 'profile', - select: function(args) { - var items = []; - - items.push({id: 'profile_1', description: 'profile_1'}); - items.push({id: 'profile_2', description: 'profile_2'}); - items.push({id: 'profile_3', description: 'profile_3'}); - args.response.success({data: items}); - }, - validation: { required: true } - } - } - }, - action: function(args) { - args.response.success(); - }, - notification: { - poll: function(args) { - args.complete(); - } - } - } - }, - tabs: { - details: { - title: 'label.details', - - fields: [ - { - fieldA: { label: 'fieldA' } - }, - { - fieldB: { label: 'fieldB' } - } - ], - - dataProvider: function(args) { - args.response.success( - { - data: { - fieldA: 'fieldAAA', - fieldB: 'fieldBBB' - } - } - ); - } - } - } - } - */ - + } } } } From b2cad5b698ff20954bcc36d46dd623e8ca1990c1 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 25 Jul 2013 17:01:57 -0700 Subject: [PATCH 030/907] CLOUDSTACK-3709: Add the missing file. --- .../admin/storage/DeleteCacheStoreCmd.java | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java new file mode 100644 index 00000000000..01d338562b4 --- /dev/null +++ b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.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.storage; + +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.ImageStoreResponse; +import org.apache.cloudstack.api.response.SuccessResponse; +import org.apache.log4j.Logger; + +import com.cloud.user.Account; + +@APICommand(name = "deleteCacheStore", description = "Deletes a cache store .", responseObject = SuccessResponse.class, since = "4.2.0") +public class DeleteCacheStoreCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(DeleteCacheStoreCmd.class.getName()); + + private static final String s_name = "deletecachestoreresponse"; + + // /////////////////////////////////////////////////// + // ////////////// API parameters ///////////////////// + // /////////////////////////////////////////////////// + + @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class, + required = true, description = "the cache store ID") + 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 = _storageService.deleteCacheStore(this); + if (result) { + SuccessResponse response = new SuccessResponse(getCommandName()); + this.setResponseObject(response); + } else { + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete image store"); + } + } +} From 45d38c41422938f6ad21fe26484bce3fd49f8656 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 25 Jul 2013 17:33:28 -0700 Subject: [PATCH 031/907] CLOUDSTACK-3709:[Object_Store_Refactor][UI] Can't delete NFS Cache storage through UI. Fixed at API side. Conflicts: server/src/com/cloud/storage/StorageManagerImpl.java --- api/src/com/cloud/storage/StorageService.java | 5 +- client/tomcatconf/commands.properties.in | 1 + .../datastore/db/SnapshotDataStoreDao.java | 6 +- .../datastore/db/TemplateDataStoreDao.java | 4 +- .../datastore/db/VolumeDataStoreDao.java | 4 +- .../image/db/SnapshotDataStoreDaoImpl.java | 44 ++++++-- .../image/db/TemplateDataStoreDaoImpl.java | 35 ++++-- .../image/db/VolumeDataStoreDaoImpl.java | 33 ++++-- .../cloud/server/ManagementServerImpl.java | 106 +++++++++--------- .../com/cloud/storage/StorageManagerImpl.java | 64 +++++++++-- 10 files changed, 209 insertions(+), 93 deletions(-) diff --git a/api/src/com/cloud/storage/StorageService.java b/api/src/com/cloud/storage/StorageService.java index 869b2960e1c..7c5b0a786c3 100644 --- a/api/src/com/cloud/storage/StorageService.java +++ b/api/src/com/cloud/storage/StorageService.java @@ -22,6 +22,7 @@ import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd; +import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd; import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd; @@ -48,7 +49,7 @@ public interface StorageService{ */ StoragePool createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException, UnknownHostException, ResourceUnavailableException; - + ImageStore createCacheStore(CreateCacheStoreCmd cmd); /** @@ -92,6 +93,8 @@ public interface StorageService{ boolean deleteImageStore(DeleteImageStoreCmd cmd); + boolean deleteCacheStore(DeleteCacheStoreCmd cmd); + ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException; } diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index e8012136b41..5451ed83190 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -252,6 +252,7 @@ listImageStores=1 deleteImageStore=1 createCacheStore=1 listCacheStores=1 +deleteCacheStore=1 #### host commands addHost=3 diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java index d129fe7f827..f9037150c93 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/SnapshotDataStoreDao.java @@ -26,11 +26,13 @@ import com.cloud.utils.db.GenericDao; import com.cloud.utils.fsm.StateDao; public interface SnapshotDataStoreDao extends GenericDao, - StateDao { +StateDao { List listByStoreId(long id, DataStoreRole role); - void deletePrimaryRecordsForStore(long id); + List listActiveOnCache(long id); + + void deletePrimaryRecordsForStore(long id, DataStoreRole role); SnapshotDataStoreVO findByStoreSnapshot(DataStoreRole role, long storeId, long snapshotId); SnapshotDataStoreVO findParent(DataStoreRole role, Long storeId, Long volumeId); diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java index 13b84ff3dba..9350751ec63 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/TemplateDataStoreDao.java @@ -28,12 +28,14 @@ import com.cloud.utils.db.GenericDao; import com.cloud.utils.fsm.StateDao; public interface TemplateDataStoreDao extends GenericDao, - StateDao { +StateDao { List listByStoreId(long id); List listDestroyed(long storeId); + List listActiveOnCache(long id); + void deletePrimaryRecordsForStore(long id); void deletePrimaryRecordsForTemplate(long templateId); diff --git a/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java index 4152516bcf0..698465fd726 100644 --- a/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java +++ b/engine/api/src/org/apache/cloudstack/storage/datastore/db/VolumeDataStoreDao.java @@ -25,10 +25,12 @@ import com.cloud.utils.db.GenericDao; import com.cloud.utils.fsm.StateDao; public interface VolumeDataStoreDao extends GenericDao, - StateDao { +StateDao { List listByStoreId(long id); + List listActiveOnCache(long id); + void deletePrimaryRecordsForStore(long id); VolumeDataStoreVO findByVolume(long volumeId); 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 f5e7421dea0..f33d51aebe7 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 @@ -48,12 +48,13 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase updateStateSearch; private SearchBuilder storeSearch; private SearchBuilder destroyedSearch; + private SearchBuilder cacheSearch; private SearchBuilder snapshotSearch; private SearchBuilder storeSnapshotSearch; private 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"; + " and store_role = ? and volume_id = ? and state = 'Ready'" + + " order by created DESC " + + " limit 1"; @@ -61,6 +62,9 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase params) throws ConfigurationException { super.configure(name, params); + // Note that snapshot_store_ref stores snapshots on primary as well as + // those on secondary, so we need to + // use (store_id, store_role) to search storeSearch = createSearchBuilder(); storeSearch.and("store_id", storeSearch.entity().getDataStoreId(), SearchCriteria.Op.EQ); storeSearch.and("store_role", storeSearch.entity().getRole(), SearchCriteria.Op.EQ); @@ -72,6 +76,13 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase sc = storeSearch.create(); sc.setParameters("store_id", id); + sc.setParameters("store_role", role); Transaction txn = Transaction.currentTxn(); txn.start(); remove(sc); @@ -176,7 +188,7 @@ public class SnapshotDataStoreDaoImpl extends GenericDaoBase listActiveOnCache(long id) { + SearchCriteria sc = cacheSearch.create(); + sc.setParameters("store_id", id); + sc.setParameters("store_role", DataStoreRole.ImageCache); + sc.setParameters("state", ObjectInDataStoreStateMachine.State.Destroyed); + sc.setParameters("ref_cnt", 0); + return listBy(sc); + } } 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 362f7a6aa96..7388ca99ec1 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 @@ -51,6 +51,7 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase updateStateSearch; private SearchBuilder storeSearch; + private SearchBuilder cacheSearch; private SearchBuilder templateSearch; private SearchBuilder templateRoleSearch; private SearchBuilder storeTemplateSearch; @@ -69,6 +70,12 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase listActiveOnCache(long id) { + SearchCriteria sc = cacheSearch.create(); + sc.setParameters("store_id", id); + sc.setParameters("destroyed", false); + sc.setParameters("ref_cnt", 0); + return listIncludingRemovedBy(sc); + } + + @Override public void deletePrimaryRecordsForStore(long id) { SearchCriteria sc = storeSearch.create(); @@ -279,10 +297,11 @@ public class TemplateDataStoreDaoImpl extends GenericDaoBase updateStateSearch; private SearchBuilder volumeSearch; private SearchBuilder storeSearch; + private SearchBuilder cacheSearch; private SearchBuilder storeVolumeSearch; @Override @@ -54,6 +55,12 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase listActiveOnCache(long id) { + SearchCriteria sc = cacheSearch.create(); + sc.setParameters("store_id", id); + sc.setParameters("destroyed", false); + sc.setParameters("ref_cnt", 0); + return listIncludingRemovedBy(sc); + } + @Override public void deletePrimaryRecordsForStore(long id) { SearchCriteria sc = storeSearch.create(); @@ -156,10 +172,11 @@ public class VolumeDataStoreDaoImpl extends GenericDaoBase getUserAuthenticators() { - return _userAuthenticators; + return _userAuthenticators; } public void setUserAuthenticators(List authenticators) { - _userAuthenticators = authenticators; + _userAuthenticators = authenticators; } public List getUserPasswordEncoders() { @@ -781,18 +782,18 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } public List getHostAllocators() { - return _hostAllocators; - } + return _hostAllocators; + } - public void setHostAllocators(List _hostAllocators) { - this._hostAllocators = _hostAllocators; - } + public void setHostAllocators(List _hostAllocators) { + this._hostAllocators = _hostAllocators; + } - @Override - public boolean configure(String name, Map params) - throws ConfigurationException { + @Override + public boolean configure(String name, Map params) + throws ConfigurationException { - _configs = _configDao.getConfiguration(); + _configs = _configDao.getConfiguration(); String value = _configs.get("event.purge.interval"); int cleanup = NumbersUtil.parseInt(value, 60 * 60 * 24); // 1 day. @@ -817,10 +818,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe _availableIdsMap.put(id, true); } - return true; - } + return true; + } - @Override + @Override public boolean start() { s_logger.info("Startup CloudStack management server..."); @@ -922,7 +923,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe return result; } for (EventVO event : events) { - _eventDao.remove(event.getId()); + _eventDao.remove(event.getId()); } return result; } @@ -952,7 +953,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Override public Pair, Integer> searchForClusters(ListClustersCmd cmd) { - Object id = cmd.getId(); + Object id = cmd.getId(); Object name = cmd.getClusterName(); Object podId = cmd.getPodId(); Long zoneId = cmd.getZoneId(); @@ -963,7 +964,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), zoneId); - Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + Filter searchFilter = new Filter(ClusterVO.class, "id", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _clusterDao.createSearchBuilder(); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); @@ -1035,7 +1036,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Override public Ternary, Integer>, List, Map> - listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize) { + listHostsForMigrationOfVM(Long vmId, Long startIndex, Long pageSize) { // access check - only root admin can migrate VM Account caller = CallContext.current().getCallingAccount(); if (caller.getType() != Account.ACCOUNT_TYPE_ADMIN) { @@ -1426,7 +1427,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), zoneId); - Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal()); + Filter searchFilter = new Filter(HostPodVO.class, "dataCenterId", true, cmd.getStartIndex(), cmd.getPageSizeVal()); SearchBuilder sb = _hostPodDao.createSearchBuilder(); sb.and("id", sb.entity().getId(), SearchCriteria.Op.EQ); sb.and("name", sb.entity().getName(), SearchCriteria.Op.LIKE); @@ -1768,7 +1769,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe return templateZonePairSet; } -*/ + */ private VMTemplateVO updateTemplateOrIso(BaseUpdateTemplateOrIsoCmd cmd) { Long id = cmd.getId(); @@ -2814,6 +2815,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe cmdList.add(DeleteImageStoreCmd.class); cmdList.add(CreateCacheStoreCmd.class); cmdList.add(ListCacheStoresCmd.class); + cmdList.add(DeleteCacheStoreCmd.class); cmdList.add(CreateApplicationLoadBalancerCmd.class); cmdList.add(ListApplicationLoadBalancersCmd.class); cmdList.add(DeleteApplicationLoadBalancerCmd.class); @@ -3231,8 +3233,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe elasticLoadBalancerEnabled = elbEnabled == null ? false : Boolean.parseBoolean(elbEnabled); if (elasticLoadBalancerEnabled) { String networkType = _configDao.getValue(Config.ElasticLoadBalancerNetwork.key()); - if (networkType != null) + if (networkType != null) { supportELB = networkType; + } } } @@ -3338,10 +3341,12 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe String certificate = cmd.getCertificate(); String key = cmd.getPrivateKey(); try { - if (certificate != null) + if (certificate != null) { certificate = URLDecoder.decode(certificate, "UTF-8"); - if (key != null) + } + if (key != null) { key = URLDecoder.decode(key, "UTF-8"); + } } catch (UnsupportedEncodingException e) { } finally { } @@ -3358,8 +3363,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe _consoleProxyMgr.setManagementState(ConsoleProxyManagementState.ResetSuspending); List alreadyRunning = _secStorageVmDao.getSecStorageVmListInStates(null, State.Running, State.Migrating, State.Starting); - for (SecondaryStorageVmVO ssVmVm : alreadyRunning) + for (SecondaryStorageVmVO ssVmVm : alreadyRunning) { _secStorageVmMgr.rebootSecStorageVm(ssVmVm.getId()); + } return "Certificate has been updated, we will stop all running console proxy VMs and secondary storage VMs to propagate the new certificate, please give a few minutes for console access service to be up again"; } @@ -3404,7 +3410,7 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe // give us the same key if (_hashKey == null) { _hashKey = _configDao.getValueAndInitIfNotExist(Config.HashKey.key(), Config.HashKey.getCategory(), - getBase64EncodedRandomKey(128)); + getBase64EncodedRandomKey(128)); } return _hashKey; } @@ -3413,8 +3419,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe public String getEncryptionKey() { if (_encryptionKey == null) { _encryptionKey = _configDao.getValueAndInitIfNotExist(Config.EncryptionKey.key(), - Config.EncryptionKey.getCategory(), - getBase64EncodedRandomKey(128)); + Config.EncryptionKey.getCategory(), + getBase64EncodedRandomKey(128)); } return _encryptionKey; } @@ -3423,8 +3429,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe public String getEncryptionIV() { if (_encryptionIV == null) { _encryptionIV = _configDao.getValueAndInitIfNotExist(Config.EncryptionIV.key(), - Config.EncryptionIV.getCategory(), - getBase64EncodedRandomKey(128)); + Config.EncryptionIV.getCategory(), + getBase64EncodedRandomKey(128)); } return _encryptionIV; } @@ -3433,18 +3439,18 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @DB public void resetEncryptionKeyIV() { - SearchBuilder sb = _configDao.createSearchBuilder(); - sb.and("name1", sb.entity().getName(), SearchCriteria.Op.EQ); - sb.or("name2", sb.entity().getName(), SearchCriteria.Op.EQ); - sb.done(); + SearchBuilder sb = _configDao.createSearchBuilder(); + sb.and("name1", sb.entity().getName(), SearchCriteria.Op.EQ); + sb.or("name2", sb.entity().getName(), SearchCriteria.Op.EQ); + sb.done(); - SearchCriteria sc = sb.create(); - sc.setParameters("name1", Config.EncryptionKey.key()); - sc.setParameters("name2", Config.EncryptionIV.key()); + SearchCriteria sc = sb.create(); + sc.setParameters("name1", Config.EncryptionKey.key()); + sc.setParameters("name2", Config.EncryptionIV.key()); - _configDao.expunge(sc); - _encryptionKey = null; - _encryptionIV = null; + _configDao.expunge(sc); + _encryptionKey = null; + _encryptionIV = null; } @Override @@ -3453,16 +3459,16 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe } private static String getBase64EncodedRandomKey(int nBits) { - SecureRandom random; - try { - random = SecureRandom.getInstance("SHA1PRNG"); - byte[] keyBytes = new byte[nBits/8]; - random.nextBytes(keyBytes); - return Base64.encodeBase64URLSafeString(keyBytes); - } catch (NoSuchAlgorithmException e) { - s_logger.error("Unhandled exception: ", e); - } - return null; + SecureRandom random; + try { + random = SecureRandom.getInstance("SHA1PRNG"); + byte[] keyBytes = new byte[nBits/8]; + random.nextBytes(keyBytes); + return Base64.encodeBase64URLSafeString(keyBytes); + } catch (NoSuchAlgorithmException e) { + s_logger.error("Unhandled exception: ", e); + } + return null; } @Override diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 40117512457..25aee8c6b93 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -48,6 +48,7 @@ import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd; +import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd; import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd; @@ -401,8 +402,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C @Override public StoragePool findStoragePool(DiskProfile dskCh, final DataCenterVO dc, Pod pod, Long clusterId, Long hostId, VMInstanceVO vm, - final Set avoid) { - + final Set avoid) { VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); for (StoragePoolAllocator allocator : _storagePoolAllocators) { @@ -638,7 +638,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C @Override @SuppressWarnings("rawtypes") public PrimaryDataStoreInfo createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException, UnknownHostException, - ResourceUnavailableException { + ResourceUnavailableException { String providerName = cmd.getStorageProviderName(); DataStoreProvider storeProvider = dataStoreProviderMgr.getDataStoreProvider(providerName); @@ -1194,7 +1194,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C @Override @DB public PrimaryDataStoreInfo preparePrimaryStorageForMaintenance(Long primaryStorageId) throws ResourceUnavailableException, - InsufficientCapacityException { + InsufficientCapacityException { Long userId = CallContext.current().getCallingUserId(); User user = _userDao.findById(userId); Account account = CallContext.current().getCallingAccount(); @@ -1288,8 +1288,8 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C // check if pool is in an inconsistent state if (pool != null && (pool.getStatus().equals(StoragePoolStatus.ErrorInMaintenance) - || pool.getStatus().equals(StoragePoolStatus.PrepareForMaintenance) || pool.getStatus().equals( - StoragePoolStatus.CancelMaintenance))) { + || pool.getStatus().equals(StoragePoolStatus.PrepareForMaintenance) || pool.getStatus().equals( + StoragePoolStatus.CancelMaintenance))) { _storagePoolWorkDao.removePendingJobsOnMsRestart(vo.getMsid(), poolId); pool.setStatus(StoragePoolStatus.ErrorInMaintenance); _storagePoolDao.update(poolId, pool); @@ -1501,7 +1501,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C @Override public boolean storagePoolHasEnoughIops(List requestedVolumes, - StoragePool pool) { + StoragePool pool) { if (requestedVolumes == null || requestedVolumes.isEmpty() || pool == null) { return false; } @@ -1533,19 +1533,19 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } long futureIops = currentIops + requestedIops; - + // getCapacityIops returns a Long so we need to check for null if (pool.getCapacityIops() == null) { s_logger.warn("Storage pool " + pool.getName() + " (" + pool.getId() + ") does not supply Iops capacity, assuming enough capacity"); return true; } - + return futureIops <= pool.getCapacityIops(); } @Override public boolean storagePoolHasEnoughSpace(List volumes, - StoragePool pool) { + StoragePool pool) { if (volumes == null || volumes.isEmpty()){ return false; } @@ -1788,7 +1788,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C // we are not actually deleting record from main // image_data_store table, so delete cascade will not work _imageStoreDetailsDao.deleteDetails(storeId); - _snapshotStoreDao.deletePrimaryRecordsForStore(storeId); + _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.Image); _volumeStoreDao.deletePrimaryRecordsForStore(storeId); _templateStoreDao.deletePrimaryRecordsForStore(storeId); _imageStoreDao.remove(storeId); @@ -1864,6 +1864,48 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C return (ImageStore) _dataStoreMgr.getDataStore(store.getId(), DataStoreRole.ImageCache); } + @Override + public boolean deleteCacheStore(DeleteCacheStoreCmd cmd) { + long storeId = cmd.getId(); + User caller = _accountMgr.getActiveUser(CallContext.current().getCallingUserId()); + // Verify that cache store exists + ImageStoreVO store = _imageStoreDao.findById(storeId); + if (store == null) { + throw new InvalidParameterValueException("Cache store with id " + storeId + " doesn't exist"); + } + _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), store.getDataCenterId()); + + // Verify that there are no live snapshot, template, volume on the cache + // store that is currently referenced + List snapshots = _snapshotStoreDao.listActiveOnCache(storeId); + if (snapshots != null && snapshots.size() > 0) { + throw new InvalidParameterValueException("Cannot delete cache store with staging snapshots currently in use!"); + } + List volumes = _volumeStoreDao.listActiveOnCache(storeId); + if (volumes != null && volumes.size() > 0) { + throw new InvalidParameterValueException("Cannot delete cache store with staging volumes currently in use!"); + } + + List templates = this._templateStoreDao.listActiveOnCache(storeId); + if (templates != null && templates.size() > 0) { + throw new InvalidParameterValueException("Cannot delete cache store with staging templates currently in use!"); + } + + // ready to delete + Transaction txn = Transaction.currentTxn(); + txn.start(); + // first delete from image_store_details table, we need to do that since + // we are not actually deleting record from main + // image_data_store table, so delete cascade will not work + _imageStoreDetailsDao.deleteDetails(storeId); + _snapshotStoreDao.deletePrimaryRecordsForStore(storeId, DataStoreRole.ImageCache); + _volumeStoreDao.deletePrimaryRecordsForStore(storeId); + _templateStoreDao.deletePrimaryRecordsForStore(storeId); + _imageStoreDao.remove(storeId); + txn.commit(); + return true; + } + // get bytesReadRate from service_offering, disk_offering and vm.disk.throttling.bytes_read_rate @Override public Long getDiskBytesReadRate(ServiceOfferingVO offering, DiskOfferingVO diskOffering) { From db93ebf169bf6a050eafec8c7a3bfaff054ddf4a Mon Sep 17 00:00:00 2001 From: Min Chen Date: Thu, 25 Jul 2013 18:04:12 -0700 Subject: [PATCH 032/907] Fix build break due to commit 2e0847bfe01e74f5c80e028b66aee74d7a07493f. --- server/src/com/cloud/network/guru/ControlNetworkGuru.java | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/network/guru/ControlNetworkGuru.java b/server/src/com/cloud/network/guru/ControlNetworkGuru.java index 4c5d2476459..40aa4687a95 100755 --- a/server/src/com/cloud/network/guru/ControlNetworkGuru.java +++ b/server/src/com/cloud/network/guru/ControlNetworkGuru.java @@ -5,7 +5,7 @@ // 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, @@ -194,7 +194,7 @@ public class ControlNetworkGuru extends PodBasedNetworkGuru implements NetworkGu return true; } - protected boolean isRouterVm(VirtualMachineProfile vm) { + protected boolean isRouterVm(VirtualMachineProfile vm) { return vm.getType() == VirtualMachine.Type.DomainRouter || vm.getType() == VirtualMachine.Type.InternalLoadBalancerVm; } From 395cbcc02322b7cc609da035a22ded527e596582 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Tue, 23 Jul 2013 19:34:36 -0700 Subject: [PATCH 033/907] Move the rest of the generics out of virtualmachinemanager --- .../consoleproxy/ConsoleProxyManagerImpl.java | 6 + .../src/com/cloud/vm/UserVmManagerImpl.java | 13 +- .../com/cloud/vm/VirtualMachineManager.java | 16 +- .../cloud/vm/VirtualMachineManagerImpl.java | 312 +++++++++--------- .../vm/VirtualMachineManagerImplTest.java | 5 +- 5 files changed, 169 insertions(+), 183 deletions(-) diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index a1ceac5b63f..4cb4a3332a3 100755 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -1153,6 +1153,12 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy try { //expunge the vm _itMgr.expunge(proxy.getUuid()); + proxy.setPublicIpAddress(null); + proxy.setPublicMacAddress(null); + proxy.setPublicNetmask(null); + proxy.setPrivateMacAddress(null); + proxy.setPrivateIpAddress(null); + _consoleProxyDao.update(proxy.getId(), proxy); _consoleProxyDao.remove(vmId); HostVO host = _hostDao.findByTypeNameAndZoneId(proxy.getDataCenterId(), proxy.getHostName(), Host.Type.ConsoleProxy); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 46034311958..e4d1c78f85f 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1210,7 +1210,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir // #2 migrate the vm if host doesn't have capacity or is in avoid set if (!existingHostHasCapacity){ - vmInstance = _itMgr.findHostAndMigrate(vmInstance.getType(), vmInstance, newServiceOfferingId, excludes); + _itMgr.findHostAndMigrate(vmInstance.getUuid(), newServiceOfferingId, excludes); } // #3 scale the vm now @@ -1225,14 +1225,9 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir s_logger.warn("Received exception while scaling ",e); } catch (ConcurrentOperationException e) { s_logger.warn("Received exception while scaling ",e); - } catch (VirtualMachineMigrationException e) { - s_logger.warn("Received exception while scaling ",e); - } catch (ManagementServerException e) { - s_logger.warn("Received exception while scaling ",e); } catch (Exception e) { s_logger.warn("Received exception while scaling ",e); - } - finally{ + } finally { if(!success){ _itMgr.upgradeVmDb(vmId, currentServiceOffering.getId()); // rollback // Decrement CPU and Memory count accordingly. @@ -3752,8 +3747,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir + destHypervisorType.toString() + ", vm: " + vm.getHypervisorType().toString()); } - VMInstanceVO migratedVm = _itMgr.storageMigration(vm, destPool); - return migratedVm; + _itMgr.storageMigration(vm.getUuid(), destPool); + return _vmDao.findById(vm.getId()); } diff --git a/server/src/com/cloud/vm/VirtualMachineManager.java b/server/src/com/cloud/vm/VirtualMachineManager.java index 79fa6f1a32d..a0a84649ad8 100644 --- a/server/src/com/cloud/vm/VirtualMachineManager.java +++ b/server/src/com/cloud/vm/VirtualMachineManager.java @@ -29,10 +29,8 @@ import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientServerCapacityException; -import com.cloud.exception.ManagementServerException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.exception.VirtualMachineMigrationException; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.network.Network; import com.cloud.network.dao.NetworkVO; @@ -114,7 +112,7 @@ public interface VirtualMachineManager extends Manager { VirtualMachine findById(long vmId); - T storageMigration(T vm, StoragePool storagePoolId); + void storageMigration(String vmUuid, StoragePool storagePoolId); /** * @param vmInstance @@ -175,15 +173,11 @@ public interface VirtualMachineManager extends Manager { VirtualMachineTO toVmTO(VirtualMachineProfile profile); - VMInstanceVO reConfigureVm(VMInstanceVO vm, ServiceOffering newServiceOffering, boolean sameHost) - throws ResourceUnavailableException, ConcurrentOperationException; + VMInstanceVO reConfigureVm(VMInstanceVO vm, ServiceOffering newServiceOffering, boolean sameHost) throws ResourceUnavailableException, ConcurrentOperationException; - VMInstanceVO findHostAndMigrate(VirtualMachine.Type vmType, VMInstanceVO vm, Long newSvcOfferingId, DeploymentPlanner.ExcludeList excludeHostList) throws InsufficientCapacityException, - ConcurrentOperationException, ResourceUnavailableException, - VirtualMachineMigrationException, ManagementServerException; + void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, DeploymentPlanner.ExcludeList excludeHostList) throws InsufficientCapacityException, + ConcurrentOperationException, ResourceUnavailableException; - T migrateForScale(T vm, long srcHostId, DeployDestination dest, Long newSvcOfferingId) - throws ResourceUnavailableException, ConcurrentOperationException, - ManagementServerException, VirtualMachineMigrationException; + void migrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long newSvcOfferingId) throws ResourceUnavailableException, ConcurrentOperationException; } diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 50e6812a26c..1fb118f7ad5 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -109,10 +109,8 @@ import com.cloud.exception.InsufficientCapacityException; import com.cloud.exception.InsufficientServerCapacityException; import com.cloud.exception.InsufficientVirtualNetworkCapcityException; import com.cloud.exception.InvalidParameterValueException; -import com.cloud.exception.ManagementServerException; import com.cloud.exception.OperationTimedoutException; import com.cloud.exception.ResourceUnavailableException; -import com.cloud.exception.VirtualMachineMigrationException; import com.cloud.ha.HighAvailabilityManager; import com.cloud.ha.HighAvailabilityManager.WorkType; import com.cloud.host.Host; @@ -269,9 +267,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac protected EntityManager _entityMgr; protected List _hostAllocators; + public List getHostAllocators() { return _hostAllocators; } + public void setHostAllocators(List _hostAllocators) { this._hostAllocators = _hostAllocators; } @@ -288,7 +288,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Inject protected VMSnapshotManager _vmSnapshotMgr = null; @Inject - protected ClusterDetailsDao _clusterDetailsDao; + protected ClusterDetailsDao _clusterDetailsDao; @Inject protected UserVmDetailsDao _uservmDetailsDao; @@ -436,7 +436,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } if (vm.getType() == VirtualMachine.Type.User) { - removeDhcpServiceInsubnet(vm); + removeDhcpServiceInsubnet(vm); } VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); @@ -457,9 +457,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // send hypervisor-dependent commands before removing List finalizeExpungeCommands = hvGuru.finalizeExpunge(vm); - if(finalizeExpungeCommands != null && finalizeExpungeCommands.size() > 0){ + if (finalizeExpungeCommands != null && finalizeExpungeCommands.size() > 0) { Long hostId = vm.getHostId() != null ? vm.getHostId() : vm.getLastHostId(); - if(hostId != null){ + if (hostId != null) { Commands cmds = new Commands(OnError.Stop); for (Command command : finalizeExpungeCommands) { cmds.addCommand(command); @@ -470,8 +470,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } } _agentMgr.send(hostId, cmds); - if(!cmds.isSuccessful()){ - for (Answer answer : cmds.getAnswers()){ + if (!cmds.isSuccessful()) { + for (Answer answer : cmds.getAnswers()) { if (!answer.getResult()) { s_logger.warn("Failed to expunge vm due to: " + answer.getDetails()); throw new CloudRuntimeException("Unable to expunge " + vm + " due to " + answer.getDetails()); @@ -493,7 +493,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac //we are using the info in these nics to remove the dhcp sercvice for these subnets. List nicList = listLastNicsInSubnet(vm); - if(nicList != null && nicList.size() != 0) { + if (nicList != null && nicList.size() != 0) { for (NicVO nic : nicList) { //free the ipalias on the routers corresponding to each of the nics. Network network = _networkDao.findById(nic.getNetworkId()); @@ -504,7 +504,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac ipAlias.setState(NicIpAlias.state.revoked); Transaction txn = Transaction.currentTxn(); txn.start(); - _nicIpAliasDao.update(ipAlias.getId(),ipAlias); + _nicIpAliasDao.update(ipAlias.getId(), ipAlias); IPAddressVO aliasIpaddressVo = _publicIpAddressDao.findByIpAndSourceNetworkId(ipAlias.getNetworkId(), ipAlias.getIp4Address()); _publicIpAddressDao.unassignIpAddress(aliasIpaddressVo.getId()); txn.commit(); @@ -512,10 +512,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.warn("Failed to remove the ip alias on the router, marking it as removed in db and freed the allocated ip " + ipAlias.getIp4Address()); } } - } - catch (ResourceUnavailableException e) { + } catch (ResourceUnavailableException e) { //failed to remove the dhcpconfig on the router. - s_logger.info ("Unable to delete the ip alias due to unable to contact the virtualrouter."); + s_logger.info("Unable to delete the ip alias due to unable to contact the virtualrouter."); } } @@ -719,7 +718,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac CallContext cctxt = CallContext.current(); Account account = cctxt.getCallingAccount(); User caller = cctxt.getCallingUser(); - + VMInstanceVO vm = _vmDao.findByUuid(vmUuid); VirtualMachineGuru vmGuru = getVmGuru(vm); @@ -741,12 +740,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.debug("Trying to deploy VM, vm has dcId: " + vm.getDataCenterId() + " and podId: " + vm.getPodIdToDeployIn()); } DataCenterDeployment plan = new DataCenterDeployment(vm.getDataCenterId(), vm.getPodIdToDeployIn(), null, null, null, null, ctx); - if(planToDeploy != null && planToDeploy.getDataCenterId() != 0){ + if (planToDeploy != null && planToDeploy.getDataCenterId() != 0) { if (s_logger.isDebugEnabled()) { s_logger.debug("advanceStart: DeploymentPlan is provided, using dcId:" + planToDeploy.getDataCenterId() + ", podId: " + planToDeploy.getPodId() + ", clusterId: " + planToDeploy.getClusterId() + ", hostId: " + planToDeploy.getHostId() + ", poolId: " + planToDeploy.getPoolId()); } - plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), planToDeploy.getPoolId(), planToDeploy.getPhysicalNetworkId(), ctx); + plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), + planToDeploy.getPoolId(), planToDeploy.getPhysicalNetworkId(), ctx); } HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); @@ -756,7 +756,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac try { Journal journal = start.second().getJournal(); - if (planToDeploy != null) { avoids = planToDeploy.getAvoids(); } @@ -767,7 +766,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.debug("Deploy avoids pods: " + avoids.getPodsToAvoid() + ", clusters: " + avoids.getClustersToAvoid() + ", hosts: " + avoids.getHostsToAvoid()); } - boolean planChangedByVolume = false; boolean reuseVolume = true; DataCenterDeployment originalPlan = plan; @@ -775,7 +773,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac int retry = _retry; while (retry-- != 0) { // It's != so that it can match -1. - if(reuseVolume){ + if (reuseVolume) { // edit plan if this vm's ROOT volume is in READY state already List vols = _volsDao.findReadyRootVolumesByInstance(vm.getId()); for (VolumeVO vol : vols) { @@ -805,18 +803,22 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // cannot satisfy the plan passed in to the // planner if (s_logger.isDebugEnabled()) { - s_logger.debug("Cannot satisfy the deployment plan passed in since the ready Root volume is in different cluster. volume's cluster: " + rootVolClusterId + s_logger.debug("Cannot satisfy the deployment plan passed in since the ready Root volume is in different cluster. volume's cluster: " + + rootVolClusterId + ", cluster specified: " + clusterIdSpecified); } - throw new ResourceUnavailableException("Root volume is ready in different cluster, Deployment plan provided cannot be satisfied, unable to create a deployment for " - + vm, Cluster.class, clusterIdSpecified); + throw new ResourceUnavailableException( + "Root volume is ready in different cluster, Deployment plan provided cannot be satisfied, unable to create a deployment for " + + vm, Cluster.class, clusterIdSpecified); } } - plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), vol.getPoolId(), null, ctx); + plan = new DataCenterDeployment(planToDeploy.getDataCenterId(), planToDeploy.getPodId(), planToDeploy.getClusterId(), planToDeploy.getHostId(), + vol.getPoolId(), null, ctx); } else { plan = new DataCenterDeployment(rootVolDcId, rootVolPodId, rootVolClusterId, null, vol.getPoolId(), null, ctx); if (s_logger.isDebugEnabled()) { - s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + " , and clusterId: " + rootVolClusterId); + s_logger.debug(vol + " is READY, changing deployment plan to use this pool's dcId: " + rootVolDcId + " , podId: " + rootVolPodId + + " , and clusterId: " + rootVolClusterId); } planChangedByVolume = true; } @@ -855,8 +857,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac long destHostId = dest.getHost().getId(); vm.setPodId(dest.getPod().getId()); Long cluster_id = dest.getCluster().getId(); - ClusterDetailsVO cluster_detail_cpu = _clusterDetailsDao.findDetail(cluster_id,"cpuOvercommitRatio"); - ClusterDetailsVO cluster_detail_ram = _clusterDetailsDao.findDetail(cluster_id,"memoryOvercommitRatio"); + ClusterDetailsVO cluster_detail_cpu = _clusterDetailsDao.findDetail(cluster_id, "cpuOvercommitRatio"); + ClusterDetailsVO cluster_detail_ram = _clusterDetailsDao.findDetail(cluster_id, "memoryOvercommitRatio"); vmProfile.setCpuOvercommitRatio(Float.parseFloat(cluster_detail_cpu.getValue())); vmProfile.setMemoryOvercommitRatio(Float.parseFloat(cluster_detail_ram.getValue())); StartAnswer startAnswer = null; @@ -878,7 +880,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac volumeMgr.prepare(vmProfile, dest); } //since StorageMgr succeeded in volume creation, reuse Volume for further tries until current cluster has capacity - if(!reuseVolume){ + if (!reuseVolume) { reuseVolume = true; } @@ -892,7 +894,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac vmGuru.finalizeDeployment(cmds, vmProfile, dest, ctx); - work = _workDao.findById(work.getId()); if (work == null || work.getStep() != Step.Prepare) { throw new ConcurrentOperationException("Work steps have been changed: " + work); @@ -903,13 +904,12 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac _workDao.updateStep(work, Step.Started); - startAnswer = cmds.getAnswer(StartAnswer.class); if (startAnswer != null && startAnswer.getResult()) { String host_guid = startAnswer.getHost_guid(); - if( host_guid != null ) { + if (host_guid != null) { HostVO finalHost = _resourceMgr.findHostByGuid(host_guid); - if (finalHost == null ) { + if (finalHost == null) { throw new CloudRuntimeException("Host Guid " + host_guid + " doesn't exist in DB, something wrong here"); } destHostId = finalHost.getId(); @@ -930,7 +930,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } StopCommand cmd = new StopCommand(vm, _mgmtServer.getExecuteInSequence()); - StopAnswer answer = (StopAnswer) _agentMgr.easySend(destHostId, cmd); + StopAnswer answer = (StopAnswer)_agentMgr.easySend(destHostId, cmd); if (answer == null || !answer.getResult()) { s_logger.warn("Unable to stop " + vm + " due to " + (answer != null ? answer.getDetails() : "no answers")); _haMgr.scheduleStop(vm, destHostId, WorkType.ForceStop); @@ -975,7 +975,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac Step prevStep = work.getStep(); _workDao.updateStep(work, Step.Release); // If previous step was started/ing && we got a valid answer - if((prevStep == Step.Started || prevStep == Step.Starting) && (startAnswer != null && startAnswer.getResult())){ //TODO check the response of cleanup and record it in DB for retry + if ((prevStep == Step.Started || prevStep == Step.Starting) && (startAnswer != null && startAnswer.getResult())) { //TODO check the response of cleanup and record it in DB for retry cleanup(vmGuru, vmProfile, work, Event.OperationFailed, false); } else { //if step is not starting/started, send cleanup command with force=true @@ -1027,7 +1027,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac return false; } - guru.finalizeStop(profile, (StopAnswer) answer); + guru.finalizeStop(profile, (StopAnswer)answer); } catch (AgentUnavailableException e) { if (!force) { return false; @@ -1216,7 +1216,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac boolean stopped = false; StopAnswer answer = null; try { - answer = (StopAnswer) _agentMgr.send(vm.getHostId(), stop); + answer = (StopAnswer)_agentMgr.send(vm.getHostId(), stop); stopped = answer.getResult(); if (!stopped) { throw new CloudRuntimeException("Unable to stop the virtual machine due to " + answer.getDetails()); @@ -1306,7 +1306,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public boolean stateTransitTo(VMInstanceVO vm, VirtualMachine.Event e, Long hostId) throws NoTransitionException { // if there are active vm snapshots task, state change is not allowed - if(_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())){ + if (_vmSnapshotMgr.hasActiveVMSnapshotTasks(vm.getId())) { s_logger.error("State transit with event: " + e + " failed due to: " + vm.getInstanceName() + " has active VM snapshots tasks"); return false; } @@ -1340,7 +1340,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac advanceStop(vm, _forceStop); - if (!_vmSnapshotMgr.deleteAllVMSnapshots(vm.getId(),null)){ + 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); } @@ -1358,13 +1358,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac //list all the nics which belong to this vm and are the last nics in the subnets. //we are using the info in these nics to remove the dhcp sercvice for these subnets. - private List listLastNicsInSubnet(VirtualMachine vm) { - List nicList = _nicsDao.listByVmId(vm.getId()); - List copyOfnicList = new ArrayList(nicList); + private List listLastNicsInSubnet(VirtualMachine vm) { + List nicList = _nicsDao.listByVmId(vm.getId()); + List copyOfnicList = new ArrayList(nicList); for (NicVO nic : nicList) { Network network = _networkDao.findById(nic.getNetworkId()); DhcpServiceProvider dhcpServiceProvider = _networkMgr.getDhcpServiceProvider(network); - Map capabilities = dhcpServiceProvider.getCapabilities().get(Network.Service.Dhcp); + Map capabilities = dhcpServiceProvider.getCapabilities().get(Network.Service.Dhcp); String supportsMultipleSubnets = capabilities.get(Network.Capability.DhcpAccrossMultipleSubnets); if ((supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets) && network.getTrafficType() == Networks.TrafficType.Guest && network.getGuestType() == Network.GuestType.Shared)) { //including the ip of the vm and the ipAlias @@ -1379,7 +1379,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } protected boolean checkVmOnHost(VirtualMachine vm, long hostId) throws AgentUnavailableException, OperationTimedoutException { - CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer) _agentMgr.send(hostId, new CheckVirtualMachineCommand(vm.getInstanceName())); + CheckVirtualMachineAnswer answer = (CheckVirtualMachineAnswer)_agentMgr.send(hostId, new CheckVirtualMachineCommand(vm.getInstanceName())); if (!answer.getResult() || answer.getState() == State.Stopped) { return false; } @@ -1388,8 +1388,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } @Override - public T storageMigration(T vmm, StoragePool destPool) { - VMInstanceVO vm = _vmDao.findByUuid(vmm.getUuid()); + public void storageMigration(String vmUuid, StoragePool destPool) { + VMInstanceVO vm = _vmDao.findByUuid(vmUuid); try { stateTransitTo(vm, VirtualMachine.Event.StorageMigrationRequested, null); @@ -1438,8 +1438,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac throw new CloudRuntimeException("Failed to change vm state: " + e.toString()); } } - - return vmm; } @Override @@ -1486,7 +1484,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } VirtualMachineProfile vmSrc = new VirtualMachineProfileImpl(vm); - for(NicProfile nic: _networkMgr.getNicProfiles(vm)){ + for (NicProfile nic : _networkMgr.getNicProfiles(vm)) { vmSrc.addNic(nic); } @@ -1505,7 +1503,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac PrepareForMigrationAnswer pfma = null; try { - pfma = (PrepareForMigrationAnswer) _agentMgr.send(dstHostId, pfmc); + pfma = (PrepareForMigrationAnswer)_agentMgr.send(dstHostId, pfmc); if (!pfma.getResult()) { String msg = "Unable to prepare for migration due to " + pfma.getDetails(); pfma = null; @@ -1541,7 +1539,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac mc.setHostGuid(dest.getHost().getGuid()); try { - MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc); + MigrateAnswer ma = (MigrateAnswer)_agentMgr.send(vm.getLastHostId(), mc); if (!ma.getResult()) { throw new CloudRuntimeException("Unable to migrate due to " + ma.getDetails()); } @@ -1581,7 +1579,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.info("Migration was unsuccessful. Cleaning up: " + vm); _networkMgr.rollbackNicForMigration(vmSrc, profile); - _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + " in zone " + _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + + " in zone " + dest.getDataCenter().getName() + " and pod " + dest.getPod().getName(), "Migrate Command failed. Please check logs."); try { _agentMgr.send(dstHostId, new Commands(cleanup(vm)), null); @@ -1594,7 +1593,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } catch (NoTransitionException e) { s_logger.warn(e.getMessage()); } - }else{ + } else { _networkMgr.commitNicForMigration(vmSrc, profile); } @@ -1619,7 +1618,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac " 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()){ + } else if (pool.getId() == currentPool.getId()) { // If the pool to migrate too is the same as current pool, remove the volume from the list of // volumes to be migrated. volumeToPool.remove(volume); @@ -1912,9 +1911,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public boolean isVirtualMachineUpgradable(VirtualMachine vm, ServiceOffering offering) { boolean isMachineUpgradable = true; - for(HostAllocator allocator : _hostAllocators) { + for (HostAllocator allocator : _hostAllocators) { isMachineUpgradable = allocator.isVirtualMachineUpgradable(vm, offering); - if(isMachineUpgradable) + if (isMachineUpgradable) continue; else break; @@ -1982,13 +1981,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac AgentVmInfo info = infos.remove(vm.getId()); // sync VM Snapshots related transient states - List vmSnapshotsInTrasientStates = _vmSnapshotDao.listByInstanceId(vm.getId(), VMSnapshot.State.Expunging,VMSnapshot.State.Reverting, VMSnapshot.State.Creating); - if(vmSnapshotsInTrasientStates.size() > 1){ + List vmSnapshotsInTrasientStates = _vmSnapshotDao.listByInstanceId(vm.getId(), VMSnapshot.State.Expunging, VMSnapshot.State.Reverting, + VMSnapshot.State.Creating); + if (vmSnapshotsInTrasientStates.size() > 1) { s_logger.info("Found vm " + vm.getInstanceName() + " with VM snapshots in transient states, needs to sync VM snapshot state"); - if(!_vmSnapshotMgr.syncVMSnapshot(vm, hostId)){ + if (!_vmSnapshotMgr.syncVMSnapshot(vm, hostId)) { s_logger.warn("Failed to sync VM in a transient snapshot related state: " + vm.getInstanceName()); continue; - }else{ + } else { s_logger.info("Successfully sync VM with transient snapshot: " + vm.getInstanceName()); } } @@ -2020,7 +2020,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac commands.addCommand(cleanup(left.name)); } } - if ( ! found ) { + if (!found) { s_logger.warn("Stopping a VM that we have no record of : " + left.name); commands.addCommand(cleanup(left.name)); } @@ -2057,8 +2057,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac return commands; } - - public void deltaSync(Map> newStates) { Map states = convertToInfos(newStates); @@ -2078,10 +2076,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } command = cleanup(info.name); } - if (command != null){ + if (command != null) { try { Host host = _resourceMgr.findHostByGuid(info.getHostUuid()); - if (host != null){ + if (host != null) { Answer answer = _agentMgr.send(host.getId(), cleanup(info.name)); if (!answer.getResult()) { s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); @@ -2094,31 +2092,32 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } } - public void fullSync(final long clusterId, Map> newStates) { - if (newStates==null)return; + if (newStates == null) + return; Map infos = convertToInfos(newStates); Set set_vms = Collections.synchronizedSet(new HashSet()); set_vms.addAll(_vmDao.listByClusterId(clusterId)); set_vms.addAll(_vmDao.listLHByClusterId(clusterId)); for (VMInstanceVO vm : set_vms) { - AgentVmInfo info = infos.remove(vm.getId()); + AgentVmInfo info = infos.remove(vm.getId()); // sync VM Snapshots related transient states - List vmSnapshotsInExpungingStates = _vmSnapshotDao.listByInstanceId(vm.getId(), VMSnapshot.State.Expunging, VMSnapshot.State.Creating,VMSnapshot.State.Reverting); - if(vmSnapshotsInExpungingStates.size() > 0){ + List vmSnapshotsInExpungingStates = _vmSnapshotDao.listByInstanceId(vm.getId(), VMSnapshot.State.Expunging, VMSnapshot.State.Creating, + VMSnapshot.State.Reverting); + if (vmSnapshotsInExpungingStates.size() > 0) { s_logger.info("Found vm " + vm.getInstanceName() + " in state. " + vm.getState() + ", needs to sync VM snapshot state"); Long hostId = null; Host host = null; - if(info != null && info.getHostUuid() != null){ + if (info != null && info.getHostUuid() != null) { host = _hostDao.findByGuid(info.getHostUuid()); } hostId = host == null ? (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId()) : host.getId(); - if(!_vmSnapshotMgr.syncVMSnapshot(vm, hostId)){ + if (!_vmSnapshotMgr.syncVMSnapshot(vm, hostId)) { s_logger.warn("Failed to sync VM with transient snapshot: " + vm.getInstanceName()); continue; - }else{ + } else { s_logger.info("Successfully sync VM with transient snapshot: " + vm.getInstanceName()); } } @@ -2153,7 +2152,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac long hostId = host == null ? (vm.getHostId() == null ? vm.getLastHostId() : vm.getHostId()) : host.getId(); HypervisorGuru hvGuru = _hvGuruMgr.getGuru(vm.getHypervisorType()); Command command = compareState(hostId, vm, info, true, hvGuru.trackVmHostChange()); - if (command != null){ + if (command != null) { Answer answer = _agentMgr.send(hostId, command); if (!answer.getResult()) { s_logger.warn("Failed to update state of the VM due to " + answer.getDetails()); @@ -2167,7 +2166,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac else if (info != null && (vm.getState() == State.Stopped || vm.getState() == State.Stopping || vm.isRemoved() || vm.getState() == State.Destroyed || vm.getState() == State.Expunging)) { Host host = _hostDao.findByGuid(info.getHostUuid()); - if (host != null){ + if (host != null) { s_logger.warn("Stopping a VM which is stopped/stopping/destroyed/expunging " + info.name); if (vm.getState() == State.Stopped || vm.getState() == State.Stopping) { vm.setState(State.Stopped); // set it as stop and clear it from host @@ -2179,26 +2178,25 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac if (!answer.getResult()) { s_logger.warn("Unable to stop a VM due to " + answer.getDetails()); } - } - catch (Exception e) { + } catch (Exception e) { s_logger.warn("Unable to stop a VM due to " + e.getMessage()); } } } else - // host id can change + // host id can change if (info != null && vm.getState() == State.Running) { - // check for host id changes - Host host = _hostDao.findByGuid(info.getHostUuid()); - if (host != null && (vm.getHostId() == null || host.getId() != vm.getHostId())){ - s_logger.info("Found vm " + vm.getInstanceName() + " with inconsistent host in db, new host is " + host.getId()); - try { - stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, host.getId()); - } catch (NoTransitionException e) { - s_logger.warn(e.getMessage()); - } + // check for host id changes + Host host = _hostDao.findByGuid(info.getHostUuid()); + if (host != null && (vm.getHostId() == null || host.getId() != vm.getHostId())) { + s_logger.info("Found vm " + vm.getInstanceName() + " with inconsistent host in db, new host is " + host.getId()); + try { + stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, host.getId()); + } catch (NoTransitionException e) { + s_logger.warn(e.getMessage()); } } + } /* else if(info == null && vm.getState() == State.Stopping) { //Handling CS-13376 s_logger.warn("Marking the VM as Stopped as it was still stopping on the CS" +vm.getName()); vm.setState(State.Stopped); // Setting the VM as stopped on the DB and clearing it from the host @@ -2209,10 +2207,11 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } for (final AgentVmInfo left : infos.values()) { - if (!VirtualMachineName.isValidVmName(left.name)) continue; // if the vm doesn't follow CS naming ignore it for stopping + if (!VirtualMachineName.isValidVmName(left.name)) + continue; // if the vm doesn't follow CS naming ignore it for stopping try { Host host = _hostDao.findByGuid(left.getHostUuid()); - if (host != null){ + if (host != null) { s_logger.warn("Stopping a VM which we do not have any record of " + left.name); Answer answer = _agentMgr.send(host.getId(), cleanup(left.name)); if (!answer.getResult()) { @@ -2226,8 +2225,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } - - protected Map convertToInfos(final Map> newStates) { final HashMap map = new HashMap(); if (newStates == null) { @@ -2244,7 +2241,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac is_alien_vm = false; } // alien VMs - if (is_alien_vm){ + if (is_alien_vm) { map.put(alien_vm_count--, new AgentVmInfo(entry.getKey(), null, entry.getValue().second(), entry.getValue().first())); s_logger.warn("Found an alien VM " + entry.getKey()); } @@ -2288,8 +2285,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac return map; } - - /** * compareState does as its name suggests and compares the states between * management server and agent. It returns whether something should be @@ -2324,14 +2319,17 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac HostVO hostVO = _hostDao.findById(vm.getHostId()); String hostDesc = "name: " + hostVO.getName() + " (id:" + hostVO.getId() + "), availability zone: " + dcVO.getName() + ", pod: " + podVO.getName(); - _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodIdToDeployIn(), "VM (name: " + vm.getInstanceName() + ", id: " + vm.getId() + ") stopped on host " + hostDesc - + " due to storage failure", "Virtual Machine " + vm.getInstanceName() + " (id: " + vm.getId() + ") running on host [" + vm.getHostId() + "] stopped due to storage failure."); + _alertMgr.sendAlert(alertType, vm.getDataCenterId(), vm.getPodIdToDeployIn(), "VM (name: " + vm.getInstanceName() + ", id: " + vm.getId() + ") stopped on host " + + hostDesc + + " due to storage failure", "Virtual Machine " + vm.getInstanceName() + " (id: " + vm.getId() + ") running on host [" + vm.getHostId() + + "] stopped due to storage failure."); } if (trackExternalChange) { if (serverState == State.Starting) { if (vm.getHostId() != null && vm.getHostId() != hostId) { - s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " + s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + + ", skip status sync for vm: " + vm.getInstanceName()); return null; } @@ -2339,7 +2337,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac if (vm.getHostId() == null || hostId != vm.getHostId()) { try { ItWorkVO workItem = _workDao.findByOutstandingWork(vm.getId(), State.Migrating); - if(workItem == null){ + if (workItem == null) { stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId); } } catch (NoTransitionException e) { @@ -2356,7 +2354,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac if (trackExternalChange) { if (serverState == State.Starting) { if (vm.getHostId() != null && vm.getHostId() != hostId) { - s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + ", skip status sync for vm: " + s_logger.info("CloudStack is starting VM on host " + vm.getHostId() + ", but status report comes from a different host " + hostId + + ", skip status sync for vm: " + vm.getInstanceName()); return null; } @@ -2372,7 +2371,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac // if (vm.getHostId() == null || hostId != vm.getHostId()) { if (s_logger.isDebugEnabled()) { - s_logger.debug("detected host change when VM " + vm + " is at running state, VM could be live-migrated externally from host " + vm.getHostId() + " to host " + hostId); + s_logger.debug("detected host change when VM " + vm + " is at running state, VM could be live-migrated externally from host " + vm.getHostId() + + " to host " + hostId); } stateTransitTo(vm, VirtualMachine.Event.AgentReportMigrated, hostId); @@ -2449,10 +2449,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } catch (ResourceUnavailableException e) { s_logger.error("Exception during update for running vm: " + vm, e); return null; - }catch (InsufficientAddressCapacityException e) { + } catch (InsufficientAddressCapacityException e) { s_logger.error("Exception during update for running vm: " + vm, e); return null; - }catch (NoTransitionException e) { + } catch (NoTransitionException e) { s_logger.warn(e.getMessage()); } } @@ -2469,7 +2469,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac return command; } - private void ensureVmRunningContext(long hostId, VMInstanceVO vm, Event cause) throws OperationTimedoutException, ResourceUnavailableException, NoTransitionException, InsufficientAddressCapacityException { + private void ensureVmRunningContext(long hostId, VMInstanceVO vm, Event cause) throws OperationTimedoutException, ResourceUnavailableException, NoTransitionException, + InsufficientAddressCapacityException { VirtualMachineGuru vmGuru = getVmGuru(vm); s_logger.debug("VM state is starting on full sync so updating it to running"); @@ -2537,8 +2538,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac public boolean processAnswers(long agentId, long seq, Answer[] answers) { for (final Answer answer : answers) { if (answer instanceof ClusterSyncAnswer) { - ClusterSyncAnswer hs = (ClusterSyncAnswer) answer; - if (!hs.isExceuted()){ + ClusterSyncAnswer hs = (ClusterSyncAnswer)answer; + if (!hs.isExceuted()) { deltaSync(hs.getNewStates()); hs.setExecuted(); } @@ -2562,7 +2563,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac boolean processed = false; for (Command cmd : cmds) { if (cmd instanceof PingRoutingCommand) { - PingRoutingCommand ping = (PingRoutingCommand) cmd; + PingRoutingCommand ping = (PingRoutingCommand)cmd; if (ping.getNewStates() != null && ping.getNewStates().size() > 0) { Commands commands = deltaHostSync(agentId, ping.getNewStates()); if (commands.size() > 0) { @@ -2609,9 +2610,9 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac long agentId = agent.getId(); if (agent.getHypervisorType() == HypervisorType.XenServer) { // only for Xen - StartupRoutingCommand startup = (StartupRoutingCommand) cmd; + StartupRoutingCommand startup = (StartupRoutingCommand)cmd; HashMap> allStates = startup.getClusterVMStateChanges(); - if (allStates != null){ + if (allStates != null) { fullSync(clusterId, allStates); } @@ -2625,7 +2626,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } } else { // for others KVM and VMWare - StartupRoutingCommand startup = (StartupRoutingCommand) cmd; + StartupRoutingCommand startup = (StartupRoutingCommand)cmd; Commands commands = fullHostSync(agentId, startup); if (commands.size() > 0) { @@ -2795,7 +2796,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac @Override public NicProfile addVmToNetwork(VirtualMachine vm, Network network, NicProfile requested) throws ConcurrentOperationException, - ResourceUnavailableException, InsufficientCapacityException { + ResourceUnavailableException, InsufficientCapacityException { s_logger.debug("Adding vm " + vm + " to network " + network + "; requested nic profile " + requested); VMInstanceVO vmVO = _vmDao.findById(vm.getId()); @@ -2824,7 +2825,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.debug("Plugging nic for vm " + vm + " in network " + network); boolean result = false; - try{ + try { result = plugNic(network, nicTO, vmTO, context, dest); if (result) { s_logger.debug("Nic is plugged successfully for vm " + vm + " in network " + network + ". Vm is a part of network now"); @@ -2838,8 +2839,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.warn("Failed to plug nic to the vm " + vm + " in network " + network); return null; } - }finally{ - if(!result){ + } finally { + if (!result) { _networkMgr.removeNic(vmProfile, _nicsDao.findById(nic.getId())); } } @@ -2878,13 +2879,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac VirtualMachineTO vmTO = hvGuru.implement(vmProfile); // don't delete default NIC on a user VM - if (nic.isDefaultNic() && vm.getType() == VirtualMachine.Type.User ) { + if (nic.isDefaultNic() && vm.getType() == VirtualMachine.Type.User) { s_logger.warn("Failed to remove nic from " + vm + " in " + network + ", nic is default."); throw new CloudRuntimeException("Failed to remove nic from " + vm + " in " + network + ", nic is default."); } // if specified nic is associated with PF/LB/Static NAT - if(rulesMgr.listAssociatedRulesForGuestNic(nic).size() > 0){ + if (rulesMgr.listAssociatedRulesForGuestNic(nic).size() > 0) { throw new CloudRuntimeException("Failed to remove nic from " + vm + " in " + network + ", nic has associated Port forwarding or Load balancer or Static NAT rules."); } @@ -2905,7 +2906,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.debug("Un-plugging nic " + nic + " for vm " + vm + " from network " + network); boolean result = unplugNic(network, nicTO, vmTO, context, dest); if (result) { - s_logger.debug("Nic is unplugged successfully for vm " + vm + " in network " + network ); + s_logger.debug("Nic is unplugged successfully for vm " + vm + " in network " + network); long isDefault = (nic.isDefaultNic()) ? 1 : 0; UsageEventUtils.publishUsageEvent(EventTypes.EVENT_NETWORK_OFFERING_REMOVE, vm.getAccountId(), vm.getDataCenterId(), vm.getId(), Long.toString(nic.getId()), network.getNetworkOfferingId(), null, @@ -2922,7 +2923,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac //2) Release the nic _networkMgr.releaseNic(vmProfile, nic); - s_logger.debug("Successfully released nic " + nic + "for vm " + vm); + s_logger.debug("Successfully released nic " + nic + "for vm " + vm); //3) Remove the nic _networkMgr.removeNic(vmProfile, nic); @@ -2953,13 +2954,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac nic = _networkModel.getNicInNetwork(vm.getId(), network.getId()); } - if (nic == null){ + if (nic == null) { s_logger.warn("Could not get a nic with " + network); return false; } // don't delete default NIC on a user VM - if (nic.isDefaultNic() && vm.getType() == VirtualMachine.Type.User ) { + if (nic.isDefaultNic() && vm.getType() == VirtualMachine.Type.User) { s_logger.warn("Failed to remove nic from " + vm + " in " + network + ", nic is default."); throw new CloudRuntimeException("Failed to remove nic from " + vm + " in " + network + ", nic is default."); } @@ -2975,7 +2976,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.debug("Un-plugging nic for vm " + vm + " from network " + network); boolean result = unplugNic(network, nicTO, vmTO, context, dest); if (result) { - s_logger.debug("Nic is unplugged successfully for vm " + vm + " in network " + network ); + s_logger.debug("Nic is unplugged successfully for vm " + vm + " in network " + network); } else { s_logger.warn("Failed to unplug nic for the vm " + vm + " from network " + network); return false; @@ -2988,7 +2989,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac //2) Release the nic _networkMgr.releaseNic(vmProfile, nic); - s_logger.debug("Successfully released nic " + nic + "for vm " + vm); + s_logger.debug("Successfully released nic " + nic + "for vm " + vm); //3) Remove the nic _networkMgr.removeNic(vmProfile, nic); @@ -2996,8 +2997,13 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } @Override - public VMInstanceVO findHostAndMigrate(VirtualMachine.Type vmType, VMInstanceVO vm, Long newSvcOfferingId, ExcludeList excludes) - throws InsufficientCapacityException, ConcurrentOperationException, ResourceUnavailableException, VirtualMachineMigrationException, ManagementServerException { + public void findHostAndMigrate(String vmUuid, Long newSvcOfferingId, ExcludeList excludes) throws InsufficientCapacityException, ConcurrentOperationException, + ResourceUnavailableException { + + VMInstanceVO vm = _vmDao.findByUuid(vmUuid); + if (vm == null) { + throw new CloudRuntimeException("Unable to find " + vmUuid); + } VirtualMachineProfile profile = new VirtualMachineProfileImpl(vm); @@ -3032,39 +3038,20 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } excludes.addHost(dest.getHost().getId()); - VMInstanceVO vmInstance = null; try { - vmInstance = migrateForScale(vm, srcHostId, dest, oldSvcOfferingId); + migrateForScale(vm.getUuid(), srcHostId, dest, oldSvcOfferingId); } catch (ResourceUnavailableException e) { s_logger.debug("Unable to migrate to unavailable " + dest); throw e; } catch (ConcurrentOperationException e) { s_logger.debug("Unable to migrate VM due to: " + e.getMessage()); throw e; - } catch (ManagementServerException e) { - s_logger.debug("Unable to migrate VM: " + e.getMessage()); - throw e; - } catch (VirtualMachineMigrationException e) { - s_logger.debug("Got VirtualMachineMigrationException, Unable to migrate: " + e.getMessage()); - if (vm.getState() == State.Starting) { - s_logger.debug("VM seems to be still Starting, we should retry migration later"); - throw e; - } else { - s_logger.debug("Unable to migrate VM, VM is not in Running or even Starting state, current state: " + vm.getState().toString()); - } - } - if (vmInstance != null) { - return vmInstance; - }else{ - return null; } } @Override - public T migrateForScale(T vmm, long srcHostId, DeployDestination dest, Long oldSvcOfferingId) throws ResourceUnavailableException, - ConcurrentOperationException, ManagementServerException, - VirtualMachineMigrationException { - VMInstanceVO vm = _vmDao.findByUuid(vmm.getUuid()); + public void migrateForScale(String vmUuid, long srcHostId, DeployDestination dest, Long oldSvcOfferingId) throws ResourceUnavailableException, ConcurrentOperationException { + VMInstanceVO vm = _vmDao.findByUuid(vmUuid); s_logger.info("Migrating " + vm + " to " + dest); vm.getServiceOfferingId(); @@ -3083,19 +3070,19 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac VirtualMachineGuru vmGuru = getVmGuru(vm); long vmId = vm.getId(); - vm = _vmDao.findByUuid(vmm.getUuid()); + vm = _vmDao.findByUuid(vmUuid); if (vm == null) { if (s_logger.isDebugEnabled()) { s_logger.debug("Unable to find the vm " + vm); } - throw new ManagementServerException("Unable to find a virtual machine with id " + vmId); + throw new CloudRuntimeException("Unable to find a virtual machine with id " + vmId); } if (vm.getState() != State.Running) { if (s_logger.isDebugEnabled()) { s_logger.debug("VM is not Running, unable to migrate the vm " + vm); } - throw new VirtualMachineMigrationException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString()); + throw new CloudRuntimeException("VM is not Running, unable to migrate the vm currently " + vm + " , current state: " + vm.getState().toString()); } short alertType = AlertManager.ALERT_TYPE_USERVM_MIGRATE; @@ -3120,7 +3107,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac PrepareForMigrationAnswer pfma = null; try { - pfma = (PrepareForMigrationAnswer) _agentMgr.send(dstHostId, pfmc); + pfma = (PrepareForMigrationAnswer)_agentMgr.send(dstHostId, pfmc); if (!pfma.getResult()) { String msg = "Unable to prepare for migration due to " + pfma.getDetails(); pfma = null; @@ -3153,10 +3140,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac mc.setHostGuid(dest.getHost().getGuid()); try { - MigrateAnswer ma = (MigrateAnswer) _agentMgr.send(vm.getLastHostId(), mc); + MigrateAnswer ma = (MigrateAnswer)_agentMgr.send(vm.getLastHostId(), mc); if (!ma.getResult()) { s_logger.error("Unable to migrate due to " + ma.getDetails()); - return null; + throw new CloudRuntimeException("Unable to migrate due to " + ma.getDetails()); } } catch (OperationTimedoutException e) { if (e.isActive()) { @@ -3186,18 +3173,18 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac s_logger.error("AgentUnavailableException while cleanup on source host: " + srcHostId); } cleanup(vmGuru, new VirtualMachineProfileImpl(vm), work, Event.AgentReportStopped, true); - return null; + throw new CloudRuntimeException("Unable to complete migration for " + vm); } } catch (OperationTimedoutException e) { } migrated = true; - return vmm; } finally { if (!migrated) { s_logger.info("Migration was unsuccessful. Cleaning up: " + vm); - _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + " in zone " + _alertMgr.sendAlert(alertType, fromHost.getDataCenterId(), fromHost.getPodId(), "Unable to migrate vm " + vm.getInstanceName() + " from host " + fromHost.getName() + + " in zone " + dest.getDataCenter().getName() + " and pod " + dest.getPod().getName(), "Migrate Command failed. Please check logs."); try { _agentMgr.send(dstHostId, new Commands(cleanup(vm.getInstanceName())), null); @@ -3285,7 +3272,8 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } @Override - public VMInstanceVO reConfigureVm(VMInstanceVO vm , ServiceOffering oldServiceOffering, boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, ConcurrentOperationException { + public VMInstanceVO reConfigureVm(VMInstanceVO vm, ServiceOffering oldServiceOffering, boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, + ConcurrentOperationException { UserVmDetailVO vmDetailVO = _uservmDetailsDao.findDetail(vm.getId(), VirtualMachine.IsDynamicScalingEnabled); Boolean isDynamicallyScalable; @@ -3299,11 +3287,14 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac ServiceOffering newServiceOffering = _configMgr.getServiceOffering(newServiceofferingId); HostVO hostVo = _hostDao.findById(vm.getHostId()); - Float memoryOvercommitRatio = Float.parseFloat(_configServer.getConfigValue(Config.MemOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), hostVo.getClusterId())); - Float cpuOvercommitRatio = Float.parseFloat(_configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), hostVo.getClusterId())); - long minMemory = (long) (newServiceOffering.getRamSize()/memoryOvercommitRatio); + Float memoryOvercommitRatio = Float.parseFloat(_configServer.getConfigValue(Config.MemOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), + hostVo.getClusterId())); + Float cpuOvercommitRatio = Float.parseFloat(_configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), + hostVo.getClusterId())); + long minMemory = (long)(newServiceOffering.getRamSize() / memoryOvercommitRatio); ScaleVmCommand reconfigureCmd = new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(), - (int) (newServiceOffering.getSpeed()/cpuOvercommitRatio), newServiceOffering.getSpeed(), minMemory * 1024L * 1024L, newServiceOffering.getRamSize() * 1024L * 1024L, newServiceOffering.getLimitCpuUse(), isDynamicallyScalable); + (int)(newServiceOffering.getSpeed() / cpuOvercommitRatio), newServiceOffering.getSpeed(), minMemory * 1024L * 1024L, + newServiceOffering.getRamSize() * 1024L * 1024L, newServiceOffering.getLimitCpuUse(), isDynamicallyScalable); Long dstHostId = vm.getHostId(); ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Running, vm.getType(), vm.getId()); @@ -3313,7 +3304,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac work = _workDao.persist(work); boolean success = false; try { - if(reconfiguringOnExistingHost){ + if (reconfiguringOnExistingHost) { vm.setServiceOfferingId(oldServiceOffering.getId()); _capacityMgr.releaseVmCapacity(vm, false, false, vm.getHostId()); //release the old capacity vm.setServiceOfferingId(newServiceofferingId); @@ -3331,10 +3322,10 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac throw new AgentUnavailableException("Operation timed out on reconfiguring " + vm, dstHostId); } catch (AgentUnavailableException e) { throw e; - } finally{ + } finally { // work.setStep(Step.Done); //_workDao.update(work.getId(), work); - if(!success){ + if (!success) { _capacityMgr.releaseVmCapacity(vm, false, false, vm.getHostId()); // release the new capacity vm.setServiceOfferingId(oldServiceOffering.getId()); _capacityMgr.allocateVmCapacity(vm, false); // allocate the old capacity @@ -3345,5 +3336,4 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac } - } diff --git a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java index 44a703d69c7..56b14cdc404 100644 --- a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java +++ b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java @@ -254,7 +254,7 @@ public class VirtualMachineManagerImplTest { long l = 1L; when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance); - _vmMgr.migrateForScale(_vmInstance, l, dest, l); + _vmMgr.migrateForScale(_vmInstance.getUuid(), l, dest, l); } @@ -298,8 +298,9 @@ public class VirtualMachineManagerImplTest { when(_vmInstance.getHostId()).thenReturn(null); when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance); + when(_vmInstanceDao.findByUuid(any(String.class))).thenReturn(_vmInstance); DeploymentPlanner.ExcludeList excludeHostList = new DeploymentPlanner.ExcludeList(); - _vmMgr.findHostAndMigrate(VirtualMachine.Type.User, _vmInstance, 2l, excludeHostList); + _vmMgr.findHostAndMigrate(_vmInstance.getUuid(), 2l, excludeHostList); } From 9aaa378b087271bf44f27ac9ca7f5ff8e9ec767f Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 25 Jul 2013 18:59:30 -0700 Subject: [PATCH 034/907] Moved ClusterManager into it's own package. Removed the agent load balancing code. --- .../api/ScheduleHostScanTaskCommand.java | 0 framework/cluster/pom.xml | 28 ++ .../cloud/cluster/ActiveFencingException.java | 3 +- .../cloud/cluster/ClusterFenceManager.java | 0 .../cluster/ClusterFenceManagerImpl.java | 0 .../ClusterInvalidSessionException.java | 3 +- .../src/com/cloud/cluster/ClusterManager.java | 58 +++ .../com/cloud/cluster/ClusterManagerImpl.java | 445 +++--------------- .../cloud/cluster/ClusterManagerListener.java | 0 .../cloud/cluster/ClusterManagerMBean.java | 1 - .../cluster/ClusterManagerMBeanImpl.java | 28 +- .../cloud/cluster/ClusterManagerMessage.java | 0 .../cluster/ClusterNodeJoinEventArgs.java | 0 .../cluster/ClusterNodeLeftEventArgs.java | 0 .../src/com/cloud/cluster/ClusterService.java | 0 .../cloud/cluster/ClusterServiceAdapter.java | 0 .../com/cloud/cluster/ClusterServicePdu.java | 0 .../cluster/ClusterServiceRequestPdu.java | 0 .../cluster/ClusterServiceServletAdapter.java | 20 +- .../ClusterServiceServletContainer.java | 0 .../ClusterServiceServletHttpHandler.java | 0 .../cluster/ClusterServiceServletImpl.java | 16 +- .../cloud/cluster/ManagementServerHost.java | 6 +- .../cluster/ManagementServerHostPeerVO.java | 5 +- .../cloud/cluster/ManagementServerHostVO.java | 8 +- .../cloud/cluster/RemoteMethodConstants.java | 0 .../cluster/dao/ManagementServerHostDao.java | 0 .../dao/ManagementServerHostDaoImpl.java | 2 - .../dao/ManagementServerHostPeerDao.java | 0 .../dao/ManagementServerHostPeerDaoImpl.java | 2 - framework/pom.xml | 2 + server/pom.xml | 5 + .../manager/ClusteredAgentManagerImpl.java | 343 ++++++++++++-- .../com/cloud/async/AsyncJobManagerImpl.java | 8 +- .../src/com/cloud/cluster/ClusterManager.java | 67 --- .../cluster/DummyClusterManagerImpl.java | 179 ------- .../LockMasterListener.java | 4 +- .../cloud/server/ManagementServerImpl.java | 3 + 38 files changed, 527 insertions(+), 709 deletions(-) mode change 100755 => 100644 core/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java create mode 100644 framework/cluster/pom.xml rename {server => framework/cluster}/src/com/cloud/cluster/ActiveFencingException.java (91%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterFenceManager.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterFenceManagerImpl.java (100%) rename {engine/schema => framework/cluster}/src/com/cloud/cluster/ClusterInvalidSessionException.java (90%) create mode 100644 framework/cluster/src/com/cloud/cluster/ClusterManager.java rename {server => framework/cluster}/src/com/cloud/cluster/ClusterManagerImpl.java (72%) mode change 100755 => 100644 rename {server => framework/cluster}/src/com/cloud/cluster/ClusterManagerListener.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterManagerMBean.java (95%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterManagerMBeanImpl.java (74%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterManagerMessage.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterNodeJoinEventArgs.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterNodeLeftEventArgs.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterService.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterServiceAdapter.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterServicePdu.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterServiceRequestPdu.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterServiceServletAdapter.java (86%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterServiceServletContainer.java (100%) rename {server => framework/cluster}/src/com/cloud/cluster/ClusterServiceServletHttpHandler.java (100%) mode change 100755 => 100644 rename {server => framework/cluster}/src/com/cloud/cluster/ClusterServiceServletImpl.java (91%) rename {api => framework/cluster}/src/com/cloud/cluster/ManagementServerHost.java (89%) rename {engine/schema => framework/cluster}/src/com/cloud/cluster/ManagementServerHostPeerVO.java (94%) rename {engine/schema => framework/cluster}/src/com/cloud/cluster/ManagementServerHostVO.java (96%) rename {server => framework/cluster}/src/com/cloud/cluster/RemoteMethodConstants.java (100%) rename {engine/schema => framework/cluster}/src/com/cloud/cluster/dao/ManagementServerHostDao.java (100%) rename {engine/schema => framework/cluster}/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java (99%) rename {engine/schema => framework/cluster}/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java (100%) rename {engine/schema => framework/cluster}/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java (98%) delete mode 100755 server/src/com/cloud/cluster/ClusterManager.java delete mode 100755 server/src/com/cloud/cluster/DummyClusterManagerImpl.java rename server/src/com/cloud/{cluster => server}/LockMasterListener.java (92%) diff --git a/core/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java b/core/src/com/cloud/agent/api/ScheduleHostScanTaskCommand.java old mode 100755 new mode 100644 diff --git a/framework/cluster/pom.xml b/framework/cluster/pom.xml new file mode 100644 index 00000000000..116b6353258 --- /dev/null +++ b/framework/cluster/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + cloud-framework-cluster + Apache CloudStack Framework - Clustering + + org.apache.cloudstack + cloudstack-framework + 4.2.0-SNAPSHOT + ../pom.xml + + + + org.apache.cloudstack + cloud-utils + ${project.version} + + + diff --git a/server/src/com/cloud/cluster/ActiveFencingException.java b/framework/cluster/src/com/cloud/cluster/ActiveFencingException.java similarity index 91% rename from server/src/com/cloud/cluster/ActiveFencingException.java rename to framework/cluster/src/com/cloud/cluster/ActiveFencingException.java index 512219d07b7..a4450864d05 100644 --- a/server/src/com/cloud/cluster/ActiveFencingException.java +++ b/framework/cluster/src/com/cloud/cluster/ActiveFencingException.java @@ -16,9 +16,8 @@ // under the License. package com.cloud.cluster; -import com.cloud.exception.CloudException; -public class ActiveFencingException extends CloudException { +public class ActiveFencingException extends Exception { private static final long serialVersionUID = -3975376101728211726L; public ActiveFencingException(String message) { diff --git a/server/src/com/cloud/cluster/ClusterFenceManager.java b/framework/cluster/src/com/cloud/cluster/ClusterFenceManager.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterFenceManager.java rename to framework/cluster/src/com/cloud/cluster/ClusterFenceManager.java diff --git a/server/src/com/cloud/cluster/ClusterFenceManagerImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterFenceManagerImpl.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterFenceManagerImpl.java rename to framework/cluster/src/com/cloud/cluster/ClusterFenceManagerImpl.java diff --git a/engine/schema/src/com/cloud/cluster/ClusterInvalidSessionException.java b/framework/cluster/src/com/cloud/cluster/ClusterInvalidSessionException.java similarity index 90% rename from engine/schema/src/com/cloud/cluster/ClusterInvalidSessionException.java rename to framework/cluster/src/com/cloud/cluster/ClusterInvalidSessionException.java index 8ac94f27d54..e9378b77468 100644 --- a/engine/schema/src/com/cloud/cluster/ClusterInvalidSessionException.java +++ b/framework/cluster/src/com/cloud/cluster/ClusterInvalidSessionException.java @@ -16,9 +16,8 @@ // under the License. package com.cloud.cluster; -import com.cloud.exception.CloudException; -public class ClusterInvalidSessionException extends CloudException { +public class ClusterInvalidSessionException extends Exception { private static final long serialVersionUID = -6636524194520997512L; diff --git a/framework/cluster/src/com/cloud/cluster/ClusterManager.java b/framework/cluster/src/com/cloud/cluster/ClusterManager.java new file mode 100644 index 00000000000..51d993ea473 --- /dev/null +++ b/framework/cluster/src/com/cloud/cluster/ClusterManager.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 com.cloud.cluster; + +import com.cloud.utils.component.Manager; + +public interface ClusterManager extends Manager { + static final String ALERT_SUBJECT = "cluster-alert"; + + void OnReceiveClusterServicePdu(ClusterServicePdu pdu); + + /** + * This executes + * @param strPeer + * @param agentId + * @param cmds + * @param stopOnError + * @return + */ + String execute(String strPeer, long agentId, String cmds, boolean stopOnError); + + /** + * Broadcast the command to all of the management server nodes. + * @param agentId agent id this broadcast is regarding + * @param cmds commands to broadcast + */ + void broadcast(long agentId, String cmds); + + int getHeartbeatThreshold(); + + void registerListener(ClusterManagerListener listener); + void unregisterListener(ClusterManagerListener listener); + + void registerDispatcher(Dispatcher dispatcher); + + ManagementServerHost getPeer(String peerName); + + String getSelfPeerName(); + + public interface Dispatcher { + String getName(); + String dispatch(ClusterServicePdu pdu); + } +} diff --git a/server/src/com/cloud/cluster/ClusterManagerImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java old mode 100755 new mode 100644 similarity index 72% rename from server/src/com/cloud/cluster/ClusterManagerImpl.java rename to framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java index 5a08f878625..dd7a6035a1a --- a/server/src/com/cloud/cluster/ClusterManagerImpl.java +++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerImpl.java @@ -45,44 +45,21 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; -import com.cloud.agent.AgentManager; -import com.cloud.agent.AgentManager.OnError; -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.ChangeAgentAnswer; -import com.cloud.agent.api.ChangeAgentCommand; -import com.cloud.agent.api.Command; -import com.cloud.agent.api.PropagateResourceEventCommand; -import com.cloud.agent.api.TransferAgentCommand; -import com.cloud.agent.api.ScheduleHostScanTaskCommand; -import com.cloud.agent.manager.ClusteredAgentManagerImpl; -import com.cloud.agent.manager.Commands; -import com.cloud.cluster.agentlb.dao.HostTransferMapDao; +import org.apache.cloudstack.config.ConfigDepot; +import org.apache.cloudstack.config.ConfigKey; +import org.apache.cloudstack.config.ConfigValue; +import org.apache.cloudstack.utils.identity.ManagementServerNode; + import com.cloud.cluster.dao.ManagementServerHostDao; import com.cloud.cluster.dao.ManagementServerHostPeerDao; -import com.cloud.configuration.Config; -import com.cloud.configuration.dao.ConfigurationDao; -import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.OperationTimedoutException; -import com.cloud.host.Host; -import com.cloud.host.HostVO; -import com.cloud.host.Status.Event; -import com.cloud.host.dao.HostDao; -import com.cloud.resource.ResourceManager; -import com.cloud.resource.ResourceState; -import com.cloud.serializer.GsonHelper; import com.cloud.utils.DateUtil; -import com.cloud.utils.NumbersUtil; import com.cloud.utils.Profiler; import com.cloud.utils.PropertiesUtil; -import com.cloud.utils.component.ComponentContext; import com.cloud.utils.component.ComponentLifecycle; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.ConnectionConcierge; import com.cloud.utils.db.DB; -import com.cloud.utils.db.SearchCriteria.Op; -import com.cloud.utils.db.SearchCriteria2; -import com.cloud.utils.db.SearchCriteriaService; import com.cloud.utils.db.Transaction; import com.cloud.utils.events.SubscriptionMgr; import com.cloud.utils.exception.CloudRuntimeException; @@ -90,31 +67,22 @@ import com.cloud.utils.exception.ExceptionUtil; import com.cloud.utils.mgmt.JmxUtil; import com.cloud.utils.net.NetUtils; -import com.google.gson.Gson; - -import org.apache.cloudstack.utils.identity.ManagementServerNode; - @Local(value = { ClusterManager.class }) public class ClusterManagerImpl extends ManagerBase implements ClusterManager { private static final Logger s_logger = Logger.getLogger(ClusterManagerImpl.class); private static final int EXECUTOR_SHUTDOWN_TIMEOUT = 1000; // 1 second - private static final int DEFAULT_OUTGOING_WORKERS = 5; + private static final int DEFAULT_OUTGOING_WORKERS = 5; private final List _listeners = new ArrayList(); private final Map _activePeers = new HashMap(); - private int _heartbeatInterval = ClusterManager.DEFAULT_HEARTBEAT_INTERVAL; - private int _heartbeatThreshold = ClusterManager.DEFAULT_HEARTBEAT_THRESHOLD; + private ConfigValue _heartbeatInterval; + private ConfigValue _heartbeatThreshold; private final Map _clusterPeers; - private final Gson _gson; @Inject - private AgentManager _agentMgr; - @Inject - private ClusteredAgentRebalanceService _rebalanceService; - @Inject - private ResourceManager _resourceMgr; + protected ConfigDepot _configDepot; private final ScheduledExecutorService _heartbeatScheduler = Executors.newScheduledThreadPool(1, new NamedThreadFactory("Cluster-Heartbeat")); private final ExecutorService _notificationExecutor = Executors.newFixedThreadPool(1, new NamedThreadFactory("Cluster-Notification")); @@ -130,9 +98,8 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { @Inject private ManagementServerHostDao _mshostDao; @Inject private ManagementServerHostPeerDao _mshostPeerDao; - @Inject private HostDao _hostDao; - @Inject private HostTransferMapDao _hostTransferDao; - @Inject private ConfigurationDao _configDao; + + protected Dispatcher _dispatcher; // // pay attention to _mshostId and _msid @@ -146,9 +113,6 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { private boolean _peerScanInited = false; private String _clusterNodeIP = "127.0.0.1"; - private boolean _agentLBEnabled = false; - private double _connectedAgentsThreshold = 0.7; - private static boolean _agentLbHappened = false; private final List _clusterPduOutgoingQueue = new ArrayList(); private final List _clusterPduIncomingQueue = new ArrayList(); @@ -157,8 +121,6 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { public ClusterManagerImpl() { _clusterPeers = new HashMap(); - _gson = GsonHelper.getGson(); - // executor to perform remote-calls in another thread context, to avoid potential // recursive remote calls between nodes // @@ -172,6 +134,11 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } } + @Override + public void registerDispatcher(Dispatcher dispatcher) { + _dispatcher = dispatcher; + } + private ClusterServiceRequestPdu popRequestPdu(long ackSequenceId) { synchronized(_outgoingPdusWaitingForAck) { if(_outgoingPdusWaitingForAck.get(ackSequenceId) != null) { @@ -198,7 +165,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } for(ClusterServiceRequestPdu pdu : candidates) { - s_logger.warn("Cancel cluster request PDU to peer: " + strPeer + ", pdu: " + _gson.toJson(pdu)); + s_logger.warn("Cancel cluster request PDU to peer: " + strPeer + ", pdu: " + pdu.getJsonPackage()); synchronized(pdu) { pdu.notifyAll(); } @@ -287,7 +254,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { if(peerService != null) { try { if(s_logger.isDebugEnabled()) { - s_logger.debug("Cluster PDU " + getSelfPeerName() + " -> " + pdu.getDestPeer() + ". agent: " + pdu.getAgentId() + s_logger.debug("Cluster PDU " + getSelfPeerName() + " -> " + pdu.getDestPeer() + ". agent: " + pdu.getAgentId() + ", pdu seq: " + pdu.getSequenceId() + ", pdu ack seq: " + pdu.getAckSequenceId() + ", json: " + pdu.getJsonPackage()); } @@ -295,7 +262,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { String strResult = peerService.execute(pdu); if(s_logger.isDebugEnabled()) { s_logger.debug("Cluster PDU " + getSelfPeerName() + " -> " + pdu.getDestPeer() + " completed. time: " + - (System.currentTimeMillis() - startTick) + "ms. agent: " + pdu.getAgentId() + (System.currentTimeMillis() - startTick) + "ms. agent: " + pdu.getAgentId() + ", pdu seq: " + pdu.getSequenceId() + ", pdu ack seq: " + pdu.getAckSequenceId() + ", json: " + pdu.getJsonPackage()); } @@ -335,10 +302,10 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { requestPdu.notifyAll(); } } else { - s_logger.warn("Original request has already been cancelled. pdu: " + _gson.toJson(pdu)); + s_logger.warn("Original request has already been cancelled. pdu: " + pdu.getJsonPackage()); } } else { - String result = dispatchClusterServicePdu(pdu); + String result = _dispatcher.dispatch(pdu); if(result == null) result = ""; @@ -361,187 +328,14 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } } - private String handleScheduleHostScanTaskCommand(ScheduleHostScanTaskCommand cmd) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Intercepting resource manager command: " + _gson.toJson(cmd)); - } - try { - // schedule a scan task immediately - if (_agentMgr instanceof ClusteredAgentManagerImpl) { - if (s_logger.isDebugEnabled()) { - s_logger.debug("Received notification as part of addHost command to start a host scan task"); - } - ClusteredAgentManagerImpl clusteredAgentMgr = (ClusteredAgentManagerImpl)_agentMgr; - clusteredAgentMgr.scheduleHostScanTask(); - } - } catch (Exception e) { - // Scheduling host scan task in peer MS is a best effort operation during host add, regular host scan - // happens at fixed intervals anyways. So handling any exceptions that may be thrown - s_logger.warn("Exception happened while trying to schedule host scan task on mgmt server " + getSelfPeerName() + ", ignoring as regular host scan happens at fixed interval anyways", e); - return null; - } - - Answer[] answers = new Answer[1]; - answers[0] = new Answer(cmd, true, null); - return _gson.toJson(answers); - } - - private String dispatchClusterServicePdu(ClusterServicePdu pdu) { - - if(s_logger.isDebugEnabled()) { - s_logger.debug("Dispatch ->" + pdu.getAgentId() + ", json: " + pdu.getJsonPackage()); - } - - Command [] cmds = null; - try { - cmds = _gson.fromJson(pdu.getJsonPackage(), Command[].class); - } catch(Throwable e) { - assert(false); - s_logger.error("Excection in gson decoding : ", e); - } - - if (cmds.length == 1 && cmds[0] instanceof ChangeAgentCommand) { //intercepted - ChangeAgentCommand cmd = (ChangeAgentCommand)cmds[0]; - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Intercepting command for agent change: agent " + cmd.getAgentId() + " event: " + cmd.getEvent()); - } - boolean result = false; - try { - result = executeAgentUserRequest(cmd.getAgentId(), cmd.getEvent()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Result is " + result); - } - - } catch (AgentUnavailableException e) { - s_logger.warn("Agent is unavailable", e); - return null; - } - - Answer[] answers = new Answer[1]; - answers[0] = new ChangeAgentAnswer(cmd, result); - return _gson.toJson(answers); - } else if (cmds.length == 1 && cmds[0] instanceof TransferAgentCommand) { - TransferAgentCommand cmd = (TransferAgentCommand) cmds[0]; - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Intercepting command for agent rebalancing: agent " + cmd.getAgentId() + " event: " + cmd.getEvent()); - } - boolean result = false; - try { - result = rebalanceAgent(cmd.getAgentId(), cmd.getEvent(), cmd.getCurrentOwner(), cmd.getFutureOwner()); - if (s_logger.isDebugEnabled()) { - s_logger.debug("Result is " + result); - } - - } catch (AgentUnavailableException e) { - s_logger.warn("Agent is unavailable", e); - return null; - } catch (OperationTimedoutException e) { - s_logger.warn("Operation timed out", e); - return null; - } - Answer[] answers = new Answer[1]; - answers[0] = new Answer(cmd, result, null); - return _gson.toJson(answers); - } else if (cmds.length == 1 && cmds[0] instanceof PropagateResourceEventCommand ) { - PropagateResourceEventCommand cmd = (PropagateResourceEventCommand) cmds[0]; - - s_logger.debug("Intercepting command to propagate event " + cmd.getEvent().name() + " for host " + cmd.getHostId()); - - boolean result = false; - try { - result = executeResourceUserRequest(cmd.getHostId(), cmd.getEvent()); - s_logger.debug("Result is " + result); - } catch (AgentUnavailableException ex) { - s_logger.warn("Agent is unavailable", ex); - return null; - } - - Answer[] answers = new Answer[1]; - answers[0] = new Answer(cmd, result, null); - return _gson.toJson(answers); - } else if (cmds.length == 1 && cmds[0] instanceof ScheduleHostScanTaskCommand) { - ScheduleHostScanTaskCommand cmd = (ScheduleHostScanTaskCommand) cmds[0]; - String response = handleScheduleHostScanTaskCommand(cmd); - return response; - } - - try { - long startTick = System.currentTimeMillis(); - if(s_logger.isDebugEnabled()) { - s_logger.debug("Dispatch -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage()); - } - - Answer[] answers = sendToAgent(pdu.getAgentId(), cmds, pdu.isStopOnError()); - if(answers != null) { - String jsonReturn = _gson.toJson(answers); - - if(s_logger.isDebugEnabled()) { - s_logger.debug("Completed dispatching -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage() + - " in " + (System.currentTimeMillis() - startTick) + " ms, return result: " + jsonReturn); - } - - return jsonReturn; - } else { - if(s_logger.isDebugEnabled()) { - s_logger.debug("Completed dispatching -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage() + - " in " + (System.currentTimeMillis() - startTick) + " ms, return null result"); - } - } - } catch(AgentUnavailableException e) { - s_logger.warn("Agent is unavailable", e); - } catch (OperationTimedoutException e) { - s_logger.warn("Timed Out", e); - } - - return null; - } @Override public void OnReceiveClusterServicePdu(ClusterServicePdu pdu) { addIncomingClusterPdu(pdu); } - @Override - public Answer[] sendToAgent(Long hostId, Command[] cmds, boolean stopOnError) throws AgentUnavailableException, OperationTimedoutException { - Commands commands = new Commands(stopOnError ? OnError.Stop : OnError.Continue); - for (Command cmd : cmds) { - commands.addCommand(cmd); - } - return _agentMgr.send(hostId, commands); - } - @Override - public boolean executeAgentUserRequest(long agentId, Event event) throws AgentUnavailableException { - return _agentMgr.executeUserRequest(agentId, event); - } - - @Override - public Boolean propagateAgentEvent(long agentId, Event event) throws AgentUnavailableException { - final String msPeer = getPeerName(agentId); - if (msPeer == null) { - return null; - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Propagating agent change request event:" + event.toString() + " to agent:" + agentId); - } - Command[] cmds = new Command[1]; - cmds[0] = new ChangeAgentCommand(agentId, event); - - Answer[] answers = execute(msPeer, agentId, cmds, true); - if (answers == null) { - throw new AgentUnavailableException(agentId); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Result for agent change is " + answers[0].getResult()); - } - - return answers[0].getResult(); - } /** * called by DatabaseUpgradeChecker to see if there are other peers running. @@ -556,10 +350,10 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } @Override - public void broadcast(long agentId, Command[] cmds) { + public void broadcast(long agentId, String cmds) { Date cutTime = DateUtil.currentGMTTime(); - List peers = _mshostDao.getActiveList(new Date(cutTime.getTime() - _heartbeatThreshold)); + List peers = _mshostDao.getActiveList(new Date(cutTime.getTime() - _heartbeatThreshold.value())); for (ManagementServerHostVO peer : peers) { String peerName = Long.toString(peer.getMsid()); if (getSelfPeerName().equals(peerName)) { @@ -567,7 +361,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } try { if (s_logger.isDebugEnabled()) { - s_logger.debug("Forwarding " + cmds[0].toString() + " to " + peer.getMsid()); + s_logger.debug("Forwarding " + cmds + " to " + peer.getMsid()); } executeAsync(peerName, agentId, cmds, true); } catch (Exception e) { @@ -576,29 +370,27 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } } - @Override - public void executeAsync(String strPeer, long agentId, Command [] cmds, boolean stopOnError) { + public void executeAsync(String strPeer, long agentId, String cmds, boolean stopOnError) { ClusterServicePdu pdu = new ClusterServicePdu(); pdu.setSourcePeer(getSelfPeerName()); pdu.setDestPeer(strPeer); pdu.setAgentId(agentId); - pdu.setJsonPackage(_gson.toJson(cmds, Command[].class)); + pdu.setJsonPackage(cmds); pdu.setStopOnError(true); addOutgoingClusterPdu(pdu); } @Override - public Answer[] execute(String strPeer, long agentId, Command [] cmds, boolean stopOnError) { + public String execute(String strPeer, long agentId, String cmds, boolean stopOnError) { if(s_logger.isDebugEnabled()) { - s_logger.debug(getSelfPeerName() + " -> " + strPeer + "." + agentId + " " + - _gson.toJson(cmds, Command[].class)); + s_logger.debug(getSelfPeerName() + " -> " + strPeer + "." + agentId + " " + cmds); } ClusterServiceRequestPdu pdu = new ClusterServiceRequestPdu(); pdu.setSourcePeer(getSelfPeerName()); pdu.setDestPeer(strPeer); pdu.setAgentId(agentId); - pdu.setJsonPackage(_gson.toJson(cmds, Command[].class)); + pdu.setJsonPackage(cmds); pdu.setStopOnError(stopOnError); registerRequestPdu(pdu); addOutgoingClusterPdu(pdu); @@ -616,30 +408,12 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } if(pdu.getResponseResult() != null && pdu.getResponseResult().length() > 0) { - try { - return _gson.fromJson(pdu.getResponseResult(), Answer[].class); - } catch(Throwable e) { - s_logger.error("Exception on parsing gson package from remote call to " + strPeer); - } + return pdu.getResponseResult(); } return null; } - @Override - public String getPeerName(long agentHostId) { - - HostVO host = _hostDao.findById(agentHostId); - if(host != null && host.getManagementServerId() != null) { - if(getSelfPeerName().equals(Long.toString(host.getManagementServerId()))) { - return null; - } - - return Long.toString(host.getManagementServerId()); - } - return null; - } - @Override public ManagementServerHostVO getPeer(String mgmtServerId) { return _mshostDao.findByMsid(Long.valueOf(mgmtServerId)); @@ -650,7 +424,6 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { return Long.toString(_msId); } - @Override public String getSelfNodeIP() { return _clusterNodeIP; } @@ -765,7 +538,6 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { Profiler profiler = new Profiler(); Profiler profilerHeartbeatUpdate = new Profiler(); Profiler profilerPeerScan = new Profiler(); - Profiler profilerAgentLB = new Profiler(); try { profiler.start(); @@ -792,40 +564,14 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { peerScan(); profilerPeerScan.stop(); - profilerAgentLB.start(); - //initiate agent lb task will be scheduled and executed only once, and only when number of agents loaded exceeds _connectedAgentsThreshold - if (_agentLBEnabled && !_agentLbHappened) { - SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); - sc.addAnd(sc.getEntity().getManagementServerId(), Op.NNULL); - sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing); - List allManagedRoutingAgents = sc.list(); - - sc = SearchCriteria2.create(HostVO.class); - sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing); - List allAgents = sc.list(); - double allHostsCount = allAgents.size(); - double managedHostsCount = allManagedRoutingAgents.size(); - if (allHostsCount > 0.0) { - double load = managedHostsCount/allHostsCount; - if (load >= _connectedAgentsThreshold) { - s_logger.debug("Scheduling agent rebalancing task as the average agent load " + load + " is more than the threshold " + _connectedAgentsThreshold); - _rebalanceService.scheduleRebalanceAgents(); - _agentLbHappened = true; - } else { - s_logger.trace("Not scheduling agent rebalancing task as the averages load " + load + " is less than the threshold " + _connectedAgentsThreshold); - } - } - } - profilerAgentLB.stop(); } finally { profiler.stop(); - if(profiler.getDuration() >= _heartbeatInterval) { + if (profiler.getDuration() >= _heartbeatInterval.value()) { if(s_logger.isDebugEnabled()) - s_logger.debug("Management server heartbeat takes too long to finish. profiler: " + profiler.toString() + + s_logger.debug("Management server heartbeat takes too long to finish. profiler: " + profiler.toString() + ", profilerHeartbeatUpdate: " + profilerHeartbeatUpdate.toString() + - ", profilerPeerScan: " + profilerPeerScan.toString() + - ", profilerAgentLB: " + profilerAgentLB.toString()); + ", profilerPeerScan: " + profilerPeerScan.toString()); } } @@ -854,8 +600,8 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { invalidHeartbeatConnection(); } finally { - txn.transitToAutoManagedConnection(Transaction.CLOUD_DB); - txn.close("ClusterHeartBeat"); + txn.transitToAutoManagedConnection(Transaction.CLOUD_DB); + txn.close("ClusterHeartBeat"); } } }; @@ -964,9 +710,9 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } private void queueNotification(ClusterManagerMessage msg) { - synchronized(this._notificationMsgs) { - this._notificationMsgs.add(msg); - this._notificationMsgs.notifyAll(); + synchronized(_notificationMsgs) { + _notificationMsgs.add(msg); + _notificationMsgs.notifyAll(); } switch(msg.getMessageType()) { @@ -999,9 +745,9 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } private ClusterManagerMessage getNextNotificationMessage() { - synchronized(this._notificationMsgs) { - if(this._notificationMsgs.size() > 0) { - return this._notificationMsgs.remove(0); + synchronized(_notificationMsgs) { + if(_notificationMsgs.size() > 0) { + return _notificationMsgs.remove(0); } } @@ -1012,9 +758,9 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { // upon startup, for all inactive management server nodes that we see at startup time, we will send notification also to help upper layer perform // missed cleanup Date cutTime = DateUtil.currentGMTTime(); - List inactiveList = _mshostDao.getInactiveList(new Date(cutTime.getTime() - _heartbeatThreshold)); + List inactiveList = _mshostDao.getInactiveList(new Date(cutTime.getTime() - _heartbeatThreshold.value())); - // We don't have foreign key constraints to enforce the mgmt_server_id integrity in host table, when user manually + // We don't have foreign key constraints to enforce the mgmt_server_id integrity in host table, when user manually // remove records from mshost table, this will leave orphan mgmt_serve_id reference in host table. List orphanList = _mshostDao.listOrphanMsids(); if(orphanList.size() > 0) { @@ -1038,12 +784,12 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { for(ManagementServerHostVO host : inactiveList) { if(!pingManagementNode(host)) { s_logger.warn("Management node " + host.getId() + " is detected inactive by timestamp and also not pingable"); - downHostList.add(host); + downHostList.add(host); } } if(downHostList.size() > 0) - this.queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeRemoved, downHostList)); + queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeRemoved, downHostList)); } else { s_logger.info("No inactive management server node found"); } @@ -1057,7 +803,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { Profiler profilerQueryActiveList = new Profiler(); profilerQueryActiveList.start(); - List currentList = _mshostDao.getActiveList(new Date(cutTime.getTime() - _heartbeatThreshold)); + List currentList = _mshostDao.getActiveList(new Date(cutTime.getTime() - _heartbeatThreshold.value())); profilerQueryActiveList.stop(); Profiler profilerSyncClusterInfo = new Profiler(); @@ -1119,7 +865,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } } - this.queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeRemoved, invalidatedNodeList)); + queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeRemoved, invalidatedNodeList)); } profilerInvalidatedNodeList.stop(); @@ -1144,7 +890,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } if(removedNodeList.size() > 0) { - this.queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeRemoved, removedNodeList)); + queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeRemoved, removedNodeList)); } profilerRemovedList.stop(); @@ -1167,12 +913,12 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } if(newNodeList.size() > 0) { - this.queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeAdded, newNodeList)); + queueNotification(new ClusterManagerMessage(ClusterManagerMessage.MessageType.nodeAdded, newNodeList)); } profiler.stop(); - if(profiler.getDuration() >= this._heartbeatInterval) { + if (profiler.getDuration() >= _heartbeatInterval.value()) { if(s_logger.isDebugEnabled()) s_logger.debug("Peer scan takes too long to finish. profiler: " + profiler.toString() + ", profilerQueryActiveList: " + profilerQueryActiveList.toString() @@ -1208,7 +954,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { if (mshost == null) { mshost = new ManagementServerHostVO(); mshost.setMsid(_msId); - mshost.setRunid(this.getCurrentRunId()); + mshost.setRunid(getCurrentRunId()); mshost.setName(NetUtils.getHostName()); mshost.setVersion(version); mshost.setServiceIP(_clusterNodeIP); @@ -1240,7 +986,7 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { _mshostPeerDao.clearPeerInfo(_mshostId); // use seperate thread for heartbeat updates - _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), _heartbeatInterval, _heartbeatInterval, TimeUnit.MILLISECONDS); + _heartbeatScheduler.scheduleAtFixedRate(getHeartbeatTask(), _heartbeatInterval.value(), _heartbeatInterval.value(), TimeUnit.MILLISECONDS); _notificationExecutor.submit(getNotificationTask()); } catch (Throwable e) { @@ -1281,23 +1027,19 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { return true; } + protected final ConfigKey HeartBeatInterval = new ConfigKey(Integer.class, "cluster.heartbeat.interval", "management-server", ClusterManager.class, + "1500", "Interval to check for the heart beat between management server nodes", false, "Seconds"); + protected final ConfigKey HeartBeatThreshold = new ConfigKey(Integer.class, "cluster.heartbeat.threshold", "management-server", ClusterManager.class, + "150000", "Threshold before self-fence the management server", true, "Seconds"); + @Override public boolean configure(String name, Map params) throws ConfigurationException { if(s_logger.isInfoEnabled()) { s_logger.info("Start configuring cluster manager : " + name); } - Map configs = _configDao.getConfiguration("management-server", params); - - String value = configs.get("cluster.heartbeat.interval"); - if (value != null) { - _heartbeatInterval = NumbersUtil.parseInt(value, ClusterManager.DEFAULT_HEARTBEAT_INTERVAL); - } - - value = configs.get("cluster.heartbeat.threshold"); - if (value != null) { - _heartbeatThreshold = NumbersUtil.parseInt(value, ClusterManager.DEFAULT_HEARTBEAT_THRESHOLD); - } + _heartbeatInterval = _configDepot.get(HeartBeatInterval); + _heartbeatThreshold = _configDepot.get(HeartBeatThreshold); File dbPropsFile = PropertiesUtil.findConfigFile("db.properties"); Properties dbProps = new Properties(); @@ -1337,16 +1079,6 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { throw new ConfigurationException("Unable to set current cluster service adapter"); } - _agentLBEnabled = Boolean.valueOf(_configDao.getValue(Config.AgentLbEnable.key())); - - String connectedAgentsThreshold = configs.get("agent.load.threshold"); - - if (connectedAgentsThreshold != null) { - _connectedAgentsThreshold = Double.parseDouble(connectedAgentsThreshold); - } - - this.registerListener(new LockMasterListener(_msId)); - checkConflicts(); if(s_logger.isInfoEnabled()) { @@ -1355,21 +1087,14 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { return true; } - @Override - public long getManagementNodeId() { - return _msId; - } - - @Override public long getCurrentRunId() { return _runId; } - @Override public boolean isManagementNodeAlive(long msid) { ManagementServerHostVO mshost = _mshostDao.findByMsid(msid); if(mshost != null) { - if(mshost.getLastUpdateTime().getTime() >= DateUtil.currentGMTTime().getTime() - _heartbeatThreshold) { + if (mshost.getLastUpdateTime().getTime() >= DateUtil.currentGMTTime().getTime() - _heartbeatThreshold.value()) { return true; } } @@ -1377,7 +1102,6 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { return false; } - @Override public boolean pingManagementNode(long msid) { ManagementServerHostVO mshost = _mshostDao.findByMsid(msid); if(mshost == null) { @@ -1434,20 +1158,16 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { @Override public int getHeartbeatThreshold() { - return this._heartbeatThreshold; + return _heartbeatThreshold.value(); } public int getHeartbeatInterval() { - return this._heartbeatInterval; - } - - public void setHeartbeatThreshold(int threshold) { - _heartbeatThreshold = threshold; + return _heartbeatInterval.value(); } private void checkConflicts() throws ConfigurationException { Date cutTime = DateUtil.currentGMTTime(); - List peers = _mshostDao.getActiveList(new Date(cutTime.getTime() - _heartbeatThreshold)); + List peers = _mshostDao.getActiveList(new Date(cutTime.getTime() - _heartbeatThreshold.value())); for(ManagementServerHostVO peer : peers) { String peerIP = peer.getServiceIP().trim(); if(_clusterNodeIP.equals(peerIP)) { @@ -1475,43 +1195,4 @@ public class ClusterManagerImpl extends ManagerBase implements ClusterManager { } } - @Override - public boolean rebalanceAgent(long agentId, Event event, long currentOwnerId, long futureOwnerId) throws AgentUnavailableException, OperationTimedoutException { - return _rebalanceService.executeRebalanceRequest(agentId, currentOwnerId, futureOwnerId, event); - } - - @Override - public boolean isAgentRebalanceEnabled() { - return _agentLBEnabled; - } - - @Override - public Boolean propagateResourceEvent(long agentId, ResourceState.Event event) throws AgentUnavailableException { - final String msPeer = getPeerName(agentId); - if (msPeer == null) { - return null; - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Propagating agent change request event:" + event.toString() + " to agent:" + agentId); - } - Command[] cmds = new Command[1]; - cmds[0] = new PropagateResourceEventCommand(agentId, event); - - Answer[] answers = execute(msPeer, agentId, cmds, true); - if (answers == null) { - throw new AgentUnavailableException(agentId); - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Result for agent change is " + answers[0].getResult()); - } - - return answers[0].getResult(); - } - - @Override - public boolean executeResourceUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException { - return _resourceMgr.executeUserRequest(hostId, event); - } } diff --git a/server/src/com/cloud/cluster/ClusterManagerListener.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerListener.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterManagerListener.java rename to framework/cluster/src/com/cloud/cluster/ClusterManagerListener.java diff --git a/server/src/com/cloud/cluster/ClusterManagerMBean.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerMBean.java similarity index 95% rename from server/src/com/cloud/cluster/ClusterManagerMBean.java rename to framework/cluster/src/com/cloud/cluster/ClusterManagerMBean.java index 9804f23fdba..961ed729317 100644 --- a/server/src/com/cloud/cluster/ClusterManagerMBean.java +++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerMBean.java @@ -23,5 +23,4 @@ public interface ClusterManagerMBean { public String getVersion(); public int getHeartbeatInterval(); public int getHeartbeatThreshold(); - public void setHeartbeatThreshold(int threshold); } diff --git a/server/src/com/cloud/cluster/ClusterManagerMBeanImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerMBeanImpl.java similarity index 74% rename from server/src/com/cloud/cluster/ClusterManagerMBeanImpl.java rename to framework/cluster/src/com/cloud/cluster/ClusterManagerMBeanImpl.java index 51b3b428b0e..7071832e17a 100644 --- a/server/src/com/cloud/cluster/ClusterManagerMBeanImpl.java +++ b/framework/cluster/src/com/cloud/cluster/ClusterManagerMBeanImpl.java @@ -24,8 +24,8 @@ import javax.management.StandardMBean; import com.cloud.utils.DateUtil; public class ClusterManagerMBeanImpl extends StandardMBean implements ClusterManagerMBean { - private ClusterManagerImpl _clusterMgr; - private ManagementServerHostVO _mshostVo; + private final ClusterManagerImpl _clusterMgr; + private final ManagementServerHostVO _mshostVo; public ClusterManagerMBeanImpl(ClusterManagerImpl clusterMgr, ManagementServerHostVO mshostVo) { super(ClusterManagerMBean.class, false); @@ -34,34 +34,34 @@ public class ClusterManagerMBeanImpl extends StandardMBean implements ClusterMan _mshostVo = mshostVo; } - public long getMsid() { + @Override + public long getMsid() { return _mshostVo.getMsid(); } - public String getLastUpdateTime() { + @Override + public String getLastUpdateTime() { Date date = _mshostVo.getLastUpdateTime(); return DateUtil.getDateDisplayString(TimeZone.getDefault(), date); } - public String getClusterNodeIP() { + @Override + public String getClusterNodeIP() { return _mshostVo.getServiceIP(); } - public String getVersion() { + @Override + public String getVersion() { return _mshostVo.getVersion(); } - public int getHeartbeatInterval() { + @Override + public int getHeartbeatInterval() { return _clusterMgr.getHeartbeatInterval(); } - public int getHeartbeatThreshold() { + @Override + public int getHeartbeatThreshold() { return _clusterMgr.getHeartbeatThreshold(); } - - public void setHeartbeatThreshold(int threshold) { - // to avoid accidentally screwing up cluster manager, we put some guarding logic here - if(threshold >= ClusterManager.DEFAULT_HEARTBEAT_THRESHOLD) - _clusterMgr.setHeartbeatThreshold(threshold); - } } diff --git a/server/src/com/cloud/cluster/ClusterManagerMessage.java b/framework/cluster/src/com/cloud/cluster/ClusterManagerMessage.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterManagerMessage.java rename to framework/cluster/src/com/cloud/cluster/ClusterManagerMessage.java diff --git a/server/src/com/cloud/cluster/ClusterNodeJoinEventArgs.java b/framework/cluster/src/com/cloud/cluster/ClusterNodeJoinEventArgs.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterNodeJoinEventArgs.java rename to framework/cluster/src/com/cloud/cluster/ClusterNodeJoinEventArgs.java diff --git a/server/src/com/cloud/cluster/ClusterNodeLeftEventArgs.java b/framework/cluster/src/com/cloud/cluster/ClusterNodeLeftEventArgs.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterNodeLeftEventArgs.java rename to framework/cluster/src/com/cloud/cluster/ClusterNodeLeftEventArgs.java diff --git a/server/src/com/cloud/cluster/ClusterService.java b/framework/cluster/src/com/cloud/cluster/ClusterService.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterService.java rename to framework/cluster/src/com/cloud/cluster/ClusterService.java diff --git a/server/src/com/cloud/cluster/ClusterServiceAdapter.java b/framework/cluster/src/com/cloud/cluster/ClusterServiceAdapter.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterServiceAdapter.java rename to framework/cluster/src/com/cloud/cluster/ClusterServiceAdapter.java diff --git a/server/src/com/cloud/cluster/ClusterServicePdu.java b/framework/cluster/src/com/cloud/cluster/ClusterServicePdu.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterServicePdu.java rename to framework/cluster/src/com/cloud/cluster/ClusterServicePdu.java diff --git a/server/src/com/cloud/cluster/ClusterServiceRequestPdu.java b/framework/cluster/src/com/cloud/cluster/ClusterServiceRequestPdu.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterServiceRequestPdu.java rename to framework/cluster/src/com/cloud/cluster/ClusterServiceRequestPdu.java diff --git a/server/src/com/cloud/cluster/ClusterServiceServletAdapter.java b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java similarity index 86% rename from server/src/com/cloud/cluster/ClusterServiceServletAdapter.java rename to framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java index 04026d30168..13b466dd44c 100644 --- a/server/src/com/cloud/cluster/ClusterServiceServletAdapter.java +++ b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletAdapter.java @@ -31,9 +31,11 @@ import javax.naming.ConfigurationException; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import org.apache.cloudstack.config.ConfigDepot; +import org.apache.cloudstack.config.ConfigKey; +import org.apache.cloudstack.config.ConfigValue; + import com.cloud.cluster.dao.ManagementServerHostDao; -import com.cloud.configuration.Config; -import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.utils.NumbersUtil; import com.cloud.utils.PropertiesUtil; import com.cloud.utils.component.AdapterBase; @@ -49,14 +51,14 @@ public class ClusterServiceServletAdapter extends AdapterBase implements Cluster @Inject private ClusterManager _manager; @Inject private ManagementServerHostDao _mshostDao; - - @Inject private ConfigurationDao _configDao; + @Inject + protected ConfigDepot _configDepot; private ClusterServiceServletContainer _servletContainer; private int _clusterServicePort = DEFAULT_SERVICE_PORT; - private int _clusterRequestTimeoutSeconds = DEFAULT_REQUEST_TIMEOUT; + private ConfigValue _clusterRequestTimeoutSeconds; @Override public ClusterService getPeerService(String strPeer) throws RemoteException { @@ -71,7 +73,7 @@ public class ClusterServiceServletAdapter extends AdapterBase implements Cluster if(serviceUrl == null) return null; - return new ClusterServiceServletImpl(serviceUrl, _clusterRequestTimeoutSeconds); + return new ClusterServiceServletImpl(serviceUrl, _clusterRequestTimeoutSeconds); } @Override @@ -123,12 +125,14 @@ public class ClusterServiceServletAdapter extends AdapterBase implements Cluster return true; } + private final ConfigKey ClusterMessageTimeOut = new ConfigKey(Integer.class, "cluster.message.timeout.seconds", "Advance", ClusterManager.class, "300", + "Time (in seconds) to wait before a inter-management server message post times out.", true, "Seconds"); + private void init() throws ConfigurationException { if(_mshostDao != null) return; - String value = _configDao.getValue(Config.ClusterMessageTimeOutSeconds.key()); - _clusterRequestTimeoutSeconds = NumbersUtil.parseInt(value, DEFAULT_REQUEST_TIMEOUT); + _clusterRequestTimeoutSeconds = _configDepot.get(ClusterMessageTimeOut); s_logger.info("Configure cluster request time out. timeout: " + _clusterRequestTimeoutSeconds + " seconds"); File dbPropsFile = PropertiesUtil.findConfigFile("db.properties"); diff --git a/server/src/com/cloud/cluster/ClusterServiceServletContainer.java b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletContainer.java similarity index 100% rename from server/src/com/cloud/cluster/ClusterServiceServletContainer.java rename to framework/cluster/src/com/cloud/cluster/ClusterServiceServletContainer.java diff --git a/server/src/com/cloud/cluster/ClusterServiceServletHttpHandler.java b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletHttpHandler.java old mode 100755 new mode 100644 similarity index 100% rename from server/src/com/cloud/cluster/ClusterServiceServletHttpHandler.java rename to framework/cluster/src/com/cloud/cluster/ClusterServiceServletHttpHandler.java diff --git a/server/src/com/cloud/cluster/ClusterServiceServletImpl.java b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletImpl.java similarity index 91% rename from server/src/com/cloud/cluster/ClusterServiceServletImpl.java rename to framework/cluster/src/com/cloud/cluster/ClusterServiceServletImpl.java index 3270315785b..c3ed3fe590d 100644 --- a/server/src/com/cloud/cluster/ClusterServiceServletImpl.java +++ b/framework/cluster/src/com/cloud/cluster/ClusterServiceServletImpl.java @@ -27,23 +27,25 @@ import org.apache.commons.httpclient.methods.PostMethod; import org.apache.commons.httpclient.params.HttpClientParams; import org.apache.log4j.Logger; +import org.apache.cloudstack.config.ConfigValue; + public class ClusterServiceServletImpl implements ClusterService { private static final long serialVersionUID = 4574025200012566153L; private static final Logger s_logger = Logger.getLogger(ClusterServiceServletImpl.class); private String _serviceUrl; - private int _requestTimeoutSeconds; + private ConfigValue _requestTimeoutSeconds; protected static HttpClient s_client = null; public ClusterServiceServletImpl() { } - public ClusterServiceServletImpl(String serviceUrl, int requestTimeoutSeconds) { - s_logger.info("Setup cluster service servlet. service url: " + serviceUrl + ", request timeout: " + requestTimeoutSeconds + " seconds"); + public ClusterServiceServletImpl(String serviceUrl, ConfigValue requestTimeoutSeconds) { + s_logger.info("Setup cluster service servlet. service url: " + serviceUrl + ", request timeout: " + requestTimeoutSeconds.value() + " seconds"); - this._serviceUrl = serviceUrl; - this._requestTimeoutSeconds = requestTimeoutSeconds; + _serviceUrl = serviceUrl; + _requestTimeoutSeconds = requestTimeoutSeconds; } @Override @@ -125,7 +127,7 @@ public class ClusterServiceServletImpl implements ClusterService { s_client = new HttpClient(mgr); HttpClientParams clientParams = new HttpClientParams(); - clientParams.setSoTimeout(_requestTimeoutSeconds * 1000); + clientParams.setSoTimeout(_requestTimeoutSeconds.value() * 1000); s_client.setParams(clientParams); } @@ -141,6 +143,6 @@ public class ClusterServiceServletImpl implements ClusterService { System.out.println(result); } catch (RemoteException e) { } -*/ +*/ } } diff --git a/api/src/com/cloud/cluster/ManagementServerHost.java b/framework/cluster/src/com/cloud/cluster/ManagementServerHost.java similarity index 89% rename from api/src/com/cloud/cluster/ManagementServerHost.java rename to framework/cluster/src/com/cloud/cluster/ManagementServerHost.java index 9c88a2b2006..a5764fbb2e1 100644 --- a/api/src/com/cloud/cluster/ManagementServerHost.java +++ b/framework/cluster/src/com/cloud/cluster/ManagementServerHost.java @@ -16,9 +16,9 @@ // under the License. package com.cloud.cluster; -import org.apache.cloudstack.api.InternalIdentity; -public interface ManagementServerHost extends InternalIdentity { +public interface ManagementServerHost { + long getId(); public static enum State { Up, Starting, Down @@ -29,4 +29,6 @@ public interface ManagementServerHost extends InternalIdentity { State getState(); String getVersion(); + + String getServiceIP(); } diff --git a/engine/schema/src/com/cloud/cluster/ManagementServerHostPeerVO.java b/framework/cluster/src/com/cloud/cluster/ManagementServerHostPeerVO.java similarity index 94% rename from engine/schema/src/com/cloud/cluster/ManagementServerHostPeerVO.java rename to framework/cluster/src/com/cloud/cluster/ManagementServerHostPeerVO.java index e5e12ecb8bf..060dd0a824f 100644 --- a/engine/schema/src/com/cloud/cluster/ManagementServerHostPeerVO.java +++ b/framework/cluster/src/com/cloud/cluster/ManagementServerHostPeerVO.java @@ -30,11 +30,10 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import com.cloud.utils.DateUtil; -import org.apache.cloudstack.api.InternalIdentity; @Entity @Table(name="mshost_peer") -public class ManagementServerHostPeerVO implements InternalIdentity { +public class ManagementServerHostPeerVO { @Id @GeneratedValue(strategy=GenerationType.IDENTITY) @@ -67,7 +66,7 @@ public class ManagementServerHostPeerVO implements InternalIdentity { this.peerRunid = peerRunid; this.peerState = peerState; - this.lastUpdateTime = DateUtil.currentGMTTime(); + lastUpdateTime = DateUtil.currentGMTTime(); } public long getId() { diff --git a/engine/schema/src/com/cloud/cluster/ManagementServerHostVO.java b/framework/cluster/src/com/cloud/cluster/ManagementServerHostVO.java similarity index 96% rename from engine/schema/src/com/cloud/cluster/ManagementServerHostVO.java rename to framework/cluster/src/com/cloud/cluster/ManagementServerHostVO.java index 31642e4d0c5..966a8748750 100644 --- a/engine/schema/src/com/cloud/cluster/ManagementServerHostVO.java +++ b/framework/cluster/src/com/cloud/cluster/ManagementServerHostVO.java @@ -30,7 +30,6 @@ import javax.persistence.Temporal; import javax.persistence.TemporalType; import com.cloud.utils.db.GenericDao; -import org.apache.cloudstack.api.InternalIdentity; @Entity @Table(name="mshost") @@ -81,10 +80,11 @@ public class ManagementServerHostVO implements ManagementServerHost { this.runid = runid; this.serviceIP = serviceIP; this.servicePort = servicePort; - this.lastUpdateTime = updateTime; + lastUpdateTime = updateTime; } - public long getId() { + @Override + public long getId() { return id; } @@ -119,7 +119,7 @@ public class ManagementServerHostVO implements ManagementServerHost { @Override public ManagementServerHost.State getState() { - return this.state; + return state; } public void setState(ManagementServerHost.State state) { diff --git a/server/src/com/cloud/cluster/RemoteMethodConstants.java b/framework/cluster/src/com/cloud/cluster/RemoteMethodConstants.java similarity index 100% rename from server/src/com/cloud/cluster/RemoteMethodConstants.java rename to framework/cluster/src/com/cloud/cluster/RemoteMethodConstants.java diff --git a/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDao.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDao.java similarity index 100% rename from engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDao.java rename to framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDao.java diff --git a/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java similarity index 99% rename from engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java rename to framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java index 3866da1bed3..879c4ce3a27 100644 --- a/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java +++ b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostDaoImpl.java @@ -27,7 +27,6 @@ import java.util.TimeZone; import javax.ejb.Local; import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import com.cloud.cluster.ClusterInvalidSessionException; import com.cloud.cluster.ManagementServerHost; @@ -42,7 +41,6 @@ import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; -@Component @Local(value={ManagementServerHostDao.class}) public class ManagementServerHostDaoImpl extends GenericDaoBase implements ManagementServerHostDao { private static final Logger s_logger = Logger.getLogger(ManagementServerHostDaoImpl.class); diff --git a/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java similarity index 100% rename from engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java rename to framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDao.java diff --git a/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java similarity index 98% rename from engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java rename to framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java index 8ad02cdbeed..8ef2e82a943 100644 --- a/engine/schema/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java +++ b/framework/cluster/src/com/cloud/cluster/dao/ManagementServerHostPeerDaoImpl.java @@ -21,7 +21,6 @@ import java.util.List; import javax.ejb.Local; import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; import com.cloud.cluster.ManagementServerHost; import com.cloud.cluster.ManagementServerHostPeerVO; @@ -31,7 +30,6 @@ import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; import com.cloud.utils.db.Transaction; -@Component @Local(value={ManagementServerHostPeerDao.class}) public class ManagementServerHostPeerDaoImpl extends GenericDaoBase implements ManagementServerHostPeerDao { private static final Logger s_logger = Logger.getLogger(ManagementServerHostPeerDaoImpl.class); diff --git a/framework/pom.xml b/framework/pom.xml index ddcdcb0439a..12cb94649d3 100644 --- a/framework/pom.xml +++ b/framework/pom.xml @@ -34,5 +34,7 @@ rest events jobs + cluster + db diff --git a/server/pom.xml b/server/pom.xml index 4511804312f..484d603b0e2 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -33,6 +33,11 @@ cloud-core ${project.version} + + org.apache.cloudstack + cloud-framework-cluster + ${project.version} + javax.servlet servlet-api diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 4fdb3c6c83b..a399af3b1f9 100755 --- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -44,22 +44,30 @@ import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; import org.apache.log4j.Logger; -import org.springframework.context.annotation.Primary; -import org.springframework.stereotype.Component; + +import com.google.gson.Gson; + +import org.apache.cloudstack.config.ConfigDepot; +import org.apache.cloudstack.config.ConfigKey; +import org.apache.cloudstack.config.ConfigValue; +import org.apache.cloudstack.utils.identity.ManagementServerNode; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; import com.cloud.agent.api.CancelCommand; +import com.cloud.agent.api.ChangeAgentAnswer; import com.cloud.agent.api.ChangeAgentCommand; import com.cloud.agent.api.Command; -import com.cloud.agent.api.TransferAgentCommand; +import com.cloud.agent.api.PropagateResourceEventCommand; import com.cloud.agent.api.ScheduleHostScanTaskCommand; +import com.cloud.agent.api.TransferAgentCommand; import com.cloud.agent.transport.Request; import com.cloud.agent.transport.Request.Version; import com.cloud.agent.transport.Response; import com.cloud.api.ApiDBUtils; import com.cloud.cluster.ClusterManager; import com.cloud.cluster.ClusterManagerListener; +import com.cloud.cluster.ClusterServicePdu; import com.cloud.cluster.ClusteredAgentRebalanceService; import com.cloud.cluster.ManagementServerHost; import com.cloud.cluster.ManagementServerHostVO; @@ -68,7 +76,6 @@ import com.cloud.cluster.agentlb.HostTransferMapVO; import com.cloud.cluster.agentlb.HostTransferMapVO.HostTransferState; import com.cloud.cluster.agentlb.dao.HostTransferMapDao; import com.cloud.cluster.dao.ManagementServerHostDao; -import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.exception.AgentUnavailableException; import com.cloud.exception.OperationTimedoutException; @@ -76,10 +83,11 @@ import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.Status; import com.cloud.host.Status.Event; +import com.cloud.resource.ResourceState; import com.cloud.resource.ServerResource; import com.cloud.storage.resource.DummySecondaryStorageResource; import com.cloud.utils.DateUtil; -import com.cloud.utils.NumbersUtil; +import com.cloud.utils.Profiler; import com.cloud.utils.concurrency.NamedThreadFactory; import com.cloud.utils.db.SearchCriteria.Op; import com.cloud.utils.db.SearchCriteria2; @@ -98,10 +106,10 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust public final static long STARTUP_DELAY = 5000; public final static long SCAN_INTERVAL = 90000; // 90 seconds, it takes 60 sec for xenserver to fail login public final static int ACQUIRE_GLOBAL_LOCK_TIMEOUT_FOR_COOPERATION = 5; // 5 seconds - public long _loadSize = 100; - protected int _directAgentScanInterval = 90; // 90 seconds protected Set _agentToTransferIds = new HashSet(); + Gson _gson; + @Inject protected ClusterManager _clusterMgr = null; @@ -118,30 +126,46 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust @Inject protected List _lbPlanners; @Inject ConfigurationDao _configDao; + @Inject + ConfigDepot _configDepot; protected ClusteredAgentManagerImpl() { super(); } + protected final ConfigKey EnableLB = new ConfigKey(Boolean.class, "agent.lb.enabled", "Advanced", AgentManager.class, "false", + "Enable agent load balancing between management server nodes", true, "True/False"); + protected final ConfigKey ConnectedAgentThreshold = new ConfigKey(Double.class, "agent.load.threshold", "Advanced", AgentManager.class, "0.7", + "What percentage of the agents can be held by one management server before load balancing happens", true, "0-1"); + protected final ConfigKey LoadSize = new ConfigKey(Integer.class, "direct.agent.load.size", "Advanced", AgentManager.class, "16", + "How many agents to connect to in each round", true, ""); + protected final ConfigKey ScanInterval = new ConfigKey(Integer.class, "direct.agent.scan.interval", "Advanced", AgentManager.class, "90", + "Interval between scans to load agents", false, "Seconds"); + + + protected ConfigValue _agentLBEnabled; + protected ConfigValue _connectedAgentsThreshold; + protected ConfigValue _loadSize; + protected ConfigValue _directAgentScanInterval; + @Override public boolean configure(String name, Map xmlParams) throws ConfigurationException { _peers = new HashMap(7); _sslEngines = new HashMap(7); - _nodeId = _clusterMgr.getManagementNodeId(); + _nodeId = ManagementServerNode.getManagementServerId(); s_logger.info("Configuring ClusterAgentManagerImpl. management server node id(msid): " + _nodeId); - Map params = _configDao.getConfiguration(xmlParams); - String value = params.get(Config.DirectAgentLoadSize.key()); - _loadSize = NumbersUtil.parseInt(value, 16); - - value = params.get(Config.DirectAgentScanInterval.key()); - _directAgentScanInterval = NumbersUtil.parseInt(value, 90); // defaulted to 90 seconds + _loadSize = _configDepot.get(LoadSize); + _directAgentScanInterval = _configDepot.get(ScanInterval).setMultiplier(1000); + _agentLBEnabled = _configDepot.get(EnableLB); + _connectedAgentsThreshold = _configDepot.get(ConnectedAgentThreshold); ClusteredAgentAttache.initialize(this); _clusterMgr.registerListener(this); - + _clusterMgr.registerDispatcher(new ClusterDispatcher()); + return super.configure(name, xmlParams); } @@ -150,13 +174,13 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust if (!super.start()) { return false; } - _timer.schedule(new DirectAgentScanTimerTask(), STARTUP_DELAY, _directAgentScanInterval * 1000); + _timer.schedule(new DirectAgentScanTimerTask(), STARTUP_DELAY, _directAgentScanInterval.value()); if (s_logger.isDebugEnabled()) { - s_logger.debug("Scheduled direct agent scan task to run at an interval of " + _directAgentScanInterval + " seconds"); + s_logger.debug("Scheduled direct agent scan task to run at an interval of " + _directAgentScanInterval.value() + " seconds"); } // schedule transfer scan executor - if agent LB is enabled - if (_clusterMgr.isAgentRebalanceEnabled()) { + if (isAgentRebalanceEnabled()) { s_transferExecutor.scheduleAtFixedRate(getTransferScanTask(), 60000, ClusteredAgentRebalanceService.DEFAULT_TRANSFER_CHECK_INTERVAL, TimeUnit.MILLISECONDS); } @@ -182,7 +206,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust // for agents that are self-managed, threshold to be considered as disconnected after pingtimeout long cutSeconds = (System.currentTimeMillis() >> 10) - (_pingTimeout); - List hosts = _hostDao.findAndUpdateDirectAgentToLoad(cutSeconds, _loadSize, _nodeId); + List hosts = _hostDao.findAndUpdateDirectAgentToLoad(cutSeconds, _loadSize.value().longValue(), _nodeId); List appliances = _hostDao.findAndUpdateApplianceToLoad(cutSeconds, _nodeId); hosts.addAll(appliances); @@ -319,7 +343,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust AgentAttache attache = findAttache(hostId); if (attache != null) { //don't process disconnect if the host is being rebalanced - if (_clusterMgr.isAgentRebalanceEnabled()) { + if (isAgentRebalanceEnabled()) { HostTransferMapVO transferVO = _hostTransferDao.findById(hostId); if (transferVO != null) { if (transferVO.getFutureOwner() == _nodeId && transferVO.getState() == HostTransferState.TransferStarted) { @@ -351,7 +375,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust public boolean reconnect(final long hostId) { Boolean result; try { - result = _clusterMgr.propagateAgentEvent(hostId, Event.ShutdownRequested); + result = propagateAgentEvent(hostId, Event.ShutdownRequested); if (result != null) { return result; } @@ -366,7 +390,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust public void notifyNodesInCluster(AgentAttache attache) { s_logger.debug("Notifying other nodes of to disconnect"); Command[] cmds = new Command[] { new ChangeAgentCommand(attache.getId(), Event.AgentDisconnected) }; - _clusterMgr.broadcast(attache.getId(), cmds); + _clusterMgr.broadcast(attache.getId(), _gson.toJson(cmds)); } // notifies MS peers to schedule a host scan task immediately, triggered during addHost operation @@ -375,7 +399,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust s_logger.debug("Notifying other MS nodes to run host scan task"); } Command[] cmds = new Command[] { new ScheduleHostScanTaskCommand() }; - _clusterMgr.broadcast(0, cmds); + _clusterMgr.broadcast(0, _gson.toJson(cmds)); } protected static void logT(byte[] bytes, final String msg) { @@ -428,7 +452,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust } public String findPeer(long hostId) { - return _clusterMgr.getPeerName(hostId); + return getPeerName(hostId); } public SSLEngine getSSLEngine(String peerName) { @@ -468,7 +492,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust } } if (ch == null || ch == prevCh) { - ManagementServerHostVO ms = _clusterMgr.getPeer(peerName); + ManagementServerHost ms = _clusterMgr.getPeer(peerName); if (ms == null) { s_logger.info("Unable to find peer: " + peerName); return null; @@ -514,7 +538,7 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust } public SocketChannel connectToPeer(long hostId, SocketChannel prevCh) { - String peerName = _clusterMgr.getPeerName(hostId); + String peerName = getPeerName(hostId); if (peerName == null) { return null; } @@ -861,7 +885,9 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust s_logger.debug("Forwarding " + cmds[0].toString() + " to " + peer); } String peerName = Long.toString(peer); - Answer[] answers = _clusterMgr.execute(peerName, agentId, cmds, true); + String cmdStr = _gson.toJson(cmds); + String ansStr = _clusterMgr.execute(peerName, agentId, cmdStr, true); + Answer[] answers = _gson.fromJson(ansStr, Answer[].class); return answers; } catch (Exception e) { s_logger.warn("Caught exception while talking to " + currentOwnerId, e); @@ -869,6 +895,46 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust } } + public String getPeerName(long agentHostId) { + + HostVO host = _hostDao.findById(agentHostId); + if (host != null && host.getManagementServerId() != null) { + if (_clusterMgr.getSelfPeerName().equals(Long.toString(host.getManagementServerId()))) { + return null; + } + + return Long.toString(host.getManagementServerId()); + } + return null; + } + + + public Boolean propagateAgentEvent(long agentId, Event event) throws AgentUnavailableException { + final String msPeer = getPeerName(agentId); + if (msPeer == null) { + return null; + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Propagating agent change request event:" + event.toString() + " to agent:" + agentId); + } + Command[] cmds = new Command[1]; + cmds[0] = new ChangeAgentCommand(agentId, event); + + String ansStr = _clusterMgr.execute(msPeer, agentId, _gson.toJson(cmds), true); + if (ansStr == null) { + throw new AgentUnavailableException(agentId); + } + + Answer[] answers = _gson.fromJson(ansStr, Answer[].class); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Result for agent change is " + answers[0].getResult()); + } + + return answers[0].getResult(); + } + private Runnable getTransferScanTask() { return new Runnable() { @Override @@ -1143,4 +1209,227 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust } } + private String handleScheduleHostScanTaskCommand(ScheduleHostScanTaskCommand cmd) { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Intercepting resource manager command: " + _gson.toJson(cmd)); + } + + try { + scheduleHostScanTask(); + } catch (Exception e) { + // Scheduling host scan task in peer MS is a best effort operation during host add, regular host scan + // happens at fixed intervals anyways. So handling any exceptions that may be thrown + s_logger.warn("Exception happened while trying to schedule host scan task on mgmt server " + _clusterMgr.getSelfPeerName() + + ", ignoring as regular host scan happens at fixed interval anyways", e); + return null; + } + + Answer[] answers = new Answer[1]; + answers[0] = new Answer(cmd, true, null); + return _gson.toJson(answers); + } + + public Answer[] sendToAgent(Long hostId, Command[] cmds, boolean stopOnError) throws AgentUnavailableException, OperationTimedoutException { + Commands commands = new Commands(stopOnError ? OnError.Stop : OnError.Continue); + for (Command cmd : cmds) { + commands.addCommand(cmd); + } + return send(hostId, commands); + } + + public Boolean propagateResourceEvent(long agentId, ResourceState.Event event) throws AgentUnavailableException { + final String msPeer = getPeerName(agentId); + if (msPeer == null) { + return null; + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Propagating agent change request event:" + event.toString() + " to agent:" + agentId); + } + Command[] cmds = new Command[1]; + cmds[0] = new PropagateResourceEventCommand(agentId, event); + + String AnsStr = _clusterMgr.execute(msPeer, agentId, _gson.toJson(cmds), true); + if (AnsStr == null) { + throw new AgentUnavailableException(agentId); + } + + Answer[] answers = _gson.fromJson(AnsStr, Answer[].class); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Result for agent change is " + answers[0].getResult()); + } + + return answers[0].getResult(); + } + + public boolean executeResourceUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException { + return _resourceMgr.executeUserRequest(hostId, event); + } + + protected class ClusterDispatcher implements ClusterManager.Dispatcher { + @Override + public String getName() { + return "ClusterDispatcher"; + } + + @Override + public String dispatch(ClusterServicePdu pdu) { + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Dispatch ->" + pdu.getAgentId() + ", json: " + pdu.getJsonPackage()); + } + + Command[] cmds = null; + try { + cmds = _gson.fromJson(pdu.getJsonPackage(), Command[].class); + } catch (Throwable e) { + assert (false); + s_logger.error("Excection in gson decoding : ", e); + } + + if (cmds.length == 1 && cmds[0] instanceof ChangeAgentCommand) { //intercepted + ChangeAgentCommand cmd = (ChangeAgentCommand)cmds[0]; + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Intercepting command for agent change: agent " + cmd.getAgentId() + " event: " + cmd.getEvent()); + } + boolean result = false; + try { + result = executeAgentUserRequest(cmd.getAgentId(), cmd.getEvent()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Result is " + result); + } + + } catch (AgentUnavailableException e) { + s_logger.warn("Agent is unavailable", e); + return null; + } + + Answer[] answers = new Answer[1]; + answers[0] = new ChangeAgentAnswer(cmd, result); + return _gson.toJson(answers); + } else if (cmds.length == 1 && cmds[0] instanceof TransferAgentCommand) { + TransferAgentCommand cmd = (TransferAgentCommand)cmds[0]; + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Intercepting command for agent rebalancing: agent " + cmd.getAgentId() + " event: " + cmd.getEvent()); + } + boolean result = false; + try { + result = rebalanceAgent(cmd.getAgentId(), cmd.getEvent(), cmd.getCurrentOwner(), cmd.getFutureOwner()); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Result is " + result); + } + + } catch (AgentUnavailableException e) { + s_logger.warn("Agent is unavailable", e); + return null; + } catch (OperationTimedoutException e) { + s_logger.warn("Operation timed out", e); + return null; + } + Answer[] answers = new Answer[1]; + answers[0] = new Answer(cmd, result, null); + return _gson.toJson(answers); + } else if (cmds.length == 1 && cmds[0] instanceof PropagateResourceEventCommand) { + PropagateResourceEventCommand cmd = (PropagateResourceEventCommand)cmds[0]; + + s_logger.debug("Intercepting command to propagate event " + cmd.getEvent().name() + " for host " + cmd.getHostId()); + + boolean result = false; + try { + result = executeResourceUserRequest(cmd.getHostId(), cmd.getEvent()); + s_logger.debug("Result is " + result); + } catch (AgentUnavailableException ex) { + s_logger.warn("Agent is unavailable", ex); + return null; + } + + Answer[] answers = new Answer[1]; + answers[0] = new Answer(cmd, result, null); + return _gson.toJson(answers); + } else if (cmds.length == 1 && cmds[0] instanceof ScheduleHostScanTaskCommand) { + ScheduleHostScanTaskCommand cmd = (ScheduleHostScanTaskCommand)cmds[0]; + String response = handleScheduleHostScanTaskCommand(cmd); + return response; + } + + try { + long startTick = System.currentTimeMillis(); + if (s_logger.isDebugEnabled()) { + s_logger.debug("Dispatch -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage()); + } + + Answer[] answers = sendToAgent(pdu.getAgentId(), cmds, pdu.isStopOnError()); + if (answers != null) { + String jsonReturn = _gson.toJson(answers); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Completed dispatching -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage() + + " in " + (System.currentTimeMillis() - startTick) + " ms, return result: " + jsonReturn); + } + + return jsonReturn; + } else { + if (s_logger.isDebugEnabled()) { + s_logger.debug("Completed dispatching -> " + pdu.getAgentId() + ", json: " + pdu.getJsonPackage() + + " in " + (System.currentTimeMillis() - startTick) + " ms, return null result"); + } + } + } catch (AgentUnavailableException e) { + s_logger.warn("Agent is unavailable", e); + } catch (OperationTimedoutException e) { + s_logger.warn("Timed Out", e); + } + + return null; + } + + } + + public boolean executeAgentUserRequest(long agentId, Event event) throws AgentUnavailableException { + return executeUserRequest(agentId, event); + } + + public boolean rebalanceAgent(long agentId, Event event, long currentOwnerId, long futureOwnerId) throws AgentUnavailableException, OperationTimedoutException { + return _rebalanceService.executeRebalanceRequest(agentId, currentOwnerId, futureOwnerId, event); + } + + public boolean isAgentRebalanceEnabled() { + return _agentLBEnabled.value(); + } + + @Inject + private ClusteredAgentRebalanceService _rebalanceService; + + boolean _agentLbHappened = false; + public void agentrebalance() { + Profiler profilerAgentLB = new Profiler(); + profilerAgentLB.start(); + //initiate agent lb task will be scheduled and executed only once, and only when number of agents loaded exceeds _connectedAgentsThreshold + if (_agentLBEnabled.value() && !_agentLbHappened) { + SearchCriteriaService sc = SearchCriteria2.create(HostVO.class); + sc.addAnd(sc.getEntity().getManagementServerId(), Op.NNULL); + sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing); + List allManagedRoutingAgents = sc.list(); + + sc = SearchCriteria2.create(HostVO.class); + sc.addAnd(sc.getEntity().getType(), Op.EQ, Host.Type.Routing); + List allAgents = sc.list(); + double allHostsCount = allAgents.size(); + double managedHostsCount = allManagedRoutingAgents.size(); + if (allHostsCount > 0.0) { + double load = managedHostsCount / allHostsCount; + if (load >= _connectedAgentsThreshold.value()) { + s_logger.debug("Scheduling agent rebalancing task as the average agent load " + load + " is more than the threshold " + _connectedAgentsThreshold); + _rebalanceService.scheduleRebalanceAgents(); + _agentLbHappened = true; + } else { + s_logger.trace("Not scheduling agent rebalancing task as the averages load " + load + " is less than the threshold " + _connectedAgentsThreshold); + } + } + } + profilerAgentLB.stop(); + } } diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java index f5c6904c9a8..f388d36e439 100644 --- a/server/src/com/cloud/async/AsyncJobManagerImpl.java +++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java @@ -53,6 +53,7 @@ import org.apache.cloudstack.api.response.ExceptionResponse; import org.apache.cloudstack.context.CallContext; import org.apache.cloudstack.framework.events.EventBus; import org.apache.cloudstack.framework.events.EventBusException; +import org.apache.cloudstack.utils.identity.ManagementServerNode; import com.cloud.api.ApiDBUtils; import com.cloud.api.ApiDispatcher; @@ -87,7 +88,6 @@ import com.cloud.utils.db.Transaction; import com.cloud.utils.exception.CloudRuntimeException; import com.cloud.utils.exception.ExceptionUtil; import com.cloud.utils.mgmt.JmxUtil; -import com.cloud.utils.net.MacAddress; @Component @Local(value={AsyncJobManager.class}) @@ -773,11 +773,7 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, } private long getMsid() { - if(_clusterMgr != null) { - return _clusterMgr.getManagementNodeId(); - } - - return MacAddress.getMacAddress().toLong(); + return ManagementServerNode.getManagementServerId(); } private void cleanupPendingJobs(List l) { diff --git a/server/src/com/cloud/cluster/ClusterManager.java b/server/src/com/cloud/cluster/ClusterManager.java deleted file mode 100755 index 017ba311a66..00000000000 --- a/server/src/com/cloud/cluster/ClusterManager.java +++ /dev/null @@ -1,67 +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 com.cloud.cluster; - -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; -import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.OperationTimedoutException; -import com.cloud.host.Status.Event; -import com.cloud.resource.ResourceState; -import com.cloud.utils.component.Manager; - -public interface ClusterManager extends Manager { - public static final int DEFAULT_HEARTBEAT_INTERVAL = 1500; - public static final int DEFAULT_HEARTBEAT_THRESHOLD = 150000; - public static final String ALERT_SUBJECT = "cluster-alert"; - - public void OnReceiveClusterServicePdu(ClusterServicePdu pdu); - public void executeAsync(String strPeer, long agentId, Command [] cmds, boolean stopOnError); - public Answer[] execute(String strPeer, long agentId, Command [] cmds, boolean stopOnError); - - public Answer[] sendToAgent(Long hostId, Command [] cmds, boolean stopOnError) throws AgentUnavailableException, OperationTimedoutException; - public boolean executeAgentUserRequest(long agentId, Event event) throws AgentUnavailableException; - public Boolean propagateAgentEvent(long agentId, Event event) throws AgentUnavailableException; - public Boolean propagateResourceEvent(long agentId, ResourceState.Event event) throws AgentUnavailableException; - public boolean executeResourceUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException; - - public int getHeartbeatThreshold(); - - public long getManagementNodeId(); // msid of current management server node - public boolean isManagementNodeAlive(long msid); - public boolean pingManagementNode(long msid); - public long getCurrentRunId(); - - public String getSelfPeerName(); - public String getSelfNodeIP(); - public String getPeerName(long agentHostId); - - public void registerListener(ClusterManagerListener listener); - public void unregisterListener(ClusterManagerListener listener); - public ManagementServerHostVO getPeer(String peerName); - - /** - * Broadcast the command to all of the management server nodes. - * @param agentId agent id this broadcast is regarding - * @param cmds commands to broadcast - */ - public void broadcast(long agentId, Command[] cmds); - - boolean rebalanceAgent(long agentId, Event event, long currentOwnerId, long futureOwnerId) throws AgentUnavailableException, OperationTimedoutException; - - boolean isAgentRebalanceEnabled(); -} diff --git a/server/src/com/cloud/cluster/DummyClusterManagerImpl.java b/server/src/com/cloud/cluster/DummyClusterManagerImpl.java deleted file mode 100755 index 12972b9804f..00000000000 --- a/server/src/com/cloud/cluster/DummyClusterManagerImpl.java +++ /dev/null @@ -1,179 +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 com.cloud.cluster; - -import java.util.Map; - -import javax.ejb.Local; -import javax.naming.ConfigurationException; - -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - -import com.cloud.agent.api.Answer; -import com.cloud.agent.api.Command; -import com.cloud.exception.AgentUnavailableException; -import com.cloud.exception.OperationTimedoutException; -import com.cloud.host.Status.Event; -import com.cloud.utils.component.ManagerBase; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.MacAddress; - -@Local(value={ClusterManager.class}) -public class DummyClusterManagerImpl extends ManagerBase implements ClusterManager { - private static final Logger s_logger = Logger.getLogger(DummyClusterManagerImpl.class); - - protected long _id = MacAddress.getMacAddress().toLong(); - protected long _runId = System.currentTimeMillis(); - - private final String _clusterNodeIP = "127.0.0.1"; - - @Override - public void OnReceiveClusterServicePdu(ClusterServicePdu pdu) { - throw new CloudRuntimeException("Unsupported feature"); - } - - @Override - public void executeAsync(String strPeer, long agentId, Command [] cmds, boolean stopOnError) { - throw new CloudRuntimeException("Unsupported feature"); - } - - @Override - public Answer[] execute(String strPeer, long agentId, Command [] cmds, boolean stopOnError) { - throw new CloudRuntimeException("Unsupported feature"); - } - - @Override - public Answer[] sendToAgent(Long hostId, Command [] cmds, boolean stopOnError) - throws AgentUnavailableException, OperationTimedoutException { - throw new CloudRuntimeException("Unsupported feature"); - } - -/* - @Override - public long sendToAgent(Long hostId, Command[] cmds, boolean stopOnError, Listener listener) throws AgentUnavailableException { - throw new CloudRuntimeException("Unsupported feature"); - } -*/ - @Override - public boolean executeAgentUserRequest(long agentId, Event event) throws AgentUnavailableException { - throw new CloudRuntimeException("Unsupported feature"); - } - - @Override - public Boolean propagateAgentEvent(long agentId, Event event) throws AgentUnavailableException { - throw new CloudRuntimeException("Unsupported feature"); - } - - @Override - public int getHeartbeatThreshold() { - return ClusterManager.DEFAULT_HEARTBEAT_INTERVAL; - } - - @Override - public long getManagementNodeId() { - return _id; - } - - @Override - public long getCurrentRunId() { - return _runId; - } - - @Override - public ManagementServerHostVO getPeer(String str) { - return null; - } - - @Override - public String getSelfPeerName() { - return Long.toString(_id); - } - - @Override - public String getSelfNodeIP() { - return _clusterNodeIP; - } - - @Override - public boolean isManagementNodeAlive(long msid) { - return true; - } - - @Override - public boolean pingManagementNode(long msid) { - return false; - } - - @Override - public String getPeerName(long agentHostId) { - throw new CloudRuntimeException("Unsupported feature"); - } - - @Override - public void registerListener(ClusterManagerListener listener) { - } - - @Override - public void unregisterListener(ClusterManagerListener listener) { - } - - @Override - public boolean configure(String name, Map params) - throws ConfigurationException { - return true; - } - - @Override - public void broadcast(long hostId, Command[] cmds) { - } - - @Override - public boolean start() { - if(s_logger.isInfoEnabled()) - s_logger.info("Starting cluster manager, msid : " + _id); - - return true; - } - - @Override - public boolean stop() { - return true; - } - - @Override - public boolean rebalanceAgent(long agentId, Event event, long currentOwnerId, long futureOwnerId) throws AgentUnavailableException, OperationTimedoutException { - return false; - } - - @Override - public boolean isAgentRebalanceEnabled() { - return false; - } - - @Override - public Boolean propagateResourceEvent(long agentId, com.cloud.resource.ResourceState.Event event) throws AgentUnavailableException { - // TODO Auto-generated method stub - return null; - } - - @Override - public boolean executeResourceUserRequest(long hostId, com.cloud.resource.ResourceState.Event event) throws AgentUnavailableException { - // TODO Auto-generated method stub - return false; - } -} diff --git a/server/src/com/cloud/cluster/LockMasterListener.java b/server/src/com/cloud/server/LockMasterListener.java similarity index 92% rename from server/src/com/cloud/cluster/LockMasterListener.java rename to server/src/com/cloud/server/LockMasterListener.java index cc10e2c9967..ee9c9a9d50c 100644 --- a/server/src/com/cloud/cluster/LockMasterListener.java +++ b/server/src/com/cloud/server/LockMasterListener.java @@ -14,10 +14,12 @@ // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. -package com.cloud.cluster; +package com.cloud.server; import java.util.List; +import com.cloud.cluster.ClusterManagerListener; +import com.cloud.cluster.ManagementServerHostVO; import com.cloud.utils.db.Merovingian2; /** diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 77c77e118fb..d96536ec5ab 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -427,6 +427,7 @@ import org.apache.cloudstack.engine.subsystem.api.storage.StoragePoolAllocator; import org.apache.cloudstack.engine.subsystem.api.storage.VolumeDataFactory; import org.apache.cloudstack.storage.datastore.db.PrimaryDataStoreDao; import org.apache.cloudstack.storage.datastore.db.StoragePoolVO; +import org.apache.cloudstack.utils.identity.ManagementServerNode; import com.cloud.agent.AgentManager; import com.cloud.agent.api.GetVncPortAnswer; @@ -825,6 +826,8 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe public boolean start() { s_logger.info("Startup CloudStack management server..."); + _clusterMgr.registerListener(new LockMasterListener(ManagementServerNode.getManagementServerId())); + enableAdminUser("password"); return true; } From 1caa566280898b8ca7bdff4881d8efef721b6d58 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 25 Jul 2013 19:00:03 -0700 Subject: [PATCH 035/907] created a project for db framework --- framework/db/pom.xml | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 framework/db/pom.xml diff --git a/framework/db/pom.xml b/framework/db/pom.xml new file mode 100644 index 00000000000..b4011c7b7ea --- /dev/null +++ b/framework/db/pom.xml @@ -0,0 +1,28 @@ + + + 4.0.0 + cloud-framework-db + Apache CloudStack Framework - Event Notification + + org.apache.cloudstack + cloudstack-framework + 4.2.0-SNAPSHOT + ../pom.xml + + + + org.apache.cloudstack + cloud-utils + ${project.version} + + + From 111febc567f6a672de5f635432336872f93b256c Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 25 Jul 2013 19:57:45 -0700 Subject: [PATCH 036/907] Fixed up the rest of the management server code that calls clustermanager --- .../com/cloud/hypervisor/guru/VMwareGuru.java | 4 +- .../vmware/manager/VmwareManagerImpl.java | 19 +++--- .../manager/ClusteredAgentManagerImpl.java | 28 +-------- .../com/cloud/async/AsyncJobManagerImpl.java | 2 - .../consoleproxy/ConsoleProxyManagerImpl.java | 4 +- .../cloud/resource/ResourceManagerImpl.java | 60 ++++++++++++++++--- .../cloud/server/ManagementServerImpl.java | 18 ------ 7 files changed, 69 insertions(+), 66 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java index f2cfbf7b938..c5897139c1e 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/guru/VMwareGuru.java @@ -28,7 +28,6 @@ import java.util.UUID; import javax.ejb.Local; import javax.inject.Inject; -import com.cloud.host.Host; import org.apache.log4j.Logger; import org.apache.cloudstack.storage.command.CopyCommand; @@ -48,10 +47,10 @@ import com.cloud.agent.api.to.DataStoreTO; import com.cloud.agent.api.to.DataTO; import com.cloud.agent.api.to.NicTO; import com.cloud.agent.api.to.VirtualMachineTO; -import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.exception.InsufficientAddressCapacityException; +import com.cloud.host.Host; import com.cloud.host.HostVO; import com.cloud.host.dao.HostDao; import com.cloud.host.dao.HostDetailsDao; @@ -100,7 +99,6 @@ public class VMwareGuru extends HypervisorGuruBase implements HypervisorGuru { @Inject HostDao _hostDao; @Inject HostDetailsDao _hostDetailsDao; @Inject CommandExecLogDao _cmdExecLogDao; - @Inject ClusterManager _clusterMgr; @Inject VmwareManager _vmwareMgr; @Inject SecondaryStorageVmManager _secStorageMgr; @Inject NetworkModel _networkMgr; diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 0c7ce2e7556..07e0fc0ee3f 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -43,6 +43,13 @@ import com.vmware.vim25.AboutInfo; import com.vmware.vim25.HostConnectSpec; import com.vmware.vim25.ManagedObjectReference; +import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd; +import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcsCmd; +import org.apache.cloudstack.api.command.admin.zone.RemoveVmwareDcCmd; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; +import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; +import org.apache.cloudstack.utils.identity.ManagementServerNode; + import com.cloud.agent.AgentManager; import com.cloud.agent.Listener; import com.cloud.agent.api.AgentControlAnswer; @@ -51,7 +58,6 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.Command; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupRoutingCommand; -import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.ClusterDetailsDao; @@ -116,12 +122,6 @@ import com.cloud.utils.script.Script; import com.cloud.utils.ssh.SshHelper; import com.cloud.vm.DomainRouterVO; -import org.apache.cloudstack.api.command.admin.zone.AddVmwareDcCmd; -import org.apache.cloudstack.api.command.admin.zone.ListVmwareDcsCmd; -import org.apache.cloudstack.api.command.admin.zone.RemoveVmwareDcCmd; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStore; -import org.apache.cloudstack.engine.subsystem.api.storage.DataStoreManager; - @Local(value = {VmwareManager.class, VmwareDatacenterService.class}) public class VmwareManagerImpl extends ManagerBase implements VmwareManager, VmwareStorageMount, Listener, VmwareDatacenterService { @@ -142,7 +142,6 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw @Inject ClusterDao _clusterDao; @Inject ClusterDetailsDao _clusterDetailsDao; @Inject CommandExecLogDao _cmdExecLogDao; - @Inject ClusterManager _clusterMgr; @Inject SecondaryStorageVmManager _ssvmMgr; @Inject DataStoreManager _dataStoreMgr; @Inject CiscoNexusVSMDeviceDao _nexusDao; @@ -664,7 +663,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private String setupMountPoint(String parent) { String mountPoint = null; - long mshostId = _clusterMgr.getManagementNodeId(); + long mshostId = ManagementServerNode.getManagementServerId(); for (int i = 0; i < 10; i++) { String mntPt = parent + File.separator + String.valueOf(mshostId) + "." + Integer.toHexString(_rand.nextInt(Integer.MAX_VALUE)); File file = new File(mntPt); @@ -683,7 +682,7 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw private void startupCleanup(String parent) { s_logger.info("Cleanup mounted NFS mount points used in previous session"); - long mshostId = _clusterMgr.getManagementNodeId(); + long mshostId = ManagementServerNode.getManagementServerId(); // cleanup left-over NFS mounts from previous session String[] mounts = _storage.listFiles(parent + File.separator + String.valueOf(mshostId) + ".*"); diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index a399af3b1f9..4622885925b 100755 --- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -85,6 +85,7 @@ import com.cloud.host.Status; import com.cloud.host.Status.Event; import com.cloud.resource.ResourceState; import com.cloud.resource.ServerResource; +import com.cloud.serializer.GsonHelper; import com.cloud.storage.resource.DummySecondaryStorageResource; import com.cloud.utils.DateUtil; import com.cloud.utils.Profiler; @@ -166,6 +167,8 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust _clusterMgr.registerListener(this); _clusterMgr.registerDispatcher(new ClusterDispatcher()); + _gson = GsonHelper.getGson(); + return super.configure(name, xmlParams); } @@ -1237,31 +1240,6 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust return send(hostId, commands); } - public Boolean propagateResourceEvent(long agentId, ResourceState.Event event) throws AgentUnavailableException { - final String msPeer = getPeerName(agentId); - if (msPeer == null) { - return null; - } - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Propagating agent change request event:" + event.toString() + " to agent:" + agentId); - } - Command[] cmds = new Command[1]; - cmds[0] = new PropagateResourceEventCommand(agentId, event); - - String AnsStr = _clusterMgr.execute(msPeer, agentId, _gson.toJson(cmds), true); - if (AnsStr == null) { - throw new AgentUnavailableException(agentId); - } - - Answer[] answers = _gson.fromJson(AnsStr, Answer[].class); - - if (s_logger.isDebugEnabled()) { - s_logger.debug("Result for agent change is " + answers[0].getResult()); - } - - return answers[0].getResult(); - } public boolean executeResourceUserRequest(long hostId, ResourceState.Event event) throws AgentUnavailableException { return _resourceMgr.executeUserRequest(hostId, event); diff --git a/server/src/com/cloud/async/AsyncJobManagerImpl.java b/server/src/com/cloud/async/AsyncJobManagerImpl.java index f388d36e439..faf3e719b6e 100644 --- a/server/src/com/cloud/async/AsyncJobManagerImpl.java +++ b/server/src/com/cloud/async/AsyncJobManagerImpl.java @@ -60,7 +60,6 @@ import com.cloud.api.ApiDispatcher; import com.cloud.api.ApiGsonHelper; import com.cloud.api.ApiSerializerHelper; import com.cloud.async.dao.AsyncJobDao; -import com.cloud.cluster.ClusterManager; import com.cloud.cluster.ClusterManagerListener; import com.cloud.cluster.ManagementServerHostVO; import com.cloud.configuration.Config; @@ -101,7 +100,6 @@ public class AsyncJobManagerImpl extends ManagerBase implements AsyncJobManager, @Inject private AsyncJobExecutorContext _context; @Inject private SyncQueueManager _queueMgr; - @Inject private ClusterManager _clusterMgr; @Inject private AccountManager _accountMgr; @Inject private AccountDao _accountDao; @Inject private AsyncJobDao _jobDao; diff --git a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java index 4cb4a3332a3..bae2405ee23 100755 --- a/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java +++ b/server/src/com/cloud/consoleproxy/ConsoleProxyManagerImpl.java @@ -221,6 +221,8 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy IPAddressDao _ipAddressDao; @Inject ManagementServer _ms; + @Inject + ClusterManager _clusterMgr; private ConsoleProxyListener _listener; @@ -981,7 +983,7 @@ public class ConsoleProxyManagerImpl extends ManagerBase implements ConsoleProxy private synchronized Map getZoneHostInfo() { Date cutTime = DateUtil.currentGMTTime(); - List l = _hostDao.getRunningHostCounts(new Date(cutTime.getTime() - ClusterManager.DEFAULT_HEARTBEAT_THRESHOLD)); + List l = _hostDao.getRunningHostCounts(new Date(cutTime.getTime() - _clusterMgr.getHeartbeatThreshold())); RunningHostInfoAgregator aggregator = new RunningHostInfoAgregator(); if (l.size() > 0) { diff --git a/server/src/com/cloud/resource/ResourceManagerImpl.java b/server/src/com/cloud/resource/ResourceManagerImpl.java index cb0e63331c2..b96805c50f6 100755 --- a/server/src/com/cloud/resource/ResourceManagerImpl.java +++ b/server/src/com/cloud/resource/ResourceManagerImpl.java @@ -30,10 +30,11 @@ import javax.ejb.Local; import javax.inject.Inject; import javax.naming.ConfigurationException; -import com.cloud.server.ConfigurationServer; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; +import com.google.gson.Gson; + import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.command.admin.cluster.AddClusterCmd; import org.apache.cloudstack.api.command.admin.cluster.DeleteClusterCmd; @@ -53,10 +54,12 @@ import org.apache.cloudstack.utils.identity.ManagementServerNode; import com.cloud.agent.AgentManager; import com.cloud.agent.AgentManager.TapAgentsAction; import com.cloud.agent.api.Answer; +import com.cloud.agent.api.Command; import com.cloud.agent.api.GetHostStatsAnswer; import com.cloud.agent.api.GetHostStatsCommand; import com.cloud.agent.api.MaintainAnswer; import com.cloud.agent.api.MaintainCommand; +import com.cloud.agent.api.PropagateResourceEventCommand; import com.cloud.agent.api.StartupCommand; import com.cloud.agent.api.StartupRoutingCommand; import com.cloud.agent.api.UnsupportedAnswer; @@ -119,6 +122,7 @@ import com.cloud.org.Cluster; import com.cloud.org.Grouping; import com.cloud.org.Grouping.AllocationState; import com.cloud.org.Managed; +import com.cloud.serializer.GsonHelper; import com.cloud.service.ServiceOfferingVO; import com.cloud.storage.GuestOSCategoryVO; import com.cloud.storage.StorageManager; @@ -165,6 +169,8 @@ import com.cloud.vm.dao.VMInstanceDao; public class ResourceManagerImpl extends ManagerBase implements ResourceManager, ResourceService, Manager { private static final Logger s_logger = Logger.getLogger(ResourceManagerImpl.class); + Gson _gson; + @Inject AccountManager _accountMgr; @Inject @@ -908,7 +914,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public boolean deleteHost(long hostId, boolean isForced, boolean isForceDeleteStorage) { try { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.DeleteHost); + Boolean result = propagateResourceEvent(hostId, ResourceState.Event.DeleteHost); if (result != null) { return result; } @@ -1222,7 +1228,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public boolean maintain(final long hostId) throws AgentUnavailableException { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.AdminAskMaintenace); + Boolean result = propagateResourceEvent(hostId, ResourceState.Event.AdminAskMaintenace); if (result != null) { return result; } @@ -1329,6 +1335,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public boolean configure(String name, Map params) throws ConfigurationException { _defaultSystemVMHypervisor = HypervisorType.getType(_configDao.getValue(Config.SystemVMDefaultHypervisor.toString())); + _gson = GsonHelper.getGson(); return true; } @@ -2138,7 +2145,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, private boolean cancelMaintenance(long hostId) { try { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.AdminCancelMaintenance); + Boolean result = propagateResourceEvent(hostId, ResourceState.Event.AdminCancelMaintenance); if (result != null) { return result; @@ -2186,7 +2193,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, @Override public boolean umanageHost(long hostId) { try { - Boolean result = _clusterMgr.propagateResourceEvent(hostId, ResourceState.Event.Unmanaged); + Boolean result = propagateResourceEvent(hostId, ResourceState.Event.Unmanaged); if (result != null) { return result; @@ -2218,7 +2225,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, if (cmd.getClusterId() == null) { // update agent attache password try { - Boolean result = _clusterMgr.propagateResourceEvent(cmd.getHostId(), ResourceState.Event.UpdatePassword); + Boolean result = propagateResourceEvent(cmd.getHostId(), ResourceState.Event.UpdatePassword); if (result != null) { return result; } @@ -2235,7 +2242,7 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, * FIXME: this is a buggy logic, check with alex. Shouldn't * return if propagation return non null */ - Boolean result = _clusterMgr.propagateResourceEvent(h.getId(), ResourceState.Event.UpdatePassword); + Boolean result = propagateResourceEvent(h.getId(), ResourceState.Event.UpdatePassword); if (result != null) { return result; } @@ -2249,6 +2256,45 @@ public class ResourceManagerImpl extends ManagerBase implements ResourceManager, } } + public String getPeerName(long agentHostId) { + + HostVO host = _hostDao.findById(agentHostId); + if (host != null && host.getManagementServerId() != null) { + if (_clusterMgr.getSelfPeerName().equals(Long.toString(host.getManagementServerId()))) { + return null; + } + + return Long.toString(host.getManagementServerId()); + } + return null; + } + + public Boolean propagateResourceEvent(long agentId, ResourceState.Event event) throws AgentUnavailableException { + final String msPeer = getPeerName(agentId); + if (msPeer == null) { + return null; + } + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Propagating agent change request event:" + event.toString() + " to agent:" + agentId); + } + Command[] cmds = new Command[1]; + cmds[0] = new PropagateResourceEventCommand(agentId, event); + + String AnsStr = _clusterMgr.execute(msPeer, agentId, _gson.toJson(cmds), true); + if (AnsStr == null) { + throw new AgentUnavailableException(agentId); + } + + Answer[] answers = _gson.fromJson(AnsStr, Answer[].class); + + if (s_logger.isDebugEnabled()) { + s_logger.debug("Result for agent change is " + answers[0].getResult()); + } + + return answers[0].getResult(); + } + @Override public boolean maintenanceFailed(long hostId) { HostVO host = _hostDao.findById(hostId); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index d96536ec5ab..0bdb114bc4d 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -438,14 +438,12 @@ import com.cloud.alert.AlertManager; import com.cloud.alert.AlertVO; import com.cloud.alert.dao.AlertDao; import com.cloud.api.ApiDBUtils; -import com.cloud.async.AsyncJobManager; import com.cloud.capacity.Capacity; import com.cloud.capacity.CapacityVO; import com.cloud.capacity.dao.CapacityDao; import com.cloud.capacity.dao.CapacityDaoImpl.SummedCapacity; import com.cloud.cluster.ClusterManager; import com.cloud.configuration.Config; -import com.cloud.configuration.ConfigurationManager; import com.cloud.configuration.ConfigurationVO; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.consoleproxy.ConsoleProxyManagementState; @@ -513,7 +511,6 @@ import com.cloud.projects.ProjectManager; import com.cloud.resource.ResourceManager; import com.cloud.server.ResourceTag.TaggedResourceType; import com.cloud.server.auth.UserAuthenticator; -import com.cloud.service.dao.ServiceOfferingDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOS; import com.cloud.storage.GuestOSCategoryVO; @@ -530,13 +527,11 @@ 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.UploadDao; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; import com.cloud.storage.s3.S3Manager; import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.storage.snapshot.SnapshotManager; -import com.cloud.storage.upload.UploadMonitor; import com.cloud.tags.ResourceTagVO; import com.cloud.tags.dao.ResourceTagDao; import com.cloud.template.TemplateManager; @@ -584,7 +579,6 @@ import com.cloud.vm.VirtualMachineManager; import com.cloud.vm.VirtualMachineProfile; import com.cloud.vm.VirtualMachineProfileImpl; import com.cloud.vm.dao.ConsoleProxyDao; -import com.cloud.vm.dao.DomainRouterDao; import com.cloud.vm.dao.InstanceGroupDao; import com.cloud.vm.dao.SecondaryStorageVmDao; import com.cloud.vm.dao.UserVmDao; @@ -606,8 +600,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Inject private IPAddressDao _publicIpAddressDao; @Inject - private DomainRouterDao _routerDao; - @Inject private ConsoleProxyDao _consoleProxyDao; @Inject private ClusterDao _clusterDao; @@ -638,8 +630,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Inject private SecondaryStorageVmManager _secStorageVmMgr; @Inject - private ServiceOfferingDao _offeringsDao; - @Inject private DiskOfferingDao _diskOfferingDao; @Inject private VMTemplateDao _templateDao; @@ -671,17 +661,11 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe private VMInstanceDao _vmInstanceDao; @Inject private VolumeDao _volumeDao; - @Inject - private AsyncJobManager _asyncMgr; private int _purgeDelay; private int _alertPurgeDelay; @Inject private InstanceGroupDao _vmGroupDao; @Inject - private UploadMonitor _uploadMonitor; - @Inject - private UploadDao _uploadDao; - @Inject private SSHKeyPairDao _sshKeyPairDao; @Inject private LoadBalancerDao _loadbalancerDao; @@ -691,8 +675,6 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Inject private List _storagePoolAllocators; @Inject - private ConfigurationManager _configMgr; - @Inject private ResourceTagDao _resourceTagDao; @Inject From 2dc3ede0a82ceb96991aa7171c426e93c479f3b3 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Thu, 25 Jul 2013 20:29:13 -0700 Subject: [PATCH 037/907] Remove a line to make it compile --- client/tomcatconf/commands.properties.in | 2 +- .../src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java | 1 - 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 5451ed83190..f6d918210e8 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -252,7 +252,7 @@ listImageStores=1 deleteImageStore=1 createCacheStore=1 listCacheStores=1 -deleteCacheStore=1 +#deleteCacheStore=1 #### host commands addHost=3 diff --git a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java index 4622885925b..a9a6b4a3152 100755 --- a/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java +++ b/server/src/com/cloud/agent/manager/ClusteredAgentManagerImpl.java @@ -1378,7 +1378,6 @@ public class ClusteredAgentManagerImpl extends AgentManagerImpl implements Clust return _agentLBEnabled.value(); } - @Inject private ClusteredAgentRebalanceService _rebalanceService; boolean _agentLbHappened = false; From 5077ed7e8bd0058b900caae73fe838bf73481905 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Thu, 25 Jul 2013 20:23:19 -0700 Subject: [PATCH 038/907] Automation: Fix test_redundant_router.py 1. Many state check need to wait for while for status to update 2. BACKUP router would still have eth2 and IP, but it's not enabled. Fix the case. --- .../component/test_redundant_router.py | 61 ++++++++++++------- 1 file changed, 39 insertions(+), 22 deletions(-) diff --git a/test/integration/component/test_redundant_router.py b/test/integration/component/test_redundant_router.py index b72a588f618..74668191e51 100644 --- a/test/integration/component/test_redundant_router.py +++ b/test/integration/component/test_redundant_router.py @@ -369,6 +369,9 @@ class TestCreateRvRNetwork(cloudstackTestCase): ) self.debug("Deployed VM in network: %s" % network.id) + # wait for VR to update state + time.sleep(self.services["sleep"]) + self.debug("Listing routers for network: %s" % network.name) routers = Router.list( self.apiclient, @@ -581,6 +584,9 @@ class TestCreateRvRNetworkNonDefaultGuestCidr(cloudstackTestCase): ) self.debug("Deployed VM in network: %s" % network.id) + # wait for VR to update state + time.sleep(self.services["sleep"]) + self.debug("Listing routers for network: %s" % network.name) routers = Router.list( self.apiclient, @@ -785,6 +791,9 @@ class TestRVRInternals(cloudstackTestCase): ) self.debug("Deployed VM in network: %s" % network.id) + # wait for VR to update state + time.sleep(self.services["sleep"]) + self.debug("Listing routers for network: %s" % network.name) routers = Router.list( self.apiclient, @@ -848,7 +857,7 @@ class TestRVRInternals(cloudstackTestCase): self.apiclient.connection.user, self.apiclient.connection.passwd, master_router.linklocalip, - 'ifconfig eth2', + 'ip addr show eth2', hypervisor=self.apiclient.hypervisor ) else: @@ -858,20 +867,20 @@ class TestRVRInternals(cloudstackTestCase): self.services['host']["username"], self.services['host']["password"], master_router.linklocalip, - 'ifconfig eth2' + 'ip addr show eth2' ) res = str(result) - self.debug("Command 'ifconfig eth2': %s" % result) + self.debug("Command 'ip addr show eth2': %s" % result) self.debug("Router's public Ip: %s" % master_router.publicip) self.assertEqual( - res.count(master_router.publicip), + res.count("state UP"), 1, - "master router should have the public IP configured" + "MASTER router's public interface should be UP" ) self.assertEqual( - result.count('Bcast:0.0.0.0'), + result.count('brd 0.0.0.0'), 0, "Broadcast address of eth2 should not be 0.0.0.0" ) @@ -884,7 +893,7 @@ class TestRVRInternals(cloudstackTestCase): self.apiclient.connection.user, self.apiclient.connction.passwd, backup_router.linklocalip, - 'ifconfig eth2', + 'ip addr show eth2', hypervisor=self.apiclient.hypervisor ) else: @@ -894,16 +903,21 @@ class TestRVRInternals(cloudstackTestCase): self.services['host']["username"], self.services['host']["password"], backup_router.linklocalip, - 'ifconfig eth2' + 'ip addr show eth2', ) res = str(result) - self.debug("Command 'ifconfig eth2': %s" % result) + self.debug("Command 'ip addr show eth2': %s" % result) self.assertEqual( - res.count('Bcast:0.0.0.0'), - 1, - "backup router should NOT have the public IP configured" - ) + res.count("state DOWN"), + 1, + "BACKUP router's public interface should be DOWN" + ) + self.assertEqual( + result.count('brd 0.0.0.0'), + 0, + "Broadcast address of eth2 should not be 0.0.0.0" + ) vms = VirtualMachine.list( self.apiclient, id=virtual_machine.id, @@ -1011,9 +1025,12 @@ class TestRvRRedundancy(cloudstackTestCase): networkids=[str(self.network.id)] ) self.debug("Deployed VM in network: %s" % self.network.id) + + # wait for VR to update state + time.sleep(self.services["sleep"]) + self.cleanup = [] self.cleanup.insert(0, self.account) - self.update_waiting_time = 60; return def tearDown(self): @@ -1081,7 +1098,7 @@ class TestRvRRedundancy(cloudstackTestCase): self.fail("Failed to stop master router: %s" % e) # wait for VR to update state - time.sleep(self.update_waiting_time) + time.sleep(self.services["sleep"]) self.debug("Listing routers for network: %s" % self.network.name) routers = Router.list( @@ -1125,7 +1142,7 @@ class TestRvRRedundancy(cloudstackTestCase): self.fail("Failed to start master router: %s" % e) # wait for VR to update state - time.sleep(self.update_waiting_time) + time.sleep(self.services["sleep"]) self.debug("Checking state of the master router in %s" % self.network.name) routers = Router.list( @@ -1207,7 +1224,7 @@ class TestRvRRedundancy(cloudstackTestCase): self.fail("Failed to stop backup router: %s" % e) # wait for VR update state - time.sleep(self.update_waiting_time) + time.sleep(self.services["sleep"]) self.debug("Checking state of the backup router in %s" % self.network.name) routers = Router.list( @@ -1251,7 +1268,7 @@ class TestRvRRedundancy(cloudstackTestCase): self.fail("Failed to stop master router: %s" % e) # wait for VR to start and update state - time.sleep(self.update_waiting_time) + time.sleep(self.services["sleep"]) self.debug("Checking state of the backup router in %s" % self.network.name) routers = Router.list( @@ -1327,7 +1344,7 @@ class TestRvRRedundancy(cloudstackTestCase): self.fail("Failed to reboot MASTER router: %s" % e) # wait for VR to update state - time.sleep(self.update_waiting_time) + time.sleep(self.services["sleep"]) self.debug("Checking state of the master router in %s" % self.network.name) routers = Router.list( @@ -1420,7 +1437,7 @@ class TestRvRRedundancy(cloudstackTestCase): self.fail("Failed to reboot BACKUP router: %s" % e) # wait for VR to update state - time.sleep(self.update_waiting_time) + time.sleep(self.services["sleep"]) self.debug("Checking state of the backup router in %s" % self.network.name) routers = Router.list( @@ -1528,8 +1545,8 @@ class TestRvRRedundancy(cloudstackTestCase): ) self.assertIn( routers[0].redundantstate, - ['UNKNOWN', 'FAULT'], - "Redundant state of the backup router should be UNKNOWN/FAULT but is %s" % routers[0].redundantstate + 'UNKNOWN', + "Redundant state of the backup router should be UNKNOWN but is %s" % routers[0].redundantstate ) # Spawn an instance in that network From fd62a22b6b0649a6805d23664898615c5307ef0c Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Fri, 26 Jul 2013 09:46:27 +0530 Subject: [PATCH 039/907] add deleteCacheStorage to TOC in API doc generator Signed-off-by: Prasanna Santhanam (cherry picked from commit 8f153a65dd6d0aba42f118352652a4555c3641d6) --- tools/apidoc/gen_toc.py | 1 + 1 file changed, 1 insertion(+) diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py index 33a7e75c7b1..93328c34c13 100644 --- a/tools/apidoc/gen_toc.py +++ b/tools/apidoc/gen_toc.py @@ -146,6 +146,7 @@ known_categories = { 'listImageStore': 'Image Store', 'deleteImageStore': 'Image Store', 'createCacheStore': 'Image Store', + 'deleteCacheStore': 'Image Store', 'listCacheStores': 'Image Store', 'InternalLoadBalancer': 'Internal LB', 'DeploymentPlanners': 'Configuration', From 62c8df9dcdabdc460ad5fb441a3c98e8f6b100aa Mon Sep 17 00:00:00 2001 From: Devdeep Singh Date: Fri, 26 Jul 2013 10:57:37 +0530 Subject: [PATCH 040/907] CLOUDSTACK-3590. Adding new xenserver host to cluster fails in first attempt. While adding a host to the pool it may take a little longer to join the pool. Increased the time the resource waits and checks to make sure the host has joined as slave to the pool. --- .../cloud/hypervisor/xen/resource/XenServerConnectionPool.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java index 5af17812bc3..cb188d5ee03 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServerConnectionPool.java @@ -197,7 +197,7 @@ public class XenServerConnectionPool { } } try { - Thread.sleep(2000); + Thread.sleep(3000); } catch (InterruptedException e) { } } From c576917107789a938cee8cbdb41b18efc9f9dc78 Mon Sep 17 00:00:00 2001 From: Sheng Yang Date: Fri, 26 Jul 2013 00:07:02 -0700 Subject: [PATCH 041/907] Automation: Fix endless silly test cases --- .../component/test_vpc_vm_life_cycle.py | 67 ++++++++++--------- .../component/test_vpc_vms_deployment.py | 8 +-- 2 files changed, 39 insertions(+), 36 deletions(-) diff --git a/test/integration/component/test_vpc_vm_life_cycle.py b/test/integration/component/test_vpc_vm_life_cycle.py index 39fb533bfee..ed86ae35615 100644 --- a/test/integration/component/test_vpc_vm_life_cycle.py +++ b/test/integration/component/test_vpc_vm_life_cycle.py @@ -139,10 +139,10 @@ class Services: "alg": "leastconn", # Algorithm used for load balancing "privateport": 22, - "publicport": 2222, + "publicport": 22, "openfirewall": False, - "startport": 2222, - "endport": 2222, + "startport": 22, + "endport": 22, "protocol": "TCP", "cidrlist": '0.0.0.0/0', }, @@ -161,11 +161,11 @@ class Services: # Any network (For creating FW rule) "protocol": "TCP" }, - "http_rule": { - "startport": 80, - "endport": 80, - "cidrlist": '0.0.0.0/0', - "protocol": "ICMP" + "icmp_rule": { + "icmptype": -1, + "icmpcode": -1, + "cidrlist": '0.0.0.0/0', + "protocol": "ICMP" }, "virtual_machine": { "displayname": "Test VM", @@ -336,14 +336,14 @@ class TestVMLifeCycleVPC(cloudstackTestCase): cls.nwacl_internet_1 = NetworkACL.create( cls.api_client, networkid=cls.network_1.id, - services=cls.services["http_rule"], + services=cls.services["icmp_rule"], traffictype='Egress' ) cls._cleanup = [ + cls.account, cls.service_offering, cls.nw_off, - cls.nw_off_no_lb, - cls.account + cls.nw_off_no_lb ] return @@ -423,6 +423,8 @@ class TestVMLifeCycleVPC(cloudstackTestCase): def validate_network_rules(self): """Validates if the network rules work properly or not?""" try: + self.debug("Checking if we can SSH into VM_1 through %s?" % + (self.public_ip_1.ipaddress.ipaddress)) ssh_1 = self.vm_1.get_ssh_client( ipaddress=self.public_ip_1.ipaddress.ipaddress) self.debug("SSH into VM is successfully") @@ -446,7 +448,8 @@ class TestVMLifeCycleVPC(cloudstackTestCase): "Ping to outside world from VM should be successful" ) - self.debug("Checking if we can SSH into VM_1?") + self.debug("Checking if we can SSH into VM_1 through %s?" % + (self.public_ip_2.ipaddress.ipaddress)) try: ssh_2 = self.vm_1.get_ssh_client( ipaddress=self.public_ip_2.ipaddress.ipaddress) @@ -975,7 +978,6 @@ class TestVMLifeCycleSharedNwVPC(cloudstackTestCase): networkofferingid=cls.shared_nw_off.id, zoneid=cls.zone.id, gateway='10.1.2.1', - vpcid=cls.vpc.id ) # Spawn an instance in that network cls.vm_1 = VirtualMachine.create( @@ -1062,15 +1064,15 @@ class TestVMLifeCycleSharedNwVPC(cloudstackTestCase): cls.nwacl_internet_1 = NetworkACL.create( cls.api_client, networkid=cls.network_1.id, - services=cls.services["http_rule"], + services=cls.services["icmp_rule"], traffictype='Egress' ) cls._cleanup = [ + cls.account, cls.service_offering, cls.nw_off, cls.shared_nw_off, - cls.vpc_off, - cls.account + cls.vpc_off ] return @@ -1774,11 +1776,11 @@ class TestVMLifeCycleBothIsolated(cloudstackTestCase): vpcid=cls.vpc.id ) cls._cleanup = [ + cls.account, cls.service_offering, cls.nw_off, cls.nw_off_no_lb, - cls.vpc_off, - cls.account + cls.vpc_off ] return @@ -1937,20 +1939,18 @@ class TestVMLifeCycleBothIsolated(cloudstackTestCase): # Steps: # 1. Deploy a VM using the default CentOS 6.2 Template - self.debug("Finding the virtual router for network: %s" % - self.network_1.name) + self.debug("Finding the virtual router for vpc: %s" % self.vpc.id) + routers = Router.list( self.apiclient, - account=self.account.name, - domainid=self.account.domainid, - networkid=self.network_1.id, + zoneid=self.zone.id, listall=True ) self.assertEqual( isinstance(routers, list), True, - "List routers should return router for network: %s" % - self.network_1.name + "List routers should return router for vpc: %s" % + self.vpc.id ) router = routers[0] @@ -1969,10 +1969,13 @@ class TestVMLifeCycleBothIsolated(cloudstackTestCase): self.assertEqual( isinstance(routers, list), True, - "List routers should return router for network: %s" % - self.network_1.name + "List routers should return router for vpc: %s" % + self.vpc.id ) router = routers[0] + self.debug("router.state %s" % + router.state) + self.assertEqual( router.state, "Stopped", @@ -2004,7 +2007,7 @@ class TestVMLifeCycleBothIsolated(cloudstackTestCase): "List vms shall return a valid resposnse" ) vm_response = vms[0] - self.assertEqaul( + self.assertEqual( vm_response.state, "Running", "VM state should be running after deployment" @@ -2182,14 +2185,14 @@ class TestVMLifeCycleStoppedVPCVR(cloudstackTestCase): cls.nwacl_internet = NetworkACL.create( cls.api_client, networkid=cls.network_1.id, - services=cls.services["http_rule"], + services=cls.services["icmp_rule"], traffictype='Egress' ) cls._cleanup = [ + cls.account, cls.service_offering, cls.nw_off, - cls.nw_off_no_lb, - cls.account + cls.nw_off_no_lb ] return @@ -2208,7 +2211,7 @@ class TestVMLifeCycleStoppedVPCVR(cloudstackTestCase): self.debug("Check the status of VPC virtual router") routers = Router.list( self.apiclient, - networkid=self.network_1.id, + zoneid=self.zone.id, listall=True ) if not isinstance(routers, list): diff --git a/test/integration/component/test_vpc_vms_deployment.py b/test/integration/component/test_vpc_vms_deployment.py index a697fc38b98..818be21a483 100644 --- a/test/integration/component/test_vpc_vms_deployment.py +++ b/test/integration/component/test_vpc_vms_deployment.py @@ -2028,7 +2028,7 @@ class TestVMDeployVPC(cloudstackTestCase): id=private_gateway.id, listall=True ) - self.assertEqaul( + self.assertEqual( isinstance(gateways, list), True, "List private gateways should return a valid response" @@ -2045,7 +2045,7 @@ class TestVMDeployVPC(cloudstackTestCase): id=static_route.id, listall=True ) - self.assertEqaul( + self.assertEqual( isinstance(static_routes, list), True, "List static route should return a valid response" @@ -2199,7 +2199,7 @@ class TestVMDeployVPC(cloudstackTestCase): id=private_gateway.id, listall=True ) - self.assertEqaul( + self.assertEqual( isinstance(gateways, list), True, "List private gateways should return a valid response" @@ -2216,7 +2216,7 @@ class TestVMDeployVPC(cloudstackTestCase): id=static_route.id, listall=True ) - self.assertEqaul( + self.assertEqual( isinstance(static_routes, list), True, "List static route should return a valid response" From c0ea76a77e471b84f49b08978b866649b3e257b4 Mon Sep 17 00:00:00 2001 From: Devdeep Singh Date: Fri, 26 Jul 2013 14:47:14 +0530 Subject: [PATCH 042/907] CLOUDSTACK-3501. Cannot create instances on XenServer with multiple cores in a socket. If details has information on cores per socket, create an instance accordingly. The vm record is populated with information on how many cores should be allowed in a socket. --- .../hypervisor/xen/resource/XenServer56FP1Resource.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java index 2cc592debe7..11a7b42b81a 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java @@ -200,6 +200,13 @@ public class XenServer56FP1Resource extends XenServer56Resource { vmr.platform = platform; } + String coresPerSocket = details.get("cpu.corespersocket"); + if (coresPerSocket != null) { + Map platform = vmr.platform; + platform.put("cores-per-socket", coresPerSocket); + vmr.platform = platform; + } + vmr.VCPUsAtStartup = (long) vmSpec.getCpus(); vmr.consoles.clear(); From 13fc4690fc39ebded2cf80895d8fd3a622c5b957 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Tue, 23 Jul 2013 10:42:48 +0530 Subject: [PATCH 043/907] CLOUDSTACK-3488: listStoragePools throws NPE if any of the storage pools are not in the right state. This issue is reporducible if user adds a primary storage and quickly fires listStoragePool API command without waiting for the responce of previous createStoragePool API command. So during this period (before receiving createStoragePool API resonce), the primary srorage is in initialized status and the "scope" of storage is not set. --- .../src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java index 503a5633035..bd370851157 100644 --- a/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/StoragePoolJoinDaoImpl.java @@ -75,7 +75,9 @@ public class StoragePoolJoinDaoImpl extends GenericDaoBase Date: Wed, 24 Jul 2013 15:50:50 +0530 Subject: [PATCH 044/907] CLOUDSTACK-3544: Xen 6.2 hosts are tagged with Xen 6.1. This commit will add the new xenserverresource file to support XenServer 6.2. Also add the guest OS list supported by xenserver 6.2 --- .../xen/discoverer/XcpServerDiscoverer.java | 34 +- .../hypervisor/xen/resource/CitrixHelper.java | 336 +++++++++++++++++- .../xen/resource/XenServer620Resource.java | 86 +++++ 3 files changed, 436 insertions(+), 20 deletions(-) create mode 100644 plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer620Resource.java diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java index bbb077c3b2b..87a5014efad 100755 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/discoverer/XcpServerDiscoverer.java @@ -55,6 +55,7 @@ import com.cloud.hypervisor.xen.resource.XenServer56SP2Resource; import com.cloud.hypervisor.xen.resource.XenServer600Resource; import com.cloud.hypervisor.xen.resource.XenServer602Resource; import com.cloud.hypervisor.xen.resource.XenServer610Resource; +import com.cloud.hypervisor.xen.resource.XenServer620Resource; import com.cloud.hypervisor.xen.resource.XenServerConnectionPool; import com.cloud.resource.Discoverer; import com.cloud.resource.DiscovererBase; @@ -438,33 +439,30 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L return new XcpServer16Resource(); } // Citrix Xenserver group of hypervisors else if (prodBrand.equals("XenServer") && prodVersion.equals("5.6.0")) - return new XenServer56Resource(); + return new XenServer56Resource(); else if (prodBrand.equals("XenServer") && prodVersion.equals("6.0.0")) - return new XenServer600Resource(); + return new XenServer600Resource(); else if (prodBrand.equals("XenServer") && prodVersion.equals("6.0.2")) - return new XenServer602Resource(); + return new XenServer602Resource(); else if (prodBrand.equals("XenServer") && prodVersion.equals("6.1.0")) return new XenServer610Resource(); - else if (prodBrand.equals("XenServer") && prodVersion.equals("6.1.83")) - return new XenServer610Resource(); else if (prodBrand.equals("XenServer") && prodVersion.equals("6.2.0")) - return new XenServer610Resource(); + return new XenServer620Resource(); else if (prodBrand.equals("XenServer") && prodVersion.equals("5.6.100")) { - String prodVersionTextShort = record.softwareVersion.get("product_version_text_short").trim(); + String prodVersionTextShort = record.softwareVersion.get("product_version_text_short").trim(); if ("5.6 SP2".equals(prodVersionTextShort)) { - return new XenServer56SP2Resource(); + return new XenServer56SP2Resource(); } else if ("5.6 FP1".equals(prodVersionTextShort)) { - return new XenServer56FP1Resource(); - } + return new XenServer56FP1Resource(); + } } else if (prodBrand.equals("XCP_Kronos")) { return new XcpOssResource(); } - - String msg = "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2, 6.1.0, 6.1.83, 6.2.0 but this one is " + prodBrand + " " + prodVersion; - _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); - s_logger.debug(msg); - throw new RuntimeException(msg); + String msg = "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, XenServer 5.6 FP1, XenServer 5.6 SP2, Xenserver 6.0, 6.0.2, 6.1.0, 6.2.0 but this one is " + prodBrand + " " + prodVersion; + _alertMgr.sendAlert(AlertManager.ALERT_TYPE_HOST, dcId, podId, msg, msg); + s_logger.debug(msg); + throw new RuntimeException(msg); } protected void serverConfig() { @@ -600,10 +598,8 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L resource = XenServer602Resource.class.getName(); } else if (prodBrand.equals("XenServer") && prodVersion.equals("6.1.0")) { resource = XenServer610Resource.class.getName(); - } else if (prodBrand.equals("XenServer") && prodVersion.equals("6.1.83")) { - resource = XenServer610Resource.class.getName(); } else if (prodBrand.equals("XenServer") && prodVersion.equals("6.2.0")) { - resource = XenServer610Resource.class.getName(); + resource = XenServer620Resource.class.getName(); } else if (prodBrand.equals("XenServer") && prodVersion.equals("5.6.100")) { String prodVersionTextShort = details.get("product_version_text_short").trim(); if ("5.6 SP2".equals(prodVersionTextShort)) { @@ -616,7 +612,7 @@ public class XcpServerDiscoverer extends DiscovererBase implements Discoverer, L } if( resource == null ){ - String msg = "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, 5.6 FP1, 5.6 SP2 and Xenserver 6.0 , 6.0.2, 6.1.0, 6.1.83, 6.2.0 but this one is " + prodBrand + " " + prodVersion; + String msg = "Only support XCP 1.0.0, 1.1.0, 1.4.x, 1.5 beta, 1.6.x; XenServer 5.6, 5.6 FP1, 5.6 SP2 and Xenserver 6.0 , 6.0.2, 6.1.0, 6.2.0 but this one is " + prodBrand + " " + prodVersion; s_logger.debug(msg); throw new RuntimeException(msg); } diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java index c5576310c0c..0d93d839be6 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixHelper.java @@ -35,6 +35,8 @@ public class CitrixHelper { private static final HashMap _xenServer600GuestOsMap = new HashMap(70); private static final HashMap _xenServer602GuestOsMap = new HashMap(70); private static final HashMap _xenServer610GuestOsMap = new HashMap(70); + private static final HashMap _xenServer620GuestOsMap = new HashMap(70); + private static final HashMap _xenServer620GuestOsMemoryMap = new HashMap(70); private static final HashMap _xenServer610GuestOsMemoryMap = new HashMap(70); private static final HashMap _xenServer602GuestOsMemoryMap = new HashMap(70); private static final HashMap _xenServer600GuestOsMemoryMap = new HashMap(70); @@ -1293,6 +1295,167 @@ public class CitrixHelper { _xenServer610GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)"); } + static { + _xenServer620GuestOsMap.put("CentOS 4.5 (32-bit)", "CentOS 4.5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 4.6 (32-bit)", "CentOS 4.6 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 4.7 (32-bit)", "CentOS 4.7 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 4.8 (32-bit)", "CentOS 4.8 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.0 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.0 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.1 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.1 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.2 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.2 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.3 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.3 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.4 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.4 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.5 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.5 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.6 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.6 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.7 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.7 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.8 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.8 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.9 (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 5.9 (64-bit)", "CentOS 5 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.0 (32-bit)", "CentOS 6 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.0 (64-bit)", "CentOS 6 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.1 (32-bit)", "CentOS 6 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.1 (64-bit)", "CentOS 6 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.2 (32-bit)", "CentOS 6 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.2 (64-bit)", "CentOS 6 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.3 (32-bit)", "CentOS 6 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.3 (64-bit)", "CentOS 6 (64-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.4 (32-bit)", "CentOS 6 (32-bit)"); + _xenServer620GuestOsMap.put("CentOS 6.4 (64-bit)", "CentOS 6 (64-bit)"); + _xenServer620GuestOsMap.put("Debian GNU/Linux 6(32-bit)", "Debian Squeeze 6.0 (32-bit)"); + _xenServer620GuestOsMap.put("Debian GNU/Linux 6(64-bit)", "Debian Squeeze 6.0 (64-bit)"); + _xenServer620GuestOsMap.put("Debian GNU/Linux 7(32-bit)", "Debian Wheezy 7.0 (32-bit)"); + _xenServer620GuestOsMap.put("Debian GNU/Linux 7(64-bit)", "Debian Wheezy 7.0 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.0 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.0 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.1 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.1 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.2 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.2 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.3 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.3 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.4 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.4 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.5 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.5 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.6 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.6 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.7 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.7 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.8 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.8 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.9 (32-bit)", "Oracle Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 5.9 (64-bit)", "Oracle Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.0 (32-bit)", "Oracle Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.0 (64-bit)", "Oracle Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.1 (32-bit)", "Oracle Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.1 (64-bit)", "Oracle Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.2 (32-bit)", "Oracle Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.2 (64-bit)", "Oracle Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.3 (32-bit)", "Oracle Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.3 (64-bit)", "Oracle Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.4 (32-bit)", "Oracle Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Oracle Enterprise Linux 6.4 (64-bit)", "Oracle Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 4.5 (32-bit)", "Red Hat Enterprise Linux 4.5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 4.6 (32-bit)", "Red Hat Enterprise Linux 4.6 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 4.7 (32-bit)", "Red Hat Enterprise Linux 4.7 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 4.8 (32-bit)", "Red Hat Enterprise Linux 4.8 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.0 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.0 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.1 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.1 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.2 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.2 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.3 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.3 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.4 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.4 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.5 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.5 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.6 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.6 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.7 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.7 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.8 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.8 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.9 (32-bit)", "Red Hat Enterprise Linux 5 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 5.9 (64-bit)", "Red Hat Enterprise Linux 5 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.0 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.0 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.1 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.1 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.2 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.2 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.3 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.3 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.4 (32-bit)", "Red Hat Enterprise Linux 6 (32-bit)"); + _xenServer620GuestOsMap.put("Red Hat Enterprise Linux 6.4 (64-bit)", "Red Hat Enterprise Linux 6 (64-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (32-bit)", "SUSE Linux Enterprise Server 10 SP1 (32-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP1 (64-bit)", "SUSE Linux Enterprise Server 10 SP1 (64-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (32-bit)", "SUSE Linux Enterprise Server 10 SP2 (32-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP2 (64-bit)", "SUSE Linux Enterprise Server 10 SP2 (64-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP3 (32-bit)", "SUSE Linux Enterprise Server 10 SP3 (32-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP3 (64-bit)", "SUSE Linux Enterprise Server 10 SP3 (64-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP4 (32-bit)", "SUSE Linux Enterprise Server 10 SP4 (32-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 10 SP4 (64-bit)", "SUSE Linux Enterprise Server 10 SP4 (64-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 11 (32-bit)", "SUSE Linux Enterprise Server 11 (32-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 11 (64-bit)", "SUSE Linux Enterprise Server 11 (64-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (32-bit)", "SUSE Linux Enterprise Server 11 SP1 (32-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 11 SP1 (64-bit)", "SUSE Linux Enterprise Server 11 SP1 (64-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 11 SP2 (32-bit)", "SUSE Linux Enterprise Server 11 SP2 (32-bit)"); + _xenServer620GuestOsMap.put("SUSE Linux Enterprise Server 11 SP2 (64-bit)", "SUSE Linux Enterprise Server 11 SP2 (64-bit)"); + _xenServer620GuestOsMap.put("Windows 7 (32-bit)", "Windows 7 (32-bit)"); + _xenServer620GuestOsMap.put("Windows 7 (64-bit)", "Windows 7 (64-bit)"); + _xenServer620GuestOsMap.put("Windows 7 SP1 (32-bit)", "Windows 7 SP1 (32-bit)"); + _xenServer620GuestOsMap.put("Windows 7 SP1 (64-bit)", "Windows 7 SP1 (64-bit)"); + _xenServer620GuestOsMap.put("Windows 8 (32-bit)", "Windows 8 (32-bit)"); + _xenServer620GuestOsMap.put("Windows 8 (64-bit)", "Windows 8 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 SP2 (32-bit)", "Windows Server 2003 SP2 (32-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 SP2 (64-bit)", "Windows Server 2003 SP2 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 PAE (32-bit)", "Windows Server 2003 PAE (32-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 Enterprise Edition(32-bit)", "Windows Server 2003 (32-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 Enterprise Edition(64-bit)", "Windows Server 2003 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 DataCenter Edition(32-bit)", "Windows Server 2003 (32-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 DataCenter Edition(64-bit)", "Windows Server 2003 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 Standard Edition(32-bit)", "Windows Server 2003 (32-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2003 Standard Edition(64-bit)", "Windows Server 2003 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2008 SP2 (32-bit)", "Windows Server 2008 SP2 (32-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2008 SP2 (64-bit)", "Windows Server 2008 SP2 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2008 R2 (64-bit)", "Windows Server 2008 R2 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2008 R2 SP1 (64-bit)", "Windows Server 2008 R2 SP1 (64-bit)"); + _xenServer620GuestOsMap.put("Windows Server 2012 (64-bit)", "Windows Server 2012 (64-bit) (experimental)"); + _xenServer620GuestOsMap.put("Windows Vista SP2 (32-bit)", "Windows Vista (32-bit)"); + _xenServer620GuestOsMap.put("Windows XP SP3 (32-bit)", "Windows XP SP3 (32-bit)"); + _xenServer620GuestOsMap.put("Ubuntu 10.04 (32-bit)", "Ubuntu Lucid Lynx 10.04 (32-bit)"); + _xenServer620GuestOsMap.put("Ubuntu 10.04 (64-bit)", "Ubuntu Lucid Lynx 10.04 (64-bit)"); + _xenServer620GuestOsMap.put("Ubuntu 10.10 (32-bit)", "Ubuntu Maverick Meerkat 10.10 (32-bit) (experimental)"); + _xenServer620GuestOsMap.put("Ubuntu 10.10 (64-bit)", "Ubuntu Maverick Meerkat 10.10 (64-bit) (experimental)"); + _xenServer620GuestOsMap.put("Ubuntu 12.04 (32-bit)", "Ubuntu Precise Pangolin 12.04 (32-bit)"); + _xenServer620GuestOsMap.put("Ubuntu 12.04 (64-bit)", "Ubuntu Precise Pangolin 12.04 (64-bit)"); + _xenServer620GuestOsMap.put("Ubuntu 11.04 (32-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Ubuntu 11.04 (64-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other Linux (32-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other Linux (64-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other (32-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other (64-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other CentOS (32-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other CentOS (64-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other Ubuntu (32-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other Ubuntu (64-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other SUSE Linux(32-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other SUSE Linux(64-bit)", "Other install media"); + _xenServer620GuestOsMap.put("Other PV (32-bit)", "CentOS 5 (32-bit)"); + _xenServer620GuestOsMap.put("Other PV (64-bit)", "CentOS 5 (64-bit)"); + } + public static class MemoryValues { long max; long min; @@ -1441,6 +1604,147 @@ public class CitrixHelper { // _xenServer610GuestOsMemoryMap.put("Other PV (64-bit)", new MemoryValues(512l, 16*1024l)); } + static { + _xenServer620GuestOsMemoryMap.put("CentOS 4.5 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 4.6 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 4.7 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 4.8 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.0 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.0 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.1 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.1 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.2 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.2 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.3 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.3 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.4 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.4 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.5 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.5 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.6 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.6 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.7 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.7 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.8 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.8 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.9 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 5.9 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.0 (32-bit)", new MemoryValues(512l, 8*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.0 (64-bit)", new MemoryValues(512l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.1 (32-bit)", new MemoryValues(512l, 8*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.1 (64-bit)", new MemoryValues(512l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.2 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.2 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.3 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.3 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.4 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("CentOS 6.4 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Debian GNU/Linux 6(32-bit)", new MemoryValues(128l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("Debian GNU/Linux 6(64-bit)", new MemoryValues(128l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("Debian GNU/Linux 7(32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Debian GNU/Linux 7(64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.0 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.0 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.1 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.1 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.2 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.2 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.3 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.3 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.4 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.4 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.5 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.5 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.6 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.6 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.7 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.7 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.8 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.8 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.9 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 5.9 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.0 (32-bit)", new MemoryValues(512l, 8*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.0 (64-bit)", new MemoryValues(512l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.1 (32-bit)", new MemoryValues(512l, 8*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.1 (64-bit)", new MemoryValues(512l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.2 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.2 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.3 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.3 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.4 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Oracle Enterprise Linux 6.4 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 4.5 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 4.6 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 4.7 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 4.8 (32-bit)", new MemoryValues(256l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.0 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.0 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.1 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.1 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.2 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.2 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.3 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.3 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.4 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.4 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.5 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.5 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.6 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.6 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.7 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.7 (64-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.8 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.8 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.9 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 5.9 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.0 (32-bit)", new MemoryValues(512l, 8*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.0 (64-bit)", new MemoryValues(512l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.1 (32-bit)", new MemoryValues(512l, 8*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.1 (64-bit)", new MemoryValues(512l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.2 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.2 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.3 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.3 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.4 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("Red Hat Enterprise Linux 6.4 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP1 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP1 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP2 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP2 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP3 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP3 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP4 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 10 SP4 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP1 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP1 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP2 (32-bit)", new MemoryValues(512l, 16*1024l)); + _xenServer620GuestOsMemoryMap.put("SUSE Linux Enterprise Server 11 SP2 (64-bit)", new MemoryValues(512l, 128*1024l)); + + _xenServer620GuestOsMemoryMap.put("Windows 7 (32-bit)", new MemoryValues(1024l, 4*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows 7 (64-bit)", new MemoryValues(2*1024l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows 7 SP1 (32-bit)", new MemoryValues(1024l, 4*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows 7 SP1 (64-bit)", new MemoryValues(2*1024l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows 8 (32-bit)", new MemoryValues(1024l, 4*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows 8 (64-bit)", new MemoryValues(2*1024l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Server 2003 SP2 (32-bit)", new MemoryValues(256l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Server 2003 SP2 (64-bit)", new MemoryValues(256l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Server 2008 SP2 (32-bit)", new MemoryValues(512l, 64*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Server 2008 SP2 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Server 2008 R2 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Server 2008 R2 SP1 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Server 2012 (64-bit)", new MemoryValues(512l, 128*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows Vista SP2 (32-bit)", new MemoryValues(1024l, 4*1024l)); + _xenServer620GuestOsMemoryMap.put("Windows XP SP3 (32-bit)", new MemoryValues(256l, 4*1024l)); + _xenServer620GuestOsMemoryMap.put("Ubuntu 10.04 (32-bit)", new MemoryValues(128l, 512l)); + _xenServer620GuestOsMemoryMap.put("Ubuntu 10.04 (64-bit)", new MemoryValues(128l, 32*1024l)); + //_xenServer620GuestOsMemoryMap.put("Ubuntu 10.10 (32-bit)", new MemoryValues(512l, 16*1024l));//? + //_xenServer620GuestOsMemoryMap.put("Ubuntu 10.10 (64-bit)", new MemoryValues(512l, 16*1024l)); //? + _xenServer620GuestOsMemoryMap.put("Ubuntu 12.04 (32-bit)", new MemoryValues(128l, 32*1024l)); + _xenServer620GuestOsMemoryMap.put("Ubuntu 12.04 (64-bit)", new MemoryValues(128l, 128*1024l)); + } + public static String getXcpGuestOsType(String stdType) { String guestOS = _xcp100GuestOsMap.get(stdType); @@ -1626,4 +1930,34 @@ public class CitrixHelper { } return recommendedMaxMinMemory.getMin(); } -} + + public static String getXenServer620GuestOsType(String stdType, boolean bootFromCD) { + String guestOS = _xenServer620GuestOsMap.get(stdType); + if (guestOS == null) { + if (!bootFromCD) { + s_logger.debug("Can't find the guest os: " + stdType + " mapping into XenServer 6.2.0 guestOS type, start it as HVM guest"); + guestOS = "Other install media"; + } else { + String msg = "XenServer 6.2.0 DOES NOT support Guest OS type " + stdType; + s_logger.warn(msg); + } + } + return guestOS; + } + + public static long getXenServer620StaticMax(String stdType, boolean bootFromCD) { + MemoryValues recommendedMaxMinMemory = _xenServer620GuestOsMemoryMap.get(stdType); + if (recommendedMaxMinMemory == null) { + return 0l; + } + return recommendedMaxMinMemory.getMax(); + } + + public static long getXenServer620StaticMin(String stdType, boolean bootFromCD) { + MemoryValues recommendedMaxMinMemory = _xenServer620GuestOsMemoryMap.get(stdType); + if (recommendedMaxMinMemory == null) { + return 0l; + } + return recommendedMaxMinMemory.getMin(); + } +} \ No newline at end of file diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer620Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer620Resource.java new file mode 100644 index 00000000000..51d7cd005e5 --- /dev/null +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer620Resource.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 com.cloud.hypervisor.xen.resource; + +import java.io.File; +import java.util.ArrayList; +import java.util.List; + +import javax.ejb.Local; + +import org.apache.log4j.Logger; + +import com.cloud.resource.ServerResource; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.script.Script; + + +@Local(value=ServerResource.class) +public class XenServer620Resource extends XenServer610Resource { + private static final Logger s_logger = Logger.getLogger(XenServer620Resource.class); + + public XenServer620Resource() { + super(); + } + + @Override + protected String getGuestOsType(String stdType, boolean bootFromCD) { + return CitrixHelper.getXenServer620GuestOsType(stdType, bootFromCD); + } + + @Override + protected List getPatchFiles() { + List files = new ArrayList(); + String patch = "scripts/vm/hypervisor/xenserver/xenserver60/patch"; + String patchfilePath = Script.findScript("" , patch); + if (patchfilePath == null) { + throw new CloudRuntimeException("Unable to find patch file " + patch); + } + File file = new File(patchfilePath); + files.add(file); + return files; + } + + @Override + public long getStaticMax(String os, boolean b, long dynamicMinRam, long dynamicMaxRam){ + long recommendedValue = CitrixHelper.getXenServer620StaticMax(os, b); + if(recommendedValue == 0){ + s_logger.warn("No recommended value found for dynamic max, setting static max and dynamic max equal"); + return dynamicMaxRam; + } + long staticMax = Math.min(recommendedValue, 4l * dynamicMinRam); // XS constraint for stability + if (dynamicMaxRam > staticMax){ // XS contraint that dynamic max <= static max + s_logger.warn("dynamixMax " + dynamicMaxRam + " cant be greater than static max " + staticMax + ", can lead to stability issues. Setting static max as much as dynamic max "); + return dynamicMaxRam; + } + return staticMax; + } + + @Override + public long getStaticMin(String os, boolean b, long dynamicMinRam, long dynamicMaxRam){ + long recommendedValue = CitrixHelper.getXenServer620StaticMin(os, b); + if(recommendedValue == 0){ + s_logger.warn("No recommended value found for dynamic min"); + return dynamicMinRam; + } + + if(dynamicMinRam < recommendedValue){ // XS contraint that dynamic min > static min + s_logger.warn("Vm is set to dynamixMin " + dynamicMinRam + " less than the recommended static min " + recommendedValue + ", could lead to stability issues"); + } + return dynamicMinRam; + } +} From 71e387f1fa9e8c4e810ccb9b6eb59b46aaa55811 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Fri, 26 Jul 2013 15:28:41 +0530 Subject: [PATCH 045/907] CLOUDSTACK-3780: G11N: JA: Garbled code display on Pod configuration & Host configuration pages during "Add zone". --- client/WEB-INF/classes/resources/messages_ja.properties | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/client/WEB-INF/classes/resources/messages_ja.properties b/client/WEB-INF/classes/resources/messages_ja.properties index 51c43160c1f..697005828db 100644 --- a/client/WEB-INF/classes/resources/messages_ja.properties +++ b/client/WEB-INF/classes/resources/messages_ja.properties @@ -1221,7 +1221,7 @@ message.add.load.balancer=\u30be\u30fc\u30f3\u306b\u8ca0\u8377\u5206\u6563\u88c5 message.add.load.balancer.under.ip=\u8ca0\u8377\u5206\u6563\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.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 @@ -1283,7 +1283,7 @@ message.delete.VPN.gateway=\u3053\u306e VPN \u30b2\u30fc\u30c8\u30a6\u30a7\u30a4 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\u8ca0\u8377\u5206\u6563\u88c5\u7f6e\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.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.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.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 From 24a8d60d6fbd1a051b6a597b2d3c5b905c0e5fa2 Mon Sep 17 00:00:00 2001 From: Rajesh Battala Date: Thu, 13 Jun 2013 14:40:43 +0530 Subject: [PATCH 046/907] CLOUDSTACK-62 [AWS Style Health Checks] Response of the API listLoadBalancerRuleInstances should show the service state of a VM if health check is configured for it --- .../cloud/network/lb/LoadBalancingRulesService.java | 5 +++-- api/src/org/apache/cloudstack/api/ApiConstants.java | 2 +- .../ListLoadBalancerRuleInstancesCmd.java | 10 +++++++++- .../cloudstack/api/response/UserVmResponse.java | 6 ++++++ .../network/lb/LoadBalancingRulesManagerImpl.java | 12 +++++++----- 5 files changed, 26 insertions(+), 9 deletions(-) diff --git a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java index 5fc41e34c34..59d5c8dec05 100644 --- a/api/src/com/cloud/network/lb/LoadBalancingRulesService.java +++ b/api/src/com/cloud/network/lb/LoadBalancingRulesService.java @@ -103,9 +103,10 @@ public interface LoadBalancingRulesService { * balancer. * * @param cmd - * @return list of vm instances that have been or can be applied to a load balancer + * @return list of vm instances that have been or can be applied to a load balancer along with service state, + * if the LB has health check policy created on it from cloudstack. */ - List listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd); + Pair, List> listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd); /** * List load balancer rules based on the given criteria diff --git a/api/src/org/apache/cloudstack/api/ApiConstants.java b/api/src/org/apache/cloudstack/api/ApiConstants.java index 121403fa064..00d526d216e 100755 --- a/api/src/org/apache/cloudstack/api/ApiConstants.java +++ b/api/src/org/apache/cloudstack/api/ApiConstants.java @@ -517,7 +517,7 @@ public class ApiConstants { public static final String IS_DYNAMICALLY_SCALABLE = "isdynamicallyscalable"; public static final String ROUTING = "isrouting"; public static final String MAX_CONNECTIONS = "maxconnections"; - + public static final String SERVICE_STATE = "servicestate"; public enum HostDetails { all, capacity, events, stats, min; } diff --git a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java index 49ab42c32df..fcd41c4963f 100644 --- a/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java +++ b/api/src/org/apache/cloudstack/api/command/user/loadbalancer/ListLoadBalancerRuleInstancesCmd.java @@ -17,6 +17,7 @@ package org.apache.cloudstack.api.command.user.loadbalancer; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import org.apache.cloudstack.api.APICommand; @@ -29,6 +30,7 @@ import org.apache.cloudstack.api.response.UserVmResponse; import org.apache.log4j.Logger; import com.cloud.uservm.UserVm; +import com.cloud.utils.Pair; @APICommand(name = "listLoadBalancerRuleInstances", description="List all virtual machine instances that are assigned to a load balancer rule.", responseObject=UserVmResponse.class) public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd { @@ -70,12 +72,18 @@ public class ListLoadBalancerRuleInstancesCmd extends BaseListCmd { @Override public void execute(){ - List result = _lbService.listLoadBalancerInstances(this); + Pair, List> vmServiceMap = _lbService.listLoadBalancerInstances(this); + List result = vmServiceMap.first(); + List serviceStates = vmServiceMap.second(); ListResponse response = new ListResponse(); List vmResponses = new ArrayList(); if (result != null) { vmResponses = _responseGenerator.createUserVmResponse("loadbalancerruleinstance", result.toArray(new UserVm[result.size()])); } + + for (int i=0;i(); @@ -439,4 +441,8 @@ public class UserVmResponse extends BaseResponse implements ControlledEntityResp this.isDynamicallyScalable = isDynamicallyScalable; } + public void setServiceState(String state) { + this.serviceState = state; + } + } diff --git a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java index 92f9417e386..3f7b70ffffc 100755 --- a/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java +++ b/server/src/com/cloud/network/lb/LoadBalancingRulesManagerImpl.java @@ -1835,7 +1835,7 @@ public class LoadBalancingRulesManagerImpl extends ManagerBase implements } @Override - public List listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd) + public Pair, List> listLoadBalancerInstances(ListLoadBalancerRuleInstancesCmd cmd) throws PermissionDeniedException { Account caller = CallContext.current().getCallingAccount(); Long loadBalancerId = cmd.getId(); @@ -1853,14 +1853,16 @@ public class LoadBalancingRulesManagerImpl extends ManagerBase implements _accountMgr.checkAccess(caller, null, true, loadBalancer); List loadBalancerInstances = new ArrayList(); + List serviceStates = new ArrayList(); List vmLoadBalancerMappings = null; - vmLoadBalancerMappings = _lb2VmMapDao.listByLoadBalancerId(loadBalancerId); - + Map vmServiceState = new HashMap(vmLoadBalancerMappings.size()); List appliedInstanceIdList = new ArrayList(); + if ((vmLoadBalancerMappings != null) && !vmLoadBalancerMappings.isEmpty()) { for (LoadBalancerVMMapVO vmLoadBalancerMapping : vmLoadBalancerMappings) { appliedInstanceIdList.add(vmLoadBalancerMapping.getInstanceId()); + vmServiceState.put(vmLoadBalancerMapping.getInstanceId(), vmLoadBalancerMapping.getState()); } } @@ -1881,10 +1883,10 @@ public class LoadBalancingRulesManagerImpl extends ManagerBase implements boolean isApplied = appliedInstanceIdList.contains(userVm.getId()); if ((isApplied && applied) || (!isApplied && !applied)) { loadBalancerInstances.add(userVm); + serviceStates.add(vmServiceState.get(userVm.getId())); } } - - return loadBalancerInstances; + return new Pair, List>(loadBalancerInstances,serviceStates); } @Override From 26a0fd5af99ed4ade87f6b8e5ba6ab02bd9d6a31 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Fri, 26 Jul 2013 16:29:09 +0530 Subject: [PATCH 047/907] CLOUDSTACK-3797: Builtin appliance definition using veewee This appliance will be used for testing purposes only. The appliance will replace the built-in in a test environment before deployment. Some of the integration tests require specific services running within guests to test for cloudstack features. Eg: VPC LB needs an httpd server running. When we need to customize the template this appliance can be used instead of having custom templates for each test. Signed-off-by: Prasanna Santhanam --- tools/appliance/definitions/builtin/base.sh | 17 ++++++++ .../appliance/definitions/builtin/cleanup.sh | 19 ++++++++ .../definitions/builtin/definition.rb | 33 ++++++++++++++ .../definitions/builtin/install-xs-tools.sh | 7 +++ tools/appliance/definitions/builtin/ks.cfg | 35 +++++++++++++++ .../definitions/builtin/postinstall.sh | 43 +++++++++++++++++++ .../appliance/definitions/builtin/zerodisk.sh | 3 ++ 7 files changed, 157 insertions(+) create mode 100644 tools/appliance/definitions/builtin/base.sh create mode 100644 tools/appliance/definitions/builtin/cleanup.sh create mode 100644 tools/appliance/definitions/builtin/definition.rb create mode 100644 tools/appliance/definitions/builtin/install-xs-tools.sh create mode 100644 tools/appliance/definitions/builtin/ks.cfg create mode 100644 tools/appliance/definitions/builtin/postinstall.sh create mode 100644 tools/appliance/definitions/builtin/zerodisk.sh diff --git a/tools/appliance/definitions/builtin/base.sh b/tools/appliance/definitions/builtin/base.sh new file mode 100644 index 00000000000..4b7eeae8b3d --- /dev/null +++ b/tools/appliance/definitions/builtin/base.sh @@ -0,0 +1,17 @@ +# Base install + +sed -i "s/^.*requiretty/#Defaults requiretty/" /etc/sudoers + +cat > /etc/yum.repos.d/epel.repo << EOM +[epel] +name=epel +baseurl=http://download.fedoraproject.org/pub/epel/6/\$basearch +enabled=1 +gpgcheck=0 +EOM + +# libs for compiling other packages +yum -y install wget vim-enhanced htop telnet tcpdump sed httpd + +# Make ssh faster by not waiting on DNS +echo "UseDNS no" >> /etc/ssh/sshd_config diff --git a/tools/appliance/definitions/builtin/cleanup.sh b/tools/appliance/definitions/builtin/cleanup.sh new file mode 100644 index 00000000000..e450f8e477d --- /dev/null +++ b/tools/appliance/definitions/builtin/cleanup.sh @@ -0,0 +1,19 @@ +# Clean up unneeded packages. +yum -y erase gtk2 libX11 hicolor-icon-theme avahi freetype bitstream-vera-fonts +yum -y clean all +#rm -rf /etc/yum.repos.d/{puppetlabs,epel}.repo +rm -rf VBoxGuestAdditions_*.iso + +# Ensure that udev doesn't screw us with network device naming. +ln -sf /dev/null /lib/udev/rules.d/75-persistent-net-generator.rules +rm -f /etc/udev/rules.d/70-persistent-net.rules + +# On startup, remove HWADDR from the eth0 interface. +cp -f /etc/sysconfig/network-scripts/ifcfg-eth0 /tmp/eth0 +sed "/^HWADDR/d" /tmp/eth0 > /etc/sysconfig/network-scripts/ifcfg-eth0 +sed -e "s/dhcp/none/;s/eth0/eth1/" /etc/sysconfig/network-scripts/ifcfg-eth0 > /etc/sysconfig/network-scripts/ifcfg-eth1 + +# Prevent way too much CPU usage in VirtualBox by disabling APIC. +sed -e 's/\tkernel.*/& noapic/' /boot/grub/grub.conf > /tmp/new_grub.conf +mv /boot/grub/grub.conf /boot/grub/grub.conf.bak +mv /tmp/new_grub.conf /boot/grub/grub.conf diff --git a/tools/appliance/definitions/builtin/definition.rb b/tools/appliance/definitions/builtin/definition.rb new file mode 100644 index 00000000000..65421021df7 --- /dev/null +++ b/tools/appliance/definitions/builtin/definition.rb @@ -0,0 +1,33 @@ +Veewee::Definition.declare({ + :cpu_count => '1', + :memory_size=> '2048', + :disk_size => '32000', :disk_format => 'VDI', :hostiocache => 'off', + :os_type_id => 'RedHat6_64', + :iso_file => "CentOS-6.4-x86_64-minimal.iso", + :iso_src => "http://centos.mirror.net.in/centos/6.4/isos/x86_64/CentOS-6.4-x86_64-minimal.iso", + :iso_md5 => "4a5fa01c81cc300f4729136e28ebe600", + :iso_download_timeout => "1000", + :boot_wait => "10", + :boot_cmd_sequence => [ + ' text ks=http://%IP%:%PORT%/ks.cfg' + ], + :kickstart_port => "7122", + :kickstart_timeout => "10000", + :kickstart_file => "ks.cfg", + :ssh_login_timeout => "10000", + :ssh_user => "root", + :ssh_password => "password", + :ssh_key => "", + :ssh_host_port => "7222", + :ssh_guest_port => "22", + :sudo_cmd => "echo '%p'|sudo -S sh '%f'", + :shutdown_cmd => "halt -p", + :postinstall_files => [ + "base.sh", + "postinstall.sh", + "install-xs-tools.sh", + "cleanup.sh", + "zerodisk.sh" + ], + :postinstall_timeout => "10000" +}) diff --git a/tools/appliance/definitions/builtin/install-xs-tools.sh b/tools/appliance/definitions/builtin/install-xs-tools.sh new file mode 100644 index 00000000000..68f076e2cba --- /dev/null +++ b/tools/appliance/definitions/builtin/install-xs-tools.sh @@ -0,0 +1,7 @@ +# get the latest xs tools available from xen.org +wget --no-check-certificate http://downloads.xen.org/XCP/debian/xs-tools-5.9.960.iso -o xs-tools.iso + +sudo mount -o loop xs-tools.iso /mnt + +#install the xs tools +sudo sh /mnt/Linux/install.sh diff --git a/tools/appliance/definitions/builtin/ks.cfg b/tools/appliance/definitions/builtin/ks.cfg new file mode 100644 index 00000000000..3034b057189 --- /dev/null +++ b/tools/appliance/definitions/builtin/ks.cfg @@ -0,0 +1,35 @@ +install +cdrom +lang en_US.UTF-8 +keyboard us +network --bootproto=dhcp +rootpw password +firewall --enabled --service=ssh +authconfig --enableshadow --passalgo=sha512 +selinux --disabled +timezone UTC +bootloader --location=mbr + +text +skipx +zerombr + +clearpart --all --initlabel +autopart + +auth --useshadow --enablemd5 +firstboot --disabled +reboot + +%packages --nobase +@core +%end + +%post +/usr/bin/yum -y install sudo +/usr/sbin/groupadd veewee +/usr/sbin/useradd veewee -g veewee -G wheel +echo "veewee"|passwd --stdin veewee +echo "veewee ALL=(ALL) NOPASSWD: ALL" >> /etc/sudoers.d/veewee +chmod 0440 /etc/sudoers.d/veewee +%end diff --git a/tools/appliance/definitions/builtin/postinstall.sh b/tools/appliance/definitions/builtin/postinstall.sh new file mode 100644 index 00000000000..c9b8003ddbb --- /dev/null +++ b/tools/appliance/definitions/builtin/postinstall.sh @@ -0,0 +1,43 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +set -x + +install_packages() { + # xen + yum -y install xen-tools + + # dev tools, ssh, nfs + yum -y install telnet tcpdump sed awk ssh + + # utlities + yum -y install httpd +} + +start_services() { + chkconfig httpd on + service httpd start +} + +begin=$(date +%s) + +install_packages + +fin=$(date +%s) +t=$((fin-begin)) + +echo "Builtin baked in $t seconds" diff --git a/tools/appliance/definitions/builtin/zerodisk.sh b/tools/appliance/definitions/builtin/zerodisk.sh new file mode 100644 index 00000000000..938075a31e6 --- /dev/null +++ b/tools/appliance/definitions/builtin/zerodisk.sh @@ -0,0 +1,3 @@ +# Zero out the free space to save space in the final image: +dd if=/dev/zero of=/EMPTY bs=1M +rm -f /EMPTY From 32c8cd3cd74016e3d4784f66f96b134b720529a5 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Fri, 26 Jul 2013 16:32:52 +0530 Subject: [PATCH 048/907] ignore the test template from rat check Signed-off-by: Prasanna Santhanam --- pom.xml | 1 + 1 file changed, 1 insertion(+) diff --git a/pom.xml b/pom.xml index e7b4c5a068b..74c1ceb0afe 100644 --- a/pom.xml +++ b/pom.xml @@ -351,6 +351,7 @@ tools/appliance/definitions/devcloud/* tools/appliance/definitions/systemvmtemplate/* tools/appliance/definitions/systemvmtemplate64/* + tools/appliance/definitions/builtin/* tools/cli/cloudmonkey.egg-info/* tools/devcloud/src/deps/boxes/basebox-build/definition.rb tools/devcloud/src/deps/boxes/basebox-build/preseed.cfg From 4be18aefc4b8fa7a4b184ace7007159f728df827 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Fri, 26 Jul 2013 19:20:29 +0530 Subject: [PATCH 049/907] CLOUDSTACK-2450: Fix userdata to be urlencoded safely urlencoding the userdata and quoting the = since apiserver will strip them out. This will send an invalid userdata down to the plugin (vmops) where base64 decoding fails causing vm deployment to fail. Signed-off-by: Prasanna Santhanam --- tools/marvin/marvin/integration/lib/base.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index 8d9a25d562d..d927c2afac3 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -376,7 +376,7 @@ class VirtualMachine: cmd.hostid = hostid if "userdata" in services: - cmd.userdata = base64.b64encode(services["userdata"]) + cmd.userdata = base64.urlsafe_b64encode(services["userdata"]) if group: cmd.group = group From 697b7c94710d90677639fc1632e0a91a64e856d6 Mon Sep 17 00:00:00 2001 From: frank Date: Fri, 26 Jul 2013 11:28:23 -0700 Subject: [PATCH 050/907] make UCS api name better --- client/tomcatconf/commands.properties.in | 8 ++++---- .../ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java | 1 + .../cloudstack/api/AssociateUcsProfileToBladeCmd.java | 2 +- .../src/org/apache/cloudstack/api/ListUcsBladeCmd.java | 2 +- .../src/org/apache/cloudstack/api/ListUcsManagerCmd.java | 2 +- .../src/org/apache/cloudstack/api/ListUcsProfileCmd.java | 2 +- utils/src/com/cloud/utils/xmlobject/XmlObject.java | 2 +- 7 files changed, 10 insertions(+), 9 deletions(-) diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index f6d918210e8..729dd23e762 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -609,10 +609,10 @@ listBaremetalPxePingServer=1 #### UCS commands addUcsManager=1 -listUcsManager=1 -listUcsProfile=1 -listUcsBlade=1 -associatesUcsProfileToBlade=1 +listUcsManagers=1 +listUcsProfiles=1 +listUcsBlades=1 +associateUcsProfileToBlade=1 #### New Load Balancer commands createLoadBalancer=15 diff --git a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java index 8595d3a611b..df874cb5fa7 100755 --- a/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java +++ b/plugins/hypervisors/ucs/src/com/cloud/ucs/manager/UcsManagerImpl.java @@ -424,6 +424,7 @@ public class UcsManagerImpl implements UcsManager { rsp.setId(vo.getUuid()); rsp.setDn(vo.getDn()); rsp.setHostId(hostIdToUuid(vo.getHostId())); + rsp.setAssociatedProfileDn(vo.getProfileDn()); rsp.setUcsManagerId(ucsManagerIdToUuid(vo.getUcsManagerId())); return rsp; } diff --git a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java index 5e65ece4641..b48f0571133 100755 --- a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java +++ b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/AssociateUcsProfileToBladeCmd.java @@ -37,7 +37,7 @@ import com.cloud.exception.ResourceAllocationException; import com.cloud.exception.ResourceUnavailableException; import com.cloud.ucs.manager.UcsManager; import com.cloud.user.Account; -@APICommand(name="associatesUcsProfileToBlade", description="associate a profile to a blade", responseObject=UcsBladeResponse.class) +@APICommand(name="associateUcsProfileToBlade", description="associate a profile to a blade", responseObject=UcsBladeResponse.class) public class AssociateUcsProfileToBladeCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(AssociateUcsProfileToBladeCmd.class); diff --git a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsBladeCmd.java b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsBladeCmd.java index e42cf65a94b..e4f052a0b2b 100755 --- a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsBladeCmd.java +++ b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsBladeCmd.java @@ -38,7 +38,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.ucs.manager.UcsManager; import com.cloud.user.Account; -@APICommand(name="listUcsBlade", description="List ucs blades", responseObject=UcsBladeResponse.class) +@APICommand(name="listUcsBlades", description="List ucs blades", responseObject=UcsBladeResponse.class) public class ListUcsBladeCmd extends BaseListCmd { public static final Logger s_logger = Logger.getLogger(ListUcsBladeCmd.class); diff --git a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsManagerCmd.java b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsManagerCmd.java index 228fbcb7330..da13b173f75 100755 --- a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsManagerCmd.java +++ b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsManagerCmd.java @@ -47,7 +47,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.server.ManagementService; import com.cloud.ucs.manager.UcsManager; import com.cloud.user.Account; -@APICommand(name="listUcsManager", description="List ucs manager", responseObject=UcsManagerResponse.class) +@APICommand(name="listUcsManagers", description="List ucs manager", responseObject=UcsManagerResponse.class) public class ListUcsManagerCmd extends BaseListCmd { public static final Logger s_logger = Logger.getLogger(ListUcsManagerCmd.class); diff --git a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsProfileCmd.java b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsProfileCmd.java index 56f3f5d3f88..816c26cbb5c 100755 --- a/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsProfileCmd.java +++ b/plugins/hypervisors/ucs/src/org/apache/cloudstack/api/ListUcsProfileCmd.java @@ -40,7 +40,7 @@ import com.cloud.exception.ResourceUnavailableException; import com.cloud.server.ManagementService; import com.cloud.ucs.manager.UcsManager; import com.cloud.user.Account; -@APICommand(name="listUcsProfile", description="List profile in ucs manager", responseObject=UcsProfileResponse.class) +@APICommand(name="listUcsProfiles", description="List profile in ucs manager", responseObject=UcsProfileResponse.class) public class ListUcsProfileCmd extends BaseListCmd { public static final Logger s_logger = Logger.getLogger(ListUcsProfileCmd.class); diff --git a/utils/src/com/cloud/utils/xmlobject/XmlObject.java b/utils/src/com/cloud/utils/xmlobject/XmlObject.java index 4162e4aff37..789a74dbb8e 100755 --- a/utils/src/com/cloud/utils/xmlobject/XmlObject.java +++ b/utils/src/com/cloud/utils/xmlobject/XmlObject.java @@ -46,7 +46,7 @@ public class XmlObject { } Object old = elements.get(key); if (old == null) { - System.out.println(String.format("no %s, add new", key)); + //System.out.println(String.format("no %s, add new", key)); elements.put(key, e); } else { if (old instanceof List) { From adc72812fec4c441a24bff5fec138d07ebc55709 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 11:23:04 -0700 Subject: [PATCH 051/907] CLOUDSTACK-3709: UI > Infrastructure menu > Secondary Storage > Cache Storage > detailView > implement Delete action. --- ui/scripts/system.js | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 3d77980496a..4e94b2ece1d 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -15187,6 +15187,40 @@ detailView: { name: 'Cache Storage details', isMaximized: true, + actions: { + remove: { + label: 'Delete Cache Storage', + messages: { + confirm: function(args) { + return 'Please confirm you want to delete cache storage.'; + }, + notification: function(args) { + return 'Delete Cache Storage'; + } + }, + action: function(args) { + var data = { + id: args.context.cacheStorage[0].id + }; + $.ajax({ + url: createURL('deleteCacheStore'), + data: data, + async: true, + success: function(json) { + args.response.success(); + }, + error: function(data) { + args.response.error(parseXMLHttpResponse(data)); + } + }); + }, + notification: { + poll: function(args) { + args.complete(); + } + } + } + }, tabs: { details: { title: 'label.details', From 4bf7abcbe9378cde9a3709a0b0a26582813d0188 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Fri, 26 Jul 2013 23:58:35 +0530 Subject: [PATCH 052/907] CLOUDSTACK-3797: remove duplicate packages from base.sh already in postinstall.sh Signed-off-by: Prasanna Santhanam --- tools/appliance/definitions/builtin/base.sh | 3 --- tools/appliance/definitions/builtin/postinstall.sh | 4 +--- 2 files changed, 1 insertion(+), 6 deletions(-) diff --git a/tools/appliance/definitions/builtin/base.sh b/tools/appliance/definitions/builtin/base.sh index 4b7eeae8b3d..38138695daa 100644 --- a/tools/appliance/definitions/builtin/base.sh +++ b/tools/appliance/definitions/builtin/base.sh @@ -10,8 +10,5 @@ enabled=1 gpgcheck=0 EOM -# libs for compiling other packages -yum -y install wget vim-enhanced htop telnet tcpdump sed httpd - # Make ssh faster by not waiting on DNS echo "UseDNS no" >> /etc/ssh/sshd_config diff --git a/tools/appliance/definitions/builtin/postinstall.sh b/tools/appliance/definitions/builtin/postinstall.sh index c9b8003ddbb..5af147e17b0 100644 --- a/tools/appliance/definitions/builtin/postinstall.sh +++ b/tools/appliance/definitions/builtin/postinstall.sh @@ -18,11 +18,9 @@ set -x install_packages() { - # xen - yum -y install xen-tools # dev tools, ssh, nfs - yum -y install telnet tcpdump sed awk ssh + yum -y install wget telnet tcpdump sed awk ssh htop # utlities yum -y install httpd From 0f7870332ad2080d9f61da463308fe52438d1cc7 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sat, 27 Jul 2013 00:01:02 +0530 Subject: [PATCH 053/907] CLOUDSTACK-3797: Fix wget installation of xs-tools in to the builtin Signed-off-by: Prasanna Santhanam --- tools/appliance/definitions/builtin/install-xs-tools.sh | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/tools/appliance/definitions/builtin/install-xs-tools.sh b/tools/appliance/definitions/builtin/install-xs-tools.sh index 68f076e2cba..fc3bd47558f 100644 --- a/tools/appliance/definitions/builtin/install-xs-tools.sh +++ b/tools/appliance/definitions/builtin/install-xs-tools.sh @@ -1,7 +1,7 @@ # get the latest xs tools available from xen.org -wget --no-check-certificate http://downloads.xen.org/XCP/debian/xs-tools-5.9.960.iso -o xs-tools.iso +wget --no-check-certificate http://downloads.xen.org/XCP/debian/xs-tools-5.9.960.iso -O xs-tools.iso sudo mount -o loop xs-tools.iso /mnt #install the xs tools -sudo sh /mnt/Linux/install.sh +sudo yes | sudo sh /mnt/Linux/install.sh From bba79b6b4e20d67ee17259005853a3c1a59cea6b Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Fri, 26 Jul 2013 12:02:00 -0700 Subject: [PATCH 054/907] CLOUDSTACK-3710: Remove remaining overcommit fields from cluster UI --- ui/scripts/system.js | 30 ------------------------------ 1 file changed, 30 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 4e94b2ece1d..cbed773510b 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -10839,19 +10839,6 @@ } }, - cpuovercommit: { - label: 'CPU overcommit ratio', - defaultValue: '1' - - }, - - memoryovercommit: { - label: 'RAM overcommit ratio', - defaultValue: '1' - - }, - - isDedicated: { label: 'Dedicate', isBoolean: true, @@ -11132,15 +11119,6 @@ var clusterName = args.data.name; - if (args.data.cpuovercommit != "" && args.data.cpuovercommit > 0) { - - array1.push("&cpuovercommitratio=" + todb(args.data.cpuovercommit)); - - } - - if (args.data.memoryovercommit != "" && args.data.memoryovercommit > 0) - array1.push("&memoryovercommitratio=" + todb(args.data.memoryovercommit)); - if (args.data.hypervisor == "VMware") { array1.push("&username=" + todb(args.data.vCenterUsername)); array1.push("&password=" + todb(args.data.vCenterPassword)); @@ -11611,14 +11589,6 @@ clustertype: { label: 'label.cluster.type' }, - cpuovercommitratio: { - label: 'CPU overcommit Ratio', - isEditable: true - }, - memoryovercommitratio: { - label: 'Memory overcommit Ratio', - isEditable: true - }, //allocationstate: { label: 'label.allocation.state' }, //managedstate: { label: 'Managed State' }, state: { From 1a8270d9f4842c88e183533448f7220d0fc7d3df Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Fri, 26 Jul 2013 12:09:40 -0700 Subject: [PATCH 055/907] CLOUDSTACK-3825: Fix start/end port not being passed with protocol number --- ui/scripts/vpc.js | 2 -- 1 file changed, 2 deletions(-) diff --git a/ui/scripts/vpc.js b/ui/scripts/vpc.js index 94a42f571e0..669d70c8cec 100644 --- a/ui/scripts/vpc.js +++ b/ui/scripts/vpc.js @@ -358,8 +358,6 @@ protocol: args.data.protocolnumber }); delete args.data.protocolnumber; - delete args.data.startport; - delete args.data.endport; delete args.data.icmptype; delete args.data.icmpcode; } else { From 482c425193ea1ea2ea2f5919cb4bc363da0f028d Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 12:58:18 -0700 Subject: [PATCH 056/907] CLOUDSTACK-3820: UI > Infrastructure menu > zone detail > UCS > API command names have been changed. Here is related UI change. --- ui/scripts/system.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index cbed773510b..b40d695b696 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -14088,7 +14088,7 @@ }, dataProvider: function(args) { $.ajax({ - url: createURL('listUcsManager'), + url: createURL('listUcsManagers'), data: { zoneid: args.context.physicalResources[0].id }, @@ -14215,7 +14215,7 @@ }, dataProvider: function(args) { $.ajax({ - url: createURL('listUcsBlade'), + url: createURL('listUcsBlades'), data: { ucsmanagerid: args.context.ucsManagers[0].id }, @@ -14276,7 +14276,7 @@ var items = []; $.ajax({ - url: createURL('listUcsProfile'), + url: createURL('listUcsProfiles'), data: { ucsmanagerid: args.context.ucsManagers[0].id }, @@ -14319,7 +14319,7 @@ }, action: function(args) { $.ajax({ - url: createURL('associatesUcsProfileToBlade'), //This API has been changed from sync to async at 7/25/2013 + url: createURL('associateUcsProfileToBlade'), //This API has been changed from sync to async at 7/25/2013 data: { ucsmanagerid: args.context.ucsManagers[0].id, profiledn: args.data.profiledn, From 037c6958b8f498f3b198e7033fee5ca77530270a Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 13:06:42 -0700 Subject: [PATCH 057/907] CLOUDSTACK-3651: errortext in listVmwareDcs API response has been changed. Change UI to override error handling of listVmwareDcs API regardless of the content of errortext in API response. --- ui/scripts/system.js | 7 +------ 1 file changed, 1 insertion(+), 6 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index b40d695b696..94e0eb17e31 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -6488,12 +6488,7 @@ selectedZoneObj.vmwaredcId = vmwaredcs[0].id; } }, - error: function(XMLHttpResponse) { //override default error handling: cloudStack.dialog.notice({ message: parseXMLHttpResponse(XMLHttpResponse)}); - if(parseXMLHttpResponse(XMLHttpResponse) == 'The given command does not exist or it is not available for user') - return; //do nothing - else - cloudStack.dialog.notice({ message: parseXMLHttpResponse(XMLHttpResponse)}); //pop up error dialog box if the error is not 'The given command does not exist or it is not available for user' - } + error: function(XMLHttpResponse) {} //override default error handling: cloudStack.dialog.notice({ message: parseXMLHttpResponse(XMLHttpResponse)}); }); // for testing only (begin) From 199e861a51beec0a574309dba227df979b4d65f6 Mon Sep 17 00:00:00 2001 From: Min Chen Date: Fri, 26 Jul 2013 13:33:19 -0700 Subject: [PATCH 058/907] CLOUDSTACK-3856:[ZWPS] Template downloaded from ROOT volume is not seen in the UI because of failure to get hypervisor_type for the ROOT volume for zone-wide primary storage. --- .../com/cloud/storage/dao/VolumeDaoImpl.java | 21 +++++++++++-------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java index f87cd4eff44..7696bcce597 100755 --- a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -67,7 +67,10 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol ResourceTagDao _tagsDao; protected static final String SELECT_VM_SQL = "SELECT DISTINCT instance_id from volumes v where v.host_id = ? and v.mirror_state = ?"; - protected static final String SELECT_HYPERTYPE_FROM_VOLUME = "SELECT c.hypervisor_type from volumes v, storage_pool s, cluster c where v.pool_id = s.id and s.cluster_id = c.id and v.id = ?"; + // need to account for zone-wide primary storage where storage_pool has + // null-value pod and cluster, where hypervisor information is stored in + // storage_pool + protected static final String SELECT_HYPERTYPE_FROM_VOLUME = "SELECT s.hypervisor, c.hypervisor_type from volumes v, storage_pool s, cluster c where v.pool_id = s.id and s.cluster_id = c.id and v.id = ?"; private static final String ORDER_POOLS_NUMBER_OF_VOLUMES_FOR_ACCOUNT = "SELECT pool.id, SUM(IF(vol.state='Ready' AND vol.account_id = ?, 1, 0)) FROM `cloud`.`storage_pool` pool LEFT JOIN `cloud`.`volumes` vol ON pool.id = vol.pool_id WHERE pool.data_center_id = ? " + " AND pool.pod_id = ? AND pool.cluster_id = ? " + " GROUP BY pool.id ORDER BY 2 ASC "; @@ -109,8 +112,8 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol sc.setParameters("poolId", poolId); sc.setParameters("notDestroyed", Volume.State.Destroy); sc.setParameters("vType", Volume.Type.ROOT.toString()); - return listBy(sc); - } + return listBy(sc); + } @Override public List findByPoolId(long poolId, Volume.Type volumeType) { @@ -421,14 +424,14 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol if (dbVol != null) { StringBuilder str = new StringBuilder("Unable to update ").append(vo.toString()); str.append(": DB Data={id=").append(dbVol.getId()).append("; state=").append(dbVol.getState()) - .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=") - .append(dbVol.getUpdated()); + .append("; updatecount=").append(dbVol.getUpdatedCount()).append(";updatedTime=") + .append(dbVol.getUpdated()); 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.getUpdated()); + .append("; event=").append(event).append("; updatecount=").append(vo.getUpdatedCount()) + .append("; updatedTime=").append(vo.getUpdated()); str.append(": stale Data={id=").append(vo.getId()).append("; state=").append(currentState) - .append("; event=").append(event).append("; updatecount=").append(oldUpdated) - .append("; updatedTime=").append(oldUpdatedTime); + .append("; event=").append(event).append("; updatecount=").append(oldUpdated) + .append("; updatedTime=").append(oldUpdatedTime); } else { s_logger.debug("Unable to update volume: id=" + vo.getId() + ", as there is no such volume exists in the database anymore"); From 33aab256fc8e6ef0f565358b8503b90dfec3d68e Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 14:26:14 -0700 Subject: [PATCH 059/907] CLOUDSTACK-3820: UI > Infrastructrue menu > zone detail > UCS > update API response examples since API response has been changed. --- ui/scripts/system.js | 156 ++++++++++++++++++++++++++----------------- 1 file changed, 95 insertions(+), 61 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 94e0eb17e31..03a65d8b6b4 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -14215,38 +14215,46 @@ ucsmanagerid: args.context.ucsManagers[0].id }, success: function(json) { - var data = json.listucsbladeresponse.ucsblade ? json.listucsbladeresponse.ucsblade : []; - + //for testing only (begin) + /* + json = { + "listucsbladeresponse": { + "count": 4, + "ucsblade": [ + { + "id": "84edb958-cf8a-4e71-99c6-190ccc3fe2bd", + "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4", + "bladedn": "sys/chassis-1/blade-1", + "profiledn": "org-root/ls-profile-for-blade-1" + }, + { + "id": "524a3e55-5b61-4561-9464-1b19e3543189", + "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4", + "bladedn": "sys/chassis-1/blade-2", + "profiledn": "org-root/ls-profile-for-blade-2" + }, + { + "id": "4828f560-6191-46e6-8a4c-23d1d7d017f0", + "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4", + "bladedn": "sys/chassis-1/blade-3" + }, + { + "id": "80ab25c8-3dcf-400e-8849-84dc5e1e6594", + "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4", + "bladedn": "sys/chassis-1/blade-4" + } + ] + } + }; + */ + //for testing only (end) + + var data = json.listucsbladeresponse.ucsblade ? json.listucsbladeresponse.ucsblade : []; for (var i = 0; i < data.length; i++) { var array1 = data[i].bladedn.split('/'); data[i].chassis = array1[1]; data[i].bladeid = array1[2]; } - - - //for testing only (begin) - /* - var data = [ - { - "id": "58c84a1d-6e46-44e3-b7ec-abaa876d1be3", - "ucsmanagerid": "0c96f848-4306-47e5-a9ac-b76aad3557fb", - "bladedn": "sys/chassis-1/blade-1" - }, - { - "id": "de5abadf-f294-4014-9fed-7ee37a9b8724", - "ucsmanagerid": "0c96f848-4306-47e5-a9ac-b76aad3557fb", - "bladedn": "sys/chassis-1/blade-2" - } - ]; - for(var i = 0; i < data.length; i++) { - var array1 = data[i].bladedn.split('/'); - data[i].chassis = array1[1]; - data[i].bladeid = array1[2]; - } - */ - //for testing only (end) - - args.response.success({ data: data }); @@ -14276,8 +14284,35 @@ ucsmanagerid: args.context.ucsManagers[0].id }, async: false, - success: function(json) { //e.g. json == { "listucsprofileresponse" : { "count":1 ,"ucsprofile" : [ {"ucsdn":"org-root/ls-testProfile"} ] } } - var ucsprofiles = json.listucsprofileresponse.ucsprofile; + success: function(json) { + //for testing only (begin) + /* + json = { + "listucsprofileresponse": { + "count": 5, + "ucsprofile": [ + { + "ucsdn": "org-root/ls-profile-for-blade-2" + }, + { + "ucsdn": "org-root/ls-profile-for-blade-1" + }, + { + "ucsdn": "org-root/ls-simpleProfile" + }, + { + "ucsdn": "org-root/ls-testProfile" + }, + { + "ucsdn": "org-root/ls-UCS_Test" + } + ] + } + }; + */ + //for testing only (end) + + var ucsprofiles = json.listucsprofileresponse.ucsprofile; if (ucsprofiles != null) { for (var i = 0; i < ucsprofiles.length; i++) { items.push({ @@ -14321,17 +14356,16 @@ bladeid: args.context.blades[0].id }, success: function(json) { - //for testing only (begin) + //for testing only (begin) /* - json = - { - "associateucsprofiletobladeresponse": { - "jobid": "dff5fa7f-e4a7-457b-92f1-2fede357e3d5" - } - }; - */ + json = { + "associateucsprofiletobladeresponse": { + "jobid": "770bec68-7739-4127-8609-4b87bd7867d2" + } + } + */ //for testing only (end) - + var jid = json.associateucsprofiletobladeresponse.jobid; args.response.success({ _custom: { @@ -14339,30 +14373,30 @@ getUpdatedItem: function(json) { //for testing only (begin) /* - json = - { - "queryasyncjobresultresponse": { - "accountid": "b24f6866-f0ca-11e2-8c16-d637902e3581", - "userid": "b24f76df-f0ca-11e2-8c16-d637902e3581", - "cmd": "org.apache.cloudstack.api.AssociateUcsProfileToBladeCmd", - "jobstatus": 1, - "jobprocstatus": 0, - "jobresultcode": 0, - "jobresulttype": "object", - "jobresult": { - "ucsblade": { - "id": "84edb958-cf8a-4e71-99c6-190ccc3fe2bd", - "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4", - "bladedn": "sys/chassis-1/blade-1" - } - }, - "created": "2013-07-25T15:10:13-0700", - "jobid": "dff5fa7f-e4a7-457b-92f1-2fede357e3d5" - } - } + json = { + "queryasyncjobresultresponse": { + "accountid": "b24f6e36-f0ca-11e2-8c16-d637902e3581", + "userid": "b24f7d8d-f0ca-11e2-8c16-d637902e3581", + "cmd": "org.apache.cloudstack.api.AssociateUcsProfileToBladeCmd", + "jobstatus": 1, + "jobprocstatus": 0, + "jobresultcode": 0, + "jobresulttype": "object", + "jobresult": { + "ucsblade": { + "id": "80ab25c8-3dcf-400e-8849-84dc5e1e6594", + "ucsmanagerid": "07b5b813-83ed-4859-952c-c95cafb63ac4", + "bladedn": "sys/chassis-1/blade-4", + "profiledn": "org-root/ls-profile-for-blade-4" + } + }, + "created": "2013-07-26T13:53:01-0700", + "jobid": "770bec68-7739-4127-8609-4b87bd7867d2" + } + }; */ - //for testing only (end) - + //for testing only (end) + return json.queryasyncjobresultresponse.jobresult.ucsblade; } } From 1c2362c163e68041553b8307b421f1060166cd3a Mon Sep 17 00:00:00 2001 From: Brian Federle Date: Fri, 26 Jul 2013 14:29:55 -0700 Subject: [PATCH 060/907] Instance wizard: Fix logic preventing VPC network from being unchecked --- ui/scripts/ui-custom/instanceWizard.js | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/ui/scripts/ui-custom/instanceWizard.js b/ui/scripts/ui-custom/instanceWizard.js index c1407fedfbe..b9012ef2de4 100644 --- a/ui/scripts/ui-custom/instanceWizard.js +++ b/ui/scripts/ui-custom/instanceWizard.js @@ -123,10 +123,15 @@ $select.siblings('.single-select:visible').find('input[type=checkbox]') .attr('checked', false); - if (!$('input[name=new-network]:visible').is(':checked')) { + var $checkedOtherSelect = $otherSelects.filter(function() { + return $(this).not('.single-select') && + $(this).find('input[type=checkbox]:checked').size() && + $(this).find('input[type=radio]:checked').size(); + }); + + if (!$checkedOtherSelect.size() && + !$('.new-network:visible input[type=radio]:checked').size()) { $(this).closest('.select').find('input[type=radio]').click(); - } else { - $newNetwork.find('input[type=radio]').click(); } } From 81b121bbe0f042bdf97f105d38a11eef63f8e16e Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 14:44:01 -0700 Subject: [PATCH 061/907] CLOUDSTACK-3818: Cache Storage API commands have been renamed. Here is related UI change. --- ui/scripts/system.js | 16 ++++++++-------- ui/scripts/zoneWizard.js | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 03a65d8b6b4..14a71df5704 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -7371,11 +7371,11 @@ }; $.ajax({ - url: createURL('listCacheStores' + searchByArgs), + url: createURL('listSecondaryStagingStore' + searchByArgs), data: data, success: function(json) { args.response.success({ - data: json.listcachestoreresponse.imagestore + data: json.listsecondarystagingstoreresponse.imagestore }); }, error: function(json) { @@ -14869,7 +14869,7 @@ }; $.ajax({ - url: createURL('createCacheStore'), + url: createURL('createSecondaryStagingStore'), data: nfsCacheData, success: function(json) { //do nothing @@ -15157,10 +15157,10 @@ url: nfsURL(args.data.nfsServer, args.data.path) }; $.ajax({ - url: createURL('createCacheStore'), + url: createURL('createSecondaryStagingStore'), data: data, success: function(json) { - var item = json.createcachestoreresponse.secondarystorage; + var item = json.createsecondarystagingstoreresponse.secondarystorage; args.response.success({ data: item }); @@ -15202,7 +15202,7 @@ id: args.context.cacheStorage[0].id }; $.ajax({ - url: createURL('deleteCacheStore'), + url: createURL('deleteSecondaryStagingStore'), data: data, async: true, success: function(json) { @@ -15262,13 +15262,13 @@ dataProvider: function(args) { $.ajax({ - url: createURL('listCacheStores'), + url: createURL('listSecondaryStagingStore'), data: { id: args.context.cacheStorage[0].id }, async: false, success: function(json) { - var item = json.listcachestoreresponse.imagestore[0]; + var item = json.listsecondarystagingstoreresponse.imagestore[0]; args.response.success({ data: item }); diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js index 67f67d9f37d..10aa4864bc9 100755 --- a/ui/scripts/zoneWizard.js +++ b/ui/scripts/zoneWizard.js @@ -4171,7 +4171,7 @@ }; $.ajax({ - url: createURL('createCacheStore'), + url: createURL('createSecondaryStagingStore'), data: nfsCacheData, success: function(json) { //do nothing From f5e5b39c9bc8d0e719dbb27cb8228b868c6f726f Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 26 Jul 2013 15:01:58 -0700 Subject: [PATCH 062/907] Moved the DB layer code into framework-db and change only the necessary projects to refer to it. Cut down on the dependencies introduced with all the code in utils. --- api/pom.xml | 21 +++- .../api/response/ServiceOfferingResponse.java | 5 +- .../org/apache/cloudstack/usage/Usage.java | 13 +-- .../cloudstack/test/utils/SpringUtils.java | 0 awsapi/pom.xml | 5 + engine/api/pom.xml | 5 + engine/schema/pom.xml | 5 + engine/storage/integration-test/pom.xml | 2 +- framework/cluster/pom.xml | 5 + framework/db/pom.xml | 24 ++++ .../src/com/cloud/dao/EntityManagerImpl.java | 25 ----- .../crypt/EncryptionSecretKeyChanger.java | 0 .../db}/src/com/cloud/utils/db/Attribute.java | 0 .../cloud/utils/db/ConnectionConcierge.java | 0 .../utils/db/ConnectionConciergeMBean.java | 0 .../db}/src/com/cloud/utils/db/DB.java | 0 .../db}/src/com/cloud/utils/db/DbUtil.java | 0 .../db}/src/com/cloud/utils/db/EcInfo.java | 0 .../db}/src/com/cloud/utils/db/Encrypt.java | 0 .../db}/src/com/cloud/utils/db/Filter.java | 0 .../src/com/cloud/utils/db/GenericDao.java | 2 +- .../com/cloud/utils/db/GenericDaoBase.java | 0 .../cloud/utils/db/GenericSearchBuilder.java | 0 .../src/com/cloud/utils/db/GlobalLock.java | 0 .../db}/src/com/cloud/utils/db/GroupBy.java | 0 .../src/com/cloud/utils/db/JoinBuilder.java | 0 .../db}/src/com/cloud/utils/db/JoinType.java | 0 .../src/com/cloud/utils/db/Merovingian2.java | 0 .../com/cloud/utils/db/MerovingianMBean.java | 0 .../src/com/cloud/utils/db/ScriptRunner.java | 0 .../src/com/cloud/utils/db/SearchBuilder.java | 0 .../com/cloud/utils/db/SearchCriteria.java | 0 .../com/cloud/utils/db/SearchCriteria2.java | 6 +- .../cloud/utils/db/SearchCriteriaService.java | 0 .../com/cloud/utils/db/SequenceFetcher.java | 0 .../src/com/cloud/utils/db/SqlGenerator.java | 0 .../src/com/cloud/utils/db/StateMachine.java | 0 .../src/com/cloud/utils/db/Transaction.java | 0 .../cloud/utils/db/TransactionAttachment.java | 0 .../utils/db/TransactionContextBuilder.java | 0 .../com/cloud/utils/db/TransactionMBean.java | 0 .../cloud/utils/db/TransactionMBeanImpl.java | 0 .../src/com/cloud/utils/db/UpdateBuilder.java | 0 .../src/com/cloud/utils/db/UpdateFilter.java | 0 .../com/cloud/utils/db/DbAnnotatedBase.java | 0 .../utils/db/DbAnnotatedBaseDerived.java | 0 .../test/com/cloud/utils/db/DbTestDao.java | 0 .../test/com/cloud/utils/db/DbTestUtils.java | 0 .../db}/test/com/cloud/utils/db/DbTestVO.java | 0 .../com/cloud/utils/db/DummyComponent.java | 0 .../cloud/utils/db/ElementCollectionTest.java | 0 .../com/cloud/utils/db/GlobalLockTest.java | 4 +- .../com/cloud/utils/db/Merovingian2Test.java | 0 .../db/TransactionContextBuilderTest.java | 0 .../com/cloud/utils/db/TransactionTest.java | 0 plugins/hypervisors/vmware/pom.xml | 10 -- plugins/pom.xml | 2 +- server/pom.xml | 2 +- server/src/com/cloud/api/ApiDispatcher.java | 2 +- .../src/com/cloud/api/ApiResponseHelper.java | 74 ++++++------- usage/pom.xml | 2 +- utils/pom.xml | 5 - .../src/com/cloud/utils/AnnotationHelper.java | 57 ---------- .../src/com/cloud/utils/db/EntityManager.java | 33 ------ .../utils/log/CglibThrowableRendererTest.java | 104 ------------------ vmware-base/pom.xml | 5 + .../vmware/mo/HypervisorHostHelper.java | 81 +++++++------- 67 files changed, 159 insertions(+), 340 deletions(-) rename {utils => api}/test/org/apache/cloudstack/test/utils/SpringUtils.java (100%) rename {server => framework/db}/src/com/cloud/dao/EntityManagerImpl.java (85%) rename {utils => framework/db}/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/Attribute.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/ConnectionConcierge.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/ConnectionConciergeMBean.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/DB.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/DbUtil.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/EcInfo.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/Encrypt.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/Filter.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/GenericDao.java (99%) rename {utils => framework/db}/src/com/cloud/utils/db/GenericDaoBase.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/GenericSearchBuilder.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/GlobalLock.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/GroupBy.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/JoinBuilder.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/JoinType.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/Merovingian2.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/MerovingianMBean.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/ScriptRunner.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/SearchBuilder.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/SearchCriteria.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/SearchCriteria2.java (97%) rename {utils => framework/db}/src/com/cloud/utils/db/SearchCriteriaService.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/SequenceFetcher.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/SqlGenerator.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/StateMachine.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/Transaction.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/TransactionAttachment.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/TransactionContextBuilder.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/TransactionMBean.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/TransactionMBeanImpl.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/UpdateBuilder.java (100%) rename {utils => framework/db}/src/com/cloud/utils/db/UpdateFilter.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/DbAnnotatedBase.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/DbTestDao.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/DbTestUtils.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/DbTestVO.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/DummyComponent.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/ElementCollectionTest.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/GlobalLockTest.java (97%) rename {utils => framework/db}/test/com/cloud/utils/db/Merovingian2Test.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/TransactionContextBuilderTest.java (100%) rename {utils => framework/db}/test/com/cloud/utils/db/TransactionTest.java (100%) delete mode 100755 utils/src/com/cloud/utils/AnnotationHelper.java delete mode 100644 utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java diff --git a/api/pom.xml b/api/pom.xml index 8ca258f12e3..3867e718ca7 100644 --- a/api/pom.xml +++ b/api/pom.xml @@ -36,10 +36,27 @@ gson ${cs.gson.version}
+ + org.apache.cloudstack + cloud-framework-db + ${project.version} + test + install - src - test + + + org.apache.maven.plugins + maven-jar-plugin + + + + test-jar + + + + + diff --git a/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java index 288f76b4463..41a9b795923 100644 --- a/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java @@ -18,7 +18,7 @@ package org.apache.cloudstack.api.response; import java.util.Date; -import javax.persistence.Column; +import com.google.gson.annotations.SerializedName; import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; @@ -26,7 +26,6 @@ import org.apache.cloudstack.api.EntityReference; import com.cloud.offering.ServiceOffering; import com.cloud.serializer.Param; -import com.google.gson.annotations.SerializedName; @EntityReference(value = ServiceOffering.class) public class ServiceOfferingResponse extends BaseResponse { @@ -141,7 +140,7 @@ public class ServiceOfferingResponse extends BaseResponse { } public void setSystemVmType(String vmtype) { - this.vm_type = vmtype; + vm_type = vmtype; } diff --git a/api/src/org/apache/cloudstack/usage/Usage.java b/api/src/org/apache/cloudstack/usage/Usage.java index 23f9d42f08b..1bb1e906b51 100644 --- a/api/src/org/apache/cloudstack/usage/Usage.java +++ b/api/src/org/apache/cloudstack/usage/Usage.java @@ -16,19 +16,8 @@ // under the License. package org.apache.cloudstack.usage; -import org.apache.cloudstack.api.InternalIdentity; - 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; - public interface Usage { public long getId(); @@ -39,7 +28,7 @@ public interface Usage { public Long getDomainId(); - public String getDescription(); + public String getDescription(); public String getUsageDisplay(); diff --git a/utils/test/org/apache/cloudstack/test/utils/SpringUtils.java b/api/test/org/apache/cloudstack/test/utils/SpringUtils.java similarity index 100% rename from utils/test/org/apache/cloudstack/test/utils/SpringUtils.java rename to api/test/org/apache/cloudstack/test/utils/SpringUtils.java diff --git a/awsapi/pom.xml b/awsapi/pom.xml index 2fe208912d5..317d1cea2c6 100644 --- a/awsapi/pom.xml +++ b/awsapi/pom.xml @@ -289,6 +289,11 @@ javassist 3.9.0.GA + + org.apache.cloudstack + cloud-framework-db + ${project.version} + diff --git a/engine/api/pom.xml b/engine/api/pom.xml index 1b8f26c2320..ccea255333b 100644 --- a/engine/api/pom.xml +++ b/engine/api/pom.xml @@ -25,6 +25,11 @@ cloud-utils ${project.version} + + org.apache.cloudstack + cloud-framework-db + ${project.version} + org.apache.cloudstack cloud-api diff --git a/engine/schema/pom.xml b/engine/schema/pom.xml index da40d9cc4a3..a9ad13fd02d 100644 --- a/engine/schema/pom.xml +++ b/engine/schema/pom.xml @@ -43,6 +43,11 @@ cloud-engine-components-api ${project.version} + + org.apache.cloudstack + cloud-framework-db + ${project.version} + install diff --git a/engine/storage/integration-test/pom.xml b/engine/storage/integration-test/pom.xml index 4df44512e57..d082710134d 100644 --- a/engine/storage/integration-test/pom.xml +++ b/engine/storage/integration-test/pom.xml @@ -64,7 +64,7 @@ org.apache.cloudstack - cloud-utils + cloud-api ${project.version} test-jar test diff --git a/framework/cluster/pom.xml b/framework/cluster/pom.xml index 116b6353258..131511ddb38 100644 --- a/framework/cluster/pom.xml +++ b/framework/cluster/pom.xml @@ -24,5 +24,10 @@ cloud-utils ${project.version} + + org.apache.cloudstack + cloud-framework-db + ${project.version} + diff --git a/framework/db/pom.xml b/framework/db/pom.xml index b4011c7b7ea..c23f96fc2c4 100644 --- a/framework/db/pom.xml +++ b/framework/db/pom.xml @@ -19,10 +19,34 @@ ../pom.xml + + javax.ejb + ejb-api + ${cs.ejb.version} + + + org.eclipse.persistence + javax.persistence + ${cs.jpa.version} + org.apache.cloudstack cloud-utils ${project.version} + + + + org.apache.maven.plugins + maven-surefire-plugin + + + com/cloud/utils/testcase/*TestCase* + com/cloud/utils/db/*Test* + + + + + diff --git a/server/src/com/cloud/dao/EntityManagerImpl.java b/framework/db/src/com/cloud/dao/EntityManagerImpl.java similarity index 85% rename from server/src/com/cloud/dao/EntityManagerImpl.java rename to framework/db/src/com/cloud/dao/EntityManagerImpl.java index 14ea2bf0b71..bb493c0b795 100644 --- a/server/src/com/cloud/dao/EntityManagerImpl.java +++ b/framework/db/src/com/cloud/dao/EntityManagerImpl.java @@ -23,8 +23,6 @@ import java.util.Map; import javax.ejb.Local; import javax.naming.ConfigurationException; -import org.springframework.stereotype.Component; - import net.sf.ehcache.Cache; import com.cloud.utils.component.ManagerBase; @@ -35,7 +33,6 @@ import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; -@Component @Local(value=EntityManager.class) @SuppressWarnings("unchecked") public class EntityManagerImpl extends ManagerBase implements EntityManager { @@ -48,7 +45,6 @@ public class EntityManagerImpl extends ManagerBase implements EntityManager { return dao.findById(id); } - @Override public T findByIdIncludingRemoved(Class entityType, K id) { GenericDao dao = (GenericDao)GenericDaoBase.getDao(entityType); return dao.findByIdIncludingRemoved(id); @@ -61,7 +57,6 @@ public class EntityManagerImpl extends ManagerBase implements EntityManager { return dao.findByUuid(uuid); } - @Override public T findByUuidIncludingRemoved(Class entityType, String uuid) { // Finds and returns a unique VO using uuid, null if entity not found in db GenericDao dao = (GenericDao)GenericDaoBase.getDao(entityType); @@ -79,19 +74,16 @@ public class EntityManagerImpl extends ManagerBase implements EntityManager { return dao.listAll(); } - @Override public T persist(T t) { GenericDao dao = (GenericDao)GenericDaoBase.getDao((Class)t.getClass()); return dao.persist(t); } - @Override public SearchBuilder createSearchBuilder(Class entityType) { GenericDao dao = (GenericDao)GenericDaoBase.getDao(entityType); return dao.createSearchBuilder(); } - @Override public GenericSearchBuilder createGenericSearchBuilder(Class entityType, Class resultType) { GenericDao dao = (GenericDao)GenericDaoBase.getDao(entityType); return dao.createSearchBuilder((Class)resultType.getClass()); @@ -100,22 +92,6 @@ public class EntityManagerImpl extends ManagerBase implements EntityManager { @Override public boolean configure(String name, Map params) throws ConfigurationException { _name = name; - /* - String threadId = Long.toString(Thread.currentThread().getId()); - - CacheManager cm = CacheManager.create(); - - _cache = cm.getCache(threadId); - - if (_cache == null) { - int maxElements = NumbersUtil.parseInt((String)params.get("cache.size"), 100); - int live = NumbersUtil.parseInt((String)params.get("cache.time.to.live"), 300); - int idle = NumbersUtil.parseInt((String)params.get("cache.time.to.idle"), 300); - - _cache = new Cache(threadId, maxElements, false, live == -1, live == -1 ? Integer.MAX_VALUE : live, idle); - cm.addCache(_cache); - - }*/ return true; } @@ -135,7 +111,6 @@ public class EntityManagerImpl extends ManagerBase implements EntityManager { return _name; } - @Override public List search(Class entityType, SearchCriteria sc) { GenericDao dao = (GenericDao)GenericDaoBase.getDao(entityType); return dao.customSearch(sc, null); diff --git a/utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java b/framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java similarity index 100% rename from utils/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java rename to framework/db/src/com/cloud/utils/crypt/EncryptionSecretKeyChanger.java diff --git a/utils/src/com/cloud/utils/db/Attribute.java b/framework/db/src/com/cloud/utils/db/Attribute.java similarity index 100% rename from utils/src/com/cloud/utils/db/Attribute.java rename to framework/db/src/com/cloud/utils/db/Attribute.java diff --git a/utils/src/com/cloud/utils/db/ConnectionConcierge.java b/framework/db/src/com/cloud/utils/db/ConnectionConcierge.java similarity index 100% rename from utils/src/com/cloud/utils/db/ConnectionConcierge.java rename to framework/db/src/com/cloud/utils/db/ConnectionConcierge.java diff --git a/utils/src/com/cloud/utils/db/ConnectionConciergeMBean.java b/framework/db/src/com/cloud/utils/db/ConnectionConciergeMBean.java similarity index 100% rename from utils/src/com/cloud/utils/db/ConnectionConciergeMBean.java rename to framework/db/src/com/cloud/utils/db/ConnectionConciergeMBean.java diff --git a/utils/src/com/cloud/utils/db/DB.java b/framework/db/src/com/cloud/utils/db/DB.java similarity index 100% rename from utils/src/com/cloud/utils/db/DB.java rename to framework/db/src/com/cloud/utils/db/DB.java diff --git a/utils/src/com/cloud/utils/db/DbUtil.java b/framework/db/src/com/cloud/utils/db/DbUtil.java similarity index 100% rename from utils/src/com/cloud/utils/db/DbUtil.java rename to framework/db/src/com/cloud/utils/db/DbUtil.java diff --git a/utils/src/com/cloud/utils/db/EcInfo.java b/framework/db/src/com/cloud/utils/db/EcInfo.java similarity index 100% rename from utils/src/com/cloud/utils/db/EcInfo.java rename to framework/db/src/com/cloud/utils/db/EcInfo.java diff --git a/utils/src/com/cloud/utils/db/Encrypt.java b/framework/db/src/com/cloud/utils/db/Encrypt.java similarity index 100% rename from utils/src/com/cloud/utils/db/Encrypt.java rename to framework/db/src/com/cloud/utils/db/Encrypt.java diff --git a/utils/src/com/cloud/utils/db/Filter.java b/framework/db/src/com/cloud/utils/db/Filter.java similarity index 100% rename from utils/src/com/cloud/utils/db/Filter.java rename to framework/db/src/com/cloud/utils/db/Filter.java diff --git a/utils/src/com/cloud/utils/db/GenericDao.java b/framework/db/src/com/cloud/utils/db/GenericDao.java similarity index 99% rename from utils/src/com/cloud/utils/db/GenericDao.java rename to framework/db/src/com/cloud/utils/db/GenericDao.java index 1c830c85f5e..66d0f670370 100755 --- a/utils/src/com/cloud/utils/db/GenericDao.java +++ b/framework/db/src/com/cloud/utils/db/GenericDao.java @@ -215,7 +215,7 @@ public interface GenericDao { /** * Remove based on the search criteria. This will delete if the VO object - * does not have a REMOVED column. + * does not have a REMOVED column. * @param sc search criteria to match * @return rows removed. */ diff --git a/utils/src/com/cloud/utils/db/GenericDaoBase.java b/framework/db/src/com/cloud/utils/db/GenericDaoBase.java similarity index 100% rename from utils/src/com/cloud/utils/db/GenericDaoBase.java rename to framework/db/src/com/cloud/utils/db/GenericDaoBase.java diff --git a/utils/src/com/cloud/utils/db/GenericSearchBuilder.java b/framework/db/src/com/cloud/utils/db/GenericSearchBuilder.java similarity index 100% rename from utils/src/com/cloud/utils/db/GenericSearchBuilder.java rename to framework/db/src/com/cloud/utils/db/GenericSearchBuilder.java diff --git a/utils/src/com/cloud/utils/db/GlobalLock.java b/framework/db/src/com/cloud/utils/db/GlobalLock.java similarity index 100% rename from utils/src/com/cloud/utils/db/GlobalLock.java rename to framework/db/src/com/cloud/utils/db/GlobalLock.java diff --git a/utils/src/com/cloud/utils/db/GroupBy.java b/framework/db/src/com/cloud/utils/db/GroupBy.java similarity index 100% rename from utils/src/com/cloud/utils/db/GroupBy.java rename to framework/db/src/com/cloud/utils/db/GroupBy.java diff --git a/utils/src/com/cloud/utils/db/JoinBuilder.java b/framework/db/src/com/cloud/utils/db/JoinBuilder.java similarity index 100% rename from utils/src/com/cloud/utils/db/JoinBuilder.java rename to framework/db/src/com/cloud/utils/db/JoinBuilder.java diff --git a/utils/src/com/cloud/utils/db/JoinType.java b/framework/db/src/com/cloud/utils/db/JoinType.java similarity index 100% rename from utils/src/com/cloud/utils/db/JoinType.java rename to framework/db/src/com/cloud/utils/db/JoinType.java diff --git a/utils/src/com/cloud/utils/db/Merovingian2.java b/framework/db/src/com/cloud/utils/db/Merovingian2.java similarity index 100% rename from utils/src/com/cloud/utils/db/Merovingian2.java rename to framework/db/src/com/cloud/utils/db/Merovingian2.java diff --git a/utils/src/com/cloud/utils/db/MerovingianMBean.java b/framework/db/src/com/cloud/utils/db/MerovingianMBean.java similarity index 100% rename from utils/src/com/cloud/utils/db/MerovingianMBean.java rename to framework/db/src/com/cloud/utils/db/MerovingianMBean.java diff --git a/utils/src/com/cloud/utils/db/ScriptRunner.java b/framework/db/src/com/cloud/utils/db/ScriptRunner.java similarity index 100% rename from utils/src/com/cloud/utils/db/ScriptRunner.java rename to framework/db/src/com/cloud/utils/db/ScriptRunner.java diff --git a/utils/src/com/cloud/utils/db/SearchBuilder.java b/framework/db/src/com/cloud/utils/db/SearchBuilder.java similarity index 100% rename from utils/src/com/cloud/utils/db/SearchBuilder.java rename to framework/db/src/com/cloud/utils/db/SearchBuilder.java diff --git a/utils/src/com/cloud/utils/db/SearchCriteria.java b/framework/db/src/com/cloud/utils/db/SearchCriteria.java similarity index 100% rename from utils/src/com/cloud/utils/db/SearchCriteria.java rename to framework/db/src/com/cloud/utils/db/SearchCriteria.java diff --git a/utils/src/com/cloud/utils/db/SearchCriteria2.java b/framework/db/src/com/cloud/utils/db/SearchCriteria2.java similarity index 97% rename from utils/src/com/cloud/utils/db/SearchCriteria2.java rename to framework/db/src/com/cloud/utils/db/SearchCriteria2.java index 5875106363f..67e95b09244 100755 --- a/utils/src/com/cloud/utils/db/SearchCriteria2.java +++ b/framework/db/src/com/cloud/utils/db/SearchCriteria2.java @@ -49,7 +49,7 @@ public class SearchCriteria2 implements SearchCriteriaService, Metho protected SelectType _selectType; protected Class _entityBeanType; - protected SearchCriteria2(T entity, Class resultType, final Map attrs, GenericDao dao) { + protected SearchCriteria2(T entity, Class resultType, final Map attrs, GenericDao dao) { _entityBeanType = (Class)entity.getClass(); _dao = dao; _resultType = resultType; @@ -125,7 +125,7 @@ public class SearchCriteria2 implements SearchCriteriaService, Metho if (isSelectAll()) { return (List)_dao.search(sc1, null); } else { - return (List)_dao.customSearch(sc1, null); + return _dao.customSearch(sc1, null); } } @@ -135,7 +135,7 @@ public class SearchCriteria2 implements SearchCriteriaService, Metho @Override public T getEntity() { - return (T) _entity; + return _entity; } private SearchCriteria createSearchCriteria() { diff --git a/utils/src/com/cloud/utils/db/SearchCriteriaService.java b/framework/db/src/com/cloud/utils/db/SearchCriteriaService.java similarity index 100% rename from utils/src/com/cloud/utils/db/SearchCriteriaService.java rename to framework/db/src/com/cloud/utils/db/SearchCriteriaService.java diff --git a/utils/src/com/cloud/utils/db/SequenceFetcher.java b/framework/db/src/com/cloud/utils/db/SequenceFetcher.java similarity index 100% rename from utils/src/com/cloud/utils/db/SequenceFetcher.java rename to framework/db/src/com/cloud/utils/db/SequenceFetcher.java diff --git a/utils/src/com/cloud/utils/db/SqlGenerator.java b/framework/db/src/com/cloud/utils/db/SqlGenerator.java similarity index 100% rename from utils/src/com/cloud/utils/db/SqlGenerator.java rename to framework/db/src/com/cloud/utils/db/SqlGenerator.java diff --git a/utils/src/com/cloud/utils/db/StateMachine.java b/framework/db/src/com/cloud/utils/db/StateMachine.java similarity index 100% rename from utils/src/com/cloud/utils/db/StateMachine.java rename to framework/db/src/com/cloud/utils/db/StateMachine.java diff --git a/utils/src/com/cloud/utils/db/Transaction.java b/framework/db/src/com/cloud/utils/db/Transaction.java similarity index 100% rename from utils/src/com/cloud/utils/db/Transaction.java rename to framework/db/src/com/cloud/utils/db/Transaction.java diff --git a/utils/src/com/cloud/utils/db/TransactionAttachment.java b/framework/db/src/com/cloud/utils/db/TransactionAttachment.java similarity index 100% rename from utils/src/com/cloud/utils/db/TransactionAttachment.java rename to framework/db/src/com/cloud/utils/db/TransactionAttachment.java diff --git a/utils/src/com/cloud/utils/db/TransactionContextBuilder.java b/framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java similarity index 100% rename from utils/src/com/cloud/utils/db/TransactionContextBuilder.java rename to framework/db/src/com/cloud/utils/db/TransactionContextBuilder.java diff --git a/utils/src/com/cloud/utils/db/TransactionMBean.java b/framework/db/src/com/cloud/utils/db/TransactionMBean.java similarity index 100% rename from utils/src/com/cloud/utils/db/TransactionMBean.java rename to framework/db/src/com/cloud/utils/db/TransactionMBean.java diff --git a/utils/src/com/cloud/utils/db/TransactionMBeanImpl.java b/framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java similarity index 100% rename from utils/src/com/cloud/utils/db/TransactionMBeanImpl.java rename to framework/db/src/com/cloud/utils/db/TransactionMBeanImpl.java diff --git a/utils/src/com/cloud/utils/db/UpdateBuilder.java b/framework/db/src/com/cloud/utils/db/UpdateBuilder.java similarity index 100% rename from utils/src/com/cloud/utils/db/UpdateBuilder.java rename to framework/db/src/com/cloud/utils/db/UpdateBuilder.java diff --git a/utils/src/com/cloud/utils/db/UpdateFilter.java b/framework/db/src/com/cloud/utils/db/UpdateFilter.java similarity index 100% rename from utils/src/com/cloud/utils/db/UpdateFilter.java rename to framework/db/src/com/cloud/utils/db/UpdateFilter.java diff --git a/utils/test/com/cloud/utils/db/DbAnnotatedBase.java b/framework/db/test/com/cloud/utils/db/DbAnnotatedBase.java similarity index 100% rename from utils/test/com/cloud/utils/db/DbAnnotatedBase.java rename to framework/db/test/com/cloud/utils/db/DbAnnotatedBase.java diff --git a/utils/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java b/framework/db/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java similarity index 100% rename from utils/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java rename to framework/db/test/com/cloud/utils/db/DbAnnotatedBaseDerived.java diff --git a/utils/test/com/cloud/utils/db/DbTestDao.java b/framework/db/test/com/cloud/utils/db/DbTestDao.java similarity index 100% rename from utils/test/com/cloud/utils/db/DbTestDao.java rename to framework/db/test/com/cloud/utils/db/DbTestDao.java diff --git a/utils/test/com/cloud/utils/db/DbTestUtils.java b/framework/db/test/com/cloud/utils/db/DbTestUtils.java similarity index 100% rename from utils/test/com/cloud/utils/db/DbTestUtils.java rename to framework/db/test/com/cloud/utils/db/DbTestUtils.java diff --git a/utils/test/com/cloud/utils/db/DbTestVO.java b/framework/db/test/com/cloud/utils/db/DbTestVO.java similarity index 100% rename from utils/test/com/cloud/utils/db/DbTestVO.java rename to framework/db/test/com/cloud/utils/db/DbTestVO.java diff --git a/utils/test/com/cloud/utils/db/DummyComponent.java b/framework/db/test/com/cloud/utils/db/DummyComponent.java similarity index 100% rename from utils/test/com/cloud/utils/db/DummyComponent.java rename to framework/db/test/com/cloud/utils/db/DummyComponent.java diff --git a/utils/test/com/cloud/utils/db/ElementCollectionTest.java b/framework/db/test/com/cloud/utils/db/ElementCollectionTest.java similarity index 100% rename from utils/test/com/cloud/utils/db/ElementCollectionTest.java rename to framework/db/test/com/cloud/utils/db/ElementCollectionTest.java diff --git a/utils/test/com/cloud/utils/db/GlobalLockTest.java b/framework/db/test/com/cloud/utils/db/GlobalLockTest.java similarity index 97% rename from utils/test/com/cloud/utils/db/GlobalLockTest.java rename to framework/db/test/com/cloud/utils/db/GlobalLockTest.java index 01e1e332fc8..8d6ff41f519 100644 --- a/utils/test/com/cloud/utils/db/GlobalLockTest.java +++ b/framework/db/test/com/cloud/utils/db/GlobalLockTest.java @@ -22,10 +22,7 @@ import org.junit.runner.RunWith; import org.springframework.test.context.ContextConfiguration; import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; -import junit.framework.Assert; - import com.cloud.utils.Profiler; -import com.cloud.utils.testcase.Log4jEnabledTestCase; @RunWith(SpringJUnit4ClassRunner.class) @@ -42,6 +39,7 @@ public class GlobalLockTest { timeoutSeconds = timeout; jobDuration = duration; } + @Override public void run() { boolean locked = false; try { diff --git a/utils/test/com/cloud/utils/db/Merovingian2Test.java b/framework/db/test/com/cloud/utils/db/Merovingian2Test.java similarity index 100% rename from utils/test/com/cloud/utils/db/Merovingian2Test.java rename to framework/db/test/com/cloud/utils/db/Merovingian2Test.java diff --git a/utils/test/com/cloud/utils/db/TransactionContextBuilderTest.java b/framework/db/test/com/cloud/utils/db/TransactionContextBuilderTest.java similarity index 100% rename from utils/test/com/cloud/utils/db/TransactionContextBuilderTest.java rename to framework/db/test/com/cloud/utils/db/TransactionContextBuilderTest.java diff --git a/utils/test/com/cloud/utils/db/TransactionTest.java b/framework/db/test/com/cloud/utils/db/TransactionTest.java similarity index 100% rename from utils/test/com/cloud/utils/db/TransactionTest.java rename to framework/db/test/com/cloud/utils/db/TransactionTest.java diff --git a/plugins/hypervisors/vmware/pom.xml b/plugins/hypervisors/vmware/pom.xml index 755244f5f61..ad764117136 100644 --- a/plugins/hypervisors/vmware/pom.xml +++ b/plugins/hypervisors/vmware/pom.xml @@ -64,15 +64,5 @@ wsdl4j 1.4 - - junit - junit - 4.10 - - - org.mockito - mockito-all - 1.9.5 - diff --git a/plugins/pom.xml b/plugins/pom.xml index ff1e9c9c78d..e2f767a462c 100755 --- a/plugins/pom.xml +++ b/plugins/pom.xml @@ -77,7 +77,7 @@ org.apache.cloudstack - cloud-utils + cloud-api ${project.version} test-jar test diff --git a/server/pom.xml b/server/pom.xml index 484d603b0e2..20bcecedfc7 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -92,7 +92,7 @@ org.apache.cloudstack - cloud-utils + cloud-api ${project.version} test-jar test diff --git a/server/src/com/cloud/api/ApiDispatcher.java b/server/src/com/cloud/api/ApiDispatcher.java index 223c6b35999..65e21135369 100755 --- a/server/src/com/cloud/api/ApiDispatcher.java +++ b/server/src/com/cloud/api/ApiDispatcher.java @@ -352,7 +352,7 @@ public class ApiDispatcher { for (Class entity : entities) { // For backward compatibility, we search within removed entities and let service layer deal // with removed ones, return empty response or error - Object objVO = s_instance._entityMgr.findByUuidIncludingRemoved(entity, uuid); + Object objVO = s_instance._entityMgr.findByUuid(entity, uuid); if (objVO == null) { continue; } diff --git a/server/src/com/cloud/api/ApiResponseHelper.java b/server/src/com/cloud/api/ApiResponseHelper.java index f7b740bd3f8..c1ae7d0c3c3 100755 --- a/server/src/com/cloud/api/ApiResponseHelper.java +++ b/server/src/com/cloud/api/ApiResponseHelper.java @@ -31,6 +31,9 @@ import java.util.TimeZone; import javax.inject.Inject; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; + import org.apache.cloudstack.acl.ControlledEntity; import org.apache.cloudstack.acl.ControlledEntity.ACLType; import org.apache.cloudstack.affinity.AffinityGroup; @@ -70,6 +73,7 @@ import org.apache.cloudstack.api.response.HostForMigrationResponse; import org.apache.cloudstack.api.response.HostResponse; import org.apache.cloudstack.api.response.HypervisorCapabilitiesResponse; import org.apache.cloudstack.api.response.IPAddressResponse; +import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.InstanceGroupResponse; import org.apache.cloudstack.api.response.InternalLoadBalancerElementResponse; import org.apache.cloudstack.api.response.IpForwardingRuleResponse; @@ -86,7 +90,6 @@ import org.apache.cloudstack.api.response.NetworkOfferingResponse; import org.apache.cloudstack.api.response.NetworkResponse; import org.apache.cloudstack.api.response.NicResponse; import org.apache.cloudstack.api.response.NicSecondaryIpResponse; -import org.apache.cloudstack.api.response.ImageStoreResponse; import org.apache.cloudstack.api.response.PhysicalNetworkResponse; import org.apache.cloudstack.api.response.PodResponse; import org.apache.cloudstack.api.response.PortableIpRangeResponse; @@ -144,9 +147,6 @@ import org.apache.cloudstack.usage.Usage; import org.apache.cloudstack.usage.UsageService; import org.apache.cloudstack.usage.UsageTypes; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - import com.cloud.api.query.ViewResponseHelper; import com.cloud.api.query.vo.AccountJoinVO; import com.cloud.api.query.vo.AsyncJobJoinVO; @@ -301,9 +301,9 @@ public class ApiResponseHelper implements ResponseGenerator { public final Logger s_logger = Logger.getLogger(ApiResponseHelper.class); private static final DecimalFormat s_percentFormat = new DecimalFormat("##.##"); @Inject - private EntityManager _entityMgr = null; + private final EntityManager _entityMgr = null; @Inject - private UsageService _usageSvc = null; + private final UsageService _usageSvc = null; @Inject NetworkModel _ntwkModel; @Override @@ -831,7 +831,7 @@ public class ApiResponseHelper implements ResponseGenerator { capacityResponse.setCapacityType(capacity.getCapacityType()); capacityResponse.setCapacityUsed(capacity.getUsedCapacity()); if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_CPU) { - capacityResponse.setCapacityTotal(new Long((long) (capacity.getTotalCapacity()))); + capacityResponse.setCapacityTotal(new Long((capacity.getTotalCapacity()))); } else if (capacity.getCapacityType() == Capacity.CAPACITY_TYPE_STORAGE_ALLOCATED) { List c = ApiDBUtils.findNonSharedStorageForClusterPodZone(null, pod.getId(), null); capacityResponse.setCapacityTotal(capacity.getTotalCapacity() - c.get(0).getTotalCapacity()); @@ -1409,7 +1409,7 @@ public class ApiResponseHelper implements ResponseGenerator { templateResponse.setOsTypeName(""); } - final Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId()); + final Account account = ApiDBUtils.findAccountById(iso.getAccountId()); populateAccount(templateResponse, account.getId()); populateDomain(templateResponse, account.getDomainId()); @@ -1466,7 +1466,7 @@ public class ApiResponseHelper implements ResponseGenerator { isoResponse.setOsTypeId("-1"); isoResponse.setOsTypeName(""); } - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId()); + Account account = ApiDBUtils.findAccountById(iso.getAccountId()); populateAccount(isoResponse, account.getId()); populateDomain(isoResponse, account.getDomainId()); boolean isAdmin = false; @@ -1521,7 +1521,7 @@ public class ApiResponseHelper implements ResponseGenerator { isoResponse.setOsTypeName(""); } - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(iso.getAccountId()); + Account account = ApiDBUtils.findAccountById(iso.getAccountId()); populateAccount(isoResponse, account.getId()); populateDomain(isoResponse, account.getDomainId()); @@ -1578,7 +1578,7 @@ public class ApiResponseHelper implements ResponseGenerator { isoResponses.add(isoResponse); return isoResponses; } -*/ + */ @Override public SecurityGroupResponse createSecurityGroupResponse(SecurityGroup group) { @@ -1909,7 +1909,7 @@ public class ApiResponseHelper implements ResponseGenerator { regularAccounts.add(accountName); } else { // convert account to projectIds - Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId()); + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); if (project.getUuid() != null && !project.getUuid().isEmpty()) projectIds.add(project.getUuid()); @@ -2211,7 +2211,7 @@ public class ApiResponseHelper implements ResponseGenerator { } // populate network offering information - NetworkOffering networkOffering = (NetworkOffering) ApiDBUtils.findNetworkOfferingById(network.getNetworkOfferingId()); + NetworkOffering networkOffering = ApiDBUtils.findNetworkOfferingById(network.getNetworkOfferingId()); if (networkOffering != null) { response.setNetworkOfferingId(networkOffering.getUuid()); response.setNetworkOfferingName(networkOffering.getName()); @@ -2455,11 +2455,11 @@ public class ApiResponseHelper implements ResponseGenerator { // ControlledEntity id to uuid conversion are all done. // currently code is scattered in private void populateOwner(ControlledEntityResponse response, ControlledEntity object) { - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(object.getAccountId()); + Account account = ApiDBUtils.findAccountById(object.getAccountId()); if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { // find the project - Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId()); + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); response.setProjectId(project.getUuid()); response.setProjectName(project.getName()); } else { @@ -2485,10 +2485,10 @@ public class ApiResponseHelper implements ResponseGenerator { } private void populateAccount(ControlledEntityResponse response, long accountId) { - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(accountId); + Account account = ApiDBUtils.findAccountById(accountId); if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { // find the project - Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId()); + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); response.setProjectId(project.getUuid()); response.setProjectName(project.getName()); response.setAccountName(account.getAccountName()); @@ -3273,10 +3273,10 @@ public class ApiResponseHelper implements ResponseGenerator { public UsageRecordResponse createUsageResponse(Usage usageRecord) { UsageRecordResponse usageRecResponse = new UsageRecordResponse(); - Account account = ApiDBUtils.findAccountByIdIncludingRemoved(usageRecord.getAccountId()); + Account account = ApiDBUtils.findAccountById(usageRecord.getAccountId()); if (account.getType() == Account.ACCOUNT_TYPE_PROJECT) { //find the project - Project project = ApiDBUtils.findProjectByProjectAccountIdIncludingRemoved(account.getId()); + Project project = ApiDBUtils.findProjectByProjectAccountId(account.getId()); usageRecResponse.setProjectId(project.getUuid()); usageRecResponse.setProjectName(project.getName()); } else { @@ -3299,7 +3299,7 @@ public class ApiResponseHelper implements ResponseGenerator { usageRecResponse.setUsage(usageRecord.getUsageDisplay()); usageRecResponse.setUsageType(usageRecord.getUsageType()); if (usageRecord.getVmInstanceId() != null) { - VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId()); + VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, usageRecord.getVmInstanceId()); usageRecResponse.setVirtualMachineId(vm.getUuid()); } usageRecResponse.setVmName(usageRecord.getVmName()); @@ -3311,11 +3311,11 @@ public class ApiResponseHelper implements ResponseGenerator { } if(usageRecord.getUsageType() == UsageTypes.RUNNING_VM || usageRecord.getUsageType() == UsageTypes.ALLOCATED_VM){ - ServiceOfferingVO svcOffering = _entityMgr.findByIdIncludingRemoved(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); + ServiceOfferingVO svcOffering = _entityMgr.findById(ServiceOfferingVO.class, usageRecord.getOfferingId().toString()); //Service Offering Id usageRecResponse.setOfferingId(svcOffering.getUuid()); //VM Instance ID - VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); + VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(vm.getUuid()); //Hypervisor Type usageRecResponse.setType(usageRecord.getType()); @@ -3326,7 +3326,7 @@ public class ApiResponseHelper implements ResponseGenerator { //isSystem usageRecResponse.setSystem((usageRecord.getSize() == 1)?true:false); //IP Address ID - IPAddressVO ip = _entityMgr.findByIdIncludingRemoved(IPAddressVO.class, usageRecord.getUsageId().toString()); + IPAddressVO ip = _entityMgr.findById(IPAddressVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(ip.getUuid()); } else if(usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_SENT || usageRecord.getUsageType() == UsageTypes.NETWORK_BYTES_RECEIVED){ @@ -3334,15 +3334,15 @@ public class ApiResponseHelper implements ResponseGenerator { usageRecResponse.setType(usageRecord.getType()); if(usageRecord.getType().equals("DomainRouter")){ //Domain Router Id - VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getUsageId().toString()); + VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(vm.getUuid()); } else { //External Device Host Id - HostVO host = _entityMgr.findByIdIncludingRemoved(HostVO.class, usageRecord.getUsageId().toString()); + HostVO host = _entityMgr.findById(HostVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(host.getUuid()); } //Network ID - NetworkVO network = _entityMgr.findByIdIncludingRemoved(NetworkVO.class, usageRecord.getNetworkId().toString()); + NetworkVO network = _entityMgr.findById(NetworkVO.class, usageRecord.getNetworkId().toString()); usageRecResponse.setNetworkId(network.getUuid()); } else if(usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_READ || usageRecord.getUsageType() == UsageTypes.VM_DISK_IO_WRITE || @@ -3350,27 +3350,27 @@ public class ApiResponseHelper implements ResponseGenerator { //Device Type usageRecResponse.setType(usageRecord.getType()); //VM Instance Id - VMInstanceVO vm = _entityMgr.findByIdIncludingRemoved(VMInstanceVO.class, usageRecord.getVmInstanceId().toString()); + VMInstanceVO vm = _entityMgr.findById(VMInstanceVO.class, usageRecord.getVmInstanceId().toString()); usageRecResponse.setVirtualMachineId(vm.getUuid()); //Volume ID - VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); + VolumeVO volume = _entityMgr.findById(VolumeVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(volume.getUuid()); } else if(usageRecord.getUsageType() == UsageTypes.VOLUME){ //Volume ID - VolumeVO volume = _entityMgr.findByIdIncludingRemoved(VolumeVO.class, usageRecord.getUsageId().toString()); + VolumeVO volume = _entityMgr.findById(VolumeVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(volume.getUuid()); //Volume Size usageRecResponse.setSize(usageRecord.getSize()); //Disk Offering Id if(usageRecord.getOfferingId() != null){ - DiskOfferingVO diskOff = _entityMgr.findByIdIncludingRemoved(DiskOfferingVO.class, usageRecord.getOfferingId().toString()); + DiskOfferingVO diskOff = _entityMgr.findById(DiskOfferingVO.class, usageRecord.getOfferingId().toString()); usageRecResponse.setOfferingId(diskOff.getUuid()); } } else if(usageRecord.getUsageType() == UsageTypes.TEMPLATE || usageRecord.getUsageType() == UsageTypes.ISO){ //Template/ISO ID - VMTemplateVO tmpl = _entityMgr.findByIdIncludingRemoved(VMTemplateVO.class, usageRecord.getUsageId().toString()); + VMTemplateVO tmpl = _entityMgr.findById(VMTemplateVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(tmpl.getUuid()); //Template/ISO Size usageRecResponse.setSize(usageRecord.getSize()); @@ -3382,35 +3382,35 @@ public class ApiResponseHelper implements ResponseGenerator { } else if(usageRecord.getUsageType() == UsageTypes.SNAPSHOT){ //Snapshot ID - SnapshotVO snap = _entityMgr.findByIdIncludingRemoved(SnapshotVO.class, usageRecord.getUsageId().toString()); + SnapshotVO snap = _entityMgr.findById(SnapshotVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(snap.getUuid()); //Snapshot Size usageRecResponse.setSize(usageRecord.getSize()); } else if(usageRecord.getUsageType() == UsageTypes.LOAD_BALANCER_POLICY){ //Load Balancer Policy ID - LoadBalancerVO lb = _entityMgr.findByIdIncludingRemoved(LoadBalancerVO.class, usageRecord.getUsageId().toString()); + LoadBalancerVO lb = _entityMgr.findById(LoadBalancerVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(lb.getUuid()); } else if(usageRecord.getUsageType() == UsageTypes.PORT_FORWARDING_RULE){ //Port Forwarding Rule ID - PortForwardingRuleVO pf = _entityMgr.findByIdIncludingRemoved(PortForwardingRuleVO.class, usageRecord.getUsageId().toString()); + PortForwardingRuleVO pf = _entityMgr.findById(PortForwardingRuleVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(pf.getUuid()); } else if(usageRecord.getUsageType() == UsageTypes.NETWORK_OFFERING){ //Network Offering Id - NetworkOfferingVO netOff = _entityMgr.findByIdIncludingRemoved(NetworkOfferingVO.class, usageRecord.getOfferingId().toString()); + NetworkOfferingVO netOff = _entityMgr.findById(NetworkOfferingVO.class, usageRecord.getOfferingId().toString()); usageRecResponse.setOfferingId(netOff.getUuid()); //is Default usageRecResponse.setDefault((usageRecord.getUsageId() == 1)? true:false); } else if(usageRecord.getUsageType() == UsageTypes.VPN_USERS){ //VPN User ID - VpnUserVO vpnUser = _entityMgr.findByIdIncludingRemoved(VpnUserVO.class, usageRecord.getUsageId().toString()); + VpnUserVO vpnUser = _entityMgr.findById(VpnUserVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(vpnUser.getUuid()); } else if(usageRecord.getUsageType() == UsageTypes.SECURITY_GROUP){ //Security Group Id - SecurityGroupVO sg = _entityMgr.findByIdIncludingRemoved(SecurityGroupVO.class, usageRecord.getUsageId().toString()); + SecurityGroupVO sg = _entityMgr.findById(SecurityGroupVO.class, usageRecord.getUsageId().toString()); usageRecResponse.setUsageId(sg.getUuid()); } diff --git a/usage/pom.xml b/usage/pom.xml index af08f535294..2051d5eb5bf 100644 --- a/usage/pom.xml +++ b/usage/pom.xml @@ -28,7 +28,7 @@ org.apache.cloudstack - cloud-utils + cloud-api ${project.version} test-jar test diff --git a/utils/pom.xml b/utils/pom.xml index e8aa805d778..686afddc4b8 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -82,11 +82,6 @@ jsch ${cs.jsch.version} - - org.eclipse.persistence - javax.persistence - ${cs.jpa.version} - org.jasypt jasypt diff --git a/utils/src/com/cloud/utils/AnnotationHelper.java b/utils/src/com/cloud/utils/AnnotationHelper.java deleted file mode 100755 index e7a6166677e..00000000000 --- a/utils/src/com/cloud/utils/AnnotationHelper.java +++ /dev/null @@ -1,57 +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; - -import javax.persistence.Table; - -import org.apache.log4j.Logger; - - -public class AnnotationHelper extends Object { - // This class contains routines to help query annotation elements of objects. - - public static final Logger s_logger = Logger.getLogger(AnnotationHelper.class.getName()); - - public static String getTableName(Object proxyObj) { - // The cglib class is generated by cglib during runtime. - - Class curClass = proxyObj.getClass(); - if (curClass == null) { - s_logger.trace("Could not retrieve class information for proxy object"); - return null; - } - - while (curClass.getSuperclass() != null && curClass.getSuperclass().getName() != "java.lang.Object") { - curClass = curClass.getSuperclass(); - } - // At this point, curClass is the root base class of proxyObj's class, and curClass is not java.lang.Object. - - Table tabObj = curClass.getAnnotation(Table.class); - - if (tabObj == null) { - s_logger.trace(curClass + "does not have a Table annotation"); - return null; - } - - return tabObj.name(); - } - -} - - - - diff --git a/utils/src/com/cloud/utils/db/EntityManager.java b/utils/src/com/cloud/utils/db/EntityManager.java index 24e12f8ea1f..49f4f720698 100644 --- a/utils/src/com/cloud/utils/db/EntityManager.java +++ b/utils/src/com/cloud/utils/db/EntityManager.java @@ -34,16 +34,6 @@ public interface EntityManager { */ public T findById(Class entityType, K id); - /** - * Finds an entity by its id including removed. - * @param class of the entity you're trying to find. - * @param class of the id that the entity uses. - * @param entityType Type of the entity. - * @param id id value - * @return T if found; null if not. - */ - public T findByIdIncludingRemoved(Class entityType, K id); - /** * Finds a unique entity by uuid string * @param entity class @@ -53,15 +43,6 @@ public interface EntityManager { */ public T findByUuid(Class entityType, String uuid); - /** - * Finds a unique entity by uuid string - * @param entity class - * @param entityType type of entity you're looking for. - * @param uuid the unique id - * @return T if found, null if not. - */ - public T findByUuidIncludingRemoved(Class entityType, String uuid); - /** * Finds an entity by external id which is always String * @param entity class @@ -79,20 +60,6 @@ public interface EntityManager { */ public List list(Class entityType); - /** - * Persists the entity. - * @param entity class - * @param t entity - * @return persisted entity. Only use this after persisting. - */ - public T persist(T t); - - public SearchBuilder createSearchBuilder(Class entityType); - - public GenericSearchBuilder createGenericSearchBuilder(Class entityType, Class resultType); - - public List search(Class entityType, SearchCriteria sc); - public void remove(Class entityType, K id); } diff --git a/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java b/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java deleted file mode 100644 index 5e3571a8984..00000000000 --- a/utils/test/com/cloud/utils/log/CglibThrowableRendererTest.java +++ /dev/null @@ -1,104 +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.log; - -import junit.framework.TestCase; - -import org.apache.log4j.*; - -import com.cloud.utils.component.ComponentContext; -import com.cloud.utils.db.DB; -import com.cloud.utils.exception.CloudRuntimeException; -import org.apache.log4j.spi.RootLogger; -import org.apache.log4j.spi.ThrowableRenderer; -import org.junit.Test; -import org.junit.runner.RunWith; -import org.springframework.test.context.ContextConfiguration; -import org.springframework.test.context.junit4.SpringJUnit4ClassRunner; - -import java.io.CharArrayWriter; -import java.io.Writer; - -@RunWith(SpringJUnit4ClassRunner.class) -@ContextConfiguration(locations="classpath:/testContext.xml") -public class CglibThrowableRendererTest extends TestCase { - static Logger another = Logger.getLogger("TEST"); - - private final static Logger s_logger = Logger.getLogger(CglibThrowableRendererTest.class); - public static class TestClass { - - public TestClass() { - } - - @DB - public void exception1() { - throw new IllegalArgumentException("What a bad exception"); - } - public void exception2() { - try { - exception1(); - } catch (Exception e) { - throw new CloudRuntimeException("exception2", e); - } - } - @DB - public void exception() { - try { - exception2(); - } catch (Exception e) { - throw new CloudRuntimeException("exception", e); - } - } - } - - private Logger getAlternateLogger(Writer writer, ThrowableRenderer renderer) { - Hierarchy hierarchy = new Hierarchy(new RootLogger(Level.INFO)); - if (renderer != null) { - hierarchy.setThrowableRenderer(renderer); - } - Logger alternateRoot = hierarchy.getRootLogger(); - alternateRoot.addAppender(new WriterAppender(new SimpleLayout(), writer)); - return alternateRoot; - } - - @Test - public void testException() { - Writer w = new CharArrayWriter(); - Logger alt = getAlternateLogger(w, null); - - TestClass test = new TestClass(); - try { - test.exception(); - } catch (Exception e) { - alt.warn("exception caught", e); - } - // first check that we actually have some call traces containing "" - // assertTrue(w.toString().contains("")); - - w = new CharArrayWriter(); - alt = getAlternateLogger(w, new CglibThrowableRenderer()); - - try { - test.exception(); - } catch (Exception e) { - alt.warn("exception caught", e); - } - // then we check that CglibThrowableRenderer indeed remove those occurrences - assertFalse(w.toString().contains("")); - - } -} diff --git a/vmware-base/pom.xml b/vmware-base/pom.xml index c5d555e82b7..90e0709250f 100644 --- a/vmware-base/pom.xml +++ b/vmware-base/pom.xml @@ -32,6 +32,11 @@ cloud-utils ${project.version} + + org.apache.cloudstack + cloud-framework-db + ${project.version} + org.apache.cloudstack cloud-api diff --git a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java index dd0f88902d4..c92b8558737 100755 --- a/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java +++ b/vmware-base/src/com/cloud/hypervisor/vmware/mo/HypervisorHostHelper.java @@ -27,21 +27,6 @@ import java.util.Map; import org.apache.log4j.Logger; -import com.cloud.hypervisor.vmware.util.VmwareContext; -import com.cloud.hypervisor.vmware.util.VmwareHelper; -import com.cloud.network.Networks.BroadcastDomainType; -import com.cloud.utils.ActionDelegate; -import com.cloud.utils.Pair; -import com.cloud.utils.cisco.n1kv.vsm.NetconfHelper; -import com.cloud.utils.cisco.n1kv.vsm.PolicyMap; -import com.cloud.utils.cisco.n1kv.vsm.PortProfile; -import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.BindingType; -import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.OperationType; -import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.PortProfileType; -import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.SwitchPortMode; -import com.cloud.utils.db.GlobalLock; -import com.cloud.utils.exception.CloudRuntimeException; -import com.cloud.utils.net.NetUtils; import com.vmware.vim25.AlreadyExistsFaultMsg; import com.vmware.vim25.BoolPolicy; import com.vmware.vim25.DVPortSetting; @@ -79,6 +64,22 @@ import com.vmware.vim25.VmwareDistributedVirtualSwitchPvlanSpec; import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanIdSpec; import com.vmware.vim25.VmwareDistributedVirtualSwitchVlanSpec; +import com.cloud.hypervisor.vmware.util.VmwareContext; +import com.cloud.hypervisor.vmware.util.VmwareHelper; +import com.cloud.network.Networks.BroadcastDomainType; +import com.cloud.utils.ActionDelegate; +import com.cloud.utils.Pair; +import com.cloud.utils.cisco.n1kv.vsm.NetconfHelper; +import com.cloud.utils.cisco.n1kv.vsm.PolicyMap; +import com.cloud.utils.cisco.n1kv.vsm.PortProfile; +import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.BindingType; +import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.OperationType; +import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.PortProfileType; +import com.cloud.utils.cisco.n1kv.vsm.VsmCommand.SwitchPortMode; +import com.cloud.utils.db.GlobalLock; +import com.cloud.utils.exception.CloudRuntimeException; +import com.cloud.utils.net.NetUtils; + public class HypervisorHostHelper { private static final Logger s_logger = Logger.getLogger(HypervisorHostHelper.class); private static final int DEFAULT_LOCK_TIMEOUT_SECONDS = 600; @@ -446,29 +447,29 @@ public class HypervisorHostHelper { Integer vid = null; Integer spvlanid = null; // secondary pvlan id - /** This is the list of BroadcastDomainTypes we can actually + /** This is the list of BroadcastDomainTypes we can actually * prepare networks for in this function. */ - BroadcastDomainType[] supportedBroadcastTypes = - new BroadcastDomainType[] { BroadcastDomainType.Lswitch, - BroadcastDomainType.LinkLocal, - BroadcastDomainType.Native, + BroadcastDomainType[] supportedBroadcastTypes = + new BroadcastDomainType[] { BroadcastDomainType.Lswitch, + BroadcastDomainType.LinkLocal, + BroadcastDomainType.Native, BroadcastDomainType.Pvlan, BroadcastDomainType.Storage, BroadcastDomainType.UnDecided, BroadcastDomainType.Vlan }; if (!Arrays.asList(supportedBroadcastTypes).contains(broadcastDomainType)) { - throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType + + throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType + " it not supported on a VMWare hypervisor at this time."); } if (broadcastDomainType == BroadcastDomainType.Lswitch) { if (vSwitchType == VirtualSwitchType.NexusDistributedVirtualSwitch) { - throw new InvalidParameterException("Nexus Distributed Virtualswitch is not supported with BroadcastDomainType " + + throw new InvalidParameterException("Nexus Distributed Virtualswitch is not supported with BroadcastDomainType " + broadcastDomainType); } - /** + /** * Nicira NVP requires all vms to be connected to a single port-group. * A unique vlan needs to be set per port. This vlan is specific to * this implementation and has no reference to other vlans in CS @@ -552,7 +553,7 @@ public class HypervisorHostHelper { } long averageBandwidth = 0L; if (networkRateMbps != null && networkRateMbps.intValue() > 0) { - averageBandwidth = (long) (networkRateMbps.intValue() * 1024L * 1024L); + averageBandwidth = networkRateMbps.intValue() * 1024L * 1024L; } // We chose 50% higher allocation than average bandwidth. // TODO(sateesh): Optionally let user specify the peak coefficient @@ -601,7 +602,7 @@ public class HypervisorHostHelper { return vCenterApiVersion.compareTo(minVcenterApiVersionForFeature) >= 0 ? true : false; } - private static void setupPVlanPair(DistributedVirtualSwitchMO dvSwitchMo, ManagedObjectReference morDvSwitch, + private static void setupPVlanPair(DistributedVirtualSwitchMO dvSwitchMo, ManagedObjectReference morDvSwitch, Integer vid, Integer spvlanid) throws Exception { Map vlanmap = dvSwitchMo.retrieveVlanPvlan(vid, spvlanid, morDvSwitch); if (!vlanmap.isEmpty()) { @@ -664,7 +665,7 @@ public class HypervisorHostHelper { } - private static void createPortGroup(String physicalNetwork, String networkName, Integer vid, Integer spvlanid, DatacenterMO dataCenterMo, + private static void createPortGroup(String physicalNetwork, String networkName, Integer vid, Integer spvlanid, DatacenterMO dataCenterMo, DVSTrafficShapingPolicy shapingPolicy, DVSSecurityPolicy secPolicy, DistributedVirtualSwitchMO dvSwitchMo, int numPorts, boolean autoExpandSupported) throws Exception{ VmwareDistributedVirtualSwitchVlanSpec vlanSpec = null; VmwareDistributedVirtualSwitchPvlanSpec pvlanSpec = null; @@ -717,7 +718,7 @@ public class HypervisorHostHelper { throw new Exception(msg); } } - } + } } public static ManagedObjectReference waitForDvPortGroupReady( @@ -806,12 +807,12 @@ public class HypervisorHostHelper { LongPolicy burstSize = new LongPolicy(); isEnabled.setValue(true); - averageBandwidth.setValue((long) networkRateMbps.intValue() * 1024L * 1024L); + averageBandwidth.setValue(networkRateMbps.intValue() * 1024L * 1024L); // We chose 50% higher allocation than average bandwidth. // TODO(sateesh): Also let user specify the peak coefficient peakBandwidth.setValue((long) (averageBandwidth.getValue() * 1.5)); // TODO(sateesh): Also let user specify the burst coefficient - burstSize.setValue((long) (5 * averageBandwidth.getValue() / 8)); + burstSize.setValue(5 * averageBandwidth.getValue() / 8); shapingPolicy.setEnabled(isEnabled); shapingPolicy.setAverageBandwidth(averageBandwidth); @@ -889,25 +890,25 @@ public class HypervisorHostHelper { String networkName; Integer vid = null; - /** This is the list of BroadcastDomainTypes we can actually + /** This is the list of BroadcastDomainTypes we can actually * prepare networks for in this function. */ - BroadcastDomainType[] supportedBroadcastTypes = - new BroadcastDomainType[] { BroadcastDomainType.Lswitch, - BroadcastDomainType.LinkLocal, - BroadcastDomainType.Native, + BroadcastDomainType[] supportedBroadcastTypes = + new BroadcastDomainType[] { BroadcastDomainType.Lswitch, + BroadcastDomainType.LinkLocal, + BroadcastDomainType.Native, BroadcastDomainType.Pvlan, BroadcastDomainType.Storage, BroadcastDomainType.UnDecided, BroadcastDomainType.Vlan }; if (!Arrays.asList(supportedBroadcastTypes).contains(broadcastDomainType)) { - throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType + + throw new InvalidParameterException("BroadcastDomainType " + broadcastDomainType + " it not supported on a VMWare hypervisor at this time."); } if (broadcastDomainType == BroadcastDomainType.Lswitch) { - /** + /** * Nicira NVP requires each vm to have its own port-group with a dedicated * vlan. We'll set the name of the pg to the uuid of the nic. */ @@ -934,7 +935,7 @@ public class HypervisorHostHelper { if(networkRateMbps != null && networkRateMbps.intValue() > 0) { shapingPolicy = new HostNetworkTrafficShapingPolicy(); shapingPolicy.setEnabled(true); - shapingPolicy.setAverageBandwidth((long)networkRateMbps.intValue()*1024L*1024L); + shapingPolicy.setAverageBandwidth(networkRateMbps.intValue()*1024L*1024L); // // TODO : people may have different opinion on how to set the following @@ -1062,10 +1063,10 @@ public class HypervisorHostHelper { } private static void createNvpPortGroup(HostMO hostMo, HostVirtualSwitch vSwitch, String networkName, HostNetworkTrafficShapingPolicy shapingPolicy) throws Exception { - /** + /** * No portgroup created yet for this nic * We need to find an unused vlan and create the pg - * The vlan is limited to this vSwitch and the NVP vAPP, + * The vlan is limited to this vSwitch and the NVP vAPP, * so no relation to the other vlans in use in CloudStack. */ String vSwitchName = vSwitch.getName(); @@ -1096,7 +1097,7 @@ public class HypervisorHostHelper { secPolicy.setMacChanges(Boolean.FALSE); // Create a portgroup with the uuid of the nic and the vlanid found above - hostMo.createPortGroup(vSwitch, networkName, nvpVlanId, secPolicy, shapingPolicy); + hostMo.createPortGroup(vSwitch, networkName, nvpVlanId, secPolicy, shapingPolicy); } public static ManagedObjectReference waitForNetworkReady(HostMO hostMo, From c8cafb91a7f4e6be94fdcf98e21f87548fe6ce0a Mon Sep 17 00:00:00 2001 From: Min Chen Date: Fri, 26 Jul 2013 14:51:42 -0700 Subject: [PATCH 063/907] CLOUDSTACK-3818: NFS Cache Improperly Named. --- api/src/com/cloud/storage/StorageService.java | 8 +-- ...va => CreateSecondaryStagingStoreCmd.java} | 56 +++++++++---------- ...va => DeleteSecondaryStagingStoreCmd.java} | 14 ++--- ...ava => ListSecondaryStagingStoresCmd.java} | 20 +++---- .../apache/cloudstack/query/QueryService.java | 4 +- client/tomcatconf/commands.properties.in | 6 +- .../StorageCacheRandomAllocator.java | 2 +- .../vmware/manager/VmwareManagerImpl.java | 4 +- .../com/cloud/api/query/QueryManagerImpl.java | 6 +- .../cloud/server/ManagementServerImpl.java | 12 ++-- .../com/cloud/storage/StorageManagerImpl.java | 8 +-- tools/apidoc/gen_toc.py | 6 +- tools/marvin/marvin/deployDataCenter.py | 4 +- 13 files changed, 75 insertions(+), 75 deletions(-) rename api/src/org/apache/cloudstack/api/command/admin/storage/{CreateCacheStoreCmd.java => CreateSecondaryStagingStoreCmd.java} (66%) rename api/src/org/apache/cloudstack/api/command/admin/storage/{DeleteCacheStoreCmd.java => DeleteSecondaryStagingStoreCmd.java} (82%) rename api/src/org/apache/cloudstack/api/command/admin/storage/{ListCacheStoresCmd.java => ListSecondaryStagingStoresCmd.java} (75%) diff --git a/api/src/com/cloud/storage/StorageService.java b/api/src/com/cloud/storage/StorageService.java index 7c5b0a786c3..1ae1d3a7102 100644 --- a/api/src/com/cloud/storage/StorageService.java +++ b/api/src/com/cloud/storage/StorageService.java @@ -20,9 +20,9 @@ import java.net.UnknownHostException; import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; -import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd; +import org.apache.cloudstack.api.command.admin.storage.CreateSecondaryStagingStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd; -import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd; +import org.apache.cloudstack.api.command.admin.storage.DeleteSecondaryStagingStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd; import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd; @@ -50,7 +50,7 @@ public interface StorageService{ StoragePool createPool(CreateStoragePoolCmd cmd) throws ResourceInUseException, IllegalArgumentException, UnknownHostException, ResourceUnavailableException; - ImageStore createCacheStore(CreateCacheStoreCmd cmd); + ImageStore createSecondaryStagingStore(CreateSecondaryStagingStoreCmd cmd); /** * Delete the storage pool @@ -93,7 +93,7 @@ public interface StorageService{ boolean deleteImageStore(DeleteImageStoreCmd cmd); - boolean deleteCacheStore(DeleteCacheStoreCmd cmd); + boolean deleteSecondaryStagingStore(DeleteSecondaryStagingStoreCmd cmd); ImageStore discoverImageStore(AddImageStoreCmd cmd) throws IllegalArgumentException, DiscoveryException, InvalidParameterValueException; diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/CreateCacheStoreCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/CreateSecondaryStagingStoreCmd.java similarity index 66% rename from api/src/org/apache/cloudstack/api/command/admin/storage/CreateCacheStoreCmd.java rename to api/src/org/apache/cloudstack/api/command/admin/storage/CreateSecondaryStagingStoreCmd.java index f94207fda91..deaf6d9f1e5 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/storage/CreateCacheStoreCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/storage/CreateSecondaryStagingStoreCmd.java @@ -35,32 +35,32 @@ import java.util.HashMap; import java.util.Iterator; import java.util.Map; -@APICommand(name = "createCacheStore", description="create cache store.", responseObject=ImageStoreResponse.class) -public class CreateCacheStoreCmd extends BaseCmd { +@APICommand(name = "createSecondaryStagingStore", description = "create secondary staging store.", responseObject = ImageStoreResponse.class) +public class CreateSecondaryStagingStoreCmd extends BaseCmd { public static final Logger s_logger = Logger.getLogger(AddImageStoreCmd.class.getName()); - private static final String s_name = "createcachestoreresponse"; + private static final String s_name = "createsecondarystagingstoreresponse"; ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// - @Parameter(name=ApiConstants.URL, type=CommandType.STRING, required=true, description="the URL for the cache store") + @Parameter(name = ApiConstants.URL, type = CommandType.STRING, required = true, description = "the URL for the staging store") private String url; @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType=ZoneResponse.class, - description="the Zone ID for the image store") + description = "the Zone ID for the staging store") private Long zoneId; - @Parameter(name=ApiConstants.DETAILS, type=CommandType.MAP, description="the details for the image store") + @Parameter(name = ApiConstants.DETAILS, type = CommandType.MAP, description = "the details for the staging store") private Map details; @Parameter(name=ApiConstants.SCOPE, type=CommandType.STRING, - required=false, description="the scope of the image store: zone only for now") + required = false, description = "the scope of the staging store: zone only for now") private String scope; @Parameter(name=ApiConstants.PROVIDER, type=CommandType.STRING, - required=false, description="the cache store provider name") + required = false, description = "the staging store provider name") private String providerName; ///////////////////////////////////////////////////// @@ -75,25 +75,25 @@ public class CreateCacheStoreCmd extends BaseCmd { return zoneId; } - public Map getDetails() { - Map detailsMap = null; - if (details != null && !details.isEmpty()) { - detailsMap = new HashMap(); - Collection props = details.values(); - Iterator iter = props.iterator(); - while (iter.hasNext()) { - HashMap detail = (HashMap) iter.next(); - String key = detail.get("key"); - String value = detail.get("value"); - detailsMap.put(key, value); - } - } - return detailsMap; + public Map getDetails() { + Map detailsMap = null; + if (details != null && !details.isEmpty()) { + detailsMap = new HashMap(); + Collection props = details.values(); + Iterator iter = props.iterator(); + while (iter.hasNext()) { + HashMap detail = (HashMap) iter.next(); + String key = detail.get("key"); + String value = detail.get("value"); + detailsMap.put(key, value); + } + } + return detailsMap; } public String getScope() { return this.scope; - } + } public String getProviderName() { return this.providerName; @@ -117,13 +117,13 @@ public class CreateCacheStoreCmd extends BaseCmd { @Override public void execute(){ try{ - ImageStore result = _storageService.createCacheStore(this); + ImageStore result = _storageService.createSecondaryStagingStore(this); ImageStoreResponse storeResponse = null; if (result != null ) { - storeResponse = _responseGenerator.createImageStoreResponse(result); - storeResponse.setResponseName(getCommandName()); - storeResponse.setObjectName("secondarystorage"); - this.setResponseObject(storeResponse); + storeResponse = _responseGenerator.createImageStoreResponse(result); + storeResponse.setResponseName(getCommandName()); + storeResponse.setObjectName("secondarystorage"); + this.setResponseObject(storeResponse); } else { throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to add secondary storage"); } diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteSecondaryStagingStoreCmd.java similarity index 82% rename from api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java rename to api/src/org/apache/cloudstack/api/command/admin/storage/DeleteSecondaryStagingStoreCmd.java index 01d338562b4..ed3ebd861eb 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteCacheStoreCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/storage/DeleteSecondaryStagingStoreCmd.java @@ -28,18 +28,18 @@ import org.apache.log4j.Logger; import com.cloud.user.Account; -@APICommand(name = "deleteCacheStore", description = "Deletes a cache store .", responseObject = SuccessResponse.class, since = "4.2.0") -public class DeleteCacheStoreCmd extends BaseCmd { - public static final Logger s_logger = Logger.getLogger(DeleteCacheStoreCmd.class.getName()); +@APICommand(name = "deleteSecondaryStagingStore", description = "Deletes a secondary staging store .", responseObject = SuccessResponse.class, since = "4.2.0") +public class DeleteSecondaryStagingStoreCmd extends BaseCmd { + public static final Logger s_logger = Logger.getLogger(DeleteSecondaryStagingStoreCmd.class.getName()); - private static final String s_name = "deletecachestoreresponse"; + private static final String s_name = "deletesecondarystagingstoreresponse"; // /////////////////////////////////////////////////// // ////////////// API parameters ///////////////////// // /////////////////////////////////////////////////// @Parameter(name = ApiConstants.ID, type = CommandType.UUID, entityType = ImageStoreResponse.class, - required = true, description = "the cache store ID") + required = true, description = "the staging store ID") private Long id; @@ -68,12 +68,12 @@ public class DeleteCacheStoreCmd extends BaseCmd { @Override public void execute() { - boolean result = _storageService.deleteCacheStore(this); + boolean result = _storageService.deleteSecondaryStagingStore(this); if (result) { SuccessResponse response = new SuccessResponse(getCommandName()); this.setResponseObject(response); } else { - throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete image store"); + throw new ServerApiException(ApiErrorCode.INTERNAL_ERROR, "Failed to delete secondary staging store"); } } } diff --git a/api/src/org/apache/cloudstack/api/command/admin/storage/ListCacheStoresCmd.java b/api/src/org/apache/cloudstack/api/command/admin/storage/ListSecondaryStagingStoresCmd.java similarity index 75% rename from api/src/org/apache/cloudstack/api/command/admin/storage/ListCacheStoresCmd.java rename to api/src/org/apache/cloudstack/api/command/admin/storage/ListSecondaryStagingStoresCmd.java index 3909e8ec55c..2f81fb4c1e4 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/storage/ListCacheStoresCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/storage/ListSecondaryStagingStoresCmd.java @@ -25,31 +25,31 @@ import org.apache.cloudstack.api.response.ListResponse; import org.apache.cloudstack.api.response.ZoneResponse; import org.apache.log4j.Logger; -@APICommand(name = "listCacheStores", description="Lists cache stores.", responseObject=ImageStoreResponse.class, since = "4.2.0") -public class ListCacheStoresCmd extends BaseListCmd { - public static final Logger s_logger = Logger.getLogger(ListCacheStoresCmd.class.getName()); +@APICommand(name = "listSecondaryStagingStores", description = "Lists secondary staging stores.", responseObject = ImageStoreResponse.class, since = "4.2.0") +public class ListSecondaryStagingStoresCmd extends BaseListCmd { + public static final Logger s_logger = Logger.getLogger(ListSecondaryStagingStoresCmd.class.getName()); - private static final String s_name = "listcachestoreresponse"; + private static final String s_name = "listsecondarystagingstoreresponse"; ///////////////////////////////////////////////////// //////////////// API parameters ///////////////////// ///////////////////////////////////////////////////// - @Parameter(name=ApiConstants.NAME, type=CommandType.STRING, description="the name of the cache store") + @Parameter(name = ApiConstants.NAME, type = CommandType.STRING, description = "the name of the staging store") private String storeName; - @Parameter(name=ApiConstants.PROTOCOL, type=CommandType.STRING, description="the cache store protocol") + @Parameter(name = ApiConstants.PROTOCOL, type = CommandType.STRING, description = "the staging store protocol") private String protocol; - @Parameter(name=ApiConstants.PROVIDER, type=CommandType.STRING, description="the cache store provider") + @Parameter(name = ApiConstants.PROVIDER, type = CommandType.STRING, description = "the staging store provider") private String provider; @Parameter(name=ApiConstants.ZONE_ID, type=CommandType.UUID, entityType = ZoneResponse.class, - description="the Zone ID for the cache store") + description = "the Zone ID for the staging store") private Long zoneId; @Parameter(name=ApiConstants.ID, type=CommandType.UUID, entityType = ImageStoreResponse.class, - description="the ID of the cache store") + description = "the ID of the staging store") private Long id; ///////////////////////////////////////////////////// @@ -97,7 +97,7 @@ public class ListCacheStoresCmd extends BaseListCmd { @Override public void execute(){ - ListResponse response = _queryService.searchForCacheStores(this); + ListResponse response = _queryService.searchForSecondaryStagingStores(this); response.setResponseName(getCommandName()); this.setResponseObject(response); } diff --git a/api/src/org/apache/cloudstack/query/QueryService.java b/api/src/org/apache/cloudstack/query/QueryService.java index da843a9bddd..a203564418d 100644 --- a/api/src/org/apache/cloudstack/query/QueryService.java +++ b/api/src/org/apache/cloudstack/query/QueryService.java @@ -20,7 +20,7 @@ import org.apache.cloudstack.affinity.AffinityGroupResponse; import org.apache.cloudstack.api.command.admin.host.ListHostsCmd; import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd; import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; -import org.apache.cloudstack.api.command.admin.storage.ListCacheStoresCmd; +import org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListImageStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd; import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; @@ -81,7 +81,7 @@ public interface QueryService { public ListResponse searchForImageStores(ListImageStoresCmd cmd); - public ListResponse searchForCacheStores(ListCacheStoresCmd cmd); + public ListResponse searchForSecondaryStagingStores(ListSecondaryStagingStoresCmd cmd); public ListResponse searchForAccounts(ListAccountsCmd cmd); diff --git a/client/tomcatconf/commands.properties.in b/client/tomcatconf/commands.properties.in index 729dd23e762..fe3e4d9aad4 100644 --- a/client/tomcatconf/commands.properties.in +++ b/client/tomcatconf/commands.properties.in @@ -250,9 +250,9 @@ listS3s=1 addImageStore=1 listImageStores=1 deleteImageStore=1 -createCacheStore=1 -listCacheStores=1 -#deleteCacheStore=1 +createSecondaryStagingStore=1 +listSecondaryStagingStores=1 +deleteSecondaryStagingStore=1 #### host commands addHost=3 diff --git a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java index f244a0371b7..3b434d175fd 100644 --- a/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java +++ b/engine/storage/cache/src/org/apache/cloudstack/storage/cache/allocator/StorageCacheRandomAllocator.java @@ -46,7 +46,7 @@ public class StorageCacheRandomAllocator implements StorageCacheAllocator { List cacheStores = dataStoreMgr.getImageCacheStores(scope); if (cacheStores.size() <= 0) { - s_logger.debug("Can't find cache storage in zone: " + scope.getScopeId()); + s_logger.debug("Can't find staging storage in zone: " + scope.getScopeId()); return null; } diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java index 07e0fc0ee3f..0df2cd34d87 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/manager/VmwareManagerImpl.java @@ -472,12 +472,12 @@ public class VmwareManagerImpl extends ManagerBase implements VmwareManager, Vmw if (secUrl == null) { // we are using non-NFS image store, then use cache storage instead - s_logger.info("Secondary storage is not NFS, we need to use cache storage"); + s_logger.info("Secondary storage is not NFS, we need to use staging storage"); DataStore cacheStore = _dataStoreMgr.getImageCacheStore(dcId); if (cacheStore != null) { secUrl = cacheStore.getUri(); } else { - s_logger.warn("No cache storage is found when non-NFS secondary storage is used"); + s_logger.warn("No staging storage is found when non-NFS secondary storage is used"); } } diff --git a/server/src/com/cloud/api/query/QueryManagerImpl.java b/server/src/com/cloud/api/query/QueryManagerImpl.java index 33327db9038..45f1c691175 100644 --- a/server/src/com/cloud/api/query/QueryManagerImpl.java +++ b/server/src/com/cloud/api/query/QueryManagerImpl.java @@ -34,7 +34,7 @@ import org.apache.cloudstack.api.BaseListProjectAndAccountResourcesCmd; import org.apache.cloudstack.api.command.admin.host.ListHostsCmd; import org.apache.cloudstack.api.command.admin.internallb.ListInternalLBVMsCmd; import org.apache.cloudstack.api.command.admin.router.ListRoutersCmd; -import org.apache.cloudstack.api.command.admin.storage.ListCacheStoresCmd; +import org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListImageStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd; import org.apache.cloudstack.api.command.admin.user.ListUsersCmd; @@ -2107,7 +2107,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { } @Override - public ListResponse searchForCacheStores(ListCacheStoresCmd cmd) { + public ListResponse searchForSecondaryStagingStores(ListSecondaryStagingStoresCmd cmd) { Pair, Integer> result = searchForCacheStoresInternal(cmd); ListResponse response = new ListResponse(); @@ -2117,7 +2117,7 @@ public class QueryManagerImpl extends ManagerBase implements QueryService { return response; } - private Pair, Integer> searchForCacheStoresInternal(ListCacheStoresCmd cmd) { + private Pair, Integer> searchForCacheStoresInternal(ListSecondaryStagingStoresCmd cmd) { Long zoneId = _accountMgr.checkAccessAndSpecifyAuthority(CallContext.current().getCallingAccount(), cmd.getZoneId()); Object id = cmd.getId(); diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index 0bdb114bc4d..ecb8f85d71b 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -146,13 +146,13 @@ import org.apache.cloudstack.api.command.admin.router.UpgradeRouterCmd; import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.AddS3Cmd; import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; -import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd; +import org.apache.cloudstack.api.command.admin.storage.CreateSecondaryStagingStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd; -import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd; +import org.apache.cloudstack.api.command.admin.storage.DeleteSecondaryStagingStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd; import org.apache.cloudstack.api.command.admin.storage.FindStoragePoolsForMigrationCmd; -import org.apache.cloudstack.api.command.admin.storage.ListCacheStoresCmd; +import org.apache.cloudstack.api.command.admin.storage.ListSecondaryStagingStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListImageStoresCmd; import org.apache.cloudstack.api.command.admin.storage.ListS3sCmd; import org.apache.cloudstack.api.command.admin.storage.ListStoragePoolsCmd; @@ -2798,9 +2798,9 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe cmdList.add(AddImageStoreCmd.class); cmdList.add(ListImageStoresCmd.class); cmdList.add(DeleteImageStoreCmd.class); - cmdList.add(CreateCacheStoreCmd.class); - cmdList.add(ListCacheStoresCmd.class); - cmdList.add(DeleteCacheStoreCmd.class); + cmdList.add(CreateSecondaryStagingStoreCmd.class); + cmdList.add(ListSecondaryStagingStoresCmd.class); + cmdList.add(DeleteSecondaryStagingStoreCmd.class); cmdList.add(CreateApplicationLoadBalancerCmd.class); cmdList.add(ListApplicationLoadBalancersCmd.class); cmdList.add(DeleteApplicationLoadBalancerCmd.class); diff --git a/server/src/com/cloud/storage/StorageManagerImpl.java b/server/src/com/cloud/storage/StorageManagerImpl.java index 25aee8c6b93..20d5a625095 100755 --- a/server/src/com/cloud/storage/StorageManagerImpl.java +++ b/server/src/com/cloud/storage/StorageManagerImpl.java @@ -46,9 +46,9 @@ import org.springframework.stereotype.Component; import org.apache.cloudstack.api.command.admin.storage.AddImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CancelPrimaryStorageMaintenanceCmd; -import org.apache.cloudstack.api.command.admin.storage.CreateCacheStoreCmd; +import org.apache.cloudstack.api.command.admin.storage.CreateSecondaryStagingStoreCmd; import org.apache.cloudstack.api.command.admin.storage.CreateStoragePoolCmd; -import org.apache.cloudstack.api.command.admin.storage.DeleteCacheStoreCmd; +import org.apache.cloudstack.api.command.admin.storage.DeleteSecondaryStagingStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeleteImageStoreCmd; import org.apache.cloudstack.api.command.admin.storage.DeletePoolCmd; import org.apache.cloudstack.api.command.admin.storage.UpdateStoragePoolCmd; @@ -1797,7 +1797,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } @Override - public ImageStore createCacheStore(CreateCacheStoreCmd cmd) { + public ImageStore createSecondaryStagingStore(CreateSecondaryStagingStoreCmd cmd) { String providerName = cmd.getProviderName(); DataStoreProvider storeProvider = _dataStoreProviderMgr.getDataStoreProvider(providerName); @@ -1865,7 +1865,7 @@ public class StorageManagerImpl extends ManagerBase implements StorageManager, C } @Override - public boolean deleteCacheStore(DeleteCacheStoreCmd cmd) { + public boolean deleteSecondaryStagingStore(DeleteSecondaryStagingStoreCmd cmd) { long storeId = cmd.getId(); User caller = _accountMgr.getActiveUser(CallContext.current().getCallingUserId()); // Verify that cache store exists diff --git a/tools/apidoc/gen_toc.py b/tools/apidoc/gen_toc.py index 93328c34c13..506169c2969 100644 --- a/tools/apidoc/gen_toc.py +++ b/tools/apidoc/gen_toc.py @@ -145,9 +145,9 @@ known_categories = { 'addImageStore': 'Image Store', 'listImageStore': 'Image Store', 'deleteImageStore': 'Image Store', - 'createCacheStore': 'Image Store', - 'deleteCacheStore': 'Image Store', - 'listCacheStores': 'Image Store', + 'createSecondaryStagingStore': 'Image Store', + 'deleteSecondaryStagingStore': 'Image Store', + 'listSecondaryStagingStores': 'Image Store', 'InternalLoadBalancer': 'Internal LB', 'DeploymentPlanners': 'Configuration', 'PortableIp': 'Portable IP', diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index 279d4ee5785..ac07fa67ded 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -174,7 +174,7 @@ specify a valid config file" % cfgFile) if cacheStorages is None: return for cache in cacheStorages: - cachecmd = createCacheStore.createCacheStoreCmd() + cachecmd = createSecondaryStagingStore.createSecondaryStagingStoreCmd() cachecmd.url = cache.url cachecmd.provider = cache.provider cachecmd.zoneid = zoneId @@ -186,7 +186,7 @@ specify a valid config file" % cfgFile) 'key': key, 'value': value }) - self.apiClient.createCacheStore(cachecmd) + self.apiClient.createSecondaryStagingStore(cachecmd) def createnetworks(self, networks, zoneId): if networks is None: From a5194a63046db4f36d00da673c9e07e6ba48cede Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 15:15:27 -0700 Subject: [PATCH 064/907] CLOUDSTACK-3818: listSecondaryStagingStore API has been renamed. Here is related UI change. --- ui/scripts/system.js | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 14a71df5704..9b944a9e250 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -7371,7 +7371,7 @@ }; $.ajax({ - url: createURL('listSecondaryStagingStore' + searchByArgs), + url: createURL('listSecondaryStagingStores' + searchByArgs), data: data, success: function(json) { args.response.success({ @@ -15262,7 +15262,7 @@ dataProvider: function(args) { $.ajax({ - url: createURL('listSecondaryStagingStore'), + url: createURL('listSecondaryStagingStores'), data: { id: args.context.cacheStorage[0].id }, From 8280bf14e6dc3ac8054f1e0953befae9637f072f Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 15:29:18 -0700 Subject: [PATCH 065/907] CLOUDSTACK-3813: UI > change label from Cache Storage to Secondary Staging Store. --- ui/scripts/system.js | 18 +++++++++--------- ui/scripts/zoneWizard.js | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 9b944a9e250..353d4512149 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -14698,7 +14698,7 @@ }, createNfsCache: { - label: 'Create NFS Cache Storage', + label: 'Create NFS Secondary Staging Store', isBoolean: true, isChecked: true }, @@ -15052,7 +15052,7 @@ }, cacheStorage: { type: 'select', - title: 'Cache Storage', + title: 'Secondary Staging Store', listView: { id: 'secondarystorages', section: 'seconary-storage', @@ -15100,9 +15100,9 @@ actions: { add: { - label: 'Add NFS Cache Storage', + label: 'Add NFS Secondary Staging Store', createForm: { - title: 'Add NFS Cache Storage', + title: 'Add NFS Secondary Staging Store', fields: { zoneid: { label: 'Zone', @@ -15177,24 +15177,24 @@ }, messages: { notification: function(args) { - return 'Add NFS Cache Storage'; + return 'Add NFS Secondary Staging Store'; } } } }, detailView: { - name: 'Cache Storage details', + name: 'Secondary Staging Store details', isMaximized: true, actions: { remove: { - label: 'Delete Cache Storage', + label: 'Delete Secondary Staging Store', messages: { confirm: function(args) { - return 'Please confirm you want to delete cache storage.'; + return 'Please confirm you want to delete Secondary Staging Store.'; }, notification: function(args) { - return 'Delete Cache Storage'; + return 'Delete Secondary Staging Store'; } }, action: function(args) { diff --git a/ui/scripts/zoneWizard.js b/ui/scripts/zoneWizard.js index 10aa4864bc9..d9d1f39b944 100755 --- a/ui/scripts/zoneWizard.js +++ b/ui/scripts/zoneWizard.js @@ -1968,7 +1968,7 @@ }, createNfsCache: { - label: 'Create NFS Cache Storage', + label: 'Create NFS Secondary Staging Store', isBoolean: true, isChecked: true, isHidden: true From 8cac1e0443b08058f4d4ea2a3a9836b6bdd5bf15 Mon Sep 17 00:00:00 2001 From: Alena Prokharchyk Date: Fri, 26 Jul 2013 13:40:36 -0700 Subject: [PATCH 066/907] DB upgrade: upgraded the bunch of db upgrade files with Apache license header --- .../cloud/upgrade/dao/Upgrade303to304.java | 26 ++++++++----- .../cloud/upgrade/dao/Upgrade304to305.java | 26 ++++++++----- .../cloud/upgrade/dao/Upgrade305to306.java | 26 ++++++++----- .../cloud/upgrade/dao/Upgrade306to307.java | 26 ++++++++----- setup/db/db/schema-304to305-cleanup.sql | 28 ++++++++------ setup/db/db/schema-304to305.sql | 37 +++++++++++-------- setup/db/db/schema-305to306-cleanup.sql | 27 ++++++++------ setup/db/db/schema-305to306.sql | 27 ++++++++------ setup/db/db/schema-306to307.sql | 27 ++++++++------ setup/db/db/vmwaretmplinsert-304to305.sql | 27 ++++++++------ 10 files changed, 165 insertions(+), 112 deletions(-) diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java index 55328e2cc9c..5b928be4410 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade303to304.java @@ -1,13 +1,19 @@ -/*Copyright 2012 Citrix Systems, Inc. Licensed under the -Apache License, Version 2.0 (the "License"); you may not use this -file except in compliance with the License. Citrix Systems, Inc. -reserves all rights not expressly granted by 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.*/ +// 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; diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java index ecf0e8fb60a..f9b7e5ea94a 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade304to305.java @@ -1,13 +1,19 @@ -/*Copyright 2012 Citrix Systems, Inc. Licensed under the -Apache License, Version 2.0 (the "License"); you may not use this -file except in compliance with the License. Citrix Systems, Inc. -reserves all rights not expressly granted by 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.*/ +// 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; diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java index f801b55c34a..2016e21f154 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade305to306.java @@ -1,13 +1,19 @@ -/*Copyright 2012 Citrix Systems, Inc. Licensed under the -Apache License, Version 2.0 (the "License"); you may not use this -file except in compliance with the License. Citrix Systems, Inc. -reserves all rights not expressly granted by 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.*/ +// 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; diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java index cf47deafdac..586ff5fdb87 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade306to307.java @@ -1,13 +1,19 @@ -/*Copyright 2012 Citrix Systems, Inc. Licensed under the -Apache License, Version 2.0 (the "License"); you may not use this -file except in compliance with the License. Citrix Systems, Inc. -reserves all rights not expressly granted by 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.*/ +// 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; diff --git a/setup/db/db/schema-304to305-cleanup.sql b/setup/db/db/schema-304to305-cleanup.sql index 78aa425e614..b019ac2b521 100644 --- a/setup/db/db/schema-304to305-cleanup.sql +++ b/setup/db/db/schema-304to305-cleanup.sql @@ -1,15 +1,19 @@ -# Copyright 2012 Citrix Systems, Inc. Licensed under the -# Apache License, Version 2.0 (the "License"); you may not use this -# file except in compliance with the License. Citrix Systems, Inc. -# reserves all rights not expressly granted by 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. -# - +-- 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 cleanup from 3.0.4 to 3.0.5; diff --git a/setup/db/db/schema-304to305.sql b/setup/db/db/schema-304to305.sql index b1b49fdacac..58f45577f61 100755 --- a/setup/db/db/schema-304to305.sql +++ b/setup/db/db/schema-304to305.sql @@ -1,14 +1,19 @@ -# Copyright 2012 Citrix Systems, Inc. Licensed under the -# Apache License, Version 2.0 (the "License"); you may not use this -# file except in compliance with the License. Citrix Systems, Inc. -# reserves all rights not expressly granted by 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. -# +-- 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 3.0.4 to 3.0.5; @@ -372,13 +377,13 @@ UPDATE `cloud`.`configuration` SET component='TemplateManager' WHERE name='prima UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='storage.cleanup.enabled'; UPDATE `cloud`.`configuration` SET component='StorageManager' WHERE name='storage.cleanup.interval'; UPDATE `cloud`.`configuration` SET description='Comma separated list of cidrs internal to the datacenter that can host template download servers, please note 0.0.0.0 is not a valid site ' WHERE name='secstorage.allowed.internal.sites'; - -INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.vpngateway.connection.limit', '4', 'The maximum number of VPN connection per VPN gateway'); + +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.vpngateway.connection.limit', '4', 'The maximum number of VPN connection per VPN gateway'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'site2site.vpn.customergateway.subnets.limit', '10', 'The maximum number of subnets per customer gateway'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Usage', 'DEFAULT', 'management-server', 'traffic.sentinel.include.zones', 'EXTERNAL', 'Traffic going into specified list of zones is metered. For metering all traffic leave this parameter empty'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Usage', 'DEFAULT', 'management-server', 'traffic.sentinel.exclude.zones', '', 'Traffic going into specified list of zones is not metered'); -INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'ha.workers', '5', 'Number of ha worker threads'); - -DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_account`; +INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'management-server', 'ha.workers', '5', 'Number of ha worker threads'); + +DROP TABLE IF EXISTS `cloud`.`ovs_tunnel_account`; UPDATE `cloud`.`snapshots` set swift_id=null where swift_id=0; DELETE FROM `cloud`.`host_details` where name in ('storage.network.device1', 'storage.network.device2'); diff --git a/setup/db/db/schema-305to306-cleanup.sql b/setup/db/db/schema-305to306-cleanup.sql index ff70c7ce3bd..2afbc27b822 100644 --- a/setup/db/db/schema-305to306-cleanup.sql +++ b/setup/db/db/schema-305to306-cleanup.sql @@ -1,14 +1,19 @@ -# Copyright 2012 Citrix Systems, Inc. Licensed under the -# Apache License, Version 2.0 (the "License"); you may not use this -# file except in compliance with the License. Citrix Systems, Inc. -# reserves all rights not expressly granted by 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. -# +-- 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 cleanup from 3.0.5 to 3.0.6; diff --git a/setup/db/db/schema-305to306.sql b/setup/db/db/schema-305to306.sql index 960928174ad..1980b260086 100755 --- a/setup/db/db/schema-305to306.sql +++ b/setup/db/db/schema-305to306.sql @@ -1,14 +1,19 @@ -# Copyright 2012 Citrix Systems, Inc. Licensed under the -# Apache License, Version 2.0 (the "License"); you may not use this -# file except in compliance with the License. Citrix Systems, Inc. -# reserves all rights not expressly granted by 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. -# +-- 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 3.0.5 to 3.0.6; diff --git a/setup/db/db/schema-306to307.sql b/setup/db/db/schema-306to307.sql index b0fa1374c87..bad23c16bc0 100644 --- a/setup/db/db/schema-306to307.sql +++ b/setup/db/db/schema-306to307.sql @@ -1,14 +1,19 @@ -# Copyright 2012 Citrix Systems, Inc. Licensed under the -# Apache License, Version 2.0 (the "License"); you may not use this -# file except in compliance with the License. Citrix Systems, Inc. -# reserves all rights not expressly granted by 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. -# +-- 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 3.0.6 to 3.0.7; diff --git a/setup/db/db/vmwaretmplinsert-304to305.sql b/setup/db/db/vmwaretmplinsert-304to305.sql index 448c1721ddf..469d937e067 100755 --- a/setup/db/db/vmwaretmplinsert-304to305.sql +++ b/setup/db/db/vmwaretmplinsert-304to305.sql @@ -1,14 +1,19 @@ -# Copyright 2012 Citrix Systems, Inc. Licensed under the -# Apache License, Version 2.0 (the "License"); you may not use this -# file except in compliance with the License. Citrix Systems, Inc. -# reserves all rights not expressly granted by 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. -# +-- 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 compliances +-- 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 doesn't exist on 3.0.x branch. The fake template record is being inserted just because this template will never be used in 4.2 version of the code INSERT IGNORE INTO `cloud`.`vm_template` (unique_name, name, public, featured, type, hvm, bits, url, format, created, account_id, checksum, display_text, enable_password, From db82d5605db6ad27f7a7a8f2b0958162305f7a64 Mon Sep 17 00:00:00 2001 From: Jessica Wang Date: Fri, 26 Jul 2013 16:12:33 -0700 Subject: [PATCH 067/907] CLOUDSTACK-3820: UI > Infrastructure menu > zone detail > UCS > associate profile to blade action - poll async job result until async job is finished. --- ui/scripts/system.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/ui/scripts/system.js b/ui/scripts/system.js index 353d4512149..50cffb34776 100644 --- a/ui/scripts/system.js +++ b/ui/scripts/system.js @@ -14405,9 +14405,7 @@ }); }, notification: { - poll: function(args) { - args.complete(); - } + poll: pollAsyncJobResult } } } From a5e8c8aeb709717ff7c9eaa6c1a4a399e24250ea Mon Sep 17 00:00:00 2001 From: Prachi Damle Date: Fri, 26 Jul 2013 15:25:13 -0700 Subject: [PATCH 068/907] Fixing license headers --- .../entity/api/db/ClusterDetailsVO.java | 38 +++++++++-------- .../datacenter/entity/api/db/DcDetailVO.java | 38 +++++++++-------- .../entity/api/db/EngineClusterVO.java | 30 +++++++------ .../entity/api/db/EngineDataCenterVO.java | 38 +++++++++-------- .../entity/api/db/EngineHostPodVO.java | 28 +++++++------ .../entity/api/db/dao/DcDetailsDao.java | 34 ++++++++------- .../entity/api/db/dao/DcDetailsDaoImpl.java | 42 ++++++++++--------- .../entity/api/db/dao/EngineClusterDao.java | 28 +++++++------ .../api/db/dao/EngineClusterDaoImpl.java | 37 ++++++++-------- .../api/db/dao/EngineDataCenterDao.java | 36 +++++++++------- .../api/db/dao/EngineDataCenterDaoImpl.java | 40 ++++++++++-------- .../entity/api/db/dao/EngineHostPodDao.java | 26 +++++++----- .../api/db/dao/EngineHostPodDaoImpl.java | 41 +++++++++--------- 13 files changed, 253 insertions(+), 203 deletions(-) diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java index d735c47dc18..7c10de613a9 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/ClusterDetailsVO.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db; import javax.persistence.Column; @@ -27,19 +31,19 @@ public class ClusterDetailsVO { @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private long id; - + @Column(name="cluster_id") private long clusterId; - + @Column(name="name") private String name; - + @Column(name="value") private String value; - + protected ClusterDetailsVO() { } - + public ClusterDetailsVO(long clusterId, String name, String value) { this.clusterId = clusterId; this.name = name; diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java index ef59118ef81..903d39413bd 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/DcDetailVO.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db; import javax.persistence.Column; @@ -26,19 +30,19 @@ public class DcDetailVO { @GeneratedValue(strategy=GenerationType.IDENTITY) @Column(name="id") private long id; - + @Column(name="dc_id") private long dcId; - + @Column(name="name") private String name; - + @Column(name="value") private String value; - + protected DcDetailVO() { } - + public DcDetailVO(long dcId, String name, String value) { this.dcId = dcId; this.name = name; 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 21db144caee..86453a63af2 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 @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db; import java.util.Date; @@ -239,5 +243,5 @@ public class EngineClusterVO implements EngineCluster, Identity { public State getState() { return state; - } + } } 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 4ac0662692a..84f20c15309 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 @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. +// 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 // -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db; import java.util.Date; @@ -86,7 +90,7 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { private String domain; @Column(name="networktype") - @Enumerated(EnumType.STRING) + @Enumerated(EnumType.STRING) NetworkType networkType; @Column(name="dns_provider") @@ -115,7 +119,7 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { private long macAddress = 1; @Column(name="zone_token") - private String zoneToken; + private String zoneToken; @Column(name=GenericDao.REMOVED_COLUMN) private Date removed; @@ -131,7 +135,7 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { AllocationState allocationState; @Column(name="uuid") - private String uuid; + private String uuid; @Column(name="is_security_group_enabled") boolean securityGroupEnabled; @@ -199,7 +203,7 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { @Override public String getFirewallProvider() { - return firewallProvider; + return firewallProvider; } public void setFirewallProvider(String firewallProvider) { @@ -371,7 +375,7 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { return networkType; } - @Override + @Override public boolean isSecurityGroupEnabled() { return securityGroupEnabled; } @@ -396,7 +400,7 @@ public class EngineDataCenterVO implements EngineDataCenter, Identity { @Override public void setDetails(Map details2) { - details = details2; + details = details2; } public String getDetail(String name) { diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostPodVO.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostPodVO.java index 9fcc349da16..8c6b2d6428d 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostPodVO.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/EngineHostPodVO.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. +// 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 // -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db; import java.util.Date; @@ -82,7 +86,7 @@ public class EngineHostPodVO implements EnginePod, Identity { @Column(name="lastUpdated", updatable=true) @Temporal(value=TemporalType.TIMESTAMP) - protected Date lastUpdated; + protected Date lastUpdated; /** * Note that state is intentionally missing the setter. Any updates to diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java index ef1b3a0a57e..fc7636a86f8 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDao.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db.dao; import java.util.Map; @@ -18,11 +22,11 @@ import org.apache.cloudstack.engine.datacenter.entity.api.db.DcDetailVO; import com.cloud.utils.db.GenericDao; -public interface DcDetailsDao extends GenericDao { +public interface DcDetailsDao extends GenericDao { Map findDetails(long dcId); - + void persist(long dcId, Map details); - + DcDetailVO findDetail(long dcId, String name); void deleteDetails(long dcId); diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java index 60eec4cf913..2ace8a0fbcb 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/DcDetailsDaoImpl.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db.dao; import java.util.HashMap; @@ -32,12 +36,12 @@ import com.cloud.utils.db.Transaction; public class DcDetailsDaoImpl extends GenericDaoBase implements DcDetailsDao { protected final SearchBuilder DcSearch; protected final SearchBuilder DetailSearch; - + protected DcDetailsDaoImpl() { DcSearch = createSearchBuilder(); DcSearch.and("dcId", DcSearch.entity().getDcId(), SearchCriteria.Op.EQ); DcSearch.done(); - + DetailSearch = createSearchBuilder(); DetailSearch.and("dcId", DetailSearch.entity().getDcId(), SearchCriteria.Op.EQ); DetailSearch.and("name", DetailSearch.entity().getName(), SearchCriteria.Op.EQ); @@ -49,7 +53,7 @@ public class DcDetailsDaoImpl extends GenericDaoBase implement SearchCriteria sc = DetailSearch.create(); sc.setParameters("dcId", dcId); sc.setParameters("name", name); - + return findOneIncludingRemovedBy(sc); } @@ -57,7 +61,7 @@ public class DcDetailsDaoImpl extends GenericDaoBase implement public Map findDetails(long dcId) { SearchCriteria sc = DcSearch.create(); sc.setParameters("dcId", dcId); - + List results = search(sc, null); Map details = new HashMap(results.size()); for (DcDetailVO result : results) { @@ -65,12 +69,12 @@ public class DcDetailsDaoImpl extends GenericDaoBase implement } return details; } - + @Override public void deleteDetails(long dcId) { SearchCriteria sc = DcSearch.create(); sc.setParameters("dcId", dcId); - + List results = search(sc, null); for (DcDetailVO result : results) { remove(result.getId()); @@ -84,7 +88,7 @@ public class DcDetailsDaoImpl extends GenericDaoBase implement SearchCriteria sc = DcSearch.create(); sc.setParameters("dcId", dcId); expunge(sc); - + for (Map.Entry detail : details.entrySet()) { DcDetailVO vo = new DcDetailVO(dcId, detail.getKey(), detail.getValue()); persist(vo); diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDao.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDao.java index af1b1536e26..4cdad5f42ce 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDao.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDao.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db.dao; import java.util.List; diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java index 1f0bd4d84af..75d0bbddf57 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db.dao; import java.sql.PreparedStatement; @@ -35,7 +39,6 @@ import org.springframework.stereotype.Component; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.org.Grouping; import com.cloud.utils.db.GenericDaoBase; -import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @@ -98,13 +101,13 @@ public class EngineClusterDaoImpl extends GenericDaoBase StateChangeSearch = createSearchBuilder(); StateChangeSearch.and("id", StateChangeSearch.entity().getId(), SearchCriteria.Op.EQ); StateChangeSearch.and("state", StateChangeSearch.entity().getState(), SearchCriteria.Op.EQ); - StateChangeSearch.done(); + StateChangeSearch.done(); } @Override public List listByZoneId(long zoneId) { SearchCriteria sc = ZoneSearch.create(); - sc.setParameters("dataCenterId", zoneId); + sc.setParameters("dataCenterId", zoneId); return listBy(sc); } @@ -254,9 +257,9 @@ public class EngineClusterDaoImpl extends GenericDaoBase @Override public boolean updateState(State currentState, Event event, State nextState, DataCenterResourceEntity clusterEntity, Object data) { - + EngineClusterVO vo = findById(clusterEntity.getId()); - + Date oldUpdatedTime = vo.getLastUpdated(); SearchCriteria sc = StateChangeSearch.create(); diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java index 83060cfee2f..10fe70d3ccc 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDao.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db.dao; import java.util.List; @@ -24,7 +28,7 @@ import com.cloud.utils.fsm.StateDao; public interface EngineDataCenterDao extends GenericDao, StateDao { EngineDataCenterVO findByName(String name); - + /** * @param id data center id * @return a pair of mac address strings. The first one is private and second is public. @@ -39,13 +43,13 @@ public interface EngineDataCenterDao extends GenericDao listDisabledZones(); List listEnabledZones(); - EngineDataCenterVO findByToken(String zoneToken); + EngineDataCenterVO findByToken(String zoneToken); EngineDataCenterVO findByTokenOrIdOrName(String tokenIdOrName); - + List findZonesByDomainId(Long domainId, String keyword); diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java index f99bc6c0c09..5d8ef8d3243 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineDataCenterDaoImpl.java @@ -1,15 +1,19 @@ -// Copyright 2012 Citrix Systems, Inc. Licensed under the -// Apache License, Version 2.0 (the "License"); you may not use this -// file except in compliance with the License. Citrix Systems, Inc. -// reserves all rights not expressly granted by 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. -// -// Automatically generated by addcopyright.py at 04/03/2012 +// 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.engine.datacenter.entity.api.db.dao; import java.util.Date; @@ -75,7 +79,7 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase sc = TokenSearch.create(); @@ -87,7 +91,7 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase findZonesByDomainId(Long domainId){ SearchCriteria sc = ListZonesByDomainIdSearch.create(); sc.setParameters("domainId", domainId); - return listBy(sc); + return listBy(sc); } @Override @@ -100,7 +104,7 @@ public class EngineDataCenterDaoImpl extends GenericDaoBase UUIDSearch = createSearchBuilder(); UUIDSearch.and("uuid", UUIDSearch.entity().getUuid(), SearchCriteria.Op.EQ); UUIDSearch.done(); - + StateChangeSearch = createSearchBuilder(); StateChangeSearch.and("id", StateChangeSearch.entity().getId(), SearchCriteria.Op.EQ); StateChangeSearch.and("state", StateChangeSearch.entity().getState(), SearchCriteria.Op.EQ); @@ -123,7 +126,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase txn.start(); EngineHostPodVO pod = createForUpdate(); pod.setName(null); - + update(id, pod); boolean result = super.remove(id); @@ -139,7 +142,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase podIdSearch.and("allocationState", podIdSearch.entity().getAllocationState(), Op.EQ); podIdSearch.done(); - + SearchCriteria sc = podIdSearch.create(); sc.addAnd("dataCenterId", SearchCriteria.Op.EQ, zoneId); sc.addAnd("allocationState", SearchCriteria.Op.EQ, Grouping.AllocationState.Disabled); @@ -149,9 +152,9 @@ public class EngineHostPodDaoImpl extends GenericDaoBase @Override public boolean updateState(State currentState, Event event, State nextState, DataCenterResourceEntity podEntity, Object data) { - + EngineHostPodVO vo = findById(podEntity.getId()); - + Date oldUpdatedTime = vo.getLastUpdated(); SearchCriteria sc = StateChangeSearch.create(); @@ -163,7 +166,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase builder.set(vo, "lastUpdated", new Date()); int rows = update((EngineHostPodVO) vo, sc); - + if (rows == 0 && s_logger.isDebugEnabled()) { EngineHostPodVO dbDC = findByIdIncludingRemoved(vo.getId()); if (dbDC != null) { @@ -177,7 +180,7 @@ public class EngineHostPodDaoImpl extends GenericDaoBase } } return rows > 0; - + } From 72c46103afd162b5407d8124fc8c443b3dc38451 Mon Sep 17 00:00:00 2001 From: Prachi Damle Date: Fri, 26 Jul 2013 16:16:32 -0700 Subject: [PATCH 069/907] fixing imports --- .../datacenter/entity/api/db/dao/EngineClusterDaoImpl.java | 1 + .../datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java | 1 + 2 files changed, 2 insertions(+) diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java index 75d0bbddf57..c02bed0ff70 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineClusterDaoImpl.java @@ -39,6 +39,7 @@ import org.springframework.stereotype.Component; import com.cloud.hypervisor.Hypervisor.HypervisorType; import com.cloud.org.Grouping; import com.cloud.utils.db.GenericDaoBase; +import com.cloud.utils.db.GenericSearchBuilder; import com.cloud.utils.db.JoinBuilder; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; diff --git a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java index 5a6673a4c23..638d0bded05 100644 --- a/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java +++ b/engine/orchestration/src/org/apache/cloudstack/engine/datacenter/entity/api/db/dao/EngineHostPodDaoImpl.java @@ -36,6 +36,7 @@ import org.springframework.stereotype.Component; import com.cloud.org.Grouping; 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.UpdateBuilder; From 3f7c558de5ae684d62fd1e525444dfc4e10a8efd Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 26 Jul 2013 15:38:27 -0700 Subject: [PATCH 070/907] Removed all the extra mockito, inject, and junit dependencies. Changed any test/resource to test/resources and rely on the master pom to tell us where the resources are instead of each individual project --- engine/orchestration/pom.xml | 12 -- engine/service/pom.xml | 6 - engine/storage/cache/pom.xml | 12 -- engine/storage/datamotion/pom.xml | 10 - engine/storage/image/pom.xml | 16 -- engine/storage/integration-test/pom.xml | 17 -- .../resource/StorageAllocatorTestContext.xml | 45 ---- .../test/resource/component.xml | 192 ------------------ .../test/resource/s3_testng.xml | 47 ----- .../test/resource/storageContext.xml | 91 --------- .../integration-test/test/resource/testng.xml | 53 ----- engine/storage/pom.xml | 10 - engine/storage/snapshot/pom.xml | 19 -- .../resource/SnapshotManagerTestContext.xml | 42 ---- engine/storage/volume/pom.xml | 13 -- framework/ipc/pom.xml | 8 - plugins/api/discovery/pom.xml | 8 - plugins/api/rate-limit/pom.xml | 8 - plugins/hypervisors/ucs/pom.xml | 39 ++-- plugins/hypervisors/xen/pom.xml | 6 - plugins/network-elements/midonet/pom.xml | 6 - pom.xml | 6 + server/pom.xml | 1 - utils/pom.xml | 5 - 24 files changed, 18 insertions(+), 654 deletions(-) delete mode 100644 engine/storage/integration-test/test/resource/StorageAllocatorTestContext.xml delete mode 100644 engine/storage/integration-test/test/resource/component.xml delete mode 100644 engine/storage/integration-test/test/resource/s3_testng.xml delete mode 100644 engine/storage/integration-test/test/resource/storageContext.xml delete mode 100644 engine/storage/integration-test/test/resource/testng.xml delete mode 100644 engine/storage/snapshot/test/resource/SnapshotManagerTestContext.xml diff --git a/engine/orchestration/pom.xml b/engine/orchestration/pom.xml index c98373aa353..2ad6f0013a3 100755 --- a/engine/orchestration/pom.xml +++ b/engine/orchestration/pom.xml @@ -53,21 +53,9 @@ cloud-server ${project.version} - - org.mockito - mockito-all - 1.9.5 - - - javax.inject - javax.inject - 1 - install - src - test maven-surefire-plugin diff --git a/engine/service/pom.xml b/engine/service/pom.xml index 47c0edcefc0..b5812963ce6 100644 --- a/engine/service/pom.xml +++ b/engine/service/pom.xml @@ -30,12 +30,6 @@ Apache CloudStack Cloud Engine Service http://www.cloudstack.org - - junit - junit - 3.8.1 - test - org.apache.cloudstack cloud-engine-api diff --git a/engine/storage/cache/pom.xml b/engine/storage/cache/pom.xml index f00f6cd1498..58dd5b1e33d 100644 --- a/engine/storage/cache/pom.xml +++ b/engine/storage/cache/pom.xml @@ -31,20 +31,8 @@ ${cs.mysql.version} provided - - org.mockito - mockito-all - 1.9.5 - - - javax.inject - javax.inject - 1 - install - src - test diff --git a/engine/storage/datamotion/pom.xml b/engine/storage/datamotion/pom.xml index 8a3698c94d3..7306c0e4c79 100644 --- a/engine/storage/datamotion/pom.xml +++ b/engine/storage/datamotion/pom.xml @@ -43,16 +43,6 @@ ${cs.mysql.version} provided - - org.mockito - mockito-all - 1.9.5 - - - javax.inject - javax.inject - 1 - install diff --git a/engine/storage/image/pom.xml b/engine/storage/image/pom.xml index c4d2d1b2542..c5eef5e84f4 100644 --- a/engine/storage/image/pom.xml +++ b/engine/storage/image/pom.xml @@ -31,21 +31,5 @@ ${cs.mysql.version} provided - - org.mockito - mockito-all - 1.9.5 - - - - javax.inject - javax.inject - 1 - - - install - src - test - diff --git a/engine/storage/integration-test/pom.xml b/engine/storage/integration-test/pom.xml index d082710134d..40436d40c0e 100644 --- a/engine/storage/integration-test/pom.xml +++ b/engine/storage/integration-test/pom.xml @@ -128,16 +128,6 @@ ${cs.mysql.version} provided - - org.mockito - mockito-all - 1.9.5 - - - javax.inject - javax.inject - 1 - org.testng testng @@ -147,13 +137,6 @@ - install - ${project.basedir}/test - - - ${project.basedir}/test/resource - - maven-compiler-plugin diff --git a/engine/storage/integration-test/test/resource/StorageAllocatorTestContext.xml b/engine/storage/integration-test/test/resource/StorageAllocatorTestContext.xml deleted file mode 100644 index 1f5aa585f67..00000000000 --- a/engine/storage/integration-test/test/resource/StorageAllocatorTestContext.xml +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/storage/integration-test/test/resource/component.xml b/engine/storage/integration-test/test/resource/component.xml deleted file mode 100644 index d7fe9030e80..00000000000 --- a/engine/storage/integration-test/test/resource/component.xml +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/storage/integration-test/test/resource/s3_testng.xml b/engine/storage/integration-test/test/resource/s3_testng.xml deleted file mode 100644 index 017cc9ba2f0..00000000000 --- a/engine/storage/integration-test/test/resource/s3_testng.xml +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/storage/integration-test/test/resource/storageContext.xml b/engine/storage/integration-test/test/resource/storageContext.xml deleted file mode 100644 index f9c891a036f..00000000000 --- a/engine/storage/integration-test/test/resource/storageContext.xml +++ /dev/null @@ -1,91 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/storage/integration-test/test/resource/testng.xml b/engine/storage/integration-test/test/resource/testng.xml deleted file mode 100644 index fb4330999f3..00000000000 --- a/engine/storage/integration-test/test/resource/testng.xml +++ /dev/null @@ -1,53 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/storage/pom.xml b/engine/storage/pom.xml index cc561161602..ee52d22c5cb 100644 --- a/engine/storage/pom.xml +++ b/engine/storage/pom.xml @@ -61,16 +61,6 @@ ${cs.mysql.version} provided - - org.mockito - mockito-all - 1.9.5 - - - javax.inject - javax.inject - 1 - install diff --git a/engine/storage/snapshot/pom.xml b/engine/storage/snapshot/pom.xml index 350a9a9eed6..6c476a8c64f 100644 --- a/engine/storage/snapshot/pom.xml +++ b/engine/storage/snapshot/pom.xml @@ -36,24 +36,5 @@ ${cs.mysql.version} provided - - org.mockito - mockito-all - 1.9.5 - - - javax.inject - javax.inject - 1 - - - install - ${project.basedir}/test - - - ${project.basedir}/test/resource - - - diff --git a/engine/storage/snapshot/test/resource/SnapshotManagerTestContext.xml b/engine/storage/snapshot/test/resource/SnapshotManagerTestContext.xml deleted file mode 100644 index d99c2e2dbac..00000000000 --- a/engine/storage/snapshot/test/resource/SnapshotManagerTestContext.xml +++ /dev/null @@ -1,42 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - diff --git a/engine/storage/volume/pom.xml b/engine/storage/volume/pom.xml index 19357ab11e4..e8611267c17 100644 --- a/engine/storage/volume/pom.xml +++ b/engine/storage/volume/pom.xml @@ -31,21 +31,8 @@ ${cs.mysql.version} provided - - org.mockito - mockito-all - 1.9.5 - - - javax.inject - javax.inject - 1 - - install - src - test maven-surefire-plugin diff --git a/framework/ipc/pom.xml b/framework/ipc/pom.xml index 2c2131f01c1..b8c27749308 100644 --- a/framework/ipc/pom.xml +++ b/framework/ipc/pom.xml @@ -36,12 +36,4 @@ ${project.version} - - install - - - ${project.basedir}/test/resources - - - diff --git a/plugins/api/discovery/pom.xml b/plugins/api/discovery/pom.xml index 5d9ad75ea3a..3b48b42e923 100644 --- a/plugins/api/discovery/pom.xml +++ b/plugins/api/discovery/pom.xml @@ -42,14 +42,6 @@ - install - src - test - - - test/resources - - org.apache.maven.plugins diff --git a/plugins/api/rate-limit/pom.xml b/plugins/api/rate-limit/pom.xml index 5645f0b3a32..49cc574a3a0 100644 --- a/plugins/api/rate-limit/pom.xml +++ b/plugins/api/rate-limit/pom.xml @@ -27,14 +27,6 @@ ../../pom.xml - install - src - test - - - test/resources - - org.apache.maven.plugins diff --git a/plugins/hypervisors/ucs/pom.xml b/plugins/hypervisors/ucs/pom.xml index 24bdc948e73..fcfa505cd85 100755 --- a/plugins/hypervisors/ucs/pom.xml +++ b/plugins/hypervisors/ucs/pom.xml @@ -1,25 +1,16 @@ - - + + xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> 4.0.0 org.apache.cloudstack @@ -36,12 +27,6 @@ UTF-8 - - junit - junit - 3.8.1 - test - org.apache.cloudstack cloud-utils diff --git a/plugins/hypervisors/xen/pom.xml b/plugins/hypervisors/xen/pom.xml index 72d32f3029c..5ef9bd8dc25 100644 --- a/plugins/hypervisors/xen/pom.xml +++ b/plugins/hypervisors/xen/pom.xml @@ -40,12 +40,6 @@ org.apache.cloudstack xapi ${cs.xapi.version} - - - junit - junit - - diff --git a/plugins/network-elements/midonet/pom.xml b/plugins/network-elements/midonet/pom.xml index bfd59a9274c..154999b1691 100644 --- a/plugins/network-elements/midonet/pom.xml +++ b/plugins/network-elements/midonet/pom.xml @@ -39,12 +39,6 @@ midonet-client 12.12.2 - - org.mockito - mockito-all - 1.9.5 - test - org.apache.cloudstack cloud-plugin-hypervisor-kvm diff --git a/pom.xml b/pom.xml index 74c1ceb0afe..6296f378cd0 100644 --- a/pom.xml +++ b/pom.xml @@ -180,6 +180,7 @@ mysql mysql-connector-java ${cs.mysql.version} + provided log4j @@ -206,6 +207,11 @@ spring-beans ${org.springframework.version} + + javax.inject + javax.inject + 1 + org.mockito mockito-all diff --git a/server/pom.xml b/server/pom.xml index 20bcecedfc7..f5617b9ba81 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -119,7 +119,6 @@ - install resources diff --git a/utils/pom.xml b/utils/pom.xml index 686afddc4b8..cb18fc226a1 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -32,11 +32,6 @@ spring-context ${org.springframework.version} - - javax.inject - javax.inject - 1 - log4j log4j From 1834e8147627b6ce9d1f14db7fae0a411210d186 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 26 Jul 2013 15:38:57 -0700 Subject: [PATCH 071/907] Added the missing directories --- .../resources/StorageAllocatorTestContext.xml | 45 ++++ .../test/resources/component.xml | 192 ++++++++++++++++++ .../test/resources/s3_testng.xml | 47 +++++ .../test/resources/storageContext.xml | 91 +++++++++ .../test/resources/testng.xml | 53 +++++ .../resources/SnapshotManagerTestContext.xml | 42 ++++ 6 files changed, 470 insertions(+) create mode 100644 engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml create mode 100644 engine/storage/integration-test/test/resources/component.xml create mode 100644 engine/storage/integration-test/test/resources/s3_testng.xml create mode 100644 engine/storage/integration-test/test/resources/storageContext.xml create mode 100644 engine/storage/integration-test/test/resources/testng.xml create mode 100644 engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml diff --git a/engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml b/engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml new file mode 100644 index 00000000000..1f5aa585f67 --- /dev/null +++ b/engine/storage/integration-test/test/resources/StorageAllocatorTestContext.xml @@ -0,0 +1,45 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/storage/integration-test/test/resources/component.xml b/engine/storage/integration-test/test/resources/component.xml new file mode 100644 index 00000000000..d7fe9030e80 --- /dev/null +++ b/engine/storage/integration-test/test/resources/component.xml @@ -0,0 +1,192 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/storage/integration-test/test/resources/s3_testng.xml b/engine/storage/integration-test/test/resources/s3_testng.xml new file mode 100644 index 00000000000..017cc9ba2f0 --- /dev/null +++ b/engine/storage/integration-test/test/resources/s3_testng.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/storage/integration-test/test/resources/storageContext.xml b/engine/storage/integration-test/test/resources/storageContext.xml new file mode 100644 index 00000000000..f9c891a036f --- /dev/null +++ b/engine/storage/integration-test/test/resources/storageContext.xml @@ -0,0 +1,91 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/storage/integration-test/test/resources/testng.xml b/engine/storage/integration-test/test/resources/testng.xml new file mode 100644 index 00000000000..fb4330999f3 --- /dev/null +++ b/engine/storage/integration-test/test/resources/testng.xml @@ -0,0 +1,53 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml b/engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml new file mode 100644 index 00000000000..d99c2e2dbac --- /dev/null +++ b/engine/storage/snapshot/test/resources/SnapshotManagerTestContext.xml @@ -0,0 +1,42 @@ + + + + + + + + + + + + + + + + + + + + + + From b17b40bbfef96b1908513ed4570ad2e5cb0cac9e Mon Sep 17 00:00:00 2001 From: Min Chen Date: Fri, 26 Jul 2013 17:45:05 -0700 Subject: [PATCH 072/907] CLOUDSTACK-3857:[Object_Store_Refactor][Usage] Two VOLUME_CREATE usage events are generated for one data disk after creating and attaching to VM. --- server/src/com/cloud/storage/VolumeManagerImpl.java | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java index c2d581b33c8..e6d403cd275 100644 --- a/server/src/com/cloud/storage/VolumeManagerImpl.java +++ b/server/src/com/cloud/storage/VolumeManagerImpl.java @@ -34,6 +34,7 @@ import javax.naming.ConfigurationException; import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; + import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd; import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd; @@ -1033,15 +1034,6 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { } volume = _volsDao.persist(volume); - if (cmd.getSnapshotId() == null) { - // for volume created from snapshot, create usage event after volume - // creation - UsageEventVO usageEvent = new UsageEventVO( - EventTypes.EVENT_VOLUME_CREATE, volume.getAccountId(), - volume.getDataCenterId(), volume.getId(), volume.getName(), - diskOfferingId, null, size); - _usageEventDao.persist(usageEvent); - } CallContext.current().setEventDetails("Volume Id: " + volume.getId()); From c2752ba93cec0ca584fd9ae76d46f0e62186bcb1 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 26 Jul 2013 19:55:48 -0700 Subject: [PATCH 073/907] Removed mysql as any dependency --- awsapi/pom.xml | 1 - client/pom.xml | 1 - engine/storage/cache/pom.xml | 9 --------- engine/storage/datamotion/pom.xml | 11 ----------- engine/storage/image/pom.xml | 6 ------ engine/storage/pom.xml | 10 ---------- engine/storage/snapshot/pom.xml | 6 ------ engine/storage/volume/pom.xml | 6 ------ plugins/storage/image/default/pom.xml | 9 --------- plugins/storage/image/s3/pom.xml | 5 ----- plugins/storage/image/sample/pom.xml | 9 --------- plugins/storage/image/swift/pom.xml | 9 --------- plugins/storage/volume/default/pom.xml | 9 --------- plugins/storage/volume/sample/pom.xml | 9 --------- plugins/storage/volume/solidfire/pom.xml | 7 ------- server/pom.xml | 6 ------ usage/pom.xml | 1 - 17 files changed, 114 deletions(-) diff --git a/awsapi/pom.xml b/awsapi/pom.xml index 317d1cea2c6..1740874a7c1 100644 --- a/awsapi/pom.xml +++ b/awsapi/pom.xml @@ -271,7 +271,6 @@ mysql mysql-connector-java - ${cs.mysql.version} runtime diff --git a/client/pom.xml b/client/pom.xml index d25576a8089..04f857c4447 100644 --- a/client/pom.xml +++ b/client/pom.xml @@ -173,7 +173,6 @@ mysql mysql-connector-java - ${cs.mysql.version} runtime diff --git a/engine/storage/cache/pom.xml b/engine/storage/cache/pom.xml index 58dd5b1e33d..584d14dcb4e 100644 --- a/engine/storage/cache/pom.xml +++ b/engine/storage/cache/pom.xml @@ -25,14 +25,5 @@ cloud-engine-storage ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - - install - diff --git a/engine/storage/datamotion/pom.xml b/engine/storage/datamotion/pom.xml index 7306c0e4c79..e122990bf82 100644 --- a/engine/storage/datamotion/pom.xml +++ b/engine/storage/datamotion/pom.xml @@ -37,16 +37,5 @@ ${project.version} runtime - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - - install - src - test - diff --git a/engine/storage/image/pom.xml b/engine/storage/image/pom.xml index c5eef5e84f4..8c882035817 100644 --- a/engine/storage/image/pom.xml +++ b/engine/storage/image/pom.xml @@ -25,11 +25,5 @@ cloud-engine-storage ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - diff --git a/engine/storage/pom.xml b/engine/storage/pom.xml index ee52d22c5cb..8a6e6ad2fa5 100644 --- a/engine/storage/pom.xml +++ b/engine/storage/pom.xml @@ -55,15 +55,5 @@ cloud-engine-api ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - - install - src - diff --git a/engine/storage/snapshot/pom.xml b/engine/storage/snapshot/pom.xml index 6c476a8c64f..a2b0a05b90d 100644 --- a/engine/storage/snapshot/pom.xml +++ b/engine/storage/snapshot/pom.xml @@ -30,11 +30,5 @@ cloud-engine-api ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - diff --git a/engine/storage/volume/pom.xml b/engine/storage/volume/pom.xml index e8611267c17..639bb3a14d4 100644 --- a/engine/storage/volume/pom.xml +++ b/engine/storage/volume/pom.xml @@ -25,12 +25,6 @@ cloud-engine-storage ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - diff --git a/plugins/storage/image/default/pom.xml b/plugins/storage/image/default/pom.xml index f51d8f55a1d..1062b573603 100644 --- a/plugins/storage/image/default/pom.xml +++ b/plugins/storage/image/default/pom.xml @@ -40,17 +40,8 @@ cloud-engine-storage-snapshot ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - install - src - test maven-surefire-plugin diff --git a/plugins/storage/image/s3/pom.xml b/plugins/storage/image/s3/pom.xml index ad42e6fa376..f39a1b45bc1 100644 --- a/plugins/storage/image/s3/pom.xml +++ b/plugins/storage/image/s3/pom.xml @@ -48,9 +48,4 @@ ${project.version} - - install - src - test - diff --git a/plugins/storage/image/sample/pom.xml b/plugins/storage/image/sample/pom.xml index 44b50b09220..f14f1f8e254 100644 --- a/plugins/storage/image/sample/pom.xml +++ b/plugins/storage/image/sample/pom.xml @@ -40,17 +40,8 @@ cloud-engine-storage-snapshot ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - install - src - test maven-surefire-plugin diff --git a/plugins/storage/image/swift/pom.xml b/plugins/storage/image/swift/pom.xml index 4e3907fd808..602345a7ece 100644 --- a/plugins/storage/image/swift/pom.xml +++ b/plugins/storage/image/swift/pom.xml @@ -40,17 +40,8 @@ cloud-engine-storage-snapshot ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - install - src - test maven-surefire-plugin diff --git a/plugins/storage/volume/default/pom.xml b/plugins/storage/volume/default/pom.xml index 1eb2e12a816..088798ad1b4 100644 --- a/plugins/storage/volume/default/pom.xml +++ b/plugins/storage/volume/default/pom.xml @@ -25,17 +25,8 @@ cloud-engine-storage-volume ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - install - src - test maven-surefire-plugin diff --git a/plugins/storage/volume/sample/pom.xml b/plugins/storage/volume/sample/pom.xml index 2e2fdb51806..1dc95ca7015 100644 --- a/plugins/storage/volume/sample/pom.xml +++ b/plugins/storage/volume/sample/pom.xml @@ -25,17 +25,8 @@ cloud-engine-storage-volume ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - - install - src - test maven-surefire-plugin diff --git a/plugins/storage/volume/solidfire/pom.xml b/plugins/storage/volume/solidfire/pom.xml index 380f5544f41..acb5a97398a 100644 --- a/plugins/storage/volume/solidfire/pom.xml +++ b/plugins/storage/volume/solidfire/pom.xml @@ -25,12 +25,6 @@ cloud-engine-storage-volume ${project.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - com.google.code.gson gson @@ -44,7 +38,6 @@ - install maven-surefire-plugin diff --git a/server/pom.xml b/server/pom.xml index f5617b9ba81..b159b4d3531 100644 --- a/server/pom.xml +++ b/server/pom.xml @@ -59,12 +59,6 @@ httpclient ${cs.httpcore.version} - - mysql - mysql-connector-java - ${cs.mysql.version} - provided - com.thoughtworks.xstream xstream diff --git a/usage/pom.xml b/usage/pom.xml index 2051d5eb5bf..257359cfb6d 100644 --- a/usage/pom.xml +++ b/usage/pom.xml @@ -41,7 +41,6 @@ mysql mysql-connector-java - ${cs.mysql.version} runtime From 3d2e49bcfce6c2e97cfea85e3ae4ef5cb3ed28f3 Mon Sep 17 00:00:00 2001 From: Alex Huang Date: Fri, 26 Jul 2013 20:35:24 -0700 Subject: [PATCH 074/907] Changed the log4j config files to log org.apache.cloudstack in debug and change the layout format --- client/tomcatconf/log4j-cloud.xml.in | 14 ++- framework/db/pom.xml | 14 ++- plugins/hypervisors/kvm/pom.xml | 19 +-- .../resource/LibvirtComputingResource.java | 29 ++--- pom.xml | 117 +++++++++++++++++- server/conf/log4j-cloud.xml.in | 12 +- utils/pom.xml | 44 +------ .../cloud/utils/storage/encoding/Decoder.java | 2 +- .../com/cloud/utils/xmlobject/XmlObject.java | 5 +- 9 files changed, 173 insertions(+), 83 deletions(-) diff --git a/client/tomcatconf/log4j-cloud.xml.in b/client/tomcatconf/log4j-cloud.xml.in index 503ba8e76a1..1207aa7a8f3 100755 --- a/client/tomcatconf/log4j-cloud.xml.in +++ b/client/tomcatconf/log4j-cloud.xml.in @@ -35,7 +35,7 @@ under the License. - + @@ -47,7 +47,7 @@ under the License. - + @@ -59,7 +59,7 @@ under the License. - + @@ -71,7 +71,7 @@ under the License. - + @@ -111,7 +111,7 @@ under the License. - + @@ -123,6 +123,10 @@ under the License. + + + + diff --git a/framework/db/pom.xml b/framework/db/pom.xml index c23f96fc2c4..12e2078bda0 100644 --- a/framework/db/pom.xml +++ b/framework/db/pom.xml @@ -22,12 +22,22 @@ javax.ejb ejb-api - ${cs.ejb.version} + + + net.sf.ehcache + ehcache org.eclipse.persistence javax.persistence - ${cs.jpa.version} + + + commons-dbcp + commons-dbcp + + + commons-pool + commons-pool org.apache.cloudstack diff --git a/plugins/hypervisors/kvm/pom.xml b/plugins/hypervisors/kvm/pom.xml index 1babe7cbf56..19e5458b618 100644 --- a/plugins/hypervisors/kvm/pom.xml +++ b/plugins/hypervisors/kvm/pom.xml @@ -1,13 +1,12 @@ + 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. --> 4.0.0 @@ -30,6 +29,10 @@ + + commons-io + commons-io + org.apache.cloudstack cloud-agent 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 571bcc8cd7e..bfa0b7ecd72 100755 --- a/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java +++ b/plugins/hypervisors/kvm/src/com/cloud/hypervisor/kvm/resource/LibvirtComputingResource.java @@ -50,21 +50,12 @@ import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; -import java.util.regex.Matcher; -import java.util.regex.Pattern; import javax.ejb.Local; import javax.naming.ConfigurationException; -import org.apache.cloudstack.storage.command.StorageSubSystemCommand; -import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; -import org.apache.cloudstack.storage.to.VolumeObjectTO; -import org.apache.cloudstack.utils.qemu.QemuImg; -import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; -import org.apache.cloudstack.utils.qemu.QemuImgException; -import org.apache.cloudstack.utils.qemu.QemuImgFile; -import org.apache.log4j.Logger; import org.apache.commons.io.FileUtils; +import org.apache.log4j.Logger; import org.libvirt.Connect; import org.libvirt.Domain; import org.libvirt.DomainBlockStats; @@ -74,6 +65,14 @@ import org.libvirt.DomainSnapshot; import org.libvirt.LibvirtException; import org.libvirt.NodeInfo; +import org.apache.cloudstack.storage.command.StorageSubSystemCommand; +import org.apache.cloudstack.storage.to.PrimaryDataStoreTO; +import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.cloudstack.utils.qemu.QemuImg; +import org.apache.cloudstack.utils.qemu.QemuImg.PhysicalDiskFormat; +import org.apache.cloudstack.utils.qemu.QemuImgException; +import org.apache.cloudstack.utils.qemu.QemuImgFile; + import com.cloud.agent.api.Answer; import com.cloud.agent.api.AttachIsoCommand; import com.cloud.agent.api.AttachVolumeAnswer; @@ -202,7 +201,6 @@ import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.GuestDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.GuestResourceDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InputDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef; -import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.InterfaceDef.hostNicType; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.SerialDef; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.TermPolicy; import com.cloud.hypervisor.kvm.resource.LibvirtVMDef.VirtioSerialDef; @@ -240,7 +238,6 @@ import com.cloud.utils.script.Script; import com.cloud.vm.DiskProfile; import com.cloud.vm.VirtualMachine; import com.cloud.vm.VirtualMachine.State; -import com.cloud.vm.VirtualMachineName; /** * LibvirtComputingResource execute requests on the computing/routing host using @@ -843,7 +840,7 @@ ServerResource { configureVifDrivers(params); - KVMStorageProcessor storageProcessor = new KVMStorageProcessor(this._storagePoolMgr, this); + KVMStorageProcessor storageProcessor = new KVMStorageProcessor(_storagePoolMgr, this); storageProcessor.configure(name, params); storageHandler = new StorageSubsystemCommandHandlerBase(storageProcessor); @@ -1254,7 +1251,7 @@ ServerResource { } else if (cmd instanceof NetworkRulesVmSecondaryIpCommand) { return execute((NetworkRulesVmSecondaryIpCommand) cmd); } else if (cmd instanceof StorageSubSystemCommand) { - return this.storageHandler.handleStorageCommands((StorageSubSystemCommand)cmd); + return storageHandler.handleStorageCommands((StorageSubSystemCommand)cmd); } else if (cmd instanceof PvlanSetupCommand) { return execute((PvlanSetupCommand) cmd); } else { @@ -3179,8 +3176,8 @@ ServerResource { if (vmTO.getMinRam() != vmTO.getMaxRam()){ grd.setMemBalloning(true); - grd.setCurrentMem((long)vmTO.getMinRam()/1024); - grd.setMemorySize((long)vmTO.getMaxRam()/1024); + grd.setCurrentMem(vmTO.getMinRam()/1024); + grd.setMemorySize(vmTO.getMaxRam()/1024); } else{ grd.setMemorySize(vmTO.getMaxRam() / 1024); diff --git a/pom.xml b/pom.xml index 6296f378cd0..60dd9f79c7d 100644 --- a/pom.xml +++ b/pom.xml @@ -187,6 +187,121 @@ log4j ${cs.log4j.version} + + org.springframework + spring-context + ${org.springframework.version} + + + cglib + cglib-nodep + ${cs.cglib.version} + + + commons-dbcp + commons-dbcp + ${cs.dbcp.version} + + + commons-pool + commons-pool + + + + + net.sf.ehcache + ehcache + ${cs.ehcache.version} + + + commons-pool + commons-pool + ${cs.pool.version} + + + commons-codec + commons-codec + ${cs.codec.version} + + + org.bouncycastle + bcprov-jdk16 + ${cs.bcprov.version} + + + com.jcraft + jsch + ${cs.jsch.version} + + + org.jasypt + jasypt + ${cs.jasypt.version} + + + com.trilead + trilead-ssh2 + ${cs.trilead.version} + + + com.amazonaws + aws-java-sdk + ${cs.aws.sdk.version} + + + log4j + apache-log4j-extras + ${cs.log4j.extras.version} + + + log4j + log4j + + + + + javax.ejb + ejb-api + ${cs.ejb.version} + + + com.googlecode.java-ipv6 + java-ipv6 + ${cs.java-ipv6.version} + + + commons-configuration + commons-configuration + ${cs.configuration.version} + + + + mysql + mysql-connector-java + ${cs.mysql.version} + test + + + commons-io + commons-io + ${cs.commons-io.version} + provided + + + org.reflections + reflections + ${cs.reflections.version} + + + org.owasp.esapi + esapi + 2.0.1 + + + org.eclipse.persistence + javax.persistence + ${cs.jpa.version} + @@ -245,7 +360,7 @@ true - target + ${cs.target.dir} **/* diff --git a/server/conf/log4j-cloud.xml.in b/server/conf/log4j-cloud.xml.in index 939b46d7488..3b4bff106d1 100755 --- a/server/conf/log4j-cloud.xml.in +++ b/server/conf/log4j-cloud.xml.in @@ -34,7 +34,7 @@ under the License. - + @@ -46,7 +46,7 @@ under the License. - + @@ -59,7 +59,7 @@ under the License. - + @@ -71,7 +71,7 @@ under the License. - + @@ -83,6 +83,10 @@ under the License. + + + diff --git a/utils/pom.xml b/utils/pom.xml index cb18fc226a1..06a0518e80b 100644 --- a/utils/pom.xml +++ b/utils/pom.xml @@ -30,7 +30,6 @@ org.springframework spring-context - ${org.springframework.version} log4j @@ -39,107 +38,66 @@ cglib cglib-nodep - ${cs.cglib.version} - - - commons-dbcp - commons-dbcp - ${cs.dbcp.version} - - - commons-pool - commons-pool - - - - - net.sf.ehcache - ehcache - ${cs.ehcache.version} - - - commons-pool - commons-pool - ${cs.pool.version} commons-codec commons-codec - ${cs.codec.version} org.bouncycastle bcprov-jdk16 - ${cs.bcprov.version} com.jcraft jsch - ${cs.jsch.version} org.jasypt jasypt - ${cs.jasypt.version} com.trilead trilead-ssh2 - ${cs.trilead.version} com.amazonaws aws-java-sdk - ${cs.aws.sdk.version} log4j apache-log4j-extras - ${cs.log4j.extras.version} - - - log4j - log4j - - + runtime javax.ejb ejb-api - ${cs.ejb.version} com.googlecode.java-ipv6 java-ipv6 - ${cs.java-ipv6.version} commons-configuration commons-configuration - ${cs.configuration.version} mysql mysql-connector-java - ${cs.mysql.version} test commons-io commons-io - ${cs.commons-io.version} provided org.reflections reflections - ${cs.reflections.version} org.owasp.esapi esapi - 2.0.1 diff --git a/utils/src/com/cloud/utils/storage/encoding/Decoder.java b/utils/src/com/cloud/utils/storage/encoding/Decoder.java index fe74a04022b..8519287ae53 100644 --- a/utils/src/com/cloud/utils/storage/encoding/Decoder.java +++ b/utils/src/com/cloud/utils/storage/encoding/Decoder.java @@ -20,11 +20,11 @@ package com.cloud.utils.storage.encoding; import java.net.URI; import java.net.URISyntaxException; +import java.util.Arrays; import java.util.HashMap; import java.util.List; import java.util.Map; -import edu.emory.mathcs.backport.java.util.Arrays; public class Decoder { private static Map getParameters(URI uri) { diff --git a/utils/src/com/cloud/utils/xmlobject/XmlObject.java b/utils/src/com/cloud/utils/xmlobject/XmlObject.java index 789a74dbb8e..b67eb9ca2c8 100755 --- a/utils/src/com/cloud/utils/xmlobject/XmlObject.java +++ b/utils/src/com/cloud/utils/xmlobject/XmlObject.java @@ -19,6 +19,7 @@ package com.cloud.utils.xmlobject; import java.lang.reflect.Field; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; @@ -26,10 +27,8 @@ import java.util.Map; import com.cloud.utils.exception.CloudRuntimeException; -import edu.emory.mathcs.backport.java.util.Collections; - public class XmlObject { - private Map elements = new HashMap(); + private final Map elements = new HashMap(); private String text; private String tag; From d6368872a734d830f23cfb765b00897ced688555 Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Fri, 26 Jul 2013 11:14:25 +0530 Subject: [PATCH 075/907] CLOUDSTACK-3723: System VM Template for XenServer has wrong guest OS type Information on the Database. This commit also contains the guestOS addition of new CentOS releases supported by XenServer 6.2 Signed-off-by: Abhinandan Prateek --- setup/db/templates.sql | 41 +++++++++++++++++++++++++++++++++++------ 1 file changed, 35 insertions(+), 6 deletions(-) diff --git a/setup/db/templates.sql b/setup/db/templates.sql index 313a68dc995..5488b28cf63 100755 --- a/setup/db/templates.sql +++ b/setup/db/templates.sql @@ -16,7 +16,7 @@ -- under the License. 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 (1, UUID(), 'routing-1', 'SystemVM Template (XenServer)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.vhd.bz2', 'f613f38c96bf039f2e5cbf92fa8ad4f8', 0, 'SystemVM Template (XenServer)', 'VHD', 133, 0, 1, 'XenServer' ); + VALUES (1, UUID(), 'routing-1', 'SystemVM Template (XenServer)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-2013-06-12-master-xen.vhd.bz2', 'fb1b6e032a160d86f2c28feb5add6d83', 0, 'SystemVM Template (XenServer)', 'VHD', 132, 0, 1, 'XenServer' ); INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, removed, type, hvm, bits, account_id, url, checksum, enable_password, display_text, format, guest_os_id, featured, cross_zones, hypervisor_type, extractable) VALUES (2, UUID(), 'centos53-x86_64', 'CentOS 5.3(64-bit) no GUI (XenServer)', 1, now(), now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/templates/builtin/f59f18fb-ae94-4f97-afd2-f84755767aca.vhd.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'CentOS 5.3(64-bit) no GUI (XenServer)', 'VHD', 12, 1, 1, 'XenServer', 1); @@ -218,11 +218,20 @@ INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (165 INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (166, UUID(), 6, 'Windows 8 (64-bit)'); INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (167, UUID(), 6, 'Windows Server 2012 (64-bit)'); INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (168, UUID(), 6, 'Windows Server 8 (64-bit)'); - -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (169, 10, 'Ubuntu 11.04 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (170, 10, 'Ubuntu 11.04 (64-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (171, 1, 'CentOS 6.3 (32-bit)'); -INSERT INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (172, 1, 'CentOS 6.3 (64-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (169, UUID(), 10, 'Ubuntu 11.04 (32-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (170, UUID(), 10, 'Ubuntu 11.04 (64-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (171, UUID(), 1, 'CentOS 6.3 (32-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (172, UUID(), 1, 'CentOS 6.3 (64-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (173, UUID(), 1, 'CentOS 5.8 (32-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (174, UUID(), 1, 'CentOS 5.8 (64-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (175, UUID(), 1, 'CentOS 5.9 (32-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (176, UUID(), 1, 'CentOS 5.9 (64-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (177, UUID(), 1, 'CentOS 6.1 (32-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (178, UUID(), 1, 'CentOS 6.1 (64-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (179, UUID(), 1, 'CentOS 6.2 (32-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (180, UUID(), 1, 'CentOS 6.2 (64-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (181, UUID(), 1, 'CentOS 6.4 (32-bit)'); +INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (182, UUID(), 1, 'CentOS 6.4 (64-bit)'); INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (200, UUID(), 1, 'Other CentOS (32-bit)'); INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (201, UUID(), 1, 'Other CentOS (64-bit)'); @@ -243,6 +252,26 @@ INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.3 (64-bit)', 12); INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.4 (32-bit)', 13); INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.4 (64-bit)', 14); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.5 (32-bit)', 111); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.5 (64-bit)', 112); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.6 (32-bit)', 141); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.6 (64-bit)', 142); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.7 (32-bit)', 161); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.7 (64-bit)', 162); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.8 (32-bit)', 173); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.8 (64-bit)', 174); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.9 (32-bit)', 175); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.9 (64-bit)', 176); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.0 (32-bit)', 143); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.0 (64-bit)', 144); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.1 (32-bit)', 177); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.1 (64-bit)', 178); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.2 (32-bit)', 179); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.2 (64-bit)', 180); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.3 (32-bit)', 171); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.3 (64-bit)', 172); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.4 (32-bit)', 181); +INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.4 (64-bit)', 182); INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Debian Lenny 5.0 (32-bit)', 15); INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Oracle Enterprise Linux 5.0 (32-bit)', 16); INSERT INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Oracle Enterprise Linux 5.0 (64-bit)', 17); From f177f733f197e0694cd891980014cd575760da03 Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Sat, 27 Jul 2013 11:41:47 +0530 Subject: [PATCH 076/907] CLOUDSTACK-3480: updated the 4.2 templates download location --- setup/db/templates.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/db/templates.sql b/setup/db/templates.sql index 5488b28cf63..143b12d9985 100755 --- a/setup/db/templates.sql +++ b/setup/db/templates.sql @@ -22,7 +22,7 @@ INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, VALUES (2, UUID(), 'centos53-x86_64', 'CentOS 5.3(64-bit) no GUI (XenServer)', 1, now(), now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/templates/builtin/f59f18fb-ae94-4f97-afd2-f84755767aca.vhd.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'CentOS 5.3(64-bit) no GUI (XenServer)', 'VHD', 12, 1, 1, 'XenServer', 1); 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 (3, UUID(), 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM' ); + VALUES (3, UUID(), 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-2013-06-12-master-kvm.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM' ); INSERT INTO `cloud`.`vm_template` (id, uuid, 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, UUID(), '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); @@ -34,10 +34,10 @@ INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, VALUES (7, UUID(), '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); 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 (8, UUID(), 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/burbank/burbank-systemvm-08012012.ova', '7137e453f950079ea2ba6feaafd939e8', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware' ); + VALUES (8, UUID(), 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-4.2-vh7.ova', '7137e453f950079ea2ba6feaafd939e8', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware' ); 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 (9, UUID(), 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/acton/acton-systemvm-02062012.vhd.bz2', 'f613f38c96bf039f2e5cbf92fa8ad4f8', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv' ); + VALUES (9, UUID(), 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-2013-06-12-master-xen.vhd.bz2', 'f613f38c96bf039f2e5cbf92fa8ad4f8', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv' ); INSERT INTO `cloud`.`guest_os_category` (id, uuid, name) VALUES (1, UUID(), 'CentOS'); INSERT INTO `cloud`.`guest_os_category` (id, uuid, name) VALUES (2, UUID(), 'Debian'); From f33c887b0327f820429230654c040e45af2c651a Mon Sep 17 00:00:00 2001 From: Sanjay Tripathi Date: Sat, 27 Jul 2013 13:44:50 +0530 Subject: [PATCH 077/907] CLOUDSTACK-3544: Patch to support upgrade to Xenserver 6.2 Signed-off-by: Abhinandan Prateek --- setup/db/db/schema-410to420.sql | 39 +++++++++++++++++++++++++++++---- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 82ca403ad42..a93aec444b5 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -276,10 +276,21 @@ INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALU INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (167, UUID(), 6, 'Windows Server 2012 (64-bit)'); INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (168, UUID(), 6, 'Windows Server 8 (64-bit)'); -INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (169, 10, 'Ubuntu 11.04 (32-bit)'); -INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (170, 10, 'Ubuntu 11.04 (64-bit)'); -INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (171, 1, 'CentOS 6.3 (32-bit)'); -INSERT IGNORE INTO `cloud`.`guest_os` (id, category_id, display_name) VALUES (172, 1, 'CentOS 6.3 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (169, UUID(), 10, 'Ubuntu 11.04 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (170, UUID(), 10, 'Ubuntu 11.04 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (171, UUID(), 1, 'CentOS 6.3 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (172, UUID(), 1, 'CentOS 6.3 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (173, UUID(), 1, 'CentOS 5.8 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (174, UUID(), 1, 'CentOS 5.8 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (175, UUID(), 1, 'CentOS 5.9 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (176, UUID(), 1, 'CentOS 5.9 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (177, UUID(), 1, 'CentOS 6.1 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (178, UUID(), 1, 'CentOS 6.1 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (179, UUID(), 1, 'CentOS 6.2 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (180, UUID(), 1, 'CentOS 6.2 (64-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (181, UUID(), 1, 'CentOS 6.4 (32-bit)'); +INSERT IGNORE INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (182, UUID(), 1, 'CentOS 6.4 (64-bit)'); + INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 (32-bit)', 165); INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("VmWare", 'Windows 8 (64-bit)', 166); @@ -289,6 +300,26 @@ INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows 8 (64-bit)', 166); INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows Server 2012 (64-bit)', 167); INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'Windows Server 8 (64-bit)', 168); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.5 (32-bit)', 111); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.5 (64-bit)', 112); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.6 (32-bit)', 141); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.6 (64-bit)', 142); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.7 (32-bit)', 161); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.7 (64-bit)', 162); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.8 (32-bit)', 173); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.8 (64-bit)', 174); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.9 (32-bit)', 175); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 5.9 (64-bit)', 176); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.0 (32-bit)', 143); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.0 (64-bit)', 144); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.1 (32-bit)', 177); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.1 (64-bit)', 178); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.2 (32-bit)', 179); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.2 (64-bit)', 180); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.3 (32-bit)', 171); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.3 (64-bit)', 172); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.4 (32-bit)', 181); +INSERT IGNORE INTO `cloud`.`guest_os_hypervisor` (hypervisor_type, guest_os_name, guest_os_id) VALUES ("XenServer", 'CentOS 6.4 (64-bit)', 182); INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (211, UUID(), 7, 'Apple Mac OS X 10.6 (32-bit)'); INSERT INTO `cloud`.`guest_os` (id, uuid, category_id, display_name) VALUES (212, UUID(), 7, 'Apple Mac OS X 10.6 (64-bit)'); From a10861a57b1a0df11c80dbd04bd02cc2772de2f4 Mon Sep 17 00:00:00 2001 From: Saksham Srivastava Date: Thu, 16 May 2013 20:56:51 +0530 Subject: [PATCH 078/907] CLOUDSTACK-3874: Adding method to cloud-early-config to allow updation of systemvms log rotation Signed-off-by: Abhinandan Prateek --- .../config/etc/init.d/cloud-early-config | 117 ++++++++++++++++++ 1 file changed, 117 insertions(+) diff --git a/patches/systemvm/debian/config/etc/init.d/cloud-early-config b/patches/systemvm/debian/config/etc/init.d/cloud-early-config index 02af6026639..c0a7189d7a4 100755 --- a/patches/systemvm/debian/config/etc/init.d/cloud-early-config +++ b/patches/systemvm/debian/config/etc/init.d/cloud-early-config @@ -194,6 +194,122 @@ patch() { return 0 } +patch_log4j() { +log_it "Updating log4j-cloud.xml" +cat << "EOF" > /usr/local/cloud/systemvm/conf/temp.xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +EOF +mv /usr/local/cloud/systemvm/conf/temp.xml /usr/local/cloud/systemvm/conf/log4j-cloud.xml +} setup_interface() { local intfnum=$1 local ip=$2 @@ -1048,6 +1164,7 @@ start() { log_it "Detected that we are running inside $hyp guest" get_boot_params patch + patch_log4j parse_cmd_line change_password case $TYPE in From cf6e125d811e19c8da7ccdd19455bf731bd5dc8a Mon Sep 17 00:00:00 2001 From: Abhinandan Prateek Date: Sat, 27 Jul 2013 17:08:55 +0530 Subject: [PATCH 079/907] CLOUDSTACK-3480: updated md5 checksum --- setup/db/templates.sql | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/setup/db/templates.sql b/setup/db/templates.sql index 143b12d9985..ba1384101dc 100755 --- a/setup/db/templates.sql +++ b/setup/db/templates.sql @@ -22,7 +22,7 @@ INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, VALUES (2, UUID(), 'centos53-x86_64', 'CentOS 5.3(64-bit) no GUI (XenServer)', 1, now(), now(), 'BUILTIN', 0, 64, 1, 'http://download.cloud.com/templates/builtin/f59f18fb-ae94-4f97-afd2-f84755767aca.vhd.bz2', 'b63d854a9560c013142567bbae8d98cf', 0, 'CentOS 5.3(64-bit) no GUI (XenServer)', 'VHD', 12, 1, 1, 'XenServer', 1); 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 (3, UUID(), 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-2013-06-12-master-kvm.qcow2.bz2', '2755de1f9ef2ce4d6f2bee2efbb4da92', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM' ); + VALUES (3, UUID(), 'routing-3', 'SystemVM Template (KVM)', 0, now(), 'SYSTEM', 0, 64, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-2013-06-12-master-kvm.qcow2.bz2', '6cea42b2633841648040becb588bd8f0', 0, 'SystemVM Template (KVM)', 'QCOW2', 15, 0, 1, 'KVM' ); INSERT INTO `cloud`.`vm_template` (id, uuid, 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, UUID(), '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); @@ -34,10 +34,10 @@ INSERT INTO `cloud`.`vm_template` (id, uuid, unique_name, name, public, created, VALUES (7, UUID(), '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); 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 (8, UUID(), 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-4.2-vh7.ova', '7137e453f950079ea2ba6feaafd939e8', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware' ); + VALUES (8, UUID(), 'routing-8', 'SystemVM Template (vSphere)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-4.2-vh7.ova', '8fde62b1089e5844a9cd3b9b953f9596', 0, 'SystemVM Template (vSphere)', 'OVA', 15, 0, 1, 'VMware' ); 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 (9, UUID(), 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-2013-06-12-master-xen.vhd.bz2', 'f613f38c96bf039f2e5cbf92fa8ad4f8', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv' ); + VALUES (9, UUID(), 'routing-9', 'SystemVM Template (HyperV)', 0, now(), 'SYSTEM', 0, 32, 1, 'http://download.cloud.com/templates/4.2/systemvmtemplate-2013-06-12-master-xen.vhd.bz2', 'fb1b6e032a160d86f2c28feb5add6d83', 0, 'SystemVM Template (HyperV)', 'VHD', 15, 0, 1, 'Hyperv' ); INSERT INTO `cloud`.`guest_os_category` (id, uuid, name) VALUES (1, UUID(), 'CentOS'); INSERT INTO `cloud`.`guest_os_category` (id, uuid, name) VALUES (2, UUID(), 'Debian'); From 171128054cfae194e07ff8a42e44a807568e861f Mon Sep 17 00:00:00 2001 From: Murali Reddy Date: Sat, 27 Jul 2013 17:15:14 +0530 Subject: [PATCH 080/907] CLOUDSTACK-3834: 3.0.6 to ASF 4.2 Upgrade: "cloud" Database Schema Inconsistencies on the Upgraded Setup - Table "netscaler_pod_ref" adding netscaler_pod_ref table 3.0.7 to 4.1 upgrade path --- setup/db/db/schema-307to410.sql | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/setup/db/db/schema-307to410.sql b/setup/db/db/schema-307to410.sql index cbd564ded89..414d3bcd503 100644 --- a/setup/db/db/schema-307to410.sql +++ b/setup/db/db/schema-307to410.sql @@ -1554,3 +1554,13 @@ CREATE TABLE IF NOT EXISTS `cloud`.`baremetal_pxe_devices` ( #drop tables as the feature is not a part of 4.2 DROP TABLE IF EXISTS `cloud`.`host_updates`; DROP TABLE IF EXISTS `cloud`.`host_updates_ref`; + +DROP TABLE IF EXISTS `cloud`.`netscaler_pod_ref`; +CREATE TABLE `cloud`.`netscaler_pod_ref` ( + `id` bigint unsigned NOT NULL auto_increment COMMENT 'id', + `external_load_balancer_device_id` bigint unsigned NOT NULL COMMENT 'id of external load balancer device', + `pod_id` bigint unsigned NOT NULL COMMENT 'pod id', + PRIMARY KEY (`id`), + CONSTRAINT `fk_ns_pod_ref__pod_id` FOREIGN KEY (`pod_id`) REFERENCES `cloud`.`host_pod_ref`(`id`) ON DELETE CASCADE, + CONSTRAINT `fk_ns_pod_ref__device_id` FOREIGN KEY (`external_load_balancer_device_id`) REFERENCES `external_load_balancer_devices`(`id`) ON DELETE CASCADE +) ENGINE=InnoDB DEFAULT CHARSET=utf8; \ No newline at end of file From d90d3e9f0887488accf21a50c97efd63ebdb9e37 Mon Sep 17 00:00:00 2001 From: Ian Duffy Date: Sat, 27 Jul 2013 12:55:33 +0100 Subject: [PATCH 081/907] Update xml file of gsoc summer review Signed-off-by: Abhinandan Prateek --- docs/en-US/gsoc-midsummer-ian.xml | 73 +++++++++++++++++-------------- 1 file changed, 39 insertions(+), 34 deletions(-) diff --git a/docs/en-US/gsoc-midsummer-ian.xml b/docs/en-US/gsoc-midsummer-ian.xml index c62cdc3545e..1f65e2d309c 100644 --- a/docs/en-US/gsoc-midsummer-ian.xml +++ b/docs/en-US/gsoc-midsummer-ian.xml @@ -28,7 +28,7 @@
Introduction - Progress on my project is moving along smoothly. The Cloudstack community along with my mentor Abhi have been very accomodating. Since the community bonding period communication has been consistent and the expectations have been clear. Sebastien, head mentor has given us great guidance. I have enjoyed their teaching style. I found it was a nice gradual build up starting with creating a simple document update patch to eventually submitting a new Cloudstack Plugin. + Progress on my project is moving along smoothly. The Cloudstack community along with my mentor Abhi have been very accomodating. Since the community bonding period communication has been consistent and the expectations have been clear. Sebastien, head mentor, has given us great guidance. I have enjoyed their teaching style. I found it was a nice gradual build up starting with creating a simple document update patch to eventually submitting a new Cloudstack Plugin. I am pleased with my progress on the project to date. I feel as if the goals set out in my proposal are very doable and that they should be achieved. @@ -39,9 +39,6 @@ In order to try deliver working solutions of good quality I felt it would be a good idea to implement a continuous integration environment using Jenkins. The idea of this would be to automatically build and test my code. This was welcomed and aided by community members greatly. - - The pipeline for this is as follows: - @@ -50,25 +47,28 @@ jenkins-pipeline.png: Screenshot of the build pipeline. + + The key stages of the pipeline are as follows: + - Acquire Code Base - This pulls down the latest Cloudstack codebase and builds it executing all unit tests. + Acquire Code Base - This pulls down the latest Cloudstack codebase and builds it executing all unit tests. - Static Analysis - This runs tests on my code to ensure quality and good practice. This is being achieved with sonar source. + Static Analysis - This runs tests on my code to ensure quality and good practice. This is being achieved with sonar source. - Integration Tests - This deploys the Cloudstack database. Brings up the Cloudstack Manager with jetty and their simulator. All checkin/integration tests are ran and then the jetty server is shutdown. + Integration Tests - This deploys the Cloudstack database. Brings up the Cloudstack Manager with jetty and their simulator. All checkin/integration tests are ran and then the jetty server is shutdown. - Package(Only exists on my local Jenkins) - The codebase is packaged up into an RPM and placed onto a local yum repo. If the time allows this will be used for future automated acceptance testing. + Package(Only exists on my local Jenkins) - The codebase is packaged up into an RPM and placed onto a local yum repo. If the time allows this will be used for future automated acceptance testing. @@ -79,22 +79,22 @@
Ldap Plugin implementation - At the start of the coding stage I began to review the current LDAP implementation. This includes: + At the start of the coding stage I began by reviewing the current LDAP implementation. This included: - The user authenticator - This enables LDAP users to login to Cloudstack once the user exists within the internal Cloudstack database. + The user authenticator - Enables LDAP users to login to Cloudstack once the user exists within the internal Cloudstack database. - LDAPConfig -This allows for adding LDAP configuration. This is detailed over here: ldapConfig API reference This did not allow multiple configurations. + LDAPConfig - Adds LDAP configuration. This is detailed in ldapConfig API reference This did not allow multiple configurations. - LDAPRemove - This allows for removing the LDAP configuration + LDAPRemove - Removes the LDAP configuration @@ -104,7 +104,7 @@ - After reviewing this code and implementation for some time I realised that it wasn't the most maintainable code. I realised I could extend it if required. But it would involve creating more unmaintainable code and it would be messy. This goes against my own principles of developing quality. This made me make the steep but justified decision to completely redo the LDAP implementation within Cloudstack. By doing this I did expanded the scope of the project. + After reviewing this code and implementation for some time I discovered that it wasn't the most maintainable code. I realised I could extend it if required. But it would involve creating more unmaintainable code and it would be messy. This goes against my goal of delivering quality. I decided therefore, justifiably I think to completely redo the LDAP implementation within Cloudstack. By doing this I did expanded the scope of the project. I began to research the most appropriate way of structuring this. I started of by redoing the implementation. This meant creating the following classes(Excluding DAOs): @@ -112,42 +112,42 @@ - LdapManager: Manages all LDAP connections. + LdapManager - Manages all LDAP connections. - LdapConfiguration: Supplies all configuration from within the Cloudstack database or defaults where required. + LdapConfiguration - Supplies all configuration from within the Cloudstack database or defaults where required. - LdapUserManager: Handles any interaction with LDAP user information. + LdapUserManager - Handles any interaction with LDAP user information. - LdapUtils: Supplies static helpers, e.g. escape search queries, get attributes from search queries. + LdapUtils - Supplies static helpers, e.g. escape search queries, get attributes from search queries. - LdapContextFactory: Manages the creation of contexts. + LdapContextFactory - Manages the creation of contexts. - LdapAuthenticator: Supplies an authenticator to Cloudstack using the LdapManager. + LdapAuthenticator - Supplies an authenticator to Cloudstack using the LdapManager. - From this I had a solid foundation for creating API commands to allow the user to interact with an LDAP server. I went on to create the following commands: + From this I felt I had a solid foundation for creating API commands to allow the user to interact with an LDAP server. I went on to create the following commands: - LdapAddConfiguration - This allows for adding multiple LDAP configurations. Each configuration is just seen as a hostname and port. + LdapAddConfiguration - This allows for adding multiple LDAP configurations. Each configuration is just seen as a hostname and port. @@ -168,7 +168,7 @@ - LdapDeleteConfiguration - This allows for the deletion of an LDAP configuration based on its hostname. + LdapDeleteConfiguration - This allows for the deletion of an LDAP configuration based on its hostname. @@ -189,7 +189,7 @@ - LdapListConfiguration - This lists all of the LDAP configurations that exist within the database. + LdapListConfiguration - This lists all of the LDAP configurations that exist within the database. @@ -202,7 +202,7 @@ - LdapListAllUsers - This lists all the users within LDAP. + LdapListAllUsers - This lists all the users within LDAP. @@ -215,47 +215,52 @@ - Along with this global configuration options were added, this includes: + Along with this global settings were added, this includes: - LDAP basedn: This allows the user to set the basedn for their LDAP configuration + LDAP basedn - Sets the basedn for their LDAP configuration - LDAP bind password: This allows the user to set the password to use for binding to LDAP for creating the system context. If this is left blank along with bind principal then anonymous binding is used. + LDAP bind password - Sets the password to use for binding to LDAP for creating the system context. If this is left blank along with bind principal then anonymous binding is used. - LDAP bind principal: This allows the user to set the principle to use for binding with LDAP for creating the system context. If this is left blank along with the bind password then anonymous binding is used. + LDAP bind principal - Sets the principle to use for binding with LDAP for creating the system context. If this is left blank along with the bind password then anonymous binding is used. - LDAP email attribute: This sets out the attribute to use for getting the users email address. Within both OpenLDAP and ActiveDirectory this is mail. For this reason this is set to mail by default. + LDAP email attribute - Sets the attribute to use for getting the users email address. Within both OpenLDAP and ActiveDirectory this is mail. For this reason this is set to mail by default. - LDAP realname attribute: This sets out the attribute to use for getting the users realname. Within both OpenLDAP and ActiveDiretory this is cn. For this reason this is set to cn by default. + LDAP firstname attribute - Sets the attribute to use for getting the users firstname. Within both OpenLDAP and ActiveDiretory this is givenname. For this reason this is set to givenname by default. - LDAP username attribute: This sets out the attribute to use for getting the users username. Within OpenLDAP this is uid and within ActiveDirectory this is samAccountName. In order to comply with posix standards this is set as uid by default. + LDAP lastname attribute - Sets the attribute to use for getting the users lastname. Within both OpenLDAP and ActiveDiretory this is sn. For this reason this is set to sn by default. - LDAP user object: This sets out the object type of user accounts within LDAP. Within OpenLDAP this is inetOrgPerson and within ActiveDirectory this is user. Again, in order to comply with posix standards this is set as inetOrgperson by default. + LDAP username attribute - This sets out the attribute to use for getting the users username. Within OpenLDAP this is uid and within ActiveDirectory this is samAccountName. In order to comply with posix standards this is set as uid by default. + + + + + LDAP user object - This sets out the object type of user accounts within LDAP. Within OpenLDAP this is inetOrgPerson and within ActiveDirectory this is user. Again, in order to comply with posix standards this is set as inetOrgperson by default. - With this implementation I believe it allows for a much more extendable and flexible approach. The whole implementation is abstracted from the Cloudstack codebase using the "plugin" model. This allows all of the LDAP features to be contained within one place. Along with this the implementation supplies a good foundation. A side affect of redoing the implementation allowed me to add support for multiple LDAP servers. This means failover is support, so for example, if you have a standard ActiveDirectory with primary and secondary domain controller. Both can be added to Cloudstack which will allow it to failover to either one assume one of them is down. + With this implementation I believe it allows for a much more extendable and flexible approach. The whole implementation is abstracted from the Cloudstack codebase using the "plugin" model. This allows all of the LDAP features to be contained within one place. Along with this the implementation supplies a good foundation. A side affect of redoing the implementation allowed me to add support for multiple LDAP servers. This means failover is supported, so for example, if you have a standard ActiveDirectory with primary and secondary domain controller. Both can be added to Cloudstack which will allow it to failover to either one assume one of them is down. The API changes required me to update the UI interface within Cloudstack. With the improved API implementation this was easier. The Global Settings -> Ldap Configuration page has support for multiple LDAP servers however it only requires a hostname and port. All "global" ldap settings are set within the global settings page. @@ -294,7 +299,7 @@
Testing - Unit tests have 92% code coverage within the LDAP Plugin. The unit tests were wrote in groovy using the spock framework. This allowed for a BDD style of of testing. + Unit tests have 92% code coverage within the LDAP Plugin. The unit tests were wrote in groovy using the spock framework. This allowed me to implement a BDD style of testing. Integration tests have been wrote in python using the marvin test framework for Cloudstack. This test configures a LDAP server and attempts to login as an LDAP user. The plugin comes with an embedded LDAP server for testing purposes. From 996059ce988e16028b5f6768b5eb436cbe723a97 Mon Sep 17 00:00:00 2001 From: Ian Duffy Date: Sat, 27 Jul 2013 17:57:22 +0530 Subject: [PATCH 082/907] update midterm review --- .../images/add-ldap-configuration-failure.png | Bin 27841 -> 84858 bytes docs/en-US/images/add-ldap-configuration.png | Bin 27393 -> 78542 bytes .../delete-ldap-configuration-failure.png | Bin 29262 -> 39952 bytes .../images/delete-ldap-configuration.png | Bin 0 -> 69084 bytes docs/en-US/images/ldap-list-users.png | Bin 56047 -> 85922 bytes docs/en-US/images/list-ldap-configuration.png | Bin 30977 -> 38909 bytes 6 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/en-US/images/delete-ldap-configuration.png diff --git a/docs/en-US/images/add-ldap-configuration-failure.png b/docs/en-US/images/add-ldap-configuration-failure.png index 4da295a8eb9b53024bb54d9300182ced908eb9db..312a1d6d61b7701319191b668d63ab26d601682e 100644 GIT binary patch literal 84858 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%0AEBzq4SPDg9Ph`{mZvVR?sqxJyY0VfR z0z1JOjE0=QArdS2UMecPD{xn0LOZ}(1s2wq>oY^eD2Hp-Uo+4taaRhhJdLH0QX6c6 zpjY=NCSxQAfy#5nZoW#~p_o0wzlj5*ufiFyC?@FN=HF000=ST0v8tZbl?U@3B}z=# zWMpRV_sBFsl28uBT>0L~Dm@W_cK+iFm=j0Nid<2{TTs-)!}I0=i2zp!ES2n6pBbrw zS}6dKm1`1n6TL~=n;4iM6Xr5A?8v-FuZ=W4Jb}O(Qu_r7fa5ax0tbG7Is8HckXjXQ zg-STj`JsXoLiNAe%=cNERhHlK(Ii7UFhIirZ!@{^gPZ$LLS(-s=f9+Z`4UK15@f98 z3B$ee1(X$_0<>?%jDQ)Oe}3ovu2o%lAdTbFSc!yQ+r_4Qvr;NK-wI%@Ds(tQ8! z1#+xbE7R(KIFtWe)di_+qB#DKMfne*5+d^dW7*q;`i7!c{Ey;cDJ+VG$DuC>sY|YB z`}j(Bw_}F%@V&igK4NFZl8f`^C*zl)C@oO}kF2sXJ~_OYH0>`|ooTfdzQ}wy)0L8y zCDuWdH}&a*ZbI*X5c+$HbMusQK!bGO@Ba<@&!fOMTOL|z)785BSxXB=(D1TgbA`#| zUfW1fd3JyY#@6Aa#DiVWuu`>5;syVboOB#lI+nLFgXwRdk(b=30 zK`#N#C8?!>G(BbN;>@;tYpZv1R@w`bw2%t*HI7f>>1{1F^f#_Ylf23{JOAR0PV66k z2rSMnhXq5WCh!J{$%OpTp9gw$Op#ugDam@KwtHx^9NQ>0RAVs$Zgd0P?DbywVQ$$P zH{?98j}I!HNe=o_XF{AyeiAQqv4T#gigN!v&eC}RzURDn1>O!H!y9}VpM7nqu%BA$ zUJ^-f?=uDW@bTTnzs%ZDI?^jWJ-*(H=xh9z{SV()gHF@)`%}X_X!+T4)EI0+?Ap{+ z(_PPIFB}tdk`tZCjg|$h-#ypF8sVlucKXf?sq#REgO7D5?GVSjGmcDM~DhDnM$Y zIOBA1vNALx*$pD~vi)G~#UMKMC28sjsXZS;pbv;YTLypBDXf%PYb$TlWC*9M6nI4^ zO6q#IQ8jZOA8+~!H-b87X)|q@5$=k5^YN+ZA&g9%dUPDc6)XT?pWz?r$xn=f94BbROpP>aO>akZxD;JUs8^U}`DW@Ir?7_sp2w zx*?e)?Z&?N=ijcsk}6PQGd%VFdz*|Qg1of41AD% zJa-q}rTkr58r^ht9GNKUKms$^xjZ~HopjLeMgFv*gZ2y%7R&~vB0^~icdzyf3jQU= zlJ&+hERxY$fo)P*ptivJa1%avw-W(-uQXQkUT&jdMVUAUgQ7GB)FQ-htqo6>1Ae3X^sDNr*_tZvM`NwMlOFR(zs)=W?-KBt^tU!8{% zGN_p3AYkE5v_3;mTbQVweq>0ST!nN!Z>6{4MiRWo4j5(AC5cz0&oo(R5CUg$mYjoN z8?J59R5ekeVSG=&#Ul84oev+z>{r1<@aT5bZ5p}hGSiMX^hxx$-_9}SG^3}bKXbtd zDq#sUrum$GqY_Mo)5SkA-DmfZfAI4F+{s^j^8Z!%yxA?Mb@-~J^SBz58@qg5WJ`DF zyYln(pqaJR<#NAVX)D@x+WW;-f9!JKaZNeWK}<-P!sK{l_@LonudAhi9 z|5aY8fZBO9zrjcEP8)^s{jzvpt@MkEvY7l#v40NyWeqE7x4FZss;k&Ov8xWD8ae8n zE%3L@<9F^;HTWULv7F6yCm{4klCMVv=alP0fg40QE2+S#trixvlI#3|&yM`2=VesE znHth5Q3SW`YW51aKDRa1t1G3&LS{=x<6-SchU8jC{YuJRio}DFLBy3llLwV+wx_}$ zPf@^_Kr7jM#Qs%cAFbnFCI3ibiJ9x0t6VvX{%^F;3~9JyXZgLy`vX&n~?`Z&ZT1eqNl+ z1}>j1<;Vs%%B{h8WjGn>CO#iq2n#zDb+6Wy=A;Z*Iq_GhjMCOB$%_3<&Yw4{c|q5$ zQ@h9-xAM77=(k#`jVw&!5MU5_*V*Z?%+}+5e(4rB=~IUPE8%K)a%Qb$R-g84g@ceZ zieBolR#`!aBwnvX$}mAsZbQGk?uC;0yU<}S7deKKyyExLZ)2Pr>+zHE5|~opR=s8h zvTK7t_xX@nej<6W$J}FHCw3-PaFSR~m(s*hlJo@60}|_=VsvD(y7BLDf(hfPg6xA9 z4kTCLTu&zo57XfiJKGSE%ccm{i|Ylxp_PzY;dDt-TO57ES6vDrVr${ji^9u%nh zi>Xy_bpdJj3(x7(TB{+uRQ-(cQ_b#m$rx(NZYx?9FZKE%v$g5TzbQox6FXUD>;>EO z?|jA$)FX00#jj;>4+~36O9~5PYU6tw?{cVw_xs`&OC2K&6wb3&U+h+9{v8JqM${Ah z)&}@m>ejov{*^b|h%nyUwduymK^ZK0$ze_xdrk+m5!S&Tv{`{fS4UVk4bL>ih@ZS_COp&l`Y<-dEk`XVoOkJpUR6dR80~e`t z3yu$Ka5Q_yhQ3RD2^tntpR#^k(iFX&dVk|-P#vGXd{8SYIimQZ|W z{DgP5r)~@PTHid{JiQL~Zx0;R^l;>S2Ij^%Z)Hr99zTV91mw1#%l26<#2@ciMdj&u zC?E5JSuC;8t&6@)hr`}?2F4B`sY_W-rpp={a0Rthak0`w=*naV7<&S24|y;ZFxNpc z1`F&(hD)vt+H&INp+$I#DTZbH(fw3~bzNCEWxUvepyqgmeudU=q&j@%E?@=ob+;~b zo~23{A_DMGEj}zFmBo4m_2-LJ3Mt7&8|#l7?;a`O$j3?CZpRqbj4FeY1hUlVXS^^j zaJ6MRpwY}@47a%-_eJsrs{TxsIG`cgGS&p61PW7Ek@&1S3ya%6@XoYvWgHK-He+-? z=nsXN9JVtwLOGJ@8SGex(v~XDv!CL!iP0flD1Q#6=^1OE9{c{&4UiUKGGF_I?&?P1N7CXZf z>dCpoZL}NQV?wK{iq(S?$8Ifm`hhQx0Oxkq=xaMzrLo%(#-7BbVEi7J*(^TsFEi zmla4AKNX3Wqn6cC9wIJ{)`b3-p(AM3{g=})y?mPo8;@S;+4^52D=G-C4o7K^$2%n- zH@fTRnLfuNTm3auUb0T|gWK$upp-F6W2{i5vzgJcnQ$WntOy*p3B1;n&K^$zrvD#hQ52QhnG%vx?FL`7ScVei~i!dEsRbjp@lrH z9X}3V_7-J}jUnvN^T>_L(dhy(9Yv%b61KGf5d2#yd0#%2BT5-Ynw;v&e|VRnMg z^=NQKRi{|@Q=(tGyFx7?W1?kbDAQ-SC>ggxsin91AdRv<&Pbm1Bqvo)G3%EYJWy2A ztyp!Rmq7p5wIQ!Jp@{cyrVjE0YY$afQ6Y;ottC_Ck4~Q_#Y*j^@p7ADWb>4=ky!bk z-ZU&utemyAK;IDxGX&*jPQL~HylNO{IV`evyVVy# z?p^~w5ph|}uXSSFS68p5Inj8u8xui@=AqTq)fcyHzK@|Xi<@6O8Ne&Nb_gGxfl@RE zzO{S7z-YRuoO8X|me{J|Vo;V+LKf1h0n^j!r#J z4BzST2Spc24Yl9xCR$XYL#{z)z6(WqU(Gey7B&?MB$%V6K>&E z0TRMCx3D;kw1D`y=n%l0AL;40T9|Qc?Jm^{&40dOe=ctZvpmO#Wg`j@R32sRrf5%7#hr z;Y5oHBe#DRE1CR|UY}Al`Z3t2Cy4|Lf3{Mb z<(9!w@RJsSaZ)S~`_G}PXxL*;v$+~CKiyQ1k=tOOe5urzhqZEwzwZ(Hwu|~8q(|ea z3o1ip{WHW^>(j&CeQkr=3Ghf;Tc(3EIcZSurIupLPHfrYxsoawsn&9~_AZseAjc)h ztHNk|DI&zuWj9`$6s)&rVqt;b_;hs3$wV5(l@V{7aC&KOZen!B<~20x<+@@FV@d7` zmB(?s_R3TXO#gDpZX$i)n{Y?i_%B`yDK`kP_qGXs&)xf`#8xh$f$rA3PA_WO{mqq! zo}Y|9t@YRSi&kv|=Op+kF8Ic2=n->7yAvdb^oLyqKR|nkfjDfK(;gpO+d0=2z$()df*CGr27( zk#P&9o>xslZ72i+P8#w=Ra+xe*Z6;3eb}nsa?#krp0*L7v*j7Xs1C%ebC_$(+LnY+ zB#mMp3pj}6)OWqibXRX*Qjs?|iDD?b>z1O&POz9TDs6Ol3gMo~|4NmXkLYw6JF|Jk zk_LHk0XQ|A$&_gr_#SBz3Y_J5-kLJ8lJp$jwrA5mGQIgWeyp!CZQ;fIXrLY0gFsk? zIrH+kzcPgw8lQK0%<|+bXSLY^e+Di3esGeL54^Lk>q?!x)#Lk-g_(?!6^FKhkG{`9M?qd zG)pe1BS@6bm!`D!Erhszad^CPZF`CX=OdnlQ>{ z>2CM^rAd3D7u#{X_gwD84zc&gV`s(C-Egizi&=x+^!{FWaf91c`Je{^UeNPso=negR@2lH4p-%e9kfr4Zk$>rHet*9nz zxjx@7Dz#%9R$qUsp@2j>z;Hf9B4vD7%;MkD{@L032M$av=TbO6taiQ+K@cI!RougD ziG<|QmIRaXqsC}&ai65%umfesPs+}Qc%L5fLNe3PDx^2A=V)86>~)#l1v%&}!-Ey4 zR8xnC>qb-<9Z|jfFUla_P zr=l(=otQO~;gt#(tS5D~KS<#oz%B&0qBHH*ICFTNOS9Q@(?4y9)ti0kVJf?R>H4_R zt1PxzcLwY)9Ju-)wWZcw5~t39UlJ?(%J>(wkx$QZpSL+*(&=qcuR!~ETG{CnZ%MHn zH{KaW0I#g6s7Ogbp|+jc8u6VwbusqfgBQ)&@y;CcieT=PMvan~Nq^p%^BMRAT=ag( ztz-#-`ErGdUA{%dW1}^)X_28 zHOECn*E~I&<*kunyR(mq_Qjw+6u#@Uw77MIt*6V$7gzG!%(uyQT?O=;EPj;cA3_P5 zCw+vz-?tZeGQE0?-Z)_DUs?p(|Ef<}OLK+fvPgq?xWCMrQEk8YCRCQZcsD)frWhJX zgxBP49jLyV4ONdmy{a8CkwbcOeNn?yw@|Eijh2Yv3C8Qh74S*c--gtdkp8hN%j+wF z^7lDT_%Ry+7K94Znr#$arm}l#(4sZ=yS4-tq$^7^tA^9-`0GK9jcngM4XCQUo_3!) zc7zbM-JAZN&KA1bZ^2B2GN$sIt|pj74Y^oAtGXsO>g7xrI>p3@d4UU>udRSTjO{6; zprm&o=x%BeLryM-75q5V3RIJA%ADa(@0(DWZTyIsI1f?I8YZ zcYi{IS(t!@uo8F73U4;Nxr$d2=ps)+aRc)U++c|ukCpgrk3PNA|kzgr9NEpuX)MbWiu|9jtWA zbNTV;Hl<0OE1~-!(KEeDi?QQttz4gMd()RwE1S2o8nwlC)R(Dqt3(0!Va}S3g!Q87 z*pWS>xh)43_x=UG)8ItC+NG6!dI|~)Bkt>| ztZSF+5L|l?P1I&zSzy**{5BjZOJsvsBdmDlb5x$OV7JZbwYUm#{ZSRJ%J&XG;rqq# zL@Pr^V)TAP4(>iL;%t9h`L^J)OX--s`DuYkBGk2(hR$=vY^bdf5}jG|ESy(38R2Zw z%Vdwy9)hxw-pHk!pMWhHiwc(KGS_0JB%>=4?a#F5_+xZdJl0kC4{Uby=l*P~dNT5U@M(M&evO!meVl3&bXu;pgk(;@5lR^w9omyJ6V6WDrhiy=(rUu=;Vw4E(8YeHRf=>0#_#xc$o zV{)98i;}tpL|(Vc#Tv9GVWY$BI$HSpXXi zw#GO=wX{K(S7NJmRK>eH`ua2bk>=4u>*aK1g_&L){9x1OrpTa<3Ta@7cj^~sK7Vtz zWw_QX;Iy$mA?LRL5W&NQ2`*$ANYoef%W|mE zWU;y(SKAMAqViqQ5Djpq(IIa=EkPNG2>Zs}jWTEX=8EUZfkop64JZ)0Ym>x;Y=u{N>3n|3lai zK+@5er7dG&A$V`k(SV%IjE2h}%VY|t{5I{P{D-IGM@zNU zSY=zNshV`iaJtc!*8=O`=OK1Z4TYpT>!HAIellUX+l{^qnfF1g^){c|d!xO^%Lx(B zf#T8A=-Tc&&E?j#L~)OruB&Bl9>uLuDk2f)X36VrwQjrVPY@x4oKK*{<2(*4EHmW< zG((!j1E0lV9y-{lt=XS!7hV41fVSbD{?rMnSHrgnDw%%>k*aqrnA~7!kLJcG%kzgW z7o^z6*DiSGpZ}uln}U3Yx-Z+dZQZu5+qQArwr$m)m;P9>@Aomy*ck$NnY)<};!D2Uq`=}V|SiadhR_*p4Zzk{BWPm+hbJxD^SMnqD)rdnX zv(&b0xyjuaNov5`t`BUWjO~k0Wi$DBa5TPF_5!q&%Saw1@gE)4$Qbk8(NSLESN>J* z0BUDr=zM0c@fPYy0OsT1A{+%^`^-kG?esp_F#hATkVceXQQn(tV6x9~u5`tdUyN)! zuPk^GQJFHvp|;EI;!K_gi&&yE-_lLLm08@$HZ0~vQ~|6 zH0DDlceWH;$av%8bR0F4X0e7~?O_pI2Q;uqi4ByhnXUgG2--OK#f^UI<+bT^y%?3! z7TB)TKaK!eUiq-LI-DcdwT3~n({iLr6-u^OaT5II(#UN6=;r&K3;q@2#J4A6tMYOY zh)T})dvjvS=4(g+2kMN+!TgVSGg!XJ7$^dnXl0#1i`k zlXTSnAH&cQ4a1*uWn6=Bd76ucAp_z)v4!I{FRhqy?M^w}Eiioc^zO6QaueYxAgY8i zcOl?Ywd(y};HDsA)Zo0m>xXo**Phki78-~=b46~H%0{{5UarvqgPB&`m4^2Az;cK8 z55$dE? zZH@hho?wd9pe4X8FEL<3v*eYjvztiYA8>|l!K!8+vX<^c)6TyYO8fkkzyaSUcNQ(( zDys7GIz0)6xNG^Mjh~LqGEeWWu07ZMnT&%XdBT+%8AxqFb)F*^%4Q3j-o0bP+O0P? z!wEvTf_`icUvIG3*M8bZd6P!in&j*kPY=<#?;V+%&G-V)SY~7x6O#lwIfQoHk1z6c z^ClrSZUhwj~okr#$yF_&`NxNoiIJ9v9Pm=a@50Tx46c;IqZxyYV=h(?HX(+ z$@{&@0sE(0p%O-3w88T1Tl(2E^MAR|S0M0KS3Z*#2`Eek4>Q zAyCtx{zaT81>!GWDc^g3Q%8YE1&f!?WO0ikRnb@tkOb>3c`A0 zJp-lL-yQwY=-Tkah?3Du-mKV-iEYxRtbnpGDu0=;+ zGc!$nInP}}(QjyAkg7klEP3#4tqST>koNMaN`1R1Wvs*`Gd@Ay z`Dt>ovJ@F^_s_RZ>}-$N1inWH%bT!&qn)oQ{8)JQFW&T4s(!8=yAoXIisu+HF7pzE zhfUxIc{DQAKnn6gROi_&Vp)cndD1ZoUY9s^-< zw&d{o4W&nSw%V-wHxN6@!g+kO?uXV4UE^dbTW-Tz~9VbN2I*L-U2bL=|l4~o_ zo9ue6fh2Z`Zz7oXbWyN%R)1EQWV3)Kr!p414(-A1E{uvHH( zB{?uaN>!-PPOsP#(livpSuYK5;Xw98^`)o|jKXQuE6_5$zJ>DP%55dor-*@|-okjf z^RHJ3ak_gWGXUmo|6%}%wYu7P{1eN$j0fX|g<(V@3qFRb8rks?3HnuO&G=!e-1|cU znBSfju;zDv&WBmMMCK*3?DRaazj)r*2i=JJ+HWY55=(RawjI!4Keh{fMkMIHsZgSx zjgCb9RgESEPpK~p+C}9PkwB^EQ*dZpG|vsy-GWNd+!VN3)KG+zZkwk-&v=*J?tSnC z>eX8Pb$6BRthOu?O0+iu2T&n0QMte96477sh^wuxZfvwG^Y2;!t~<->W*~QeWE2;=9HpQ#EJ)>QJM)>>hUZpMRsN!sMA;3k zQELo-ErHwGeT$0IDixCEJH>$62@H|$D(Mo^9A;vIV&@DU_WMm`3{=igq9LcrY;C%C zR))eG&pY|cWLmd=C|I07h&*M*D7?m$pMv{u&}C~yIte~5>P?weZa<%Aa{!@2q2Yc4 zviU><(Z64NfQqV=3SwqyMkAC>MbDLr1C*PM63c+Vu$hh*l@p}B9p<(8TIaJKm&;)q z=uGiGmqcZdKQ1nkTpe>`m6i0f393YC3;uLT4Gkf*p(CT%S^-S$s2TNp%4%G*_mt);Pz?cuYx52N%VTRDW*x&mtrMIB+k7su|a zy}SiV#CPnZ|7mMv*B?WWmR??U76oYK0w6=luCg~v-CDuD3ZclEmlfiGnTz3k8MY|~ z{qGhXB~4BaVep$9WkBu4^mi8G=Zqx4vp8PpBdy%x`+n?;EO#7!< zW_r0TPedu=LD@#v!9bLAfn_{|S$~5GV^xrE%^}Hpcf2;{9hfNo=C8XzKcPM0ad*Ri zTddwZZDn`}<>3sX_D!_17yp&O{V%tXwieHezgb z5qb2=D-CDzjQ@GfvL?Cr`z1)|uSf!~M(i>&ElTeZoLii!Ia~jl)BYe>7cQ_0QkAJ} zigxGI<^-c(DlTegi{6XEdx;WGv(vzWO|rmf?s~`bg0)>?!pCIlP0xd7ozb7aXmKL& zNUtrqT?;MD4ueI|TDA>d>=}7@XjO$vJ`4#&7gl@=nCbFzqvJcDx=&=rZ0o*EKZIi;_zPyl>bXZtf;~efT?6pO@c2DL-G!I(p&* zjP-hPvPTn`A3eGG+=Hr;YO22ahot);n?Rt0X&L8;hv6$kRg3+W`#qNK%~));y^`9N z)cO*skzwc(T(NQ**?5Ve8H)F(mbr2!Cct@>j3Jj|bJw}O*ll(OMwcfhwpedw zCMTwFl{Me1c+Hw_eorl4qE5##MOT0?Y6Ux?mZjf2Ps0NZ%Gc_1;>ROhYIMd&IEENp z!oFe|6;Yfet061g7@z+Q#r<$^?VLhD^viJe(c!^PI&ZIUxg+T16}kI}VDRHpXuEYA zvoa@^6l@{Ly*N1Ds1whmXUoXNDy-sSA9Y@C_V%`dD;o)0mU z3MGlQEWG6FfG60LebqNwOR|!YtaMp{uQLNqL;2M!7*e;ogl{OXsGW$UwGn62D+Hl9 zN-KleXbe7#YRT>vn4#xwf!Udn(dW7u%EM_xx#N*4-L zmwQr#m?>@3JZkMy6I@@RWCH=FAx+LSykqW@^s)NO4X-cfW)`9f+yZf@9jEvE(L`O1 zT4*mWyRVh8qK3w9^{71Im!}}*;MZ=D>=r&LWi%CYXMt-Y+%cqC^3sFY_+} z5HTc4&_fB-H{n%D29K{z%`wdp-;1>I>apY<;m$*r>04`x4CkUNUuLy8aqnG>r79F? z3EbXg`Gzhs;({at1N5G?n#K`XLxy9vtO<7DL`iVNt;*$zjc_j3e4kqEPfe}$P3{C* zP{(3T_T%cqKg@rm#6dk$6 z23YwU^29Lb#}79>8gN{`%IA4=;>REXy;#2PzhhgbR)RrGesCB( zZ1BxAu-V>UuUR@zgIdaTdAd(OZ!sMqB8q5@{j0=EL*VA*Lg(f&f3JLXDK)Ccd3vhR zR~4Y0{?XhFrUj5}^!nbF*m(VQBh=+ms6U)!c)99qyLmBreBt9F6Z606G}L^OG9mCc)E19tHRO z&OA@Si1!ZM*abrpCLUa@%&csZ^p}saV97RL7u6Q8^?H5T?lZ(~@vhFKo&9N7m~3SW z|CQ6hvjmiY@aV76)~1#U&K~!(fHY0MRKyC$T-Am!VK4~S^cW?~j7LE42*_6nWk?5d ze_>mZDxVP(p-|#dxzo=hWM}C=S95{F9%gfWB9w_Vb;810%A%qdhicg!ZyOqh^EI`hm~DPOgWJwc`js@})RGS0i%NT}zo>w; zdm9AA8WAyaC1z>a7_C;jTI+eAUSrPPlq2@%gK#$~<<=AJUsh@s;}K;-zTJu5Ull^5 zyrB0jp2+M#g(T*L@{yR_TS~I%>69k@soaB0!w;6`8?kYG6Y4k`H~Lm4P$Je)lDo9S zE!R_2BrR3-x$jB=g#PEaqb&tV4q6OJR5ZX^;OQ8Zun~*W*m614pC)D@zInNg*hkui z3UO)^2jM0Utv55Qw#PPr-HJwTx1WpV&PD0{1obWc4&#%19?5;HmeT;cme6(ohzFh; zbs7^mEd;#?L=*L#fPfv`@giEf#IlOYBeY^x^E+_5$TbI6;l@>T(VUtki^D2CLL&$e zjIrf3zK7tVBXH61CyC?3+hvZYE5A1;AQfJ2=X>JuKu7Cnyo%1Ee7n(g{;s6%N+SV1 z<8Z#}6Is09H^uW-^5j$sA)X8G9xUpB>8iw?45#a%6|~Wm&J)dwdwRUi99k46)(whi zXBB@m^ZOdrcF{QTm3NSBZg@R1DsR^#Z}(WA8~9$ubcg-5T7i+*S#3Y^gV1)0V(eYY z1qcuYI#p^ks&dZWKfptDA2Au4@vnQ@j>fG|%_A5-pzzPu!uT%a$dIGivBGPU-tLYU zW_pCZx@-EfFdn?X5Y_y@id4|_f>HyNN~o!b+R|4!(3IHxL&a2TkEcv^_cn$D5jpq4 zyLdBlsu>$Y?xD)jn3)4=dQ7*m1kaO?B8RkloY<9B$>)~I2ypJPg=Xc{9Br=I7>%!A zcT9=iRuk9RM0tfGs7Y4q?qS0COu)Ut&?4PI_=g)WS|%iG56)`Ut<-(5YOLFfyScJ( z@o}hA44HNk!z+YJnzBY~Pel`ksx)%pFn*X9@RvkvyOqi-AVi|ykKed98?(IVd0fdI zk}=yHS?D;JyytsTbwPW$(eEB<-0Ytm0 zu#u>iNfhwd?AB}2sL2&nPVv5dzc0Rye;Wl(z&r!^g81XbE0~=EXi2M^H0R?6GrXKL z-hTO}?fk-W9u0@jysQO#3 zic1~o0g@f^sj04~E}`fh1gTbBkyLIBGsG+VytYpiWnb0P`@?DI0?&HoTQ(#+Gar z)H5<+-J54-+hwya(~v!iiH1FBh+qEfZwHLZ@};SQRJpi=(P4zg70Icj&Y75?iDf8N zBqUEl=TT8tBuwc2d!)20l2oanlyu9%WVn*z9^oG6-`IQb1^4&atXfNmGkf1>?uuD@ zJF1QFB~ETWT&HtnjJ4IbxVzj>7H~~epMr!?L4koqM#Mac7`$(G7X0_E=*9SRF2Urs zWGYp9PNJ88QJ&x@HGN;5;>N#>Z2Et3umk|3{XmTYAyXC)b!A{88IF{w(ebBK|Kh1X zbPpE0^z(S>*s8;SPDKiNzCNAGyRrFrhikWR9&OoHyD%mcNSgCTl9R|RszbX4VoVftu>Ym&*+k(j=p+!9*X_YH?uReV(V+nSy9-f!1Igh` z3^=|579cI@N(qN@{+N%OIRzFBB+!q?t+uY=cINq)4Ij|Fr>eU%@?=Ggb^47l!My@_ za>c;fB<_1*L(PD#UUnDq+u4ep^d?F2pz(W0_GYWyc8A47i;J{2t&8Mleu8IuX0XG) z9z+K4Le=5EbolY|aJ?CZJMKMvwy93EH@)u!LuSAtp#h7j9)!_0arrQgmGw#>Z`2aUIlIW~!UJ+eq zc%~t2B(t0R@Vx#*?Geoy>TYx^XbT_3b+5<6R=-`RM<*gTdUygrF8T?AH`Z4f!k)-sgJ+6m_FOa44^)5s+LrFMu5$@KCodV6)p}Bxbd@_?X#7i*|(9 zjH1xz^!WL7`+9WJ*ZbB%mNb;ck}m**4t>VzeRHMQgFzpPs(T`!vk&a=aeM1w)e7er zI1ueSo4=dGS?^1>_22?&!;`9@(+fmPI{jxUiX`JPy>Ty;@APKoVl4w`Tg@gsti#8B zzicJH``>rEfu`ymqc?Vz67%arT2mKhteo%PPn2s!-mx&QB|RX)MFTzBZ%>oBUt3Vw zrF1;$;qlO1mpSwPt5;iE)jB=K z^`YfJx1eg)oeocX4M0Fq+%}Tq4B@apATaVt^IKF;rZ?{T zydOu)VX!o%Ew;-Kp&)9W7Rm60Y0o(=4wvI&l$@|dM`z}Qy(K;ft0zlGq6FF3)ufE} z84dy(zSn0YuuwKRy9Iz0w`WH@_RC98iy}4;4&O|}*;B0#`W|F#FIxj3@G?2rn&VWo ztPh0bt2_KhD=AyKt@&|##f&#N*xnqN(UbQYQGy_c#^0Irdfm>>lSBfkGn+A#RLt}? zXAq+cU88?txt4EdEWAqczWA({r&Eu~nY_gMqL(@^)nl2Z8wl|1?7-kYM+v&SIt8*U zH}^a;W2Y`wa>)GkZoxR2OG{h9y<2ybQ*3q|3?@^vJ^I=<&$8w3*M;?Bnm}YBrnwwH zTwimJ@qN0*b)#t%j`&~cvG~h|-6&CD9un0Gw?GTSGXbk~M0Aq6r?a3P(~wg?9xoD9 z3n03q0W^f8R}cgJjjK5wULOakbQw)Mc&c#@P`8l2_2Y$omSZqCoN%=0Nz|1$T8~;-5j=r zA7~T3^ga~RdQZY;EN$;Lqf;BGsW=?N=twyRdcMsLqjtTmj=wYPcIy{M5HE4gaNiZC zQ@Y!*&JaBEUp@&ryt&ZHna|c`I6W^#NugcjQ^|!^`38)m6!N z)|tx4@c=ucc15QmgwRaD#vc}$tF^gzk{n^+hw`nZXcz)qt!>z!q31)J3>RcI)Dr|c zx~LblKnM9|H^*k$>u33(aGo;jZBO2Yj?W?I_G~D-0#-#U$A@Dqxh`UIqO&_zv!cCw zx}s`nZN5;N76CN$M@bml8|&~f;U04vX6RSRg%5GJRB(c{^V>CwDP@~j(oy_f1@zL7 zZqVEAXvY&*o1D0Jf0RqHA4)bdxqQE2sTb1gEKu;kW949<34UmS;9Hj4s_Rw3B|}Sy zS-!^DTJ=&ecXyE?lA(Wgc85)pjYse-3LzgqLv~~)ejJD=@){n_8=Z%@N=i~H<+T%4 zhipVjzyQUNhp@0YKfEA5ePL{FlS^0Q@il@=&bN=jxQL@@$-NT-DcAV=kdImjx$TBe z8R$my2+QA>U-iYz8LDQo_)!&tub~Lp9ClT)?Tb6&>9mPF^@Jd*`l-lHrqPeh&OBNF z`g%RUIvE6wrZ_72I%YO)@1Of>f(YNHfZ;M8%v10-=Qni6u~jn+fgPy6IKo(Q5z!#| z7q@F4=9~UEJMF!r<}`vQ5)RVuD@F#DVFA5B2qmv)265CR=m(g{r(gR#mZWbWE$o-BV&LIIt}EcyUSgrY7d8ZUmje5*nH0#*e-In3ZsS*Xvz< zbEcAP1|(PZUBhm#(}@#Wy;?7R(MUUPE% z80p$Xw@Vmg**IsjpO;Lz(?bb;#11&${xPY+n23?a$4=bAHncg8}sWMD|~grh#wP^ z9CjyYrn}KKR~$wUUGY>iJH0kqPDJHpV;)$UTSogQ&C2^Q3X7tvx?N)x6_RcFwqI{i zT)Az%&+lUmHGuG98+^EFn<`$Lv___)<)3;tf;n0IbAsNBZnyCkZDXyQZX;Z4#*!C; z1)^*+GGgdBF;A%R5J76<05GU-4p0c|!yT_guSB}>2G7)+L>mbS;*Xu1o|lHqH++QA zj*bkThwWcKZzbViR0x#p#Pm)hpDNme<(2TB%7^K^TPfRKDKgl#e~ZKM8asN5adLVb zEeal80fdr>cdX~Eg*s25-&*`TL}XD2E)FGAX#rMSsue?sFC3|2KsO>tZlV45_WjwKJ50qWEY=Namc~0&UMNwJS|Tm-xG`o!MI~MN>oYL)hSK* zx%_*qiUOft+f zczs{O(|m?j3asnN-63GKS=W?3!pW;2b8ukQ)^W*NIZlduD0w6vry3po)5PI z^fF-63%Ir~8&-08B;MV)d6|kak7&+Z*$hZ`Wvd{TGq}7OlaH*X-sr!U4neR0;JOXh z^ZzmxYc9_-;yldEj6&5Jmg(>s>4NO!XptM)D$YJFKj4p6mWisfm|(iXMM5? z<=%XxdcLXTVsa1bOQOv<*zshH8Z~U{wS27T8MRCRr!zV{1TpuLAJiZ;G-CQ|1`oV(t}d+>`cC)JmtVN zRIWUrTvG26=t9Sq){aOY{rq*#E9PuYBD<}(sv?YdiZ+IY3~ZRWK`tQ!V}hLS#5|}X zRXw2t=^AUxpVP`N1w~x;!2CBv{BffHIfnn*s?@F;YJZDOw^qh9T!=iS-jxbxL)W14mxR@{%>%71k zI*ZB5QA@*(wOWE#1>Ub1%;>q#L)tIZVhU4{F4*TOiR8~uW($yAB0`nvVA6JQ^5pEG zHX9B%0WJbwExb$&|4YT#<`vetff9hgeeu|a*ZJJOWg!tQ5c56=21Cw+V1${~czotl zNPNC$)@}-bKjTBW&YhN?PcAJz{-}j5J|apALrjd4$=8-pKXN4BY{Ymb7g++tw&TYS zi4kt5@!LwV6Q`d3LgpqC*0-6u%aZ)y?$;_TyD^e~v~S>`ap3$|&1Gk+U;Rfus!sXO z1HSsT7$gj$x^M4!$;cE;F>yftjo7a1b*G!$(t+nk6T^0rM^hc5x~A20W(O>l z(7%j8pU}Y7KYB2w6;CTJrk)@xOYwRIO`oiE8^7!(CJ&3q`;6$oO{g>R|6E`a(UL|e ztJ`W1hIJzX3a}Z@hSv8L{3qWl3%i^C>uYULb!B^`gxQ{?z1e1% z1WsS6TnxGvPiDuM3`We^m9?sS2$=o2KHMAT+VzTJclfOF=OFQ)YO&^dV*LewCgA_1 z5+VN2{@=DI4}--I@jo#TkRsH7qXMM=MqjSdIF-wu2Sd>MnE!+M_r{Tk6#Ds0ZO_di z)xrJ`*rx|W68~x?Pn<5J+v!Tj2>)Lgk`@EDrRaZO^&jLPOz}ShKtMz={{;onK>iQt zPX+eh;s4iM{_nJb!v6OP|L0hw;QyZS|DW)dMq#tX<|7phtkb%XFWM%0(1<-7Up!x5 zvA3t+R?(Him5LRCHz#8FySH@9@Y0(88Vhfpv`mBP2P%rOo4$JYhC)vvUPC{Xx7i0ZvC+dykMJO>E zLBJ>AkC6&n(NdopOw8wQQ;VLhGu=i5#4%7f9mQYne=AyW zn~N4K2X8G%Y%kH-Q~Wsgh6-Q3`r%CCkcN590ss7GdR#b^Fme5CsqPQ)!4J!_si?*J zoefto+wqeLGp-~OUSD>Uyq?^Qx|STN(E+K@*^hd>!*fo>rD`9V-Gp7T;~?g)?}JOX zyjs>D383^RfE8zFe&gQJlW=OM^vgMRBnbJdAAes5sa?*GK4Aj$v_QfeVo+YP&Se$V zh!n|pcv+fe44?bSHVaxVxh}9@f%RMi&G!(dW^H;U*w6a{9Hz}{OVqEEKQlVKmT;Lk zLiyXvzZ{pWeM*Y^g2SK8_Tu~=&+7YI5ibhwe%TqblW?7O zR;L&fg4)Z?hcj!dW+66i$vcC}^Npt9z@{&~4jZhr^J;{Z~;F=s^`~Hafa%bq<<$OB~mx7oPlby{cO=D~5mQsChLNmSzE1BSeQfL5GU1b(WhUk{-iTt<~+RZLgSJ`w=cB={p4gTt2`SVgei(+w$z z{C!>ST*OS#OWuboCAH9^43LB$L`sWl^=6r9AjC>6=5Gg(`&L>9tMsP7OXef}CcWO_ofj+(rpG%Dh&O89E%IfI zx1$%LwXT2F54`joJD+m&bPT4WFmSbRfhJ5MTGP5eU@=?%>hzW0-p5_w^D-)N9FZgF zYQIArD6kld+~rh7TT?Zvq=ky0%Q-lgtHYQbcmM~9&>j$>wBMeuk72{Sno<7^4Lu7X ztpTS{3LD+EzYEv}Au#t$3Znmp{Yy#(I;j0AJXH51I6? z^pMEP&R2HRBUmvqzsO^x3ch<01a8T1Wq!3x6xl+BKBa|O`$BfbEu}TvNh#%4ar-{L z($$)RgN*bnMq#-r+vp`(9<{XtI?Cch)y=wGk_U(KW9X=FN@Q$EX1}x)fneQI2;wkVF=(Xv(Zm zM=aU#kI5*CXaxm)c138t3U?~I0c2{!z58ahcI9>q@^svkE@_vM&!oNLcDN5kWA?!> zG3FA7uLE8(W7D(51F(4H$PjB&jhSbI^yKW%BEN)FK#W;z^T{K73r`f5p>fF=qJU?m zwRKT{Km2ogLxOa0lg%hDgDzu69M;W29^1n!Dt>&<79!+@^mYQ?236`622?25IetP2+%_y{XUw0XqoUe=iMpPDV1?b zAW`aH9$_{&YAUo5!~NX(r|6_i;;%<9lNd^G0S=wgJZoR;Ubj_&5B%C={?6450@{Uj zL_{Q3{gdN1qnE9AfFJ$fmlMjxo`3 z_lzQWwrM+Gnhw=5oAM>zr@X7`RLxa-x%1kq&v)E~L=%lnL&;~cPhkev#~7|{zM!JC zIqaM-{!PP$fj0~J{SZYu@&qIT<6m65Z!1ing_I@TO+f|K6*7~y+f9jjZ#asx6x)7$ z#~=E`lXg$h(=j`?syFW=YoNbv6~p%XsOpD<1&!*>-S`A@Xz{Wm=6Ain>=zw=hQt&8 zu0l$dqs_^H0Qu=Ch7B7M`o8YBw6F&Y1&EOBLl-HX|8sevL=SIiExub*Ff&s1gIyFL z=Q)lui}Tx)Uk(vAV~)v3y6Uvll-(_Eol#+};FM|ckf`}e!G6uL`h*Sb>E!AyNJ<5p63zkz3QLWh-YXve93D^^{PrI*v7Vt#4P_TCrK>E!F1Rc>u9 zKj$(VI6+@{c^mm>yI7lZzN9Zawo}n{zc4XE9!noHC1&0+$sjQQk8(_YPih&PvebG> zxRFce*s8$oAuFkB#t|-2%a^MMlKHt%E?p3Ob23}B_?VPy-nDX={WZevcIcpWzvO&+ z!>PS#S};;yv8xd6Yj$9xF`X-G`}V5B1dn23)<4pp;5I{Tr9{YkfGis#6Vl%Rc$gcm z9s;8jGEl&z!4~RTql1~oR}}>hbgb29@OleP_E{0FTnUP|t|mX7b!8B`5KrmNAiixH zx79A+DHxr;eWd8nB%mc2iBF}yBNd`=?x^0Igs=>UyT|^GXqeRcPbM10&rf?ZzzUPT zi77mQ0Lo}_-3b&vge%jKOWSMME43yme?Y|0yo&EM5hq~}yuNkF#A?>Bwcpi0LdJi* z`&Oby*463cDm8K4*ye4QUT?}`PoYSqv*qltAfUmcQ7>YECzPhQw|paTWcbb^ZWxF%WD?J+yrbP{jB-VOpoG+#GZek>mrwM#biMmDrU#JhU7LK>u8=)>(f+Mj&q56 zX=AgkldNp&`@C6(R#b66N|SoD$bvI~2eG~!`!Smn`CZ1xL(mYTs^j-lzXHLlCB<|? zFyG1!Rz3U`&!2pJXFJ;oVe{mij7402l#ydY?vG@uSS#yh;Qo zCJ1Z1zv~mJpPn2M&}=SjlFWD;XQcl&V5zcwxUsIX>93(BmD^NxL=UH5lZCo+{yxhrcX^f5n23*wMI6oWdYaA$$8 zg~6*^*x(KbWnf*_WxvqZZkMy}HpUOW1f@P~+aW?;!@PFvI9i3MN*9l?NR@nA2%U6q z9Mrw3xCeQBeT5hDtad|E%pyu&BXREN7lt@l7r^)5t($6Rf;V1L0G^$0-yZ=tI9R{Y zy@Dsr`|-ezQ1M{DUXy7(%eR?s!kpLMavWyZKX8%@$WxZjG&4|U8nWsbyaAA9{27JuMG$OlwPIEMN>DWB&Jea>AN zvsszbJ=$RZGBeYnHEd2fRUO^UAjMpyzHcmUwT;XK>d>3(E=4ZX4OJnZnTt?IKM9F6Xt)A>+c{?9jN(`0@lUUXk1 zMN!?yb*J2kVdub%0YN7bMVGm(SXQftX2bJtpeI(#(rZz~kR+H=QZF%}qI%V`fJMzS zPnL|rX}}H0ORUC6A<6rDC_rv9?NSa#440or)hmj<_3gKXfBDl>W$Nkg`B-r2GUJD< zrI_E55PyYI%w|(95OtWb*wn&gU_A6|P%ZeroY}azX+9nlBBX5?nMY35QPQ%k6P_>- z2*V7rnEwe;N7n>MaJIxUdW7lJqIg1xxyM(jH9)?!y!(@~=te_jnSR`b4BGnt^Hsu? z)JkaVfodgjnm*M4fnxgOwy$q&E0?x=0iUnjn*2Dax-gnDnG4-aLSFlg+tHp%U|ELZ%W2{)uA{L zckdx9XzI7Q2E8uxV09DKZ&=~fm=%>c)YTGEibIIlRNX(m#f&^;!-o^in4U$Hsnfc6 zvVl!>r?WX}e)-M;fT+4E3%gbAHNw@-MG=2&lXM!qz2qg=^gm4=0gp&4dnByC)r{eYfUJI zEdEQoQ8~WGtpevC!DZKj?GTXrsBDjb`saX1c}!oEI^3(nXLZEq<|x6Sa3<;0#dE>L z;2aW$j+V;>ec!~#>&TvRJTlUBUQ^U)uYoyj$sjV?w$8#`r;MOTl)|>0qwo@RNkiqY zk~%gQPK@Bc<~ND>I3WZE8y}X>w%AzNd_R?oO3-Ar8y?5eylA$LNLix#>`l2ki~E&` z?l;a08Nmco&}OQBv-Y_Vl4XN5tC*MgH_AO2j3#8SHLqD~-58 zP4!ygM>;ppzsF<8W6oApR0sw#;B9&onR z-G!%;k(!^mNzB^C?kE|#Qn?O2|VOrznZt7rNp}N!lw#67A+F>AxFM^jS>@sGw3i5e0<` zDJ~IX#JAeG13`puDvU;?Di97elA%ewZKlHpgM_|x@|hKzvbS+_RE+rvlCGq`3(Fnr zCiBG&pW-@iN%cbmPlW{2?%L;4>Iu?Ug8ot_BJdzdQ2(0CoVU|8hoP)_(Tz`KtsH3Rd^6A;+werH1aFmp3BsBeNEA7wQORYakQ;CkMGrGZFe04k`#DYs z8xSN`q*J8G%zRPo@_}bzr)8gfWAb+Z>HyO|9Ss(gg!j5rLV+tN|5_{&LL3eb4*mW8 z|IB@<(5Sh&xfvO6XE-<&r>>G~qb5Fha8h*Y!6Jj@!5|*i1>l$Rk*Ls6fVZ*Ro&G%W zCFA=#(3FrzY!jBR!#dw5R6N{d;IKQhs`yznC{vy2l0lp>bNws3gW;{9Uy*76Ia7Dy z3$N>d^9&5vW~`7p8_?emD-`dsJml{C%B$N@@tflanVrA!V=}r2s-d=5C6~_1XI)fn z)m(&-c0)!=?TLdv$8NI*&a`G2h+sMI+>@mz=4H|nT*K$QCcM;21^wj zQbvLrvhlij&wQjf`b)kDerN+t7BL2sv#iNfwIBrSOc~|QNy{sD#9s3VtYi?rp6?<= z_JSDhULD!)v$CK%e;C8D-`25&IH6B5Fo-y>{%7t&1lirUK9kJb&ka>Vh8royv-a?! z#Yc7QJld&H$2D&G~8$V(WytDr=c-Fv_P#q7oG74`637#OMaZn2|ioml6) zq&G-lK{=1xbVNa%smL(-V))DBoOy^9EZ28#sVVblbzg$qZVnG`!IuR&2u!$0yVG8_ z%o(c-VzS-~%&)NYv0*GF!FyOtnw6Pz7J~i4yFXa4vYce&WX#DB2HWz@9EfNuQVTEz zsH1j>+I6ZrTN^Zl>gh%{>N7o`OhRaX19akq&6;39F}u2s6uB9m>zBlrZBqF=6lVIl z#UuxSlm);%7DVqF@hY6I3(Ne6S-JsI0S)iQTI-6G3AR@^{RX0}D1-w1OSz@i$U$@; zTmSAOC`0y|?mETlj5DF%&Un6p^Pb~1@N#MBmkvCO1KS>6PCY$g$lwLrcl9)EC1+8x z45c$f?^B!mex9mY(z+5E=5>;1jeA_>P=DE6#85SnP7KaE6#kqFk+4JdGLuLV$xN74 z>B?m_o4i|9jy^z!^1S)?Jweij&a7U4mE{Z$U}ZVCFPFQyAyYV4Yw^S>JAi%5XA9bV z@t8gttyiwd#GpbY@ZU{ut#2rs1)==njD3;Y=7n&wWNzY>&B z@djHkbY0Vyd(BBsKKK}Q*5o!>EP+sASYj<(12ElQ!675RB`)B)^oqIRKSj0^2IAXU z(*cl!Za$cmZZCmUZ@AA}?6bmvBA_<0Q7h1*2XT>a=$Swq*PZc0ckRr{i6}>=i9`yVbtv9i|%^(ENubJt68&py9A!rZd4#boK;v#3a_NKF;kg}4=ZvoT&5%; zp3=M6k>pY?kNV$&sDJlMcQu&0=;RprA4URLS8+mE*;N^Yuu#8VDfn?5ahOhm;15U_ zd7pC}*67|FbMNw$asI$_s5$SretEL>+~?sozGM zBQQy@=k(vsse{t#iR_U< zWA=S*j?N@iVz>kbE*vQIS%WcxigN=0i?DZ!l5A_DMoV3`ZQE8CvuxY8U0t@(W!tuG z+qTu^zt8#3fA4*}@vxtA=NP$0WUPo8b4FOGMfRE28BMvJ3qrOZI4~+zUdwVM>|L+P z{gpO*D1509==7k6zDO`W`>FG>PR32Uwkn0}amlcKdRA${tR>-ftpn4hoMyrf7Bd>k z1n6-ywNp3i-h^ko?Dv(i0uq(9NH|t+!Z0JP5G{sQs(vjvK2${Z3q7K2ilCt;aw~c zJIh8CMe){d39Mhb0OyTdyqOn(CZ1&ACAYZRL=zM5+-F!_JTK;p;w7&hQJ-zintijr zmw|UsXjrIIJ>qk$q*YITh&>dE&uf7UH8$u85$d}0`TY8qg+n$aWC};}xv`iZIusug z0VX>ax#Mp*7?L>vEI6>1IO>!8^fVQfGI`+=8lPkL?m`5Wmzg4#@xv`99XYE6wct<9 zA@vzSE@(dl4nz=P!*{906SpOosTf?l?MI!J?UplwJ^ErIJ2N44kotkrjYRx8PGAbg z)~`jJt#e`i14qdX_e+vSJ{Rw6!trD0^~PjGRy^h?*JvySWj9m7a4h_=>Ead$SUs;e zB9n=tX)!D!Z|wp_UXuBh8qv5R$`;5#T33ufdMq{U;yGYC5@Pp@2jV1Mr5EpO2ps)G z>@k=F;+^tEE*0tn5$UApCTcdJO!Q?ZTNx>@{(+I{4i?J+v$3ruqXP@Fp;^9di|KFT z`#v`?^-*@$rYCJOl3gxyZR0bU0*m>gjE{jH+OKgI1UC{c2W)g9D3XQZYNLEA;zAz& z+PVG5yZa3L*W7@B$pxSh|p^t83(hB&603QYH2m zg9`;8ud?%bhTPHNezYwHX5HB0dtI9!53da8EIU+_S*KyIUo96h%G$c+;eMQrG0<{1 zSQc2kO&pl$tSxx9`_~;vBNlA!bKzW!m3zDlT-%I{h!R29dxgB)dJsEmy9gyNB^9-F zzGm3%wfF)2Y`jGy_C~ena9%82?Sf|uWJ7_k9?ChhC4UhgK^u<*D^LWHzQ>2}_-<%D zr!g9I=Dz5BDQrXjaQ`yq?VbYXf)#luXn}AQc01xIag>YAALIWe!6cDE0>a4pFMjy9 zLn20e5kj^vxJKymVlwkw!*zOzOLod{WD%sSKi}jAocwWv?_wV3q|L7(&RV> zOP7@vx#H^WW3z7FGt;S7ye!=e$J?+ zdB>egGyhs@0e0Crrl6b;#S)HU%VCmA&)STJ))x6wUG{X%+A@W@4p(OS&v+N@9hc%g zo+8k0kJ~(MN_EutLsqJ>C8s0Rx!6zDPkXzoQtp!=)i6V|p_0mk5dLQC#*@(eneGbP z5~B`QL>}B|Ji9Ovr$3noqFiO~NoUo?e9_oA#mCAyhYHR6vsDuWjTMNXYH*VIP*fVJ z=mI)nK|ujWnK4pJE6W<0`Nggq{%4J6io8bC>x}#fsE~ zUs5|(7Lxq0twhXe);QMZv?QUt-@y#%LJtFjNUi-VB?UN`eJ7e}<>4 zwZHK-sUI@Kj%t}C%$n&1<<%W41qDQ@OW5;$cZ*AM0bLXFN z={0|PgN9sq?a(0g#TM}@+1uXuv{#oIW*1yI#^}81t~ZiqHgO1Wh{vnxp%Y{x7nXH9 zOFA@kQp+S{qoHQ+eF~ISaysemPyWhm-yFZv!+Kw86(qv*^J>HjV5?&2%y+0r-(A|9 zOH>?P>o9Y9ia}Q1SG+hbk>rsCKk;RE^O-*k38gRSd}?ZeLu5sLkr$!#s&DuSsY4t7 zTJNw%BAZg(K{x%dFnV_+V2;e-^J>>ZV$VtY9655BD&}Mw>cK5z)K#^L(eo0lof4A2 z&LK5iihxeHj`*?2v8NPK;rSkgt}@cRG$n3)c&pV)7yGL5W|eBo=92W>^#SZ5T7JK# z7WI_nBgYpDDSg7%pg*4nwK0tQj_`Plg_mYnEy}dXC*pU+!UT3PF_9ray>QF1GU=gd z&b#z@8A^Vf?`k4888A|Cj$NKDJth}{bPA!Vl{`7K1D~nhQ%FBy^J+a}?htCSyFvU7 z*N0H~(($s7gfl-Lr5T6xAe02e8Vl5`7wdJc1UX=DZfdZus%s0j~Fo_f*A;VWr1r{|)3_jCUZf?;dhS!48z{BijW%i9xMx7%0@$e}Of|U*L z6x=6v{DU?o9DtVaWGvbKo2}5!2LE}xi?k9ioXlxpSx!!u$R#w^!0ShmB9aSz;F{3k z8--m)TIVDR%un}Ua)P*6Gya$zngC%-ut$hhULzh1E%^+4L0} z?Gkz!ILA0Z=H|F2p~LSF4C{=+Ge#WBtYskvD0s-pH3nf39|Ge-u*qnj5pwoKnMt%= zVHt)4FNDQ}j9qzCjajTrRHM}NAKz{T!9hjMpouwA!2*!R43XuJ$zfpYiYgNK%_OnR z)iny{-B#1Ke-a__v(myd_g#W9R6}H7kf9^pKFenHUF$=L$!zg)2!;g`7B$D-OkvFB zZ@ESF2^$jF$$8eN${S-&H!$r77Ac}H$B1#&2Ea0agNFJ8vd2Km;pd$z9!+_GFVMP) z$fU>n1x3o^$PE*1)|r}A#ZiLE>}1fG7$G6&T6z|{ZLU#M!VCwY@(U7na;^osbJ&MC z0>$x$HJ3ay0(be?xUQ~H`O){7;nT!OzqYNlVPnHFgGYou0#^sY5QrlCNEus=I}Mzb zD>xnokQ3QOnc^WKrxJ{n^0+fRm2H{~G>9!87aY2s_q&Rti0pZDR)26B1*_PJ#0Lgo zd}H>|hcR{oiSlTA!TmCNATEgr zV9@YkniqHE+Leg+8!3}3`9_8iT>1#AzZ0Y&uE4|T1y#`-{g8E6=#2Ui)9rXH(XZjPyC`Ze$&xXB%eoO-Lm>5wV5VNK! z;<%*0&EE)UVTTmMK=8?&Ev%P8-tf%ux9q@k;4Zi`V9{BisqVG@0MtE!fSF@iQT4k} zK=S+TYr*TGIFTHrum6NBlBNjg^@^jF)1=H z$1onG?UhNxXQ4C(3A1pDc}kPw|AL51qL8Q{vAquJ zuw9;u#v>uJP#yEDn)^&uEQJ9zeBQr;N*7k_MQe3uk#mqbs zAU#~$sMQFE@_UflJthvQ-^4a-9qRbCvH8s~>Ws9HVJYTILJ>_a@+ zF(kJDhq^~Eo8Z{~dcIHBcZSdjd+{k567R+U`I1y8JwyQH3wBp3GJ& z)E1UjRM>ZM`(CbRsvdUf`5U<-LO!LAkh|*Nl=nri?y<%ipaK>lktjL*zm2uOuO0*_ zZk)fm<=*vr4;Rr#2w=}X@V~w8{xTxJ_deRl5qWHkG({MQf6xi|-LLNnrCrSsg)i3U zXBw5r>EYg@Ol~BhJz^*Y9iU^DvCHLg9(k<1WK~rvsSCCN`)l5v@O;0ZuKrzl;MabO z@edjGHdd9}k6MoCvexn`&n&L0_fpQsh3D0}_uKW^s#!?^7AL)QN;`zDi%o@%jSd>kUK{kEFS*U3 zgRY_u9saU2C&c8^zIzS6IngzzP1$)M&oF>x{`yi|?__A69+#8>$Vx`ZX}=xaHE*oY z6>a3?bl;ZI@epWmnN4kYxCqqz?aSY_4AJChv(b3Hz7gPv`3We)uogRL_?6|L7HLI< zY9gwC^c;8#oB+)B&d4xotZSItcD<;?GmNBRB542pMc>W&vr8-T?xt&bEU|i6UmUE6 z>8MObGD3uf_!X@sC9|B0o>z4Y&)v=q8V^=;ATQZ%v$NG0#lwRXTd9MEM>#E zm9>SU6R8a5JYRj&HF7(zCL_x(9pgs{DlZJ&UsuO+@MvGh7CvZtx|^wAE)HL_TS)V+ zhfVoR3#lUafNx(b1SEj!3m@2RNG@n-wCWV&`O6c1 zlyWG6gsZa-CEloLKA(rj7`en>7!m7+eNiEf8nerJy``OSRKF!#P-+ldrt`d>z_i_D z6Hv|mq%lV<>}adwCjENSArQcZQCN4yujJLTOGozAk{F*5u(IUWQPe6i9Q;9ESLRkG zATu_B7gO2j&$*75W_LACS0zBmQKk?C>oD(h_i-0lfL60YZ7sXQfs(df9P%RmNZsfz z<>_48in7k5hy)K;&n^lencP{e=N)d>zmaqc(>$qQN`3kfWs?cG%6? zjX3vXpKd6Yz-vsv+Ha*TH*|6a#9R`C#(AHM!V;(2!^HJI#XwNG-1Bt4ER9DAr9qe~ zZenxA^L&klj(l`y10(#jlygNN>)?G*(ZXNJh1TxOCblV>dzs10Zz`{gdA>o6SmFX<=-rFvp*WcI82`LTe zKN}&EuTRTL>9*9?ed>D3tB1_lT~k>(=Sc#5?z)Opiry#M84y&L*s!KdUtG*RwST8} zIllj$AUdHB9xFYojFAMNOxQWk8_uaDWot6@DbYABNHHCi1W;R=^_rfRWKp_Ap0x;d%a#Vf8Gz94sK zk|>>{G-s4u2ZJAQHB(Q4Fl= zJmGF2MDl-3P=siBvEUS??h$TmF_W&aHd1Dn(1YSnF6M~=jrV{0h>7gjtu+GUD zXkY6H&1?Dz<9(As4>hPnL%KUvHM{-ejc)HgSrollq4CykfY*`7#j>O+1Fiz5A*A`$)g)_jPuyTaeZu}BZG6n=UkwZ za~-p}nObUap3TqaYJN6OSU4zmZrJBXRSO`kO;?Bjd!M|`U@jP>K6d8On0YY4xZ|7b z&y$abdZr&_c{agYt1&i8-^BLsq8jX8Zu#nSzMF2dKJV@m-y0swX-ik^_j~G4hcxrW z!i5P-IFV8!cf*jp#0`k(T*dGYTz@#G$n~g& zjoGZ9WWore4(^_bH>>=NFRjIf@P33Xt)fuGywz6A)_?;mItW!IRg!<66m2Ip{!q@J zm9AtuTir3aVR}Z-x9-$O=c5QB(X>v+My915I^+ow(>2N!74;g|@FpC^cwtUeYUf}H zO-l~KdK))Nur}D>l4HP-XnamQ2CZvLl_y~z4Mz~{2=gDe@)szfbhhH^nLN7SSAJ}2 zN|F(%j=Fu^#Kj-l6Refk5}3RbCZvw9}TqGi1T%Bj5v%w<-R}`ziDBNY#x}pF9{A?pN!uBkGgU zrm|Kcp`A!;&^Ayq#EZVHxqW=FZ;H|{5$S1^J)%542t|=Hou7~r z8~VoQe2HLMP4NRjihq!*f%RfH)#^t~j$M;~DHZAjajnPDoyD5&{Pz5rj9fUvfyVQo zvQyYV#M`_!lo6dSKj+>>(Qn?;w&^Ek?AHfxVV88YoHeZ$k@6N&6Z3l3>KRH`^PI`_ z(WTD*`n=H?1K$csUqe_~-sYGKK72wu1#gd!;E<<$l5`Q~9m%o|B ztJ}xK$3r#z$3uX=8uJl<4L-@ht=*Wt0uIipO4AdD?E$0#lT&6H+z)qmShg<1gX=`m!HBFz*;=E&^QzNvY#_OpENy5u z9sh`xCDK8`g#X5Gq+bMW=i88}XhEiGm4MLoh*iAaWg=Ic*V8i_gev@{4LOsz&nZk- za2}pzAu^G3>XBRAyv|L7_cB)Jn@YeoUnQlGoj1WNOyqY%pv7Z1ZdsFExvKR0Zn}Jx z%GTky+`B=8h0Rid{e%L=Kmzu?cHrj$8NI}=kSyGyvXdvKP&>Jd)m7sGVds?32E$fI zvn&LBa7+8qUY68{yj-eHYi_5Hs;fT_pYYV{xL6fK2J@Y8gAO>-ZEHuY2^t_6y@|S~ z)@C|M5ZCyUvO0yJK%@ud9E+Se3Lc{oP8J50h%oZfGrnwt98J-kyWAI`%gLB<*~hX@ zE#-!y1I828&$OmIaEr;tO}wNQ6f_L3GQ}5c9<)T<;d*-?!{3!ENDVKib&a=A0&?Q< zuZ--LVZrVjf+Ahrnr{kX-KF4hG<9D>cqvq`b#dhk4R5l^@~G>L|Ne79ZJVHKti%33 zFD4$Jj!vt;g=9=(uVFieOvs2&ttQJCP>jjUX!?3*4Om|+y;Li>jT2r`{Tdja2$YOf z*Nf3y;xr#Hv(?Gq#aVD6f0+!lDbS?xswS8KaX2P7=EI2ywoVU8_?$V6Iu)7Yzl`5I zwHD0Ugx>$~bTn5sedAr%v|B4K!19` zKB~+4v|up3e?Bn@twpC+NV+xt7V+M}Y*!MOd^c@Y77|q-XRs}+*i04UG*tY-C|Un0z+f zL!7nm3#DMVQSgFzPtdmst&gVG>HLbMQvSGYvZ1KSX?%t7j7PN8u*|0m{cnZ=z!IpgB2#bAf?1|JDikZnE+1dey9$Ft;lgu!lFIv1?2cl6jxIXlt<(rXp*7DcJq>|Nex1ng$?h2nO0l5OjS1JWDtO{;Teh<+ zb`s4u!>E$5u-c}iOI1!pk;)}Y=2bi~>)B;YBsa$aVbKA#`d_Y1JYUY?fHz|>gaGZg zxBVGbNMzuuhV)7J)n5p{WFg{1(whRawH0o)a#tdVm~*^6DtVpZOM{GyY7GT$?#7e9 zdh19!1Fm7xm1j(al|IFVsRL1@@>yEVF~E3A!V-yF;k~SmI)o(yfq@gvwcG8p24iJF zhtU4H7yQ2|6(Ij$7%DtP&0_Mx!Xa4y8!dqTUjb>a04V4CziGxlpa1_VOnYzgRyb+l zDQf?PCxHH{RKFB(jk=;m+c>P!QPD31aKq|4>e_XlHZIz$L$K4{T2|Qbo|<&hcXZVz z&M&;2zZXi}aJwAc{i25-b84UsD)MTMO?@qbrK^B7{?*b7qJHh@V>icWeuIDq*O933 zIK@u46IaM@Kj24-L7m;)6+LyVsLJW|oZY=@I4yt6e>bQy`E_}C9HVIA=VWo+j1^P~ ze6P2@zXof_^*pPqzV%0&@k9yetoSw>$UYC-#2OdVZ)Gl6eSL;n5EU((d><(mRPRrz zsPg;>e4n{t>;*W+y57-@X^(X+NT|xa@01;%MIsI3*npR%|Hf2Zt!omIV>cg$4iG z2S(tBU%IEy+(^>V(ci_le5UAo2i|ZwWlNNi+qSfqb}BqZ;>_BcTDjmhLb zx~r4}efF5dT$u(fi!++vXe_~mFHh+o)rM@ndEC}ekdCYn1DXOSzMER2JG-_7ri+gE zN_!-|)iDV1XzR@0%h%Q>^riv@Oh8)vp4Me;=Q`-HBNwP6%KT9r}cI#JJ#i?DAk@UrBZvM)v6aEKbdJR%Ha60n9zYMd6}CN49kyE z*NUy(oCHVsiTGnN*-&D-?1KB( zlgtC^0F>kwzqqPvxfk60Fe&?9=|KvqT8jTQK7MK250{2p@G2egU;n3G`xQ2#gd@9 zlPnUA+n5>75(u-WqQXKw&sT=2g*7g{rV;22%qwkf|Es;;Q&J_pg=tw6xMbARG92IE z%xypQ0cU4iXZ1@#HJVM2U|4xHB^n_UK*9*z-CD_BO}>^2Xq-2P1o>H&hOxVz9p`Rw z1d|3g;#4Z}G{B(2<3D%OnoC(3>*sXTE8bX=h%l3%Py1@?ZnG(Oz*kV}atGCdKxUri z49-VkAmwC6v}IHwYo(&=_4LP*9drPKGdGYsq0Fv9W=Z;z%(vn#X<2RWp`)JKwp zu~^JgQp*Xs^%P6EtJ_?7e@bk{wlU;kb-Zrz?Q`YK&He%^lemwxJSAO4!>Og%PzQ6G zOHEs_gPH}G26rz!!V2R$%(Q7r7j3e}!_=9W&e9UDxPr-a$sFHhYZ$OX zOhoYqPNd#aT--L2?fvq;TSbJZu$ZXb;aEn5EuF6d=!#~CJT|^^qb{QhS0znVDeFn! zTkID5?)_EU~Hld+G~(j+DhC?=2loyJJI^jpUiIoa-qol zSFqhV-HP;JT78u_js<WN-lJTC7RwGIF1T2gYjGO2*G4?5#Z#!>HlSn6EGNQXz=4_R zK;yEjWn^9h<={7PpTfmpOR9GsXDEWs7z+^~n2!_1WhgSy4wdodOf6I+vF>VM>Mr!Y z7S;%;6u@j6|a~mh);9!db3O(R<4fU-h_i^vhii+)k{I+g?UN z2wi-6W8K11oWg(yCV^(rzWy^DsTkKPlOMyG0sUs?c~xNc)R$JTP>4rDQ`?LM*cY? zdX5X5s&Y_Jpd-b!q$3GMnDTq%BgV?2@4UH9fYT>Osu#>YiWEFM2T$a03L}y-S8W^^ zou#>bcs%jV?{u0H1-T_-90j&xQXT7{p~3L~e zdI-$n_XtN!XHLBm9K`hK)U?4y=ZpxZR?d7 zH@nJUaUzS{te%6bFc+G0#{i}3;-XR@S~~uDH$lR=gn*#4%cuY`qP7gNH?9kQ18HUs z?>Ed|N-9j=bx*IT)T(M;(sZa?WDGU7v|8c7Rc9YmrBn&qnHBOyx3R!7%F0DdDWcUI ztTW5J4gkpN>G=ZIy*VYp{QWyxK3I1-FQajE14V zi0QBi-K9Swf|d>^2j!qg|3(0qJZglO<~o(CshEhbf@C!G&-!f~nI?Ul?$%B9CnhHu zADnzC9y0xPV!!4dENn-7#DDBt=cC7C7Az!ho$Gx%0=L;jWR;VGt^07PKT++3%$aDa z3fG)XPfAJT%HP&WYbX`8=3#|3@Ehh~{JuxO$}c>l!F2od?CZR~@-o8(NMDE?sT~J+ z0vL2eCLN!nZ=+vsjV1-Nxufi`YyF)6Gyj#|DOowU>MY}eIfz689hRPqf~sL25qMOx zBSA`3307;M7u5jnv>VPp^aFN1WMI*FeUPtqG6o%7|s`epC-7`9R>*9>w#nYT| z#Np+JsB%<1XuK4;g;LKU>v@s#aBxKWj5#OVtINhsEs(`0(#p;Ge^cKrv?A zG4=$V)a;%=F*yXa-j3(Uath8oygviU69!e9*17uVuLte4V5dB2tJLqmOqzYMG*#2? zuOEUgx6y00WkgT@L{N1fJWpnI8wWRiL?`%-MH-u43Lyipy2fC%4ZP z1)Phq(&|?WU@9#xX1dU}F$u4kn3CR@Cl{2;4qyTa+GlbP7VJJj=z1qMh39t^A+1fR zj|cx~GCI=GTbugF=PY;aAyO zUDqxqT-m8DJfF~A6Xr9bl~TjK-is;;ge>ce`f zm=yj_;dP}rZW+L#8Dc@u)xEoI%`9{Nm(uhNrc>;)ILP{R(S?4-YWKB7d-gIcu zOc#1gTx2U=%1if?5wvgyTADgYQ8lk7*7ZKLJT#8ZZh?+U_7YK^OUYC!@ZR~*9^9dR zb5RwB>*?z98LMA#?W?9yAy`b}yphc!xoN-Zere%%KlW&vN`+c+;|vMKUMTTNlwW_G zxE24M^6g9rD#x)mOUcf0teZrIYsW^(Z9g@jHmz2{OPkz(4Bk3ulMe&?voSLIVcgey zq$BqpC$4+$~jVMw@#K7kP127`6PAqG(u%02~;Hz^kU>$NL5gqDW-_!nxY~CZd6Dx zSt(X5!4t3rfM4a%k;+Srz+@T59-Z)kDV*!@W9S66t*(#qA}JB$!0=>@{fBFJwd|4|8BmSg_XtOQG7t6!4>c4Ev>j}vx-cifLBxAu~XH(y~T zmlk9}oVCDYJ3Dy)C6Wps?J>J#DG}mubZazhH}cq!ACI1mWrvzhQjtLZd*SX0YnbF2 zwuRU9Q#~|4u?-BmnA3zn#rJJ6Zl&Y=E4vDJf5Dmr{CYa=N8-%i;uR-prN?S2&pY*& zN|i7DsXw))z8ts)CP-#WOXXhJpHaZ3qnM^0$<9=tV`3-2M6Dq+*Y<214jDt120q8- z>tm@!UrNzzZh6@oEbOHXK{g(*->r*nhe2V{u!+#!e zltKS{@$XZF=-;B}e}xax|H^qn!mqM?`Bh5W#7`QjatrtL4{s;Og`JF;_Wk`(jL>?X zZkTyVFHIF4$!DAbFkn>AVVoa0ay;1I_r+0DeLEUhQBgsT zad<2^%k<0oKubv?+Y#5gf;IinIV0p&gi$K5^04Zhd7JMkX^UGtsL&s$D>Pt2- z9Ik^Om3MZY;uWm&VeqaerTK*zDQLYP7gMNcNXwqn=Z52&`n^)B1lqqX-3uQML0=Il zm;6Q9^BCoaQ*?$?sl(04W#z$E5aW$ML6$^74I43+(3+A)CLOpkBy;FQp@DQ3-bhkv z)yJRFc22XD$d_z=J!rIgx_=_YKe2)k@t^5}TC&1~oVcU3Z z&W&HKtyEVBk)jg8cIC=HUHf1{#j4@#pZ4~Fnrc}ujvohY-Aqr-{ghmlmWLi=kRx;o zsc^|l>1n9=lJ!11yVn2`hUV*Nir4mT)U#T;+RCo=xqnQ2a8yKV<(sXVWQDVu%5r8V zJ$H_N-eK?MD`FJmj;cnUvHw!WtSsSesl5ake07B2bNd$o{;2cPEEb+^RWXZ+^-rZ%!Tkd{Z zesC|kl0)J(Rl9zGNJ~|L%qzrDQA<@?%wsowST$x%yFR{T4H|jsb&j|nr%z5XcJ0@W zvM>gLWoG)n=LPolY)6m?D7-rux!G((NeZM+9$#EU{jlIHTmoDybd&PlG?TWAb-^Hj z0X`|9u$>fX_yIN;`6e-0^{%AWb}Bz5%U9^d(FeF3qx0!5hmXh(Uo; zu9(e>9#vg=$tPJn^D5HPG*^FMj-4k~_oTYDO|S9=1oqP$9S=(pkY-D@Xqs4AouIV= z+#7bQ#&Z4lobV{gsT~j!z=Sj0V-TVM65m0$nYgAuN|8iRl(wE&mAmBZCi~TG7s7t? zX|f8Xq$dcwxaQy(;IR2xfWHrvjjznL4WomWn8H85u#Z>-#qgta`0%5-{CT+f|0>%&0&Afb zBpTJgf&I8Sqrdenvj2&pmpB-+lVr=n2~xbK_EuStsMNyltj^UH9E}JwpkJK_p~3gP zr~?bgy6;aHARlAo079Vn%enI_zm^t%ft`gabkwoA?oAb3rlqzc_1GkIrLQF=uyeeINN~7qw@nAQ6U#HOeq-M(DM~! zOMm>%<}`-cPX>BP_nk!x9Oe|!zCCUp#LQd+d>}E9q(a^)^D>N9k3fg?ZhYV0Iw*`M z9#Ojz^Ha&arv(PfK;XRor-Nmh?INB;zaLnC3f{LoTur8V@wLV5GxC_%LS!KIv46f( zql5g<_H!n8-mi>`6tM^h>?|$0?RR?xq6*GSzc(rOP%1}OjXWi@ZM-tQQmw7*Dp8$X z41*r0<_-)mwX%15_=;sKTe_=w{{ z^@Cbk{GFBbGy}bZgsVObqR_P(!f!nSCdZ(0*Mxy!wm1gFwl)PqG0$8Q6t#L?mGcT3 zw4{NMDo{?{XpBPov}#)+Q@0@YPE+2qsry++mNRUEd~_up5nJ` zkTvvw=in!g8c?cCjR_kfNca_dchu#AcBj*Y&7~>DY?vTJLQ4fHD6gZD2u>m&XW1=8 zzJjQM>dJ}t1MrI0IABHqc1i2jrmU z;A2D-AShPq>2ep1H>m+^`l&{KQ&wH}NvdeBV2oqb0K}q1ix0FIu--l%o24iixqvLe zTW;e2Lw9Q_Zl3aTa1XB(6<<AZ71W%0ChS<0rB9zo zD&T*&`yV}w|NF=O>)~gDIcjoq*ro3rzPy)(rBoq_~>MKkz4-l>X%Y6mi9sI=!j zrRLacBTs?o_bSXO#Da3?Izv19ikP6{Aa*4}C}ejDDPn)jPQ7D&U#_$F4lKY@Q*?vkynNTmGU z^ObovsnPLIeg8vsv0RmTesIunWYH${fY7;Ml@#!N9?>W+ZiYX;_x+Vy-%-!Y)O9h# z1_3>%lwND~76oUp`P7+<`6R|=g`AX~bz*52hnJ90 z;ZF{HJRYa_{;^8@^78ojw4X?T`h>=YIHzM&gyi9OHrcetJ84b%`wTub|Avl_PkhUe z0IwYCIPbE+WbCH%?&&9e3y_`^GX68dV-6)Q525YUyaWk2p!~I`M^2v$^rfppPILH^ zg@PCoIFW)rQ*ve$n2aRbB1B<{x6Kg+jl+ae_RaKhwl1kx93@&9;z_+Bh>>-Q^g`Li|H@#FV$j_*o(TTn5{!h`M zP?eGSzM2X{IuN=*7ae2#FAaVygV`6$KA%>cgvf4@n0@0!h7=WeS43s zm}TO+c>SI|hi3*`q7WKk`IBj(%Z^-pwr`A;y_4&}<5?0dpi%U^*f(m%idDDFUqUV8hBKcf;Ms$X9yKa|@u%**cZy zz;piT#9Q;wB}?2K!UJrA!w8`8jhZ&nZcyxy2|s#UfJNrtUq8du!IsOl30-j{=bIcr z6O714EL(eHBO_S9c>@g(#}Ava`Lgcfl9x>M3<}xxBKO;LFKC1V3`RKimlSUAL5oy36H&(S}SVGIJ|4Sujk-HkBbdMsO00r zgLpPJwhljRj0@lWxTsTMNdL{gfu3M>a&26e#vA%#*Vhx_1J_)Cm-FVtDnA#8#d}|L z85*{;u^{{Xa|}KyEj>FsFEb;ju2*fiOnK{bKOfIAbN6Kwi!|RGxvKHXG6yHHZ#j6( zIGw34v8Jc+!Q_yY$1XqJHHvBL>^<~szT$iHk+tQ2exFwI*XEL8SbNv-6<#WX!QlmJf_Oo>P#vcWQv6 zSJbWa-f#L6OQJBjT$%+P@f%MietB!1qpSaxGl_i3Z$2ELsJy={Oy}{Uhx^XkzjwoP z!;G^c{n9pnC$KiHJV!5j+F~#^xwIwsXSDi<7jQc5}Zvpp77gPQ)ix6;%{r++SOEK@5ApWVOmF~3HGHmr=-E}Aiz=R5lLySm@aiz-X*#rcB0 z>)`w3=i7#QY(4*_z3RodsJRCoR)9y}PL1&h4mtk5Oy7Ie55`8i_)NW5t58>59X-Io z$<_bHr!w6@Rb9Dn^dKiY8?KeZ_@ghI4ffA(t1fx-424U~&(F>-$V$ts>QeOOF8&fR zz<21_^`CP2YR&haQ}lR~uZO*rwT(mE-UNZ+3hQ6Z8nAT#*_VeV^LP#p0sE3V<&gG( zfJEV+^&|O@2ZW71g`Ki<|Mo#F-02^-zkH>0N>z#1!iLN$^<94C*s(QH@;g(U=KN4^ z;pr+;X57D5Gjs7ELBhp5Py9#tA#!&t{tF}UvKL2uqgKCjSakI0E;o7O)s5S~q<*&! zAXO+88rXL|`t!w&AyW?mc61T%)rJuNEvI?_oISItp!wZ>&~aG|nK(eybbs%a zNBVnF%9-V^A$zL*)^C|WK7Z;?aiP%M`Y(Oi<-@l5Yjzfet~-1F{F#k@*EdGYz4}nD zOEuE?P4c^gFDePfvU|ri<@Ue_4$$oqir+jTd_@X&)W#!+*2y1#NZ4|_s!=x&@?^=_ zZP!(CThCrNe|kB0_w0ZzuTwMtEz|{(uz7aWmbYyqR;*=IEDUyE@+w~gz$z1N-p=ii zrKBaieEj&<^@n*iZGEmyLz_8&^m_HllzzmQ_q?mh7H4-SQ+26`UK zZBYV5XJ2;m(dDDc>BClUo}t>mEIzUJFFQ9h7KO#&@gyFFWkDihv1riVU>GxwJ@L_= zmE%PL3s=k;-2LO+=fyG@5(i3)oa4uD(p@YG7#h=wnRx1GO_-kp0Thf<5#Ks)<*Dsq z$GsFsz5QcIcm@j}Yzv-f&hU#H>?ssy>*`0|CDy?Frf$1;@762_)ahB1OZC&7rtV?G z2icb{8}H~b<~d^g+zBJu1hno3C~FtNaN)CdKYDm$lyUp9xpV6Pz|x=F)S2}B4S)XP zfa(VqUMCM3>L~oWXFVt@s_yMsIORNT*2(kd&+eJn_;B=~pZ3cEgtG9%z1N?syE^Kg z-F^7r_JeoHg$4-EpDzVY_?WmrjWc zB_RPRj4*BAaG(-+eO_nqnMc0blPsstcGeZRr%GbZo4)RsNB1wAC!Ra8_d?fqb*Ggm zRI2Yf1;x)I=V?`X3V6ZxGv;{}rk*8ey#72v=C|ogJ|Gr?!V96piKbawaFUMknmnSlbd=jRL@enRLx zb^Z2DbE=O$`LrpaqZ`a#dU-e9HdE48H2 zv!;okj|lQPoZG6F_hiPOe_SO}B)pA(`6T|%?WYxOLQUUC znDL{ByleU^o(+Q`b1484frX)rt^H@OUAojZ{g*5yhD9Q%9v>@`0$7G~Scq%w_Tz`j zH2~b$nn|vIvOad=Tv6cssS)VoajtO-Gk;A^rj*Nn9hj~?CWhwQnq{^$2!^yVXO5g~|!=I(v;@KzMM_UOVzb-IqyS^W9_s}B`D z{O0F(9z449;PvM`gB!@X^7EpZH`wz}fyTCLboq^#VLu=EOT+J!Gi!olPgaMnIeK)5 zS#fgw<|A3fI$L|Te}4FiJJcCFL616w=)oHD*y-!0*uS}x^f0~c*L<5cFZK>SE%BSTJY2G7 z&h(!%h)i1tvbiTE^;UU)eh&b+E?VG{k$mjN=OW#p1@5tUNd!FMhY%;Hl^ITP3!+?I zVK5Y!gSMp_;Xdq#J?9@?*wcJ`#m(ngx^B~(^Wy5=V!r&#mp7nM-M;yxsG+BCxCCR) zS+Fz^ed$bEN$0P(l=clH0=E}iP1>+$=Z5)aiIHJ`=PLy&B-O^v{Oy4iG3~rbtCq(~ zeqQ)Ir&9%~4~TzHwEsesO}DmB#1a=}v}?d$s?OpYdw<$|qC%^!Ik70p*knhI%n+^R z{0~Dp^f9ek?WIE-cw-W@+QiN4gMF_l6$vM{2XbDk{wV#zE#rsM?6(#Qbibtai3fiC z>EP9hUn7*AShaofs!#nt1qsuALtTO{wHbbjN|p_>^A26xt<~1<9J_5o+*f^Y?f%i> zfe|N~wOYliF}wkRgKt+$!C+zGqiGJdv1>1O{c(Y7W(FdO_9HI7%t+0scymZs|C2T) z=nn~VGp-C7F(fF^dGfM#8MQ6Cu-^DUYCzn|XRZ1Iwx?cQx!~A`eDFubP-}oWV8P8- zsmbZ(Pq*sQ*?1`rjFY_*9}qL=c1{~up}n;UBaMw$ANs&o_cm9RPh*khZ#{#4OgVAcy0Gn+kia}bK3i>A%B}G5PRZTr6G>6_PP^-cJNt=T&wMP?Ms}xGo?uZ zh9|8C1|NRWBKd2rtWg);@*j96k1zigB+b6bBhNeC0Jg8DGk!iW@@lbC7uu3ycAVb-gM#Y;SW`;YvyE+b};z-61YQIZgSo7+%-_RQ!zt2}(bpJ4O@Xg-7 zpYq1L+eZ^%8&ex~#cC_OvmnOJVQRJ^iC33bqD<`OuACR;$18A~dISbjZTxsLF4WaC(9M#Aweg8A)rD1V z`*Cf+oJ_4Ye*TKVL*mu)M_acJ4k^-V&o6TU&^8C2*lh5?v(op_d;mR|hftSQXtiV8zDoW7IrCWF8L498cii^x%8pD zrlzu@rbnXGd{?gG>$KosvbzoKq*0bXUrGjMzbWS%e%Ge#vVz$?tdMHe!qh7cH z)jFHGHwPGXyXu=m=_{Bp zEgTtX7x)@9w#ury=1#q_b?lm93lN-+#OJ1`6(w98!~g)d=*xdtT3ON*?_k%+U#g_~ z-ckJQrV@R<2~8+8@cnXt>nb?wm) zt-1prMv!+OyV{_S^mPi!YtH_p&c1Up7UTV*C!9!V5Q8op%t5NpL0Wrz-wYpDSFae| zuzuB*WU;PXUG)`t6KI5$d+!w2)KrvLcZ%ei?>uMY1Ixfe@2dNKOnd4&6JWxPedmV#unrm1$Kw9{Q4zjrZODh0i)l76d7XYe_X%ts?B(hV3F~K5! z9Y8AtJt_gV^gM=ZphB-ijDcal&rhCFzme|mS4T+7h(rr{CIuCbaoz50@eYa^& zBkJa3jZKhnLl&~CCZV01n-h~DXsvJ7aIapt2KNef&>thZ`%I%rH@r=4r9^G@;pq4G z@jo~BIL`_gNYiI*7BKxtfMHQ1w^{D!=gu}p@>}aW0JlpQZ=ixAn7R@-!2<>j5BD$! zGbD4uW4Vf=-gXI`Ot&VZF-SVs*1?L4{>?gJ?@?6q9b>wGYRSI;p->bicNjTNUv2U&t7fFN;OFf=NWme? zdKPslWZ!RIgu!57Wq#ME01X-igZ0&~5lw3fL!iNgC!QU<6xN z(}Fs7a9BV{?96v;l85>IJ@5TvJlHO#0G#3*IaWDyc}64PvntHqjI1kG>z58~$k+f+ zeIEtbLznzA)Uc(ZxC8Dy#mxk!Z?{M*3d{scJus95xNQMh#}D*4z6fY0syYh$iWT-`k+5q=^sMoIZ0#^%Iyv!Z!sdofmGP{d*QVRJ2mJ9Kot%btvw(*b{Z50*6-PkEJRcd;#)0Ad!%E= zPMjXj)V+6rOw>PQ-!gULG=j_ERXZn`m?G0MMv-6|-2^3u!m`C9Q3#f;gFTmv_!G~G zLOY_6*l#nq!qz)-VCzt)zFuo=KgW~4xK$tnTN?q#fgX=V)Rn;|oF(nVK;M^zfR>N{ z1e7hugH=1714FKBL*4?qFcuKNix4S0k!SRDt$eE6SM%LA%*7bQL zUn1@T<%n7%lc;5VeUktD%EpiZfzwv4>wA(86UcIwfBLxUi(%_q%i-mN!xk?4ZVNpT z=v0YYzrB;hcpBTG`_`95RecWU^0kW}CB|bxfo5hWeAkv2pREf{ORxM`q*tQ&X>>;3 z)sH_J7Cs*AeUkdMhRXQ%ZiuFRo97P*^I3cHTHm@0il>5gv&ewz61Qv-Vry!&ieeQS9;<#B_Xoh1u&_-e7ZRW4NNtwsf- z)(TMSehbpHyc{}oNNAwzgTmI|t&E`Iz16+2Ute*8(5l43cD24$;0T$PRwqUo_5_-6 zhHhFR7!&L@cIAhyTW0G;jJmr%CpoP+a^m>7sAzA3;*ms){(c>efYoSwYY~59$s~kY z-GxT=hhtf6C+E7R`3d^{VAVsHy6l=ci=f?`Pic$jpH_Lgl+|)NY)yml;21O4YqLw$ti`Dv?hiUjd z8U+{?)h(9sH2_Sl5eZ~41PV{pw6?W7_=S!d6FYWv6cr|~F6=Ta$Fqbmd`m}zVawp% z>$h(t0dO9MBy8#Ay9R{Cju|y(^k5@}w7R7Kxzh%?stH5*lO7hbMd3d(RB3md&qt0ZvD=3ITxW(JLwwqqxIkMvWaCJ3PWm zTqS7d>+aMDd*J4rMRzlGi-?s8OAj@Xjp#;tHG*^L7Swm^dz+-@!QRsuEz)nMs0P}R zFb&=?B!XdV{8kBol}8f|u0oc6dgh0&p&l$89H~`^gzYN5aUxMNjcJ|u+Ym(2l6O05 z+=LmEhb8~Dr_&H>jU)@N!RfSaXZqvigVr{TIp+rhP-Jb7h3HtkuGhC$WIRqcH%JOJ z72VX{dpPc>uCvPuFQ5DIk=o1oTZz7`COCpKd8K*ihx7ah{`h9#R6v>ljw~XFqJ{TWoJS zeD!uU(rh?QzjddD-y<~iAOyau2ig1U@KU8#2sNmF4fefwLJI+<DZk5g!q%V_ErHyc8|7ciMPC<&0zo|=2{oVLPW2dOe zBZm$1qP`VMTa`e6-6P%jf~HRWgKXNCC;NU$s_g!@B}D`8L}=9nQr}Oe?+yvD`Oy2k zzNP#J6JE9i@)%T%?s;@kyGp3hmr1Un)(KGn0+JsP(DL!0AndI=yLz}I$%4z}GR%!F zBNsgUtXm1_?W{PwU@%>`!J5l7x3n9yBdbVQ|Ms+QRt-6L(UsTx=9ypy%&RKCJjW7n z9`(pDTYqd*pl$}sf48VV{q~lez2p5j6c(6{C6#P9YU`J5-6|&k^Qi@nOeR&Y7|3)E zJ8;>i3^2T@?(6Dd?o=9A7vGp2FzIwrwOGH>lf6F98NjeO97}`Bh*)`~ORKFdz8&mI zCo`Cdb;w*2aoy8#a7*R=ZH! zb$3p*&d+%*zoylSM|$eg4_kY=My)L?c`}>FVbIy&^_W_i4O#Y}M!z&sn0e^6)?%gckoFfq3syYWVKci$3J&#NPL)+}=tmuX=fK4NKV zg+#5D{Sp;o$L5&o#@QGX3p&#>EItR!K$G+ONF<$3XK=vkCtD2Ma3-S%jNbXtlMCKZ z@yi~T)@L1Y(T#`kM?cpamW5Sy*9;QkPGNWdvYqtV44N(5!bIne$>uE9`0J%Il}1o< z+YA)qINF}i^(AlDn1C)5$Glf6F`U&?dLFC`c<4bv|MIi2J!|z)fMUsI+uB-=ogC^2 zkgYu~mTELz6{m+{Ea?<1*d!P#n`Ivmctxhwb``yx$grf-O)#J%$C$F&te}Bgz{V1` z7jK*64;Wi=IgSj3m2S{(F>v>n>W|00^>+vohdXfG&dP6#osBs+N4o%YD=x>&$8Owc z4>N!sIyFt8O}(?xOn=A1TW~p+-VjsoQwdsX$wzYJm;!Y zuA?{Hd%k`GoH}x2eg47GMnL$2&+W}+KaUAuF>Js_v}SWWd{@25X*H~s$!e13ML6S` zRvb3X-YM|vt7@G+)qY$X<;i5}v3GG! z;E@GSYWf4@i5Dlj(gCn(xkE+=j_?M>LD1?`tzf6Pxggq#&CuU*VN^>FbHr)=I=!a% zWvn|JX2j-j%nVLr_Q@AQt+put#y2D6SUN>dK33Et(UzYb=B!JAXr{AT4#ymnrf<`P z+WM2j{B?E~cOnh6Qycvik3aafQ>)ESKRwpcf?>(#vYBMA&9p6v9lG^6W%irHF&r+( z$_9jC<~M82&1$}`C%v5mxDJYqHM6$0py4@w%a6Tjlk}~tmRwqAWNvB6WYegG33K<9 zv@12L>P@cpY$n|ZG(rT4W@*W0P0Z?&X;qTf7uI?csSFl}#iWt#CmfHjmTNQ}d6!9G z+ZwTtq%;*iU#xqnp^;sDwIO|Z`Nu8#3K)_u|H~U=_{rzS=|?Oy4u{D!r_En|G25^! zMcMh`mod8G4~J!>SLqawA-SOSRJ_<62-pP77-L~crDMK{Ow=faMgein@1)n0UXW{8yuL+8QF$X3zo-(~13t@7i6 zLAE;Mw>x z_~A`{yZVnyTwnWneYg|TTxV7mrex1aC-Tbln{6r+<^?%Ybq=0OC)y02f1|1q?4!*a zr|`fF_gr_YxjTFPXk8(OZ@B?hYS)d0BiVZS2B(5mH*Edc3Vl^SS~Ssx!=dTr7tYj@ z!*V(PC|B>|OYR+CKV#I`_1lkZn*$8|Y2R0UJ*&I#Mc7!PDI5-`@8RW@H$e|yHz_7q zUzJ#MOBU07-m{D@gO9nnk;kDM>HOWuso`NP9FjQmVp6xh*_$8iWH4D4EUu+FdHDDZ z*$pzawrhW|moDczDmAO4}T8*JU=2RlNjG&+;R=2#Fo!*^UO6e`q;x_BE? z-Nf^z*VUC@wla0bZ*)1kO9?GiLj3yy)Bek6vBhm!sd-Hj84_beclPyU_D$Sr_${d! z`JECO3T@1E32F#J?@a7QPCh%A~0A2%a-S4Lxn4vb8^b18XSdXXU`*42Y-k(xSVP;-kt6YV|;>cD`JR6oVcrVMD zN=Y7ec5r~Fu&Gf1Gj;WK`R*MYs=Ta}rWQT|jbqxm*sx86IA2Qs4ZXrakvlVTW3aA`swGkwR_gh3)xY^SWVh6bg^hO2i5cp2YGGbVTVM9jQ%T`4vK$28AZjnD(x&mfsfl8|w;7iYgUatSN)dw7q@lW|EVo@tb8}>VTk%wM zirw`GG_|JDc{o$c60Fi~AbQL|F6kSi2QjaIk7X=3Z<&Lyd9zGl~H5jb;e zXDf=fw6u!f(~D;~@vO|zFrY2_YhG&?IAFljcz(V%v__>0jv`=T zGKoSB3SOT9p2lFVT4`}&TD3q3szox>JH&$q*KI&)PR^;rBa~)5KQm=@W@#@GrDA)8 z&~($nTDiDAr?6a$a`5&tNB^avwu;|Up5GuqNJL_#7DFIAd;6RA_e7a5Djs#BsdXbeg%5h_t8rp~@z zrqcHM+`Li|4240X;cBTwsWmaT_wnH9uCk{-Eu*+i=kZM0ZobYmv|%etZBbT1H6KAX zW7)9rU0`#PT)o{X`uVDs#*(6fGPwprp|hM_T*&$}Buy151r=hs7L6fTupFJ8Ezp0_ zk;@v&(u%72pywp99DUrm79ceUq$t=_7$%`P>PfJ3U4pn0iLc5Yz%8ueFc zkA`g0y&D$YuyOmA-6QDwdC9`G!iH823{Ny7p)?ArwVNFsotc&;)F2Uh1Jwc+ZhlTQ zgEkk|rev0O2^DCjy|Wpjsk#ws<;G)CQ9Ac8%SuaW>kuK(c#fl+4bvP2S5zi{trN=t zG!X}vOXVsJK=ugoG9!RVsVY)aE4p=$zT;``p?)m1&M|-PHxPvo|0sICMEit&#g7^>*lot##SuIUs7fII%MexF5Ahn`h<#B5uXK)z(V2w*9HCwe_dA*4koQ>xwM0 zLuB8Kgq?&y60(PckdWl%y|iZ>Ca5#x&=Qi2-KYOyG|UQ^1F>M zK04n?gI56HKLmQucL$kAGk^5lV4h?{Dj!t&kG`Z10N)ujnO*$E^E`>nVI~}sB*cCf zPUDkNQr75u|7U>7L?YSb7g3x6n)Lbl)eQoi%nCWP||lMSz*Y@6hi{ zDJ-cZ{tY7wD#4jJ0|{#rz;_H)&cH5C8xG0002^!hEwQnuK|!=|YzT%>V!Z0002+{Y?r3^=%vO z-}J$0H#7qP00000!1p96Y^iQNAG|gv>?%3Xu$|~V*!himK&k%w_LcYTYx<&cbi7k5yU%!4sJ;!VLLfO+RH!eC{Qy=OvD>J-f|3Aj9KW~>&UZC_B zD>vS9xUMHIga3O&rdbv(MvTD;E zhZ=oU^n`?P+uove4P8wNJ&^ZbtZfM(YfMyR>$7m(fr2#)wjO%y=%JmJ;lVvJ_1*Mq z4*z=7nq>zr#4+Y{Z{^A@>lW;(>M}dW+4)QRj;wC>c@!qs?{2DY7g?LrW-`T?di&0A zsH}Rb;$&H)G%P0FVS|_h00000;QNyl1{(HlSu^uc-3d?h&xTBTZ06X712WQMuS^L_ z{?6lDw)kR3&z+wU*+oEXFDiU%NwMLcVe=oKm^#>X>bVau9K1H;-T(u2dl0Btg zx)p^g{`&r!-`A!7YU=zSkG3V8JM`c&UQNv!kwBX3O5Z4M4EN4mBDtQ~Tig~m{P`(4 zw&vo3-4&}8B#465)mG6EF!V^vNwUyJXG*W!nS=Y>XbV#n=YCUqWKSbGEH2q@fye^@ z0002sTg6whv6H5VuDa@)N>6lZ*5F(F^fr8Ae}2(@w)p5qCShag&QFPpd#dl4JqL{2fCZ>Mf-tFbtzs~Cump$ORi{}bE`#d&d>ZD}O zphyD6l63U=J44fV6do~;zJE$4Qc2bn$=4d2ODaQM7Kv#*6KeA*vQk&qP|@f?sYyfT z-Fq^5=Wj|jiq0?A@c1RE08GyYoH*akdov#}>4m zt$nVn;Yg_G!^70ncoISn00000fbV=#NRak^H{G8+`eNyh14Yqqo*5jI`iJ3T2jzAz zohm|S<)I^%q%qg^_-N`-5koGYB`vx~HY>LIHJh!^%d=zRle*tPAwz_*M{MQ|xsFJ2 z!$-%ul0jrnjL(?g#}Ub}3??M{y?&n<+an2Qgt~1^e2?sCVZY$(R?4SYGEy^V_3T!| z5IOFHc0^koNa8qa59h}(yeNT?I}n|d7@b0eTf3-~5=lmHm_K#N+_TribtFobsrkQaFU&Jb$XD3 zQ2XI`ceiT;r!C2hi?tOs5OMv-49YhJq|*o9I9w~l_Uf68P}%keHkW(H++PvZ_TtVr z7KInSJ~`K9MaXEDtZGMFBmq5t;BWhd%qe-pnvUPN{tTTpboKm!S+R}`y9rSca{vGU z004Xo`8rNCQIw$fyiedsXI>9Ryma*0zaReRz-1R^J3cO=Nx_DLFKs&f8!a~7q%oS8#n>sGB=v!tCsDwAfR-CDw;;Wzw!j0v@ty|roG9UUan*fb02){<`@J@3z> zOh^?yHQS%sc4CE`kbsl9E_Qam*-y>Ligy+NdDE7MIw(YQ>1M4{?fLM;*}oaoy?D*H zpWgD5EfrfV(FVcW7v(-TXa49sx%1@4pYE;NV2DlPq_)n`^)cgLyKS(edgp^{3t#h_ zZohfSn~v7|*01}UC+_ZPH@-L}*GdPP53PS-f8zm*gARFy&_iEXJTWhtuXT&&C`Ymt z&N2l60002s`<@hDjqJa8Z0}ZA^rE?AqCRm;3U#@v0)9zg37a{ZHK$vRq!#XUds+ws zN2-D>%g7LAa^NfwiM-3}ZTonU_&D~Rog4feo=M73cW3WYKMB5xJfy7Xo$Jap` z*vsX)IIAtu_|Y=19CEqc=R=ZWF!wN8k}W2hK}h90J+6i>UL{O~)tJE9lC6vy@-+Fx z5KYIL%(0}>5em5!)y!FwEJlhzNDN+bcQ%Dp!eEX!SrRNp8qVSb000000FuH_LsJz| z3ahNy2)+jZ00000_}(Uk00000006+Z5O@(500000004lb5C8xG0002^%96scKUh=O z5&rJ@NmJF&aSrm=ppSx;frWnn00000zAV0yWA1{@m$p2zxgjQFKu?=0c`FZX+_A2t zx}`B_OH8t}pD3*Ion^b%ZQobVTkI*Z)^FM&-s7E^S6JG4T#l_tnO&2jBc* zfs~w)w5#IC@Y_%>(CZS2ljr-e@g;e#6@fD_nuFySAaJyj{6+ zhxU4$-k|C0Tx|~(E`9yo7fU-o?ViTE+)iF(zK^T_nksg+mQ{Lu(0c&@007`itR(3{fIn-AO9GzLB;i6MyS zLGvbg&c0pObj@`^5lD(p*Tv6E@;%i2gsl@UpytLqkdmEcI`sw;x$QfG6UB!1fS`S&i%7F5>A zeTrli(d4K2K|nJ5@0wdvWP-Z-o{GYvYT*7wj)Hg+8HvwfsUm9>{b>(;nm(G01RDLT zQApCl*gf5oqN>E#ta006$Jq|jZmW9J9AwF+k5@L>AL zMdMRHzQqS>iz+t9j42sReU$XkjL~c{Qk+IylYz;umILoUQQ|F&vM=TMaub`^eYdM> zeZkgc?F@&MUbd_kM$Q|Sr-qt7`1R`Yl9cpcn7uDlw>DWaUmiYb%%I3A#-YZdJzIZT zDW5a4gH(Aa+jHo+84LR$6sX;^bH@{Pas@37G-m&P{EX}Ru&C+yZwo%y!zRpP_L&xo-#4kR z^Gcp1H&yK1dCys&EhYVjMEEbwzP=N$dtAJ5`|b<*3zq&iuj!dh1uqvnemiN}U1L+I z(6Pr04!l;K_1286er?qcpRGR_&U$|S)Mfn~=-jUR3rpV(7*thUlsNHsQwPV!py0*w zmP1W$QK+jZIpnDl!`93pebeJ3Iq8wDx16dx8MH4SGjGZ89;PcUZP@?({<42|sm-Lc zAbQ;I=M9awBl&~1GtPGAN83Uk&$bXhDsI~I^ZKP&5xQ6~dv|q{JLk<=Jwhi+AMNl| z%6+!oI^ntm4%NK>%l&n0gQ}0zW+zN~Zffy0)S99hq62JZAaK-bVfO7NPUhwqG4>-6g3S#oU!Pb@}Wp7Wr#7u3Fq~ zxXD2rY4=r-+@h?Rk55lB5*m^(mTxV%u~`Uf1P+)uQ}&vrlQVDxK008)6eBNKBd}HD2my_N) z_;_plUq>t`{NX*nS}?F*(v`Uy$?q>MJY$*FZ@A@}Lw*%SQ{`*siQ13se|5k~e`fZO zSJMn_^%r*0bc+5WhZYut4msiFp>vPT95Pit{ZL7hx9Ln%4_nyZfB=i4ixIExztPWBJn6 zTOKJzC^2w^_ zP8j~A-P>{g(naBl0hKTASv~Y5IX8Fc?+l(5HKk{%gqiU{DB7FMU`moXg*p~b+Gb6lTW%liI+9tx8wWWrnX*a^?I+YZ`W^Iuw(Cs-kdjP zE-amzneN(^^UvdlJ%}2XzEJhOTH;OZHSWXwsME~{3hLZ?`S?M9&Wp=Y%O`H!@v4~m zbY9BiQJmAjqJ~YAcc1C9j@r2R&J)wK6EE!Sx2C2R>)-jooO2zs@^3zJ=MC$7X&$f3 z8^(3V_wUWb2J7xU(Q1v!eK}DpuiD;kWqFIJ38&tfURY-}4cjn#=Bj+|d|AQZ)eQl~ zn9)CRY-iic4a}WG$F4~7zgc;xtW8Cl?5*Fo=sfxK_&W|QnebA4sIJQ^;kH%6tw-OU zbksMx&z!;~H?Qqa6(8Sv-7YslS)2nVKXUgE&)+fWg&5^T(VDy!@2o8JKyL;B004lm zZKhCD6@ObtXN%WF$3_oJN=IRNEn zr^Gpz#3kfS7@pe0duLb8nv$l|{`^5!von44)a!!p6?(ser;` z0|mXG{)hGjY1!p$!?uy3>YMo5zq~AD2)z^!SgC^dREUaBy z*Kfp>d-G#8jp8mZo+2_XB_oy_TU35jk)_M;AG_<1)E(>?`^udYMy6t=XFsNT*KRph z(%gGgUUq-#!v_XVym3TM8b|-MVw1Z$=+1RInZ)$L$uY;9?nzku;N-Mqqc%=P6w7xW zYOQlqeXWhvMXhGq8v!Zy=N_Zq@}HF@7|;R*HvU& z;(s@A%=i%r5iv^GS8?FDsn_T+iJufpMCK%~Y@wnlGVc{k7E4TIsnHy5wk6A54frYL zLc#mneklxCyfgp= ztQjK~CCLgc1&c*dvYMkT`ZxCwN!u(=tD?$btciq38_OhEC`6cJX$GBl@u z&yS*6`jfBpG6Y3Y+Erfy6g5>+9cG$k@FOf%3X2mXlcNSCNrIvvMCo5jBtOoM3C$gL z=42=2#jp{bx@Y+I-?z7fNgBU-d@e^Gx%J(1ep!p8#+-#CNmVsro6Y7=I+LJDlDKM; zSCN8>!o*o^-L)BvPNUV(DeBwSkT}Oov>B}&fvBh~!~_XV>9&H@JaUf-{bEugU&=G+ z`taU>DywmQ?Y4MI71SOx2PaK6=49h%4gHo4phvg0yMw_t$@NEX%cZlu9vx{ll7t^| zy`5GYho7hIP9sOjvLXsWl8)+OHAg%`nW7yGOYpLSG?G#&BGqQ3Y3wjZPeky9rV$hy zH|+6zdu_lS@CWO~_SZxYQQrI3ETJn%o2mF*n@JUAg3Wk%teK5YA#fo1E06C!^s~mG z8(EeQyy^V7G$$OK2mk;80AGmDyL?R0Mw2}O=U%toU3S;FXW~2mzH{T)l?{>UKi|3X zqbnTQf4ctaluA|Qfa-DyoxD$0f|q>A?G9^<$&%JT{$gWUL1lvvwG?mJedK8~8O8HR z<=Z;MAe)?*W>087Uw_W0C{pA-Q!0@r&No%wzPUJf>3rRRy=y*XV=O%_8R>)4YfhZp zajsTD;)OHYULF6^_WRG%rrz0uQ_4#Z@4wiNpKYt(U$pv6a#~^rLP4M4y%d(k0KOiQ z!oEvktxNxmQ!&5j_WHtt=5--=SJ0qnlJP%!Kf1-=!3_KGq>eKO~dQ2w!X z!^4}m?|Wy{eMdV^#aI&bxhls{BWfwXaHw5IRrN(R-f~5i_=qRGz8WFi5D4)uFYgIS z-J2fzeCJ&TYeH5=oMtL+?sV}1pKy7h-Qi@cQd_G}7DD{#EzkV5;6Qy)&%8T*$bTs) z$eutzXmiV+kcOgr=J&|dcJBV*oL|5up4nN@SmN!S8D~eR-KC11T_Hu+&CM%fi%$}D z!xYpSs8GVKE`Oli74%E`K8(ngo?6G>4_3krO?xeA| z+`Mqv-$wI;V3wG{5d!emr@5*hRUOqm_+;doel5N|%{dg<(wAgT9 z#eN|`_e!>tgy3pdG_O0T@B0|&^r_kN}l%W-q<<#vjbYoahHkyAjV&3+9m)ta~4^9cKEPSaD00000 zz6f9F>|<4v!d<)+QjN(DT5=cvb;XA-_q(HRPSjOp{LS@SZ(G$`Y1HJfN*O4LjJiH| z{-&w+z=i!UtvUQOVNaozATPE{^1#HwYvxaiYI^6Mb)9>97;+IYN~Ml_{A{0byB6l3 zJNNd_*Lq`;%o_s1D3P6$KJMuo@?(rzxUuk$TMC~H*<-md=QrJ)J7xLYoG41+>-RkS z{?QkL&S;KDLHlh(W;{MI)z)(C`Hh=?*5bT#^4LGbDlcx`_DnGLo{0B7ehRgdo2_o9!p8w?JT??A&} zyK&s&3>wL0J6G@hMXg-rASTmXdN8~upe~z!(^DhUDAIRv--cx;FMY^xNDyvtT>tAu zqtXor?p=RsRU2tjC4pc}jMxx^C9wL583! z6f$#Id6I%Y3;+NC0N;F4cr{AMefIFyi;lT7hg_W#Mpla5yeg9fMc~R5MWa}ni@eY( z^S)qfFi0~d)?^@&hKtx)jz+x4>vM$=XR$gMLRJ-tVq%TneJ3~nrMTDIw+-{jDlTa? zu;$C#^eF-#=m-Wy!C+Zpfe_D1bd zeG(Z0Kw@e&m>&Qx8?31_=syz_fmH=ZvLk`CHq@tfH=rkURnBLKZb#6FsOA&Ucb|Sj z`s-|zann%uTqT5FkxAUkFvEaq{zB$^m032&!vozS zDk(nSZp(n5X;1?J5GM+8ZOJvYK)FJvyjXo>AbXZueZv&$T}^FfRgju;R**gDS? z#0En#gbFrDWv0~Tq!t6^i0&hoGn1$sSpxm{F!EwgOF&psg}@P_;BiC3i0nf-Rvy!7Se>!^DM0rTZs&!c;dFGn-#f!cNwgvZq@eNhCW#kG}4*?@*f>I zuSoNo;>+K0Z>Zb)U(h9cY8Uz-9yMcwhYToF60Nn`620} z$UU1hk)u=K@qEo;fdI*$l35*me?1GUXF#Ozc+0-c1)NR2n7BCI!-hq@OIZ^SsL@C- z(edt586*nQ@QQ0W`*1*SjUq5>Lx2OuhUwjRx+Uf*UUulE)5_y0X(NPwEg7C=RNbg2 zwheXya3**t&6VwJb5jMs?)%1To+I^tE@w?~qF0#ki1wn864lbrG-kC9D-#jy4K6bADd8`Y>YLJkG`aeLVc>gPC%%(uWm|QX2phJuV|%DqPFfEG_n=WZf3Rmk~Rs aa(3^+{c78|v6YGanq)s9$cN{3KJOnq6OpF? literal 27841 zcmbrm1yoh*-z|)yh&0kAZa`W(q&7+_-5t^m(hVZrAT6<_yQLeXySux)>pq_I{_lIo zz2Er8cgMHK8M@qi?X}l>)-UFqzqwAJjFc!U5+M>C931NBPeO8VaPX91`x5af_|s@{ z(gyqmZ!7Rw0TB^#c3FA}4(<)yXQ7V@PDy*ojw;xbxXp(SUv#!G;m)vg-|ktveZn1o>?X3EukL0Y^mOpXV0G_|3c)bm5Z*7_SKAiclvaKTpnoHOtH00V0An|p`RUy8cDBu1I_@vezkvTGJF2-Hq@>9P|eGemsy#i z!3^i0_na2JBJv5Y>{{0x3;&)v9NZy0h7CJ9&bq;&+P`00(5^;wouqZ6R#8#=pI?(U z@!LQ3XEds>!Qe(q3b5o_Muf!tq*j_wFn*LaT4DgmYE$$vPqtlHKa zkp$b>%T$TT9T`c?P3et`@}B%X(JRN1vk38A1XK>SI`ct9YypskdOi4vqo!=nm(8p`R6y;V| zQ(rbWgFuk)@6q8ND%hCUevH#?nAg(hifVG#;Au6E*K-z51ufsAe7H{(%^vg;vQA=G9e}Crr zc&k0SGfwk$Ybf;v8nLm+@*zK!bc%$O)CAO{s-FKR8xN1ep3}qKwK~RBPS8)ye9B)k z)KV~LgT-v+(a~35fl`BB+)|Z04jkheEyuI1;oHl@Dj$8gt1rf9w8}c4`!{zPRMga` zrf0EZKkus(*mCWqXv=7{qF&ceC1agq6FKhR{E)=V-$Z%v=oCIVj46L%!TZ%o z`v(V=^T(y6r0#FdSy@=f!~)w_uCA`We}C#DlgMGw5kk;r_;`QP3G;l|2FG4rPL;Q% zqN1Y9r)*Sr*_$eL*q^z+zK+B?Fa9Zoh0GG#uUxt2td`Hogl|@NIvprpIB$ul|jm^!)b-p#6{!;J?#FV0<;%JuS>glyP$L#2+ z{2Sxx!ZgC<3&|UPft;KiY7UOdw6xZ)uCC6`Y@@-H{)`PeYX7NQK}*Yn2G>h5F|nQ9 z-E3)?rLL|(l5TwC!CXyLLV~KSY|FY$a#GUG*)};g646`YVd-yuQSVwR%qHdJQWGh|$bYLSi4}?LcoT{2yQ202H%hQ3d;41k2B}r-wzHVT#NGY<`7FuAnVA_MA0OMz zflwmOBH2~~$`5|sO7I{Mo0~t}O@Tj1mtFEYnevGU2`_fW#VKBOub)ImM@LafgL07E zxw`yZJ%@+gR0xA9r)Npu&mlVlbM&VFcWWk(UUKrDWS;~bg$>BW)SX&C!a^f=dR$Wj z(_inrysWbQ&8J8k^lcWcDz&d3PCeEZdmV&|uF@WR8iwf_w;o4R&6?<8@Arc3sT}Al ztIEw3aFAkp#!DrqL=PyRN|_|67+=j)mRz94+P2j)JaBakeY>nLK!Z>$*<#aP3?N8;l4ie z^`00(e>8&}YBDn2-q?4~pFi*D=n8k%)*YA)dUA1C{0|8>UJMoT(r!FD_Lj#)fDFOyt%#tK>dnKDc{`W$zj&w9NlRr`H zfD@>5*zZb^PT}2NTl3L&8Z))m)m=#!4cBK$sHm`qLEX(QEHDK`!(ZFm*wE6^(b3bd z9Xo+sJ~%jtW6-2!`1=YA59efJx*GI+NS8ft^GBDLmv7f)4)3(JwcVYqVqB;OUkBa6 z!o zu+mayt>FB8GgVbpDXFke6ol`;z6tLP4hjNiQ(jR)!eNeIl#w!xZ$5m1BJhbJPE=HM zb7KQU^+JOytD^~v9nSDea|L0$1fp3vudA zT+g;-U%c=K)gUb`tw^)(=Jr;eFmv9d`@TuGXLVJWGRl5ysHLwD1u|A^Z-(kmhaDsy z$6#P!KtM?NDs#)!`R>YEPEO9=zT(51uV267bKB)qR@(h!`uz(!pJ=(Xo8f+Yfe6|E z<>P!qrtQr|JdnU@1nP75NA&Wqf8IY~k*FlZ$H!MuSLYO~PT3jm-$8^hGBT1Sexl(1 zy7WO(GBh*u?Z|lY76Q3o_S^7)o*uFN?Vkh)irYzja|h8|L^jF6gL7_IvBBluUPC!* zd2e8?zd5{h@a6IdtAx$>7q%>VJ3JqodKWzxti~JTakS5}ZyT0B>@hA%-RU31E^^*y zC+FusC>~uW9m6-&y-&nHdarc>6+tMTPSKR9+1kv}ny>E@ZdJmi^nyCLy?&89oLFBH zP;9f@gekzHdf!RvDUj4)xBWwdVUob+ood+{Xkh;6q#&ynJsdj zs425v6+uT2zq`Bh^F#2#NbJ|DvB?Y$7XSFM#c|R7ay6X4NTpOjedA!hE{`Tjc zEGj8_m6Bf|)yN_P%F@7n@gjBE(qMHA3rww61*R` z_x6$!6K6~HM9In1!O5IlyYcYw_(X_h(!P6letFqh4(^_sn%dul>+b%XDF^Whs3Vy**XB+8sqDE-o%9DG3h`PeMZS(iWfz5Zy+IFlw=|Ysy1$;=i>v2GjIwIYu!=3ag03N+@LxsDJz>5 zC`9Fh<_fZLV`GDzoxQZQ6ciN{kX_Osu^H*<`#L%{06Z`nNJ@BbO$PnJE(7x4YSF>Q zrd9bPwMAf97{j}FB^6IGqBi4D>O7TA3uI(8G)N$kHkI{G9gM#$&F zwtl+`;MtQWPaYl~!e8@|U83%*?dw6;Dr z((}09w>CR3+n#;moR&j+iH^Q`>;zgPSYDyNPTsm59~~tsBQs-T0GpUtS=-?0eIf=9 zgt#nN9MyD%j+}Ty8#6ptP4j!c3Jcy;@OWuKCg(-l^Di_n&%PQQU*WKy7k{TgDOI^* zLA#-Q0`V!uK-S4=`DNYfvM7bFdfgP zwMqFf^u~F*x}-*(%u~}cdvX4yz*eg?tYoU7={0ua#AiRlBB8CT_@L_Q;9tvD zMMg#{&c)c|M%;?Vu-2*PFB!bH!= zSgc-Ui3q9Dcvx!j27qbFHI>bQ$oNfM@94+~rF2TjBBsMX?GGeu9k@nBh_tk{+mw@& zlLqL}85w_CT0ROstuYm<{oHDFJvF7W!m@O55GHO5I*y%PUsu-~smQ>PkmzoGy^fI7 za!|kd+;8mq;+d;|4-F0Rxn5x7;4H5;Y1TQAaNB)A1fYAh*$WQKkD+hXdZq7!fk6pK*?l;6xH~c}c7LKH(q!!|VpM%QC5+p=u{^p0@-~4b> z^|hJ)R>O6+E#Q;1x3~8ai*o7q?ajsh?d@UH=(O-qqr0odn*#}i^etM8f)h|{0A&Cu z5F`~T=z|^!ZbwUAfq^d<#5FZFkC#XDm5ay56zZ*HCUn1iY1S?MTYQlDGhMBz*>#wd zj4loFuej^zNKi)c2z&)1L1u%#C*pn-;QTZr(VV@c>hFt_oxQN2K;qM<_qH1-uZ@_H zCtvufl29=+9`+@$;`;>(r7`PuU{vnzNzHhd0$_rYtfVJo{7ZUuBv))xpKmrfL<^$K z$v7M6&6Cm;X<=klEJvMbL*n&R;FJDTH7CL3LFhuY@!5zrnR5SL6WiU&PgRKam7P8CZvr5-c}G?Et1=x|GW(Ac)Adl>78ueCuNDBt|^qNKtROdZo8|U zuQ7(~@n;7Q9zY}0ids-+uV8?5n1Uv)q=cK;uS6RIs@h1G=jFk?{qBT;zW$OlA2p1Y z%!ikc?-(A<-+Pf}M3K$o?h4Sa=g*#+9Lx0oaa{L zx+83CY!ti2(i{ltzxl{1rgEs zyIbu`nZfSZYIVSKdOd&Zw9mpksIyBj_X564$UF);hBrTH9M3VYO1{{6Pi2DQo`Ju#bU zQJX&3HB}WK5RYq~YFN|=yj!v*!rlp)D>GPTX6B({%fn?MM8~BW7a-kw(pTex7W>Tm_&atnkQU z2!I*_B8Py00BnF>1#W^HmW;Bp=%0R&vfG{W^<~<-CX?aj%upgCIi^JIocZhLp6(A{CUBYOAZizE1)_mGs_vOIf2fBR^>Kr7aB-DnWR8H40chHu|-Tuo%!fI)sHtPc(xK5D@0~8o`-X~mxtb0&Mgp7%~(-YwOC=M42T0L zS6wm>Z-cp3G7z6T^U_JIBr6o6!X#K=UGhIFK-`xbEr7)N$!lAp5wgP znMy3Ssj00ko8F6##;&&q@DLzRkSE|(qru?pjV3@1`de0(A>jH>UmmWG_3jlj^ARC` z49fwC1TQ=Wjji={U&fEN?}=-#6$+K~@Uz_g{V`U)z6X_#mY&|u-d-4Sd~y=-d*eB& zWll11;}vOR{!EpZmgeT=k)0?gD`RDY`tkB5E-tP)M_oyYj2_XGw@w@N^}Icfc{IcL zBWrnp9j)8cz+j{vZJJtIQUlj3?Z_w0rDp;i)6)rVvf01e=jM{yb#d_UR=t~wio&Lr zrbC!!(@;HZX>fy&y?1s@R|2`_b)gIiMgNqS?P5he^&ZeZTUsFO?Bo6Yp>z2LEULEb z{=UA?{d7Q0yBfVdIk9PFfWpG9MuiXoqULrb2uZ6$V^?y9!UlCqO-)UO$S}h@iP%lY zNS6eXbDF7R#F<$C}3b+$Kc3qAmS5$JF?bEq7Zo~F%AM+tTLP#G!htD9H} zN@QeYvpog|;@X!HI%NiM+I4Rak_Zfy-G_{nIsrTWqbLnK$l${#8aH9TkxM6xE69UN zWtlsg7UB<>usVF3RK~g&4+M^Tdr3qa=R+nxsX48Bs+k1(^OU&&Y)z}btuoaj?M6YYO2#hMh*r9iBY@p4piEN zgoM-0!OOF=y@|ra+}v$YWSSms%4jUR8 zLS4>sYHPWfnM=#cMrLP;AQX|G0PhLNwn9Ka01ah$co_85SAlClIRS{qj*F5_|C0tzBK(M>g!a@b#=q4RV{oM`(AJD}CO#+KokdsplIA=@@&b;L`Wt(|02dKFF zGZl5#tA1jcKvCtioO_c+rKhK7Mtf9eS{tl$w<@H4}QXMGl}e zDEgrA0&)jL8DU}J`FiK_nxF7hbUv^C6OQ8xq105Z?mfe^5Mh1;)89BLE*w}zag*r;D zd{6%I!)Cn)C%JW-^20`VEIqNOeN{%r+V*HRs3|3-r4Wb3k(ZO&e159;JLCCI4d6y> z4kYW9Pdf>vNjr|b4hh})P3ZpF2mrgDy?^Aq;l&36+%-$;rQ#{q{y!r>d)Mg{Ok}KP6iZ^EBs*y6(A%TI@fVlu+ti0UT$?5&VxZz+5A5dQT`S~M1MMp-; zs;i4Pk`u7#BR(($3Zyb|a+0zcM>I6>dGz%5iqpn`Z0pu%0h|NKx|qs%V8XN75emW{ z3oGh1pG(A|nvIRk4nQ$-azBK~N`L<*X4ZYyXcr0e)}^Hnjgs55RmC6P1Ox^B=+*~- zppWMjfIE8n`aVrUhF`u6Ra&Um&Re|)X$7d)T)9#Bhd0et>#r0+s-O_RKLXTivRE5X zr{mMpI*)s9*%CmKKvGQ>X@Y44Avo!Eiv%Gu=j)TVT)rc*KrO7Ut_}!5j1gPk+IkP@ zF@kR*LixLB6nv&Pw6vz+%0W7SL^lkuJ1+>3dLt+d((K9r-)O1XD>@-@NDed)EJ_K$ zyo18RV!QPPQirCe2^OtKH2S^rUBEmAaQ&sFr8q|Im2emso-k_G{&u~zOqJO>JcK1A zOsh!$;3@3LKM7TQP3lc0mDHTwd9gnWG@5%LegKSwLb~^>z_)XCeSLkt);>QqwPkLO zmyHd(>4e!hKfKgsWXek#$eN@C1c9WYLPBqR{_@nL@0K@m08+<&luCO4v8$yC%0C;|rc=n``tNwM(h)}+tyU_=9@zT)N`_@K|g#70fylv3^Z zN}%|4V)?W=Zt(b;=f}_&WMY{=`j>N}d-6-I`H5?5Y+RbGDpLZdD*ga9R>K2}!ZGn? zH*OSR14mIM9_cO1`st6K6SyL%s6Cs)2KMLYc zN&Nn3)SPYmbc0DPZfvo|c}`Ig)amHb`E)}`LBTYx>^B=a`XbbzN54mM{aZ>B)cvQ^ z=beVa8$dw-!%yb6cR^NrV%6$8A~!xh4*JC|7*fP@Nl@TiB`#uNhz zVg5L+B9(G*=;O;97v*|FRzbw^i3y003O#@%)8-uhZJ+}G@q)G<`zrYgv@CzsXCZ(M z{)LomY&VvoYvI8njPo{>x|6zCdU`Qp<3Nd6J;n3`V-Jybt$0G5MhwwTei=yLY&RTrM*{=j+_89xqUfHO3j1^WnDyY!^C1E&W^e!S*w_seBQMUDg@u%Z zIvmoke7z5 z59z&$f^Jy5+KTK)%c%;qpcCci=htWyrKgiWG=MoZl!*}2rXh^5jR{YEHI%j1y@?-8 zFv_OP&nDHUO;Pk7W28yD>2Z<6VHt9{si~1da(V#F<0=P92q$_pIox=PE6`SymYM*C zI5(H3F%GnxrDEQ#+$Oo)HS6l$Ysp5nOf+G>2)X>KDtrFLHGMi@jshY234T%@3b zzp<;!;o?(O=k2S(U{pFKi560=aRBg#0xgcgP++#;*tyk*&E558*H#{L8Zb2(gr?76 zBEvn3LB~v@#E&0ca=w&nKPUZrhWS$p>T<*~$G_@%iaHRQy zH;WFqSCdCy*Bdmi572OFE5tHeP4#IbF}3y0n^%vIV!*J;tF*MFTU_I*S94EK(DGXc zhPYtQ{(me6-_TP;3d)vXwW5f*)B_KeC*P4ybw1Rctjl{H4pKv%a_xAZ3lLa9nYcx{y+;_{#f4wA1x>eVhJH%JEV z@lcr;3d_G_VBTj!j*d6mH+C|q7^>;@=_`eJ>x&S z9dRu0+_#ebg0~i4g?>l*YguS+^2b#z_}6*?*VSy8Zum>}LFe7ykKjm|La(rCKYV`l zN&a9o)8>Y4QHq{1DvcC(Q8A=C@b`rJ8>~S0hIJ|F|^|!3%zk zj*gBy?g)gOolJRi7nfR)55es=_V$wE;(~~o85!?+c*<1@z&u@8NNC9jo%sC+RW~qZ zqsQ$X9%cq;6AFDjXl`b9J1Wi3tl+Xe@)pEU4xgviL{ogFcgr>xM*?;(7d7CVpHQ4yBKVIfpvWF^tFt0FDOr=XN71sEak? zi_elfIO6Q1=d0g3J@TmNIrozM&`5qrBh1ti*4oO1LIiL+ z*k;cYmyp;S%f;f7EmXR_y2{ANV540Flg`w-I-bT7BYk}#r62Ee3JQpMotR*Qm*?kT z+Ch_-qPaLwhRWne(k!L+qW0{fGL{*`vu@G0YYM4C{O|b^FF*$Y4T_Q=Oja2 z?|e$>edlq1v%CS?rii*UP;Ovk8GWsD6B&cS$VX?kmf zpgt8+1MrQAhzO89uGgZZ0hj6GHa7dT{g#DrKCo!SWHbxn1BisKt}YO2F$7LG`t^nq zT3Dl@RBN5>?aL=1F!CUx=_K79BRG@U*^#0Vm6mIk^w>z-^?Ae8z_?S`F-n*60-T zkhYb4`v#|x5EO(2Qu9s))|g#LWZ;-~io&Jo%ALlhG5924yVl19mT6|t18EzIgkG;< zxp!bE_Jh;hICcV_3UO&^su3F0F)p8k^Wh>ABE@&L?XCXv->1f+0FEHedt-_64qYTuB6mk&-0Jv-T4xabTRUt*zYzlwiP0 z&F}y<`~oOIS$Vl4t)hX!TiK&Q{zqcK8~|~mq4^8#F{@>e^eY8$Y^P42?`1d3Hg+k9s|m^ZgUMrmfydBkLOD-d?gqeNzhzqQu&)L} z_VnZg_%EhP^(yQQD+9`KwmRMutem9F<<9&zIo+FPMQQu%(5b-PuX&z+I6L#&qb*xF z8i)OMEo<~z-!}gCb*3e^D>NC4%>|nI_5Q`1Q#(nnm&QD>0sk92iVbF8j2>WbqKyH% z0C2lhyIr%Ci!aKMF735_Eu5ga7f4)lbK4q5$H+zCD(p z>RC33_fGA%UMCt#o5$6%KUg?Zyh*Uit^cfYU+wm)V(sw9SV5>^5y@zJ)h@QUs_(yR z32-u)wagyt-JN_JJ`)iOrdIc|42e>$cRB{ehY1B(B?twmd3ixO1WKyMX+I~*`1WGe zBJbKrQO-0KXYzp2LED<1*u33^8#k5lS}JzYBbVFCgoAG`4~v!ZX?$;i8q(gb zgYR&@Gv4TaD@S{}0l^FJ6r}ha3<%)Z__&EU6BCmRHTG307@#pReZlD3!xBT?UK>qF zN=hQe#@07A?OFaxZIlmi5|Go9q;l(}x=}WUR8vRYdc;;&R|N$Gm{5=r5rNW+;5`s} zf?`dKhsSBRC4fqhQ(RlmO&U}<~K~E~q8qS?VHw#YF?4fb| zSFipm454agRsV)y0x-YbAaI%fi?6eN;n(vAb z&y*wK_i$To^>td6eT9k1Y`r3c(uNDh{Xn%6TNVu?Zg~raIEO&ci0;{9m1Z_G1C78= zNDQRK=+F>w8_jtGGae`#1kYG*g*F4;_GYtA_x75B>Zx0*k}4xJpadq<(E?rD(LKA- zeP7U$aqO-G^?Jkr9!yTw1Y>gG?F(>Jv#g!`j!zF0W=>HR5mHJ)2@`{S>tH;#OV`F0Mfdwrs?P*)d&5a8`f71)}*T%>|k^(lK z*(xh4ejRR8=P>Ar29q0!6yAhS!_(in zemNq8>uiyH}n2;%+0hR5{kV_o$FpX6hN_+Vq|X<2rY(OGU}nfOozxd=OP7mXde z$8kFzm>7)Z2z&mUm}W+aECxLwUI7T;w%Y>S)~GK&RdeV5WzA1_n{->K^<#Py7PY-u zQADsD2q_Hz3O&Xk<^8&!qU$bK4N-VoER54?*P z7Z=e_`5&%UK>^0{1cPocF)VCs)Kb3!b8_HH(ATF(W?8#^RjNXafzkYTy?~Ae%sa-` z)};ceZ(iF+eU_3!d->A&;jTu3_8v_40={>Klalf{m;!g$3x4em%rivyU z=|)FG1HQsI;BXQEqhB&|a!~bwsMBo-W`21JdEh;u-oAnfri*7Qq)3%jLS_g@{>@%y zl;D7XFQqELr%NGc_cs!|JAq$>gNbRX+z36>WM)5Sn0V%IkGb*Ju+y?I?-Jf7C==#( zO&{omH^7;(9Ft1TXQrj?86Rio`5&?+z`MvO6LPQI;L)r>x2Uwvs~kN?EM; zS&pJ3mBF9>7+KwEZh&IPgnzYhv$YrcP3jD_W};Zz%FHYnqpYGrv&n-mWvb56$|oW` z9NkX`lwJ|U>)YEZFiVAu0Z<0~1fc!f)XV{%Y^JRZ6#e7Lc`)z>?j2?nx_9sPr%C}K zFa-z>m>5Cz!w?7y3j?CrA0`RPC`>CY4dBfi9>#>M0mqxC`|Cl8j){p_4NZG{_M+6_ z;NF=EGwZitV*FQ?GY;07+UQRN_2C^o{ZTlYak)}CUA<}GGgGfH zHPF-h`9E@xY*g&9D2j)@tsTJ)IBQ_Kfn)58az3Ho>M zj`1psHS0w5v%sCzQfFCs0Zu`*Q8;TfVnF=;%=}AE*a$I78yN5jlgR?3cKJYGiq27u z3O#^(zP`RQHcWXAV@$CcyyWEGybSnf6q`Vn7#k`CgC8MI=+`B|1CkbGw33`0*{i@KB4JdLfSs+IN{93)ah(u6F1}6uw6xgxImFFX z8Zh$%SQLz6fG;cg!yE84#8CF3$*#y`@|GblD!-Y8XtduhD_jDjPP~$~!B=Q9`Zo6~ zZ>%o2yW>uP_keYIV89Y29bus$eh%Lw+ecCqfufCX2D_|9TP>K++_p-l&F|h4@{M`{ z5JqJAGhyu<-r$KgR;Zyrk#f2Q7wHzS=YBwD9}*IV7xKlTN*V)#6@LY|uiYw(TZ=*uw< zPJ+P&AIU-muIH)rOGU4&Cy*~#%`cwM4^h(>>`om=C(p|oLSDXP%$5qhJmcNoawAOrr|7tfL$?Rar9z5=Hl@kZbId7fnAi0fsToz2Z?+v=JTteuJ?`i;-t zUKoR_jek;9!On0xmxBYarS?N$?ViNMVb`}X^{N98_l6+VMn6iSo`?H{hlfpKlJN6A z=YwW1`m(Pl=&}*hgK%(c1PpUgD>;M;<_yn%!5xJQ<^C}oY~*q*n#@zYjJLI%iH2Gx z?bh0R6si-&#*9DS*>>zrb9&wua%w&x;~_a5xcxR${uLKD-R2)tZaB}ziRa@tGrA7r z=l@KxLdrW;XQ8ean6W&NTt>q48sT|`2%=`)1sPY(+~A;C-B=8rFsZvf5so68WfEPa ziUJ!NBts?#2K^h@3n%N{iJX^TBBZ-><*!A<*7g<`XZt0iV-#79q|$tS;o?Ft%F21f zh~eReMz%akstx;pf|g-S;o{`vb~*1jlVBEP`dT!DpZDR*Oz5=T(-;1s**k_JOQv{GPnOTgA_bj_3SUwTA7=usvQI}sjS0_cjfYvl#n4Xu5 z1v@Btw~0>Kl?rDha@~D%vJuTNHR~lU?X(`BYLNN zu8H%b{C2ji`29?UZ&I+18S!lNtkzc?e=_eQXWm5Cq1mC&b7*`a`+$f; zg{P_QdcNL3mZ@Q|Kc2Vw{ntesAHhs!>CI4g_Nc!XRosO^(nDt6QEsHK!->COQD7@O(-eOudA>90=TrSzI~CZ0hQ zZq_c6?|XYv78GgLa0h@V-eZ-R4Iy%(DgZvMc5jNj+h1uS7HYLRPIuLNPic{KRw|wZ z!)&q_S$x}+FjL36WqW5^yd-?9=6WfB7{e=3-)MhBb^DskhpB@0dg)S{;eO^#q4gQ* zjO#G8F*0DNr1K2MGH^#$oV&&C9CO$id|oQPI!)#c6Kv#hHhN^~?&Te=+`o0JS*&&E zOxDU=^(P&nr+>z3=(L4WGmwG`39~RqQ7+ipTeS^>Jhpfz&?(t%k99wVjMbE{2jL{6 z6L;w&)}*BekBoNW6WL-4Y;1h@g5Q6E<`(0;-oqdsx6t6`j1hM`Lzpd*B_>8281|a@ zm5nT=JOQCimyt8CgFo5^kHZ-f3U8CMEjq$=G%jF zIQREnb@lw)TR0nfx^$-Is&H^$?TUB%ezJ=jrPbF$_hoj5mtT19*442n&sojCLGYTK z)UwEl8LX{Z3eMp2twQd~w$UqV3k%bZe+=D)y9_=Z#M~BkM9y0L$-2Anv_>eU1cD|l zF>OnAK3NAs&P}z%yw!Iw=%DeHy@kQ=vX5N53*S|9A1!jssw=tuBBBVco$hLKk!|8! z!VZ9+^EvPFZV-+Wh9I$Vh8d`HQnaxH5-I$v7aD1D$=DRoL?`Q+q!3{)=IOo*(=EZR z582Xs`k8hva;2=OV? zB+N%ocH?&6>Uxj$a5Oit)P4(`)+CMBH@%{Peb-ip_hOk5;XKit2bUVY1s4~M;L(G_ z1MRGc&mAN^xB83eap+boMk0v9g~aRZb{84^+8z#-S(AG()^yL#Q6nK8Cz*53^HLms~Dg?tJlT~g-;hK!2SSwX-!;iE439IjXBE*k6YhF?Tf6*0IQ3HQR_#ug^ zc5DK#i&4+o>RY$e>HP-nNb!bG;iRQ+by_1^!2!>Hi^C)EZ_e}bnV(kVX4B1{6C@t> z<|nePR1lq@mz!8yGY+J)&Nsb5JPX{SMH)>x^pmp&Yrf7M& z5JGymQ(t(d6X-DgHGFc--_??AZ7g&t)Xj>T*FN=CKMYgb!|5#o2noUBKS51SD1nSd`4jn`kr^;NgJ4O zJm|U22G!f~-XA&n@1&XEsi>*i9IYy?(VF%mEeq<+r9fM_V5x%8;(dxSigRaV;e@^44b9=$3`g<$Z4}#>&&8Nw0 zDAD)*`RBfq3eT>aRpYHiYDXRXEV&#T-7>Pxq?eadcBUt=P+DZTZ(3ILVFav{Kw6@V zg7~1IqIQN52ttFGIkkbOE^{*Mi-~G-*8ny@N9nC=XzlwNCQD(vZf`uKT!D1NNNs&1 zHDxt_(n)M3^;-G8porKeN^LcUw^A?FUmnAUee=#8yD`p})cjo7^Vu~6JoE+2Dlzh;L}HzIAZjx32BRa|`z%aA8UHX;pcE;;MA@X_IgPxY05!3&}Q zJf-T8F;X0=n;MfWk{MbN+%o95QS9)>+Uco8p*}`y^IT0}6jfa$UfS8mR2i$O2#1He z(?!q2)tx*p+^+ceBU4jsL&G~#&%H2=yj&BEK&LAj-Cizdp6FZ}t8KZ(OmTNbT6)%U zm&L|xR-*-8J8FFX*~-GN8xrB`y;11IP8F^ag&n%OLAdXBzF`nDHG9lf`kS(M7?vY~ z=M;Mz3NYto2$od(PjDiCrOqBIVY5pYPq99FXXxaQBCKFXHf80^boC%gV^0Utvh)@< zuw|)sk3kww7id*Rdl=1(PD>2KT?v{njmnY0(_?3>Isx1ySCe?>X+rj9J1{u0> zc42nq#*jaw^Zrg9g&~w{b?C=Kqau9AXuJ5g`#2`5n(m7C=j_Veu?zDF8411-NbT4-FJJ#`HLVcPw5wv$z02ph;_oEx z3GKGbv5@IjM72ld6?`rGzrcbcf{LY?tihggxp7(p3)PRUm6KXaC3f3aY&)D1_m>xV z+23TVF5Tb71?-y9TJGQXaDBm!JpK3w*Puax*2CFsP?xO93?^;$SR36nSb!oxZL|ID zJ5L;TnOcQFQBLtXk`^)_YQGwPlk3aKiI>qf1dCH4y{r-SeNCnAMNkLp=Y9aQ-qK(1 z@Aw_}xX_IFiXVpCVo7auz$iFuAU?bTO#zS2A{N`W6>_pC)Y~VQZHs>xEVk|>UX=Pq z-nB(EpWOCPI)02ls)HiYh9DXS}b|>eioMJLZ`x=9xO=&!&z-6A6u}i!pk?u*j_pxH)8yTVi=M0?Y@@7d zGwoN#yO;hiNORsrs<>7hR8S*IA9B=f7FuuyQQ?$16VDboq@%lwVW<9gLE;YiIk=3x z;*q4G8E;}doVELBvS{>)ZL1!qRPAvu@R*Rvgl`jBnJ2nCeJ2;_%H2GAt!@6t7GYq~ z-u?7I^t?IhC0IX5mLwv4*dZ*oZRS6AzFc@^LNm_>?P?>z=f|g>f zcT4Pc9QZ_BS(_uyAEWH+_9qI5*HwE9!{?j02%p;->66^K!?hRK>ev?kP$w@i`Fd+AH!d>uUdiQSni$St$beRS5BRR|E{rFK*}w+z?i5=wS8A3(_gm{K6HkEB%-S$?);-I9W|b!JCz{*yDk0VH9ZIB6|C6m#Strb>qrL<@*hVAJY;g# zFY|ed2XHGMuXd`dtAj^M933wWdSl1O8*Y%UfvPq?H+SXM2%d)ov!}D-{4J>#Qtu1S zCe(k9&h`qiX5k6pquopCyNyIEKNJF+#|QUZ1wuSLsu(dastv~A2E*EL{s*VEu1Mg! z1dj-VN4O4v(Jy4>al^q$7qE7_P58eD`{nD*X+=MQJkdvMiZxt8%BSx$cd_cT#>=q-hC!@3^0&~2}ehRqUy!kkBF&%-o0cz zz>^M5<~r5fwg2VQvB4)S;VZFc=*)a2=Dz#{NW(R-c zj>h#Ms0_Fa;#+ak?QdLQ$w!*jR8MC;JMn}T>hW*2TK@CzkqG8ufL!FW-EQQ zGu+JSbD5_il8C7>?b=4RFAg+Lf6WKUwWM)u=&tF7Wc;9|cwK9f|O9!N--@>w4 z{;uYEE=qx<%InI0u9mt3P5GylBmQq^TDRAHTpME_yxYZ+Z@?oB{~M@ZlLzK-FvR;G z)tzNrRNvnA{aauH21pAiAV`D65PuOwNeMw(MHuOljxkWWq;sUjp_GmR5fBjR?id=$ zp&8)$jh=Hq=iKLc^Sru0H!qZtJ;UB>uf2Y2UF*8Og8LQpV3rHMj;kvx?3|o6yaCN7 z;Hx=XWAZcl)stv&uGxrO!AcpLs%aK?A~DjRuBsgrdY*){eYy3jc;{^qkP7soo};e#CdG5e1h7WJZ}OnsH)dfXJF=$7LBfis0_`sy0?Q%(0w zL>W>la2~vA;yidMS8M?nB2P5?%M4Q1d z4^9pPgOQ0ke{fj@krPcHQHGwd>z(z0{e4&%?E8p=hx;Uo*{dUX#Oai+fV;$%-Qpc; zV)Ku1jx^KyGb2I|QO5{}v@gl$OWD~?6~2vElb9)7>oLf7<2r2?`%{v0PtJq7v~vsT z6*Bl?(?ipXcV;WD{|)DuL9~ZXygHMGG2ONUqlqY#cUh0irI^lE3xR86uz<4o zmHoYpWt~4hzk`#KZ+DYy-Q1p%Z4+(~FS-I*5l7-kC}gBo&;Y#{D&)#l0-VE zxb|+-L-^4Lioe~6wWj&Zzgqp45f^-)feQ!v5CnRG0|7js=OZsX*vr&c>Obr^oBu8> z1kB5j1rH>|m?9z~Aafomp9b5bCC;l8Nq4+s`ScmByxAPRi?0$tf9#yI@aWX18=qY0 zLJwB9j}Z`&rrv7mj-xpZIlNYuba~fGaJ4O@NfVRF3+B0%6*UOrb6j)TveZty`P`I|S^k5f^+!t|9l98Y zxl_^&9zHWK(eGBg#7#uQT{{~8y&mxLZkB(9T@2pYf3FGkuSuD}&rcw@Lv)MK3c(ae zze1G|)DpW>KBh74qY@;wCfh+r8CN$(@|=g*-jBz!bL<*13!UfF80bA$iYv=G?d$e? z&PkJ|{VEOHT^Oz&XQ{mT=+^i*B_@_`pJaYx&Y9f!@ZWXDxn9k?oV4NjOI*JqVb(`_t|E42QcRf z*R;1N-9rU4RviCgicvoFTsZk~+K+6#-{Zx0b-|s?wRu=N-8nZf74gp40pU@^k$O78^X2BZ!Qay;b{99abRF+m zqGz4bUsgHyMpn^_;*OTXMqgj2BDU}D_S*64)dCaewr%t3@4>F~WZJXhQJxot(f^Oy zKx|DpolPCFP_#D6i`>6X`li>xS|993M{?^A05=6pa4>g*;L#|gfQTn`0t99RJ)7e+ z&B3tB2drS*pI-4{a`CNR3hGe9K>u*^S4wL3sTpK~9pl8DXvZL5pY}7hPYpMVH_g&Q zNB^5{a5z|wFJWyVkd3ME`q2Hw6(y}I-=r_oK5Q1@XMFjs>rq)%?N8?I*;N}^o5cfu z-IZmhH@>A<^_EF3sFJn4W>5BE^U-?9G3Lw8E_~tYt82VfQs0%0-cuhnxmVk|H^mr+ zOx$VNigEE7Reax=tg%~Vqsr4BfJZHJ%GUPUf8E|2%(}luuY# zmOMFx!_LVtxP_n*hkJ>aMH72ipxAo89;@cCdkTSBJvl|ds0^{y@F?~!DYc0CgZcOx zW8uUicAeVm6Sy<#b1i$)C|8@c#4LlJp{|?eA=Gh_hgk*7f>i}OHzpNC#r|hTq;E(3>Pa@azz>o1Z?}(S|7#s442BiFj0Ia zUtk^1h(Fv4zo8D%E&$V*n$EpDM_aiw9S6(+`l9>IUK^Sh<@k6)=o+}Nq2FA=pxdR1P8VR`nf4W~xiO{98{ zTgg6Dj+a5RGl8A8?Tp@@bp5I9CEK3G!o+Cm4r2gjh2ZEww_OyviF5E&}bzg^_j}% ziq8wNSvhlySBu+ezsLG0&RW3-o;Bo~_)$b>8rXH{|5EDEv-N1;;ulx#-Q=$F`qQLL zR!oU3IO%}qK+#={VU&(qVLbV_NELZSH7$J3ZF4DRuheF#v};Zt=OA9h*yXZoA1E_Y1GF zAFxQPnw|-Iw0L(T)7K=Vugg-b%FeFl#_~ta(m1- z!kwyNQJu#NPi8JJ;rM#aRGorizcSF#PwNk1c`%>-;3EF9(UVlQboiug`n^K%XdL31 z^2j&Uh59x~LEtmYZ`(34lc;K`_L4<ul`>7CbzjD zzfg2;sDV;_@@mHyeYO6_bI&*2vs2Pi)smIy9O!mL&bsH9+mlKA)ch^Sl|mtX{ODg4 z1eS6`F(LpKanppLPbrRJ85#oRMl(o9Z@IPEyo^6RobY7`Bjt=Y#)zm%~`-y5mc z%jIQU5|Kro#*>Yfg~eLqtQP1;gl!&@j}YA-&X#lAwEi&27lD)K^Ji)a*MeQ0ix{g) zRnO2H?d>sq!wGKBZYr^OZ7bsy;?T_8IhLWt;dPGvhj7qXE;F}wQCITZ)VYjEda@BgNs%Xd-@oAA`<+}8p;qXG;m@Zfz*o_C zGjQz=7DkvAvCe(#o8N0|3kK@{b(}F6Lt{6Gmd5Bej2(&$HkWx;tVcbMJw1G1$?M?1 z>?-ZEz`pfzilw06tnbTLqr-bv?73`JsLl{B^m<*UWaz%@jwrdbJL`smq5BI$kWG+C zXKSm~=-<%tAMow{!j!~&@baA1TjIn26%qbB{!wwKk!WBczHB|^nSswMJJ-i&&|Yxg zeCBhvEw=2~%qbNV)yau&`d)<=yp{%pSpm({C5L>D6Dn~3YV%>zH7J>V=u`OWJj3ZF z{Puj1f}z;fXdMPo&}*NF+UV8-E8cvHK*1`Fj^tyJ2X@#Vv4igDF<}%RA31SflRFQ~R2v{`-`ubq4N-bb=FHJ37|E+xa zX8kzqheCt^mbvhOOThdosmH9&+SabFuUFWNAH{;z_5{GiOu~rdxU#a?=;*VIk`;M* zdEMJI^>vPw8m^I%k$}arTaF^XKt(k(ISFJSN-C=Q1h&D7DUo2BRw`Xok$X$LXlE4) zm9A3dx!;l~F<6PqTxF6w2xm<&N;E&47Ajv1O~k~^EREF{RSCp(TnRMNyR?UA7$jIM zxEpo$%-9FkYa8*?;VdmI;zjM#?_K+cad2?7Q2yhs{e8!;6|YUAVbCN<=I2 z$NYlWynxBi4}*{tpl4t(07Q$bDp-bVMeV2C7QI4%q5tt7)MQeGJP+Jcgdv9nFp)Se_?B!bkiz}@35ptI10x27 zHj#0~7Bit-sGtKHJS>?Z-9fbQvV-AC4!#E{CVhRF<$?XrJMv*Ie654}b`g=01A~K@ zV$Rk(2?72%mt3Wp1UJu5=Jj~dE!!Tu3ZT^_@;;GguMzBRRiFBnlWj5r_0Wn7r5dnPgbQAP;R)-Pcz_zZ&y=U|9?I4pLicOQZ7_ zZ6SF=boKK@MMMCifDZ$a3_!iW7q>x0pV@(hEh&?tB)A*Fx;cb1HlGnW4~&R)J0qi% z2ketHTyE|~BG5#?hRcOzRk^shz+?#dltG=o3JQ0z}oxz#S3HN_zb0RNqaeTa5&;*Ix+uH;53x;sm zoNyO|Q%jUBfZzl~-*|KifNEz0jji0jo6lv_O0uDEvyMcNf{w=ss5eyj=>kjqCtY8_<4O!g8)(!+Cf`X(04^epQ0v;TC1Eqv)MGSPtu9OtFe8&bj>-j=(2 z9x?9Q(ON5?cuRs?5u&01NW>Hm_Vrz&qUvmd-UijN-O@ew0lUV|Q<_0f$UDj~Cq=<} zIpzR7)j#%io9o-#LtO;kCVz~Kq%`RUeHnlbwNF zCP{16SJ6Yd`#b}5t+8r=U8eJii@SpY0o2MQc6mtbS|oci^xMSq?B3(Jl{ZWlwuhCmi15wg(0e7JNeRVi_v_$U;!pnF{sGg4DwAdAmqRQV># zy*MK}xN70xSvl#B+uMm(B4&{M{GzuN5%sn`AG7Pd0~yd#)p=J29_9cP5)$)cAWhnp z65tujH)&2DL^j7>rl3%T=S5qanvxP~jYV04jlooM{YNGDSYUC2aXBW6g>G*HkJl}= zGrn`D20Z2&iZS1Q8G|Mi#;Wvm_hKOx9|sqwR!+R2DKJ1o69`FmCem^YmrcYT}sZyO^-MRfttgX?pu>&0)$##@J1OC~X!BT^FHXhL6>}yLs z_sf890K9 z*aQCJ>gFc!BcYT5a!C>8E3?+fhW3$R2JiNU_03N+okK$vkW~Sh8^WJ^J3D~q?N|h@ zQ6chXQWR*0bd;3e6Qp$Mq#J+{G2)Cn2hf$-+2^~%eBU7<1e1r%_y~E~mUWAb?R<%@ zzGMb8A_zuc__9*~Bm(^XfE|heAT-bqcQI(WqWv!kJVi5-LHlMyUfEKEM+aR}GtoRj z2Xrc?4fch&ABcEpSP^`GgXGtvt^MKnr}(f*z?9~nz{ z5}|iJieZ^%Bc(F`s#i#N59e8q^Ke8($63tekNXX~`1q}j1mYy}WzeY;yW6}`B{K2o zXgBl2=D8W9K%meT2D7A5a4M|4x^9iZMz-3*jOG_Jj8xd4`Ds_Ruw05L8f%!#RnbJBdv)Z<*@wjcBOnOYhAC3|SF(!?Zu9W= ztx;1melhARLdcyam6Z_3Ki-YeegX5hSEB(xq}B(6URoA0I2w#gG8kbMv&yi9&%}0o zGYy)&(ULv-QXx+@i=;!#_#WHxt){q#J-0LjEmpPJq6n*TcwP6NZt;(vl|>bvDY|s| z^M=;7ehRhWG=Yn!7*<>T%x0&MWabydak_zba@9=78!{%>aDi5~w8Inf+*HLh-aR+1 zD^Y7!^GNTD;uB%Xo2I{rN_4`zwvQ>2&9d!Mx=iGxg4ie*%e}Np^}RDnZxt2vO^1tK z(e@|%(#hx)DR9uV?k-3zpq|BDqV2E z~IS43y;6(bXTzZ7A4_*6n07PN7l7sa+TKA5s!CRSyI(|mrKiY<&d7Ah77wD z1aXAXa=)_5Nl&Hh=J`Y)u7oU7CWq@!1fk z_)qof8?8U_suBVJQm_A%@ALdL?G#na1^NW)PSAz? z`1qUaPI6t3^1sNkRb-t3q694WXv|YP%uG#wohl|Lvn=Az7pg+7ajS~m0s$agI9|t5 z+_`gm%*&R#DM*2XrUVDe$c3dL7BK-<{_6w6Kgc#Hi2}vn>{nf#wVM8A&G&$-E5eeh zW>ekDL`I9&x0Sdaite z$R(I11n7uWOzK!-Umx_E6$dqX4`K@t3!^&Oi2<)t>v;>@;h?``^3u{$P|reluE(Dr zvEGZ{yJbJo;xls4!m-F9g-daI7fA+(u?v{Zg$#%5xmK8W1=D}wq{o!0uTGDR?6yph z<;rIgSExS%*gvu4*iBt~w!hO&(0Q7l)&CJ^)lPhOLRbiM+09ar5DB$Ix_j0fqbvE- zo(|m!r+XheEm>YxlihuvQj99?PQ%!&5R!gi*3M5S8hYsH=`Cy{GvGF9V#_Z|YwG51 z+dO=*Ibh$+|F+(FnF90X?Qr6u3@#9zqdy#}?vVTA+sM;~nVMbYMHSM}?xqf^v=Ir- zze#P+tkO|aJ+-h>tf#KR;RG=JX8vX)&h@M!Pv|@h)u&xAV82$_*B4+aqI!qA+@ChK zgAnAvM^RZd_9h_B^r!B}9}*FaIYkD1?sYz#gLbJxYKJ^Wqd$dPR?u90+?0`xGj8%W zOKtDx*@ADku`T|>1dz}o11*WTL^?K>z;s`72$EFHR z@#;DI&f3OdC@cl0!)^_2>MhyNllfjyL-3mHqWV(Eg)j|=Vzu^<4gKMT$e}|%it`>{ z4AuItX1=G}eRi0c+cCEZ*WgLFx!-Aiz4^=ZfLv?P0gkF{fBPHD3-|lRchtHn*X!hB zL>keoJrdbr-A&xJ=wUv0TBk&d#h50QYs!12Nfib=n(Wvtb}sknhA44(u| zW1?q)vox1nypsFfy(L!^Z$GO7YGYW*T;I?nh{P}4UL)PB$92D)j7e5q6)B&6JZZq{ z^Bv#O{`cI1IGY1un)HckIIR*P%G70|1Y zSl?7z&&D1HZSKxT^Ff}CgaO0n92P=BsmawH?S2N7q6e!ZZDE{s(9Yq*?i^7K4{tr$ z)fLkb3YR*R026n1VO-$5?FgRQC=L1OhtrPJ>(W$V+#2?XD%G|Jn$|nhj62UuBN}d} zc6{R-xn(-)+>OuV%pSaDlj2GUCR4-~+*p`AOn*3<%YRFNp_H}Hs6rSkk8?3Km$X>z zUwZ;8BUd%`k~xr(ubdrkLWP^dSdc#O{k7rRm)-=0n21SA*fAL?Z_O(vWjdY7?6kEp z`%|U6_`(Z5H9?MO6+;T?pNlvDW%N(qUtuGWd_*}*^UI2vKeW5CM-o)?!K~Th z=j>etxu#Euh#~_=4mZKVTk1j9CYGCDSWuy*SlLA!67;>c9rj=i?oiq|>Wk7eKjw7< zYxqWH*pr*JJG-4_u`&WJhgi%~y>d~m} zo`f#w#JbBXm9H?bp?ViuH^5C1%ZOW^hKOS(RHgj4=Js~|;>q^sl8M%AgS8Cvn-nhJ0P ze6t?E%{?q))AIqkY?GC^rD}nXLTx=&ddK3QG8MgT#l#>+ji^CnEoU0nU%z}Vu$87Y z>*oW8xhbxGJKu_=tb;DCx$N)bS9q9e|EQM(1pf4#?+b`#9!pQZl9D3X5jDF~5k5Pf z;YyzM3=+2G#(CprrDk}*K4)Tm zNzX;nOwa#(i5xgh()#_5d=@IH-xFChgOy_(*gaG^cJ?ujHIXONd6b6-tg)fCQCn2o zqslEQZtpA@P-gwBNY&PxqXjgZ#$(odR=l@=dARNGshnzFGYS4|0PpJvJZ3a^Oj74fw~sc2A%!>-_!{-fg~YxTXCDwn&TpYT_8E0eIK1~_AuKi~Q!uON z|5KaI7(5hoTd6xYgI46c#lJMc`_*~}kM#W&g7L$Kt0jq`I%vg+s5ms9!NBmdms`EUC@|I;r6j_dme) zuHj_q?q%v~0U>Vg^x1-3&cW2mLfyjD+{b0qLg+7w+D22?T~|p_z|6^k)$|`5R&NLA zzi0>uAyIEnl;k$%!jwAPO6*F`APZ|7SzlKR4PRwVGhaJ1 zesfAu5pp4KfxiR}7Vf6x-VXMTZUWxIl>g!t_?!QynvIhDUncH$!j%8xl&+F0ImpS? zf}ER`i^YtcgM*xhhm`}!&BMdNOwP&9!O6z{cjsZ@019yP2ypU}|9hkS+nTGnrGUDm z^uOEsTN0+Uc6WCcU}N+0@?!PkVs&!0V&mZF=l_R;lauAI1&f=Hqr0g$i=!LWe;6b! z+{|2UoZW4l9LfJ-H2v)4;Vw-1*VF$A!NK`|X&v4E-A#WxjLqBBnT>;${hyHjW2mI` z|2B1S_+M)`cXf;Z$yL+I$^JjR zsA}!x?&N0eQF9X%etqrXZYKEYFqNn8MC zF;p=$8@8)DYpU(o3<^#C%m+oF0~ zV-7ivHXkkJ$!CHN;ckT^0x^nIohYE+L46AJ-ip|zL|abYfR6|#%2L9)JXkH&c|!SO2$WH(lG)G&ym*hyADSOUHRt4{+kl!h&J zUGXf`g`tW%^02^$+&|)7=rGgPHsW3#A zEND2b3`_#j^d}3!ez|+}XcJaHkiYA{prGM6 zd#~(Vg+G$oFr|ifno&2^QB>T?2#7KcCkx;B(U+Vui@)tcab=B;FDML>mQ@OCmmy3! zS7+6^d3K}nX*bf5H+wJ%8BCp3gg5dbu{kBZWh%pXz*L07KiSxLx0sdP(UT+Zl=>)F ze(4DSzYXG?1tD5bb3)|6=ii z!9y8z?2rIliDC=wR2OfAPXP?KI5n?Av~sED@Q)uACXfnv#qhmr-iHp54=9;>^s4C2 z4=Edcy;3*cKzcA7hq$KA=M#5K6 z+p<(4I}%RQu@OR7K+t$1K_tK>f^Jj$h5N6d!?N*xb0Pz!jk&OG1$QLGgl9U%DH%xR zVaDj>*YMsUZxA~0nhDcrZxOd-h^KWVM@?jX08pgT*aK1fTeXJ{#5*R@Ma2ap1M+4e z1K-i`soBlK>0g1AvWKh}f2e9HR5ABz5%!fZS!6={L6Fd(H1@0#-$vkQj5Av>yuQRN zkTLSWJ4bpi4ZkHX*ox&>3&#aiqxeKoqoLRnaw-d~ZDfvw?9N_>G^911G~JM?O?W0{ zT{JAgl?CMc3{`@zHvRksC2e^HFaE8>BvZnrJi5}nmoA~Wvz$Jb79G2n(wT-VkAY z#j9Zp!9n$aVJku-x`xmf!UoAPqdmrza-ox>0xT`CBUypU`iwIP5VRG{JiwhO@!}MG zu?2Yh1FXJKS_raGSPe|7dr$gB0dIgpD)~yoWvkFH`{ic@Dlv8B8~{XvP^OyP^9%%l ztp6FnmOW59iQWitt=ld(05`EGS;O5o?(@ra#>+%FVk-T64&^aq#I;EbcJF;u%DCAO z9(&SR7P-6-GJ8l!#4v;?6$E?=z2D}(R&E1IW^%l*?reh;T61FGXE-kA2wWiIS9a!v zwnV@dGHiHeLp)9NuqWUPV*^mVEsCD~(3MSSV z8-`rJViB9?cPw_MwBktLJ0n4WNkoVX6lD?<$TgihL6?X+`1C^)j37#49gb&RKn4Z0 zhP(ZSXZ?o_Hpi=_n{>M30xF@4boyr@1kex*`cD!x;hS49tsx|^n8>pbHOOs1eGr^N;qSUw*6VRm!c)kOg9@!}BqUHu8<=CU`PgkB zRni*j(9`J&Y*kCFZ9+h4b5Q=)C}=qIe@19!8s-r7~>3#79bQ# z1UJBG_G*np`oMO^VUU0u-eCs%&7hd!$wotT(Y@1E$>6;wDewUbh!Nd2x=6*1p0u*n z9Dj%PlMRFxI0+({dQKpOn`V?OUXN}WDx?M^YO;X5`bMp+h~zB*It$?#I)}lq!$~C} z$<6RlrEegDsCPCo_$nI@Wp9SnP@p1PPuB-x>iBJQnBjzib zCLkG{tF03t1IO$tWB}Ah%GC5#-pW^>b1+>NsLv8ZRiRExaIdTp+8BZJc>}Se5pXKd z?bwjDk2a`{u)qg(@Yj&S0&)V#yv@|6oRLMVkgU?~avMMaGK>w6^rjjF5Ro^*+!`5( z;g0qj2?!LPOVxqvE-tr81fjJL&ZFwcG}_HTc^mvUMoAECwFFHSy13CsgY#igx~Kdi$d%t>DN2ZBaaH z%FKN-0Ab8on$F*IL}Uq$&@xFB(t6nf5$Qz*D#v{JSriHwni@J0Xar7~{T}p&qeLDQ z0Oo*~NT_95u8N?lYbe1O=ZB+4V!qr84G-LvLQo;r&!o;}>?dAcWjLhyG}z~Rh!y^T zL9FggEl7W?hKeB@vQIrc7N&vLNd;|R9U%hI6I_~AV$43~!#ssg&JLrhYYM@M(Bdq~ zmf{#KG81fKOmRFelIh@s$1RxM2?UO|5;LQ7GCQ(MVgugIhrg+ zh9IL?PMJwJAX$-}TARs)0+IzPuxNXTGRLYB*=-sd^#!#TD>NAKlPkag(fWA=3Wcc; zbJ`^HWk_rwMVS{scyHz%BK`T{wFku-OdeYE3J(^?9;t^1+I;_`DDs_# zLOqWL%ZCsC1R)_0xT>SmBy~&cN`-VI5y!JdHA+AR_Ht6eK%1;w3y}53BXfq4=ogn> z_2L3Z9YeChK5g|af-vDc;YlG4VTt=0q6Qo=9{HU!c9OZfSO91k638KPT%O-SVx;(m z$y+;MREf*p=g?l6l3{R&JAXb4%Y<^d2I9eBq6~U~Jy~Wbbpzz$iEgj75;2vytazWg zKL^jRT~#%qHQmE9bX5QoV-`21TC6w@yQ|BMH^WZ}{U~sf^E4zYtiipDZba#&--nF1 znWfYk|1|K_G&wZYMVBmMg;rZiPSxGSGWizCiTzvf1Zz6B`_4L1=$)cXT0HjkF^WV6 zrLK#Pw;5W)fOu(FN;MxPqz+R0CvR@}3QaC&g5+6cvY1dr^(~68lzfiF4?Lb+(|pb{ zh;6+^SJT_G_7Np6&Kjl3_82Pc>K+XrNJJ6a1nj)xw{VMPmo@S+vmH?a7^gZkE;Oij5o$33nYr<_6Pkm ze5xru8a$dVj$Y($?+kKEA>SvQuIt_#A-?m>5*iuSqyhOpzr-^UPD^2#~r zqNa#Z3u%NXQ5Q0Z=hO$8B2Zp{+mI1(HLb`%{FiAP@mW*nOStF41zVNck2maSffoJ7ls-Fz7k`-P{G{Mg%1B3IO%8G9wDcx=`Yq zG$Ai`UV7qhjhfI8r=)s^6=D}BRM3i#!;?EZstT!=l^Lm0?iV`4p;iWW^LZy>7LUc7 z>t^Ngf*m2VBD}a9t%$0$#7xM?8@d5A|8e)P*GnI(NNwblRzj!-;rM_M*IjarWg-b@ zVj1-KV6UFAH2kjHVmR4?;Fuz~i{E_)alIEzm&AjN&O)fzV7};cOn9_}N4${%ndsAG z&%}~W{;o=d&K@;>q32&|0JIs(uJ5^#7jkoSh!wN|z7457N$2u+ur zdS?q2Hdo6u4c|O2r6n-Ndrp|nVz192#xxDt7mLk7sl-pJ=;65Aw|=AgU&+T59@Q+h zLNaNhxee;h8GgY&eisPF$zw1i1i%zU>;>&PG(cfp5tAU%?n}N#W9m}N{R~=Cs?EEfrOVgl) z>eMJ>j_tpVJnl@|chu4;$@>RDPLQ3K*~kev_(tX3zvs$?6CLj=M%U+*fb~ag3z80z zGsL39P4bi9mC%J}r49;+Am%O~O#H85}x7?2Ed1_4v0Fydx$wfa{AJDQUT0 zoHvq6N-QHT(rJ}J^2Zf3R0Ac&*oZ@wr)$Oip)zD|`DIN=p4>$e(0MnhsjfAlGim7c zo7^}!I8mr1JcKC1o4U1&U@+KacbLLxRi-ab^WUwj3 zVz2SHkgluV2FOgsQ)IIche>L z!;E9nB;p-sfeqr4oIG0NeZQ*@c)4G(_arpNjiY%`+<1R`A&6b90$%)hP*$*8&G%Zf zIr^45TgeK|X7L(!djvFV{UYq>eIRt?EaXjb-b3e8pT2>% zO-l7VXXcJDD_YXS{)c`Xkn!pOo8HxtH!6*`?+ zbsNHrnPX+8gWK^f;qkGteg2)+g2VTuBtYL6&@M{s!QDtMI*WtH!rd8i$J4>x*Pnv+ z+PMqo?tXlvm`SR<=(V}Vjxq{zfuA;>7}2U1EB>T=g{^)J(gb_=eeEk`Isib-9HTQt zTKGox8ySCEVHne5T=}R)C+J(z_Nh#HxKew&-WGRLGt;uDmN8SEBek+xD3eyZC@BrJ z&>A>v(5vwb5Ba!_r)bN!mc}`>tDJHbYV`AqQjoO zuhS<*eC`%UbUULzb}R4>an|omT6TMG>NOh_7ORpPlE1bEOFL6KtGoGlB|~P^;VxG` z=aD^uRjx?uj84As1;x>->j7_eXqSqL`~qtu4J}hL&#}phmwy8;fyEvA&k&?p(du@E zlRft%VW)t=8ERC0PfTyjI0GWM2;^|M)pWHK8<7$xvxFoY3@}MdHEHZ`6*3B;U+U zz)%Pe6Zv|#tnZiNa?1k%`qwwIM+iCk289-oB%*x5BN~J_^ z9l|)e_PRIbVSq*~lw)KO9fQVAUtjvg%FCYqn;igtthO1*Y8+bWUkwzvW zsUo+XB3bp>>Z0Z7^A4EyzDBKodR%qm7>I&+&;Pa*yq+?qp(4y|K?n1Eq(5ab3y%Bhf|B#C>+M33*T-a$L7wR;NNk3$}w%yZsRF z3+tlKtJ$t%5AGgznI@a4tBGWJ_uc2f`*#+&$tC{cw30trHjPcxW^<`3S@!&f))a3$ z{Q=_j=qz~CS>uc6D?K0Hi&9aX^pwj{8NLR8el75C);;c2dl)GH(Sd(%h=veel=QZ9 z*!Hr^3~YbS-Hl+04Q^9S3q7Za?5Q00+u<3}n2kY8|2c}^QTgL4ElISpvJ&C%hKN`o z;y@_5j6qC16xQ@Z)>5!wmp(5is=xA_T!wbU$9d8*4@Ny0^oftp8SS-~ubLh%Jtb`v z$8@{THIpL;*`c-;Phs5WqB1#J$d?{Xq(Abuw>{($f;i7Aas)w!Vuf~qkyT5xM!#9V zWCj)n_D)64=k;pj4f`R)%-FK%ZMn~let^3*_A{c`{tHMA%apvf`N@dp(3DeYng3eePyx3ePXxuX`Bg=Qy?N%H{TT8cAlD zS#FBtCLR#Yu$kim!IwVY9BTLIkm7!~6J=0>cu(}Mtxg{?+ZT5?e|%hv@^*$wi(L1+ z1+_WJhkv{Amvad_DaX_D`}W81U@$w#|6#qAwEG5i*uSXa$N6S!v0gQ+`9Wq2e+Npn z2aAOkiRGtPy(Y<X8qZE0TLRBGf{rlSrbHuQm%)$IDDC<1{`iG$@N7TI!QO z)6>FF3?{yO&8?4*sd@j?v=jkO_CSma%#lGZgcLW$%}@LgLr zpjG^G=(>Va14tETaz@1;gd~`RT2m32gD0y^m~tB){q6HJ8-)RxA$E8qiF3;`a$pai zeW{Td2bWlTY1*X8{V6BDcETYVdU$A%J$Z_R?kKz~ff7mCR@N8FG>*EIP_j^uz{YLG zb@C4n5I8tEh>Xv-6%v6Y?5JX;gZH__HG-0(QAJ!_+`*ytQ~iUpzn3DF@*kyX6D~Y* z7gY1E;ZbFTZQA7P^STtiV*OfiNuRsp1$LzlLp?n`v*Gw3qb0&kom+?2_Q#S!l0{bt zx1BX1h?9x?nXGU!(};g%EGHE=S(mwpN<_Jcn9w(+6I2U{$efAHQnI$6*};>mXoq~c z;9+KPYVC0Ny$xP{8w-8eECb8XXoBSo6|Jud&GAG{rN)~!#+uhXJnR?=RR%4=VS!@5jICfeJ#7I%38PG7wv+>G?W0M@8moB zbIMnySzX58gW%V94I1_Am3i%zQ|;~u+jVY+TGm6*gg11||8O2L^(|U>`U+8&+|N{( zzF+axILa51ujA%IA;id+Ykm8^^({}g*)eJ=y!`H(J*c~Cgz=C;X#I#wWK?Hh>%39V zK^g5QLG`?C8K6&Xl0!bSb%i)jmYp$QIV6x=Yxn(j-ddeDi=%0Oc;{QORpQvAx3Npw zi*`w<^zW7x+mWdDG{)Mb)Ci9ui<9sC6c=>W^M{(4O?ZZ=L{s#78@4Ssz>?|Xh0@jE zrY=P=2@irx_Eps}MX-+_TR}q2-w9&JCrFWo=5N0nK}#3y%7K+qgK#$2TKoF;P1!R}by)NFJhJ z?)1BnWki(Xy$E?4BL;6tP~fWIKb3zeL;6fa zFI^|S8x51_C74G{k;XyVxpGW7%``12OWHlZi=o?ETU`Q*a3tc|g)Eb&IoU7ZLBdp1 z{wlc}RsmJ5I>r#%YLFjoR-FzmzhV`{uGTDi_grxROeB-GPE1xK3(!m${KAC~BcDOH zn@7ytI*nLu@z=J^`Dn0_WX2Ts>CZ>|h>&?ZI)iPUu=i+F#T!d`t)$6KJZxBz)mFYj z?OY#HL(EsEN*f+fo3nAFrWv88hQ`-2sL5C6&0(bRk-0%PC7PhR~gJ#=>pRmL|s0?Iu*Q za-qUJm5-9WoljPUR>Ou{UR%I&#nEM2K4Obqa1EM4hY0AJM1mqfsL-yxbmoFCoT;pt zBRe)PA~2+4WnQ6dwDk8?^@d|J{~F&(v!dPfEagFiE^)ATs#e9ctm;oYU_qOd?5^7etb0@nXE9&y}weL5mswI!)=;~!Dp(T2D{MGuy+^& zVwS7dcc@eBaSPYqp6Vt$!zf`1_Vmxta>$O}srKveftE|Zla#;buz|XmLE(@LdJfQ3V|wJW>jjC;us`Xo+> zTAQMbhKXKnrmJUXHon63BqAd6BQOwaIO%|Ya?h3Oo6PvpPTUYvR?y7+JTWfrFsP2C zV4xZ(QUl}Je~BH)%a~IliA(1121U~`q7FauT{V5eQij=QyZ>dHSH5iLbmcWMF_CO; zD6{U^;X>$nxV&8nNQN$a+N|;;hYwu>rPgRcaKreqmBvcYM|vjcJhfgVe`l#{cO8Z; z$hRfTc^nkg({6v)Z((47=R{4jc*;iirvi{rqu_R?#{W?^Js zBrFah_1hk>DwjTP4lm!^ip47o++CH1BVl*E(lLGy2)-Mf{VGx1cpP`M+g85uIAZK1 z*nB)-C~#J{sf0iq6HFa6ksU`9u_q_5;US)epMsBl7G+u96#`Nw(dwD*@m0A{)>jm7~=V1!{3d`{KaW>F*Y8WL-KKPCO^fBsPfI-}% zUbNNY?RTCp>Uu3I5y!>3O~C73UiH%!-h~lz2lqyHsdq{&WpR*9x9Psnh z>s3TpFs0gv}=1{2EWH;w+kF)*rWewdy5-JV9jMQRlb;}=p z3hhie{LZbSRdqcpgN;P3&YTxzW$X9-T&z6#ETO<{(A*0JkY8Wkv(BKqbrAQkewHAE zSXH(jCjFq^EV7I~vKZdWYCWV`;ok5&MTT0DLQeDH_BKb&ProYH);j&xR&n@fWcJE* zJX(2tE(LRRXq{&%PiDxm_ii*+w#Cv@`N^JT zb6NsJNG!v6T)Ym;DKmeHWwVW+YrQ6jaw{~GQObK(^Vac`u`lTPeaWl&ZKuCW#a%=< z;5w|h-1?VS@6GEh&5cQ1-N z_*HP(=SHdzqyQgjDk~(I*sWa!22PwtUF35#_-xV{XTnWo^Rf*UHZsoN`T&Mppky6%5P8d|*6dk_`!v!-_r)GB1}zW+S)1adGi=#Zct zim2}Flo+KaCK-xaa%5wzV|J7L6@Y)_{9fTEw79>!S-a-f(l_K1&SNv&)o%9kSX|lC z^mwUbhpM@1h}t=2G$kTJyXYNwz%xiPF|yR{!)LPX78L97y1xsGbqUidN3+o8=01F0 zyT5$Xpz^3WQyH9%^Rsw$h*1>Nb3hO_bt^0SY`OD2JJ{#su@|uIS$UnMQWeF z93Ms`qS{^7hzj}I8B>8ePA1RvnxDOMdpmLD9^TIjZk?mCyFyGT{f)TH;ubpq(BIc! zf0k9FlJS3>+sFk*<00<l;r?y14?SHX<8@h-^s+V6@%eVV3zx52bzAVVVCdm? z!B|Rn8j}XkFd?FIF@Ga-sY)FN&CmX74IhQUy8}_>^wCn|tJW~3mPKzZ+5{<9^=B!W z)ggy!9kS|%+3!5Svq`H9xjKG7^NB=Ed9}OWf>LTwP6qydoMl|F;SnAMBL1h6r&nB> zr`@9)S=lFvPV31wDukH&Zxfk9?USMwI{^>tIlvJmy;@XcO{R z8X878a6K=qg$jz=1;QKHLU)T89x^H}$`g^Tn?i*m??o@e)#Qz94;{$L*eRcVY^LjU z(Y%_uJKofl^lH&XfXe*=UyPHhs4n__Uch~fHpt$S3)-vJxXaGQPHiz9vr{U8RYJTy zT8X@A_A*p|co+6(1<`))RCGDMXw>Hrku&om@2*fYZu}_@& zvzUz-eG+gGVJNj;?$3-mJrfpeafTe{0H^a?8S;CtJ~z0`hFhMHYJ*YAakC8Z&Ja8( z2qxCD{IY&)=c&cT_nutD5>ZpY!4U@u{~r>GK&kvm872@s_pw1vE`4NTZ1lbnD_L8=ZPhl&zmM|%z+(4cRH>?kD#x@U{qi{;Ufz#j z9YBkIu5r-y{gM}GlC+NWm8XEf-$Vr!D=6+U;fDCwL<2chJvTS8(R_0n(U*>V-bqSzEIZ z6{MkJ*chNVTSc!dxz_?NawC|EhmWuIT_ujeX05MJQ_ewu!@F)JUiYp1RyWf+HSf1S z6^oSYbrY5t&nRMF+|wh^SyJ$FxVv`{{;neAVPy-kv_?Uw*FS9J*j%!{(C;D}fG5oF z6!4hvu^jcmO?9_3oF%H;PIH^>ml}q{8l{@w)Xr=auoqz3#{G!Gn}{B#PoKkvT>h8FBi1--l|9_42xoL=1+?6@Y$E-mEH_KxL8uo4G)+?fT}8D6ahLJ;;GGODB(Y(~RJKdh>nU^|`uP zhWFE#`TD~0tH)s)8T}WLm&IasnX7y5Lapc@8|TgQ1%gKV>Epi3M89BbIO!Q#Sd%>v zBvr?5dp-i&>bR{Y;1up1$I0H!eeFiK*)q@PCcN*P^ctf{>K=hnvd3`Ros-{;>@o{+ zM!KF?{LRcZaxBOeVgq@AYhZD!*Og2&#dk389Q6912ZGL+1|<(@6) zj^njrP>wiXT<4FWko+21;g-VRY59Qq+8g8D^to_5&K8|i zxs~eSS8?3L7QHEw3et17JQ6fOEl^fQR^s8C;BHU&-bGdHEDQzIR0P}aD9FrX7xOz7(3gJ8t}Zh-_ZaQzZuGTqC@^$Pej6JVmrmtx2 zb7}dr$DduwEf@AoR7u(&w(Rf(3;n&pM&*4;GVNrx&Z3aTXZ&Vq>3n)wVX6B@FWYtt zN@Ysny2wDE1y;6#DT&}^>&(WbVEB~A$$mLaxbC8sLWf|^I`-svOw?sRlb@}dn$76x zXi|xePDJpNk;nb27f-s9@0ODn+Du0N>-hk8VfH8#|2f?BiVZ1>H=(l2Jvm zyXNs1!Qs|3me_#fCk{?=R>Zvay067!pY0foTFcyi4+Q;S(K=!G@{!HR#B5KzIhX=g zk0=M-<*$@QEwXI>P{+GW>P)q}_kXhdYBq1Y;X|Lww%&CbmT|Gf_Wr`<0-W;tbFjx< zJ)#ugcqL19GD@1B=~8o(C__qy^HoeEulY`Wdxf!8ePbd=E~FI;QA1MkBbvz0$`MYc z7=~p&*9vr0qI!LnIR^XL8F^NjHN!~A_=|_VirN-SP@d=t5mmihp6hs96`JVBRt9p0 z6ao8vi%j`Q@bU=|QO3Z}BVUkFbHB0G)CxxF?z(0Zmm%CRFnKc~r0H#~;Q07BI2d9O zemmSgmJ=VDF$0n4SLqvRuzbNmp0dpL6D40DdW?|nb}x3+gfli8E+{bs)Xkt4oEN5@ zOT`ZS(r+cHj!lyR8?`wD9B4onkX1u$_~WJ>7x7sN4=(B}Jo2gKFp-jMN)%M_%o+ro z-!3^wavuFGOkX2e9HXVhTSz}_dz7vqy%9O@IU%V?vi|C_K-o<&FD&{j!FihRb28r< zg}rSb?KF`dBF&GV1Evc)0hUYtU6T4ir9Ot9S3B~#C8z~S7TlQy%V z&ky!av)g{OO?)^}=%~*_B0!J4AOi;v8yW?f>|%LA2QBCncbcz*zkf#trjfqcA2Cr) zmtS2~<{H?aLC-us3vh8CKP{1Jf}P&zdN?dzcLol;JkY(Kh6ht~ksX%xP#uKxZl4v7f8l>AguX`n1_0Yr(V^|^Y;^nleYS2Dno zr?b|v->dibhl>Il@$b61^(u$uz{gjZCP(Cf z)%4~{<7HLJCTndj6j4#BNgQ>izvGeS;uMv~G*%K#wvmqunBH=uGnVyDVb`2-P{!P4 z(|r3u_0}D!;PVp<*)ds{XxR$UsVmf_Bkr751&Ku3W7ZH$Q*1do#`h^d%fL;+9UJr5 zF|2$#xhZhZWrd1ObYm$vSi|F0GK=!+yuD<%cd$~jWYjBvikV!C>pTy)PHG~yP{_%D z7%qyF$x;bHJSTdVE}*aQ;GTxhKqB7BbG6s1Ag_+bFy~!vryZ6{<}jsy>f|+Yqt)9J zuzen%bS-#-e|5SehuAM(Mr+SzbBYNcCP5@@ogQSMqtK)=4?F%i+<{wMsJ12i-D$Z& zR49nIST2D9YCbCQ`xgwKN&zETnW;jusH(5Z#2f*x=Q4DqEgj4xG*VW?jBgfj>=(Eh zzB9?8vPFx$LLSjY-L>rlas(wMw)TgtUPD8t`@w@SbG_fuQ+RBj<8Mx;^z}lms~IP% zf%gG_>P*~qE_=7JoESC?-AcCNbH1fEd4xdWPC*LbiI^Wgy6wFPG$Md72y_3;t<22N z?(FEXsI$7bgV$#)GMZ}cQL`H&D4lvBw8WYH>JffyAhL3*wvKQ80ppPQHhK6Lhe4942vi<&sh9A zH2eZfXu!H(IEhADfW1uxhsS=ji{|&B81jRHHk+F4JQ-%{)yEy#7XzzQVEXsI*jQNQ z#UW6^Pe%cYg3CtF2b7zD^=giMg!z>2GqoYYsj1vC7r)6PHRbmwv5$~|gU?8Neux~b zb6}b5Zyw#Rt-XB}lTe1JqGdq$Qe|x=;~{5?M4i_iijAnK`WUQPvNW2w2sf#pttVz< zIhl_eSyj>}_Ht=$`SeG8@)tlt^yobbHe9TBV18P?pH6_KY;JAkbMuTqB(SqC|8?eA z`p{p7#XC@%^28nov>+kuoi51ab`1z{D&&PO<>tA|T%EE!+k85~wszIZ)^#(x4|Vt6XWOsU6m%r0H(wkiym#Vi zv-@`vhbK~8$9$N**}QG>-$<${O~}`M7@)W&}o#B&U2I$ zH*A_><}Mu;>4Hxg@A^ei%0Ol}!p%xZppaCfYO4|Px3iYmn3607HQ6>yDqbl$dabw} zXJwwUaxD9yb#=W1ou+<9^WA4TyG=>sL*LetZ(T(L%e;eAQI2dU_HCMr{Jn=IrEqAZ z>gk>SAJ0w+ZZh8s*E|GniUWTof6BQtXu_8GgqjrnlbDX(_31kSm#dp=X}-qc?B7LF zs(v4Lb$1dGMgwZe2tywCM`vENdt%8xZ)tSC<&e`55NeJ*S)EF3#GU33`g zhB3MwVjg7Xp6??QDV(=Z-o6&D?LCEL2Yrxbp)c>7@P|r#2CA4{Y^0>szI^Lgi}izO^ERpZdWPj1B$nScnUe4jT8I&<*Su-wl1$x zI@99nAK_=B5^fIA+HiP8#9y$F6BG~l3oK`Z+~;l1XCnx4HdepOIZBn8IMGHAZn7A& zy`QVFC8#{DPOp#!K9Bax3hzoQq&j#1A}@aGoYKh{mll5d^$WfD?do=x;T!1p~84`1wVH3!HDoH&Z>UF=BsZ>sY$FNlK zn&$6eJDOgNbY*2Dg!RpJc9-@t_AIg&9&;qzQ$}~uViAjBZYGB&+q1@^bID1_rP1h& zXiK6>a6!o*Mq+ZTW1U?eOKwrn+h3hmWR@7+M6jt^lh<0UMjLU>-icZ^zy894KXmJgfx)aeMgd>ro#6|;-t%@qmX`Tf#oZ`n`b7)W?TibiMXh88B7 z)0&yT)?zv?M`Si@vo55d5Mm^|ka9%%R^}~+mdb^Rq1V}5s|=Q@>^vDkl6Vkp{^62# z@aS8Y4$l{D_;tQgY)60m-rlhFqIdwif9|obJH~o)_F1U=5SR{k0GsG z-)LKKga!PNztyQ8|EzPI@yV_U0**T+i(6)y@&F~5deqUcgQ!sozT|e;xFt`t!*jO) zvz%vbeqkA>rg!T~%=PU=Q5e0EMT6b_VNCgjT@e&jjm6zZ6)Rs$e6jxbdk*|i?aJu5 zmnjcIT2vAsXJC5E4%vm%Mi#nTwG5aZ2VJp`BKZ(w4b?jwCJQ1Hr4QfsbGI8T(Pxu% z(n$xZLjy8B>v!|@nC1%yi_~*}>+MGo>Byb6WJcs_MQm1e5}ZRNu|J+gdl0G8@R?(~ zCyQsyc4h%kS}dqu@MjL)M9q=IHY2iMRMqaftv0AaXv&uDnq@ODbXz}(x5-BIu~Di; zO)UPn0$ITZZ3fj`W_ZE*Dhwchg*E&82OTt!tiiC?w6X&Bmg)c`Llb09@NaYIsg?nhP^v1iCRx)yaN^2D0L292 z1Lv03pDQ7@Y`yrIT9u6m02cQe#jgmZzJNgS5GvV=ca~ZF#h~B$Da39o$q=1sHW7>ph!#(qu%tsMts`LU5l%U;H0 zb?nUVFL43p=S_dtA}+UePW1LlyzZ>}rG+jPFYi%KvbuD*j_MG0X}$6s8oNRZ+o zzG0Jl?y~@>Cp%|=9VE+q?=HM-3Va&!fDe4FHW>y+N^b7b#$skhzOe5f*|_ycE;QGQ z#OU80#FL9(1)8OgN)}_5I}mWiFAbo|_ZsmG!UqiDe@-W8aA7W$M_@8w*Z*=}@1}W* zVu@%&7T$Jo_x%3|JI5eRf-Y@O+qP}nw(V)_Y1^K*ZQHgv?e1yYw$1JRVmJ2v_eGqD z`cZMBGNQ67Gw;05m5a!tth69gXu8=#Utg!7DzeQBsX2U>7)G5cVvt_Bo!7)E3-02O(bf!j%PV`wv*e^cPx* zEU{3{6j57RTr|T4@rXL4E7ol?K%?FE>uB8{bR#9UgO83I2N#7mQr3XUd>_u#Hn^H_utJtwvcHw^RP5(GFAH0q>F-R7MzBInOAmn+I zFtPdrM}9+-)K)%0&c^$?ixiwhi&2<{x5~lKU==ZXNMj}B5we_9(@p~jWDNyp1s@i4 z{py#J5o?3$N;4A75DMd1G%CUG?afU!bR#*l~o)Ah%{`*RD#sx;L~F?^k(ns<~ZaU4#yPXR)*TyzO<) zZ-7Z?Tvn-nKYsQGBhi(z*KWG@hwMXSnOPYpXP%IdY%EPLspH5AnJG65U+&j)w35Ux zgyCCB=xF@YDbnjSatCw^SG%lguVsriDckFCuXXaW!hpwypk$`nB^Q5xZi>y~X{~Q* zXKqSK0~12yp8m~RziM&^UBS+e2$QbE>rHd$;x@8w`*Ukc@6Z7zUZP5aD@W(T#)~91 z7?U&{;u%V-OzuKfz?o%V+~5ZC@dq^sD+=35#<($=Wz6PC=CQiE3m&3dSWkU6;5-O5 z|7=)3lA_5=h`e)*?7~L7`H04Rydd^CHa~dZt}D%)DeyK?$f-CK+unz-0}<#f z5!+LS1f+5ysm{0+w+&T(7&Z(Z#u?r8ul7IUQK>O)`(qeaJLl>jkIig4j){X5A!n4{ zwtR=136bP(6u8XxroX5~Sp6PvIn=10d*6&YvH$uDK6{BYxB$0k-P zi`dfQS?ZuS#RTEQ6YgeWIw%vvU8Ga?Nz}_;>$Z{PEg=@+4x4C zPEqmf0|<3?wYMaR`BG<7@Av-kY#Jl*F8;MtVdN8{>NZGGTAPAR-T8sg_h1E&n_HRh zm%ZRr=yy=j$t--y6^1{)!#@^wjkxZK-@5bUIH!fnoFeWzPL*g=gM`0aojMbl8`|zU z6YPJhsc6Qm*sj04l1%Wg?=qcwapvtbbjppjPJ7sEH(WG?;;L&jlzM~!0+p7PGxh1= zC51P&y~_J#gQ70ZW6krfgjlg;i2@$!F}_r{7Zz+GWy3;9Tsm=yp`O-+dvng7e- zYhG-IL8n)&NU{fp%;KQ?s(D_Lj5u6waRwYM*EXkb>U+Ul8 zRJS!qE=oFl$u8j`)}EEGW*NPH2?cq_apLTnio+gY5DjT$O!P=ZwL@}BNW;z<%!fu*ZnNQi~F+Hz~Gx~kuT98iiTHb!U&j0zwKr`~`M7hiRp1OG$uYxfd zL&klNkll6yeT`FS4+jIS2r34@P%F9`uYuLtL-Ur|8WbcNF}LIiY@t8QlljBdcbF!1B1Pq7>p zTJG;I^L=`KPjTrwMXl2?f(49dv=OhuXTnFM&^76kxe{_xI-TcBcBAPwO1@3yO(R)J z$XOcEFwTn>$}nD7_N#(8(&qh>^nrvMpn4+i738(#EROB&b3@(v>>i$P4xr?%c7E_g)Mrqz9dvXtjpcFhg~0;x;{_J))A|^Jj!iD zmBN2En@xtbW=7hOb{53mi6kVU#jgi=>-7R=SBTw}Ung6M! zWjS;N_}2(!Sok%aa?4wTGV7kE%xq(=YKzNp=I~}KfST(3!Tb=MHd`04F>3zG_?a{# z@F1?3tJRcDMkV#^ZqrBl={U*VJrE;_@6SdY>w@F#sNZDA8*t6hIm1=PBaWMIc}F!1 zbwNTAe4*?t9nu%wOo?5qSUy9ywS|2sqU!3Em8_skuCM=$^B_4L)0QBV#<~!C#3Rl-#aN zf;U+&S{y{)W5<7cxITZuG`_tzVO-JEmPkzE2Q76-Q$P?ek}x6m(t3JjpPyRXkluB{ z)DHyZpIRKJ;BIsYW1{NlCOI|aQ8^^wW=<7|40^kwp&hCY*PHjQ`kghA@X9+9z?9)u z9K$g;3mZ2!5#zP7a1{1bXm0Y)T|q;i?bGo1-2S!|S{UUlln;mN?82dYt=~`BgJEuf zmk5==No}>=*0qQvz(NZ^GzMFi__rf$%9R=jDIW>V@3V6g0QotDTD|QbHv=QVOg%sR ze##1L3p%0?1pgA0Q6z(dlv;Osa+`?MVWR&ukfZBb^Y5gG2z%V~%^k@K8lH8|QRvW4 zai<#!x-g@flA$_mRwCq$D1Q%Buj_XaM5;ogHrPIZy0+pW3E#qPHLazD-aJm2YT#m# z#Z-6o`j5of`6!Xf2TQMBz3uY{RiG@hf>kybVR3A3Rz%LjLuH~ZYriAmF|W1avKSme znSht|NKaaOpo=_clS+>-3iwD_^EA^S99KGx1~`@3@X5=xS*X5jQmDr5-Spg=w%6({ zFb9cMrA^~oWj=3fs}W|95rQu#f?&ep2pqO}67H5Wt%LBNf|{F^0O;Hy4-n0PO>H&B z1zSnTc$GB+_1Qm8*rO&*>xNwJUBrB=5(JnW%mej~=i_)lFrfg@%{Zl!EV}IJxOgN) zsNk~7?((nES*Lg(+26NgQAX?@UuEvq^6Z>{olLIXj*Tc@J8)vNIQPP2a8v&*SYh(Y zUl^_=N#`48k^MEd96)&x52Pozc{`sd-4^{@ze;D5O3&7`f?Lx9vj|5doj&%j2vQ1% zmD&7rj4pjK1n{+2-^IHv)Cva!qMKh+(38#bc3%E;9||+w9HNk@TnHxiH~4zh%l3Wj zK`Fkf`%G0U7?YdmH&BP2jIL9r#AzX7^$5o$@4mE$`{d}B9C>ebr0?Ds#jOWPUI22~ zb$s0?2N%_>QT@`=QUa)!V|`I|w~zfB;ZUn25b|=|3V7HHw#c3u&L}?U2NANE5eP{v z0%<@Uzg`kLD)myeUZ>Twe6li`%IN!p z6g#%}kC`TnwF~beYXug8pJ2gc+_KeyUICza@;vXSuBNtb-BMIUx`4Jx6jES9s9L%B z_y|{BUH$p?*lF9UUFifNng#}^llOQ!4BVH`$W}%L zg*94eM7AM_xWWlURt2?Ft{9ep(Gq8&XJ1x%57u_~$AFcLdJPxjK~68d-@O!FhKTf* z$78XE{`<}ZTIRoK--B1bE>87uv#QbXh1E$H{Vp}ikSTngn~i+C#!NM-Pb23hVkY_( zEhn?Qv)5#5$E)$z#_9t2Cw@hSMEkHH(`seNip)T2ZvaVP>lV%|B^ zZ_K&35Kfx=SOT6T4`!ZLM zN&(-w9mMM8Sxm$O9VOSJgK*<^w2XR^!pXzZ=?oDF3M?FXJbDte?Bm8*bCWDP1M;o+ z_uY8xh?@m8w6zZvaIy@{x%k_^Z^ptyH>3iL=m|v%CZ2?g8R-thG%PgV-t7tlqnv&! z+W|y$={(Q4{3+>9TNT)@--%9t2$%Y`yz+x!a5yQ|W6{TIIvTi{99MSi!D-#uiXSif zkU&_o3Om}8!f=!Di;3LbyyUb{@OX&%l88BVbX+_FseMc;YJb=6)5zoUJ66<%#NaOJ zYq_@MZ6xuE&MGYpkVZ+ugm~koyhT9EIKSO62GY}V7xCK(oVAV9^E+I)7q8-{@UyDA z%%27*m!aN04McTA$g63Y`h+0Z{1b2*!*iIR6A^KN8+p3qidUL`8`@%~ubQvG=j4- z%EMsmfHR0sX0SNIm71H44w;JD$lOCKb55YdE=#D19bIEx&Y@fi30v}3SAE**&-+8T zNz?A+^n_tYzN ztNwP9s9$rBU+zsv!K4k(Qx31gI6ChWLS)G>4wBw)H8C++gIr%IBIyLiRE(u~p)sl3 zex-7zFJZ%_Ss#d4b6f#23DRe%S&bvMx4(~Y&&e7XIVwTLPvN&3aiZoHLV>gme!Y<0 zf1;Ur+r0kOS4F{0#k=v{3VL#8uvBTSw_L3DBJ5Vm$2%|Uq9A`9kmkdxx}YDM zUT&x2#jy`iE~U1dsm$-gS+a7hOx#a6*Pq_z3n69H6m(VXOEhA$f`mwTjmu~63_^^& zC!m3umhcDe1GB-7abz(tLKKyZyp90|l-z0}WN}fiX;dH(V%XHpemdv{;Am`Kj0~@S z5aMmjF5{0PD%})DW%jNJxCFJ9kE6EzJrrouemWP1^%)WZFBc9_v{91}xL8J|Jg$HP zHOu{EF}L~IilGwFIB?Om>5-a_2s!L66`xm!`j(qLr6 zNZfJ5LW*h}Q{WtN6ZiKEr_KA)lujcvOC)w%6V~&l05@c`q}AW>Lw%dE>2Ycc(onf{ z4kU8HbYUthno&OYpHgMOsXiQe8`<1XG((zJ7v6q8k%Uq9ETIpN=;z1KKg~jQu{&Tjx3YRlJbB`6F zdc?&Cb|_#j_F~29Xdsw0T4bo~7A252F0b4@DY>vU)*6i}2f6UVgt>zCwQp-5%#ypy zV&DAG=lGfo|Hrha7rZe2hoSf7eT-NS9UqHQ>}bn3pkWRt({ID=YQyC`4BuGdIk=Gb zx5M12{;~~!T9W&&k+hcJNc>>PU*wQ}&({}Csw=!Tx1GB~7;_XE5bjua4?&d=XOaG9 zk@eoy1_V1u^N6ZUS$7{*8H8a{v(HZKu5EwS_W`25r3qd9<131SldvQqZNk}npF zBbt(29Vh@U7RJKCd2ds6M^AK78tV%Hp{71?regrfDXXr2Y_?jq-IT^-vpl%3Wz(1l zxaVCCUy3Nh;OSgcG#4HeN>n&#^-LBP(^}_O*8q}Xgl=w*X46%$ST0ioA74AW<%Z4D zrst5ntg>=PbF<(5c(?%)ff#CIWt6Q-X#A&!6BIfqFnLc_bI7U3OPc8OQmE#(f7CNK zy_!<(6-ekxh6#(RTCQ~ceUt4Zgn}L&k#x5KQ}RhxR(75UyqRN^)=O0@K+H>FiKFA6e5Sc^gOKIog}fq<|2?FS^+6;N|D*ZKzYzLG%#0nDcm^=)(BX-e7pWk)w_iYzXA!Bv92SJyu^^9u z9u0!@0xg0C?IbT$EyK&o()as}{wdYp=ycm&U4@Dae9>WHVJTPranP)lJC&xT&`D2F z6a7La6$+b#Fs78s0hy+)&tV=Ngd0KK8&OwPMMXp7>#-CQ%P1(=!)O`r*>OSUdD7rL z0E<*nLjI}r2fq}rs-D^}<)s?lxP$sThY4fV*`Yyw$c{8Clrs&7aNoYlGR50lr0!$g zk+(o!zXtF%^ z{&v~~avUcfn3Vix&un>fgFb9YVD6h3=sT(q%q-_YWwI>pkUW7sp%Cj}M4+)qpmAOs zTl&Au24-f%Q<)s~Ng;>gIyjkq{(ZywhRQ7BdikV$j->i6D^Pu~fBeErfwsfIvKDrl)hX*=vH^tp0dEuQtE99tGttYngivH>K#CAK;#v5@$+M-w`al zE#$R*x%Sbn%s;?=5Bv#X+2uq%hGlkMq)767`3xIKDBMmLT zQS)z<%*ey*L4;sFdVq0}z!UM2-L>NgwJGdrv+f8-#G^`RXjSTWl!S}W@xYQLKocrq zK89HlzVp!W#e{*W%6{rkS-crw3h)O5O~U5!%YYsDOfKVu{RpklyNB!za2rEYl{e=`^1Lj{ou zn}Nb_ESOA&WoZj>>9=q{~F?rFsT<-423Bg z9I5tsi6|~ER;4~{15db)kixC!9Azw_)K+0(`=5BPMTDl}3qIsAA_}T-)=V(kac4Sc z9w0`Q2%sE32SwhJm_ssR3OgoB{uO;F0Ere<<%jq>g|*XECwNzI&x(+oK((iE1fcyP zuv(A0z)8sxm13F1mGoypp288PAWg=iw$=69Ox_w89Y`VLGU_X{7M1oZQ$TS+h!C7& zH7sE6;KIm-|0Av+G@<52dJH=m7y89=Yd;7DXhWE8ut!bO$(MR!trq|J{PYwq664H> zk^ZCc`T$ikZS1Ule`?1#KWtfVQbKG}=F#)ezDig#0mg>g0*e!8*MWj#9)$jVc6CGd3bs%k>1TvY9w@0=IcE@uN}LelcJ!1GopuzKPuE<_L5PUS#DB(X{q7# zYcd5@e0t>{sS}qkJJP)%;sFVl`# ztBtDosWyumhf|1Vj;XP<9JW}>#r6of?T$zK;E=68`n!~YtrodertM50R@z@t6ZX1P zuFVIjHWXd~{**<`M`|IIwJbDWNKic2Le zG4Ro6HfneqQy4Y4s}(T^L#wOS0|n!q)mPWXAns2Z#7pAumVOW!;54Bbu|N81C}};2 zQ~-v+^5Q`R1$)3cgp4H;5#_Is`HcW$gPSCUyqwM6*Ep7r>R2;p;IAimK+=WlxPgd5 zs4$NVvWGc((r2I)hvu_IYKbVIMQE{}?}(7J3DV0F55N1mD8@n+!K8>BE?+!FLpejK zc2M2#1ZcQ2k{92jCO@qhJG(t-fLp6~9oiaWAlohHh{kps)<*jeJ% zk7xj0ij|VPF3&8C60`HNK_V0FwhJl-g<_VHV`?F3Zb+??P(p$N5wWVVvAIVX6zS&_ zJ&?y!pbo_&=3zA>7;RGYiinFxiWP=N81v;R?Y*V@ zKVbmDAxW&L1dyXg`!LTKME!$f-4A)$5FGTz0)+lBRfR5)$SI^@267>^qe&k)t^r}V zq&`G>NXT#hfG<~h)(8rRd$9qEx}+@k`8gD>JR2Oi05+e5aMUN!Oy_(XD zar+;PW+5mKyrd+776F}UY)2F(QZ^{@9~Q)L#K^Fa<_SXdfpucQxX=U8hI9Tu<|+OR zRe?h|~F*fk0uFh0m#e)VT554pe{E@R6?q-24Yfc zHkg#e3uJpDh*2zP70n>Xia!-3gqdMTGip4T@oHiP`C=fY?nl&A&~+1kob4vX z;h$8s%h(Yj#LB_;qC>AeNC1);CTXZtTf&hFg+qApvd<)chC|TGTNNJ$uL?eQ@R%myM&3iJmGo$Vwx=kD;dM0R14rG{+zYT_# zAwXf+&C|gCVd|%kUJ14!c_1Ux=*L4bB>}qF`BQ2$GBB;BtL8|*0!$2Rmzw>Rl*G@- z50S;_C8ZDg;=PqGV$e&$WkE~C3mC&JwW@O+Ok7024fc?lw|Y97Rta&z;{s= zRZzHa)3H^W7vrEb6skk8i4H_Q@<&zw+fI=pIg83%Q9hh15$+8A%&3MA&Pgg>7Cn>w z;?qnN!(K4N$u>iizd|M^_!bL;PDkVRON>M%e zfF{K_Xm5)V62t`MK#DO>a2z{co=AmADzfm{Kv#&C6imUrzb()|?-w_Q957Tr)-Dr_!f5mlt22zrk@c?(T(O2jE*ao!p@i2^FxG3LDxO5t$Y zNPp2khCsx;T{M_IWX&W5%6zRB_9iCv>&w2Q@TaUI5sMxAM%W-zhr9Pcx zkK>>)RD?3lDPv`4h-IpXASUY$kwp=O3(rJ_Q!5H1glwy%0@;n$K`e5~3Ne64HZBB> zojae11WqnUFpk==JjxX`fKmW;5|f(*gcV#9(T$@o8cF2bpzTF1oI=$A9+n8E-i)Ap zR3jTQ17q_=G>t;SI4m0-{?Pt_7xrc0R#cGv?=^lxN`gZqUg87K&=7>oFv}kYOVZ^S zA=!HsGE|TbQ8e2uyeR1!}O_RQX6HFwnxGBD%9g*d)ndq+cpV z?hYp=hhm>2m=3~GWkZ9)#C+km^0;&hut2=fo?Xm!^rGPtFv!nyA9iee=YbQITPPO$btxA=bqQUe`ehhmdkg#D23=&mR0nW@J@F2s;Y7hCl-$ z*5eW)wPTcYDtLxMAN=)W)I{Oo@Tg7#SW&pRLtgeTz}{SmA%KuMiVviV^;nU5V*;z% zmvBlyutC(W2x{@|ur1BhyKNUZcgSSgPN!v$I15G(wLk%Cc5 z%n)su3lh^PrMr*-c|d~@HPZR0-AeAyffz9(V>gff;;2d_GdFjFV&;;G-`~KjWd^sr zf+9srkU$wXKkQOoaMr#2GB8%*{%@qbTVb_@DFRSz^z?S@yj$9fU;ln#f8q)ne<2AL z{v1bvlt;ugElle#O)KHzZ-y9ELVyGyy$N4 zzgzha^MSKgz|X+KfylkE2v#;1{tN?cylWMeoTk+|4p=T>%J9SZh@Aj2sO`zm%YBg*KZ zOsE9snUH^KWS%q=f>(dBAmVKe#lfhK#(T36atbRJ1!x|I%MaQgh{6&PE1uOGAgD|5 zx`J>O4}|Fetw>;k(1n2l$pnP8$)g0r_5yb;(S|SgeGV@8&+hhO;$I)S?@|#m?)ekG z!P}GUtY~ifrze*8KNmO(mO%jOsms~r2EZk?1dWOzRw3pd5icVtCWA!h5DkEB;u%42 zx(5BiuCvIO3>AernH&=Vbl^;j2!ApAzU2$Z3@k7URudBU!C(BUh*|1#U`cU8%MIzE zGy`)ORTO=1KLXsCL05v_jqnx-8!)2CLWY0{8F?ZH_<)das1nNbNxj@3y8zpv25K?r zpZ%gUp(?V#;jV^Zo={#$gOM-;Vf9GvE4WZ>L|QWe>4CPOFBK)?Mz8r{5*~I2yD=&FQUA91K_ub0C0A-y~y`@K@!LDZ=9Jv%*QN268Jj- z2v*63j}1YVILC+RO!{MJ zfI?&k%)(t^Gnve@ut|Z51M+~wF~NI)tAKDZ4SYxj_$4M^h_e{ecl7OtUWFrvAsABw z;YF;6hbevQ;QM$$jX47~V*pK6K>(vP6Ro{+vVL5nEM%xJ|30~{9zpyr2TNWq|Ck|^ z!!R%jK74G<2dIes}s|hm_)-F1~pJMQ% zSa9%Pp*|*n785}q7eEUAo-T-TN$bZjGwQoaI0HzaZwAVXUr7n^C)W=9g3k-Ux&7%W zHy?iZGdC%uyl8+R>~o-M^z~W@R*)W$gBm}qnbG>cz0d&vsBezE-RCi06hKpe;^#J8 zQw1K}1o#P4UccuD1Be_U@WK5LWnGsyf0zQOnxAb6I75&3?OrvnzAZ9nB3uokH+nZy z4Z;v#L7ya~1^SVmkM9sp?b!M?(bu?3{kRewUu|Azu(0yJ{pz}W1b%awfV^T|2*hm} z?=Uw_TLi^>T$!J}d8EhpZUNsb7fzsbi;^IB)=929|HogrwU2?5v#&1{t$;m|_--3E zc_#NW>pvH0I(p~sW~);t&-+;%ZbLV%Js1P8eS^%L`Puwjp=YqOFoHpMr4}?X09B&G zP=5@@mjM5()%}QePXb%A!ujRt8UGPM!v7~E{kI$j75snl-hbZFV1IkAwFNp z^C=YiooP8E?yoJDvkTLrQhsVQJ&DejzIwqbn#X3oPiEhX8zIYwTixFDY`IG^JaFgd zH&yLMNxFP(bYeJ6-X=T~rCa5rGB1WBaO$Nl;qVu8#hs6SChTu}5EKYGv<^{tOFRi* zBemV!`yV+dZWkgv&w$H!^JhiVtJk5T0^-atbhP69~p;?Z$!R7m1c6_ z@V6B|1lt#lb~_L;g*LiGTF%djyb<8kl^pah$}Hb&VtkujW^fBc{!;ZwWuP$hba;-m z##s*%FL~N7idwMb_86|<45I!083_Ezi#Phb)FagY!g7QRvXuRDm2CE+{Luj+yje0P zqq`Gp-4)7*oU;TwUUixK;8tmrY0Uq^Bti$dR^X!#4_-b_)TEOOhxOM(pm$vkm218C zlSaQa^iIM&M66%KT5`FS|J8N14N(c!*>1~juzapmfcO3FiD^(fv>AVUb!<)NPY2ih z>}M)YP(iZ_hy#L9{WW$FhJ|S>25dib(W=aSL(ung$?>Cf_6>q9c=J}CPYqa4hXr~G zuWKI$)!~4j(7aK0gxw2`o`$RErly3V=-So-e z;rRiUZ}vCBq!QeU>`QwuD44Ua{}M z&KKm^)@M;Do6)wO+wjX5D|okfTdR3Fg8HhlSq`oDnqA^{IGc!Bq$?SgM1d#v`1C(f zc;tf%9Aw-J1|sYEB|1h<&K30hnfC3gk3Bq%s7^!uQuU8pH93K1a?F$0?j-9?0i5Ks zkXjAESA_)Sb&mHSG8aesM*%C5pR<`GsdcDb&hB@jm9q1GD!x08SteckE3VsduFth8 z4DWah$ujiMTU|VZ3|_mtxb_nNN|1iZyLz)1KU#ZceJ!~;Vb0ChX?z5u=+Iv2ZhvMH z|BK@|pE$iiYwkqt$J05qgH*(T;45=!^ZQ z>L8i)algNnyJ)Mai3zso{OObv|7_PEt&FDcA6sfGJAEqMS}MQ7gf*UaE|M3Tl$jGg ze73K7}y}D8#77iDZH+XyweOC~&XDW0C?s&ER- zbZLoBKDf#z1}??^Tzx`jvL|wwpL{P2Y^6ujX3{E*Eq)v8``GSvTr02o3#{9^Bdtb8o*+9*@sK z+2vk8?|2fdV{gM>;?Onn){Lurzpb|0%B*A2Ev0iHvtK^IJWkMPFrkT)xE4<SvwfJD^??3Vn zAd1mqd=2r|TKfd%&GpwB^XAtv0@tDvx;E*$Z>!}cnAaa zw6fBz>RgyLwmUqj^iA>q@I1E)b?GU^#ZPdxrA?^R{H9;X;IN%z8dyGYsT$?9poKejHZ(5^4=U^;qIs}mDIW8>HX%k zy6KuTY;_tJf3)6YodHUwAmGhVtE#xMSR$vN`(~m@-1=jjl+sjj@U#D>KLzW`h*Y8r1>3ba(>g6bu^_ovx`wN6 zTe0A@9FI%5qt6Bc2_^jnmnKzm5@l8=oaO!`Gq!1Q0WF8z73Qv{!;3Yu&DDIljtowC zoF4^IVr#Py^cp+q%%*rwdP22&1?BfqKRv9jh-(+`{m^PBtW8-R)cL|j^}$|;LW#mU z##1)wNUKy(@!G&FK9$9LogjvVg{O3jx?LP7>vLif4(?4-Wgv15-q)#ke7lW7Cw_JJ znu9MvVzewQ&Z{f>^OO1j5m7{`~WW zPlk&XO4tGd!gYI<^Meh}_F6Qo*zL(uxr)XE`!xDf0N-9<{KstjBg=8sDiy(wmHN(1 zy9A3{s6ph0a(63PfcNT;Cn2$cjoJM8X_KduQE+3tVWUcz&F0Wr&td=La?XEesXC*L z4N=(sef%#?>jL`pbk8oH&P!PB*K9Tphpjo*4Ret5R{chGM9Ewbe}J)Q=M#5F&iGN3hC7KaT4Jlb+cMR>@E;IK9*4<9s;z z_-+IuTDhot+!W$z|-q9UAqW4jk1lu%=9{kM)7;6YgRr(TBPa;w?dOq`OWY7 zVp~5qU{9iJcW!PmyzD@Tt|ySGS5eahZFOO8HQJTRuzdEgG#y}Q==+wnaG#3L8Qfxt zel)!H`mWS&hFd+!)oG)>ogUkP;8m2vTNVte<&c6LO?>`PelOL)WLd?K)4W%M~*H><_}a$8xumAj`tSP-|zi+%Ahn zOG!`1;eDqe_}a(2zB*g1$9x1|uDAlXJ-OBN>oC&djUA6?r7)t;X*089?r~!@^;TWeE5tHDqjllbS9wY|z0# zTdWh$6>rIyEF>i-sZmGN5(qry4NTXXdb2P@dUk5=x4o$A1%;s|2@w}sxobQXgM_=u zP+$6ByPY6{0BAd%zP1V@q(c$?5Gd~F-myHSW9sW|Q0I!6RGhyr(pA>uvpv=Td? zaxeI6jFTp~xg;%j-_H8io*o)PCEhdA*$6&|C)+`?E`CncX}^;tQ^&$5v-R>*eg4JD zg!j$(eRttd?S+8F)?rRTv5lo*?^3S9KFm#$5^=V~LGS)B-SL*5PkH#!0aQzmdl_RA z&7I4n{gy1z>Vv*3;4{(_EP2*_LChpgeO;RYFx#DHzAg7Gr~e+0h}TauerMLQN^YSvcXlQCSb+%5#A^5h%L!Wu|e;&x)cRX2P%<*~O4&VNJf41c5aQmmYoU%z_Tgm5|O>92V6;Q)JwI?x&$Gl5M`{W@yr9f!e zdNiGEw}pkd)}^nhnU)#*uTtijcM?^#6x|tIpf@&DKX!G(x6-tHh8$l9g8+Gktwt)T z*I0D@IbqktWmXS4j@!K(_yV}K%c>k$gFBQ)$`d8A&n&0P6+(re;-_d#&2S5t;N zJ)U)}1(bw_g2f^kGx5x9=V4iJc)GzecelBiRj+@~rcSVz=E#HAXPzSCfxaeVjasMD zzQAuzd?(phy-0lZS-IhqtpH?bDdH}WH}7_e!h?bOSn}QlPEUKyG=;*trTgA)MP+>p z4Z4`8TdU3Q>c1-MEe?MJPX+GniMmS1b+^0MH)z~X`eKOW*}L_&bu`IMY;q5;1D?zB zVtwTYoc?v+_#}Z@a(#w+SKIFog#;T9=x~HPx**^&o6DJb=+eaW0QT>wPOSngtN%1gX zU^{0N{!KXjY!wKp8o>kgDwIt5N0hgu{Y;&4RZ^x1EM&pU>ZRxb?XieNqJ8?%f zypnW)<#SxY2=7h*)3Ze1n{$3yaVu%_f7o(-Yt(g$^lro)5MMJVgaX zygiIuRvu5CTtIaBtRw_V3sK7Q@Z_7zHpbQAZ)&@Dj(oeT)0yC9!|al_&~N#G$9_Cm z4;(4Q*VApHPuv1v=ALVCm#b`^>*_EW>_$?}e3O$3My#9-{+>q%4iI-J;Pd$ekpydw zD23uLIjvyf|K1j;lM}U81^hlI-0lnLMCm8U@H{#f>eh+9*z9aqknK!u-JyB@SB1aQ zIaRjRo#Ebc#)#e37t)kOfDQ|1x5`6HTM*y+9ww$^w+*&Kd9AzJV*v2}4LKa0oOoaK znCf`=(Or0-F}FJie$~fOl(juaM%-p>?cO*ePBc|Ywsq8u!GCoYR(f=KweIvZexJU~ z@WI$=^KbNKxF*NYXPe7`2jrLQ`QDt=7k<8+u?P>CAyS{`35NN3T5!_xQWMN@HtV;$ z`PpXR1O&K2eZSep-sj<;I6p^paj9=HDDXgDhi4Og)SjL5hmHBhjQ!0N+Y7WAyU*Dn zHJ^Quf=<~t6ZL;NgyqY3H;QZ@sTIE3$yPSFLLg?o z>FUbcSt)*w^JTtE0fyb4A+K755tg5a*~pr&7slu0Q5V?QOq8^JOpLBKcT>--L93?t zU!K!6c$uO`U{GMrxV^{I-9EVrk@d~EP25s7l`EgOC${-fUf(tF}2O`_B zv2ZSs1dK=7ty$K$b3wFgI@WOlYs|p^CMSp6ttwksYLZl$0`Ef4`@u}jj+aPUriR$8 z1hAJ%#r{#TP&|T}z08IWsGOI`ds8(@0qUGIpUHG$b|lV{#2_?!nR>i56NiQ9k-7!e zUAvw#?mb=Bf*hySrYTU?I3e z@Zj!T+}+*XFLv?E#o4@H?YsMTw|`8X>gj%_r>E*vch5P`Q-fl++PxhQ1K#V%WUd^) zde~Th9!7KItG(>mVgr9PP20t3dq1l$R()pX08M3W^}^US)Wi59{%Gl&cx4#oaSAuV zIRhWA_&=Qv*y-k7-Mxr<{mJ>ai3$AU`tTZyzOZ0`NW|gXd+ISCU14Gz^M6a4-Gd*uKnO6s^dzo=j+W&}b z4OXLz7@XV(CBz7Pfq^}_q;>KNRQ4Jd_Hwd40P`K~I{?U#`Z}w`^>!TzyCDjuYw0Lh z3v80iBUwV$ z5HpcEQ)p=?+lswT84BLHJ+4Trow1ug*Cv5xoj~^rp7EQe1oGK-aSYin&nDiX-4N8R?`3~?3FIKrLCmovLog#s7h9d? z2BO(Qbjkenea1M$+yz9ttRLe9XYB6fpT>>)XPlm%th`eI zC7v$BUz#CVmt-g30DL{J3+|XY{I85! z3#TCvozwHG5X$d?v6;0GV2XZArtM74aWGeVnO@HfHNimMV=76#b@K~p>)U3Fb0~3f zje^QjM2IR=9Aciu#dYpWDs8g=JUo;?Km-9))`SqFpDSjX1}CRn!!+FM5(qGXB|V?k z8sH6ys-jG#6;VZwOj1C9y0iKnE1QL8zVv>^fdkCV=M4@QxP(35dl}>n9m?sbsFV@l zn;@cy@Lk9+@E&Xi?ZoJjw^Cu^?za%dI; zJjXiDTtkZKiYlr$M~wchN(0wPIL^GyiT1{B0-%s=gC9)=YDONw=Ijg;Rzco|5u$W5 z7#vD}1$g{hTA*KemT0)jy%b};OKwz&|5;BtjaRd?gMj&S=S`-_upZ@^VaWir3t;#+ z1VoI14hYN!g-yVbh2@=ITz&zHMn7h)-(*!Gx0|^r?X7yA!W&JI@YxUfHW2NDT0Q+e z?3yT^uR_sZ!Y#I4d{e|OKs9TW>mQN9VoaPQvx<8S&km<;QgV_4kcW)0l9+c|yH-^J<9I zIwv6c6}Hb}3=?Ljw^jR{E`PWNXDxE_lWsUK8a1<{hsFxV=L$ZH?WVEp(sp@sYV4$xu$prI0CfY4l??)_S?aUvL*i8j zmGU&Ldz!s^Z)y1c01X1lvhF&3S=pUh*|Z#60G?(%fAMRME=i{u#$OzJHH-FZpd;T*+|8gs%4=l%X0H^DDD#Kdd}{tB7%!+ zb8nFT&k)VRtEIfuqx*S9vmk{!-$P^NMsQ}w<8B7Pko08;e*QI~-{OnICJ?Q^cNs|0 z@bWapvzb7Np2EMoNv{09w0zU<#y<&sB|}4!a@=LO%6(q?BB>cryOa_A>J)JGH`cyp zqoWb6-tLFy{?=9*nVEaZ<+C7mT@%=FH92ou01^Z**4saSC6=qlt{q9JK*`8@IpK;2 z$M;k-!G=IhD}s_*4^A!V$ILQVADH5IM2*MFZG}czn9=5h@N|I+FueX9HL$zbM1J)h zuV6RFeK&cHFNiYw0VtmMDAncG#_BuVTw@FzVR`Emv$&2F752hYOERdW-x_@JHRvab zv&F+j66o?nXX$Mceft9ql=pJ(gYFyaopi&?_oHg-oFyX{^&VC`Kcs6 zmM9w~qV2g!_45^LJ&J^A?+e`2M8M2x5}C(MJ@j`rE2_@6EVHP)^>9Lg)E8rS;&8s= z^dGi#+1$Qo5lI%C%TsRNiCS7a|^ z_H$zgSUT=pL1BE)jGuZ_Q7GBidYP$Q)_lP~thh|NAW_XqWW)WYTH5a&AhqC9!!gwl z=M(B17VGOaO2^VLQ_Wz%E=y5N@tsrH{E>ST*O*m-x{6C-KaZm(qY{<0i3T*&aW!KHCfwQIjHqq-&##S zlxh_mY&X@s)9Fcr2t)1N;xM+mPaO~WUDwucMg9?K*Qfix+GfXj6vvZH?g1*hAD?_$ z&q^Ae;S$cUy5HIRD%@|&=J`(BKy2f;Vp5fB*N$jB<~;Ute}&{2=$S=F>>l-;x^VN_ zTI|klSQh`KAEu04PxiVk0h_w&_re>B5DuA$k9ati7B^pZpAw+@?L_L$05X9b$Jt`H z3QKC&!nsACU*5;3^hr;xg}E<}!;(Zc$VWNBYU>Xkf7rk1H0yXgb}~E0#ux?Qta8;C z?Ra&)>WNG_TXjDhKl}gKMO#wx@Cht$Z$!mFicW{$+ahcByX!` zN3P#`()EVd=W;u`n=uI%piNUA?*|6Mr?n`lOB%RFYj>gn`-nyK;Q)IPd1*MFxHC_Y zf<`#ZXxIY#gWmzsQsDw$qAt0M1#SXP!olLf_WowW(cigM_sEwuOR1}|t>75S6@^?5 zl2mge1loF(se@jZYe;)swjGr`$k_Ii%2eo#dzx7A6kpxPSs03;7dYWxrCwSBLgDu@ z2-j;;^o~0^x1m6Z7}KZ8JJz&vFKi5fqjA2PTN_ZIVZ+hRC%5TZ0dhX}k*K1@D^lfg z6E(PdoBrJ@w9PFKAESbmGKRh#pMv`&;cP6;KXs=v7^j?#k|5UG2bJwfCtL7R$6`Ec zjJAJgvbLqr)6~QLX0If@G*4jHz8t~!$UBVj*rbX-m&?`@77tSN8oxubr(v@ao zdj_<&lVd&-v5d0usOv=)GrTI_PVnaKGmpO~b5ymvv*Iuw3Bg!Q$`v+dqDYG-T|pmV zZkNZia{0czL%z6}-e&7_f1B^zbiW1GX`U7_IY~u!fsbS1+i;k--^5EaP}{*{q39nUozN*C{yqY*wp!b%`Fwx zut^p!Qfw#_#6dtU;gbVP(5Cl-HvE|iZFL~}h3UF!Po|0D6mFKF$)+Bks2Rg0=}OmG zDL3n1$#v9|N5c1|OHi*VSk|_sO zeDOiV{CA{V{m!>%ao7FCFCF3r2lU}x`xtFa?@QoZIbp{rr{?2Do_hayg=MzwiHKzH zfyVRoq3qcuBUnkBpep~UFuT-7z&-xU8mQryfcb%lpu73<x%KJD?j$e06I|SdwoaA` z$a&-WZAf@c4GGRbt&o+11va0N-`o5@eO7B&Ede)UxX<9eZ{#e|zD)McYHdvT#W-&(eB+d22GP|$u>!hW!mj zTjcGWBw@eXH7EF`swW?4ggOa`$*jjrHBTbAn70D^c!0tWwko0T>N--Q^V+rXu_@)O zK~DbOuTXb!)=-xg_g53*>GNvsgMi4?#dgiv#HAv#ZqN~L_IDgQ?^tD8+{CA6j&0`W z>e`lrW7WmAoW+{#K7Q1a6ws!qXEwZ)w+}3wq({2P^+S+RH`%ccPm!txq7=a@55%@e zKZaKWhA&cyFBAeA|6WpJ| zW9-rNW$6+XorccHI`YBgpPliRmr#S#*M7o=DOQOSdQ<3oy4E58K9pO8j1(Ql*SUaS zwU}4$!AGxgV^mG{lzw&FJy64_S?2VWR*T`!(oX-l%PKE>9i_X&1uWes|-q(e7nCj$d@t z_cclgXEd^h?rfdB_s$QAEC#ooY8KY>)(Pl&E{Rvqc;(J`<`6<6#ZYSU5Lx+?9$`>GfIh`;cy^2Y5{YzFr86oviY@0yt1v?xkA zbPrE%AYQIGR^45Pa=Ece^qNZY-co?7(^n8_NPiabN5baw*WT77_(1LX)t3vBgAE6n z(oTo()|qd}(>c5?7LryKZS;m?@+lVDQv=wzn*np-*`ETuYP8x{B1Cdp)p&x^8H;ZZ z9!Z3jC&5d_i<#Y28^Evm6=BI~k(CP@3P;Nm#;KKa!gL*B5*ralyfBr8Dc=ir9eiS! zEVEbQt2^ANAu>(C7)BF=zD+w~53U!xgu4{E>>=_}$>Ube`dg>bl*MpTNj63YbTBf$ z=qv?Eh&A(>lrADjzah#&*vDl#KaDN)z{`d{B0ZUfUnQOS569M`#O2xCn%v)URsj=V z&r8A#AIL;R{*8F|p{0E3UZh=#lL7xXyG%0n;Wetj*YQxXXuF3l)ZBuR`{KhvBNyUn zm8_Ch75xEzu0cdWyOXml zB$Dwq2vaQ;*~6b7YT^DH65;PrRYL&^Pp_GLR{>fiG5jK&WHr}U2WCZz$e&G!r{w}1 z?E3bn2lX?{sJB&tUF6XdLAxm*{YADLT-@hN(YK`(8 s`Maf(xmtEnG)4=52g*@J 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�T&7HxbdQ=J4a`;4H4Hb1anhD6%R;|&rR?fz73WS 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 VQ;AJ8QvZ93jD(_iwWx8>{{iBFID7yA literal 27393 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 J7fU^R@n61@;XD8U diff --git a/docs/en-US/images/delete-ldap-configuration-failure.png b/docs/en-US/images/delete-ldap-configuration-failure.png index b5b50e0b7e563544ac044e0ad06019da984d9fd7..2b7bfe525cf99455a554ee8062af61847b89cacc 100644 GIT binary patch literal 39952 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

epQ@_{N5-eA~|Res0&C@b7HMUtI zoR*{F>s)kAkK5MHI!YyZwc>*zwV`h@%8DoaE!^xyU+;&RKVHyj$Z$&Oz!NQsw|%=o zNl$7o2bd%M0`C7~vRiiJwAz9(5_)Yv4!@Myn>Sik(r65z9NSR5$o_hOL)puPEbxWp ziB)G~jqKEdsPLUAXTxUam|WQ$Dhyw3ut6E^7weaq_;JC|PNls`J8J=Sv!PyGRQ}1zo~&*sx9oFRFus zYekR;Al+JJy*rjeolj}lujH5wrw_?&Z;biE{y%Z_#r-6Yh!Nc;C1qmSumRm=I&rIi zV$3OdsjqE)>69X{WfRD&MM9ZA+ZCB+B4r4?RMe{r+Z@~eZ(b~K3$HlNE-Y{+H|lqG z?;bnIOr6*6vND!9=TQv^htYI!+mU$qCkB#lTEu1kV?O>Js{!~q%%c1_Op5q52@Km^ zt9yccjRNd!;^G(6AXfm|`$%$SF`>#VAt*}4%67m`fSQnGuv=fgt)d|mSJG_j zqg!&XM?*u&7xl;8eHDg7t~&w$WXObX`q$KzGIRBv_W($FA=U;eUOsP~@XdE{&1bPH zv6<{Xr4Xp}3Eg^CMtt%=Al(D*V-gdL9QNl<%ac1Dn_MWrpJhR;U#B>pBF*IE+kkg? zVf%||NuGDDS$gYn2+@IDoS1tq*E^vPmxo@M@YS!oTDsygi)8z5SxQjD#M^u5sL@MX zU(Z3n*!%~){E_$M>@N{vQ?6Kz_vwTh-&Z&4cO5P0QYYjFQN7Crxbwtc2v`q?Bqc(v zFK$p(26g>2JG*HH*ZZjJrn7&v>Xmv}hjl*X`iPC?od9MZ(f07E_>Pp`PuabhTTwJ; zm0pQy7;YLFA*;%M<#&4U$j~3;{g0i?Hz@Nh;?Zl%;qI!Hx5N?TJ5{AQQ_XoTe>l;J z!+BtT*YzlQTOEA+yOfIWzboiN;>Xes(*3(dhS4yHEcgOR(H| diff --git a/docs/en-US/images/delete-ldap-configuration.png b/docs/en-US/images/delete-ldap-configuration.png new file mode 100644 index 0000000000000000000000000000000000000000..c2f6c4695fbaddf081cb4c1bbc9b918497d898c0 GIT binary patch literal 69084 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

)@>hfGAyo;N-^BG4I=~P6zg^NIRt`a z8HX1qRceh)Pu~c?JnMG!IY(FzjjQBJN}{JFIL5i0E(;Kx&R&v|6W;YN*kAe6ieRGdWx=FC$dGLRu%GFdV+z00000_(nsaf0An6%aanxO|uPt zMZ}TH?Hdo>=cbqGf|GUWYnG3df1A!P&v#w;{nq2pVA?yB!MU;HADoj2UpfE)008{w z`6`yV!!UxRiLa-B0*|YbB2wPPDVo6vy&C(LonMTl0}5isY@{fHk!Uqa;cHlK8UO$Q z0N`H_EnmS%;nzzPc+Nl3p|77JPEh2xEK`XhFL1(*{v(_qNyvl%0001hPzV430002~ z6T!F@000000Dw>k0000003Z|s0000000@Nu00000074-E00000fKUhk00000AQS=s o000002!#Lu0002sQ~xW#0KjGSc`*sEMgRZ+07*qoM6N<$g22gNr~m)} literal 56047 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

p5QpyFo)H~dAl5Z3jJ(x~_PR>Z|o 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

^V2iK z>3Q-KXphZ@?D>#W3=L~Le(0e$>&auxC8&gy+q z3Hvg!x|v}s-g6@oCIUG*Toc=)bJnbJMXa*IWmTLo%$*BJ8|pZr0rp1(c8o6_NPJQO z5RxzV2^quP#E5Vo%e>t-)|4)abw%9ER28u-OF1agm=b1HV`wmq{HQqCi?A@gW4~`hg#&Du&uQ61BW?X2k1Y z#_HPKJTIhHAbyDmg6WhVEcXh7s&$yI*%-e#nFphIE{#YlvRTTSaD9?H`7<>;>8KP=?lK zS}&<5N=G7- zg5iT{-;i#v^T^Px%?Y-);5pYV0v}w;Tq?cp&n`K3Z61RcQ$pfi5+*GV7Gx3{ZOv`9 zzvXl~QM`55266k$hKap$qZ<#CJfTS+#ucsfwhkvOZndjk!I_y_q94T%ws6Ptd8kv!C_bCSQ?K4dm;xH)%cmNcrh=(M;RuObp4-ZL5{_MtnRmhJ- jbDpE~NLcn8NKTS~0=++Z%=IQ5ymw`Jb-7|0Q@?)!;X^*# literal 30977 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 P83+Yg6`2xglc)azb$cK& From a8ad908666b963bfd152b508fcec7259cf3a545f Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Sat, 27 Jul 2013 19:51:02 +0530 Subject: [PATCH 083/907] CLOUDSTACK-3703: change service offering of stopped vm on Conflicts: server/test/com/cloud/vm/UserVmManagerTest.java --- server/src/com/cloud/vm/UserVmManagerImpl.java | 7 ++++--- server/test/com/cloud/vm/UserVmManagerTest.java | 2 ++ 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index e4d1c78f85f..34f3de2b95e 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1139,15 +1139,16 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir // Verify input parameters VMInstanceVO vmInstance = _vmInstanceDao.findById(vmId); - if(vmInstance.getHypervisorType() != HypervisorType.XenServer && vmInstance.getHypervisorType() != HypervisorType.VMware){ - throw new InvalidParameterValueException("This operation not permitted for this hypervisor of the vm"); - } if (vmInstance.getState().equals(State.Stopped)) { upgradeStoppedVirtualMachine(vmId, newServiceOfferingId); return true; } + if(vmInstance.getHypervisorType() != HypervisorType.XenServer && vmInstance.getHypervisorType() != HypervisorType.VMware){ + throw new InvalidParameterValueException("This operation not permitted for this hypervisor of the vm"); + } + _accountMgr.checkAccess(caller, null, true, vmInstance); // Check that the specified service offering ID is valid diff --git a/server/test/com/cloud/vm/UserVmManagerTest.java b/server/test/com/cloud/vm/UserVmManagerTest.java index 13563243e7c..a6b8daf92a8 100755 --- a/server/test/com/cloud/vm/UserVmManagerTest.java +++ b/server/test/com/cloud/vm/UserVmManagerTest.java @@ -313,6 +313,8 @@ public class UserVmManagerTest { // UserContext.current().setEventDetails("Vm Id: "+getId()); Account account = new AccountVO("testaccount", 1L, "networkdomain", (short) 0, "uuid"); UserVO user = new UserVO(1, "testuser", "password", "firstname", "lastName", "email", "timezone", UUID.randomUUID().toString()); + //AccountVO(String accountName, long domainId, String networkDomain, short type, int regionId) + doReturn(VirtualMachine.State.Running).when(_vmInstance).getState(); CallContext.register(user, account); try { From 738523b57c61bcc3439d1433f9c6a78848cd413c Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sat, 27 Jul 2013 19:46:37 +0530 Subject: [PATCH 084/907] CLOUDSTACK-2882: Additional device types for IDE/SCSI Signed-off-by: Prasanna Santhanam (cherry picked from commit b39d302888f965c5c26812b556c2dc395c53bb5c) --- test/integration/smoke/test_vm_life_cycle.py | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py index c2c25928375..7dab5cf26e7 100644 --- a/test/integration/smoke/test_vm_life_cycle.py +++ b/test/integration/smoke/test_vm_life_cycle.py @@ -116,7 +116,7 @@ class Services: "name": "Cent OS Template", "passwordenabled": True, }, - "diskdevice": ['/dev/xvdd', '/dev/cdrom', '/dev/sr0', '/dev/cdrom1' ], + "diskdevice": ['/dev/vdc', '/dev/vdb', '/dev/hdb', '/dev/hdc', '/dev/xvdd', '/dev/cdrom', '/dev/sr0', '/dev/cdrom1' ], # Disk device where ISO is attached to instance "mount_dir": "/mnt/tmp", "sleep": 60, @@ -732,15 +732,6 @@ class TestVMLifeCycle(cloudstackTestCase): cmd.virtualmachineid = self.virtual_machine.id self.apiclient.attachIso(cmd) - #determine device type from hypervisor - hosts = Host.list(self.apiclient, id=self.virtual_machine.hostid) - self.assertTrue(isinstance(hosts, list)) - self.assertTrue(len(hosts) > 0) - self.debug("Found %s host" % hosts[0].hypervisor) - - if hosts[0].hypervisor.lower() == "kvm": - self.services["diskdevice"] = "/dev/vdb" - try: ssh_client = self.virtual_machine.get_ssh_client() except Exception as e: From 40b59d7e2acfb88d65d9374e9723b7fe38eabf3c Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sat, 27 Jul 2013 20:18:05 +0530 Subject: [PATCH 085/907] CLOUDSTACK-2882: We are mounting an ISO not a volume So fdisk -l doesn't list the mounted iso. Instead use showmount -e to find the mounted device. Signed-off-by: Prasanna Santhanam (cherry picked from commit 93f79e1a158cb1f69915a4036f5c1840a38c5e53) --- test/integration/smoke/test_vm_life_cycle.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py index 7dab5cf26e7..8e5a8bbcdd7 100644 --- a/test/integration/smoke/test_vm_life_cycle.py +++ b/test/integration/smoke/test_vm_life_cycle.py @@ -749,7 +749,7 @@ class TestVMLifeCycle(cloudstackTestCase): else: self.skipTest("No mount points matched. Mount was unsuccessful") - c = "fdisk -l|grep %s|head -1" % self.services["mount"] + c = "mount |grep %s|head -1" % self.services["mount"] res = ssh_client.execute(c) self.debug("Found a mount point at %s" % res) @@ -775,7 +775,7 @@ class TestVMLifeCycle(cloudstackTestCase): self.assertEqual( str(iso_size) in result, True, - "Check size of the attached ISO" + "ISO size mismatch. reported size within guest %s" % str(iso_size) ) try: #Unmount ISO From 081ba924971987d70c1f3ea9a373c1ff6ced2925 Mon Sep 17 00:00:00 2001 From: Sateesh Chodapuneedi Date: Sat, 27 Jul 2013 16:54:49 +0530 Subject: [PATCH 086/907] COUDSTACK-3053 Template creation from snapshot is failing on VMware setup Fixed snapshot vmdk file path while copying snapshot files to template path. Signed-off-by: Sateesh Chodapuneedi --- .../resource/VmwareStorageProcessor.java | 23 +++++++------------ 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index d1068891e18..4df7eb4fd5d 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -27,9 +27,6 @@ import java.util.List; import java.util.Map; import java.util.UUID; -import com.cloud.agent.api.storage.CopyVolumeAnswer; -import com.cloud.agent.api.storage.CopyVolumeCommand; -import com.cloud.agent.api.to.*; import org.apache.cloudstack.storage.command.AttachAnswer; import org.apache.cloudstack.storage.command.AttachCommand; import org.apache.cloudstack.storage.command.CopyCmdAnswer; @@ -46,14 +43,11 @@ import org.apache.commons.lang.StringUtils; import org.apache.log4j.Logger; import com.cloud.agent.api.Answer; -import com.cloud.agent.api.AttachVolumeCommand; -import com.cloud.agent.api.BackupSnapshotAnswer; import com.cloud.agent.api.Command; -import com.cloud.agent.api.CreateVolumeFromSnapshotAnswer; -import com.cloud.agent.api.ManageSnapshotAnswer; -import com.cloud.agent.api.ManageSnapshotCommand; -import com.cloud.agent.api.storage.CreatePrivateTemplateAnswer; -import com.cloud.agent.api.storage.PrimaryStorageDownloadAnswer; +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.hypervisor.vmware.manager.VmwareHostService; import com.cloud.hypervisor.vmware.manager.VmwareStorageMount; import com.cloud.hypervisor.vmware.mo.ClusterMO; @@ -71,9 +65,9 @@ import com.cloud.hypervisor.vmware.util.VmwareHelper; import com.cloud.serializer.GsonHelper; import com.cloud.storage.DataStoreRole; import com.cloud.storage.JavaStorageLayer; +import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.StorageLayer; import com.cloud.storage.Volume; -import com.cloud.storage.Storage.ImageFormat; import com.cloud.storage.template.VmdkProcessor; import com.cloud.utils.Pair; import com.cloud.utils.Ternary; @@ -858,16 +852,15 @@ public class VmwareStorageProcessor implements StorageProcessor { throw new Exception(msg); } - s_logger.info("vmdkfile parent dir: " + snapshotFullVMDKName); - File snapshotdir = new File(snapshotFullVMDKName); - // File snapshotdir = new File(snapshotRoot); + s_logger.info("vmdkfile parent dir: " + snapshotRoot); + File snapshotdir = new File(snapshotRoot); File[] ssfiles = snapshotdir.listFiles(); // List filenames = new ArrayList(); for (int i = 0; i < ssfiles.length; i++) { String vmdkfile = ssfiles[i].getName(); s_logger.info("vmdk file name: " + vmdkfile); if(vmdkfile.toLowerCase().startsWith(backupSSUuid) && vmdkfile.toLowerCase().endsWith(".vmdk")) { - snapshotFullVMDKName += vmdkfile; + snapshotFullVMDKName = snapshotRoot + File.separator + vmdkfile; templateVMDKName += vmdkfile; break; } From 3adeb12d2fff575603ac80fe8b176c68d813d24c Mon Sep 17 00:00:00 2001 From: Sateesh Chodapuneedi Date: Sat, 27 Jul 2013 16:59:26 +0530 Subject: [PATCH 087/907] CLOUDSTACK-3879 [VMware] NPE while attempting to create template from volume Signed-off-by: Sateesh Chodapuneedi --- .../com/cloud/storage/resource/VmwareStorageProcessor.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 4df7eb4fd5d..65a0cb56596 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -855,6 +855,11 @@ public class VmwareStorageProcessor implements StorageProcessor { s_logger.info("vmdkfile parent dir: " + snapshotRoot); File snapshotdir = new File(snapshotRoot); File[] ssfiles = snapshotdir.listFiles(); + if (ssfiles == null) { + String msg = "unable to find snapshot vmdk files in " + snapshotRoot; + s_logger.error(msg); + throw new Exception(msg); + } // List filenames = new ArrayList(); for (int i = 0; i < ssfiles.length; i++) { String vmdkfile = ssfiles[i].getName(); From abfc351b783e4aa0bfc360979de54dbea67cf538 Mon Sep 17 00:00:00 2001 From: Prachi Damle Date: Sat, 27 Jul 2013 15:52:35 -0700 Subject: [PATCH 088/907] CLOUDSTACK-3814 Duplicate entry for CPU, Public ip address in dashboard Changes: - ListCapacity API was searching the capacities per zone, pod and cluster causing duplicates to end up in th result. - Instead we should group by zone if zone and pod both are null. Group by pod if zone is provided but no pod. Or group by cluster when zone and pod both are provided. --- .../cloud/server/ManagementServerImpl.java | 19 +++++++++---------- 1 file changed, 9 insertions(+), 10 deletions(-) diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index ecb8f85d71b..e0abe0146fb 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -2292,24 +2292,23 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe if (summedCapacitiesAtZone != null) { summedCapacities.addAll(summedCapacitiesAtZone); } - } - if (podId == null) {// Group by Pod, capacity type + } else if (podId == null) {// Group by Pod, capacity type List summedCapacitiesAtPod = _capacityDao.listCapacitiesGroupedByLevelAndType(capacityType, zoneId, podId, clusterId, 2, cmd.getPageSizeVal()); if (summedCapacitiesAtPod != null) { summedCapacities.addAll(summedCapacitiesAtPod); } - List summedCapacitiesForSecStorage = getSecStorageUsed(zoneId, capacityType); - if (summedCapacitiesForSecStorage != null) { - summedCapacities.addAll(summedCapacitiesForSecStorage); + } else { // Group by Cluster, capacity type + List summedCapacitiesAtCluster = _capacityDao.listCapacitiesGroupedByLevelAndType( + capacityType, zoneId, podId, clusterId, 3, cmd.getPageSizeVal()); + if (summedCapacitiesAtCluster != null) { + summedCapacities.addAll(summedCapacitiesAtCluster); } } - // Group by Cluster, capacity type - List summedCapacitiesAtCluster = _capacityDao.listCapacitiesGroupedByLevelAndType(capacityType, zoneId, podId, clusterId, 3, - cmd.getPageSizeVal()); - if (summedCapacitiesAtCluster != null) { - summedCapacities.addAll(summedCapacitiesAtCluster); + List summedCapacitiesForSecStorage = getSecStorageUsed(zoneId, capacityType); + if (summedCapacitiesForSecStorage != null) { + summedCapacities.addAll(summedCapacitiesForSecStorage); } // Sort Capacities From 2c660cdbc215b4fd6de28fcab5fe2cf870c5c7bc Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sun, 28 Jul 2013 10:18:39 +0530 Subject: [PATCH 089/907] Fix simulator and marvin - Remove additional parantheses in marvin VirtualMachine.create( - Implement createEntityExtractUrl command for simulator Signed-off-by: Prasanna Santhanam (cherry picked from commit 908df7aabdd7bfca1d0a3c1b39a83111b61ee692) --- .../driver/SimulatorImageStoreDriverImpl.java | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) diff --git a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java index b230194bd65..e18f8e59b82 100644 --- a/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java +++ b/plugins/hypervisors/simulator/src/org/apache/cloudstack/storage/datastore/driver/SimulatorImageStoreDriverImpl.java @@ -26,31 +26,26 @@ import com.cloud.agent.api.to.DataStoreTO; import com.cloud.agent.api.to.NfsTO; import com.cloud.storage.Storage; import com.cloud.storage.VMTemplateStorageResourceAssoc; -import com.cloud.storage.VMTemplateVO; -import com.cloud.storage.VolumeVO; import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VolumeDao; 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.ObjectInDataStoreStateMachine; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPoint; +import org.apache.cloudstack.engine.subsystem.api.storage.EndPointSelector; 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.storage.datastore.db.TemplateDataStoreDao; -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.image.BaseImageStoreDriverImpl; import org.apache.cloudstack.storage.image.store.ImageStoreImpl; -import org.apache.cloudstack.storage.to.TemplateObjectTO; -import org.apache.cloudstack.storage.to.VolumeObjectTO; +import org.apache.log4j.Logger; import javax.inject.Inject; -import java.util.Date; import java.util.UUID; public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl { + private static final Logger s_logger = Logger.getLogger(SimulatorImageStoreDriverImpl.class); @Inject TemplateDataStoreDao _templateStoreDao; @@ -60,6 +55,8 @@ public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl { VolumeDao _volumeDao; @Inject VolumeDataStoreDao _volumeStoreDao; + @Inject + EndPointSelector _epSelector; @Override public DataStoreTO getStoreTO(DataStore store) { @@ -71,11 +68,6 @@ public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl { } - - public String createEntityExtractUrl(DataStore store, String installPath, Storage.ImageFormat format) { - return null; - } - @Override public void createAsync(DataStore dataStore, DataObject data, AsyncCompletionCallback callback) { if (data.getType() == DataObjectType.TEMPLATE) { @@ -112,4 +104,20 @@ public class SimulatorImageStoreDriverImpl extends BaseImageStoreDriverImpl { caller.complete(answer); return; } + + @Override + public String createEntityExtractUrl(DataStore store, String installPath, Storage.ImageFormat format, DataObject dataObject) { + EndPoint ep = _epSelector.select(store); + // Create Symlink at ssvm + String path = installPath; + String uuid = UUID.randomUUID().toString() + "." + format.getFileExtension(); + // Construct actual URL locally now that the symlink exists at SSVM + return generateCopyUrl(ep.getPublicAddr(), uuid); + } + + private String generateCopyUrl(String ipAddress, String uuid){ + String hostname = ipAddress; + String scheme = "http"; + return scheme + "://" + hostname + "/userdata/" + uuid; + } } \ No newline at end of file From 1fb513e783fe89a6542774a0b0363a4671434eef Mon Sep 17 00:00:00 2001 From: Min Chen Date: Sat, 27 Jul 2013 21:48:54 -0700 Subject: [PATCH 090/907] CLOUDSTACK-3861: Remove s3.enable and swift.enable from global setting. --- server/src/com/cloud/configuration/Config.java | 2 -- server/src/com/cloud/storage/s3/S3ManagerImpl.java | 12 ++++-------- setup/db/db/schema-410to420.sql | 2 ++ 3 files changed, 6 insertions(+), 10 deletions(-) diff --git a/server/src/com/cloud/configuration/Config.java b/server/src/com/cloud/configuration/Config.java index c815c771290..ff484be0c1a 100755 --- a/server/src/com/cloud/configuration/Config.java +++ b/server/src/com/cloud/configuration/Config.java @@ -150,8 +150,6 @@ public enum Config { // Advanced JobExpireMinutes("Advanced", ManagementServer.class, String.class, "job.expire.minutes", "1440", "Time (in minutes) for async-jobs to be kept in system", null), JobCancelThresholdMinutes("Advanced", ManagementServer.class, String.class, "job.cancel.threshold.minutes", "60", "Time (in minutes) for async-jobs to be forcely cancelled if it has been in process for long", null), - SwiftEnable("Advanced", ManagementServer.class, Boolean.class, "swift.enable", "false", "enable swift ", null), - S3Enable("Advanced", ManagementServer.class, Boolean.class, "s3.enable", "false", "enable s3 ", null), EventPurgeInterval("Advanced", ManagementServer.class, Integer.class, "event.purge.interval", "86400", "The interval (in seconds) to wait before running the event purge thread", null), AccountCleanupInterval("Advanced", ManagementServer.class, Integer.class, "account.cleanup.interval", "86400", "The interval (in seconds) between cleanup for removed accounts", null), AllowPublicUserTemplates("Advanced", ManagementServer.class, Integer.class, "allow.public.user.templates", "true", "If false, users will not be able to create public templates.", null, ConfigurationParameterScope.account.toString()), diff --git a/server/src/com/cloud/storage/s3/S3ManagerImpl.java b/server/src/com/cloud/storage/s3/S3ManagerImpl.java index f393fff6268..1f8486c88ff 100644 --- a/server/src/com/cloud/storage/s3/S3ManagerImpl.java +++ b/server/src/com/cloud/storage/s3/S3ManagerImpl.java @@ -29,7 +29,6 @@ import static com.cloud.utils.StringUtils.join; import static com.cloud.utils.db.GlobalLock.executeWithNoWaitLock; import static java.lang.Boolean.TRUE; import static java.lang.String.format; -import static java.util.Arrays.asList; import static java.util.Collections.emptyList; import static java.util.Collections.shuffle; import static java.util.Collections.singletonList; @@ -58,7 +57,6 @@ import com.cloud.agent.api.Answer; import com.cloud.agent.api.DownloadTemplateFromS3ToSecondaryStorageCommand; import com.cloud.agent.api.UploadTemplateToS3FromSecondaryStorageCommand; import com.cloud.agent.api.to.S3TO; -import com.cloud.configuration.Config; import com.cloud.configuration.dao.ConfigurationDao; import com.cloud.dc.DataCenterVO; import com.cloud.dc.dao.DataCenterDao; @@ -77,7 +75,6 @@ import com.cloud.storage.dao.VMTemplateDao; import com.cloud.storage.dao.VMTemplateHostDao; import com.cloud.storage.dao.VMTemplateS3Dao; import com.cloud.storage.dao.VMTemplateZoneDao; -import com.cloud.storage.secondary.SecondaryStorageVmManager; import com.cloud.utils.S3Utils.ClientOptions; import com.cloud.utils.component.ManagerBase; import com.cloud.utils.db.Filter; @@ -258,9 +255,9 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { params.get(ApiConstants.S3_END_POINT), params.get(ApiConstants.S3_BUCKET_NAME), params.get(ApiConstants.S3_HTTPS_FLAG) == null ? false : Boolean.valueOf(params.get(ApiConstants.S3_HTTPS_FLAG)), - params.get(ApiConstants.S3_CONNECTION_TIMEOUT) == null ? null : Integer.valueOf(params.get(ApiConstants.S3_CONNECTION_TIMEOUT)), - params.get(ApiConstants.S3_MAX_ERROR_RETRY) == null ? null : Integer.valueOf(params.get(ApiConstants.S3_MAX_ERROR_RETRY)), - params.get(ApiConstants.S3_SOCKET_TIMEOUT) == null ? null : Integer.valueOf(params.get(ApiConstants.S3_SOCKET_TIMEOUT)), now()); + params.get(ApiConstants.S3_CONNECTION_TIMEOUT) == null ? null : Integer.valueOf(params.get(ApiConstants.S3_CONNECTION_TIMEOUT)), + params.get(ApiConstants.S3_MAX_ERROR_RETRY) == null ? null : Integer.valueOf(params.get(ApiConstants.S3_MAX_ERROR_RETRY)), + params.get(ApiConstants.S3_SOCKET_TIMEOUT) == null ? null : Integer.valueOf(params.get(ApiConstants.S3_SOCKET_TIMEOUT)), now()); this.validateFields(s3VO); @@ -271,8 +268,7 @@ public class S3ManagerImpl extends ManagerBase implements S3Manager { @Override public boolean isS3Enabled() { - return Boolean - .valueOf(configurationDao.getValue(Config.S3Enable.key())); + return false; } @Override diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index a93aec444b5..530608edc70 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -35,6 +35,8 @@ UPDATE `cloud`.`hypervisor_capabilities` SET `storage_motion_supported`=true WHE UPDATE `cloud`.`hypervisor_capabilities` SET `storage_motion_supported`=true WHERE `hypervisor_type`='VMware' AND `hypervisor_version`='5.0'; DELETE FROM `cloud`.`configuration` where name='vmware.percluster.host.max'; DELETE FROM `cloud`.`configuration` where name='router.template.id'; +DELETE FROM `cloud`.`configuration` where name='swift.enable'; +DELETE FROM `cloud`.`configuration` where name='s3.enable'; INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Advanced', 'DEFAULT', 'AgentManager', 'xen.nics.max', '7', 'Maximum allowed nics for Vms created on Xen'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'midonet.apiserver.address', 'http://localhost:8081', 'Specify the address at which the Midonet API server can be contacted (if using Midonet)'); INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'management-server', 'midonet.providerrouter.id', 'd7c5e6a3-e2f4-426b-b728-b7ce6a0448e5', 'Specifies the UUID of the Midonet provider router (if using Midonet)'); From 3fec71e7489e199bbd6c70a5bcb62a64a3e3e0ff Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sun, 28 Jul 2013 11:24:25 +0530 Subject: [PATCH 091/907] Fix domain deletion in test_project_resources.py Signed-off-by: Prasanna Santhanam (cherry picked from commit a019f34572ef591b238adb256a0036565bb21579) --- test/integration/component/test_project_resources.py | 3 +-- test/integration/component/test_projects.py | 2 +- test/integration/smoke/test_loadbalance.py | 2 +- test/integration/smoke/test_vm_life_cycle.py | 2 +- 4 files changed, 4 insertions(+), 5 deletions(-) diff --git a/test/integration/component/test_project_resources.py b/test/integration/component/test_project_resources.py index 01aa1338f27..924c9169d37 100644 --- a/test/integration/component/test_project_resources.py +++ b/test/integration/component/test_project_resources.py @@ -784,8 +784,7 @@ class TestSnapshots(cloudstackTestCase): cls._cleanup = [ cls.project, cls.service_offering, - cls.account, - cls.domain + cls.account ] return diff --git a/test/integration/component/test_projects.py b/test/integration/component/test_projects.py index 510542a15b8..e4c2180dd42 100644 --- a/test/integration/component/test_projects.py +++ b/test/integration/component/test_projects.py @@ -1203,7 +1203,7 @@ class TestProjectResources(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator", "needle"]) + @attr(tags = ["advanced", "basic", "sg", "eip", "advancedns", "simulator"]) def test_07_project_resources_account_delete(self): """ Test Verify after an account is removed from the project, all its resources stay with the project. """ diff --git a/test/integration/smoke/test_loadbalance.py b/test/integration/smoke/test_loadbalance.py index f5405da5e1f..3e48158442a 100644 --- a/test/integration/smoke/test_loadbalance.py +++ b/test/integration/smoke/test_loadbalance.py @@ -211,7 +211,7 @@ class TestLoadBalance(cloudstackTestCase): time.sleep(self.services["lb_switch_wait"]) return - @attr(tags = ["advanced", "advancedns", "smoke", "needle"]) + @attr(tags = ["advanced", "advancedns", "smoke"]) def test_01_create_lb_rule_src_nat(self): """Test to create Load balancing rule with source NAT""" diff --git a/test/integration/smoke/test_vm_life_cycle.py b/test/integration/smoke/test_vm_life_cycle.py index 8e5a8bbcdd7..e8a4be50e14 100644 --- a/test/integration/smoke/test_vm_life_cycle.py +++ b/test/integration/smoke/test_vm_life_cycle.py @@ -696,7 +696,7 @@ class TestVMLifeCycle(cloudstackTestCase): ) return - @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg", "needle"]) + @attr(tags = ["advanced", "advancedns", "smoke", "basic", "sg"]) def test_10_attachAndDetach_iso(self): """Test for attach and detach ISO to virtual machine""" From 03150fd6eeee44ad4e9c4618e3f4379da2d36a1d Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sun, 28 Jul 2013 12:21:02 +0530 Subject: [PATCH 092/907] CLOUDSTACK-3797: Including httpd permission and test page - add a test page for the http service - startup on boot - configure iptables port :80 - cleanup iso files Signed-off-by: Prasanna Santhanam --- tools/appliance/definitions/builtin/cleanup.sh | 2 ++ .../definitions/builtin/install-xs-tools.sh | 3 +++ .../definitions/builtin/postinstall.sh | 17 +++++++++++++++-- 3 files changed, 20 insertions(+), 2 deletions(-) diff --git a/tools/appliance/definitions/builtin/cleanup.sh b/tools/appliance/definitions/builtin/cleanup.sh index e450f8e477d..825a0091d2c 100644 --- a/tools/appliance/definitions/builtin/cleanup.sh +++ b/tools/appliance/definitions/builtin/cleanup.sh @@ -1,8 +1,10 @@ # Clean up unneeded packages. yum -y erase gtk2 libX11 hicolor-icon-theme avahi freetype bitstream-vera-fonts yum -y clean all + #rm -rf /etc/yum.repos.d/{puppetlabs,epel}.repo rm -rf VBoxGuestAdditions_*.iso +rm -rf xs-tools*.iso # Ensure that udev doesn't screw us with network device naming. ln -sf /dev/null /lib/udev/rules.d/75-persistent-net-generator.rules diff --git a/tools/appliance/definitions/builtin/install-xs-tools.sh b/tools/appliance/definitions/builtin/install-xs-tools.sh index fc3bd47558f..94f96c38568 100644 --- a/tools/appliance/definitions/builtin/install-xs-tools.sh +++ b/tools/appliance/definitions/builtin/install-xs-tools.sh @@ -5,3 +5,6 @@ sudo mount -o loop xs-tools.iso /mnt #install the xs tools sudo yes | sudo sh /mnt/Linux/install.sh + +#unmount and cleanup +sudo umount /mnt diff --git a/tools/appliance/definitions/builtin/postinstall.sh b/tools/appliance/definitions/builtin/postinstall.sh index 5af147e17b0..ef595126c35 100644 --- a/tools/appliance/definitions/builtin/postinstall.sh +++ b/tools/appliance/definitions/builtin/postinstall.sh @@ -27,15 +27,28 @@ install_packages() { } start_services() { - chkconfig httpd on service httpd start } +httpd_configure() { + # start httpd on boot + chkconfig httpd on + # open port 80 + iptables -I INPUT -p tcp --dport 80 -j ACCEPT + # create a test page + echo "

Hello, World

" > /var/www/html/test.html + # give 755 permissions and ownership + chmod -R 755 /var/www/html/ + chown -R apache:apache /var/www/html/ +} + begin=$(date +%s) install_packages +httpd_configure +start_services fin=$(date +%s) t=$((fin-begin)) -echo "Builtin baked in $t seconds" +echo "Testing Builtin baked in $t seconds" From 76c90efa407d70bfd6341a9d3197fa25f64d4e48 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Sun, 28 Jul 2013 17:00:30 +0530 Subject: [PATCH 093/907] Removing invalid test for accounts Signed-off-by: Prasanna Santhanam (cherry picked from commit f83187585e48b530ef7247dfd836c866cb3e1c32) --- test/integration/component/test_accounts.py | 269 -------------------- 1 file changed, 269 deletions(-) diff --git a/test/integration/component/test_accounts.py b/test/integration/component/test_accounts.py index 67b56fd4c7f..9c3d231a0e0 100644 --- a/test/integration/component/test_accounts.py +++ b/test/integration/component/test_accounts.py @@ -227,275 +227,6 @@ class TestAccounts(cloudstackTestCase): return -class TestRemoveUserFromAccount(cloudstackTestCase): - - @classmethod - def setUpClass(cls): - cls.api_client = super( - TestRemoveUserFromAccount, - cls - ).getClsTestClient().getApiClient() - cls.services = Services().services - # Get Zone, Domain and templates - cls.zone = get_zone(cls.api_client, cls.services) - cls.services['mode'] = cls.zone.networktype - cls.template = get_template( - cls.api_client, - cls.zone.id, - cls.services["ostype"] - ) - cls.services["virtual_machine"]["zoneid"] = cls.zone.id - cls.services["virtual_machine"]["template"] = cls.template.id - - cls.service_offering = ServiceOffering.create( - cls.api_client, - cls.services["service_offering"] - ) - # Create an account - cls.account = Account.create( - cls.api_client, - cls.services["account"] - ) - - cls._cleanup = [ - cls.service_offering, - ] - return - - @classmethod - def tearDownClass(cls): - try: - #Cleanup resources used - cleanup_resources(cls.api_client, cls._cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - return - - def setUp(self): - self.apiclient = self.testClient.getApiClient() - self.dbclient = self.testClient.getDbConnection() - self.cleanup = [] - return - - def tearDown(self): - try: - #Clean up, terminate the created instance, users etc - cleanup_resources(self.apiclient, self.cleanup) - except Exception as e: - raise Exception("Warning: Exception during cleanup : %s" % e) - return - - @attr(tags=["advanced", "basic", "eip", "advancedns", "sg"]) - def test_01_user_remove_VM_running(self): - """Test Remove one user from the account - """ - - # Validate the following - # 1. Create an account with 2 users. - # 2. Start 2 VMs; one for each user of the account - # 3. Remove one user from the account. Verify that account still exists. - # 4. Verify that VM started by the removed user are still running - - # Create an User associated with account and VMs - user_1 = User.create( - self.apiclient, - self.services["user"], - account=self.account.name, - domainid=self.account.domainid - ) - self.debug("Created user: %s" % user_1.id) - user_2 = User.create( - self.apiclient, - self.services["user"], - account=self.account.name, - domainid=self.account.domainid - ) - self.debug("Created user: %s" % user_2.id) - self.cleanup.append(user_2) - - vm_1 = VirtualMachine.create( - self.apiclient, - self.services["virtual_machine"], - accountid=self.account.name, - domainid=self.account.domainid, - serviceofferingid=self.service_offering.id - ) - self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.name, - vm_1.id - )) - self.cleanup.append(vm_1) - - vm_2 = VirtualMachine.create( - self.apiclient, - self.services["virtual_machine"], - accountid=self.account.name, - domainid=self.account.domainid, - serviceofferingid=self.service_offering.id - ) - self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.name, - vm_2.id - )) - self.cleanup.append(vm_2) - - # Remove one of the user - self.debug("Deleting user: %s" % user_1.id) - user_1.delete(self.apiclient) - - # Account should exist after deleting user - accounts_response = list_accounts( - self.apiclient, - id=self.account.id - ) - self.assertEqual( - isinstance(accounts_response, list), - True, - "Check for valid list accounts response" - ) - - self.assertNotEqual( - len(accounts_response), - 0, - "Check List Account response" - ) - vm_response = list_virtual_machines( - self.apiclient, - account=self.account.name, - domainid=self.account.domainid - ) - self.assertEqual( - isinstance(vm_response, list), - True, - "Check for valid list VM response" - ) - - self.assertNotEqual( - len(vm_response), - 0, - "Check List VM response" - ) - - # VMs associated with that account should be running - for vm in vm_response: - self.assertEqual( - vm.state, - 'Running', - "Check state of VMs associated with account" - ) - return - - @attr(tags=["advanced", "basic", "eip", "advancedns", "sg"]) - def test_02_remove_all_users(self): - """Test Remove both users from the account - """ - - # Validate the following - # 1. Remove both the users from the account. - # 2. Verify account is removed - # 3. Verify all VMs associated with that account got removed - - # Create an User associated with account and VMs - user_1 = User.create( - self.apiclient, - self.services["user"], - account=self.account.name, - domainid=self.account.domainid - ) - self.debug("Created user: %s" % user_1.id) - user_2 = User.create( - self.apiclient, - self.services["user"], - account=self.account.name, - domainid=self.account.domainid - ) - self.debug("Created user: %s" % user_2.id) - vm_1 = VirtualMachine.create( - self.apiclient, - self.services["virtual_machine"], - accountid=self.account.name, - domainid=self.account.domainid, - serviceofferingid=self.service_offering.id - ) - self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.name, - vm_1.id - )) - vm_2 = VirtualMachine.create( - self.apiclient, - self.services["virtual_machine"], - accountid=self.account.name, - domainid=self.account.domainid, - serviceofferingid=self.service_offering.id - ) - self.debug("Deployed VM in account: %s, ID: %s" % ( - self.account.name, - vm_2.id - )) - # Get users associated with an account - # (Total 3: 2 - Created & 1 default generated while account creation) - users = list_users( - self.apiclient, - account=self.account.name, - domainid=self.account.domainid - ) - self.assertEqual( - isinstance(users, list), - True, - "Check for valid list users response" - ) - for user in users: - - self.debug("Deleting user: %s" % user.id) - cmd = deleteUser.deleteUserCmd() - cmd.id = user.id - self.apiclient.deleteUser(cmd) - - interval = list_configurations( - self.apiclient, - name='account.cleanup.interval' - ) - self.assertEqual( - isinstance(interval, list), - True, - "Check for valid list configurations response" - ) - self.debug("account.cleanup.interval: %s" % interval[0].value) - - # Sleep to ensure that all resources are deleted - time.sleep(int(interval[0].value)) - - # Account is removed after last user is deleted - account_response = list_accounts( - self.apiclient, - id=self.account.id - ) - self.assertEqual( - account_response, - None, - "Check List VM response" - ) - # All VMs associated with account are removed. - vm_response = list_virtual_machines( - self.apiclient, - account=self.account.name, - domainid=self.account.domainid - ) - self.assertEqual( - vm_response, - None, - "Check List VM response" - ) - # DomR associated with account is deleted - with self.assertRaises(Exception): - list_routers( - self.apiclient, - account=self.account.name, - domainid=self.account.domainid - ) - return - - class TestNonRootAdminsPrivileges(cloudstackTestCase): @classmethod From 6f84e74a68d78705a06fe58f7927f42f61453a16 Mon Sep 17 00:00:00 2001 From: Rohit Yadav Date: Sun, 28 Jul 2013 22:49:17 +0530 Subject: [PATCH 094/907] tools: Remove cloudmonkey, add info in INSTALL.md After some discussion on the dev ML[1], we decided to move tools/cli which contained cloudmonkey to a new git repository [2]. We did that by retaining its history. In this commit, we remove tools/cli and add information on where to find cloudmonkey. This is help us speed up cloudmonkey's development and releases, now that with ApiDiscovery it's completely independent of any other CloudStack modules. [1] http://markmail.org/message/tjlr753xfhpw4uk4 [2] https://git-wip-us.apache.org/repos/asf?p=cloudstack-cloudmonkey.git Signed-off-by: Rohit Yadav --- INSTALL.md | 7 + tools/cli/README | 1 + tools/cli/cloudmonkey/__init__.py | 23 -- tools/cli/cloudmonkey/cachemaker.py | 181 --------- tools/cli/cloudmonkey/cloudmonkey.py | 538 --------------------------- tools/cli/cloudmonkey/config.py | 122 ------ tools/cli/cloudmonkey/printer.py | 120 ------ tools/cli/cloudmonkey/requester.py | 165 -------- tools/cli/pom.xml | 73 ---- tools/cli/setup.py | 68 ---- tools/pom.xml | 1 - 11 files changed, 8 insertions(+), 1291 deletions(-) create mode 100644 tools/cli/README delete mode 100644 tools/cli/cloudmonkey/__init__.py delete mode 100644 tools/cli/cloudmonkey/cachemaker.py delete mode 100644 tools/cli/cloudmonkey/cloudmonkey.py delete mode 100644 tools/cli/cloudmonkey/config.py delete mode 100644 tools/cli/cloudmonkey/printer.py delete mode 100644 tools/cli/cloudmonkey/requester.py delete mode 100644 tools/cli/pom.xml delete mode 100644 tools/cli/setup.py diff --git a/INSTALL.md b/INSTALL.md index b0e1a7617b0..37415dc25ec 100644 --- a/INSTALL.md +++ b/INSTALL.md @@ -213,6 +213,13 @@ Install needed packages: $ yum install cloud-agent # agent (kvm) $ yum install cloud-usage # usage server +## Installing CloudMonkey CLI + +CloudMonkey is a CLI for Apache CloudStack. It was earlier in `tools/cli` within +the source code but now it has its own repository: + + https://git-wip-us.apache.org/repos/asf?p=cloudstack-cloudmonkey.git + ## Notes If you will be using Xen as your hypervisor, please download [vhd-util](http://download.cloud.com.s3.amazonaws.com/tools/vhd-util) diff --git a/tools/cli/README b/tools/cli/README new file mode 100644 index 00000000000..f8bfebea4ed --- /dev/null +++ b/tools/cli/README @@ -0,0 +1 @@ +Moved to https://git-wip-us.apache.org/repos/asf?p=cloudstack-cloudmonkey.git diff --git a/tools/cli/cloudmonkey/__init__.py b/tools/cli/cloudmonkey/__init__.py deleted file mode 100644 index cf689e79480..00000000000 --- a/tools/cli/cloudmonkey/__init__.py +++ /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. - -try: - from config import __version__, __description__ - from config import __maintainer__, __maintaineremail__ - from config import __project__, __projecturl__, __projectemail__ -except ImportError, e: - print e diff --git a/tools/cli/cloudmonkey/cachemaker.py b/tools/cli/cloudmonkey/cachemaker.py deleted file mode 100644 index 47749e5ae74..00000000000 --- a/tools/cli/cloudmonkey/cachemaker.py +++ /dev/null @@ -1,181 +0,0 @@ -# -*- coding: utf-8 -*- -# 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. - -try: - import json - import os - import types - - from config import config_fields -except ImportError, e: - import sys - print "ImportError", e - sys.exit(1) - - -def getvalue(dictionary, key): - if key in dictionary: - return dictionary[key] - else: - return None - - -def splitcsvstring(string): - if string is not None: - return filter(lambda x: x.strip() != '', string.split(',')) - else: - return [] - - -def splitverbsubject(string): - idx = 0 - for char in string: - if char.islower(): - idx += 1 - else: - break - return string[:idx].lower(), string[idx:].lower() - - -def savecache(apicache, json_file): - """ - Saves apicache dictionary as json_file, returns dictionary as indented str - """ - if apicache is None or apicache is {}: - return "" - apicachestr = json.dumps(apicache, indent=2) - with open(json_file, 'w') as cache_file: - cache_file.write(apicachestr) - return apicachestr - - -def loadcache(json_file): - """ - Loads json file as dictionary, feeds it to monkeycache and spits result - """ - f = open(json_file, 'r') - data = f.read() - f.close() - try: - apicache = json.loads(data) - except ValueError, e: - print "Error processing json:", json_file, e - return {} - return apicache - - -def monkeycache(apis): - """ - Feed this a dictionary of api bananas, it spits out processed cache - """ - if isinstance(type(apis), types.NoneType) or apis is None: - return {} - - responsekey = filter(lambda x: 'response' in x, apis.keys()) - - if len(responsekey) == 0: - print "[monkeycache] Invalid dictionary, has no response" - return None - if len(responsekey) != 1: - print "[monkeycache] Multiple responsekeys, chosing first one" - - responsekey = responsekey[0] - verbs = set() - cache = {} - cache['count'] = getvalue(apis[responsekey], 'count') - cache['asyncapis'] = [] - - apilist = getvalue(apis[responsekey], 'api') - if apilist is None: - print "[monkeycache] Server response issue, no apis found" - - for api in apilist: - name = getvalue(api, 'name') - verb, subject = splitverbsubject(name) - - apidict = {} - apidict['name'] = name - apidict['description'] = getvalue(api, 'description') - apidict['isasync'] = getvalue(api, 'isasync') - if apidict['isasync']: - cache['asyncapis'].append(name) - apidict['related'] = splitcsvstring(getvalue(api, 'related')) - - required = [] - apiparams = [] - for param in getvalue(api, 'params'): - apiparam = {} - apiparam['name'] = getvalue(param, 'name') - apiparam['description'] = getvalue(param, 'description') - apiparam['required'] = (getvalue(param, 'required') is True) - apiparam['length'] = int(getvalue(param, 'length')) - apiparam['type'] = getvalue(param, 'type') - apiparam['related'] = splitcsvstring(getvalue(param, 'related')) - if apiparam['required']: - required.append(apiparam['name']) - apiparams.append(apiparam) - - apidict['requiredparams'] = required - apidict['params'] = apiparams - if verb not in cache: - cache[verb] = {} - cache[verb][subject] = apidict - verbs.add(verb) - - cache['verbs'] = list(verbs) - return cache - - -def main(json_file): - """ - cachemaker.py creates a precache datastore of all available apis of - CloudStack and dumps the precache dictionary in an - importable python module. This way we cheat on the runtime overhead of - completing commands and help docs. This reduces the overall search and - cache_miss (computation) complexity from O(n) to O(1) for any valid cmd. - """ - f = open("precache.py", "w") - f.write("""# -*- coding: utf-8 -*- -# Auto-generated code by cachemaker.py -# 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.""") - f.write("\napicache = %s" % loadcache(json_file)) - f.close() - -if __name__ == "__main__": - cache_file = config_fields['core']['cache_file'] - print "[cachemaker] Pre-caching using user's cloudmonkey cache", cache_file - if os.path.exists(cache_file): - main(cache_file) - else: - print "[cachemaker] Unable to cache apis, file not found", cache_file - print "[cachemaker] Run cloudmonkey sync to generate cache" diff --git a/tools/cli/cloudmonkey/cloudmonkey.py b/tools/cli/cloudmonkey/cloudmonkey.py deleted file mode 100644 index 13f54ada751..00000000000 --- a/tools/cli/cloudmonkey/cloudmonkey.py +++ /dev/null @@ -1,538 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# 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. - -try: - import atexit - import cmd - import json - import logging - import os - import pdb - import shlex - import sys - import types - import copy - - from cachemaker import loadcache, savecache, monkeycache, splitverbsubject - from config import __version__, __description__, __projecturl__ - from config import read_config, write_config, config_file - from optparse import OptionParser - from prettytable import PrettyTable - from printer import monkeyprint - from requester import monkeyrequest -except ImportError, e: - print("Import error in %s : %s" % (__name__, e)) - import sys - sys.exit() - -try: - from precache import apicache -except ImportError: - apicache = {'count': 0, 'verbs': [], 'asyncapis': []} - -try: - import readline -except ImportError, e: - print("Module readline not found, autocompletions will fail", e) -else: - import rlcompleter - if 'libedit' in readline.__doc__: - readline.parse_and_bind("bind ^I rl_complete") - else: - readline.parse_and_bind("tab: complete") - -log_fmt = '%(asctime)s - %(filename)s:%(lineno)s - [%(levelname)s] %(message)s' -logger = logging.getLogger(__name__) - - -class CloudMonkeyShell(cmd.Cmd, object): - intro = ("â Apache CloudStack đźµ cloudmonkey " + __version__ + - ". Type help or ? to list commands.\n") - ruler = "=" - config_options = [] - verbs = [] - - def __init__(self, pname, cfile): - self.program_name = pname - self.config_file = cfile - self.config_options = read_config(self.get_attr, self.set_attr, - self.config_file) - self.loadcache() - self.prompt = self.prompt.strip() + " " # Cosmetic fix for prompt - - logging.basicConfig(filename=self.log_file, - level=logging.DEBUG, format=log_fmt) - logger.debug("Loaded config fields:\n%s" % map(lambda x: "%s=%s" % - (x, getattr(self, x)), - self.config_options)) - cmd.Cmd.__init__(self) - - try: - if os.path.exists(self.history_file): - readline.read_history_file(self.history_file) - except IOError, e: - logger.debug("Error: Unable to read history. " + str(e)) - atexit.register(readline.write_history_file, self.history_file) - - def get_attr(self, field): - return getattr(self, field) - - def set_attr(self, field, value): - return setattr(self, field, value) - - def emptyline(self): - pass - - def cmdloop(self, intro=None): - print(self.intro) - while True: - try: - super(CloudMonkeyShell, self).cmdloop(intro="") - self.postloop() - except KeyboardInterrupt: - print("^C") - - def loadcache(self): - if os.path.exists(self.cache_file): - self.apicache = loadcache(self.cache_file) - else: - self.apicache = apicache - if 'verbs' in self.apicache: - self.verbs = self.apicache['verbs'] - - for verb in self.verbs: - def add_grammar(verb): - def grammar_closure(self, args): - if self.pipe_runner("%s %s" % (verb, args)): - return - if ' --help' in args or ' -h' in args: - self.do_help("%s %s" % (verb, args)) - return - try: - args_partition = args.partition(" ") - cmd = self.apicache[verb][args_partition[0]]['name'] - args = args_partition[2] - except KeyError, e: - self.monkeyprint("Error: invalid %s api arg" % verb, e) - return - self.default("%s %s" % (cmd, args)) - return grammar_closure - - grammar_handler = add_grammar(verb) - grammar_handler.__doc__ = "%ss resources" % verb.capitalize() - grammar_handler.__name__ = 'do_' + str(verb) - setattr(self.__class__, grammar_handler.__name__, grammar_handler) - - def monkeyprint(self, *args): - output = "" - try: - for arg in args: - if isinstance(type(arg), types.NoneType): - continue - output += str(arg) - except Exception, e: - print(e) - - if self.color == 'true': - monkeyprint(output) - else: - print(output) - - def print_result(self, result, result_filter=None): - if result is None or len(result) == 0: - return - - def printer_helper(printer, toprow): - if printer: - self.monkeyprint(printer) - return PrettyTable(toprow) - - def print_result_json(result, result_filter=None): - tfilter = {} # temp var to hold a dict of the filters - tresult = copy.deepcopy(result) # dupe the result to filter - if result_filter is not None: - for res in result_filter: - tfilter[res] = 1 - myresults = {} - for okey, oval in result.iteritems(): - if isinstance(oval, dict): - for tkey in x: - if tkey not in tfilter: - try: - del(tresult[okey][x][tkey]) - except: - pass - elif isinstance(oval, list): - for x in range(len(oval)): - if isinstance(oval[x], dict): - for tkey in oval[x]: - if tkey not in tfilter: - try: - del(tresult[okey][x][tkey]) - except: - pass - else: - try: - del(tresult[okey][x]) - except: - pass - print json.dumps(tresult, - sort_keys=True, - indent=2, - separators=(',', ': ')) - - def print_result_tabular(result, result_filter=None): - toprow = None - printer = None - for node in result: - if toprow != node.keys(): - if result_filter is not None and len(result_filter) != 0: - commonkeys = filter(lambda x: x in node.keys(), - result_filter) - if commonkeys != toprow: - toprow = commonkeys - printer = printer_helper(printer, toprow) - else: - toprow = node.keys() - printer = printer_helper(printer, toprow) - row = map(lambda x: node[x], toprow) - if printer and row: - printer.add_row(row) - if printer: - self.monkeyprint(printer) - - def print_result_as_dict(result, result_filter=None): - if self.display == "json": - print_result_json(result, result_filter) - return - - for key in sorted(result.keys(), key=lambda x: - x not in ['id', 'count', 'name'] and x): - if not (isinstance(result[key], list) or - isinstance(result[key], dict)): - self.monkeyprint("%s = %s" % (key, result[key])) - else: - self.monkeyprint(key + ":") - self.print_result(result[key], result_filter) - - def print_result_as_list(result, result_filter=None): - for node in result: - if isinstance(node, dict) and self.display == 'table': - print_result_tabular(result, result_filter) - break - self.print_result(node) - if len(result) > 1: - self.monkeyprint(self.ruler * 80) - - if isinstance(result, dict): - print_result_as_dict(result, result_filter) - elif isinstance(result, list): - print_result_as_list(result, result_filter) - elif isinstance(result, str): - print result - elif not (str(result) is None): - self.monkeyprint(result) - - def make_request(self, command, args={}, isasync=False): - response, error = monkeyrequest(command, args, isasync, - self.asyncblock, logger, - self.host, self.port, - self.apikey, self.secretkey, - self.timeout, self.protocol, self.path) - if error is not None: - self.monkeyprint(error) - return response - - def default(self, args): - if self.pipe_runner(args): - return - - apiname = args.partition(' ')[0] - verb, subject = splitverbsubject(apiname) - - lexp = shlex.shlex(args.strip()) - lexp.whitespace = " " - lexp.whitespace_split = True - lexp.posix = True - args = [] - while True: - next_val = lexp.next() - if next_val is None: - break - args.append(next_val.replace('\x00', '')) - - args_dict = dict(map(lambda x: [x.partition("=")[0], - x.partition("=")[2]], - args[1:])[x] for x in range(len(args) - 1)) - field_filter = None - if 'filter' in args_dict: - field_filter = filter(lambda x: x is not '', - map(lambda x: x.strip(), - args_dict.pop('filter').split(','))) - - missing = [] - if verb in self.apicache and subject in self.apicache[verb]: - missing = filter(lambda x: x not in args_dict.keys(), - self.apicache[verb][subject]['requiredparams']) - - if len(missing) > 0: - self.monkeyprint("Missing arguments: ", ' '.join(missing)) - return - - isasync = False - if 'asyncapis' in self.apicache: - isasync = apiname in self.apicache['asyncapis'] - - result = self.make_request(apiname, args_dict, isasync) - - if result is None: - return - try: - responsekeys = filter(lambda x: 'response' in x, result.keys()) - for responsekey in responsekeys: - self.print_result(result[responsekey], field_filter) - print - except Exception as e: - self.monkeyprint("đź™ Error on parsing and printing", e) - - def completedefault(self, text, line, begidx, endidx): - partitions = line.partition(" ") - verb = partitions[0].strip() - rline = partitions[2].lstrip().partition(" ") - subject = rline[0] - separator = rline[1] - params = rline[2].lstrip() - - if verb not in self.verbs: - return [] - - autocompletions = [] - search_string = "" - - if separator != " ": # Complete verb subjects - autocompletions = self.apicache[verb].keys() - search_string = subject - else: # Complete subject params - autocompletions = map(lambda x: x + "=", - map(lambda x: x['name'], - self.apicache[verb][subject]['params'])) - search_string = text - if self.paramcompletion == 'true': - param = line.split(" ")[-1] - idx = param.find("=") - value = param[idx + 1:] - param = param[:idx] - if len(value) < 36 and idx != -1: - params = self.apicache[verb][subject]['params'] - related = filter(lambda x: x['name'] == param, - params)[0]['related'] - api = min(filter(lambda x: 'list' in x, related), key=len) - response = self.make_request(api, args={'listall': 'true'}) - responsekey = filter(lambda x: 'response' in x, - response.keys())[0] - result = response[responsekey] - uuids = [] - for key in result.keys(): - if isinstance(result[key], list): - for element in result[key]: - if 'id' in element.keys(): - uuids.append(element['id']) - autocompletions = uuids - search_string = value - - if subject != "" and (self.display == "table" or - self.display == "json"): - autocompletions.append("filter=") - return [s for s in autocompletions if s.startswith(search_string)] - - def do_sync(self, args): - """ - Asks cloudmonkey to discovery and sync apis available on user specified - CloudStack host server which has the API discovery plugin, on failure - it rollbacks last datastore or api precached datastore. - """ - response = self.make_request("listApis") - if response is None: - monkeyprint("Failed to sync apis, please check your config?") - monkeyprint("Note: `sync` requires api discovery service enabled" + - " on the CloudStack management server") - return - self.apicache = monkeycache(response) - savecache(self.apicache, self.cache_file) - monkeyprint("%s APIs discovered and cached" % self.apicache["count"]) - self.loadcache() - - def do_api(self, args): - """ - Make raw api calls. Syntax: api =. - - Example: - api listAccount listall=true - """ - if len(args) > 0: - return self.default(args) - else: - self.monkeyprint("Please use a valid syntax") - - def do_set(self, args): - """ - Set config for cloudmonkey. For example, options can be: - host, port, apikey, secretkey, log_file, history_file - You may also edit your ~/.cloudmonkey_config instead of using set. - - Example: - set host 192.168.56.2 - set prompt đźµ cloudmonkey> - set log_file /var/log/cloudmonkey.log - """ - args = args.strip().partition(" ") - key, value = (args[0], args[2]) - setattr(self, key, value) # keys and attributes should have same names - self.prompt = self.prompt.strip() + " " # prompt fix - write_config(self.get_attr, self.config_file) - - def complete_set(self, text, line, begidx, endidx): - mline = line.partition(" ")[2] - offs = len(mline) - len(text) - return [s[offs:] for s in self.config_options - if s.startswith(mline)] - - def pipe_runner(self, args): - if args.find(' |') > -1: - pname = self.program_name - if '.py' in pname: - pname = "python " + pname - self.do_shell("%s %s" % (pname, args)) - return True - return False - - def do_shell(self, args): - """ - Execute shell commands using shell or ! - - Example: - !ls - shell ls - !for((i=0; i<10; i++)); do cloudmonkey create user account=admin \ - email=test@test.tt firstname=user$i lastname=user$i \ - password=password username=user$i; done - """ - os.system(args) - - def do_help(self, args): - """ - Show help docs for various topics - - Example: - help list - help list users - ?list - ?list users - """ - fields = args.partition(" ") - if fields[2] == "": - cmd.Cmd.do_help(self, args) - else: - verb = fields[0] - subject = fields[2].partition(" ")[0] - if subject in self.apicache[verb]: - api = self.apicache[verb][subject] - helpdoc = "(%s) %s" % (api['name'], api['description']) - if api['isasync']: - helpdoc += "\nThis API is asynchronous." - required = api['requiredparams'] - if len(required) > 0: - helpdoc += "\nRequired params are %s" % ' '.join(required) - helpdoc += "\nParameters\n" + "=" * 10 - for param in api['params']: - helpdoc += "\n%s = (%s) %s" % (param['name'], - param['type'], param['description']) - self.monkeyprint(helpdoc) - else: - self.monkeyprint("Error: no such api (%s) on %s" % - (subject, verb)) - - def complete_help(self, text, line, begidx, endidx): - fields = line.partition(" ") - subfields = fields[2].partition(" ") - - if subfields[1] != " ": - return cmd.Cmd.complete_help(self, text, line, begidx, endidx) - else: - line = fields[2] - text = subfields[2] - return self.completedefault(text, line, begidx, endidx) - - def do_EOF(self, args): - """ - Quit on Ctrl+d or EOF - """ - sys.exit() - - def do_exit(self, args): - """ - Quit CloudMonkey CLI - """ - return self.do_quit(args) - - def do_quit(self, args): - """ - Quit CloudMonkey CLI - """ - self.monkeyprint("Bye!") - return self.do_EOF(args) - - -class MonkeyParser(OptionParser): - def format_help(self, formatter=None): - if formatter is None: - formatter = self.formatter - result = [] - if self.usage: - result.append("Usage: cloudmonkey [options] [cmds] [params]\n\n") - if self.description: - result.append(self.format_description(formatter) + "\n") - result.append(self.format_option_help(formatter)) - result.append("\nTry cloudmonkey [help|?]\n") - return "".join(result) - - -def main(): - parser = MonkeyParser() - parser.add_option("-c", "--config-file", - dest="cfile", default=config_file, - help="config file for cloudmonkey", metavar="FILE") - parser.add_option("-v", "--version", - action="store_true", dest="version", default=False, - help="prints cloudmonkey version information") - - (options, args) = parser.parse_args() - if options.version: - print "cloudmonkey", __version__ - print __description__, "(%s)" % __projecturl__ - sys.exit(0) - - shell = CloudMonkeyShell(sys.argv[0], options.cfile) - if len(args) > 0: - shell.onecmd(' '.join(args)) - else: - shell.cmdloop() - -if __name__ == "__main__": - main() diff --git a/tools/cli/cloudmonkey/config.py b/tools/cli/cloudmonkey/config.py deleted file mode 100644 index 36f7e77ed82..00000000000 --- a/tools/cli/cloudmonkey/config.py +++ /dev/null @@ -1,122 +0,0 @@ -# -*- coding: utf-8 -*- -# 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. - -# Use following rules for versioning: -# - -__version__ = "4.2.0-0" -__description__ = "Command Line Interface for Apache CloudStack" -__maintainer__ = "Rohit Yadav" -__maintaineremail__ = "bhaisaab@apache.org" -__project__ = "The Apache CloudStack Team" -__projectemail__ = "dev@cloudstack.apache.org" -__projecturl__ = "http://cloudstack.apache.org" - -try: - import os - import sys - - from ConfigParser import ConfigParser, SafeConfigParser - from os.path import expanduser -except ImportError, e: - print "ImportError", e - -param_type = ['boolean', 'date', 'float', 'integer', 'short', 'list', - 'long', 'object', 'map', 'string', 'tzdate', 'uuid'] - -iterable_type = ['set', 'list', 'object'] - -config_dir = expanduser('~/.cloudmonkey') -config_file = expanduser(config_dir + '/config') - -# cloudmonkey config fields -config_fields = {'core': {}, 'server': {}, 'user': {}, 'ui': {}} - -# core -config_fields['core']['asyncblock'] = 'true' -config_fields['core']['paramcompletion'] = 'false' -config_fields['core']['cache_file'] = expanduser(config_dir + '/cache') -config_fields['core']['history_file'] = expanduser(config_dir + '/history') -config_fields['core']['log_file'] = expanduser(config_dir + '/log') - -# ui -config_fields['ui']['color'] = 'true' -config_fields['ui']['prompt'] = '> ' -config_fields['ui']['display'] = 'default' - -# server -config_fields['server']['host'] = 'localhost' -config_fields['server']['path'] = '/client/api' -config_fields['server']['port'] = '8080' -config_fields['server']['protocol'] = 'http' -config_fields['server']['timeout'] = '3600' - -# user -config_fields['user']['apikey'] = '' -config_fields['user']['secretkey'] = '' - - -def write_config(get_attr, config_file, first_time=False): - global config_fields - config = ConfigParser() - for section in config_fields.keys(): - config.add_section(section) - for key in config_fields[section].keys(): - if first_time: - config.set(section, key, config_fields[section][key]) - else: - config.set(section, key, get_attr(key)) - with open(config_file, 'w') as cfg: - config.write(cfg) - return config - - -def read_config(get_attr, set_attr, config_file): - global config_fields, config_dir - if not os.path.exists(config_dir): - os.makedirs(config_dir) - - config_options = reduce(lambda x, y: x + y, map(lambda x: - config_fields[x].keys(), config_fields.keys())) - - if os.path.exists(config_file): - config = ConfigParser() - try: - with open(config_file, 'r') as cfg: - config.readfp(cfg) - except IOError, e: - print "Error: config_file not found", e - else: - config = write_config(get_attr, config_file, True) - print "Welcome! Using `set` configure the necessary settings:" - print " ".join(sorted(config_options)) - print "Config file:", config_file - print "After setting up, run the `sync` command to sync apis\n" - - missing_keys = [] - for section in config_fields.keys(): - for key in config_fields[section].keys(): - try: - set_attr(key, config.get(section, key)) - except Exception: - missing_keys.append(key) - - if len(missing_keys) > 0: - print "Please fix `%s` in %s" % (', '.join(missing_keys), config_file) - sys.exit() - - return config_options diff --git a/tools/cli/cloudmonkey/printer.py b/tools/cli/cloudmonkey/printer.py deleted file mode 100644 index 925e765f251..00000000000 --- a/tools/cli/cloudmonkey/printer.py +++ /dev/null @@ -1,120 +0,0 @@ -# -*- coding: utf-8 -*- -# 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. - -try: - from pygments import highlight - from pygments.console import ansiformat - from pygments.formatter import Formatter - from pygments.formatters import Terminal256Formatter - from pygments.lexer import bygroups, include, RegexLexer - from pygments.token import * - - import sys -except ImportError, e: - print e - - -MONKEY_COLORS = { - Token: '', - Whitespace: 'reset', - Text: 'reset', - - Name: 'green', - Operator: 'teal', - Operator.Word: 'lightgray', - String: 'purple', - - Keyword: '_red_', - Error: 'red', - Literal: 'yellow', - Number: 'blue', -} - - -def get_colorscheme(): - return MONKEY_COLORS - - -class MonkeyLexer(RegexLexer): - keywords = ['[a-z]*id', '^[a-z A-Z]*:'] - attributes = ['[Tt]rue', '[Ff]alse'] - params = ['[a-z]*[Nn]ame', 'type', '[Ss]tate'] - - uuid_rgx = r'[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}' - date_rgx = r'[0-9]{4}-[0-9]{2}-[0-9]{2}T[0-9:]{8}-[0-9]{4}' - - def makelistre(lis): - return r'(' + r'|'.join(lis) + r')' - - tokens = { - 'root': [ - (r' ', Whitespace), - (date_rgx, Number), - (uuid_rgx, Literal), - (r'(?:\b\d+\b(?:-\b\d+|%)?)', Number), - (r'^[-=]*\n', Operator.Word), - (r'Error', Error), - (makelistre(attributes), Literal), - (makelistre(params) + r'( = )(.*)', bygroups(Name, Operator, - String)), - (makelistre(keywords), Keyword), - (makelistre(params), Name), - (r'(^[a-zA-Z]* )(=)', bygroups(Name, Operator)), - (r'\S+', Text), - ] - } - - def analyse_text(text): - npos = text.find('\n') - if npos < 3: - return False - return text[0] == '[' and text[npos - 1] == ']' - - -class MonkeyFormatter(Formatter): - def __init__(self, **options): - Formatter.__init__(self, **options) - self.colorscheme = get_colorscheme() - - def format(self, tokensource, outfile): - return Formatter.format(self, tokensource, outfile) - - def format_unencoded(self, tokensource, outfile): - for ttype, value in tokensource: - color = self.colorscheme.get(ttype) - while color is None: - ttype = ttype[:-1] - color = self.colorscheme.get(ttype) - if color: - spl = value.split('\n') - for line in spl[:-1]: - if line: - outfile.write(ansiformat(color, line)) - outfile.write('\n') - if spl[-1]: - outfile.write(ansiformat(color, spl[-1])) - else: - outfile.write(value) - - -def monkeyprint(text): - fmter = MonkeyFormatter() - lexer = MonkeyLexer() - lexer.encoding = 'utf-8' - fmter.encoding = 'utf-8' - highlight(text, lexer, fmter, sys.stdout) diff --git a/tools/cli/cloudmonkey/requester.py b/tools/cli/cloudmonkey/requester.py deleted file mode 100644 index b06e1fc99e3..00000000000 --- a/tools/cli/cloudmonkey/requester.py +++ /dev/null @@ -1,165 +0,0 @@ -#!/usr/bin/python -# -*- coding: utf-8 -*- -# 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. - -try: - import base64 - import hashlib - import hmac - import httplib - import json - import os - import pdb - import re - import shlex - import sys - import time - import types - import urllib - import urllib2 - from urllib2 import urlopen, HTTPError, URLError - -except ImportError, e: - print "Import error in %s : %s" % (__name__, e) - import sys - sys.exit() - - -def logger_debug(logger, message): - if logger is not None: - logger.debug(message) - - -def make_request(command, args, logger, host, port, - apikey, secretkey, protocol, path): - response = None - error = None - - if protocol != 'http' and protocol != 'https': - error = "Protocol must be 'http' or 'https'" - return None, error - - if args is None: - args = {} - - args["command"] = command - args["apiKey"] = apikey - args["response"] = "json" - request = zip(args.keys(), args.values()) - request.sort(key=lambda x: x[0].lower()) - - request_url = "&".join(["=".join([r[0], urllib.quote_plus(str(r[1]))]) - for r in request]) - hashStr = "&".join(["=".join([r[0].lower(), - str.lower(urllib.quote_plus(str(r[1]))).replace("+", - "%20")]) for r in request]) - - sig = urllib.quote_plus(base64.encodestring(hmac.new(secretkey, hashStr, - hashlib.sha1).digest()).strip()) - request_url += "&signature=%s" % sig - request_url = "%s://%s:%s%s?%s" % (protocol, host, port, path, request_url) - - try: - logger_debug(logger, "Request sent: %s" % request_url) - connection = urllib2.urlopen(request_url) - response = connection.read() - except HTTPError, e: - error = "%s: %s" % (e.msg, e.info().getheader('X-Description')) - except URLError, e: - error = e.reason - - logger_debug(logger, "Response received: %s" % response) - if error is not None: - logger_debug(logger, "Error: %s" % (error)) - return response, error - - return response, error - - -def monkeyrequest(command, args, isasync, asyncblock, logger, host, port, - apikey, secretkey, timeout, protocol, path): - response = None - error = None - logger_debug(logger, "======== START Request ========") - logger_debug(logger, "Requesting command=%s, args=%s" % (command, args)) - response, error = make_request(command, args, logger, host, port, - apikey, secretkey, protocol, path) - logger_debug(logger, "======== END Request ========\n") - - if error is not None: - return response, error - - def process_json(response): - try: - response = json.loads(str(response)) - except ValueError, e: - error = "Error processing json response, %s" % e - logger_debug(logger, "Error processing json: %s" % e) - - return response - - response = process_json(response) - if response is None: - return response, error - - isasync = isasync and (asyncblock == "true") - responsekey = filter(lambda x: 'response' in x, response.keys())[0] - - if isasync and 'jobid' in response[responsekey]: - jobid = response[responsekey]['jobid'] - command = "queryAsyncJobResult" - request = {'jobid': jobid} - timeout = int(timeout) - pollperiod = 2 - progress = 1 - while timeout > 0: - print '\r' + '.' * progress, - sys.stdout.flush() - time.sleep(pollperiod) - timeout = timeout - pollperiod - progress += 1 - logger_debug(logger, "Job %s to timeout in %ds" % (jobid, timeout)) - response, error = make_request(command, request, logger, - host, port, apikey, secretkey, - protocol, path) - if error is not None: - return response, error - - response = process_json(response) - responsekeys = filter(lambda x: 'response' in x, response.keys()) - - if len(responsekeys) < 1: - continue - - result = response[responsekeys[0]] - jobstatus = result['jobstatus'] - if jobstatus == 2: - jobresult = result["jobresult"] - error = "\rAsync job %s failed\nError %s, %s" % (jobid, - jobresult["errorcode"], jobresult["errortext"]) - return response, error - elif jobstatus == 1: - print "\r" + " " * progress, - return response, error - else: - logger_debug(logger, "We should not arrive here!") - sys.stdout.flush() - - error = "Error: Async query timeout occurred for jobid %s" % jobid - - return response, error diff --git a/tools/cli/pom.xml b/tools/cli/pom.xml deleted file mode 100644 index b4820cd1e36..00000000000 --- a/tools/cli/pom.xml +++ /dev/null @@ -1,73 +0,0 @@ - - - 4.0.0 - cloud-cli - Apache CloudStack cloudmonkey cli - pom - - org.apache.cloudstack - cloud-tools - 4.2.0-SNAPSHOT - ../pom.xml - - - - install - - - org.codehaus.mojo - exec-maven-plugin - 1.2.1 - - - cachemaker - compile - - exec - - - ${basedir}/cloudmonkey - python - - cachemaker.py - - - - - package - compile - - exec - - - ${basedir} - python - - setup.py - sdist - - - - - - - - diff --git a/tools/cli/setup.py b/tools/cli/setup.py deleted file mode 100644 index 4c7b2978b2f..00000000000 --- a/tools/cli/setup.py +++ /dev/null @@ -1,68 +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. - -try: - from setuptools import setup, find_packages -except ImportError: - from distribute_setup import use_setuptools - use_setuptools() - from setuptools import setup, find_packages - -from cloudmonkey import __version__, __description__ -from cloudmonkey import __maintainer__, __maintaineremail__ -from cloudmonkey import __project__, __projecturl__, __projectemail__ - -try: - import readline -except ImportError: - requires.append('readline') - -setup( - name = 'cloudmonkey', - version = __version__, - author = __project__, - author_email = __projectemail__, - maintainer = __maintainer__, - maintainer_email = __maintaineremail__, - url = __projecturl__, - description = __description__, - long_description = "cloudmonkey is a CLI for Apache CloudStack", - platforms = ("Any",), - license = 'ASL 2.0', - packages = find_packages(), - install_requires = [ - 'Pygments>=1.5', - 'prettytable>=0.6', - ], - include_package_data = True, - zip_safe = False, - classifiers = [ - "Development Status :: 5 - Production/Stable", - "Environment :: Console", - "Intended Audience :: Developers", - "Intended Audience :: End Users/Desktop", - "Operating System :: OS Independent", - "Programming Language :: Python", - "Topic :: Software Development :: Testing", - "Topic :: Software Development :: Interpreters", - "Topic :: Utilities", - ], - entry_points=""" - [console_scripts] - cloudmonkey = cloudmonkey.cloudmonkey:main - """, -) diff --git a/tools/pom.xml b/tools/pom.xml index 09961bb28d8..49cf13504b1 100644 --- a/tools/pom.xml +++ b/tools/pom.xml @@ -37,7 +37,6 @@ apidoc marvin - cli devcloud devcloud-kvm From 57d96308c1a32b6bc5e1c3d21f15d10e4d573fa1 Mon Sep 17 00:00:00 2001 From: Sateesh Chodapuneedi Date: Mon, 29 Jul 2013 03:04:23 +0530 Subject: [PATCH 095/907] CLOUDSTACK-3468 Failed to Deploy Instances with multiple VMWARE clusters when DVS is enabled at the Zone level Fixing cluster level override of zone level specified vSwitch settings. Signed-off-by: Sateesh Chodapuneedi --- .../hypervisor/vmware/resource/VmwareResource.java | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java index e9e5627dd76..260cfe020fb 100755 --- a/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java +++ b/plugins/hypervisors/vmware/src/com/cloud/hypervisor/vmware/resource/VmwareResource.java @@ -3249,6 +3249,12 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa // return Pair private Pair getTargetSwitch(NicTO nicTo) throws Exception { + if (nicTo.getType() == Networks.TrafficType.Guest) { + return new Pair(_guestTrafficInfo.getVirtualSwitchName(), Vlan.UNTAGGED); + } else if (nicTo.getType() == Networks.TrafficType.Public) { + return new Pair(_publicTrafficInfo.getVirtualSwitchName(), Vlan.UNTAGGED); + } + if(nicTo.getName() != null && !nicTo.getName().isEmpty()) { String[] tokens = nicTo.getName().split(","); // Format of network traffic label is ,, @@ -3265,12 +3271,8 @@ public class VmwareResource implements StoragePoolResource, ServerResource, Vmwa } } - if (nicTo.getType() == Networks.TrafficType.Guest) { - return new Pair(_guestTrafficInfo.getVirtualSwitchName(), Vlan.UNTAGGED); - } else if (nicTo.getType() == Networks.TrafficType.Control || nicTo.getType() == Networks.TrafficType.Management) { + if (nicTo.getType() == Networks.TrafficType.Control || nicTo.getType() == Networks.TrafficType.Management) { return new Pair(_privateNetworkVSwitchName, Vlan.UNTAGGED); - } else if (nicTo.getType() == Networks.TrafficType.Public) { - return new Pair(_publicTrafficInfo.getVirtualSwitchName(), Vlan.UNTAGGED); } else if (nicTo.getType() == Networks.TrafficType.Storage) { return new Pair(_privateNetworkVSwitchName, Vlan.UNTAGGED); } else if (nicTo.getType() == Networks.TrafficType.Vpn) { From 790a02f936c6ff8dc974c8c9234cc1251460ab09 Mon Sep 17 00:00:00 2001 From: Prachi Damle Date: Sun, 28 Jul 2013 22:44:00 -0700 Subject: [PATCH 096/907] CLOUDSTACK-3343 UI/API should also return the mode(Strict/Preferred) when listing the ServiceOffering that uses ImplicitDedicationPlanner Changes: - API is fixed to return the service_offering details Conflicts: api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java --- .../api/response/ServiceOfferingResponse.java | 12 ++++++++++++ server/src/com/cloud/api/ApiDBUtils.java | 9 +++++++++ .../api/query/dao/ServiceOfferingJoinDaoImpl.java | 4 ++++ 3 files changed, 25 insertions(+) diff --git a/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java b/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java index 41a9b795923..5c5b369ec25 100644 --- a/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java +++ b/api/src/org/apache/cloudstack/api/response/ServiceOfferingResponse.java @@ -18,8 +18,12 @@ package org.apache.cloudstack.api.response; import java.util.Date; + import com.google.gson.annotations.SerializedName; +import java.util.Map; + + import org.apache.cloudstack.api.ApiConstants; import org.apache.cloudstack.api.BaseResponse; import org.apache.cloudstack.api.EntityReference; @@ -101,6 +105,10 @@ public class ServiceOfferingResponse extends BaseResponse { @SerializedName(ApiConstants.DEPLOYMENT_PLANNER) @Param(description="deployment strategy used to deploy VM.") private String deploymentPlanner; + @SerializedName(ApiConstants.SERVICE_OFFERING_DETAILS) + @Param(description = "additional key/value details tied with this service offering", since = "4.2.0") + private Map details; + public String getId() { return id; } @@ -275,4 +283,8 @@ public class ServiceOfferingResponse extends BaseResponse { public void setIopsWriteRate(Long iopsWriteRate) { this.iopsWriteRate = iopsWriteRate; } + + public void setDetails(Map details) { + this.details = details; + } } diff --git a/server/src/com/cloud/api/ApiDBUtils.java b/server/src/com/cloud/api/ApiDBUtils.java index 21fcb0c7c45..5be8b157c08 100755 --- a/server/src/com/cloud/api/ApiDBUtils.java +++ b/server/src/com/cloud/api/ApiDBUtils.java @@ -223,6 +223,7 @@ import com.cloud.server.StatsCollector; import com.cloud.server.TaggedResourceService; import com.cloud.service.ServiceOfferingVO; import com.cloud.service.dao.ServiceOfferingDao; +import com.cloud.service.dao.ServiceOfferingDetailsDao; import com.cloud.storage.DiskOfferingVO; import com.cloud.storage.GuestOS; import com.cloud.storage.GuestOSCategoryVO; @@ -404,6 +405,7 @@ public class ApiDBUtils { static AffinityGroupJoinDao _affinityGroupJoinDao; static GlobalLoadBalancingRulesService _gslbService; static NetworkACLDao _networkACLDao; + static ServiceOfferingDetailsDao _serviceOfferingDetailsDao; @Inject private ManagementServer ms; @Inject public AsyncJobManager asyncMgr; @@ -513,6 +515,7 @@ public class ApiDBUtils { @Inject private AffinityGroupJoinDao affinityGroupJoinDao; @Inject private GlobalLoadBalancingRulesService gslbService; @Inject private NetworkACLDao networkACLDao; + @Inject private ServiceOfferingDetailsDao serviceOfferingDetailsDao; @PostConstruct void init() { @@ -622,6 +625,7 @@ public class ApiDBUtils { // Note: stats collector should already have been initialized by this time, otherwise a null instance is returned _statsCollector = StatsCollector.getInstance(); _networkACLDao = networkACLDao; + _serviceOfferingDetailsDao = serviceOfferingDetailsDao; } // /////////////////////////////////////////////////////////// @@ -1684,4 +1688,9 @@ public class ApiDBUtils { String providerDnsName = _configDao.getValue(Config.CloudDnsName.key()); return providerDnsName; } + + public static Map getServiceOfferingDetails(long serviceOfferingId) { + Map details = _serviceOfferingDetailsDao.findDetails(serviceOfferingId); + return details.isEmpty() ? null : details; + } } diff --git a/server/src/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java b/server/src/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java index 6f6e27701fa..945e67b406b 100644 --- a/server/src/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java +++ b/server/src/com/cloud/api/query/dao/ServiceOfferingJoinDaoImpl.java @@ -17,15 +17,18 @@ package com.cloud.api.query.dao; import java.util.List; +import java.util.Map; import javax.ejb.Local; import org.apache.log4j.Logger; +import com.cloud.api.ApiDBUtils; import com.cloud.api.query.vo.ServiceOfferingJoinVO; import org.apache.cloudstack.api.response.ServiceOfferingResponse; import com.cloud.offering.ServiceOffering; +import com.cloud.offering.NetworkOffering.Detail; import com.cloud.utils.db.GenericDaoBase; import com.cloud.utils.db.SearchBuilder; import com.cloud.utils.db.SearchCriteria; @@ -79,6 +82,7 @@ public class ServiceOfferingJoinDaoImpl extends GenericDaoBase Date: Mon, 29 Jul 2013 11:59:59 +0530 Subject: [PATCH 097/907] CLOUDSTACK-3871 XEN - Unable to deploy VM in guest network VLAN with different subnets Signed-off-by: Sheng Yang --- scripts/vm/hypervisor/xenserver/vmops | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/vm/hypervisor/xenserver/vmops b/scripts/vm/hypervisor/xenserver/vmops index 9a0ef44eda4..3b6ff3c97d0 100755 --- a/scripts/vm/hypervisor/xenserver/vmops +++ b/scripts/vm/hypervisor/xenserver/vmops @@ -358,7 +358,7 @@ def setLoadBalancerRule(session, args): @echo def configdnsmasq(session, args): routerip = args['routerip'] - args = args['filepath'] + args = args['args'] target = "root@"+routerip try: util.pread2(['ssh','-p','3922','-q','-o','StrictHostKeyChecking=no','-i','/root/.ssh/id_rsa.cloud',target,'/root/dnsmasq.sh',args]) From bcf239db0816e6688cbfba9dbf8390bc5f09430f Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 12:32:21 +0530 Subject: [PATCH 098/907] CLOUDSTACK-2715: Making MigrateSysteVm response uniform with responses on other systemVm apis. All systemVM apis return SystemVmResponse - rebootSystemVm, stopSystemVm etc. MigrateSystemVm is now made uniform. Signed-off-by: Prasanna Santhanam --- .../admin/systemvm/MigrateSystemVMCmd.java | 27 +++++++++---------- 1 file changed, 12 insertions(+), 15 deletions(-) diff --git a/api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java b/api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java index 7b3436d4557..65acca8dc82 100644 --- a/api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java +++ b/api/src/org/apache/cloudstack/api/command/admin/systemvm/MigrateSystemVMCmd.java @@ -16,19 +16,6 @@ // under the License. package org.apache.cloudstack.api.command.admin.systemvm; -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.HostResponse; -import org.apache.cloudstack.api.response.SystemVmInstanceResponse; -import org.apache.cloudstack.api.response.SystemVmResponse; -import org.apache.cloudstack.context.CallContext; - -import org.apache.log4j.Logger; - import com.cloud.event.EventTypes; import com.cloud.exception.ConcurrentOperationException; import com.cloud.exception.InvalidParameterValueException; @@ -38,8 +25,18 @@ import com.cloud.exception.VirtualMachineMigrationException; import com.cloud.host.Host; import com.cloud.user.Account; import com.cloud.vm.VirtualMachine; +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.HostResponse; +import org.apache.cloudstack.api.response.SystemVmResponse; +import org.apache.cloudstack.context.CallContext; +import org.apache.log4j.Logger; -@APICommand(name = "migrateSystemVm", description="Attempts Migration of a system virtual machine to the host specified.", responseObject=SystemVmInstanceResponse.class) +@APICommand(name = "migrateSystemVm", description="Attempts Migration of a system virtual machine to the host specified.", responseObject=SystemVmResponse.class) public class MigrateSystemVMCmd extends BaseAsyncCmd { public static final Logger s_logger = Logger.getLogger(MigrateSystemVMCmd.class.getName()); @@ -113,7 +110,7 @@ public class MigrateSystemVMCmd extends BaseAsyncCmd { VirtualMachine migratedVm = _userVmService.migrateVirtualMachine(getVirtualMachineId(), destinationHost); if (migratedVm != null) { // return the generic system VM instance response - SystemVmInstanceResponse response = _responseGenerator.createSystemVmInstanceResponse(migratedVm); + SystemVmResponse response = _responseGenerator.createSystemVmResponse(migratedVm); response.setResponseName(getCommandName()); this.setResponseObject(response); } else { From 26d8c668f9eaf4947e5867a88b0adb7b4da03254 Mon Sep 17 00:00:00 2001 From: Sateesh Chodapuneedi Date: Mon, 29 Jul 2013 08:16:58 +0530 Subject: [PATCH 099/907] CLOUDSTACK-3870 [VMware] Management traffic network over a VLAN is not working CLOUDSTACK-3437 In case of multiple physical network setup we see log message "can't get physical network" CloudStack's control network is management network in case of VMware. Processing management VLAN id provided in zone traffic label for management traffic.` Signed-off-by: Sateesh Chodapuneedi --- .../com/cloud/network/NetworkModelImpl.java | 48 ++++++++++++++----- 1 file changed, 36 insertions(+), 12 deletions(-) diff --git a/server/src/com/cloud/network/NetworkModelImpl.java b/server/src/com/cloud/network/NetworkModelImpl.java index d7ca6397183..849884d5d2b 100755 --- a/server/src/com/cloud/network/NetworkModelImpl.java +++ b/server/src/com/cloud/network/NetworkModelImpl.java @@ -1277,7 +1277,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { Long physicalNetworkId = null; if (effectiveTrafficType != TrafficType.Guest) { - physicalNetworkId = getNonGuestNetworkPhysicalNetworkId(network); + physicalNetworkId = getNonGuestNetworkPhysicalNetworkId(network, effectiveTrafficType); } else { NetworkOffering offering = _configMgr.getNetworkOffering(network.getNetworkOfferingId()); physicalNetworkId = network.getPhysicalNetworkId(); @@ -1796,18 +1796,11 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { - protected Long getNonGuestNetworkPhysicalNetworkId(Network network) { - // no physical network for control traffic type - - // have to remove this sanity check as VMware control network is management network + protected Long getNonGuestNetworkPhysicalNetworkId(Network network, TrafficType trafficType) { + // VMware control network is management network // we need to retrieve traffic label information through physical network - /* - if (network.getTrafficType() == TrafficType.Control) { - return null; - } - */ Long physicalNetworkId = network.getPhysicalNetworkId(); - + if (physicalNetworkId == null) { List pNtwks = _physicalNetworkDao.listByZone(network.getDataCenterId()); if (pNtwks.size() == 1) { @@ -1817,7 +1810,7 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { // We can make this assumptions based on the fact that Public/Management/Control traffic types are // supported only in one physical network in the zone in 3.0 for (PhysicalNetworkVO pNtwk : pNtwks) { - if (_pNTrafficTypeDao.isTrafficTypeSupported(pNtwk.getId(), network.getTrafficType())) { + if (_pNTrafficTypeDao.isTrafficTypeSupported(pNtwk.getId(), trafficType)) { physicalNetworkId = pNtwk.getId(); break; } @@ -1827,6 +1820,37 @@ public class NetworkModelImpl extends ManagerBase implements NetworkModel { return physicalNetworkId; } + protected Long getNonGuestNetworkPhysicalNetworkId(Network network) { + // no physical network for control traffic type + + // have to remove this sanity check as VMware control network is management network + // we need to retrieve traffic label information through physical network +/* + if (network.getTrafficType() == TrafficType.Control) { + return null; + } +*/ + Long physicalNetworkId = network.getPhysicalNetworkId(); + + if (physicalNetworkId == null) { + List pNtwks = _physicalNetworkDao.listByZone(network.getDataCenterId()); + if (pNtwks.size() == 1) { + physicalNetworkId = pNtwks.get(0).getId(); + } else { + // locate physicalNetwork with supported traffic type + // We can make this assumptions based on the fact that Public/Management/Control traffic types are + // supported only in one physical network in the zone in 3.0 + for (PhysicalNetworkVO pNtwk : pNtwks) { + if (_pNTrafficTypeDao.isTrafficTypeSupported(pNtwk.getId(), network.getTrafficType())) { + physicalNetworkId = pNtwk.getId(); + break; + } + } + } + } + return physicalNetworkId; + } + @Override public NicProfile getNicProfile(VirtualMachine vm, long networkId, String broadcastUri) { NicVO nic = null; From 9c36ad722bef072e8ffcd124c20c0240e87c632b Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 14:36:59 +0530 Subject: [PATCH 100/907] CLOUDSTACK-3795: When listing the publicipaddress provide assocNtwkId PublicIpAddresses.list takes an associatednetworkid which lists all the public ip addresses in the deployment's physical network associated with the vnet. Various tests failed because of `networkid` used in place of `associatednetworkid` Signed-off-by: Prasanna Santhanam (cherry picked from commit b88fe8233af699786de6d08a6bc981546538898d) --- .../test_redundant_router_network_rules.py | 23 ++++++++++--------- 1 file changed, 12 insertions(+), 11 deletions(-) diff --git a/test/integration/component/test_redundant_router_network_rules.py b/test/integration/component/test_redundant_router_network_rules.py index d89a29b1c91..f71954b599b 100644 --- a/test/integration/component/test_redundant_router_network_rules.py +++ b/test/integration/component/test_redundant_router_network_rules.py @@ -201,8 +201,8 @@ class TestRedundantRouterRulesLifeCycle(cloudstackTestCase): return @attr(tags=["advanced", "advancedns", "ssh"]) - def test_applyNetworkRules_MasterDown_deleteNetworkRules(self): - """Test apply network rules when master & backup routers rebooted + def test_networkRules_afterRebootRouters(self): + """Test network rules after master & backup routers rebooted """ # Steps to validate @@ -360,7 +360,7 @@ class TestRedundantRouterRulesLifeCycle(cloudstackTestCase): public_ips = PublicIPAddress.list( self.apiclient, - networkid=network.id, + associatednetworkid=network.id, listall=True, isstaticnat=True ) @@ -667,7 +667,7 @@ class TestRedundantRouterRulesLifeCycle(cloudstackTestCase): public_ips = PublicIPAddress.list( self.apiclient, - networkid=network.id, + associatednetworkid=network.id, listall=True, isstaticnat=True ) @@ -1007,7 +1007,7 @@ class TestRedundantRouterRulesLifeCycle(cloudstackTestCase): public_ips = PublicIPAddress.list( self.apiclient, - networkid=network.id, + associatednetworkid=network.id, listall=True, isstaticnat=True ) @@ -1117,7 +1117,7 @@ class TestRedundantRouterRulesLifeCycle(cloudstackTestCase): self.fail("SSH to guest VM failed: %s" % e) return - @attr(tags=["advanced", "advancedns", "ssh"]) + @attr(tags=["advanced", "advancedns", "ssh", "needle"]) def test_applyNetworkRules_MasterDown_deleteNetworkRules(self): """Test apply network rules when master down and delete network rules """ @@ -1284,7 +1284,7 @@ class TestRedundantRouterRulesLifeCycle(cloudstackTestCase): public_ips = PublicIPAddress.list( self.apiclient, - networkid=network.id, + associatednetworkid=network.id, listall=True, isstaticnat=True ) @@ -1294,10 +1294,11 @@ class TestRedundantRouterRulesLifeCycle(cloudstackTestCase): "List public Ip for network should list the Ip addr" ) self.assertEqual( - public_ips[0].ipaddress, - public_ip.ipaddress.ipaddress, - "List public Ip for network should list the Ip addr" - ) + public_ips[0].ipaddress, + public_ip.ipaddress.ipaddress, + "Public Ip Address in the network created (%s) and listed (%s) do not match" % ( + public_ips[0].ipaddress, public_ip.ipaddress.ipaddress) + ) self.debug("creating a FW rule on IP: %s" % public_ip.ipaddress.ipaddress) From ade13bb7733b00b71dbc88e92bc67346c0683abc Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 14:51:37 +0530 Subject: [PATCH 101/907] Remove duplicate while-loop retries during ssh Signed-off-by: Prasanna Santhanam (cherry picked from commit 53feae08de5f4d8072538e9060e5a6e074ebcdde) --- .../component/test_vpc_network_pfrules.py | 2 +- tools/marvin/marvin/integration/lib/utils.py | 30 ++++++++----------- tools/marvin/marvin/remoteSSHClient.py | 4 +-- 3 files changed, 16 insertions(+), 20 deletions(-) diff --git a/test/integration/component/test_vpc_network_pfrules.py b/test/integration/component/test_vpc_network_pfrules.py index 6894c997aae..9e6243b6ed8 100644 --- a/test/integration/component/test_vpc_network_pfrules.py +++ b/test/integration/component/test_vpc_network_pfrules.py @@ -356,7 +356,7 @@ class TestVPCNetworkPFRules(cloudstackTestCase): vpcid=self.vpc.id ) - self.debug("Adding NetwrokACl rules to make NAT rule accessible") + self.debug("Adding NetworkACL rules to make NAT rule accessible") nwacl_nat = NetworkACL.create(self.apiclient, networkid=network.id, services=services, diff --git a/tools/marvin/marvin/integration/lib/utils.py b/tools/marvin/marvin/integration/lib/utils.py index 16bbb7e33ba..92aee836b96 100644 --- a/tools/marvin/marvin/integration/lib/utils.py +++ b/tools/marvin/marvin/integration/lib/utils.py @@ -111,23 +111,19 @@ def cleanup_resources(api_client, resources): def is_server_ssh_ready(ipaddress, port, username, password, retries=5, timeout=20, keyPairFileLocation=None): """Return ssh handle else wait till sshd is running""" - loop_cnt = retries - while True: - try: - ssh = remoteSSHClient( - host=ipaddress, - port=port, - user=username, - passwd=password, - keyPairFileLocation=keyPairFileLocation) - except Exception as e: - if loop_cnt == 0: - raise e - loop_cnt = loop_cnt - 1 - time.sleep(timeout) - else: - return ssh - raise Exception("Failed to bring up ssh service in time. Waited %ss" % retries*timeout) + try: + ssh = remoteSSHClient( + host=ipaddress, + port=port, + user=username, + passwd=password, + keyPairFileLocation=keyPairFileLocation, + retries=retries, + delay=timeout) + except Exception, e: + raise Exception("Failed to bring up ssh service in time. Waited %ss. Error is %s" % (retries * timeout, e)) + else: + return ssh def format_volume_to_ext3(ssh_client, device="/dev/sda"): diff --git a/tools/marvin/marvin/remoteSSHClient.py b/tools/marvin/marvin/remoteSSHClient.py index 597fc65f819..1dd1ef1a815 100644 --- a/tools/marvin/marvin/remoteSSHClient.py +++ b/tools/marvin/marvin/remoteSSHClient.py @@ -24,7 +24,7 @@ from contextlib import closing class remoteSSHClient(object): - def __init__(self, host, port, user, passwd, retries=10, + def __init__(self, host, port, user, passwd, retries=10, delay=5, log_lvl=logging.INFO, keyPairFileLocation=None): self.host = host self.port = port @@ -62,7 +62,7 @@ class remoteSSHClient(object): raise cloudstackException. \ InvalidParameterException(repr(sshex)) retry_count = retry_count - 1 - time.sleep(5) + time.sleep(delay) except paramiko.AuthenticationException, authEx: raise cloudstackException. \ InvalidParameterException("Invalid credentials to " From 8ef097ef6e73134c09b05c967ece6b795d857581 Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Mon, 29 Jul 2013 15:10:43 +0530 Subject: [PATCH 102/907] CLOUDSTACK-3669: Bringing down the dynamic scalable check (for VM whether it has xstools or vmware tools in it) to the management layer. Signed off by : Nitin Mehta --- core/src/com/cloud/agent/api/ScaleVmCommand.java | 3 +-- .../hypervisor/xen/resource/CitrixResourceBase.java | 4 ---- server/src/com/cloud/vm/UserVmManagerImpl.java | 4 ++++ server/src/com/cloud/vm/VirtualMachineManagerImpl.java | 10 +--------- .../com/cloud/vm/VirtualMachineManagerImplTest.java | 2 +- 5 files changed, 7 insertions(+), 16 deletions(-) diff --git a/core/src/com/cloud/agent/api/ScaleVmCommand.java b/core/src/com/cloud/agent/api/ScaleVmCommand.java index 83cdcac2615..b3614856361 100644 --- a/core/src/com/cloud/agent/api/ScaleVmCommand.java +++ b/core/src/com/cloud/agent/api/ScaleVmCommand.java @@ -41,7 +41,7 @@ public class ScaleVmCommand extends Command { } public ScaleVmCommand(String vmName, int cpus, - Integer minSpeed, Integer maxSpeed, long minRam, long maxRam, boolean limitCpuUse, boolean isDynamicallyScalable) { + Integer minSpeed, Integer maxSpeed, long minRam, long maxRam, boolean limitCpuUse) { super(); this.vmName = vmName; this.cpus = cpus; @@ -50,7 +50,6 @@ public class ScaleVmCommand extends Command { this.minRam = minRam; this.maxRam = maxRam; this.vm = new VirtualMachineTO(1L, vmName, null, cpus, minSpeed, maxSpeed, minRam, maxRam, null, null, false, limitCpuUse, null); - vm.setEnableDynamicallyScaleVm(isDynamicallyScalable); /*vm.setName(vmName); vm.setCpus(cpus); vm.setRam(minRam, maxRam);*/ diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java index 7173f0b49a0..4ab41006e27 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/CitrixResourceBase.java @@ -688,10 +688,6 @@ public abstract class CitrixResourceBase implements ServerResource, HypervisorRe throw new CloudRuntimeException("Unable to scale the vm: " + vmName + " as DMC - Dynamic memory control is not enabled for the XenServer:" + _host.uuid + " ,check your license and hypervisor version."); } - if(!vmSpec.isEnableDynamicallyScaleVm()) { - throw new CloudRuntimeException("Unable to Scale the vm: " + vmName + "as vm does not have xs tools to support dynamic scaling"); - } - // stop vm which is running on this host or is in halted state Iterator iter = vms.iterator(); while ( iter.hasNext() ) { diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index 34f3de2b95e..c950b4b5f9a 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1189,6 +1189,10 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if(!enableDynamicallyScaleVm){ throw new PermissionDeniedException("Dynamically scaling virtual machines is disabled for this zone, please contact your admin"); } + UserVmDetailVO vmDetailVO = _vmDetailsDao.findDetail(vmId, VirtualMachine.IsDynamicScalingEnabled); + if (vmDetailVO == null || !Boolean.parseBoolean(vmDetailVO.getValue())) { + throw new CloudRuntimeException("Unable to Scale the vm: " + vmInstance.getUuid() + " as vm does not have xs tools to support dynamic scaling"); + } while (retry-- != 0) { // It's != so that it can match -1. try{ diff --git a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java index 1fb118f7ad5..a49a297a3b4 100755 --- a/server/src/com/cloud/vm/VirtualMachineManagerImpl.java +++ b/server/src/com/cloud/vm/VirtualMachineManagerImpl.java @@ -3275,14 +3275,6 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac public VMInstanceVO reConfigureVm(VMInstanceVO vm, ServiceOffering oldServiceOffering, boolean reconfiguringOnExistingHost) throws ResourceUnavailableException, ConcurrentOperationException { - UserVmDetailVO vmDetailVO = _uservmDetailsDao.findDetail(vm.getId(), VirtualMachine.IsDynamicScalingEnabled); - Boolean isDynamicallyScalable; - if (vmDetailVO == null) { - isDynamicallyScalable = false; - } else { - isDynamicallyScalable = (vmDetailVO.getValue()).equals("true"); - } - long newServiceofferingId = vm.getServiceOfferingId(); ServiceOffering newServiceOffering = _configMgr.getServiceOffering(newServiceofferingId); HostVO hostVo = _hostDao.findById(vm.getHostId()); @@ -3294,7 +3286,7 @@ public class VirtualMachineManagerImpl extends ManagerBase implements VirtualMac long minMemory = (long)(newServiceOffering.getRamSize() / memoryOvercommitRatio); ScaleVmCommand reconfigureCmd = new ScaleVmCommand(vm.getInstanceName(), newServiceOffering.getCpu(), (int)(newServiceOffering.getSpeed() / cpuOvercommitRatio), newServiceOffering.getSpeed(), minMemory * 1024L * 1024L, - newServiceOffering.getRamSize() * 1024L * 1024L, newServiceOffering.getLimitCpuUse(), isDynamicallyScalable); + newServiceOffering.getRamSize() * 1024L * 1024L, newServiceOffering.getLimitCpuUse()); Long dstHostId = vm.getHostId(); ItWorkVO work = new ItWorkVO(UUID.randomUUID().toString(), _nodeId, State.Running, vm.getType(), vm.getId()); diff --git a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java index 56b14cdc404..7882b197d99 100644 --- a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java +++ b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java @@ -278,7 +278,7 @@ public class VirtualMachineManagerImplTest { when(_configServer.getConfigValue(Config.CPUOverprovisioningFactor.key(), Config.ConfigurationParameterScope.cluster.toString(), 1L)).thenReturn("1.0"); ScaleVmCommand reconfigureCmd = new ScaleVmCommand("myVmName", newServiceOffering.getCpu(), newServiceOffering.getSpeed(), newServiceOffering.getSpeed(), newServiceOffering.getRamSize(), newServiceOffering.getRamSize(), - newServiceOffering.getLimitCpuUse(), true); + newServiceOffering.getLimitCpuUse()); Answer answer = new ScaleVmAnswer(reconfigureCmd, true, "details"); when(_agentMgr.send(2l, reconfigureCmd)).thenReturn(null); _vmMgr.reConfigureVm(_vmInstance, getSvcoffering(256), false); From 2f369973e22441dbebabf8d0683ddec866bef72f Mon Sep 17 00:00:00 2001 From: Harikrishna Patnala Date: Mon, 29 Jul 2013 15:24:59 +0530 Subject: [PATCH 103/907] CLOUDSTACK-3779: Support System vm scaling on VMWare Marked the system template new system template as dynamicallyScalable - handled upgrade case - moved "dynamicallyScalable" flag to vm_instance table from user_vm_details to support dynamic scaling of system vm Signed off by : Nitin Mehta --- .../cloud/upgrade/dao/Upgrade410to420.java | 9 +++++++- .../schema/src/com/cloud/vm/VMInstanceVO.java | 10 +++++++++ .../src/com/cloud/vm/dao/UserVmDao.java | 2 +- .../src/com/cloud/vm/dao/UserVmDaoImpl.java | 3 ++- .../xen/resource/XenServer56FP1Resource.java | 4 ++-- .../cloud/hypervisor/HypervisorGuruBase.java | 9 +++----- .../cloud/server/ManagementServerImpl.java | 4 ++++ .../src/com/cloud/vm/UserVmManagerImpl.java | 21 ++++++------------- .../vm/VirtualMachineManagerImplTest.java | 2 -- setup/db/db/schema-410to420.sql | 9 ++++---- 10 files changed, 40 insertions(+), 33 deletions(-) diff --git a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java index d4b7b6d353b..61e678198f2 100644 --- a/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java +++ b/engine/schema/src/com/cloud/upgrade/dao/Upgrade410to420.java @@ -265,7 +265,14 @@ public class Upgrade410to420 implements DbUpgrade { throw new CloudRuntimeException("Error while updating "+ hypervisorAndTemplateName.getKey() +" systemVm template", e); } } - + try { + pstmt = conn.prepareStatement("UPDATE `cloud`.`vm_template` set dynamically_scalable = 1 where name = ? and type = 'SYSTEM'"); + pstmt.setString(1, NewTemplateNameList.get(HypervisorType.VMware)); + pstmt.executeUpdate(); + pstmt.close(); + } catch (SQLException e) { + throw new CloudRuntimeException("Error while updating dynamically_scalable flag to 1 for SYSTEM template systemvm-vmware-4.2"); + } s_logger.debug("Updating System Vm Template IDs Complete"); } finally { diff --git a/engine/schema/src/com/cloud/vm/VMInstanceVO.java b/engine/schema/src/com/cloud/vm/VMInstanceVO.java index e1d289206a9..8cf7fd0dd87 100644 --- a/engine/schema/src/com/cloud/vm/VMInstanceVO.java +++ b/engine/schema/src/com/cloud/vm/VMInstanceVO.java @@ -146,6 +146,8 @@ public class VMInstanceVO implements VirtualMachine, FiniteStateObject { * @param userData updates the userData of the vm * @param displayVm updates the displayvm attribute signifying whether it has to be displayed to the end user or not. */ - void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm); + void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable); List findDestroyedVms(Date date); diff --git a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java index 1c11563b270..8afce099394 100755 --- a/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java +++ b/engine/schema/src/com/cloud/vm/dao/UserVmDaoImpl.java @@ -224,13 +224,14 @@ public class UserVmDaoImpl extends GenericDaoBase implements Use } @Override - public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm) { + public void updateVM(long id, String displayName, boolean enable, Long osTypeId, String userData, boolean displayVm, boolean isDynamicallyScalable) { UserVmVO vo = createForUpdate(); vo.setDisplayName(displayName); vo.setHaEnabled(enable); vo.setGuestOSId(osTypeId); vo.setUserData(userData); vo.setDisplayVm(displayVm); + vo.setDynamicallyScalable(isDynamicallyScalable); update(id, vo); } diff --git a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java index 11a7b42b81a..d230be10155 100644 --- a/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java +++ b/plugins/hypervisors/xen/src/com/cloud/hypervisor/xen/resource/XenServer56FP1Resource.java @@ -178,8 +178,8 @@ public class XenServer56FP1Resource extends XenServer56Resource { vmr.memoryDynamicMax = vmSpec.getMaxRam(); } else { //scaling disallowed, set static memory target - if (s_logger.isDebugEnabled()) { - s_logger.warn("Host "+ host.getHostname(conn) +" does not support dynamic scaling"); + if (vmSpec.isEnableDynamicallyScaleVm() && !isDmcEnabled(conn, host)) { + s_logger.warn("Host "+ host.getHostname(conn) +" does not support dynamic scaling, so the vm " + vmSpec.getName() + " is not dynamically scalable"); } vmr.memoryStaticMin = vmSpec.getMinRam(); vmr.memoryStaticMax = vmSpec.getMaxRam(); diff --git a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java index 6d368bd61c2..8a9df03015d 100644 --- a/server/src/com/cloud/hypervisor/HypervisorGuruBase.java +++ b/server/src/com/cloud/hypervisor/HypervisorGuruBase.java @@ -120,15 +120,12 @@ public abstract class HypervisorGuruBase extends AdapterBase implements Hypervis if(detailsInVm != null) { details.putAll(detailsInVm); } - if (details.get(VirtualMachine.IsDynamicScalingEnabled) == null || details.get(VirtualMachine.IsDynamicScalingEnabled).isEmpty()) { - to.setEnableDynamicallyScaleVm(false); - } else { - // check if XStools/VMWare tools are present in the VM and dynamic scaling feature is enabled (per zone/global) - to.setEnableDynamicallyScaleVm(details.get(VirtualMachine.IsDynamicScalingEnabled).equals("true") && Boolean.parseBoolean(_configServer.getConfigValue(Config.EnableDynamicallyScaleVm.key(), Config.ConfigurationParameterScope.zone.toString(), vm.getDataCenterId()))); - } to.setDetails(details); // Workaround to make sure the TO has the UUID we need for Niciri integration VMInstanceVO vmInstance = _virtualMachineDao.findById(to.getId()); + // check if XStools/VMWare tools are present in the VM and dynamic scaling feature is enabled (per zone/global) + Boolean isDynamicallyScalable = vmInstance.isDynamicallyScalable() && Boolean.parseBoolean(_configServer.getConfigValue(Config.EnableDynamicallyScaleVm.key(), Config.ConfigurationParameterScope.zone.toString(), vm.getDataCenterId())); + to.setEnableDynamicallyScaleVm(isDynamicallyScalable); to.setUuid(vmInstance.getUuid()); // diff --git a/server/src/com/cloud/server/ManagementServerImpl.java b/server/src/com/cloud/server/ManagementServerImpl.java index e0abe0146fb..8e29bb834c7 100755 --- a/server/src/com/cloud/server/ManagementServerImpl.java +++ b/server/src/com/cloud/server/ManagementServerImpl.java @@ -3736,6 +3736,10 @@ public class ManagementServerImpl extends ManagerBase implements ManagementServe @Override public VirtualMachine upgradeSystemVM(ScaleSystemVMCmd cmd) throws ResourceUnavailableException, ManagementServerException, VirtualMachineMigrationException, ConcurrentOperationException { + VMInstanceVO vmInstance = _vmInstanceDao.findById(cmd.getId()); + if (vmInstance.getHypervisorType() == HypervisorType.XenServer && vmInstance.getState().equals(State.Running)) { + throw new InvalidParameterValueException("Dynamic Scaling operation is not permitted for this hypervisor on system vm"); + } boolean result = _userVmMgr.upgradeVirtualMachine(cmd.getId(), cmd.getServiceOfferingId()); if(result){ VirtualMachine vm = _vmInstanceDao.findById(cmd.getId()); diff --git a/server/src/com/cloud/vm/UserVmManagerImpl.java b/server/src/com/cloud/vm/UserVmManagerImpl.java index c950b4b5f9a..2def783667d 100755 --- a/server/src/com/cloud/vm/UserVmManagerImpl.java +++ b/server/src/com/cloud/vm/UserVmManagerImpl.java @@ -1189,9 +1189,8 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir if(!enableDynamicallyScaleVm){ throw new PermissionDeniedException("Dynamically scaling virtual machines is disabled for this zone, please contact your admin"); } - UserVmDetailVO vmDetailVO = _vmDetailsDao.findDetail(vmId, VirtualMachine.IsDynamicScalingEnabled); - if (vmDetailVO == null || !Boolean.parseBoolean(vmDetailVO.getValue())) { - throw new CloudRuntimeException("Unable to Scale the vm: " + vmInstance.getUuid() + " as vm does not have xs tools to support dynamic scaling"); + if (!vmInstance.isDynamicallyScalable()) { + throw new CloudRuntimeException("Unable to Scale the vm: " + vmInstance.getUuid() + " as vm does not have tools to support dynamic scaling"); } while (retry-- != 0) { // It's != so that it can match -1. @@ -1803,18 +1802,11 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir } } - if (isDynamicallyScalable != null) { - UserVmDetailVO vmDetailVO = _vmDetailsDao.findDetail(vm.getId(), VirtualMachine.IsDynamicScalingEnabled); - if (vmDetailVO == null) { - vmDetailVO = new UserVmDetailVO(vm.getId(), VirtualMachine.IsDynamicScalingEnabled, isDynamicallyScalable.toString()); - _vmDetailsDao.persist(vmDetailVO); - } else { - vmDetailVO.setValue(isDynamicallyScalable.toString()); - _vmDetailsDao.update(vmDetailVO.getId(), vmDetailVO); - } + if (isDynamicallyScalable == null) { + isDynamicallyScalable = vmInstance.isDynamicallyScalable(); } - _vmDao.updateVM(id, displayName, ha, osTypeId, userData, isDisplayVmEnabled); + _vmDao.updateVM(id, displayName, ha, osTypeId, userData, isDisplayVmEnabled, isDynamicallyScalable); if (updateUserdata) { boolean result = updateUserDataInternal(_vmDao.findById(id)); @@ -2716,8 +2708,7 @@ public class UserVmManagerImpl extends ManagerBase implements UserVmManager, Vir owner.getDomainId(), owner.getId(), offering.getId(), userData, hostName, diskOfferingId); vm.setUuid(uuidName); - vm.setDetail(VirtualMachine.IsDynamicScalingEnabled, template.isDynamicallyScalable().toString()); - + vm.setDynamicallyScalable(template.isDynamicallyScalable()); if (sshPublicKey != null) { vm.setDetail("SSH.PublicKey", sshPublicKey); } diff --git a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java index 7882b197d99..9f36450c67e 100644 --- a/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java +++ b/server/test/com/cloud/vm/VirtualMachineManagerImplTest.java @@ -265,8 +265,6 @@ public class VirtualMachineManagerImplTest { long l = 1L; doReturn(3L).when(_vmInstance).getId(); - when(_vmDetailsDao.findDetail(3L, VirtualMachine.IsDynamicScalingEnabled)).thenReturn(_vmDetailVO); - doReturn("true").when(_vmDetailVO).getValue(); when(_vmInstanceDao.findById(anyLong())).thenReturn(_vmInstance); ServiceOfferingVO newServiceOffering = getSvcoffering(512); doReturn(1L).when(_vmInstance).getHostId(); diff --git a/setup/db/db/schema-410to420.sql b/setup/db/db/schema-410to420.sql index 530608edc70..3ed2fd25350 100644 --- a/setup/db/db/schema-410to420.sql +++ b/setup/db/db/schema-410to420.sql @@ -43,7 +43,9 @@ INSERT IGNORE INTO `cloud`.`configuration` VALUES ('Network', 'DEFAULT', 'manage ALTER TABLE `cloud`.`load_balancer_vm_map` ADD state VARCHAR(40) NULL COMMENT 'service status updated by LB healthcheck manager'; ALTER TABLE `cloud`.`vm_template` ADD COLUMN `dynamically_scalable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if template contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory'; +ALTER TABLE `cloud`.`vm_instance` ADD COLUMN `dynamically_scalable` tinyint(1) unsigned NOT NULL DEFAULT 0 COMMENT 'true if VM contains XS/VMWare tools inorder to support dynamic scaling of VM cpu/memory'; UPDATE `cloud`.`vm_template` SET dynamically_scalable = 1 WHERE name = "CentOS 5.6(64-bit) no GUI (XenServer)" AND type = "BUILTIN"; +UPDATE `cloud`.`vm_template` SET dynamically_scalable = 1 WHERE name = "SystemVM Template (vSphere)" AND type = "SYSTEM"; alter table storage_pool add hypervisor varchar(32); alter table storage_pool change storage_provider_id storage_provider_name varchar(255); @@ -1620,7 +1622,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS affinity_group.uuid affinity_group_uuid, affinity_group.name affinity_group_name, affinity_group.description affinity_group_description, - vm_details.value dynamically_scalable + vm_instance.dynamically_scalable dynamically_scalable from `cloud`.`user_vm` @@ -1684,10 +1686,7 @@ CREATE VIEW `cloud`.`user_vm_view` AS left join `cloud`.`affinity_group_vm_map` ON vm_instance.id = affinity_group_vm_map.instance_id left join - `cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id - left join - `cloud`.`user_vm_details` vm_details ON vm_details.vm_id = vm_instance.id - and vm_details.name = 'enable.dynamic.scaling'; + `cloud`.`affinity_group` ON affinity_group_vm_map.affinity_group_id = affinity_group.id; DROP VIEW IF EXISTS `cloud`.`volume_view`; CREATE VIEW `cloud`.`volume_view` AS From 20e64be8d7ed7b12c3a91126dff65eeb1231d472 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 15:32:37 +0530 Subject: [PATCH 104/907] Fix broken pep8 from 1305697eaa598a3bc59d5b81f5f838369c6d5b8e Signed-off-by: Prasanna Santhanam (cherry picked from commit 8545e6461880dae08a8b3f7d07d9302807982c29) --- tools/marvin/marvin/deployDataCenter.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index ac07fa67ded..53520299a2b 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -174,7 +174,8 @@ specify a valid config file" % cfgFile) if cacheStorages is None: return for cache in cacheStorages: - cachecmd = createSecondaryStagingStore.createSecondaryStagingStoreCmd() + cachecmd = createSecondaryStagingStore.\ + createSecondaryStagingStoreCmd() cachecmd.url = cache.url cachecmd.provider = cache.provider cachecmd.zoneid = zoneId From eae874918d717ba06d0ab18ece6e4a7a2f28471b Mon Sep 17 00:00:00 2001 From: Sowmya Krishnan Date: Mon, 29 Jul 2013 09:26:09 +0530 Subject: [PATCH 105/907] CLOUDSTACK-3744 Fixed order of cleanup objects, removed offerings cleanup Signed-off-by: Prasanna Santhanam (cherry picked from commit 08c82883f6bcc18804c88633c9c85764c5d22417) --- test/integration/component/test_netscaler_nw_off.py | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/test/integration/component/test_netscaler_nw_off.py b/test/integration/component/test_netscaler_nw_off.py index 5fd21950fe7..84616e127e5 100644 --- a/test/integration/component/test_netscaler_nw_off.py +++ b/test/integration/component/test_netscaler_nw_off.py @@ -605,11 +605,10 @@ class TestNetScalerSharedMode(cloudstackTestCase): ) cls._cleanup = [ cls.service_offering, - cls.network_offering, cls.account_1, cls.account_2, cls.account_3, - cls.account_5 + cls.account_5, ] cls.cleanup_devices = [cls.netscaler_1] return @@ -1132,7 +1131,6 @@ class TestNwOffDedicatedNetscaler(cloudstackTestCase): ) cls._cleanup = [ cls.service_offering, - cls.network_offering, cls.netscaler, ] return @@ -1312,8 +1310,6 @@ class TestNwOffNetscaler(cloudstackTestCase): ) cls._cleanup = [ cls.service_offering, - cls.network_offering, - cls.network_offering_shared, cls.netscaler_1, cls.netscaler_2, ] @@ -1623,8 +1619,6 @@ class TestNwOffSToDUpgrade(cloudstackTestCase): ) cls._cleanup = [ cls.service_offering, - cls.network_offering_dedicated, - cls.network_offering_shared, cls.netscaler_1, cls.netscaler_2, ] @@ -2040,8 +2034,6 @@ class TestNwOffDToSUpgrade(cloudstackTestCase): ) cls._cleanup = [ cls.service_offering, - cls.network_offering_dedicated, - cls.network_offering_shared, cls.netscaler_1, cls.netscaler_2, ] From 098c2db4b71cf2a8b2cc1e1e87c9c111becd427c Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 15:55:39 +0530 Subject: [PATCH 106/907] CLOUDSTACK-3900: Remove the offering that is deleted before cleanup One of the VPC offerings (4) is deleted in the test before moving into teardown. This offering should be removed from cleanup. Signed-off-by: Prasanna Santhanam (cherry picked from commit d66edb5e2bc7d0396709ffcc35dfc61d563f307a) --- test/integration/component/test_vpc_offerings.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/test/integration/component/test_vpc_offerings.py b/test/integration/component/test_vpc_offerings.py index a32bd686131..75b503aa436 100644 --- a/test/integration/component/test_vpc_offerings.py +++ b/test/integration/component/test_vpc_offerings.py @@ -303,7 +303,6 @@ class TestVPCOffering(cloudstackTestCase): ) # Enable Network offering self.network_offering.update(self.apiclient, state='Enabled') - self.cleanup.append(self.network_offering) gateway = vpc.cidr.split('/')[0] # Split the cidr to retrieve gateway @@ -1006,7 +1005,7 @@ class TestVPCOffering(cloudstackTestCase): ) return - @attr(tags=["advanced", "intervlan"]) + @attr(tags=["advanced", "intervlan", "needle"]) def test_08_list_vpc_off(self): """Test list VPC offering""" @@ -1061,7 +1060,6 @@ class TestVPCOffering(cloudstackTestCase): self.apiclient, self.services["vpc_offering"] ) - self.cleanup.append(vpc_off_4) self.debug("Enabling the VPC offering created") vpc_off_4.update(self.apiclient, state='Enabled') From e4de46e4b1b517b0f304c6d6c2218a925c109ee4 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 16:21:07 +0530 Subject: [PATCH 107/907] CLOUDSTACK-3901: Test for vpc offerings - Fix the test that ensures vpc offerings cannot be created with firewall service - CLOUDSTACK-3902 blocks the fix for vpc offerings created without source nat service. Without source NAT VPC creation should fail. Signed-off-by: Prasanna Santhanam --- test/integration/component/test_vpc_offerings.py | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/integration/component/test_vpc_offerings.py b/test/integration/component/test_vpc_offerings.py index 75b503aa436..59112704762 100644 --- a/test/integration/component/test_vpc_offerings.py +++ b/test/integration/component/test_vpc_offerings.py @@ -880,11 +880,9 @@ class TestVPCOffering(cloudstackTestCase): # 1. Creating VPC Offering with no SourceNat service should FAIL. # 2. Creating VPC Offering with services NOT supported by VPC # like Firewall should not be allowed - # 3. Creating VPC Offering with services NOT supported by VPC - # like Firewall should not be allowed self.debug("Creating a VPC offering without sourceNAT") - self.services["vpc_offering"]["supportedservices"] = 'Dhcp,Dns,PortForwarding,Vpn,Firewall,Lb,UserData,StaticNat' + self.services["vpc_offering"]["supportedservices"] = 'Dhcp,Dns,PortForwarding,Vpn,Lb,UserData,StaticNat' with self.assertRaises(Exception): VpcOffering.create( @@ -892,8 +890,8 @@ class TestVPCOffering(cloudstackTestCase): self.services["vpc_offering"] ) - self.debug("Creating a VPC offering without Firewall") - self.services["vpc_offering"]["supportedservices"] = 'Dhcp,Dns,PortForwarding,Vpn,SourceNat,Lb,UserData,StaticNat' + self.debug("Creating a VPC offering with Firewall") + self.services["vpc_offering"]["supportedservices"] = 'Dhcp,Dns,PortForwarding,Firewall,Vpn,SourceNat,Lb,UserData,StaticNat' with self.assertRaises(Exception): VpcOffering.create( @@ -1005,7 +1003,7 @@ class TestVPCOffering(cloudstackTestCase): ) return - @attr(tags=["advanced", "intervlan", "needle"]) + @attr(tags=["advanced", "intervlan"]) def test_08_list_vpc_off(self): """Test list VPC offering""" From e34a75005efb25a31738cbc9dbf68313a9a217ff Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 29 Jul 2013 13:02:07 +0200 Subject: [PATCH 108/907] CLOUDSTACK-3843: remove greedy results in save_password_to_domr.sh --- scripts/network/domr/save_password_to_domr.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/network/domr/save_password_to_domr.sh b/scripts/network/domr/save_password_to_domr.sh index 7b29472c849..9b44663fd79 100755 --- a/scripts/network/domr/save_password_to_domr.sh +++ b/scripts/network/domr/save_password_to_domr.sh @@ -29,7 +29,7 @@ replace_in_file_on_domr() { local filename=$1 local keyname=$2 local value=$3 - $VIA_SSH "sed -i /$keyname/d $filename; \ + $VIA_SSH "sed -i /$keyname=/d $filename; \ echo "$keyname=$value" >> $filename " # $VIA_SSH "sed -e /$keyname/d $filename > $filename.new; \ From 9fe5d398a2673e26c7c2f6a54018974630991d4e Mon Sep 17 00:00:00 2001 From: Kishan Kavala Date: Mon, 29 Jul 2013 16:34:03 +0530 Subject: [PATCH 109/907] CLOUDSTACK-3849: Set volume size in CopyAnswer for Vmware when cloning volume from bas template --- .../src/com/cloud/storage/resource/VmwareStorageProcessor.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java index 65a0cb56596..6f569e0b543 100644 --- a/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java +++ b/plugins/hypervisors/vmware/src/com/cloud/storage/resource/VmwareStorageProcessor.java @@ -363,6 +363,7 @@ public class VmwareStorageProcessor implements StorageProcessor { VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(vmdkName); + newVol.setSize(volume.getSize()); return new CopyCmdAnswer(newVol); } finally { vmMo.detachAllDisks(); @@ -400,6 +401,7 @@ public class VmwareStorageProcessor implements StorageProcessor { dsMo.deleteFile(srcFile, dcMo.getMor(), true); VolumeObjectTO newVol = new VolumeObjectTO(); newVol.setPath(vmdkName); + newVol.setSize(volume.getSize()); return new CopyCmdAnswer(newVol); } } catch (Throwable e) { From dd1717883e6d24bb3e83600d2476faf3c21c6394 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 16:37:33 +0530 Subject: [PATCH 110/907] remove vpc offering from cleanup. Signed-off-by: Prasanna Santhanam (cherry picked from commit 83f4c3289aa380e792353c87128f07ae1463e7db) --- .../component/test_vpc_offerings.py | 57 ------------------- 1 file changed, 57 deletions(-) diff --git a/test/integration/component/test_vpc_offerings.py b/test/integration/component/test_vpc_offerings.py index 59112704762..109c8d13687 100644 --- a/test/integration/component/test_vpc_offerings.py +++ b/test/integration/component/test_vpc_offerings.py @@ -278,7 +278,6 @@ class TestVPCOffering(cloudstackTestCase): self.services["vpc_offering"] ) - self.cleanup.append(vpc_off) self.validate_vpc_offering(vpc_off) self.debug("Enabling the VPC offering created") @@ -456,62 +455,6 @@ class TestVPCOffering(cloudstackTestCase): "List public Ip for network should list the Ip addr" ) # TODO: Remote Access VPN is not yet supported in VPC -# self.debug("Associating public IP for network: %s" % network.name) -# public_ip_4 = PublicIPAddress.create( -# self.apiclient, -# accountid=self.account.name, -# zoneid=self.zone.id, -# domainid=self.account.domainid, -# networkid=network.id, -# vpcid=vpc.id -# ) -# self.debug("Associated %s with network %s" % ( -# public_ip_4.ipaddress.ipaddress, -# network.id -# )) -# -# self.debug("Creating a remote access VPN for account: %s" % -# self.account.name) -# -# try: -# vpn = Vpn.create( -# self.apiclient, -# publicipid=public_ip_4.ipaddress.id, -# account=self.account.name, -# domainid=self.account.domainid, -# networkid=network.id, -# vpcid=vpc.id -# ) -# except Exception as e: -# self.fail("Failed to create VPN for account: %s - %s" % ( -# self.account.name, e)) -# -# try: -# vpnuser = VpnUser.create( -# self.apiclient, -# username="root", -# password="password", -# account=self.account.name, -# domainid=self.account.domainid -# ) -# except Exception as e: -# self.fail("Failed to create VPN user: %s" % e) -# -# self.debug("Checking if the remote access VPN is created or not?") -# remote_vpns = Vpn.list( -# self.apiclient, -# account=self.account.name, -# domainid=self.account.domainid, -# publicipid=public_ip_4.ipaddress.id, -# listall=True -# ) -# self.assertEqual( -# isinstance(remote_vpns, list), -# True, -# "List remote VPNs should not return empty response" -# ) -# self.debug("Deleting the remote access VPN for account: %s" % -# self.account.name) return @attr(tags=["advanced", "intervlan"]) From 17b711bd7c3290933ee8a36dbedf2403048a6c7e Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 16:57:04 +0530 Subject: [PATCH 111/907] CLOUDSTACK-3906: unbound method PrivateGw.create is not @classmethod Signed-off-by: Prasanna Santhanam --- tools/marvin/marvin/integration/lib/base.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index d927c2afac3..695edf7196f 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -2961,6 +2961,8 @@ class VPC: class PrivateGateway: """Manage private gateway lifecycle""" + + @classmethod def create(cls, apiclient, gateway, ipaddress, netmask, vlan, vpcid, physicalnetworkid=None): """Create private gateway""" From 97424e2954f79f560d69c86cc5b0c8666fca6d19 Mon Sep 17 00:00:00 2001 From: Prasanna Santhanam Date: Mon, 29 Jul 2013 17:11:33 +0530 Subject: [PATCH 112/907] CLOUDSTACK-3906: PrivateGw constructor Signed-off-by: Prasanna Santhanam (cherry picked from commit b82c0c9e7b565a2373cf553f8413819afa37d8c3) --- tools/marvin/marvin/integration/lib/base.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index 695edf7196f..2f834be188c 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -2962,6 +2962,9 @@ class VPC: class PrivateGateway: """Manage private gateway lifecycle""" + def __init__(self, items): + self.__dict__.update(items) + @classmethod def create(cls, apiclient, gateway, ipaddress, netmask, vlan, vpcid, physicalnetworkid=None): From d06a5bc5f0ad2f7aa564b96f11bd29c542081a74 Mon Sep 17 00:00:00 2001 From: Devdeep Singh Date: Mon, 29 Jul 2013 17:20:56 +0530 Subject: [PATCH 113/907] CLOUDSTACK-3890. Delting the storage pool is not getting from xenserver. The storage pool entry was removed from the db but the pool wasn't unmounted from the host. There was a check that if the pool is not in UP state then the entry can just be removed. That is wrong. A pool can only be removed if it is in maintenance state. So after putting the pool in maintenance state if admin tries to delete the pool we just remove the db entry without un-mounting the storage pool from the host. Removed the incorrect check. --- .../lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java index 17e80b84382..2c8c87167a1 100644 --- a/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java +++ b/plugins/storage/volume/default/src/org/apache/cloudstack/storage/datastore/lifecycle/CloudStackPrimaryDataStoreLifeCycleImpl.java @@ -439,10 +439,7 @@ public class CloudStackPrimaryDataStoreLifeCycleImpl implements PrimaryDataStore List hostPoolRecords = this._storagePoolHostDao.listByPoolId(store.getId()); StoragePool pool = (StoragePool) store; boolean deleteFlag = false; - // If datastore is not in ready state, simply delete its db entry. - if (pool.getStatus() != StoragePoolStatus.Up) { - return this.dataStoreHelper.deletePrimaryDataStore(store); - } + // Remove the SR associated with the Xenserver for (StoragePoolHostVO host : hostPoolRecords) { DeleteStoragePoolCommand deleteCmd = new DeleteStoragePoolCommand(pool); From a8387568f30fedc0b01a0d6c745fa2ff8a4a360e Mon Sep 17 00:00:00 2001 From: Bharat Kumar Date: Wed, 17 Jul 2013 17:07:11 +0530 Subject: [PATCH 114/907] Fixed the conditon which checks for the provider's capabilty and reapply ipaliases on virtual router restart. Signed-off-by: Abhinandan Prateek --- server/src/com/cloud/network/NetworkManagerImpl.java | 2 +- .../network/router/VirtualNetworkApplianceManagerImpl.java | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/server/src/com/cloud/network/NetworkManagerImpl.java b/server/src/com/cloud/network/NetworkManagerImpl.java index b07f3cf57a3..49162e027be 100755 --- a/server/src/com/cloud/network/NetworkManagerImpl.java +++ b/server/src/com/cloud/network/NetworkManagerImpl.java @@ -2013,7 +2013,7 @@ public class NetworkManagerImpl extends ManagerBase implements NetworkManager, L DhcpServiceProvider sp = (DhcpServiceProvider) element; Map dhcpCapabilities = element.getCapabilities().get(Service.Dhcp); String supportsMultipleSubnets = dhcpCapabilities.get(Capability.DhcpAccrossMultipleSubnets); - if ((supportsMultipleSubnets != null || Boolean.valueOf(supportsMultipleSubnets)) && profile.getIp6Address() == null) { + if ((supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets)) && profile.getIp6Address() == null) { if (!sp.configDhcpSupportForSubnet(network, profile, vmProfile, dest, context)) { return false; } diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index c2a9d72bb2a..d43007abb8d 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2483,7 +2483,7 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Dhcp, provider)) { Map dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(_networkDao.findById(guestNetworkId).getNetworkOfferingId()), Service.Dhcp); String supportsMultipleSubnets = dhcpCapabilities.get(Network.Capability.DhcpAccrossMultipleSubnets); - if (supportsMultipleSubnets == null || !Boolean.valueOf(supportsMultipleSubnets)) { + if (supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets)) { List revokedIpAliasVOs = _nicIpAliasDao.listByNetworkIdAndState(guestNetworkId, NicIpAlias.state.revoked); s_logger.debug("Found" + revokedIpAliasVOs.size() + "ip Aliases to revoke on the router as a part of dhcp configuration"); removeRevokedIpAliasFromDb(revokedIpAliasVOs); From 62d84d119a28b0653aef767b69792ce4a1e52d22 Mon Sep 17 00:00:00 2001 From: Bharat Kumar Date: Sun, 28 Jul 2013 10:31:26 +0530 Subject: [PATCH 115/907] Cloudstack-3882 remove duplicate entres of dataserver from /etc/hosts Signed-off-by: Abhinandan Prateek --- patches/systemvm/debian/config/etc/init.d/cloud-early-config | 2 ++ 1 file changed, 2 insertions(+) diff --git a/patches/systemvm/debian/config/etc/init.d/cloud-early-config b/patches/systemvm/debian/config/etc/init.d/cloud-early-config index c0a7189d7a4..c12ca74cfcf 100755 --- a/patches/systemvm/debian/config/etc/init.d/cloud-early-config +++ b/patches/systemvm/debian/config/etc/init.d/cloud-early-config @@ -714,6 +714,8 @@ setup_dnsmasq() { [ $ETH0_IP ] && echo "dhcp-option=6,$NS" >> /etc/dnsmasq.conf [ $ETH0_IP6 ] && echo "dhcp-option=option6:dns-server,$NS6" >> /etc/dnsmasq.conf #adding the name data-server to the /etc/hosts for allowing the access to user-data service and ssh-key reset in every subnet. + //removing the existing entires to avoid duplicates on restarts. + sed -i '/data-server/d' /etc/hosts if [ -n "$ETH0_IP" ] then echo "$ETH0_IP data-server" >> /etc/hosts From fd32c33d6d278ec5913bb62b6828adb945036a28 Mon Sep 17 00:00:00 2001 From: tuna Date: Mon, 29 Jul 2013 08:30:17 -0400 Subject: [PATCH 116/907] GSOC report for SDN project Signed-off-by: Sebastien Goasguen --- docs/en-US/gsoc-midsummer-nguyen.xml | 456 +++++++++++++++++++++++++- docs/en-US/images/l3_services.png | Bin 0 -> 30362 bytes docs/en-US/images/network_service.png | Bin 0 -> 28162 bytes docs/en-US/images/odl_structure.jpg | Bin 0 -> 116542 bytes 4 files changed, 454 insertions(+), 2 deletions(-) create mode 100644 docs/en-US/images/l3_services.png create mode 100644 docs/en-US/images/network_service.png create mode 100644 docs/en-US/images/odl_structure.jpg diff --git a/docs/en-US/gsoc-midsummer-nguyen.xml b/docs/en-US/gsoc-midsummer-nguyen.xml index 96c2de10259..b4f4f5ab495 100644 --- a/docs/en-US/gsoc-midsummer-nguyen.xml +++ b/docs/en-US/gsoc-midsummer-nguyen.xml @@ -23,6 +23,458 @@ -->
- Mid-Summer Progress Updates - This section describes ... + Mid-Summer Progress Updates for Nguyen Anh Tu - "Add Xen/XCP support for GRE SDN controller" + This section describes my progress with the project titled "Add Xen/XCP support for GRE SDN controller" +
+ Introduction + It has been a half way of GSoC2013 journey which I am getting more familiar with its activities. Personally, the previous one-and-a-half month has surprisingly passed by in a blink with lots of pressure. In this first time joining in GSoC2013, I have found it totally new and interesting in its working methods and challenges. Along with those stressful moments, I appreciated all wonderful experiences and knowledge that I have luckily gained from this commitment. It is time to review it all and present in time order. + + My project named “Add Xen/XCP support for GRE SDN controller”, the proposal can be found here: Proposal + + Specifically, I need to improve the current GRE SDN controller to work with XCP, a free version of XenServer. Then, as mentioning with my two mentor Sebastien Goasguen and Hugo, I continue to work in next missions as below: + + + re-factor GRE source code by following NiciraNVP plugin design. + add GRE support for KVM hypervisor. + develop a new ODL plugin using Opendaylight controller for controlling and managing network services via OpenFlow protocol. + + At the beginning, I started to explore frameworks and tools that CloudStack uses such as Spring framework, marven, git and Reviewboard. In my country developers are more familiar with svn than git, however these tools are also such easy to use so I don't write more about them. I want to note about using Spring in CloudStack and what happen in the Management Server startup process. + +
+
+ Spring in CloudStack + Spring provides a Container which contains pre-loaded components CloudStack use. At startup, these components are loaded to Container via two ways: + + + + components are declared as beans in componentcontext.xml and applicationcontext.xml + + <bean id="accountDaoImpl" class="com.cloud.user.dao.AccountDaoImpl" /> + <bean id="accountDetailsDaoImpl" class="com.cloud.user.AccountDetailsDaoImpl" /> + <bean id="accountJoinDaoImpl" class="com.cloud.api.query.dao.AccountJoinDaoImpl" /> + <bean id="accountGuestVlanMapDaoImpl" class="com.cloud.network.dao.AccountGuestVlanMapDaoImpl" /> + <bean id="accountVlanMapDaoImpl" class="com.cloud.dc.dao.AccountVlanMapDaoImpl" /> + ... + + + + components are marked with @Component annotation + + @Component + @Local(value = { NetworkManager.class}) + public class NetworkManagerImpl extends ManagerBase implements NetworkManager, Listener { + static final Logger s_logger = Logger.getLogger(NetworkManagerImpl.class); + + + + As I know recently @Component is not recommended. + The fundamental functionality provided by the Spring Container is Dependency Injection (DI). To decouple Java components from other Java components the dependency to a certain other class should get injected into them rather that the class inself creates or finds this object. The general concept between dependency injection is called Inversion of Control. A class should not configure itself but should be configured from outside. A design based on independent classes / components increases the re-usability and possibility to test the software. Example of using DI in CloudStack is showed below: + + public class NetworkManagerImpl extends ManagerBase implements NetworkManager, Listener { + static final Logger s_logger = Logger.getLogger(NetworkManagerImpl.class); + + @Inject + DataCenterDao _dcDao = null; + @Inject + VlanDao _vlanDao = null; + @Inject + IPAddressDao _ipAddressDao = null; + @Inject + AccountDao _accountDao = null; + +
+
+ Management Server Startup + The MS startup process is defined in cloud-client-ui/WEB-INF/web.xml. The following items will be loaded sequentially: + + Log4jConfigListener. + ContextLoaderListener. + CloudStartupServlet. + ConsoleServlet. + ApiServlet. + + Of which, CloudStartupServlet will call to ComponentContext to init all of pre-defined components life cycle including configure() and start() phase. The components are divided into seven levels to consecutively startup. Of course, they must override configure() and start() methods. + + public interface ComponentLifecycle { + public static final int RUN_LEVEL_SYSTEM_BOOTSTRAP = 0; // for system level bootstrap components + public static final int RUN_LEVEL_SYSTEM = 1; // for system level service components (i.e., DAOs) + public static final int RUN_LEVEL_FRAMEWORK_BOOTSTRAP = 2; // for framework startup checkers (i.e., DB migration check) + public static final int RUN_LEVEL_FRAMEWORK = 3; // for framework bootstrap components(i.e., clustering management components) + public static final int RUN_LEVEL_COMPONENT_BOOTSTRAP = 4; // general manager components + public static final int RUN_LEVEL_COMPONENT = 5; // regular adapters, plugin components + public static final int RUN_LEVEL_APPLICATION_MAINLOOP = 6; + public static final int MAX_RUN_LEVELS = 7; + + + // configuration phase + Map<String, String> avoidMap = new HashMap<String, String>(); + for(int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) { + for(Map.Entry<String, ComponentLifecycle> entry : ((Map<String, ComponentLifecycle>)classifiedComponents[i]).entrySet()) { + ComponentLifecycle component = entry.getValue(); + String implClassName = ComponentContext.getTargetClass(component).getName(); + s_logger.info("Configuring " + implClassName); + + if(avoidMap.containsKey(implClassName)) { + s_logger.info("Skip configuration of " + implClassName + " as it is already configured"); + continue; + } + + try { + component.configure(component.getName(), component.getConfigParams()); + } catch (ConfigurationException e) { + s_logger.error("Unhandled exception", e); + throw new RuntimeException("Unable to configure " + implClassName, e); + } + + avoidMap.put(implClassName, implClassName); + } + } + + + // starting phase + avoidMap.clear(); + for(int i = 0; i < ComponentLifecycle.MAX_RUN_LEVELS; i++) { + for(Map.Entry<String, ComponentLifecycle> entry : ((Map<String, ComponentLifecycle>)classifiedComponents[i]).entrySet()) { + ComponentLifecycle component = entry.getValue(); + String implClassName = ComponentContext.getTargetClass(component).getName(); + s_logger.info("Starting " + implClassName); + + if(avoidMap.containsKey(implClassName)) { + s_logger.info("Skip configuration of " + implClassName + " as it is already configured"); + continue; + } + + try { + component.start(); + + if(getTargetObject(component) instanceof ManagementBean) + registerMBean((ManagementBean)getTargetObject(component)); + } catch (Exception e) { + s_logger.error("Unhandled exception", e); + throw new RuntimeException("Unable to start " + implClassName, e); + } + + avoidMap.put(implClassName, implClassName); + } + } + +
+
+ Network Architecture + Networking is the most important component in CloudStack, which serves network services from layer 2 to layer 7. In GsoC, fortunately I have a chance to learn about CloudsStack network architecture. It's really amazing. CloudStack's networking is divided to three parts: + NetworkGuru + NetworkGuru are responsible for: + + Design and implementation of virtual networks. + IP adress management. + + See full description about Network Guru on my wiki post: Add Xen/XCP support for GRE SDN controller + NetworkElement + NetworkElement in my opinion is the most important in CloudStack's networking. It represents components that are present in network. Such components can provide any kind of network service or support the virtual networking infrastructure and their interface is defined by com.cloud.network.element.NetworkElement. There are two things we attend in NetworkElement: services and elements. + CloudStack currently support network services below: + + Dhcp service. + Connectivity service. + Firewall service. + Load Balancing service. + Network ACL service. + Port Forwarding service. + SourceNat service. + StaticNat service. + UerData service. + Vpc service. + + Many Element implemented these above services. They are: + + MidonetElement. + BigSwitchVnsElement. + NiciraNvpElement. + BaremetalElement. + VirtualRouterElement. + VpcVirtualRouterElement. + CiscoVnmcElement. + JuniperSrxExternalFirewallElement. + ElasticLbElement. + F5ExternalLbElement. + CloudZoneNetworkElement. + BaremetalPxeElement. + BaremetalUserdataElement. + DnsNotifier. + OvsElement. + SecurityGroupElement. + + See full description about Network Element on my wiki post: Add Xen/XCP support for GRE SDN controller + In addition, Elements willing to support network services have to implement corresponding methods from ServicesProvider interfaces. For example, NiciraNvpElement want to support staticNat rule so it has to override applyStaticNats method. + NetworkManager + Network Manager handle the resources managed by the network elements. They are also implemented as many other "resource" managers in CloudStack. + For instance, the manager for setting up L2-in-L3 networks with Open vSwitch is OvsTunnelManagerImpl, whereas Virtual Router lifecycle is managed by VirtualApplianceManagerImpl. + In the project, I'm going to implement L3 services for sdn controller, so I need to understand how network services implement. +
+
+ Network Services + As I said in previous session, network services are represented in ServiceProvider interfaces. There are currently 12 service providers including: Dhcp, Firewall, IpDeployer, LoadBalancing, NetworkACL, PortForwarding, RemoteAccessVpn, Site2siteVpn, SourceNat, StaticNat, UserData and Vpc. In this session, I'll focus on L3 services implemented in CloudStack such as FirewallRule, PortForwardingRule, StaticNatRules, etc. All services are implemented at NetworkElement and every elements including network plugins (nicira nvp, bigswitch vns,...), which is willing to support them, must override from NetworkElement. For a clearly exlaination, I'll take the StaticNat service implemented in Nicira NVP plugin, source code can be found in NiciraNvpElement.java. + NiciraNvpElement firstly has to check whether it can handle the StaticNat service via canHandle() method: + + if (!canHandle(network, Service.StaticNat)) { + return false; + } + + + protected boolean canHandle(Network network, Service service) { + s_logger.debug("Checking if NiciraNvpElement can handle service " + + service.getName() + " on network " + network.getDisplayText()); + + //Check if network has right broadcast domain type + if (network.getBroadcastDomainType() != BroadcastDomainType.Lswitch) { + return false; + } + + //Check if NiciraNVP is the provider of the network + if (!_networkModel.isProviderForNetwork(getProvider(), + network.getId())) { + s_logger.debug("NiciraNvpElement is not a provider for network " + + network.getDisplayText()); + return false; + } + + //Check if NiciraNVP support StaticNat service + if (!_ntwkSrvcDao.canProviderSupportServiceInNetwork(network.getId(), + service, Network.Provider.NiciraNvp)) { + s_logger.debug("NiciraNvpElement can't provide the " + + service.getName() + " service on network " + + network.getDisplayText()); + return false; + } + + return true; + } + + NiciraNvp checks whether it is the provider of the network and it can support StaticNat service or not. After the checking, it makes a staticNat rely on their own Logical Router, that I won't report detail here. + The sequence diagram for applying a L3 service is described below: + + + + + network_service.png: Network services implementation sequence diagram. + + After understanding network architecture and services implementation, I decided to improve Ovs plugin to support L3 services. Because it's the native sdn controller, I want to use Virtual Router for L3 services deployment. This work will be done when I call L3 services execution from OvsElement to VirtualRouterManager. With Xen hosts, VirtualRouterElement execute L3 services via xapi plugin calls. I make a flow which describes more detail about the process below + + + + + l3_services.png: Layer 3 services implementation in Ovs plugin. + + In Xen, all of L3 services are executed via a Xapi plugin naming "vmops". Default, Virtual Routers (VR) control and manage network services. In this case, "vmops" forwards request to network-responsibility shellscripts such as call_firewall.sh or call_loadbalancer.sh. They then parse parameters and call to shellscripts placed in VR via ssh. For example, if we define a staticNat rule, the process occurs as follow: + VR Manager (VirtualNetworkApplianceManager) send staticNat command to AgentManager: + + try { + answers = _agentMgr.send(router.getHostId(), cmds); + } catch (OperationTimedoutException e) { + s_logger.warn("Timed Out", e); + throw new AgentUnavailableException("Unable to send commands to virtual router ", router.getHostId(), e); + } + + AgentManager makes a xapi plugin call to host containing the VR + + String result = callHostPlugin(conn, "vmops", "setFirewallRule", "args", args.toString()); + + "vmops" forwards the request to "call_firewall" shellscript + + @echo + def setFirewallRule(session, args): + sargs = args['args'] + cmd = sargs.split(' ') + cmd.insert(0, "/usr/lib/xcp/bin/call_firewall.sh") + cmd.insert(0, "/bin/bash") + try: + txt = util.pread2(cmd) + txt = 'success' + except: + util.SMlog(" set firewall rule failed " ) + txt = '' + + return txt + + "call_firewall" parses the parameters and directly request to a shellscript placed in VR via ssh command + + ssh -p 3922 -q -o StrictHostKeyChecking=no -i $cert root@$domRIp "/root/firewall.sh $*" + + That's all. "firewall" script set some iptable rules for executing the staticNat rule +
+
+ Opendaylight Controller + The project need to add an open source Openflow controller, and I decided to choose Opendaylight. + Opendaylight (ODL) is an interesting experience that I have in GSoC. Before starting project, I still confused between many open source OpenFlow controller such as POX, NOX, Beacon, Floodlight, Opendaylight... Honestly, I do not have large knowledge of OpenFlow protocol and also open source SDN controller at the beginning of project. When the project was in progress, I chose Floodlight, a safe solution because of its rich of functionality and good documents. However, Sebastien Goasguen, CloudStack GSoC manager, recommended me to try Opendaylight. From the collected information, I found that Opendaylight are getting a lot of attentions from the community. + At the moment, ODL has three main projects: + + Opendaylight Controller. + Opendaylight Network Virtualization Platform. + Opendaylight Virtual Tennant Network. + + It also has six incubating projects: + + YANG Tools. + LISP Flow Mapping. + OVSDB Integration. + Openflow Protocol Library. + BGP-LS/PCEP. + Defense4All. + + For integrating Opendaylight to control and manage network services, I chose ODL Controller project, which is developed by Cisco programmers. The ODL controller is a pure software and as a JVM it can be run on any OS as long as it supports Java. The structure of the ODL controller is shown below: + + + + + odl_structure.jpg: Opendaylight Controller architecture. + + The structure is separated to three layers: + + Network Apps and Orchestration: the top layer consists of applications that utilize the network for normal network communications. Also included in this layer are business and network logic applications that control and monitor network behavior. + Controller Platform: the middle layer is the framework in which the SDN abstractions can manifest; providing a set of common APIs to the application layer (commonly referred to as the northbound interface), while implementing one or more protocols for command and control of the physical hardware within the network (typically referred to as the southbound interface). + Physical and Virtual Network Devices: The bottom layer consists of the physical and virtual devices, switches, routers, etc., that make up the connective fabric between all endpoints within the network. + + This controller is implemented strictly in software and is contained within its own Java Virtual Machine (JVM). + Source code can be cloned from git: + + git clone https://git.opendaylight.org/gerrit/p/controller.git + + Applications make request to ODL Northbound API via HTTP. Currently, ODL supports not too much services. All REST API we can find here: ODL Controller REST API + For example, we can add query list of exist flows configured on a Node in a give container. + + GET http://controller-ip/controller/nb/v2/flow/{containerName}/{nodeType}/{nodeId} + {containername}: name of the container. The container name for the base controller is “default” + {nodeType}: type of the node being programmed + {nodeId}: node identifier + + Or we can add a new flow + + POST http://controller-ip/controller/nb/v2/flow/{containerName}/{nodeType}/{nodeId}/{name} + + with request body in XML or JSON format + + { "actions" : [ "...", ... ], + "nwDst" : "...", + "hardTimeout" : "...", + "installInHw" : "...", + "tosBits" : "...", + "cookie" : "...", + "node" : { "id" : "...", "type" : "..." }, + "dlDst" : "...", + "name" : "...", + "nwSrc" : "...", + "vlanPriority" : "...", + "protocol" : "...", + "priority" : "...", + "vlanId" : "...", + "tpDst" : "...", + "etherType" : "...", + "tpSrc" : "...", + "ingressPort" : "...", + "idleTimeout" : "...", + "dlSrc" : "..." } + + The following python client writen by Dwcarder describe more specific about using REST API:https://github.com/dwcarder/python-OpenDaylight/blob/master/OpenDaylight.py + In project, I learnt how to make HTTP request from CloudStack to ODL for controlling and managing network services. However, there is a problem that ODL currently don't support L2 configuration, while integration ODL to CloudStack requires this. I found an incubating project, led by Brent Salisbury and Evan Zeller from the University of Kentucky, is currently trying to integrate OpenvSwitch database management protocol to ODL, which will allow ODL to view, modify and delete OpenvSwitch object such as bridges and ports by way of the OpenvSwitch databse. In short, this project mainly creates a module acts like OVSDB-client and uses JSON-RPC for remote management. I talked to them and jumped into this project. Thus, I'll do an extra work on ODL community to improve ODL Controller support L2 configuration while still integrate ODL to CloudStack by making a new ODL plugin with the same behavior of NiciraNvp and Ovs. + Full information about the incubating project can be found here:https://wiki.opendaylight.org/view/Project_Proposals:OVSDB-Integration + The next session I will take a short description about XenAPI (also called Xapi), which applications use to interact virtualization resources in Xen hosts. +
+
+ Xen API + There are many tool stacks we can use to manage Xen hosts, such as: XL, Xapi, libvirt or Xend. Of which, Xapi is the default. Xapi (or Xen API) is called from applications to control and manage virtualization resources in Xen hosts via XML-RPC. Xapi is the core component of XCP and XenServer and writen by Ocaml language. + It's possible to talk directly to Xapi using XML-RPC. This is a way to make remote procedure calls using http requests. In fact, it's possible to send and receive messages using telnet but this is not recommended. The XML-RPC calls are the fixed standard, but we also have bindings to that XML-RPC for Python, C and Java. + For example about using XML-RPC calls, I make a simple request written by python to list all VMs on a Xen host. + First thing we need to import XenAPI lib: + + >>> import XenAPI + + Then we have to authenticate to XenServer or XCP addressed from url with user and password + + >>> session = XenAPI.Session('https://url') + >>> session.login_with_password('user','password') + + If this works, we've done the hard bit and established communications with our server. Function bellow will list all Vms on this server. + + >>> session.xenapi.VM.get_all() + + The answer should be something like: + + ['OpaqueRef:7b737e4f-58d8-b493-ea31-31324a2de528', 'OpaqueRef:7237b8af-b80c-c021-fbdc-68146d98d7f5', ........., 'OpaqueRef:c3b752b9-1926-9ceb-f36a-408497c3478b'] + + Which is a list of strings, each of which represents a unique identifier for a particular 'object' on the server. In this case of each 'OpaqueRef' represents a virtual machine. For each VM we can get the name (name_label) + + >>> [session.xenapi.VM.get_name_label(x) for x in session.xenapi.VM.get_all()] + + There are a lot of machines in this list. Some of them however are 'template Vms', frozen copies which can't actually run, but which can be cloned in oder to make real virtual machines. We can find out which Vms are templates by calling the VM.get_is_a_template() function. So let's combinate the two in order to produce a list of all the real Vms on my server: + + >>> [session.xenapi.VM.get_name_label(x) for x in session.xenapi.VM.get_all() if not session.xenapi.VM.get_is_a_template(x)] + + The answer should be something like: + + ['Debian Etch 4.0 (2)', 'Debian Etch 4.0 (1)', 'test9', 'test4', 'Control domain on host: ebony', 'Control domain on host: localhost.localdomain', 'test3', 'Debian Sarge 3.1 (1)', 'test2', 'Debian Etch 4.0 (3)', 'test1', 'test3', 'test7', 'test5'] + + Finally it's only polite to log out of the server. This allows it to garbage collect the no-longer active session. + + >>> session.logout() + + Full python script can be found here: Xapi python client + We can find Xapi source code from: https://github.com/xen-org/xen-api + Xapi come with some main classes, each of them refer to a virtual resource object in Xen such as: + + VM: refer to virtual machine. + VIF: refer to virtual NIC. + VDI: refer to virtual volume or hard disk. + ... + + Full information about Xapi source code we can find here. http://docs.vmd.citrix.com/XenServer/6.0.0/1.0/en_gb/api/ Click on each item we can see more detail. + Xapi plugin + Xapi has an extension mechanism that allows one to install a Python script (usually but it can be any executable) on the Xen host, and then call that through the Xapi. Writing a Xapi plugin in Python is simplified by using the XenAPIPlugin module, which is by default installed in dom0 in XCP. In my GsoC project, I have to call some plugin scripts to control and manage virtual switches. For example, I inserted a new function to get network name-label in vmops script. + Then, we can call it directly from XE command line or via XML-RPC. Here is a simple call from XE: + + $xe host-call-plugin host-uuid=host-uuid plugin=vmops fn=getLabel + + If the plugins has some arguments, it should be inserted with "args:" keyword. + In ACS, almost plugins are called from CitrixResourceBase.java. With my above function, I inserted a new method into CitrixResourceBase.java and called to the plugin as below: + + private String getLabel() { + Connection conn = getConnection(); + String result = callHostPlugin(conn, "ovstunnel", "getLabel"); + return result; + } + + Of which, Connection class will init a session to Xen host and callHostPlugin method executes a XML-RPC call to plugin. + Note that every Xapi plugin scripts must be placed into /etc/xapi.d/plugins. +
+
+ What I've done + In one-and-a-half month, I have understood all of above knowledge and finished two things: + + improve gre controller to support XCP. + re-factor GRE source code by following NiciraNVP plugin design. + + improve gre controller to support XCP + From the understanding of how the native SDN works, a small patch has been made to help it works with Xen Cloud Platform (XCP) version 1.6. Without the patch, this controller can serve XenServer only, the commercial version of XCP. I did try SDN with XCP and debug to find out what errors are and why they occur. After some efforts, I figured out following problems: + + The SDN controller has to know what interface it'll deploy GRE tunnels. To do this check, it looks into network to find out the PIF's interface. It has a network name-label, which user defined in the deploy zone phase. If not, it will be replaced by a default label. However, XCP's network has no user-defined or default name-label. Therefore in this step I have made a trick. I used whatever name-label found in the XCP host to bypass this check. + When creating an OVS bridge, the controller creates a new dom0 vif, plugs to the bridge and immediately unplugs it. This action aims to ask XenServer create the bridge without running ovs-vsctl or brctl script. I saw that it is not very important to XCP hosts and also generates an error from xenopsd daemon, so I ignored this step. + The script playing a direct role to interact with openvswitch is ovstunnel. It requires a lib named cloudstack_pluginlib, which does not exist in XCP. Thus, I inserted this file into copying process from CloudStack to XCP when add-host phase occurs. + The "setup_ovs_bridge" function in ovstunnel takes a look into XenServer version to act a blocking IPv6. However, product_version parameter does not exist on XCP. It uses platform_version parameter instead. So, I decided to ignore this step. + + The patch is already committed to sdnextensions branch. It is also the primary branch I have been working on this GSoC period. + re-factor GRE source code by following NiciraNVP plugin design + GRE source code was re-factored with following changes: + + add Connectivity service checking: All of L2 configuration methods now have to check whether Ovs plugin can handle Connectivity service.. + move commands / answers to a new package: com.cloud.agent.api. + add new NetworkProvider: Ovs. + add L3 services to Ovs Capabilities: Ovs Capability now is set enabled to such L3 services as SourceNat, StaticNat, PortForwarding, RedundantRouter, Gateway. L2 service Connectivity is also set enabled. + add L3 services prototype code to OvsElement.java + + With the knowledge about CloudStack's network architecture I have learned and represented above, I made a patch which permits guest networks can reach each other via private IPaddress without using VPC mode. Proposal can be found here: Routing between guest networks + In next days, I will done the following things: + + implement L3 services with Virtual Router. + improve Ovs to support KVM hypervisor. + add new ODL plugin using ODL controller to control and manager network services. + +
diff --git a/docs/en-US/images/l3_services.png b/docs/en-US/images/l3_services.png new file mode 100644 index 0000000000000000000000000000000000000000..f68aaf33745ce7b8ee2cdd3b62256f442823c3bb GIT binary patch literal 30362 zcmce;by$?`7cM%8N=b-_N{T^;(hUwG-QCjN-3B2b-Cfcp4N?jM(jX-*(jC%y7XJ3W z&ffc+YhP!dnm_!8`DWgE=ZUrMb>H`T0%WB{urY}+5eNjfnCMG+1OjCbfw=Y*{TjSd z$e-K^|3S4!iYcO_qfgAr{DwatI0&mcC|DagIP2OOB8;u9Ee#p$_3aD|t?W kx)L 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
%sA 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 A1ONa4 literal 0 HcmV?d00001 diff --git a/docs/en-US/images/network_service.png b/docs/en-US/images/network_service.png new file mode 100644 index 0000000000000000000000000000000000000000..95281aa2daaf34767bdb553a1bfdb25748503ee0 GIT binary patch literal 28162 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≤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 Date: Sun, 28 Jul 2013 14:56:03 +0530 Subject: [PATCH 117/907] Cloudstack-2622 createipAlias.sh/deleteipAliash.sh should not be allowed with Isolated Guest Networks Signed-off-by: Abhinandan Prateek --- .../network/router/VirtualNetworkApplianceManagerImpl.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index d43007abb8d..8262aceb279 100755 --- a/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -2480,7 +2480,8 @@ public class VirtualNetworkApplianceManagerImpl extends ManagerBase implements V } } //Reapply dhcp and dns configuration. - if (_networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Dhcp, provider)) { + Network guestNetwork = _networkDao.findById(guestNetworkId); + if (guestNetwork.getGuestType()==GuestType.Shared && _networkModel.isProviderSupportServiceInNetwork(guestNetworkId, Service.Dhcp, provider)) { Map dhcpCapabilities = _networkSvc.getNetworkOfferingServiceCapabilities(_networkOfferingDao.findById(_networkDao.findById(guestNetworkId).getNetworkOfferingId()), Service.Dhcp); String supportsMultipleSubnets = dhcpCapabilities.get(Network.Capability.DhcpAccrossMultipleSubnets); if (supportsMultipleSubnets != null && Boolean.valueOf(supportsMultipleSubnets)) { From 8edf6b346789f826847245472977913b56bce17e Mon Sep 17 00:00:00 2001 From: Rajesh Battala Date: Sat, 27 Jul 2013 18:25:04 +0530 Subject: [PATCH 118/907] CLOUDSTACK-3215 Logs in the Software router are not being rotated --- patches/pom.xml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/patches/pom.xml b/patches/pom.xml index 00eec02ddc9..438ec6e03aa 100644 --- a/patches/pom.xml +++ b/patches/pom.xml @@ -60,9 +60,16 @@ filemode="755"> + + + + + + From 63fea5e94e50c0bd9f01045f67befa9673ad7dc5 Mon Sep 17 00:00:00 2001 From: Rajesh Battala Date: Sat, 27 Jul 2013 20:28:03 +0530 Subject: [PATCH 119/907] CLOUDSTACK-3877 Unable to Resize Volume (kvm, vmware) --- engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java index 7696bcce597..e6595b2fc71 100755 --- a/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java +++ b/engine/schema/src/com/cloud/storage/dao/VolumeDaoImpl.java @@ -241,7 +241,12 @@ public class VolumeDaoImpl extends GenericDaoBase implements Vol pstmt.setLong(1, volumeId); ResultSet rs = pstmt.executeQuery(); if (rs.next()) { - return HypervisorType.getType(rs.getString(1)); + String hypervisor; + if (rs.getString(1) != null) + hypervisor = rs.getString(1); + else + hypervisor = rs.getString(2); + return HypervisorType.getType(hypervisor); } return HypervisorType.None; } catch (SQLException e) { From 1b398aa3fcc05cccdcc35267ebe97c1bd1145ff8 Mon Sep 17 00:00:00 2001 From: Rajesh Battala Date: Sat, 27 Jul 2013 20:28:41 +0530 Subject: [PATCH 120/907] CLOUDSTACK-3846 usage event is not generated for volume resize --- server/src/com/cloud/storage/VolumeManagerImpl.java | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/server/src/com/cloud/storage/VolumeManagerImpl.java b/server/src/com/cloud/storage/VolumeManagerImpl.java index e6d403cd275..2a97b0b5284 100644 --- a/server/src/com/cloud/storage/VolumeManagerImpl.java +++ b/server/src/com/cloud/storage/VolumeManagerImpl.java @@ -31,10 +31,6 @@ import java.util.concurrent.ExecutionException; import javax.inject.Inject; import javax.naming.ConfigurationException; -import org.apache.commons.lang.StringUtils; -import org.apache.log4j.Logger; -import org.springframework.stereotype.Component; - import org.apache.cloudstack.api.BaseCmd; import org.apache.cloudstack.api.command.user.volume.AttachVolumeCmd; import org.apache.cloudstack.api.command.user.volume.CreateVolumeCmd; @@ -74,6 +70,9 @@ 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.image.datastore.ImageStoreEntity; +import org.apache.commons.lang.StringUtils; +import org.apache.log4j.Logger; +import org.springframework.stereotype.Component; import com.cloud.agent.AgentManager; import com.cloud.agent.api.Answer; @@ -1265,6 +1264,11 @@ public class VolumeManagerImpl extends ManagerBase implements VolumeManager { volume.setDiskOfferingId(cmd.getNewDiskOfferingId()); } _volsDao.update(volume.getId(), volume); + // Log usage event for volumes belonging user VM's only + UsageEventVO usageEvent = new UsageEventVO( + EventTypes.EVENT_VOLUME_RESIZE, volume.getAccountId(), + volume.getDataCenterId(), volume.getId(), volume.getName(), volume.getDiskOfferingId(), volume.getTemplateId(), volume.getSize()); + _usageEventDao.persist(usageEvent); /* Update resource count for the account on primary storage resource */ if (!shrinkOk) { From 3a3145507d8b68b13d4320847511aaacc25475e5 Mon Sep 17 00:00:00 2001 From: Gaurav Aradhye Date: Mon, 29 Jul 2013 01:43:58 -0400 Subject: [PATCH 121/907] CLOUDSTACK-3841: Fixed test case issue. The exception raised earlier was valid behaviour, added missing assertRaiss statement Signed-off-by: Prasanna Santhanam (cherry picked from commit 67c96d419d08f5a2702eee0aa64958e486f74703) --- test/integration/component/test_security_groups.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/test/integration/component/test_security_groups.py b/test/integration/component/test_security_groups.py index 3c25e25a34f..5ec3ffb00d5 100644 --- a/test/integration/component/test_security_groups.py +++ b/test/integration/component/test_security_groups.py @@ -1111,7 +1111,8 @@ class TestDeleteSecurityGroup(cloudstackTestCase): self.debug("Deploying VM in account: %s" % self.account.name) # Deleting Security group should raise exception - security_group.delete(self.apiclient) + with self.assertRaises(Exception): + security_group.delete(self.apiclient) #sleep to ensure that Security group is deleted properly time.sleep(self.services["sleep"]) From 4054a8e2ac91eee6cbc0c63094016068bdbe62b8 Mon Sep 17 00:00:00 2001 From: Girish Shilamkar Date: Thu, 25 Jul 2013 01:52:26 -0400 Subject: [PATCH 122/907] CLOUDSTACK-3454: Fix test_portable_publicip Added isportable param to associateIP API. Fixed base class for PortableIP tio call portableip APIs. Removed test_createPortablePublicIPAcquire from basic zone run requires additional network creation handling which can be done in component tests. Signed-off-by: Prasanna Santhanam --- test/integration/smoke/test_portable_publicip.py | 8 +++++--- tools/marvin/marvin/integration/lib/base.py | 7 +++++-- 2 files changed, 10 insertions(+), 5 deletions(-) diff --git a/test/integration/smoke/test_portable_publicip.py b/test/integration/smoke/test_portable_publicip.py index 9a3a398c17a..73f745cfa4a 100644 --- a/test/integration/smoke/test_portable_publicip.py +++ b/test/integration/smoke/test_portable_publicip.py @@ -219,7 +219,7 @@ class TestPortablePublicIPAcquire(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - @attr(tags = ["simulator", "basic", "advanced", "portablepublicip"]) + @attr(tags = ["simulator", "advanced", "portablepublicip"]) def test_createPortablePublicIPAcquire(self): """ Test to acquire a provisioned public ip range """ @@ -229,7 +229,9 @@ class TestPortablePublicIPAcquire(cloudstackTestCase): self.services ) - ip_address = PublicIPAddress.create(self.api_client, self.account.name, self.zone.id, self.account.domainid) + ip_address = PublicIPAddress.create(self.api_client, self.account.name, + self.zone.id, self.account.domainid, True) + ip_address.delete(self.api_client) self.portable_ip_range.delete(self.apiclient) - return \ No newline at end of file + return diff --git a/tools/marvin/marvin/integration/lib/base.py b/tools/marvin/marvin/integration/lib/base.py index 2f834be188c..b552aba068c 100755 --- a/tools/marvin/marvin/integration/lib/base.py +++ b/tools/marvin/marvin/integration/lib/base.py @@ -1074,7 +1074,7 @@ class PublicIPAddress: @classmethod def create(cls, apiclient, accountid=None, zoneid=None, domainid=None, - services=None, networkid=None, projectid=None, vpcid=None): + isportable=None, services=None, networkid=None, projectid=None, vpcid=None): """Associate Public IP address""" cmd = associateIpAddress.associateIpAddressCmd() @@ -1093,6 +1093,9 @@ class PublicIPAddress: elif "domainid" in services: cmd.domainid = services["domainid"] + if isportable: + cmd.isportable = isportable + if networkid: cmd.networkid = networkid @@ -2271,7 +2274,7 @@ class PortablePublicIpRange: cmd.regionid = services["regionid"] cmd.vlan = services["vlan"] - return PortablePublicIpRange(apiclient.createVlanIpRange(cmd).__dict__) + return PortablePublicIpRange(apiclient.createPortableIpRange(cmd).__dict__) def delete(self, apiclient): """Delete portable IpRange""" From 2238e2bbc5863ce926341b2d91fd4bc8bca1c873 Mon Sep 17 00:00:00 2001 From: Meng Han Date: Mon, 29 Jul 2013 11:26:17 -0400 Subject: [PATCH 123/907] [GSOC] Meng's mid-term report Signed-off-by: Sebastien Goasguen --- docs/en-US/gsoc-midsummer-meng.xml | 196 ++++++++++++++++++- docs/en-US/images/clusterDefinition.png | Bin 0 -> 52607 bytes docs/en-US/images/launchHadoopClusterApi.png | Bin 0 -> 13427 bytes docs/en-US/images/launchHadoopClusterCmd.png | Bin 0 -> 83972 bytes docs/en-US/images/whirrDependency.png | Bin 0 -> 10794 bytes docs/en-US/images/whirrOutput.png | Bin 0 -> 61831 bytes 6 files changed, 192 insertions(+), 4 deletions(-) create mode 100644 docs/en-US/images/clusterDefinition.png create mode 100644 docs/en-US/images/launchHadoopClusterApi.png create mode 100644 docs/en-US/images/launchHadoopClusterCmd.png create mode 100644 docs/en-US/images/whirrDependency.png create mode 100644 docs/en-US/images/whirrOutput.png diff --git a/docs/en-US/gsoc-midsummer-meng.xml b/docs/en-US/gsoc-midsummer-meng.xml index 1ab07cb93b8..ee24cf4a990 100644 --- a/docs/en-US/gsoc-midsummer-meng.xml +++ b/docs/en-US/gsoc-midsummer-meng.xml @@ -11,9 +11,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 @@ -23,6 +23,194 @@ -->

- Mid-Summer Progress Updates - This section describes ... + Mid-Summer Progress Updates for Meng - "Hadoop Provisioning on Cloudstack Via Whirr" + + In this section I describe my progress with the project titled "Hadoop Provisioning on CloudStack Via Whirr" +
+ Introduction + + It has been five weeks since the GSOC 2013 is kick-started. During the last five weeks I have been constantly learning from the CloudStack Community in aspects of both knowledge and personality. The whole community is very accommodating and willing to help newbies. I am making progress steadily with the community's help. This is my first experience working with such a large and cool code base, definitely a challenging and wonderful experience for me. Though I am a little slipped behind my schedule, I am making my best effort and hoping to complete what I set out in my proposal by the end of this summer. + + + + +
+
+ CloudStack Installation + + I spent two weeks or so on the CloudStack Installation. In the beginning, I am using the Ubuntu systems. Given that I am not familiar with maven and a little scared by various kinds of errors and exceptions during system deployment, I failed to deploy CloudStack through building from the source. With Ian's advice, I switched to CentOS and began to use rpm packages for installation, things went much smoother. By the end of the second week, I submitted my first patch -- CloudStack_4.1_Quick_Install_Guide. + + +
+
+ Deploying a Hadoop Cluster on CloudStack via Whirr + + Provided that CloudStack is in place and I can register templates and add instances, I went ahead to use Whirr to deploy a hadoop cluster on CloudStack. The cluster definition file is as follows: + + + + + + + + whirr.cluster-name: the name of your hadoop cluster. + whirr.store-cluster-in-etc-hosts: store all cluster IPs and hostnames in /etc/hosts on each node. + whirr.instance-templates: this specifies your cluster layout. One node acts as the jobtracker and namenode (the hadoop master). Another two slaves nodes act as both datanode and tasktracker. + image-id: This tells CloudStack which template to use to start the cluster. + hardware-id: This is the type of hardware to use for the cluster instances. + + private/public-key-file: :the key-pair used to login to each instance. Only RSA SSH keys are supported at this moment. Jclouds will move this key pair to the set of instances on startup. + whirr.cluster-user: this is the name of the cluster admin user. + whirr.bootstrap-user: this tells Jclouds which user name and password to use to login to each instance for bootstrapping and customizing each instance. You must specify this property if the image you choose has a hardwired username/password.(e.g. the default template CentOS 5.5(64-bit) no GUI (KVM) comes with Cloudstack has a hardcoded credential: root:password), otherwise you don't need to specify this property. + whirr.env.repo: this tells Whirr which repository to use to download packages. + whirr.hadoop.install-function/whirr.hadoop.configure-function :it's self-explanatory. + + + + + Output of this deployment is as follows: + + + + + + + + + + Other details can be found at this post in my blog. In addition I have a Whirr trouble shooting post there if you are interested. + +
+
+ Elastic Map Reduce(EMR) Plugin Implementation + + Given that I have completed the deployment of a hadoop cluster on CloudStack using Whirr through the above steps, I began to dive into the EMR plugin development. My first API is launchHadoopCluster, it's implementation is quite straight forward, by invoking an external Whirr command in the command line on the management server and piggybacking the Whirr output in responses.This api has a structure like below: + + + + + +The following is the source code of launchHadoopClusterCmd.java. + + + + + + + You can invoke this api through the following command in CloudMonkey: + > launchHadoopCluster config=myhadoop.properties + +This is sort of the launchHadoopCluster 0.0, other details can be found in this post . + +My undergoing working is modifying this api so that it calls Whirr libraries instead of invoking Whirr externally in the command line. +First add Whirr as a dependency of this plugin so that maven will download Whirr automatically when you compile this plugin. + + + + + + + +I am planning to replace the Runtime.getRuntime().exec() above with the following code snippet. + + LaunchClusterCommand command = new LaunchClusterCommand(); + command.run(System.in, System.out, System.err, Arrays.asList(args)); + + +Eventually when a hadoop cluster is launched. We can use Yarn to submit hadoop jobs. +Yarn exposes the following API for job submission. +ApplicationId submitApplication(ApplicationSubmissionContext appContext) throws org.apache.hadoop.yarn.exceptions.YarnRemoteException +In Yarn, an application is either a single job in the classical sense of Map-Reduce or a DAG of jobs. In other words an application can have many jobs. This fits well with the concepts in EMR design. The term job flow in EMR is equivalent to the application concept in Yarn. Correspondingly, a job flow step in EMR is equal to a job in Yarn. In addition Yarn exposes the following API to query the state of an application. +ApplicationReport getApplicationReport(ApplicationId appId) throws org.apache.hadoop.yarn.exceptions.YarnRemoteException +The above API can be used to implement the DescribeJobFlows API in EMR. + + + + +
+
+ Learning Jclouds +As Whirr relies on Jclouds for clouds provisioning, it's important for me to understand what Jclouds features support Whirr and how Whirr interacts with Jclouds. I figured out the following problems: + +How does Whirr create user credentials on each node? + +Using the runScript feature provide by Jclouds, Whirr can execute a script at node bootup, one of the options in the script is to override the login credentials with the ones that provide in the cluster properties file. The following line from Whirr demonstrates this idea. +final RunScriptOptions options = overrideLoginCredentials(LoginCredentials.builder().user(clusterSpec.getClusterUser()).privateKey(clusterSpec.getPrivateKey()).build()); + + + +How does Whirr start up instances in the beginning? +The computeService APIs provided by jclouds allow Whirr to create a set of nodes in a group(specified by the cluster name),and operate them as a logical unit without worrying about the implementation details of the cloud. +Set<NodeMetadata> nodes = (Set<NodeMetadata>)computeService.createNodesInGroup(clusterName, num, template); + The above command returns all the nodes the API was able to launch into in a running state with port 22 open. +How does Whirr differentiate nodes by roles and configure them separately? +Jclouds commands ending in Matching are called predicate commands. They allow Whirr to decide which subset of nodes these commands will affect. For example, the following command in Whirr will run a script with specified options on nodes who match the given condition. + +Predicate<NodeMetadata> condition; +condition = Predicates.and(runningInGroup(spec.getClusterName()), condition); +ComputeServiceContext context = getCompute().apply(spec); +context.getComputeService().runScriptOnNodesMatching(condition,statement, options); + +The following is an example how a node playing the role of jobtracker in a hadoop cluster is configured to open certain ports using the predicate commands. + + Instance jobtracker = cluster.getInstanceMatching(role(ROLE)); // ROLE="hadoop-jobtracker" + event.getFirewallManager().addRules( + Rule.create() + .destination(jobtracker) + .ports(HadoopCluster.JOBTRACKER_WEB_UI_PORT), + Rule.create() + .source(HadoopCluster.getNamenodePublicAddress(cluster).getHostAddress()) + .destination(jobtracker) + .ports(HadoopCluster.JOBTRACKER_PORT) + ); + + + +With the help of such predicated commands, Whirr can run different bootstrap and init scripts on nodes with distinct roles. + + + + + + +
+
+ Great Lessons Learned + + I am much appreciated with the opportunity to work with CloudStack and learn from the lovable community. I can see myself constantly evolving from this invaluable experience both technologically and psychologically. There were hard times that I were stuck on certain problems for days and good times that made me want to scream seeing problem cleared. This project is a great challenge for me. I am making progress steadily though not smoothly. That's where I learned the following great lessons: + + + + + + When you work in an open source community, do things in the open source way. There was a time when I locked myself up because I am stuck on problems and I am not confident enough to ask them on the mailing list. The more I restricted myself from the community the less progress I made. Also the lack of communication from my side also prevents me from learning from other people and get guidance from my mentor. + + + CloudStack is evolving at a fast pace. There are many APIs being added ,many patches being submitted every day. That's why the community use the word "SNAPSHOT" for each version. At this moment I am learning to deal with fast code changing and upgrading. A large portion of my time is devoted to system installation and deployment. I am getting used to treat system exceptions and errors as a common case. That's another reason why communication with the community is critical. + + + + + In addition to the project itself, I am strengthening my technical suite at the same time. + + +I learned to use some useful software tools: maven, git, publican, etc. + + +Reading the source code of Whirr make me learn more high level java programming skills, e.g. using generics, wildcard, service loader, the Executor model, Future object, etc . + + + I am exposed to Jclouds, a useful cloud neutral library to manipulate different cloud infrastructures. + + I gained deeper understanding of cloud web services and learned the usage of several cloud clients, e.g. Jclouds CLI, CloudMonkey,etc. + + + + + + + + + I am grateful that Google Summer Of Code exists, it gives us students a sense of how fast real-world software development works and provides us hand-on experience of coding in large open source projects. More importantly it's a self-challenging process that strengthens our minds along the way. +
diff --git a/docs/en-US/images/clusterDefinition.png b/docs/en-US/images/clusterDefinition.png new file mode 100644 index 0000000000000000000000000000000000000000..6170f9fb6ae206b05c543defb8041a150aa8f939 GIT binary patch literal 52607 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 XQB|6*HOGLr4MFlxRiuj~P2T)Ji9G4- literal 0 HcmV?d00001 diff --git a/docs/en-US/images/launchHadoopClusterCmd.png b/docs/en-US/images/launchHadoopClusterCmd.png new file mode 100644 index 0000000000000000000000000000000000000000..66a0c75ed647d0026c087044892d526dd60eeda4 GIT binary patch literal 83972 zcmbTe1yojR`|dlDZUh7g2?az_T1py0>6Au78l*dv?vieh?(Pt!ySt=8y8ApX*Z1G+ zTWjro_BnGn218)*zV9=ixUcK_-P2!2>J>T)AqoUR=;C6+au9S+8-if9k?w)-z_|&r zfG@Dtg5nBDNJukF(u?4~1U4dXZR9Q9+t|Oe(uWMpEzI=kt#z&R_06pfEo}B+n_of@ z86++&px}`BGs#gM=ha=uQ*uOPP9$=y-8cMjvipJ+s-+GduNn)_bn_?kTrbOg$6xM@ zoI0xJy>v}}X+}CQJ`TJ6(N6>}&!dw*W|qUMN3t~zwyc>CPZy=j^zFU$-K!|Rh@_;X z0he`d?)vhCiwG<@7~}hjc?(kfzpnjz+J>moPec7t?)|zxt)uC9P>}t)WMG;2v9W$# zIUgUAA%jnagfyCZcCnt4FCFgJuFz>MB3-Pvunvj8r%Q4 zpduI@vH6ziTBK&d~hbl!9{h(2JTZB@)X>Q;+~j1=^@+@-W= zXo{We*AbKroLAe+W89_tx)GtUE(!+Uoz_H8h8i?Ghxv|cXB`#sg-zj2;P>XdcUfBiihV% z-?P1vQdXgAQqBfUXdk>uK6zWh@NT_5x67UW;2s0Vnl!cBgSmmzal8a&M#rjFgtV^p zSKk^?ynpP3hBlCvOm)qxK1Cc|A%e>zL$W#wz4AAj;%&q>v0n0tYO4Ci^w~E*GS0tL z>hs1dj3$CMte&ybd~jz?Fs+M5($7rhi_F2!)G)s!BIVTFIo?LfP~)FwbR=srIT&FO zWP-YsU{N4*OpDS(B8`l7GhDEPJi?b+Djn-oV2^fjINpQHtjWMA2TD(|<-*>zx@pvy&xFg$4YmX6k z-=c%!_AI;S?%FUECNfRm?zmTczhLkMznzVp*2T@PuZ0C0%MvV7goS#&KLzB~6b#Y+Y)_GZdJ zQ1I(M#v&PNT$5|p_tFVLR9!2FsbQT34LS%y3j-a_Ic>w`s82bkhI16gg2P~qBVh0` zp_-V)`;St_X|RtReR^Ei`xCcNES8xN%r$Ae%XDv;j}2PB@~jrzkktc(n0S&msNj?K2N z9u?BwCTu=yzTW-%?Gya`$e==;gd5j}sFVOf%s18Tz2&8~AoG~+mA#uAHHEFq)nfWY zZlN)muv57i`R9*3_;CmkJ3sf%K8qyolQ`c=4|$U&Ym44j)PG6``~HC@f0( z=gY34v8keLWjR@mZS4#yWw+*|ugUZToZhA41RMPKq~p1D13U{eN#YV?qi^O0 zVqh^Fzv*pcwDI;bPBmM9JGH$%$i?&&e4Jg!#dN$0d6-nEzoE%naNb5I40gIzJ(o$! z3^mq_5kXB`Y}u8R@NpB^d=g$G#L54D zHHz*i$=Ts9q-I58O#K{JP?Z4O3JQo{>fO}GxrD@@h1Mu#(B&ER6XBj-b9iLb`O6kDbLT=7=35L_B^|LFgpR|T(L4Vih#umRhiz= zHaKO#(-%J5Q}E7hk^Xr6lT=1B5)a&{WVuj5T5fjBBYvDGoE8nw4Q;l|x>aqe_7w)v z)!vi`)8c2oU#qMNd;ku?u&!13%+S+;B!TRq#7CwiYf)&A$nL{^R#4Di!*i5MM#BF{ z<|j6rmT3M+SWxx!-k#A0+hKcD;BXl#vvuH_v*SJJ_+(S+bey*_Vzj{J6?cAr(eD0+ zFe^TV_{k@e+P#LHn$H1STpR|7Hh~#QW5S3;Pz#;(L?HQnFyC-Y=^vm_u(4QFri3;I z!$aDuKQ6!oN~e)a<5!&)_EA5TxiQ8>ib)ga`Q+g@`9<-KrmcM(1T7xbIEt)3i*wwE z8UEJS)h_qKFe4iCHAj)Um)phVAoui7%wl|ENuSsKol&p#Vbqk;?AJYu1nIm!i5$I$ zfubAPIk?Cr<4~awr&g0wJ@2}Cqb#@#<&Z4&{YV8P2A$HfDeUoIrFo>pN9{F#z?fY> z7#g2{*Pk7}^<@;*Ic z{X~pt@!4m1dkUMbrvnti*1Nyx?RmP_F*?IJKV)|7>h611!+zX#RSzYy)i|KV^*Cu`xz_4Y`l|X>7>}_7_TfJeyVeJ~8 z)${9jgA-6#(Edb<#UK>vU}>OipgeG~IJ54VqB&Jt-!lIR7J5#AX3L?Nagt0w+knMN zkeAgoG~R7GI9rL0v-~lpVNi`0Ozek<5j`@9dn5R1;XNSL`T0V zivOagEBR_9dpb3jP7-BFQOU$ng7t#D zfvyrIO8V1hwK^v!GrF2-{G#ZkWSD)X_VwTcf6<9`g0cj)nWUeEeUk8C7k+7-Ww837 zx+)L`y15CMO+T!>MU9GCe>$Kw(9I}|5ynb5re4p1@wtX`#sL3w(ZP|x9ag%qbZGCo z3UF;9$Q*k^6L(B#I!hZy3wHgVP>J$)j_kdP^z%~l;C z(`;&PL|PXbms@(ufmowoqS8AY5dY3LbSQx)P40Nbs&)&{q0x{vPl4+LFT>WxXc;c3 z6@Gq_t8KtMauXvWLm@9jI}nnig$ z`#ZU0;WeITdU*Ja5nzhvT`eC`n}vyeX_O;KXd_+{Qj+ivqsgzl7L$5r-1CWAuRNBA zp}uU5i7S7BHk_Tkx<6qxE${Wkjiqk+A>|{NagQ_HN(|^@tPXq_j8(d)nVrC9B7wY} zh1<=K6TkWcOjEkPUdiAt3OP$hMNnC{kBY0aqs}=-M7kl5# ze%+Cpz;QO#x!RO1PDdRp(IT-~&K})GWa{thDX}Icj!Wzkeci8c1CZ^MAdk@ko@f}) zK6aU`2r-J6p$SpSI%ecwd+0v&ylaSoi@dN>qjz24JtqI;9NelP z%-!{#N@|&mM>zRhPsQ4X0YU1?l2-h=k%101s>nMl%7SWTW25(nyZtAo zcsLfWF#d3MW||Ldo-i}fC$#C&#qTL9DCJ7Fv)#TF;7EVTX{DYbb#`de!$AG0!t>1L zjQdPpk`vKGD<|xRRO*C%=r1zIGQq& z5jf3SHEimxz6`%&OOv(aVR)*&O|$CB|#qV<-7es1D?HGW!o+>z~`ZVxxf7RWstdw=8 zssBy|*@219oqFHh4Ygt2(NTNvwTEZ;cTby&@=L?LDxa)zi(7m1y{8>bysqN2Q<-lp z8Hw{_7!1wLl&LG68@)Uh;WP8=t4nLqkK#~2QaL$MK1!O4t8D`Xa2n=4 z$;JAu#7p%ky@;2bRxf=v&BW2M>xWk+R@e}F&LK}}`af{{X=cU+76Qeqd*(+%PEqfWyY zEvRU|ZHc^Q%yFziCQc6aEtV~%D?px+#FUROJYCdYT)N@@eCI>Fp1q16REny1WHrpN z%VTxjkQCL{^k^Ftjcu!nJ9U0rZ0tck=TU)cj&;&McXt~T_7~4<7n?~ZMd*;kQ_-o~ zMY+cri3SiU91dDI`N6<@y?Q!6&hZQvh3L(a>YaD@`7{_iu#04_!xN*q09%38;VkYA zsB;LT;qqpi&MRIu4ne-n0T5)7Cq{=MC_ z@1GyvxHKqQKf~?(HKfOhB>vyKXKlV&Y3VbF4Ify4g`ixC`N7%O88YJxYB^{PZrohq zQW-l_RfHN7lY;fs+E_%7|Kk~G%<-yYIM4Uyx}mN^5LaCtrrQZ@-CeV^mf*zZ-E|AY z>S4!O1WWqzh^mOr%YhHId+MyW7_a|T8gdA`h>M(bp^{fczh70Xq{SbQmgq6ZvHdxH zd`asxZv`S76#982zzNb=~~Rsh1z#lTzBWAz5?Xo@)}8lsbh`UppL@_ zo(*h02NS_1&>O-(F!bN({aspV)<4jYlf9W&vluiSJ(_4$v=(Wnnv?Ex+76D&x|h*8 zxw1E)d2#p+V%>U1feeMozqQjoqk8JRo!B}ok8j~}aBHsnL!U`p4`>Gpg>WX{pDueV~|i5i0WR)-!rj|AMx7!;@ES z5}~)@hn39}VHbPpy$Ja7^231QYqxdq6J{$E-ALv^7;GI)%EP9nm0liR-ZHBnNa-^2 zQL?NmB=ef_*I06RS?FW;>`f*48}QSy%&Cd_C`}l1{56q#*GqD5*IA{O+Ch zc#I2b;O58h8!%%H--q0L-&Mhkc%)(e5<9p%I!b(hj=tQO z(O~ou9%W3rFj7DclYMz)&8H<&)0Rdjot^`evvtrfWK~EV|Ty~FeZBr zlal@K+9oHMq$r@KJik1D-DQ90=&Lm2`#FtUo74Lbk9-~wNBybVRJptb!@E`>W6jU{ z#eF9qtc!|FYHXh5rR9!|52MMGH*_1*hfaY>CnK*iJt;%~p<^8Gi@QL<$8Q{DVAk1# zS*Kg$hGa8+@}WMMDi+PBE`f$#Cu3RXIx*U|XkX=H`5o~c+grodyPu65=(WVy$UkpZ zsP7@*@jlIEy&Lo%M6CC*`_haa2q z{JFR)d9tEvjTFs1nU|41Qm>S$T-vBw=Of)r%?=m!W@f)yJF2lom)sa=YPxM-Q^L`G z;(+~H(lz7ISwpCtxvOvLWqoQzvsRioO;q~Rm>xtkuNhEMIo5C%o}5iJ>MQC?Hi})_ zpb2RxrJc)Ls=H_=qg%yV>ZE zrM2Vg=3V0Bi~XI#8cd|6+L!d9YR?fmZ*OnoFGW|^Ep>s`mC7cvdb{z&CRf63N2y{f z$}2dtJ;vi5MtAX_=bggJt?4O7TZNwmNy7#37IalCNXL z^j&Xm!rhfNc;|Sjn0TANq-RRnT&$6L2*>eKiO|2V2qaij$9yQ3EA;YzaO=DofB4KHvov&+7cbkzlC<#D2*1dC1p zDavd^-gAP>avt@)?|l4NaKB6$$!Oo|7%JAN%wY85g%IBBzJqAH(k)Sm4w5Zs{}#R! zVHQ}wz^f9{x_hfJ;bDXbnZ2If$(%6{N$-O3@Y#hB!4}f$(N)6C@#uKyP|*&Fao)&r z_7hXu(A3z`z+JN9E$d2IDDnKO#~(Ekl;P+6BqVy?GZ6rfELXJ;$hvn%s|z8CD@QK^ zwUW?1l=8j6J0#tm!X_p;0-6AOAB= z!O$moc28lnT>^J-a;8NEte9an*rGGJ~o6WKzOwgg(H2Md>gwn zS86_}mPMp=u8Cex6cgc3CXHG1VHb_Y8{3v~RYwdiNwmDWDt2qj%Scq>!1&iZE_RX* zbl=~9=a%c6fFlexqIfz?3r0!)?p6b#KSub&o;UUP(1%Lq?8Ysplg7i21f}xpT=CoR7D*s=gh< zPX-!EOB`iZYAxaaQ)# z_RIU#CrHdMR$2o)t+&{z!Kh*$y{W)Fj8ayAsk=piXcDNI%gV~U3u2R-z%B=m7|Q9o{}b$XWHKSa-kEe_q|$z2Qi{f`-89o;AMF{D4oYXzZ}-vxVy-R(g>regib zf9W0tH5G%+14K*k>j?=%>8mDa@F{*G+ zY5@D}qPFM#+;dGiA7JE^^UOk!ni4%H?s@Zdgq7L7_cRmR{GyA5S z@wl2r!7n$doeI>r-7%yHAcfig-)1^X-OiN5x=$HZk>C;SEOeNUQD2k#e}5DUOTD=b zRN!wGfWqrIu{GAKf>&+gZ7lNiH1`%!!q5(J^jH5Dp^fVYG;(apHiD|cro$j)#S;|R z%!ohwT7BW8KKA^We&HGIV-ysmt?gwIEQLSTQ-5JJ8SxM3$qz|s zZn8ZY-jrAWOf-cc0qgVfSH&*pL;AxKi_6|rtnoSbPZ?|yZ8%r2x66lpd|9>96{T1| zN_!$7w#DWTJVDCIGl|`OImpi=gfS3yl(SZ9<>6Hwy z$*S53yf+_mVU%_N#_3Q$%Ffs>Lx>;@9~&*HwRjh(s&W!-zy=AKPEm!(a4`2v#q*;Zwsx6eeno;u0p0S!xkrbudHh!}sxJeZD?ma$yL<~A~Whl^vp+%2*ZQ;gZ@`3%CD<6<9F zXEfvbDZ?|HXiA3|`XTQilTGExlkA+lqIW&PMt??3g?n+96|M` zjKWC8`Il@*Cimeuj=i0&-AN*5lk3a#P58A`BlM3<(pMdrT*`i}u2%2?@u+6{vae!< zY2?{6z2lTde1QKze!mpFEF$L72nilA)pPS)O-+olc(e=;sU^sK2&2)Nk|Yb+Y%sFW zD)}$*p_Xrbzl?cVm0vmp9BARC;y{ORtmw>Y8gBJK`8Zuymmw*ryL-y9afIIjAClME znx@ujPTNeT{ff1$(H@4ni9FJ1o(q}=A@zr+Br;fVoc8p@0%7lhi_v_V?uUA22onZV zMWTmn-!gkF8F;4b^EpnOofm%<#JM%tYc%Ry4HMJed;04BKE(@0sGERftS2Wt^)jMV zFwG%PXd+Bu)@d-XkIH3U*>|3SI+w0EuaShrnvwHpaDHdH0fKQie?_zgH)=>t+|Ywm zU}9$e`f>OcVLZ4mu4@vE)Q$=&M{iGH{QqaR^?xV?A_%QEkv*v?Dx);2^b$WwG>N&( zvYVn~wYc%HI^*eX_WQ!OteBe7?M*@OpFA`YG^P7HZ!W46NcUz0(iS;~OujwjW?%C> z6`;s^CsCT0Syz;nU%$R_aP)^RDyc`tEJJ+tr7V@ ziIMb38`UpChS@}wK9nQ3*`lA7lVL4G^KUVc4m$51AeY8&YEAJH+UN>%2$bACJ=K;z z2qcshr4c-u-y(`y|Thg6;-=5a^KaZHDX7`+PWgktPTnnLQz-=gKr-b%3VP+ zM94=fSqzV1%U**fS%|i&<@x4|Tn%y6VHTF*hhN9!+ay2H%o<6Xl5+ODLq5JazlLh_ zDM3jc1oCh(=S*hyz}%a{AdE*uhDG>I7=fH^d3Xkh2?Go6m+VvE9C+_obI}`DR3~jO zT`WwqY&n(pO6XO`R-Mn?Or`kF_pU*83ha_nTo3@!$Fe+v1{rou@ogtnjII_EfPe*y z(>qtmT8#0b0|@AC>d1Y)o6vzjTs#+`q}dnVMZqXtJ^97PUtxS=fz**vg)IXl6|vus z0f-aLKD3(P4q+QjulUCTHmA-f3q%-dGi}woRDR!+rW-!|T-_ASl#@dA9v|hXstN>K zD1u0F)nBC@b=XrPZvg!O3Z-kkxz6ZL2UwD zoYoAS%H9oaT}M93k+H7%>DGd}qS8tYuZw`Whp_hS#9)uuj1rU9M0!@72WC@schWlX4m}nPOhp0GUXHj;);yUOWw%ZW=D@Cp$Gb}> zGo`-Gob$sBN^=eXa5I;ks?$fEX?tX-mamCm)P0h7RuMFt4mLDUV*>m|@|;KcDIy&= zx{Tu0+mB@ZIHnb|cOv%&9#Q-wamt)F14cL8oZsb2r==^`T+ax7eX2s-%K9?k<=ktr z$7g6OSy>$I*PYk{{o~*ua75=G%Ssw55Qp|4Pu9IY3I75tp&QIIQ)G{_?PYvv;I$j(n0G#Z^@634d?evG7}`>x8qqfTI= z`Ts>o@-MV@puhBfC9O_fTp-fCceV16#`NZJVo|^FK#MH=bu+ImC{-BGk^qEMnBA6G z>sctW(x|6wfQXI!V)E@qc-J%!+4pQL(hp!6{%dfjY>Qagj}Q)Hq%U?CuWj-mCc=^J zC&MQ)uqOl1DDtV4Occ|o$dW5TIZj#)*VMq-;rWU2q`}=;G`raxZ8#_vdhHpbHfBr7 zPlg?R$2bAT1VUIogXAWrv+=AbmMm?F;oewgaf)4#0aWGJcYqLYq5ow18X23CzP<%` zo@-ZQj1&U`Je|wypK49V*T&u?SBAyJcSshdxI15NES!R<%b?JE@nQ{NdV0D>Rjx^Q z<#>V~!NQMuT~@x=b5G2u8eJXkAHm(njDR>o6I5BO1D%~HljeAr>~R2tvIPp$TqH*Us|R3CSc=ZA0cGd2N4)+x;INwul!X zf%+X<)%nKiQ2s%Zw!r)gNy`79-!mpd5c{p0**08nFV?r@DIUAL;<0|l+FT=OHk#(C zb@$MP_Huj7%D3%3Ku$Ma9*vUGLab zaz|UU71c{kA0;=RwMU!-l@2aBh0LEk-f%n~(5Sb4@_2l}pnq}f8d>y#Yfw#V9h#>{ zSNOLp2uiuxuE=`yf^O}nQDoPbp~m92&rIyIK>=^NJ4M=pguXCO)u*`CTQ6I&qHscs z|B1nF!>0d1l@7(aXAE^4_AZ^lvSS8t1`$dA07Xb~nfb*}t!%(Mz(9J;Q(gl{aomqc zWURe{M4c7KM;D~~F0}`uk*k!xFTR+6I0A!>gQJ`AXgh}2sQjEM zmC{PlRM#9U8Yz*_=(eVJyIy27I~;~Dzq)#G(Y6|6E_{GqYmQT?;p6-^NX{9Ulz^lJ z4*wHA+>iYq(ZfJ43JZNA2^B-_%R4th}7GJ}oB(dzFQ&Y9zBF$g| zL6{Mr`1rDn{HsM}zSOI`t7FRJ*LQyslnwu_m-`bhSr;Y#{{?4DIf|1L6Qt+M#r+uU z8}}B#ZDYJU8UZXZCrj315ulXFe^}Z-29l`myxv;|>wbc|#)2P4*!d;%7tM@OO{7oS z@XAyU@3m(I)^MXAO*VFQ&2wd!9FMjUX*D!E%kbk>>aE}vsUB_-@}&Uh1e}+*H!W&{ zFzuase-(TPlqavhbVzAdV4-0AoCo3^|MN?1f9~hLTrRbB&Q9z7u|Kp;a$iwB&C+*2 zJ6dfK+5=u9L?0>xdg}4pXgl(v-{R)D%{E`8b5z#OA>T4H5cH z)|h(>_hS-s<55#u{{~vt7#DR;e!0q3v1lwER?x;JNVvY4qSbPH=pl;iK>^d}7OSSd zySWy`NL8=O%0}s{|KagI7T1Cwjcnh8q%geu2^GMA@|Kag%vp2UH)|rF5YRs?%+yGX zQa%PeD1bx>)le9k{x_T`GQN%`Qamoe*Xr4uZ%@veYdE<9;Bsq4X&R9+2PhoTxB8N9 zNcZ_#rM$?b;omqXCTbdz8 zSz#hg+-&C&0BOD>SE;l2^iLD>`fF4D8tRb$1vx4^YH7_yQg?hX`7L;v+1OQ2r`5;Q zA&>HyZ(y;er%ZQ9#-jX2AP@4(cg*PM`XrPXl8b2=$?2Uxp0NT%UiZm2ki0#^4d|VH z+)I)A74tsaeShvCQLGpC)Gy+(1^9udkVjcuS1$pALd|4z`KO%dhmN@lRR9kq_XQz_ zsD=B|kCQ(jO)#wyBoI{3*ux)c$Kj_4rg=2G)$TDWe=`@JH!;F7Qz^GuQB>OY{cupj zEept^dFhZQ>+{Yo)CuJ)dKoVEkS4U;3F^ui;m3Ww^i^2#hAJwbm=KmR~*QBbHy}hi@6W>2(E5@045O2i~xhZ~z8a9a_L{);uCZ)A|P(zbL)1iNVT&j$O z_m2>%TnTd{_Q56kzLeAJTQ?Dt`pMy5+#B(whlo=cb!z)3BD037dyfhmpZxz^`zMJWC+^^Kz1#5=7Q(Z-%*U8N=f6lwBDa&E;VWo# z1N;Dbz90F8*`&y*()vMi!n4!mW&~8p^OVN3EbDnp1-3yZrtC%-x%uTXuDJTtVk4jF_aKjI;_^1SwLM4B_*4p~8({l)a4myuZ*$i>Gs>OY zDq>)n&drt`BFL-FlC%T+3VLwRvenyq_Cn^HBiaJM#Bk%_UY=P<)8cmGll~OVeif2j zBcrJjxLdLpsS9}k!#lM&ndM&-xc6<(t} zVLdOc97xp>W)Eu$ndlZ#CjLK2GS;iKf0r+cc|e~|VwFGRDA;cV7SjuHXIqR0)yjjSgi}sSi@D1Yq5so0pcC#d2GB13t>aoj8YVO|^qy z*(8_qSC?803O2H-#&WeSTqqBcDCQ*Yb}S0{A6nz#oB!Jw?yn$Sh{<6f?Mq&#h;w^f zi2rf;?Rifn*iX@4JdBM$$<~(BkE#U0+^TDxicz$->BeRh95LD`a|jX4SC)6gH<)EP z4K$Cba_fpd3O{zN<1ALYB}@{9hY}mFxe4z=C8#VpO&KvKR-2BFkJ~2(L)xQU`LvHx zYs#L$2(+BcFuieYuzi3dRGnCh+r4Zxet8A{I!}YUZ*b;R4qi-Hw8q5X@x@0CaNZ_~ z%1izzi7n5Tq>A);N0}5zijLSKApb^9OxV=Yu~LGn8VhB-ct1%y-^?b&pffj+93Y88 z)!%f#1R-GO{uC89eQ$25EX^3&V`o<~RW+U>{OMUmC9Ct*@{ShJth@2CabPb9-qGL7P+FKx1$=+%az0 zjqoAfBZTeOs8_tIaXi|h%xV`kOAi5ECU62`6xdm<{{jtqGpN>ISJncqg156fR9u3u z!h##(XWOz;mbP%R`#4e2z0Y0qWD}%GB zg*`VgvsrLJ^6@&;RBiiih_4w?50^HCb?_(b)@iBfc?`78aF582-p~Nc$z(eL7sWd` z^F!gCAh(J2>bq~d-`DY?>0R{S10BL1J~`=kwu)F!Ui+FR4|q?dm8`VIc^b72ZaS)V z2|2nGSrbF&5ai+9MKE+=RQQ-F#h_-^ez!Nb2=e$(M7aMeA{@iz<12YnD_lRV{=u6X zj8tTzDWVAHOMoas{26kf850+!4S)kv(oQkv+ickX1Rf20X#PnvIty%_99cAHuj8iD zsy5sla6lf-rf)+6Tog3ikH0$}ck;QNkSkLDOjn=B2Z%FEwO`lZnY-C;+xGno8}56S zknF38j*on|Cw;*nT1n?tZ+-;2G;JO3Frb#dW0EiQheswGUJ$O@**s1XohdhCt2?eT zp0xsW#yP^Q8JPy=@aMm2#O~#znhoPku$Uo8A4v{sc{`0I5axT4$<0Cc3ZI&Th0V^k zszbr=CCpNZiXaRr5}>!AvQ*aqrr)Xi2Z5D?Phv!XG5@7J1Fn4xGLtxg5MpQkyCJ|# z6rQSi+!F6>65Nvv3WQ;%WU=q2c*TO_R-dyhXQ%)WpZs#(9*?P^sZ4277i94a*{dr= z!Ft=XGqr6Ca@@}^^EgRe5-d7xODb1N(4^o<1PvyE z?qfCdk(6hs5&R5@>Ehl*u2FRmjGyk!mbfOlyKH>}EswcHQiiw=bK|s20;k^F)rb%J z2D9DI+F*{kXFQBr1`(lsNA-a2&QaQM5^l#KLFyO4myb--lDQP4*yTs;{C8#7!mi!A zeX>SGJMW^~W|8JzQ5AT0qo0&V!fkSd^U)XhIH5^3&&9U>D}z+MFZsg~vV=f)KtzVC z)q4^rt5;YnU%$DGeI(B=LFHriNUxJR87|Dt z1pmzXB8S2k378oWI)8P&JwEt**PFX00;T}JxQOC=^YHaZv5$E%UZ5jXq%BiHVWO6k zo0{WwW?7-hHCikh|Ki4L;N#dlp3zVotkPdT3`(?r3W zs(8;|<%Jv|8%=?&EKPZpNSWbv4?|}!ef-`kaxp#z7M!@$fXYra#CC$R;J9#eoUnxv z|9v}=lV#Suk+5m=q|Jt~GN&M~z8<9e;@t|bxM^+pZS5^_QO<$yev7)kXoCAk1Ua_J ztwaT^BDy`B0jEqdZ1&z{T@_eb#M)kTLNdI)}HAyr_EZEC6$Xd9MeK7 zsgje!4`UPACQlA^#DoWfk-YDfR$;jv_p=`dVByesGuyY1PJTxlgDI2SQ$4QLiQ*sI@-qavn{CuT>hQ>GKpy>O z0h~a~D^TLkR2%^Stzhs%fixH8oM)7f%L2D%mF)t72YLQvls&U1L!Ks*mZ)ub7LMV{ zXwKGH=mm*+Kj?oB?EcmAwb#xEnrpd0%h&Ywr~t^yi+mHTZ8g4S63L=V7FMZB2lS`x zT!5x_TN~SaNwxi2X?dwucEjRh&j$n3M*WU|HLsOs&=yS+ zImRq?nj_?nkdAf9{d7LTM;+*}Q#UKz3+tb<@pV%yz3O>6REy4j@B^7j(K z?;F<>_N@vF1%PYpvK@dKHHv(iuKXYtfNishk9M>5c;{M|Aqaq?N^4mPC~fN0sUt@5 znEcNJetmF*PIGfJ`?6|wjtAeV^v`?alB1MoL8Hkoe}-(Ix2MIuKP2e(c%>VVpwMqH zl(d}ArMBkJ6mV#C0hAaHhc%j4>K}R~f)y=F7B?C+W919t0RY&?Kn<8Wge0=#<4zZn z>Y}tR>oOK7wYa#sw06w7j(ZKpvgHr8TIcf~)W;CNtI$zN*&B*s&D@|q9bl;x5cbyw8Vx@v%dT4Q;gWkXtqtD48$U?h7aUQNWX zF>Qz+5S#r^S%G7%7J zC;XP6f%Jd&oc*v|?h$$XF%z}nTLup3=m(<@mJ5KAMyyd3?a2PB5*u^cdf_|ThN>F! zlzNhEH5p;4zJczE!492H{cf2Co;mQifz8yx_{(f87@z-i3~1te@Py}q>02M|1HN&|3KlP!k;#cty2 z5{l>`HK;J1D2F5Q1-tW&K@+1c&IsTJQpM{kd0rYk`IRJ^mx^y<=N1$<^BroIolzt5)2XGrqrRDt{C4V$6)^+oW3seF z{71)HbgdXgiOEr3Dp5Fi@&p}~F2G$@{ok(Ff@dqN_ovEH%bv+G_y`Xgu{xWe9&3D{ z{7cyOhw#-pZ108t>Rfk~bd~$qGMhb=U$j{Bn|IgX-G_nb#r;?dY51;H*YW69GwDxX zFE1Q=^bWO(yiQJE)Avct&($XP>4bbK$au=|Ss6oJ=qJeLRFh76v|yovf63-f5;cp3 zUsFY*aZbKh{&iOzq!U~&&bYx@=UFCUpQ3P?L&ZuH(ys*&lE=u<2kgvJSIezq06 zpO^;4-K(yk5y=NMB1M=37h~#gaVB~r-FQT4=@Oh;e$D4z!1VziG=9Ij_(=J7Rm)lP zBpL5+ap~K&941FLU=q5$@7-Q3lrMG(!g!XQJ4iP_#7?{31c>x$Rpruys;U3U$n*Z>H=m*vXVcrQ3mzkVP$eStJrM-Ag; z$Jay5CiqZ3Ip$AZ_LC+2|7AWHR18yAP{zKfo!U?= zUG2N`hYl~uDH_>%m%=&Fpvh%XENcZNefW*ng1~H2jAEG7y|(HsG6U#$`SL@BNbtm& z4!QOZg_irApMbjFF&RiFNKo;G4B1c8nZU(<}q5h`hAYQFCL!n_M>m;T!iLr zhbF(k1P%OQq|KLMm+RF2FZ4S9>lr9&L~1rRwxrivh{spIddzeYTmTgQ?-f7)=Q$;OQMP&i6ph^u8}WH)M#UhzhJobb8q#V(LrQ^06;|*x zEC=I?2MW9u3k}0F-t1S8OPM+5N@gcO93si}H&sf?I(`4;^GDEMkX+C1)(Jq0hZcA9 z-JLo+Nx{?|cg&Ew!$RjhKC3y{evYe$Oa)V!pzl0m2VHGuuJQgn-7~ z@Tve$lrS^70gY)uVXb>w9HG|&rVIiPnpmmuz1TC=>d_~`5(%s!6E#2MS-Ssc_etg~?KJWYf^UZwojrRmzdaVHuNljk!bex5S9`lMnIMaVG zX|9GLlXXIME4&MAP4l;|YzG4z5lb0<}T{8 zSg1)NoOqJ{ySuXgLl*?Z*Q&?APKTw8iHh~BEO6o4d7pNpyB{Ve+Y;F-)1&^PU&trC zXAU^plJo@MUU)wdX;?6*_?yvlG&&)iBI?KE%KTKB9EcA<+QSu%dhm3g($(rV|Gsfi zE8lBnMoV-E?MXA6G?bx%()U&Ltw*f6`EFG5yoe-hTt*f1kL7p&RjM&#DOh4eU-yA% zeNJ|vjg9>`vL``0QHLqVjc~=e`RFrXz_Kei_eyQ|nA2XILA(KV4w>+)rM|+x!X&`( z^*`fjn6q`TdJ1uJP667a{D3Y5p>`4rz8ur$Vtqdj_6+)(jM(S3gF`a{HBTa&-#YB( z6m+K06a0p{^hB1%Q3WqDaeqeo_GCgd=6NNU^24(l*&`n_i*hW>E9m+A2TidQqn?#! zbFP5BBe>V1-OG9O+yb~7 z$Thmr2($~-&efNtOs!hAv#RUTjcsSg^MJL z;d3U_kR7q-A3|4K&K&!L4Y6@C>=7t~`Ar0D!0nDbaMHqcuKSu^TAzF7?AX(=(!=jk zW#+V*+I55|uk=mnH7Z1qZgpXE)Nc@&RupEGW?^0Oxf$Jx?Vss3&a+i8mL`7D*(1n_ zB9u#S^2b)Q3)DBQg|G9($Cq^W@!_89REpH`ZH9E>6sA6^!arMLaLptc<2n zsh~7M83C|Ycc=cYgaLwJj~be0^;BHMki@DYk)DM<^hIPz~4a_ub1Y` z{YweLE;NxAE|HF)l)_w)k1iSAp=99t6;EM&U`Jc;IYhRlv7+SY%EZ5&mm}W4i*R=* zxy=*hM;pAqi*}<_)oNJA#ZZmpp(}7-`46JJH<_0aIoAdLLu(1g-nTNZi|aEZ zi;`)H?Ru)Bvt5a-VXH)HYGpMfE5wgP1f|`i9Hsu|rI5&D<|}u1)n78hX1x3&wvKNP zggd)x*4frcoUAS1?UmHUeIA_V`DR#xY^l$qzd@q&_Vq+P!97sUHXAh=Uo!C)P%)rK z-h3eR(E){9cK+1lV2D)KU^Zi-i|W*sAop9Z*75|iH!9BV=){{CPHHuRtJSibn`>T( zKd8v{;_29M7*dzO4+QUu45#ZaQ0~-?8=J8xr8Sa1wH?KR^N+3!Nsq7L9nLhw_#Dvc zW@B`7*5>)B1)GzCfQ`6+whc7Hp(kX*)|u!rk?YFaNH9QN4t|@gGUlhh@?xV@=QXOi z=0LgEh`G@-HPT^5YBsqB`Dv8t*4EbV2^#iUeZvaifuqrs#A6Z&HHyZ^#rWvvZe{Q_ zxhlv1`E-zAiZ)a~{Sfy{DBH;ehY$V+%4+P%%tD>t5`9)-4MFIl6`O56by*S<&cR4{ z$rlGYWni`c1Oe`L+ZHuZ%uSU$^sRkC0C7hj=<|V6 zHGi`qp6Xw)oy5c%B$?7pL__9ody$>v-v!2GDd6R;OVw^on3ir))+*`}>)qr>F8f+{ zCW#@M2S!3>0PPC)Oo=SgsCCyKRiA%C=Wlkr+Nd+w%($ zzuXc?S1){zKCwGhE@Xtca?C{Wt!nL^oP_SnP&2$ro0jZ(4HF#Ah!=$_=#;?Uc)@0G zEJ9vf<>Yd%2(Q)=>yBVjFAb4cmXFlcDeV{|>f<1{A?q)HHR^v%nb}nvCOCQ;Jo2n= zYAR_0(?@fQvQ4@4s%0>@%ineQ<&ey8hkk{|gYGlumzeBIrDU%pr zed%L2S?ut^7wbhZoUwRvR&a^a3M}dV^@iV;Lzs3xzsG%5;J3RBs+36FPA@iR_JD33 z%lT^4(kG9W?VI>7HkHUiU2o81T9S5@AskP%oAvd^cxXrFCU0qZK0+)I&h8_kN6%s5 zM4Y^UYuD&Muy^p;fre9!7Peee^L5L4fVFUodLcAd0edvJs67zx~^nj)j z&HoyaufIsEgwb)$%jbl31w)B6bJg`?tQ)0b0`!&oKo<1TCCrz{^|*Br!Q4*clbQNw zF#}~sud9qryrG<9IvJ}s&?&_SelES|qk)D{5>Z_%RqvD}gyOVDUYcte0BE%Hq_DO zoLP6&9H*n`#+iYksMJ|2Bi>)a}6 zpz!Q$Z{bVHkG+wcz4b38Jzp}R3AsbXvCFoKg3*%O7z+w5KRpG!vNmPu(^!qS6A!YttqmfBNrL&9ElW{%k_k+~3Y zNcmw6XM#I*yVAYPom7Zd_(|mvH@i{^#`)>_DMFHetv%^h+*Th1KFw)|vf3e>8g5Lp zHeg+6L!UrE9Gt{njB?VROe2s9X+Y2V^k3gBY@?07use^VY0H@Dq~@&Nf92+Ggw$vm zQ&*N&Dck;~CCmBc%ZOs-OrKFm@B{RTIRZz!n$I+C;?)ZW&LG%>$zww2p6JnTp;RBWzOdLCa9gPr4IP$*=d%q@=FMN<#~mc zJG=OA$q!qxC$~cTsmS}^yx!eHx3dcb=Aa2f3HS~Pg#aDQenPX=Y>A*h!!*~C(VeMKBCwXb}=pY_Eb_Xjd?pK>xapELI?1{`R z{dKvOgv@Wa*tn!erde19LR$=T@RqjpwbW%$aFeghRQD3F8qFEd`8o&tYEv%n`tNI! zKseH@c7OM1tA^pmBHs}@rSRQg5sPJ;rnGb~`B&L&8cU7tb*s_o^3rmVUUENCk-F#v zHjelDo_l>EhLnawy=qEDS?jZf-)PMhKZKeN9&cT>1F;eKB7&;cn=)75v+WoeO5Y&_{>tWsb2JzPg=eJJ}vyJh?!}NwQhIoz)z6?MhlYlQ@AN_YL)&IqBO!9iFGChEU zjz_5Unv^4~V;y1E09^Vm0>-(UEeRzjQB}4?!v?}E4a7GTALhwN5)d}bW_LX%sOGv6 z4S%cz`#u)u_73hB1t8zweVF5&;c)fL*HOI>6(L3=o}X?izKhjt|JZs7JY1g8%84NUY5E|114B5}P9vuHFe8s}@=mdVv9y5GrIzLQ}KS^h%K z|MJI|x_mjM(23^0sknY@wG-bx42Xs2o{Ox7H3B0Ctjny<>@b8RQC-vQ-f%B1j;B_K z-5TUG0LhsVRnd*n=PxO?kM3VU>EsK)!wWrYVa{c}1IH(l)7o@GtjRj=Pu5vAEu`|m3(aOr|bZildL7QzI`Bf+8pv#P`6 z1l9;5^um=@q4H-cvMO~R{eg3PeXpXJ$oe$yc4oO0qtSDR3h}IDR7O8GaIhNYmvY#( zCcf)~?;wI7V`lVl+R4AlG{4{kpo~}aRX71!z~WNCR!pTAa>f%+epo~4^Y>_P-vEc# zQc+VKqSe6*^x=`;cMk%qiAX;IxA-nBClHINWAAIU`MeFwroCqj}~?U-9n2# zoL<{#W%!{#`~2NeCEN!6qP^3pT3uB``71`Qb9;STzOTtF!y``#ZQpQL4PlBVNc6h_kZn>8h!(2L&tsnj`i(I#6cd=Q|BRk|5JKc6z5q5vy)3+7-9 zm*zVufh6dI!_u;~b@Zsb7$Bl1#*Zm~Da(-$xa!MbF3Y+`{Vb1E<-bF3kxO>CpYU7L zg36;x#b_|9U{Z9g9$mGg9~CUJ21xf#6`P8F2qjDINW@sd-`Gx+Qx?*MB`nul-l|^; zIOn-vyO`X-p7cicmp4L-I<&_kTv=UX9BqLlWMt`-E__>FZb#(x9;d&LMy0{F(Kqi~ z^Vn8Rn4mLM*w3x>y>;>GaW(Av(<{dsBth^HihCMeNm^BvmOHxN0=`W}Syd3vM+Xib z4*~)&0%?~w*W-;r?|OxU{e9s`fKj{dR#Sz_up5nrxJlzYVR2O#O-{nzwqRDMZDm6q z$Cjy>1^@6um{+whQFyqeLfv{F(M+S6i|ItUEc^hFPF{ZtXE?NjF7> z#o4`|7e`kQ;nu*kj6vd4KMtp2*s%2qlPBee_IJL1B^$eCT$a{Qk)&p3YT;m4O2(Y= z&QbZz4ifB+g};XhV{QSHmRlpEj}E5Wr}+w}-ojopxOZSVW~5JjnsaB7Et?~-;h+^l zZ@df})v@YW%f1>TKc%V?EkDwDwdAZYIEbINV}9Y`zK#Z4$mWychL77E9!;a`A>F^f zD@3O=kag`Wd48&TzVkga6sIm$?PLa~!QQid+Q4gIqiEq|Ypj(af)+Gp)xjJj90NdN zbT_(E3Y((acV=PdxA{*IxkI_^RbsMA<_JX9weg8lZEk+S)}d zmLYp9MeW>Z;h8KTMVV**;Sg!GFNeKmZsaID}|B3DCZam_$nJgUVzdwKvZJcs<*}d-M|G$ zjZ6p*huZjn#EkoK8VwR(H%8A~?VidKUIUEg| zYjh7eN8=lRRIc;6`!^&-%lR!|7(F|iP&xLe`fJJ9@f(k2B9e10d&Vm29kL5R3d7>zHyCu#*lTvDZ89O)PsMPB+q(GCaxj9@=B4{Q0eeOo< zdt9dxFVwiDRz|4|+9@8`>IC%ieyixlQ|5A4>Fwx?Xqq`UZ|?$SJE0MG0|VBtLP%RxfLgN>Pg zlv8(441|vsuAli#an$k0@G$rzJ%&gU5wi6|<797XX(<^WZo1wCEpiVJt>t*K#xKI3 z^)u_;Z3mu{Q80rIzegFqHg zR^)f~^g7Mf>AeUtI$nxR$!DHgP=A3s2O2gMAhj>8v{H$omxnQVp~lORtWiSr^$TxK zNJvEfjWDiK<;h#V6X$MYlj)lQdtla=*7Lio-feuGy91BVq(;mv_p#z;3rX`Be1sZ4 zBy>Ehg#jLUj3%(R??}@%NxhR_w%&4;kXMJ{drir?q4vOn6R`kp%(}}sbz)nrdep#sk`|v0Bk+$4y_Gb>A+S|3x}N{p8G+Xxb0r>| zJrrTO{L;Mp9o}v8)mz-}Nzx%W_bZ7?^4rkv|62_6M@d;ak#(&l=Vsdwt`U}yM1~3! zn?O54SYVQ@PGApNuIe_kw^S2WuNa*h6SK>(PP7QF>V{5{Th~M6gJW;FkpggV2DR4w z&XbcQh62zfsL_fgUounrsaYM~X!d8+{R+Ui+qo?tmJJp@zOHrY-BzOR>!H{~KW#i) zN(OrdA|LR_(X*#y@4!cz)EcTBWWRvAaLm+43z7_*BK5APdP2HNH#|n;H2|t|+n183 zyky`m@6Jy989{f+6H!I-p)RuCiSL~D+#s_@vFAoVLW+>ckoDIRmFWIKgY{V?0mrDWhMHFQ-w4JN%8aEJ;#T{= z`ntrLxhQNgvXX@VSW$2F+q5od>98L0BMxPq+T&~wk3t+) z!9*#vIy-;s+Z-+q19}PiGrrE=$wlSX<|&^wn$Sdr`Ohzs*NKX0UgwY?r}NRNtIHJB zDz1N982B_f%%u(q?9U8E7u);P0ywUoZH!Dt@wkDk+4AIC_Y1U0{#VSA3`a|HW%d^E zcI9P-HPg1FTQBE7Z7-4&Y$EySP-cpPaqfXgmZ5?B|AnV2O3;{IMu;?Vy7vwCIo~H? z0M;rXu8zox=1`N9mbKh;^Cq>FgXf-X6I>REbmXW&3JldcGS$>J9wsVjY13{PQMU(A zt$}?JR>{4<(i|%)sX`LQNexOuti52Vg!mgH)8$p!E&DSsy>@!NI3lkLPHM@fQFhTQ zL8)o^2niUz?CgAJi_T97^UiEkb#EJ@b-+CY@NKMjCRIsG+0x7+HZ1P8_nZgcnI=fD zors2SN^32{Ve8XP7UHB8AArHY_q{t?(=|9(`_O63O+TgF*EQD6Re?yOKNwIl0HQWE zHjN8~GGTr=q)mOgxw;wdEzO_hL>O-|3mbZGAY%5z}(b*W)HJw-r- zm3b582o5u8XX>8Oz(L{zkJsJWb@FJHXx1Ql54=P#C1wDnvdiUI1fvVkF(hv zZ=CZjJ|Q{-Xt>ml@oauz{cz=$D9ef*X)~R`3#dp+lyQNGs@H&Y3gT3t@)|hD&~0i$ z%yUjRy{Qls;g0$PU?N|e0`?_bNnJ)+wZc&o(Ftkjh`z&0on)_~oOaws{&aA5*sNVw z>eM#lEiJWg!BpU@lzs-W>Aay2>rk}rLZ1mn$E!-$j={F&p=8=dob=f_j%oIMsN(b5 zHSS}Vc)&COlH2x5#Av#%HmxvogqbmCj5=CGe?<-DPs~kKVkiXutf-mKJ*t-FdG3@C zSY*bBEnlS@;?A5$Kq?h^$3DP1#Pj9|>DIcezX4FqXGMs70J0QHowa5P=?oY{6S4;j z1(62}MRu(~6Ixj&%abZqyn0`ZrRH#W^Ofg*-hb}y(J2QQQZqFuNtnQ{k#f1yY%jC`EaiJ1sy_3A;f>;y6T#5D5#kg>d) z8Ta9*S8s^IntI3vf=uKh-mSSGty@+>2>W{s#Z zpqf5dXpA{w;|jUKGWeEV$USEG+UItI#+M{PM+|BErx|Lv1}%CL#LO~{r_ZDl1XPD~3k zlMbk*oU5S``3fu&ofU1Zi>V5;!@JSgd7MK{^Wjt$1{D@D*e>)&CgwA{O@>wSw~tJE{?e(PYu69cRLOVzuR#`q{+Zo-e^v#5@>a5MN?3zcHlDjP%^i z=Hcp(B>~%DKTYAz#@600_FHnR#9M2m359W%vonO(QI4t6A76HV5GCYACcKmf0***m z4^2_w{ua7M^%2GQ;@IKLEy{;Izzp0dl5jj8Yz>E^nv4PlCI+5;dvE7JFudU*I`3qh zqQs5u$m9^Oi#+V8 zeq5Z0oqx(YyWLq*W{2P|d9x<0MdTGt^QFOVwyc#4haoyN%go8{cC4a5H&+|e+2Y!# zv-^3hQ=2)uP1}-_-n>>N7se5QB;^TwI2}A3#T|Wd(&n*JX|Luw*)VV|ziU@>a3J%{ z5v*@+eU6s95Z|%G>DV>Dps{$akVqjg6y2;bX82EiN1p2}R{0l#Qu?*a=U-@7!3b*T zoZITQoK|YdqJy2qqD}&1Me4TX^lLO)iSp#anGy9`&1H|t&0cbIyC(EAXw~R*^Eqpf zwik;I`f&0^ZQ4C&pQ<_rePIZ^(7TT*XMOKZ@e4lk zz!0;y!r&z?E-p@NZ_eM^dW&UTIM(DO55qz@rcW65c(@(j=?g!C)1mZL1~SQq4wyfR zAgKS2$Nh8N6VL^}a_9t82L}qL$;dE*-pTw+hAf$4|II+z95~p}>_W?gum`dW! zdYh%l$E1w0{ngUw z+I8YIOJQk6=??no8hX?+E4Q;`>LJ4#^%ID1k>#BOCXKf5VLw1v>cp9fRLD{0d%7ftM*aKOur8u1OZ1Zm1 z9AEvn8zFmMYv-i5Bx}c%W8Rc+wE{GVaXRKN4m$TNwhfv1Y&?L%%4!Az?%*;7-(e0tBhJ&I=8)5jcUY%F_ckt0iSy@uiE$ z>QB!Az7_Z+|Jo;zB3D5P1`iWQmDZ)!H}8X33TPbbaXahn=V@8|C3DTZOb_W9;B-Nm zN=hU%Z)h!~>1sMw*qZ`mHn5KL31}>9)wT9;H z*q#M=;3fMTaIq2*H`aR@nRuZ!0;CIa>(1wkIQ#YELNutA>x$=~8Rqe|$U#acwvX1{Ts=`q{qSym9)}0pjkxYD=-ic`N{UOL zkm+1a;I#&I*@YGWh%+z5kY!-T&Wq^-lrivFabc8-^h3}e1;jx0pTsY{GcY;4xk3XJ zYjL^Q{RP07^g!U!<_t1Mkac?`V#Zz6Priy*d{qF3*YjGlbYZK4a^_*KE^#Zr58=%s2E{oRpUB8GO*qJ!#N+Oss^U2Qjh^%v zNyq%)8vWt{lxf7j&_V%3*8j{-<`!vLopihgL{sv-Q`;xA5FO)rVd3}btAP{q!|N_} zB@&n?0QCZJHpW$VuuRi%P1Ib|8Ydf!pbpF^))@WJU0Zad`@*J4q_xjl~OvLsWqIiHgNoj-|@V4 zl^f8l@cclL(G=OOV>6K-ca`bu?<l|(sZ2pC8&T;(i3=I zno&T!X;@e+?0V|#BQnF{;1gmaUC;O;N>zV{}i0+ABDzO#PIC8j_Y1j-N44FSNWmmx{m-ZY>dI+5XaE3xs;q;UiEY-9>B$4FDdb$xR4|>& zvo60kb07mb=OhnhT}2|&jxZ3gYB{L0$-!fku;5$_o*NtvMiR7%>G}p23STa37_)=? z4?p63LJ{!Sk9(A;V?*CIXV*?$W&A#`_>6z<){T>Z7zAs|K0yu6*;#NNo>7`~)-~>T z=_YokmE|hX09Nna6;kg}O4I$cpmxy}76Jss1|+%!6m$xB*Y_a~PyUF;kImKFSU`UY z<>BBax_!dGn>d@&ogDk%o{)a|pSJ63;f{ZCl^igDtL*%rxyt|O4EevPxBknE^7l`) zb_L55pgLDzyeprg$?g565K&ZY9PN-b3`XCJ1hfTD#HkvS-a6mLM!Py) zlY<_3oqjUm5RaoiipMV4x*YRbeo+)FIvmW%_j8@pB2xV*0j;h{ZM9*LV6TyVzVkKjK)1XFDS-OJDUhG@{cdTO4^deD$Iy6Y?HF;f&ejM;eappRZ=zt-kRTT;+ z0A6AsmjR6v4f|+tXH|g?bf=+Bs6<`)MVug`S3{VSe!@EB{yHEPrnV) z1jc81Mus}fszfJ zrqhd>&5;Wg)(ej>Ybo*bta#C@g~!1`eix_|nYWES?{o?Y<>|hro8TPY2c#niOtLgq zc>phVmRAE1*^!)L`Z27?41{%f!=H!$DBQN0O zIdHFhu%Zv(>I4fK-Z%hp3z|05bvo1FK+`RQ{&Yi(jeJ&My2vnl(|gYG^o$wUfxy1A zVf&I#GU;Qv_;>V*Q$uPzJp8EP6#66)rD@c z!ddj=Yc`fA=YwuRJbZ=U5#)_1%R`an@xHSyTzqEDiY=*73VaNZNnfE=6g5_Bx|JN5B)&^~E42SP(icq1Z>(5tgo;U!S#lG4eRMX(6;i$A zzd@r#&4PhM;=^GM>{w-FoF&6!BMGl`fYBInU!(i`?)Q@vIKlk1ZatAn8YGqCcToju z{f3PaZ}1V?x>$mr61Emq)n&k}F1wX(TOGx}+aFY`qQEgPc#Y|UsLDw5dU_^Ms=q6&XIGj2QsVF4g%ZJ`qt+&Z!m6@DC#-P__1bpC3Kct}l99cUgF@B8+vnYmJcj;`w3(HKlGg4rJs| zB0&u=Q0gJ@@E|#I(&BV5#rVC%Gr|GbRVpDEUWL;^>MMSX9_bE}+Obn819%sNGzP5F zku^{+pi|&=q+P`n1$$@b8Xpz1U3;=5vOzt(E0E{y@0J)me2wQrucd~-=t2a& z_+L0-F7(JcfzU95@#8JVU0W5v`{32urqPjWVGIu&8b*N{O8?uetq&b5$#YO(S(-Z~ z$VjFhahyJ!Dj-ijy5B=ncykkvUw%i@MZg+Dl!h|Lb#glAiIf%xo`e%&=`a#_kBc?` z7W@g-;|i{C3B7SVHZLLLSCD8UXi1}gmTfqef;hr4g&Fyp=$xi9pJN}%fkO%krqNI^ zh)s=68)DVU9o94Tknn>vJi)G*G9g4d5&er%C0xsEYQ+#l_J0~$gwfHt?YMoU(i-aRs17Za9b2dC zsxBq5R3$;c93gSo{cps(`p`p|hE4~$DI&?XfsUVww4db@P4+egos zRUP<|`2HjunSoB>|1!UbFj~E$qoQcie@kR#T|8S!-P$|JYlQh%S*ExTF9(?2{{2yI($z^T`)(y$8mD*0e-c!o}EpSicVqv>GYE`1TT*}>7~A=L{90IB;cXR zoQfhdfhGK`rM|hn`{V0yhdtFmKLtB?MT4A(wY;|admP~~aA?F7miQ+D=qUNIz4_zR zsyZ7{gI<4|7#MbmiM>=ED_8ncbS({bfolT(^j zsp=E#!#2I6+{&9FdkHL5{*xnQe4|fH_n03Tey4!I?&NI{@oKY?&ufVn!niy9!AFbeZ+}rAoNI`pQa9*K&LF~WE2Zi7FWH( z6H1e@D7a+5ezmt7`C}#bN#)~b4Rft+Znt1l1wPfB6OT7iEjO!Mehc^(L_X9XBEs!;8-Eq7cmUi?eW|5Je%QQfOOuzD1p{5-(S(6cvxPq;nXv$(%xYDkeyvNrtb1-NYFt`HIObd{xr<0nqG zZbu^I>jb*-G+rei9pw%Z$CRoWB`!^7j_5#nPVf1&9Sp(IA2saU z^epc`$oiAbb>gXQgYq1B1HT9F09;v5;BhMZM>qf+BWyYUK{m%l+UQs2*9{a`@M#*e zset%nxXH@CHzamc{7uZz-O0{PscPeUlopatZvu0atK8rA<91sW;{ULD`ws#49hf}# zQvjeX80EPEcP$vUb z40z*auUE~Hzkitf+(HdMvNMz^s*Y~ipD=|9+XH-qNAc#E3GWj%@vhT{yzfD66x)D{iy zg(wgTBHzvNLGQY|C(e47{U-YT%hICk{DkwOm~MN4E|29oD4Zc}GLNg*R_Fk|9ar*2 zl*Lk`At}kB?r}>oFkGv{*EQr_Pi$uIVk-d+l<a@8I!T<(UvsO5@{jt3ksU`P%w)I2yztsFrlD;TL@?QlXJ_#4Py zbKNY)N8ON;gj3-qhAG2o+LXj~6xBIM_2*;``g%+6i}L&E=SV?pgudq*^lU zp)DGLm*2BkM*8B7n zq3AyuT875cpxti+1bH9HJ%jQoG@1dBW{c)ptE_BITBID}L)YWyM-D&owwEIq;?+1l zi)93UduOv@&9WZe9S`iW{8@vVbG6YIEdMffm<1;P!ZRypAvZxB0^)_a7T|#QcT(_x z8n5(t-(Zc?;Q>5ev08jtvcjYE1bngTcvy*V^kf*;xSzw^X& z`eG33_vuWl9EUTNmebNuHVhBg&PyqIP1Q-U7Ax*!}+9!Q}jXgZ9}8C=Pg1Sw9Me5qKDBzc+5)*#wyla_!||<5qx8_ z?v`fy!{YKQ<1HgexVzI$LR#YK9T!dMmrOJ!2f-yxg-?{^d79Xz3oTWeQr*<@MFz@V z7)7K?<1CHGTd;6Yw>@pFr>g(ih+7X$DF16SGIYuihaK;ooZnLhLa?pM(I1`d&8!$( z&dv@`PjQ#_Wc>l0mS{4Oc4WgNE8G2N+c>W*kW67)S_B6MT(!7(#SD%rL#VmPASDPy!kW_Vc&#-$Q$eT> zc!2NU;IUIU|K0Q<>Y5ex)4lsM2s3KNHl;g0j`)lyx4H1dPYamlA<#}qk|0v2rGf>kidj+OJptk zQvu)vk2GsYU~5A(I(zi|%b350ZbqpeKgSUUc5Q&FpC23wKm%x5np>Ojo&NM333T7J z8GgxtjzTD~6CU==($sWmcaM{mq>GCD+}dVq8y}orBmfX?D-U|;TX zAFR=8L~sP%RhMtI5{`GAap;s?K;_mR=9RhVMqkI-G7soNmMtk5!J z(+ZL=yS9<8D*J)u0Oz!T(r&U@F?sFV(@#$?IsVS`OC$%V+rV3Sig?LRiWK}2`B~~K zk%xVaT=(H&0C@`3cX;eb=)jgeh?P=ZB~2a)JjQ+;knqg8JeiJ!&fYP3gu3jDgru;;i7Kh2o)?LZV>L|bvYfAPRMoo}5N%N|+ld9Nwg%*x z^O_#*M*`lvzF)YU2Rqwl=qfN;CSdDB-BXNf9^Y)Jri~HG=NWV{I5;1Cl)04@F!KV0 zM(SH3W>%S^SEpu^6j5SC0&p$BCNjIsQ{t@;XK_*AkI<+oGy5Qu$g2Mc-uVt>k|Cqm z_5-&%`MPmEr04q%bU_Rk&xVWi9I1NPz|I0*AS5Ji^@br!QlU4l@{hZ2H+04c@DNz5 zf^apDUffyLCBzzC5GqEnJPXzVq=qi$*wC2F^g#VitP0ww12)ihs=pnMibCLvx`VSb z{$Z?Ec=I4RptV}aSSBY;0|Q6H_)KQ*#Rk#JUuYeLK(UMirluh@ z3V^yoY4#mJ%V?Lj+!1}^sI#>S>-{vO>rtz`Z( zdCWfvq;x7M3tK22^sa-DQbxy20djB%`Y0J+1hpBCQ{u58pPm|2XbQ8mX^hc@i^t7; zo$zhL`Bk5lg#fN7Cg^6Upq;FwZlcqdw8)c@ntAt5F3&fQFj@N>zq8mm0VqXAwSpPR zf%o#qKN7Nv^PXUV(vbYIv5T)=rtHsBdTMSAxz{6bdrF%Q~_-{ooipB zGmCot#J3)`MHs~|on0EnUN-{qNi05?xUW)NA;&tMVH ze<)NrlK|*y*(gnkD$&SPS60Iz)S^8OcO#Ek{p_+W>ZAKyCMhY1ah2=~();`(Sgi2o z@1bNkeoP-lniq``U)pubfG-Xn4t|!psIsae4sC&-JBZyAKhV{26!=MPj4obf%&W4p zAhys(JWM2um9BMhYzqr4PM@hT%Y)Eq1CSR~@7S^ z3=Te?^ZPHX77BxL2F>)bH@?YwzCP)IfCb2MwOEBc5RtF!u`9SMZ6uk8)oVH&EZL2( zz=r;7??mCBvbjsi03_V3ebk4O#5@7{?R9Fh1=hVKkJ6qmIX=E24P^mj7_#FKwR+h1hjn(+yEli2Z(muZyn2it+50Z2YzsSGu~ zCi&iU!3@G^;Kd|f6nJz4dN3YH1^hwqac{+yfJv9^aqKxZ-1Z2fJzz)HMhSVi6h;gI zka~K7hU(xid^I{-FRk!sFzl{K^HXw%OF)$z@ZU{Lu#&zAy zom<^}LzAp*tX+>+sWLN39k%vPgFK?LyN+Ie(rVI`dHZeTLcUK=7ed>i6ooS90IC)aptAI~3?hraVqVh}0s zglSUf|L;u|?{bS{*bHfYxdnGbA!6e?Q_$+oKrV9$juCD@1E82Ay8h*LxqJx9O zGSGzJEWWWf`UA%CZj&>Rsyzt>xLtBj(my!N(|C%5%rcb(?&uGHgx0o1s3 zdbXGrMJnd!5VXipq@5p|Qy|N-T&iKRQ9(Pm!|{0yKh_JVK$G0EC6H3BvbS_G5jS?; z+XbTsVkEkWd%t8FbCLCBR8FVDAn_Ydt-)zq&QvW#^?$QY=ZuSq^wxq1(iZHtMFAC9 zn42!|*7^6nt$LJK1ff$ReoWoEXr9luU1`6W|-J zB^w(NUgfY(D(tciI@ye!NiDhCR89hws#QmV2>Dd?*HOH;9LiIp#MI<@?8OexI)W7J zvqGvPNiM*(D~PXSM9p4a@`!?H_v_a=620UE$Ru3{xt(YMJKyO+^ogi=919FDN_jBn zvt*60 zAWV01>#e*b9|MYKAkVN9|ACXE#MkQTSYdW708q}y(-hJ?1i~oDFcnZzC22MB0e5w@ z;wB~0mEcM`2!C^!xq~1oA9RORc=h@-zAX6Q)bAN6s?WD?uzMf*y2XM-rL^a#^*$_+XdwJXyPMo&8^Uq z%B5hlW;Uo`05XS-1-2Pqf=1!QLyNES-Rzs;?%x1RzfMC|X$K9UEITpDerbF7IGff~ z(jV6iB1^0x@wALQACdUrpgb{CWqx-)mo18WJ%+%;eS)&`OVq2fgL$=^_qoKVGW0G^ zut{#7Zs+`T#8l;|ClNc2Y*|P56O3MhmN_2kkAp&-nL*Wn&}IO=*^Ds{u8J-eyXEG~Xof4{T3n z(a(QWDbgMW+Oe20j%JmV`1p`eM(^ztKmhAw*a^Y^9^8hB`~}@^SEXsnlY93sSC$9k zWGTG%0c#jg@mB=Be&!Sv!tYVfmjdDz7w2zjrEnkct?<5bSZK;~Pr8+0(2^pQ%fhW%IpL_ywub2ao1Fs8U%KLfh;p-^R# zRS)b@*02dsapF{`K@*LH@1>xLMoX;#9^r%g_(;0<2WVFwu(;?oFO2!CL}6|jG$A;G z;?Idlxx|4c!$}5y|M)SIfwmGrKl6rY!@aPp<;K=@Gk#u}K?lX|hER=%R%fq?4Zqj&q z2Ar5~>U3az`2ZRD$kCj+P;=_djtnk2*$5*eRV;ow9mg309EeN%=4u22MwfFz)&@cX z(~Nt66k{y37CiXU7BLA1e{{16<)()CK=?cN`ymVYKZYv*Fe+((0widfyP#$8-Hits z2zcR1bB4-YCSHMrAHH1`mJ1Qoz z+~>}i6+@}{{wq{DzVI_tDH1rfz*=idWpG-$AQNNEW5-QOP7O(j3euO-7GM7*qX%ga z4vG9bT^W6H_1~r|v4slH&R_c|O?NkIPbFbP--65>2Xz302hIgUv9|^~x^i?aY7UVf zG`fKKYjnh5u97tg%AA;Fy1~zN;`QRyU%Fq#teA;%1v|b(V)FX{DUkmB6XT{I&pV>wu+8&(}d;@Fh=4J@d*-_kU-Tipzes+mk)ay9T(=5*btxa)*! zeXw2;VB`}aiejp$9De;7xOq_Y;E6#!eN*&HeodsoSQF!_9PqaPw@ z1K4IT3J$8%aO_O@kfS;-D9eZJtUob2?6MGP=?8gtJ8QCJv5&tyEqFsB-PM!GGHvNo zgu!P#U0Ym*;AXczcMBN&)+5=Row{sT$a9Lx%>2_u!eKW~f6zd9r=ZD=SH8R5?^U3u zQ7(Ffe%%xYr=07mbbKt*dA zM`r|j>?qwshmtcQQ;y%0u)h|nH~w*MU(?<~!CFy{!i|FE*MgoMVB940gyx|@^L=C> zb}5(O)sSAlsZ$jXh-s-LL`cS~C|L|2tSCgOsF+uHlf{Ya?D?_H#(IUw!vawx%tUv0 zy1aKLa&lmNcx);sR+U$Hxqdp1OAY_A2vty0_1^wu4Gm2NARIsW(bf-IL@nuM1&y0NaD(Ef+Q$Z7=DT~ zmjPqU+F?5cA1E5S#v3EgqCUKs4wOwL-((H75rdtbVy3p=Bw$-?bIryKV*IAdl({qQ*km2CX zw=n%a>q=N!ui!qzNz-0+Jzk9Y;a-UT(fkyVzYDvkgPMx-arOnX16qaZZy)Ojv z8}`4N%)Dx7j4;*gX4b(W@?cvr>ilZX3Y@q^?Bar7GB`+OmN6p=k&s<(1F>ZpE#zg_ z6`L%hOu;6pKR$TO{OowCifveqwC7W8x}E{lQ(OLqI}vVXlm|an1@XKw<9JN!(%8N9 zIi5l!K6!IiZMBJ+TR@PgNLTOeWsPIL96ZuP5|ag+A|QP>-fZd?Q}*(LZ$Xg(_`PG@ zFp}=**kUod1n%1TD#K1|qXmb4A|MNYt4?&rk2(6P#mRiD!%*lw|+VDV)-QJ}M@4|~!=@{kLfS{AaeXuP= zCDQ8FdYSnxI$(z&`2gyOmz)0h9{b7`rvHkPd3TwPkVZg24T%1*>KkEsVl#qoc~YzF zqOrqa-3PWls8%}k;dTe2msg)NH;+#IZ2H;sirA`Nj9hkxUsLPdsTpW;T7!r7ah_(0v3V zURz1q;61G)%;7kC=empFm33LJ!s*V7uGMx>_^Bt@Gda~|4b2(`=N@ndbum!D_ik^> zmf9lPm5;PoA-49%c1b^%jk>lAAxVKs5J!X+`qz4p3cTU7$Pu6J^_rZTkf?uS&#>_< zF5$V+@n*Feefw?UEyv98U@k{dRX)jug^ad%f)puvhEMA?i)5-4Dnt&^Gm8+UD@Sye zMxqi8jgERRvL(E}cb&WR=i8$0x=D>E-p+In|4c_iz9}C-3lty;`VL!Oh%#BPaSIFkDTv&}Elq!I zi(_x%1eVLaik1np#Yx9QAU$o$F|R@mu4uvTIf`?}E2~b~benwGSRE=p=5mklY5A7cE>J=SOvq zWdO$Wa*n>h-Zi`T1tn30NHR!X)?*MOC2NtRvfLwqi4A&bfpgMsMV0-kTm1Rf#bTsE zR=*Mii4TF2E&#bQS<%#B65H#8j?rLH@@xd3jQ0|a=l%16-1SKT>QJF>ErVT^hpAfN zEB2)A^@o^m(U`;5u~=a69k@3}yuG((sxvYQLg~)xv`1K8Q}eJgmjQFh3lAh@WVRKc z#=i-otg0=nDocn?kC?F5ry+u5DZVt=#XxewkZeHmE$oG@0)KPGC_J|M#y^O-D6Oh& z+E+JM1+KF%I9AoTQss3_Ee`n3plrrzF;?x6$zg&q9r@k0U^w`L7ENK0O|o`1zM=!( zg32UkMDXV|b;#%ZvUCF7*K&TzVkh3R_Ycs430GTwucq2s?XmsyCz!&I#>roiaO9UI zNM21&oH(Ao_+wq^JVJsqMQ^SVmwTTZnH>`wTMPZ{9wsoV#>cw|?Yac_;mL?W^>VAG zaOPLlnau0{2hFgs2eyFkeud~)W6sHy`PF?^esm1qk%lGnt4DNPgkrpX#kYL-*^$P+ zPHIhDCNZ&q2z_vN6ij!5cc5195=Xa|$W?bsQ2rISURa+UT&Kp*ub83=h>;#gb0`}M zGv|Z-?{TOYHha4oS}xJ(qvi7fr#&8|LeOIPYFkttte#xGy`8k(nWlM}?>YoRGTtNz z#4WS(m%T2?oLQfnXfd3bRtmHlNmg%+$-g)JhZrN0QZAvg^>np+3P zqCta(uy@_6I)>7}QW`=Wkx=8r7j+1yZZOj|UA6I{?xgnShp%p2IP@o&12{Y_ibN`` z0ij3~x3@M{lq`gNqL}IKH>X*$W|Jc&W2XOp@7g(R&=Op`xh0}|Z`r7>7p(o}K$8oa8ev4M|=PjlU zLl2Viic|2s0ic773A=qi_;i<9%1TSl54-wuH8dYZZ-9}Ht_(z; z#+?&o_JOo0hT$0Q9rO;myCZ9rX>>t?9ac_k)G<1`!Fav!h+&_SA(`p-P(X z-C|;%%nQLexb43X{2uyr!072nWLZ~x^$W>B_t0DH@|Supb4NwAKM*)wsM^{(EslSl ze^d|A?QAiEY8EYB_XX8gS*Dh_PtR3(*IzaI>ehVZI}4{9V|vi$et*$hiWCfE21B$r zmu%VhjoPZ&NKCi=`17|DIt$*w94Sc4R+t4fOstI!QX80TBPiOBKExsGZ$(UuCzOCv z(H6dDOcC_xm95KOjcHttZn$dND58B}hb5M<_1d~PZbJFh$2Ji7vh$R-ujRga9_V0@ zldk;=y*Yw`y$kM>g1h%CxDWpRuZU4(gkKS(&rn~$;(P@7+LhfYV9C1pX`mG8jO7cN zcC>l{--(2okOE#h#L|EWNXr~JSzxQRE(5+FiXx+)#PlUDmHQ4 z!4D+ckMf*NwM3uyokBCEkkBCB!8c(3@pY4>sGw;&TTm}lSOpE8nHUb5H4XIu0ld*? zOT{@V*>XCj&C``sL*kQclZ%a&6O^#^;U5drXR2(W=Zs3~I-fGJ<9Y9K?q1rSR?3&9X=Z_`{$Y_7@ftdtwW-bKEQ5q zXO5J#DA4{K-;m`$i+)bmV^08tRT)Q8>DZ#>34Q!(CVa-P-Qe*ciK* z__dR&pD0SWbYP&Y!t&vQNg`Q~A60p#i+M?(h0V#XF3Nl34SjU|OMT&>YW>bod|0$t zeJL(4JLSh|lpMLgpYRWAs*m&mO_0yWh7HEMjO@?0hq zqA#*iVOE@uyXDp=GwYs!pgDHSbpvbTX19G)N6(bGm_fA!doOr+P}@PT z?Z^-2a>cyR7!1!-*gsnLpx;s+yfUINP)^}Gk|1uYR9sqga433?gEcAz)c^Z!1 zxPLh6I;YMlIhy(^CT6c9XP=L#x*5oZwd$R=ArRo39PQvlzi(F16-)P%rIA@{h%FOp_ig9Rnsi-TFCIRgxAj>cgDsri?4& z^J+CUFSfU?K-D~xNE?Zz(^sgGBlXhav8cSPxQ#Ugq37f@vSYc^+>7Pzn!banAi*g5 z4Ag9^n}kk@igG7Axs%5EY<&XH{{{5DLu3E9KtF$N?y;3}6y#Hd_1;6IV9!N60f|OG zeoOGqZAKzYUtxgdn1)%J>*O#U?(88Ob`u~pF zn?nF<7l_>b8)~;oytZRwO<@xJ3u^c1?<8vkK+zB{Rst$yWT0=mGS1CpUHLxf7J6%4 zo13X8OxC@BqoODe>uwk2WnS(;0Xy8(XP(REi6Q7H|N+!QMbP;ASim* zSyD!PQ&w?Z$7#iODN1v&FyPbH#QA*Eryl+(( z5tGTW|HC!aIFHTMd6SH(oD%T6+-w1cw8w7*w7qR~DlKQm22w?$AnVZ>^}8 zx}l0+F0MU6|6=)=y^QrJC@Fy$-8V)oHM#emWGVnY95|C6+D)1Ya-;exZW5{Dr~68T z1jUYe4D@zrfQ%d1`)3LvG*BLr;z_IMEJ0TGMpx&&GIzRD`u>QN);#2yZw zDJK$*bKVYa?u4R@xgOIi!loM0@4<_}H{k>6N~LF-ii@ zIb`uFIffk*@kl? zXE4D}%gPUZT~#NCPGy4TC8Wdt0Mb)LJ?Q>q37<{ulTH>snQJd3@;>qUpx2u6Rn(V~ z{MCvU>#9cbnud8*e%Ue-l+Hs+L4%<{s#4tIErRwkW>EkxIeA-WDY7`tsEPKuWJ0`o zMF`!R0{3G~=H}D3Z6mPx4MqJumXJI?z{*k>()earhem~%-H05_O~M}ag3leq&RLi> zH8A4^CdDC9j(x4!1INnvU>&$^V^}9qn!o9OeS!udpbctk3z+Z{d^gIFAi>I{jTs?d z#ePUCGhWrj3P0NX9=wR(_}G974(?UIs{zEqD>Z?|{R4(AiTEiJ%XZy36p!~Qv??2secdWAyW>m_)^m@d~G(`K_i<5u-!!^l+ zAjfKUWc@n~9Fb;qU2X6k=QGUtL%`61^Q0v%CR1}^ojKM&wJxdRA%nj}s)n!#k2Mi& zyE%p9LHE9~q zz;^)diA@C8Lw;ISbnQ55R>3{A3GQ4?Vvq6v`(Q)#ODiV`sD5eXdECX za%9iEFxBOl1t+pUI(A~Jnq3J=~kD(omBBg^HUBTI@s)6xFlkW$l zC8&^pgVvXkIBT$A8uI&i)f!D{u=gSRmy*MRG}~Z7A)%Euia55{<=*}z@7gJh_9S=_ z6=DjyGb4V8V#gTlCCGw)d> zmD=|(0t_1P##lE5fKV71F(H6<0Z?6o{ck`O{E+3v+q*zVgST$LsSY#b26HFF$%6gg zAl&~Se{sntJ1=_{AZGHYU~Aq|RKFI-C+`$SUk6z8f@X?ZYJfFto0}4G9cog%s?rDv zMoft~aMl3Yr2X4X6_`B~amwxJ*oTFJ-A<%!*s0n3DB8e{OT2+SD9Nvb<`v$X>+gn> z>iFBj=r>j?72swbrlgL#4+;Ui`2$#(?_)7Oum>$wU4Y)I$Wu2l)*oox?d+s(Gsl+| z5OP*lR;jHtU-tR3=c`Ou&-O}-7V?s!VQC}3`*il~DZ_NEVKPg;d%|%L@_eW3IC-8l z6{rvbd>>)I01#JEt;kZ=1AM_CKSm~gP7ZoT5C6fq_uby?FrzW>OjLBmb`g>PGjv8s zepnU=WJB)|C^60|l4|+VuQYQ13HY|WiV-8QCL*f%_N9X!5sL1#;Z!?v_!{Dv`GSKs zyR=w>IS4Ys+y3?*54e$i|l13P+4 zjh(R#5xfFEMfHp-L0b<|7n^dq@2I`BV^My_&SU+99+Hago?KpjY!C#3}hv6|?% zQ)HS#2~A9!^X;T;87~mq1GYE1NoHvw{|2V545LL?KuCxGl=dyLM|pv|`GT67hItHd zn1f61`}&N4fYtNC-vo9*43bBGDdkQzsd>^8{rK=BBIe22OF1zoKH1zjCY1L5fcVd4 zAN+mxzEN4-DDqrMMols9V1eJ|0uj1davuEvWp^rrKZt@Ym@E_@p}57}kzA9>x+4G# z-@jPj5iie5ws8^<1v=HeV@X|W<eD;zm>QJnV~AP*RDpV>$%44FkdL8R}mF?|N}zRL#gXu@RK8 z+}Syrmh2&n8yW)|9O<3JTOw|O+t|;sCCnc5lO3q3O^1J;SCghmd#QbdD~z7!>v`*X zo!dn35mL-E{{6kyPKmrDau`5Tfa0UXXwHdsP^3uQc=f!n6{WZ&urxDi{v|gTDDJj*dLzO`dC7Z73#@$6t9xc5V&|CwO?JueU=U zO98RfZ7V=zt(i;vj#%9?F*k<~8WDj3_P_#>RZ%L7rfVKE(Q{=K&uu7~r&hHICa|||o`+zQs9inHxC$_-;5Ph==oE>3wK}kA{YiP-bUAczH)@xT< zi~%#_H7p#o>;8+sd7HpB?YMfF8#~F-t5#iYJ&m}q9_rJ7PKL>n zNlRJ_jvSBvzcHGUZ;VpAY(C3did@!V-c5u{_UFoF6h$3 zzcDH700*?$!g$UM7C-~dnk!=5uEaJ)K~IBKCM+L!c@Uf17Siur7=uH>Cn)yl$S+ov zvkANJ`Q~T9j-j%-<1>MK)8);fs;HrNa`LCB%d{TDNM3*}+$aPmaY=s>Wlzzqenm(- z{I8%!pzj%Z!aT?Tx!p~ro3ESXJHB4`mqT1`4WwqFc^i<;4s0-JwsV7~=bueH`oVca zi-?F*hZ#Dkg2%@qQND@$0!!58Y}S-40%hr-KA}$#WVEKnA8S1sFxMs?Z7Zpgm;AXe z%K*@qd!`|B5>LW84RxWCbtkAY!RiTAI;E~$4r2F=XKXg}o#6X8fu3W6U3qig;Fs3; zr}V=xc+)|FeKW4liH=5Homq1X?GFS#*7)o<&(4(aZ=cQg<$%r~C@DY-UAtQg45%Ge zCUNu$5+HeIE}8ebjR+y6xs2P%Th|s!~hXTW=RZ zHRJ8en@gjUUmoSWik$)KtE#d7#b_RFYKewRzAq$0(F^=iWB9X{yIH|{rD zfaGYo$I7%bBh+KE`j~A+2Q9g=cBFrpj(6Z_F_Jxznd~&-3K# znzG)XeCGDnQ-P(xBIOC0Zz%!jOR1^>{>W#C9rb*rSGy2OAS-qO)n z7pZ6a-<1>otHd7F4h|?z2gpTN4Go-upj+mbW5l z#Tk*WQ#=roYf}y)k{iL6)f5ph`8S}7UDC5Eq3 z!z{oS{3G2LI^yv^Gz>YD{PnWT!|;!|P8h4=KZm7FjyqQ5msBj*PRvl+T}$H0jq+RgBnC^;<~y9N zMkVUf2f(wwL^r?-ok@(G@cFk0U??FXh#FjNI#V=2`Q=z%kSv{zkZfOa^`#^rU=398 zkWe=2!ZGJCK3hpT2ANdIC*5VNeB{UG=EZ^t`5NVOK$WpkT=2W=?~}9vXujA4SDuP* zpf$t8P?3}2()USdxv8+OvT?KvnMkX7*(d5tD!rA9dHNzIxDCi`M#?*R*z-~|AZR*8YHGD^QAjH0|Fr) z2C|as^2YW-c|*vl@RM-$1mH-yu9IwSp|0?E%3PDibJ)_hc%Go%Cf26KstX5qr+nF- z@AtT3BMq37AmWw5TN0NXy!iusM*;CPd3y5;={kX`#z z3t(tuWAlwHC>d4{0}t;eq;#umd6h#fo=Si{mP2{`*^bR?5=Qq?9_@?A`7|H@MErT1UGLU4V%# zGl?P>gXf#3^uM_#DCn&Pym~!%Yl36z`00+fXScJ`?T;AUT%>A+$dzD4V-L`KNatAT zE@P&sH}+;W%mUYL3LS;~$Pn=CYWgYV$vzqnewahL0j*MB;`B^=4X6=PZi0ymsOx!& z1>Esi*HVV$ajgyYCS4NYp@k*T{PgS{6F+f5Uuq}f4NgeW4;R+a&q2=r{mvS40q~(} zz~3^ia?s_+=`ZBF@)}8puIgt8{$?Dx{kHAs(cqRsjv6|jgW!lx0?X%pMWr(T2^2GV zu43^T+eLpCAMa}3Y2TkUfAh+S1l17W;&!5VvOupx#Rci|^P7tiQ5_>$kU8gUhNDPukE#I=zG2>V&J=OF+&}F#IKz>^%S=lAkX9G0*yYEJ zJ>&QBrlV1DCu&rVE02dT%8H5Pbk2~I{y8w@5qdjpVT6ejj8DA1*eRso8!wbqIHsqh z@m_oTEPEHftj*FmAm10~#q+Ja!(Bx%LoL7IOT^fpEp;c7(sJvKu+IK|w~xIhdItMR z8@_iHC14=kb}bc7G`|p7t|!xfpI9?ugM9#c1|u1;e#vFI&^vZICnlF>=(y%&Mx2XqEa4X7#nQIC2YsoT5+Ke$9fVufOG*NHt9913KGk@t8GA`|a+Q-@ajUU|_u>lO% zlX*l>h_(H}qLgXu>lm%bj0qfxK|HF3uH@wGh%=(Gu_2Cbq`(-Y1&pdX*|*73%-3E7 zTl(3^MM}hBLgGqde#!HCUq0ODD(Nc>K{z^1mZ6;GSI;vv0<>K(4F8NC*YPe{{sn zO@kG9nViCZTKIM4fm8U8X76w{9oZ@#~M&U0w4hEdh)t?gT%sm zVY;*X_{7Y-v;uU{O?H=1*x(2#;_b@W&&j|LFZJm<#0Nn@!N0DP@oFIm3@5VLIY1tM zO8M8m{)Q9GT9K?*%>3LoF`biwhWW~LQ~47Y)rUOPg+AKd^b8CNy{+^CAA5VLsj&T8 zz~Rq!Ny_sii8O5Dg{cF{kMA&#kCI|T;-zIr$EHSjr^@Kb!TBvD*74?Sy#kzisnTwt zENFc%z{P5NViFi6da+>lMU32bY1{~!S;yz3ZYMP4*@D8&srfDwNEnu83;VUzKY(*9 zduz3%h&a?k*YJ3yH;_DU))is&{|n{@DguW1?Pul%y(fT$1@bQjq$-Yayk|IT7Bm}w zFCTcLq>CNKuR!T?v+chNl$)R-{U2e5+k**U>GK@e+3^&NL9 z{QK@k2F|l;Nei62iUy{C*yC}CI#=C8?sKoRtKD6Rr_C%*rKV9VQG8+n|A9tE)e5@y8C zY|U^>v@nv3mQH8v!cJJI>bv_w`0cw>)K4Bi`e~kiP+yN`U&8|fsw(*Uvf&V+w8;_A zn3!Vl{xZbPDad;h*5eeF$U{3(A?Xn)j*k3Hnd{6?zA3!|{AWo;(X&=`5OId1kNRSG zP9+wFpsC;1kJD2#T2ammwX>W00CaO114?xw%$OGYTrX|G^MfKTP(=Ce$)6yE81%n1 za7d)|@&bl8-4!em?c&;|Vo<18Yn3_8#}{(XfS~fT27g7t>S*u^1qOgD7RQSS2$EYv zWO@?V^GgptSX`)+yYDRTjBN;0#tU(LZ2d3jLh5kpq>Mab56%!@0EO6H&Fs~gEi))p2P zXUq)yvVLKb1ke9b=dPa=q4X*{+fb~dJC1OTXQ(tBf6HB0oYR8%BI1bQ0ziUXq z5C5d*aa@iD1UFWF&cWZ7WWsN!Q?CP(+F4q%42%c`0F1iD#I1z0q+Xs7TxDkFK5dWZ zA|@O7lB`6`WqW?nVW~(AtnMyWF=#%52$4qCIA9Jw-zjEafIWfVe8D#?cxj_-$&QdrLXm<7K?m%AS%N?^7(T3YKB2_L*kXP)e2TI= zg~2dr+UXV+jtxhI;Yd^VEzM%TR=H?YhV$&6=;K4aOWUU%blgIl+DaP6{*YQv}X)_1-7tEe%K{)htnm z-)_+CsbnMf2Y$H!ZbD2}IF@+(FS|bP$&Tn#={z$RSkY&2P*;kk8eaa`;sUPs)?>~UGh+nYi zmgixuutB1zSm#azmP#N`%pn+oO4fyk#JlX3J=ZZx*dbj2hhJqP)!NSb4q9SBy#?dN z=^+geElA9*ln1SK2}iJ4LqemYiLpd|QJ4_{VVo|NB?n3rNU~5m<3ZW!F(nXkzEL$? zfc}yj^TY5wBa=wCd?JMHFC4^|gwWN^vosE`~ z6_pl>bTCa%Id~V_dSP6x-liruGpbdKe5M;GA)KLrpcfVTuzGpdcHBz;L*`j-e}&)lw_Z7EHq`4MN#<${zVOyYrfdw6 zg`RHE2)BCH(>gHIHwg!LbiL6?7HMqspT&pDVr@Skd;%1?gIspbKd{7DmTYC3$0>nx@|8#de^yGO0)>z-#zAQFin`A59*0%#Zj zjobl?2Z;t!-Q5F^e_fWhyc;`knlLpKOY5(kHv^h^d%f>ajdX%X?o=wZPHWLA3M_6 z>(K6Hw%hjR%fz%J173wF~%O23rQs?l@1iCy+H>6l-X!YUvIpZ^39y;{c`4s2dnogck?i zz))tXD>10j^bb^b?(E~#>^%cnpmX}4n#nIfhBc0F`5KZ{oIyae^j2= z5HS5KGb*BM=^$W=n2!&RV!B#n2Q#Xn$Z`-!3bK_?Q#8@9YPoO(tbQYncc-m@NPcJq z6|*Sid}jZxIOFCpwE^izzT!)jdOZmZ>GAQ|g6-LwV-sFs0J<0GtIat%fr#<)!psrR z1jyOL2Ncm7qVb!x*rm z_-5{LwH)8)iKg&0;_R&dG;OJugYOHtm#L|Dm$4O8EosohnCfrVw~}p7P~kic7#+$O zhOSwPdy;De$2xW`Y}R;ga0RRkX;*=+>3~ts7z)O)v>bg7^IOcMb-Fq+5q->b&DcU8 z(D5}&aTNZ{0U3d)n)&dr#yoy)`6WzGRKU9bgHMeSSHS0pjdX34Ds?dooV`Gsp+OzN zJNn6`^!^WULQ7*WU?Kv!*9vF?=a%!K?}X!%*KiPd=v+D``T3ga8CVZul?vhD4geFM zC$YJLM$sjyH;CB)%a1_x7dsi>9ly?>E)RO2OR(twYRI=LcmhD@ean@YF6rfwS)GD` zSex%|+V)yHj^+>HWhSlm3uqK_R0#v|(JJ&KI7E#%=NgKg6KJ#l)x$^SNq^|1tw;4n zm`WToU20Cbir=sqq87h}1_3gUvy04?XbWibKUV5z945VNGEw;t3`I$Jzi3hF{Or+u|L%gJh+R$ohV`&Mmm--S=d!(}?+ z;SN}f0SgeAtV!}Zge{b;@a3@VEofZ&QpNzsAa`Pc(4n~yPNTx3qYSdQ1#0MTrrS%( zlh=1?Wls6^MC+e67i>5wv5x=FPQ zyBlbtX>U}i7od)+1s0Jmxaf%+ejA&c&F1kEvV-A+NlbwPTImrZ)(`$?Pv4a~G&AQH zBP~BU@J_}qOzs(VPOd5lVGl+I&Mn%wsnJZmU5q`WOHOG@3_e5J%&IcJs_$-wA!-q_ zNoa+EH^@WaUCCJDn5#vE6VbM-l{p;KPq$n8d5h|6iv!j8X0|Pmh@jM$^U1z^ri3nf z2s6x~OMOAMqrbCXJp+?s!mNGC zega)5NMp#kD{?bGQlYCnF7&_g`=vdYG)~*`y;C00FO>1(Y}^nt3~8c1@2Z1@T8IQo zEot?UbBD7&M9&Fkeu?2Xdm3Gj`%`~NUv?@}+&ox`aksfy5J+G0RXCtg9?X6hyJF&) z)=LcouNC4O>W{;4Co!7)4GHnvSSl=saY<&VJ`q@5BP#tV82vTkFedMo=nY_8cQ#2( zF!4fHhyMhlL0Z6bomD6MwVI>+QJ0T|p`HQRjj_`eZxoU><&~_8booeRtP4nHbKXw4 z=V-Vyr)-cL<)jYmu)tl&YHM<_ZD7!|C@Q;@jlY#gIKoPqE8X5?D9(aoZdCePRcf`- zz{t!z7hM7*7e21b2lXo>Hq@fqwiPJ@*@4MBg`vhz$X{i!Po`xQxT?O>6t*<1IS6}W zZ~20K1!x!|lEAM;4CmT-$8nr4~{ zu=Sm0brx0OKJx&}TX5a+MpaHlIkjw0MHX4-z1xF}OORyhLndPng?{e6q}KB?l~IuZ4O`WR zw*WySG~dgRQ0R>i(FTvv+3>_=G;5?SZE}@$*yXx~U(#9YfmcU~K?v zKV5C|V88a=yR|Fe(2~VQ2VQR$`$zx8WuJPBzA|`R$P%IQ4>}UsIQ)N*Ty2Eq%R7E_#X(-7Iek5Hy2v6)&tEK{E$F|YU)xlw>zl}^I_9zHrITOvvhw#t{AU@0~7B)I-;XV2R-U}JGo(i4Dtqr6v&xBDUiO0Vp1OHzTH zcx~%_Cgr@{*Ydrm{q(1!XGTx{D$5OkSo>ktV^ z>aK~fNmvH9T1Di@6M)0$PKDz}U%8v!r~eRmyFwq@_o8v_rwu$iPD#N-p<_U&C(juJ|wdGdss!(X2Sg0td{r>S$!(_ zpvA&^SG&~=pP1nG(0&FG!3JV6n!-R(u}-Uo==R)WV5CRco()8G_$?bDp1)JV%Hv}1 zfd@c?FjJLP=BXr0Qzj(TdxxF8XU6%s z<3Ce&o#`#{dP4R)9h0^v>&BZ~&A;FKPc#}4x_10SDu2@Uz?I!q`};dDwCmj9(@+Zh zK=Bchhzv~-2>&M$2=9Ta?ltr|Am|txxm0f3gCO7T^KT{i6HatprZ%mupzNiBDdHnl7(9AeFU8SX97}BQx3IuuL-%L}mqs~s(YwWyMlTgsu*Q<52 zs}A-C`5fO{V6mHro`H`5C(Q6)D8Q14UyTVgcV^1I=?>tBivA<^z?q61ICh77V!ZGC zNV7S+pvUt9M))1CT;s$yexOS6=+Ef~cCbC3VYxpt3Zl_qn?qtKbJNu`&EsHUNS@qV zGCTec0&al$N##x@l`gzm(D@#doPWoA`XLWwnmU`*(hfd;jeviq0%IWqFhD@MjOxXq z$wS~0ERYUH(#cRld}fD9B8BXMW&f4q1pquNKSfKH;?H2-xl3)nIw;}!^tv}U}$ zgJ(KBRnsTkLYX^5CR@MHVpJQm{c_wxLX`&Z5r;;1Fh4W+00P|Zfe(uN?3r2jIJgdP zWVz5F7WPm}L&tt3s3vWo0C>eMy1#in8e%vCHk=>2j5|)%otOD?jCbd1RiJ#M`|F z{5oiy0SlQO)5o_Eq-NmZuT8N?7J3!lCEr)^o8bGGb6sI(v(VPd0GA0D94T-&TgF39 zBs`zMV*@(q4>V&X#xE1_`|{UN|7fZH@vyb!3ov*4h(=tq9kt_c z8peQ2_y-U8JZOT+0VW>-;qjv|5pABNKullKH>$bd@M8XOJlluM++2~CveMiaWZo?v zMHBDdKMku7Qh=^mP8>vZXoD6BcV~?c&st(43hSbHx7)llg=Kb;+Hc9j zW#jzPaQ>0>Yo=_QPi>GJJ`yYj?p}PNQZ~C4ppak69`U3@7bS(_^Ym!-lR#EM{rc=? ze<|8-ER=4Iz{#1J^R~V)DsIBj9jxXjSRI|5K{9z5Hy5xJ`v_iAuH=6aa{`Yj$Msn@ z4wyGI>{`oBg(W(3yR`;9>KvS7$h{lCTeh}F2!zw78EAe5ApgI!qyUMKSZ&Pt z#6xcs=W{;ozzapEz$!pxUF{Y|9ZP8ZzBmOg`BN7KwZ*SN7ztyQQ{LkgjX!xw8}lAB zd?07O>qON(B%$b?x&Qtu+NUs9wVd8;V9E_#owQKNJ5`;4qjk$zt?BM~$|7oGv&Z7v zRYV#l5pT}!B{!}!84V}YnqgU~hAjwM?LZCw^%9+PV%$jO`9^mMS>*Y8w<$<@$;k%U zC_xAbtQU9;sP@lei=!>?WjuSocr>cvwz~vyIk!lP00SX5ZJ}0}=8!KCG`naEw zVCWCPC%xn6vN2K*ZN2FV%GRB^S z#j(B343BnIL}tR(h3zod_LNGH&+1!=f^*XNnbVKy&YufFE8AX;@$4>d%FH?oHf(lS zoPpU2xB)~Sz`=yXeT78_9P^l4l%xLe3?)#(QRU}_c4~p%W_h0a2g6og1k5PK_GzJ9 zQzPk@7!q&dj_3U;*e8hoR85AS%+4l|OWflIu9b^@$08POpS#(Eqhp);><{Glnyu%F zI_C>YJAcJAi6KqqYMJO5nCPfzsQc63F>@T$WK6a*Mh&?28VJcCa%YD7Xc*)VVLy0) zYN^k>;kNwis9UPIJ+`tY))=0qT;o1kMge-j@twNvw>(gfnl3(efG6{ ze{UchfyndT?Mb+87S$pf6~$?{(`aiNB0dg7o~qlBLOx$2l~$BNJ~C z{+0Noin2Vt&lY5eSMv;p-Vc~RnVIR=Ha7>I?L(Cg&WmJ$w$izVl?hkil$v1gfqKiS zOQ96T8_U>SroR5~FK9S#a|!$25jaJ3&@*b|5(d5zvO?LJth0X$azniSi>R_dl%1Mj zs3&eYb5Y>WmgBW^PQY#7OhP-0b$TEiPt>coLI_0nn}YI+eSA2rD=MWoD=QR?U4t+= z)iX>D{f#r3@^?!EY&e*cKJD32xBYvyf`61PRCE^jW8y<5O5}0$`n+y~WvFWf2cY zc^OH~K*LGP?tB_aFPQvw!=*WU&CrRuz&q}#bkVoG*tK+!(fCxC*5zV{8_$q>gFAj@ z!R*z+du#PY>~;whL`H7*Ya4}|8En?EM|q3kfc@KP2a&dh0&SIwGUqFa+jOSLqCM5R z?@u=n6RTMf%3nK0Rw-*6H-AG0#Vm-yW^a&o)E~_8F>mzK+QMRG)}Il&JU!lZ^2f&^;dC7xFb$kA0QSAGM6R|t{b|MrN3NKC-e@seW;0O3_E`5yUSLy>^*B(?7MbV#Kr7 zPnKMk%5)(jW3BG4)9nx=mdpy{hfC~XWK4hz)4|BfhtPp}0ba#392^jN@4UaF~r>+&Ej;Erd7Qzk=jt-ZS{7_CzXK^Nm{?W~jZo*)D;aU^p zU3~K~I5-38sFseKfyNIU2|5&WhJ7KIcBK5o5_QwLtaj>k$&Ff!n2710_S-YH)B;35 z#KhH=n0kMb2U-i04e}qc7j3FB_ASz!d?zm`@vkLI`y+4LD_jj*%UbAO*`gJ~hLC)7QJzr*AvU5ok4%H8bvBC z3v-2EHEE1J2ne!9Ad;1pr53d@=SPMJ6-XsEgt5Jx2fBn+^Fx2?%XG$ck@Ru#pDfMN z2geq<*@Rax9<=7R;JK83x|N+lbSWsP{`pJoZv% zHV~xv_C0k?STNCaaFF;QZGU__SwGX>d_3N2*$`Mw8s3o|^|-lzVwp(s>EKUGM9$V} zRfo&UC{GSha@(GBG<_TY zf2jM)fGXFmTP#A6?vw`UZV(WpTco>Fq+96*>F)0Cl#=c)>F)0P;NJUuC-(X7-+O;8 zTx+@3yWXe99AnHm8MEM4-a1HH*!t$e|0G%4JN^CK7cy`;8hOZ0j1ng)UwPfma7P@aTjKOyt$pdJ?VY^Q zV?c*mI=E;`ap{*7u%bM2_;IUr@1$g4fm{%)S6M}3u*9V;f`L}ju)h;H3EO7D6alzxLTs9U6Wv@h^xo|U24q-vJ zl^k*P!9on__`}5%NWTRWy|P$?!AukAU)D7@1Fj@|FBvtEh4zr^&vQae7hS?x5Q#l{d!R9 zQ>W4Tovf1mdtGqrEaP~+dN?y^7f!z8s|0HBS}9WH&~wR1BC(Wn4T&C8Zn9q0{V4*3URY ziEp;QtiAXhF4VV%-acOE=*1a|S^8!;E(C^7=Eq9h#4vV77c$OJjd&W7!KL)&cYZ}W7T`0YrY>vxpev4+N>=f(PT}=xC$B#69A zF(VX2$Co#L34Z<-yVo5@ER4d7o&K(4B}X<)}(a*FhWU5RM;+731@> z=ttAMe(<+@t4g4xU8>ZA!^Z=7^7QSX1a}5r3szDOKHPF45xu?fc22;i8&}SZi`0;q zW|CflG1ea1DmHZrw#UXpyqZYbyXV<|kI3)atr;OdmN&lLuSJPwY=-q-Eo?Ji1nj#n zGrz=@w}HhqGt09LbYwUGMhCL&P`>ondCcz6sG@oxP1n`ZtG0H!4wV4Xl>$ZZgPX4q zIHP-_Y!SmH7mw$9VqMkW4_CHxW{I!g&&O|qK0-fb$mueiD6SE@j(R687Q1OS_jWdv zzeM%DQm#J6)NOHObGH%rbQoC)ADkR)X;oI7YcW^ixRto;E@^p@&*{3d!5viRlq*vJ zQ77%(TgTyF=ljFn6z8c6cld~v52>(Pui*Si-H)M^OIG;f3x7W`b2IeU^PgoR@+vX>b3S>0D_1 z&b#Bp9X1dLRBWVGW3tNvptQezRnoSV_uhr(_}78ry1paj0%fkV)!=z_wRh%YNh3e- z6Ioap1))XsjzLbRCCbZ%>1q!>a|LA^4XUjPQ+#khCcjcUU5YQB>-jla#9RhFs3B5N z;Bt7rfF3K}nS1i7(nQ7?j2v|8k22%sSz4-m4$JlB?1TOC(kgyv)Q@A&p)L_%^u;HhtLsY^tOsYh) zn_I7wB8nDD)=pFtcR^04@AF*Q*C-JRO%2R}brU6MR-Wiv8NVUv-oc8wj@cPNrN)&U z#W^^j$vB|vmS)yoanB{-?3yOQtEJ`gD|s%5jk1DH>zg~>85P+=X6rgLMKkum$r7og{Lb$O{P0PZuD z2>gqQ0VGAx&>_C2&Qn>e{FPXsRHAyLX=;6bI`G1KkBe2djhszuzq37{e`SyC$LdmZ>W z!t8Z`%vonk3qQRmY0CVx> zjYTVDRV-Y~FOGrX{ciMGg|X5JRU$6lU9XYFy7lj-56Iyk7;&uG z7k!O1po$gp{SfG3%a@gH;U0dV`SVn)o$zp8DjVskNw}{YIzVZ-VPek}5_{L1 z!?Ip>X*|?e7t^5Z5D0zW*WZev9A@dGq{ENrH%U;~=n1qPdx0aQImu$AbLN%IZeY_t6y zV?VoawAzCBd)N&P&Bq(ejg2NzUR>6oM<~38-BhK=u#S^uzpQ4r!H)w6^V5cE&%&u{ zD;+g~a>Zj}pYKIJMCz=kkh~~@7sjx6lLC+h5CWY3j@<7fa0O-FV=dK~<0x=3ZrJKK zWhI}{pi>Am>G``^MH;^wBeAR?s`U*_^F7TchP`VNsv2e_zDzwm@0@$nJon=`?HCKI zzkP9bzC{^wB>W8&BqUax3bPx$3a9TD*i^#zS0m&nY_0tV)tZ9oOwR+ipb3zXP5BN3 z!Ld{4y*?2xHqgv7Rsqocd_Wh>c=m4>w)Qk6H7gudAmxv8t(97`_jBo^?$q+k~Fda$>VV zvr1_+-I4J|+9DzAahEofN#A=`yQI3t##mV@E65hRyYJVi^*}RU_7{3)xQX-JF2>CF z_Gtq=eLb|@ebn2VD0bHV<;MZjXzMt^URe>=+&D*dsjQc&IrY(WryB5>B~M}Z$hRLC zWzJ0~(+|rTHiU+GH7cq;d?s$<1zFl?8gGCG?)wq>&w}8`+4fhqI0^_yio@R3X@_X0 zXS3Rmm_;lsKqt{Rrpw_tG1@46g%8r#w#UcfAGGWR`xJ3r!IaTo8Lc`Pj%S%cGUzJ@y67cJ>-kYM zLkm$}eK1t{c{goKE6z!4pr#!n!=@1yl~wu0`9WY)-07Mhd8X{zGVxraL*lnqctPBy z^%7JWbYvb5=dr#qYrfC#_>3a6e3!*i$wApZnA7~a#m^K=Xdxz;O(yB<5gC<{Yd6ia zs8-Zh$%}Ux@_9I3?%+a=ed@H%!YtBh?zVcvjnBfzz0=?&VgpS?whU-GSJ?Kq4Ii#4 zRiM=LMC*1?O{}#Mzo0$y~%m z*!vCMj#H%9tG(eL?hi?$+gKV5`y_N#h+gTK5^-6Q3K^P|YmNWf>H4Y;py&FRDOxjS z#_4ZgVYG>{eGuQ=u|{{VJ~qafNHPNghX;?843n$1O>wDddcj;yZ`XbMO&g1hx{P46 z{KV*_+nIh`b$vjV3AsNhL!ciMMPsSa-m$Gr^tvWA#Jl+KrZ_@=r;81FMOxE8G)GVX zOsRt1TFBPJWlI+q0NebQtmI4GaFQ9y=iowTg*yO$O*;#0E{D0bAA z=7k!^xVle^c&nFqzl*d6jGe84%BL?W zC)D*L`Sp-}9cy+9)sn)xk3|#1rN}bKL-Ud$5niU}b-Uf^*6Nob{RHT%0m{71z3Af_ z9DMl6d6gf&uMg}tTuFr{N9_SB*%3h3XpVGP)1O)7xx(+)NdqnDXvyZTkEJXaH?7qw zeOp0^I&sLhVReM6V@z#2I{zx~N~-h^!#+ei3rBREpB;CD#_BIbnFn!SfUiGqQ@aC& z=T_Rzqge_|%S-oB>ePG8>Cn7DoI)-~+B9YuI~S;aDu8Cm(>T|O5QEYyY)f`~e_*046TmzTm{ z3ks=D{NHY4;Tapkzyu`M@amJX+r|DVx$u;*yZ$rg#Q+&Ax$t=GGwdYW5OifOJr7`pVGP(1EUHzWfmG>AHX0Z|Y zG*v|Y6OX&W_I5y?fpULA`rbOw{~)3DK>M+dHDeSS~fn{4s^1BZ@MqjpDX6uc=2LFq5YK#vchX>!Jiis{{vU?lzXmZ4+KRxi+ zaWXci)>fw0p2_|w1gz=Iq}5v#(KO%79TYng|ECS}^-edy{OprNk&%#1Xf-$@&Xy9w(Vxp4d zfHBzycdw-jDm8 z6ylwaB3O^dW@DMWE)KGVoxI#7Qf#X%U-`J^696xJhvJ0XWtmF-uvVxQ7k`1s5BOuZ z`)$tt*{kwf<_~iHed0g|0xYX*x&CyDgY4Ky6_u{-_Po=DXrBHH`<+6P$ZiR7y8Nze z)DJ|ulA1~%=kek2H%_QP@f=_2{SV}W?MRP%M>9)>Lnn4yAM`(L|#?(f0Z%GLoszQ zVfxw(5IQ*Ed>zu-CKZNC1;{-&CwI~T4GrYPqOb_kju6~ljGRRTs(KEU{)9#j&%IFr z-<%hyi+~ZFc@eTS+$@)MKVD(DKUuQe6K0_VipQRm*pUS;L0m zkFx`Uh}j02ICzDW^t0|`CT%UaI6$3AxTHstIF&sE-=Ue2waotWG9qwlC%1~F0T+8x z+?EQwGjJ@TsUQ4+ma!LuzY)U!jbFZuq|D8^yZmWcsmu+?aVbf@X#)*6c!7QhIzPi? z=VKTLKXI_ZYdh5s0KN3WRQvauB;c5W9E$YVC4dlk zTshWz`YTLC>_*C7Io@11X4PUG=MbqeI^&RWxL*GNz!YQ;czd$ORdw2WpWCtkWs)kY z7VsD`6)zw#`uhCqoZs@0Ljs$~9Db?z=_UZtENS3yD#@TJQ@T8HG5V6uTs}M&WIw$~e)Bnn`!h!HSc3&6$^!yBL zbYkl-3RSLPWvowqK+242s;Ln={njb(c)K}9km%Ab1U(R-yw|~`4ZaB$H{2GE#7a3b^?>dz5PQ!DksDEdH z`!odLq-dW$(x?Ew?B=pP_B3<*_p3m%xVfp38$=*z*BtVC%ESMYk36T)qK7t@7-{uU z{OzG2KRL10VZfMa|)*CDkyZ=hr5g#d~l{ugdkW=CCQE#9fBxq+GLcl}D| z(B^7Tsl-MF1yL5G6_$D$t&0#I(9EDVv^Z5VSv&x5 z0vI79Qpjr_4h0qy??Ev4@!c%vCP(|*`i&%0Xg!WHE}kp%uD)1+gZC)|4RlNe}AF?W!E247znj9C!ctWL-|p6ay+ir}Fgo0`lRBiNs=+UM=foLZ+8K4}Heop$HQq8d^!Uz>R6Y%~ z_kNx$->DtD^?(DRi6cHQP$2L}gU^q%DLc=A!cYKlK&?f2zBi{hIYbp@ZQ}pPwG;yw zWoA|YJhyQ$$z5i~MnqZp^3MPwPZOpcsX7(%McCen22!(t#SQi}EIq71NY$m(=P4?@ zXt~M5&5U$;QVTQmS`Kawl5Smw2vO7{<+*vCpRmlRxSmg)RGMsUar!~G3$XKf*skX^ zM<7-U);$emu>X@ALWZRd>t0n0!;5Sht$_GC{Pp?ObMMs3UV$RgtjrA*TmO3OI29d> zjCGVK#7w0t5|Ctto46b-X{q2!Kl>x0t#oJ%Trz02BQ{1-`-M@0YHL_E4xfRHZc9>9 zM9=I)_9c*Nq1*HaV~SXj)E?(y&1dSXwq~5Y&9K03@N-s9YCwl^0PJKlM|Pi4DN5X^tk1KMJm5i6Oz3%#3ND@>2P>rfyY$2xy=O8vMB*ZBtwBFt~X^A;9vmnV;N%i zX@dFg7v6uT2)CrBxa;e%$LUhT-P3T>qf8VUl}|w4{AAO-B>RIJZ<4`zQm7v@*M^cG z<>lH1Z>MPH7f{o?`rLG-B)2GPY!*$>bA_qx-^i2?bAF}z)BLrnpo8?8YiwT!-{nms zt)b+m_rJ3zJ-8^aTd)*?`rhq@o`9q}&*VVS_;X^BUhcY&fM{l<*92^$elYsK+CU?C zqG!)YL%xCV(~5l;#IdmeTlgUxXnR(%U@K5#Hj{Shya@egc0oW4{_ai#1Zuzpgx!Yr zB<2e!LqpeLrd;2kHkPTts|U|qm}jC`MHj=wd44XUGRxUkfp-Sr3jAkZ)Y~4I%Z5f; z^O#+7Z?jJ8LCjHZk$@?*^@oeA8)O`K2swn`EjQ^%S_u>YH2A-Psrw(*2DEn@*_0^w zIYo~qAo)CbWHh9d!@X&-nU&Dc>lFT*nj2BYQfXQ8vuWRSHKIwB$`ZkR5n=oMvUSrtX6?Yt!i16ZyL2%NTQH5Pm~uT~d%Lda?S29-8~3>o zz_^)lP=ikoDH%!b!@EKYgU%>tlhTI+D;9yme+=9V76&fhy4G;+2v#^rU9+U`?*E8 z)~grJ#P22)q8tQKZC=AO!#9&A64+q;jXWCCDXWlw1b`QCmHB^>-oX|T{^a_v$;NCi+tzxm^!N9yVU zU|DCgwCr}dXM-Qz<#L^}n&CK2d)ec*5ws^orDgY4eYGdh(LP>aOA2bNs8|AF?-Wu>I!_+cp@S*TPd`vd zjd2XySxbp|SXxVI+>a5R*TpV5s1lVQv_kn?%U);VzgYIN=Y5D2R{;-9V_6-4lKz68 zm9Y}}a0eUT_${bsW~N$hdQyi9Sd^r|y3=gCbEIY%5X9?zheG6kB-!}x1ctF?V{Zdi z3;?pSJKxicjgM5AM;EJmq&-fZ|Il`Yo4*Ish`3r_eY@jiM=JoWth4XLhMij`yayRr z^9#%{;@+eelg@Y3TrOT*%<|w(J^z|L5Fr-o_=ke{0h;?_Hw{2IkZUScNc}YT9{>g! zIj~pD#I-7<04+Ej0K6cRC;(vyJukV;EgdBE)k}Sv=n(h~w3pLpI&;Ts0@4rf7Wb;E z*LJ|1JX9Y|@Y6-u+#x|ZEI$_WHPHRT=Lba9U<604wmh&kf-;)GZN^-gDTJ0->a=o*bzPXIP`jLeKZRRH7_QKD< z#8D(p_d28nX=CPvVTuVnd9iraqNz#;+)|WwxJ9|UOhdv}I$gbPb7ULLDKQ8xwKsfl z`X(ovP_*<#jjE|bDtZ&J$)Hs!&;4>uadx~<{3w9dkOFR9+j%5gTYFo3yuj;sbKM7w zivsR$fZ7Bd-N6Bs&=@l`LP|)ZpPB@I^3%fPho?Nnm5s;*Omrz|HX;eTd%j!N9Q~3l zWd6`|T`MR^Mna=LE2Te!`M<4KdPooD9aK=-sDQBDeBfLFK71SSAE0s>MR-G6i+6V7 z%9-~OiVMXbgpb*b^a7_xzN}uEw?U#&Y zMTHhxCp9`x6CF~EP>-(7?a;fHAc55msQ6$O0k;E??aB?rCruS?`a?Nj!NxUiT*){8 zZRnSvo2t?C0C8XyXnLDnt+BoRlexiCmS{))B`jnjU-pHVUPh)k#})64+;yg5xTqdg zR4l<0h{G}Zk$n0t?C&qS4qch$NUapUUPP6k-q@NKm>8mo)m4h!TxS9mXJ}p6V3&aOlku9w94&O zCDq!}!-HjG8!FXS^K9Zj$n}O>>BFncdOhXVlD_aR_fT`u36K?WO$Lcrv$NBN2c^{@$X@f7k@Q(YkeyX+%PdHCsTxGCD~)Yj~tKI-Zbt4b`n>asUpkvD6OW@Vx*` zS1mkGSPw+#>7mtEiLqiso52Sl$YJxvt2$#X4CQ*R)h|D&fzNDyw6Iviu{dL7VZgg4 zaJ1!@(z-r~B^QMo>+M|;ytPmmGvJzXGxs|83VvaZGJXkY55w!nwE!|5@@UySfGwtv zo?is-{v>*rc3i>6pJHgwK{b4*8jfk;1`ZpM_zk9J5EsN7vAJ}v=bcE*(u!WRJ{hBz zuC9E;_6AV&-8o`|#maqPxz{af>UAgWZ|MsU-Z<8dkFjp=Js0>vcTejj{SSW0ApSGu ziL&f<%t7umy6;(r?(d<^+;~p2r{Vz<@fqjgw1sCWwD%B_{mZVk#C&@HA~wFuHw2(X z?St+9H_iBO!VPGhvH(GD3|w!~eAxi#CHeU=>M_i#;eajK2m7`xbUN4WV4gA;5TX+F z0^7efo?m~Qx2TEu9MDw>yI3h>b#5~64{DxX-G!9O=05fu1f&p~=>!|~@!$Chc`VLh z7q{y=#g3|LqIN&onc_IIuSuhrmG<>7%r-NE@GY7wEkZOhApG;ix<-O<`liEj*1OV- z50jZ3-acBl8ZQazQ<#P(<*ZT*SaQY9wcVAJu*Og!Fvu|IFgG7#cN(9&ku2tL+@Co( zfw#>zy#i5GG0acQ64{W6Dk`T-jJq$HwYW6=#YrCy4@&`-w6Y?tHN64!{Mxqe!|_Ck zA3Q9CKmB0UdZ>-ULy4Of6`FRvPpOuik$pZhcbQpw=XecxRY+Ke(ojULq4E7b#P$p!M zM)M91Fj$CmMbEe1p!n7iqcWdy3f(fQv!^aRFd9 zA05%v^{=wH6*_1oQRR+bLl0})8Yx6Ed) z{q%zZpuWU;h(tqQW|n0&4flir&g$_ELRN4LJS0Ttj(LTzExJ0v=)MBaYC2atJidy& zMB#|`SY%O?>tCtE{}28JCuO6iWB)z_gkopkTyv?o2tm*_`d$c(sAk_V8Ru8B9+Pdb zk>E2`YGR<_{3^G(E6);#1kRtota8yksyLprte$o3(^3kdQKl1sf)b~@)B?A%`AcV6 z>R=D;J+N^Cb&%(HINk@&^P(5@54U_T^9TEOz9GPCzk-^Cx{>dexU&;2sgM9fvPVat z5Mz`ppc?5U1GVAH>a!2Jk}aApW@wyLc=&x=Q-HPY{64uE90U4UeZch|umJ@mWkKk@ znTGv&frlEWVrz$=!0$f^45e|;Kq|o%*C(=@xgQLKd_azPkr@f1 zH6otam?+%ngeE7km~?4r5RuBCGB=@4w)KmQ0wsdDx#qUzJ`v}Yf~8=PEmwx%zXI2z zQRNtXR(ATs3%sRswh&p}Sc zV#RuyTGdjM6Anr-mLPqG(ZSx9wA3+UF3Mv2vof#!qF~@xz*e9gN5MpTyh$s%C{CgC zjV{2JZD*n3qSFg5fqwI}k}^qT;ODrC<$!oI@Q+~OSFume0urMC^hBF(6Pn;(7$_bb zVBV4^D_JtyPs#_0Z%j^TWU`z}QU1=K`e3WT&C|8*mtFD}z*m?3()2TIO>hV@a)P`{x$g?$pq5 z!jgmEyHWGLfjAacV)(r`xOtkUm>mQYSFQJ-%(GCVC!dR7Tqe74LPi!TRY}u)N~m{k z)F1^x^}XxCs~IwAb~Gvtsp_zv8M8s|d^MA`v|3mWZlIWmiziToZ|yH*tR8U3y#Y%| zO>R=S!F45_)|a%Z&<%~Cf*s^jb$Eur;WINbt0CaLBfhbG`6w^6w|vGSqeYyQ(8YNS zuo8k{)HvMKLwTch!2N~3Z18&=f|fDuH6b-~Di|b!G16^+F;UvWy2bg?u1a0E!_Hn+ zI45@<@GiQKT!O#Pu^6^%qzoC=4Dk677}&y(9cLk6{+9>8Y)(E`r}MD$cbGGTJP)K? zgbZASVfHmU(qI7rlelQ4G1oI3)RmCKPk>^072;dqGQ{LZ4}8n6&Z{*bJWh)F!;ikx z@Jfso=YtIW(E;9d*S*Jgk98Ob477Cnu{nFT+a+x1RNniuj3Ri&KM9S_Uu5p$MKu`F z37_PLXKB|g*}>5TqD`$3?~8ZFmDiQbL!QM`_ki5oQfH}d;v^dbiTjG`tI-~28fIQTeVivw_JrkX~o~n&bT?O8R z=8?;iyG#iauy8>B2_OpDf_2gt*n+e?k#ogHtS&cmjRt}(8p_7|`YO`0n#AU~r}U|{B9VD#q>M@?gqy>`j;oT8n5fFbO zSD6tM=Wyw@qBOYX#!|eTEsw^qt|R^E`Qd$2r9pl3VEXq$K-6{T1bAhRtBRe2Kmsg) z(<++>z7z1f5%__>tKZ;&-j)42Jx2`5g*msOPBK+q(#qD}XjB=TD;;y6L8~#@N`o86 zWr|h6pTjkzgWNDA%#(0C^-5%}I4z*;q?K()25fXJ2=AeYnHD(s!0o07 zAA(Cl;1`EX&qz}!RIq?kDLp*OQq7eYR0|xWd}|OJ@5Noe2^Ok=cUneKWZ3ukm^f-A zu}iLe0MpiATIED!}x7`B8Y9@B>hZpgG>n^^g$_9CT{W z3>2`k)v!-bj*Rog@j#WcP(@{N)AkM0lH9&=_Z*U0N$qs8G)V z1AKo!}2BOhtyw*E}Xznp84^jBg}mJx!+$ll-+k4{UzPc z#i}|=e|og13TqF0D;#Wwt)fTcPc?_@w7xCM8OA2y-~4;2=RfT6tJ(TKX*rSq<#hFP zto46u?EcKzcb82VwEfsCxCInw39@1r8E6+WAL6s{YBJETQUB`4?Xo|il9mhG^*6*jU{e`Ul7ybhey2GIzl@;T5FozpSDR9)xI%()KU}g_!;G(Po zGp1E^@g$ES*6FN!8nr*P%~`5`71-_2244~08JqqkDru1jkGDXW{mhwvM8;`u#K5o8 zp2adWDMtPaSeP(mdu0skjklhH^Vs%^UxkO3vDlu8{vX+!iMYF$T>C(>YEmCPotUXL zGPC8|x=D6%xwRG-6-p8(Wo;1rr^7pK+9(SsPXFQ~Hv+N@The#A8u0n>tYlD}@f!ls z7z~vD%51^^X<*;kQ^)B7BWOY?HZoGN>%K-%e&;d=eCp~`C8C828>o@Ug8KSd3;Q%+ zR|8-}TVfMM>=dp4)iJ0$Vh9919kWUvYd_iCv8FliiuC`45x6M8ETX~0N`5u)%cP!s zW&|~Lfk!_7C|I%-HCkW>)T}O`nl?+L8IhG`h~+BI`5|LyVvh>(l}4xnDwn${^6Q|9 z*#T2V)Hxy-R4T{@WQxN8qRf24o=AwDObqI;m5n`hb+t!Agz?NAOaVZMOjM3zzt?OV z#akFbQ0@I-MYU-^?otN{h`76g%pjlo>{ChV_9GVEH z=*T?LCvxV1-PLztVo@}(_kba{zBo6M$}klB6YeIb<5jyr$Sjo z0y^sQa=4p}6CIF)q#q+V@Ay#Mpo*$8*u$fm#Mol)?{(DvzbLLlTT_5xPofi7^mnFc zohX!2x#`l#i&k)g950GZKAMxBnLL58rcV}+H_w=Z zW;qvlSW>A*UNS+WH)JH5nabOO$UgvQ3(7*qtqXl^ee?>=#B(iwnK)`90x1ZO4)4a{ zf^ll1{EoE}c2k9qW*$X#by1WpU5zOf#+sUkpj@oy;0mw;BU*g??G0a7!Fv)bzA!@b zQjHiqAt|`-aE0-tV)_gMi=C@fI^Qars2Ha-c#81cv zfn{j_Mfo#w`RZIdQD_euUgGoO%E>KGf$C7sWMnt$6f!7(r}gnH3$idXSC;7_e_{dI zRwtj3Ue}g)wm(-vzzI!AA_}LJfA;K1V1nEo*ulKKt~|1Q(v8F{@CiMCTfwnK^8Zrt z^6#T6hKwqn*z^*0K=FbqHK{Gjp16G(&gW_RV#1b>^| zDrvC_tcHNta`kWYTd4ur)PSD>>`5hW$=%gZvbM!SPhZ;+nU-{lZ|INpk~N0f+g@Y? zrS+^GfoS;&9=cUyA%A5`^nSgeEf|VeKz57Airb-oSXMyWUMs6Ad-Nb`7m+-i)F%VR zDP0^~-mD?V~kSgJ%P!x!q#T(<`dV z`rQ(!S#iBu%@s!d?^&)X&r2juyQ9fMZkHs06JepUh5S$Y>aaI_f+6;{t*vWero6v@ zT1(L?-(|@9@0sl`ko3p`(TPu*zMlIL-B&+hg>h^zwgWd?T#6^?7{F9fRDJe$4G0Kq??uo1O{YX z?t-v7AXikpH&{$^v5}-thCBy2`rlq-E&A^)t?PDIv7tFg7b-NLw=Mzw>Cn~=(?tb3 z)rln1Vt@J`tfa95CvaIni(l8z8Y>U$Sp~&=R>)Br$}OOJ=L#yen-oXPEP6jcpPh+K zQfb6!s2;5hvcl~y#;PbrB_xRv7lKWO61b=vF9b=$Ew^vS`A!nBSM7l8J_9A;(RsGF z6HW7909lpwBiI`L6b|fHw+A;jX87<^fMygj+{V+6>_r7KW_g(|@HhiQECT=Ep&XE= z7xF>n`9FDwBj0`uf0B-4@K@Q4e*#`1=d*pk{glpJs?>_>K;8o0N)FI!GgLXqU=6ic zy=rKFe7JkTwrxApW4${CbWeOO+7!-dc-`>kA(Z`_Ez1P(`hZP^JW{kjle=yPtC^W0y&M!FZGE@Q$y_J-=j&>H1 z8QtSc!4S(Yr2=`n^xKCs%-cf>Skt21_&0tMx6+8k2YA*QGPJPV?9oEkyLM`3uX$du zPOQxF#NmThCQM|v;y;CCs{RKi9Q_Tb*nyL&*L>~*$l6YQFe14Ay;@d}Sz3^4_$_p> z1WeX}+>hWO&v$ZpKj|m{fnar4^V8x~n$ZA)D%@;e#54^Ovc)WC9oPu}IIf`}@u(BU zNiB@fy=YNs zk(-+zn!|D;V$LoR-+A`WnN0cy!{Z`=WlO2AmMZK7_L5HKpFmoHg}l=p%LJMfSg4G} zpuAUboxdMU72wK1e^$~@IgpUcHt#q0_O-RN?o+l1jwb#{fKrtO0WL^{Wzw~GY;^HO z5dDXf1*4<}uoy;J`veNI|8bafy>YYHgE##*2__ZT{9eW)D=K`v@M-J1;_4mmMI&Uo zG>)ckXJB=*co+c5)EY^?vTr}qNdB0QKT95*#i=6P*8cIqCnPR5js_ZzoV<|mZpuHD z9h_RelNjFWE=D?I9haQbFHEDZ@-knY>TA0%@I>^il9I-ZubdPE$|&K{TQUsy55r0P zqw`e`8#V?uP}Cy1qOy_EbdB*h1Hbvi>5+ZOBAx6P{czC4Gp_G37Q4V zfRm-@XbcPMvCn!8ijZ}@4}b3M((QPY>lO&D5`JZYjbEHyYS;`9WQMeji_Fb){z2e( zM*Mc)=8o%duY-;=pp9#1b3BaF?R_$s3SL1|Wcw!6F$9qB-XB7&HLX=L*nVH#xUmd%v z2%d#lseg3eLc~Bz4VNo|FN0Y5TaD)b zc(|<;FQQ}A1H-Pu#cK#0kNk$f+WAQA0pC!sfPS@K9S_f!+m&j!9bF5tzKwdTQqf2T z=MBGuNE881145R=?v89)V9d5^(SGOXb^xpmqDL*8**Nq zqIf(Y+)k#QV6VfAIJOe`RX|#g< zB=yXZ0y{bGksqe%N+!JUR*+ZQQcN0k0d0;AFbt^qS6uUw1@DUYLm8+(6my7qhT5|suM zFA>?IeuvU1QE;}psiAq~wLOUABtoFqzOZ{DWY)>ePrDGap9z1-v)tG`gpy74sh?sx zm{DSikL`<29L*V!22CK<*`Z#m4n!4DjLY%V zJ`OpAm5lUFY6}{c%Z8zo zI?|T4(;3Q6n3UBlG&CIbgG&vm+Wz=%fdVTXqGnFF%!~$7W8HNGQ{`Gv*9zGBmHdN6XeiOUkgT z&-WI#T>Clm)1So_+Zs66zVM;P7FlV|OHv^Q}#^ z@K3jswL-!tZh<P41N$p${{Ja=5; z4cyp*8BWQat>B(p(?f2nCf$6DUHNV!?|uKWoMO~4lL*K6rj7Zie;@C0P_93Uxr>vQ;WK^+lPg}RF{)c@ zUYuGpT9lV&k^rkpwTaxdg@cX}l+8)#ty7ohuoGGhb&d7r} z{EBbtUeP`3vK+9JTsTOEwHW+!PKapgWGl87z0BNHEqZg0K%~+B4Bn0B zJf78dx;bh?Sn2B2-Rp?47=5A1p4sA|R|SRudEV1@g1RuTaj__YncKO=)<138Krp%9 z*(?V}HdWSYYIjKFULfxUga^B*`|WCgF2AorcJn0Zh9#RxvJw|}nw!?rU^7R@+UG!x zT+Rzzdz;zopA>hLDqGgqZ6ag=V)=sn_cQH+V9rmO?hMRlUBKfKcw)ewb{#YhxO_hQ z;NZh>b=q;f&5@|i+r4PFV%6)yMbdV!3i<4=KUQqop<^B^sJVFZI#P`E#U&OmI)P`` z+CotdGX^Y}rTt)JC`NXi!X>lN=ib`cSV}rOwhpftom0IvYE;mdy!R@={^BJ|Xsc4I z+nNv~%nGG_4Ux((KW@ZB z@wo0~(~2kJwC{fAVop!Xx-a~sPVA}LLv62Z-dC{sng8cHGv#^1&CQNr=BpKh{fE6S zUiEAFx#sKeqk)6_2F>%+j#v6BTMlBl9m4FK+AJF~xH2;j^@n zHj!-CN~ikjLW^*bCrv>5DK0X({52H)%-@k|2A+p|dtC_0=gvSQB!SGW2y!`yqVc zqE2tfy01)b`n9}#yJmTUt^`#syYnLw+X!=7WrFnD!AXApJFbXiWQ`xcdj|i#CjbwO zI`QHgvk$|4kQR4eqZ}7RsaXkl37OckQ#?gNnItr5>-u%EYz*vt_)%9Ed9${ccURX4 zaxDx=Jw2a`?qJ19AZI+zOGjQ}VPg_|N?bjzfjc-oEs?7QwRmv0fEKEz=OdGgYB>ds zHvxOROGh;yns~VFeeyWV$ky9q3U{_>ENv`{3L;-q@SUHZl|mKHyoPA|_3q(2KiL)I zV&L#n>H=QalTXc5MCIM@zq?TZh1CTI01`DU7APAD9bOT=J?QLRTZ34+vRU~frssiI z%0Ph|+xn1mynAc|YiMw_q25O+8%wv>8GX$j+pK4A*jHi@Qv2Pd6{4^UyU4Cr!ftN)ks<)_H4vsICZZm<$%$-3=;&+?9jwz9{SU+- zZ^le~cjK{IetK*`Q1N!hLOZ<@cjkE&IbLrYEp>Be16LcZ+jfchQN`3hU^jc%9Jz3~ zM~mvEX!f}G#!@xaZ{##7_bSg4omaO!UjdNv(1G{*M*(z&n` zI~XK8*|)Hy{Jl;0zDZ7;55=w>7CiCnl__)_b8Agjbyr*!8OFkyUnAZB`nj%HLc^?E zIaVs3xvMwJ-K%8Hsn)@yz7juWTeGuQQIjE0Bi5k#RZ=0=F?6Sk+LBG57V@l=_?7G0 zSppYVRehKw7p|@NI)0(W(nBYuv{|iJUo3(!FhZkCWtm!8ygT96IXD{2cDUWy;n(OwO^crlt83JIQtvT{&^4=Z;y``VjKsO!9P)>I9LxtnPPNq!?)-Jd_T(&hXK_egyT9+nLot!UFC;q#?Q@(Q@dn=84x3d~Z}AHt;`R60?)Sde8)ADJN5@W;pGLmb^kDKtmv``$^Rb#25>Fb~e$Au0x z^k0|aalo|AD5o4tocb_?OB8^BaMH!HSn&NZaEo_PVo%iT(^8Ch#I=Z>kz$~Q%50tP z1>4DgtN!WgZOaZ@J%|u>~Za}&x#Yli(=3n1^wwA43-EhC~ z<$;x!c+J5vnB7{)(4yg=a7N&418@UxXL^5E+P|VzxN0>aT^aVPNN(pSM7B2h`;8QBmhO|kPRav<#!F=7${)Yv2S?80! z6PUo9dH(kOna4oX2OgEa)mVz=d{-cq$BbGhiV} z?)e>%yM&$CD>Au)ea|<%BwVcDVI_%Ruk}oD&kT}&67>R+?nnD}sRMxk%5_~QpT5tY z-`hZ#9Ev6b-ItR0|G1Wpx`AYu&bvp2Of%TKi;1X@857r9e{Tgi89*W8$L?kokNo`s z0ser)ghHkT*ufGnvTdyC6!X6NKw`pN8Qr(#g-TDb<>rKI7tncGV^1+M#=>P zCt!SpE!XKfB|g6cREp~HoJ1{#TJBQ8#aU*l#*-TDg!K?Jjxj}UFQe^+4Ws%Hx}{c+ zhWyzbDQ=gvf(3oo$(Qa$&*bBgYoqJoF6%MJ5+HdLJLraOL^2-~_HzG#la%xmEL921 z=23K9fj#x6d?wJ-8eZDx5<*)0{qP9H@CQt;Vy>%i3Gal!;rg@4;k_?|@8F%HcsIle z$oZyzuI#L%zMnyo;YXLTf^0yo0+2{_M+cv3nSONyz4ogfLi%fo27-c zJqfduklGd=Jlk*C0B7GdtlD`ZcX|HfFo*W`lPRC=W$VbR9_!+EW3eKySc^v5E}WWc zRAW^!NVA}g(;l903dD?12U0dpq$TAS)Hp001&G) zPP&(siaazHuK>%(cr9QSHeFwH#i(r=l65QgT?E5%6=$v{xNhft4~%vlRNq zlK=zqUvq}DO9Vt1ulNX`(rMdX9u`XcW~z^DaISQl)iBlAiZ6K*FwTG1#|~r?7hE%A z1#@GSCcAi~;m<_|(LhHlrjh6w7k;x{UtB$cTfJiygr*e_;FM4qJz18*ci# zKyF2OIGZ^+&Ekvz3<6=22UBzs1R9;TbU5?iaHBi4>oSw+0%82yxI<>?0i1i8tGH4HEWWLC{`kVhi zo@r7JUt)>}ePL1av^#ara;`)rhrf#Pa^wl^Dkln0QYoLdSA>dm>qN7sK(xll8-wjF zYP2PwiKdUS&TRjG{+{@?;Z6rKA<&YeJT46??fx?6W z3_U?_3h^@mf1Ev)aFKLgC~)&!s-mLG8v_B|c5o$(nRylKHzF@X3$~I|!*pD#aPTw#Z~ml#vGDnuuX^W7!QmwA|t(IY0w}G^5Bk=7};Zlp^(WF#a6L2~F$0qI6*q#Thh$)Ses7NkqMJB9|O`)u#~ z-0yjw=k@)Z^ZA^AShM%++3dCUTI>2<-`^GXT1gfQofI7e0%6I$lu`wO?yCTwJ<#q0 zf8%^tuYd-{2_mP4hK4q~th@vqk~m9iIlr+tcXl&!Gy_@K*}pYocQSD_GqZEDw0Ay0 zX%Pp3s6ld4l4|ZLd-ER8-&oXh9SV?XQ$K%+M)Q0MM$v{x81~U0q0@y}oe>_F6rq^) ztxnBP^%Qa4AKOtcX?g>%+Sc8(>`;=e>}P&b#a51XkB0ieC-rLoQ1FN6gr5(hv$%sD zLO=HYy1tbkY)C;iA{{7|93A!jmEbRc2W-WB?mc`D_y8Juye0}Xybu51n~UKZ;cQYV z>xZN&G<#@}LnjyD25;`)!<7p){lFa8?f(J%%{eDz$Y>aoP8w&VAl)DkxS%zVP8A#w z*W3dXeeOq`&gsNTN3aE=ibkw(J&cz=c_Zo7+)9ATF%PJea&u?fcNNk7X>t3DBEl z&mV^rB$0WTi>&G_avm;L(kBf%6SRS9)-Jy;BFcNA!l~8nzC|jU(?L0jbsb_pj{JSD zR*)3tF)AJ3b5nH4%Y0Qg*E6k8J%w>>Xg|+LYsMD`vuOj_n7v@gzKZNA0o+G#z-G2TAQwRFrG`gSKhN+pGvl=MhgD}f)mP}aA zh%}^&M+{TY2BIsl#>$URVD;&pW820>3i5m(n#E%M7>UNwpi-!oj|+KrQu7Ekgx3EC z4AG66C$ov$zjD8tn{trTULO?m6Z7ClE0W(@FrP?7pMUGlOZ8ULH6Zc|n5@c~Pt=del^zSa;)zw>q((nyvlOkCOE zF}_OjJC3TN^3$Vv5g9jNS24t+#XxB!_;@ZFb{vBun;GVQ{hKBq^k|$Fv29>cIb#M&YymNYl)v7wh4L5K4Q=iSz|WVV_|3+>I@D~+Mt+sQMX^85%2z01kH)Oqe@$&E^$Evq)- zaE!$aT@AQ~4fB&sH3jW8Qm!&mz6L*a^yW@}HjlX1~3 zRlIGjWujsU+9yX{UURE)6t2D#!u{5)6?8f{tLezl)~X$p6YKNKcUQmnolfF0pHT#Z zJn<*k8+SG#7j0wm0Hs13y9zVt_QANb>stLGg(|Nj-gnyj%ePg=dQLibUumsw91S=H z{I^2lfp?NH7E$6@#J2U=SjAr}ut~2@Q2Zi9q2ZJwS0#Vg=)-!su+P9n1zor4ubkbs zQRGNIAtB{`IQTBaAY1yu)#S6P+fT6e^0I~ccR{y1V%Hib9xGg(ZC^*lr>bcf*mstO zO{<`E4jWC?jxeL3sl%@aw=O~~e9v3xp~PTzOyY5TV3s}&_`35p=}-wLT@iRC2!o#^ zfoIoq+2(8AcKklarzQH%)W9&NMIn-J8Tv_VY~8h{=VoAUv>2nXy@tzxuM%D|?k^=Q zM=`)B_!mB6W28{v9%q^Waexb!)?<+jT+wQJFa7QB?tY*~0_PK+{;|nbAAEy})l%nV zZ=!G&j=dIiF`GEna(A>sudV6hG@C4PR`4tdi9e)zdA0HPKvdkvLkD*S;vRR!J_ZLbq40D*cb@lIMDKe{tk)WIFwBR-AG5~w z@*F9MU+?Xp(TM2m5K%lKMvXVA*&1gUa*EXa^>O~;wOs5Wn7j$3$k-{QoUba^Td2TV zusB~%NRzE$^VzSPxk;t{>nI`9_f#c0fs~^Cw%A6p@sp#DOpJJ^gVP=%*CORbWeA#8 zRlT2HJ@mC|1~H}UvdFcgm4Czg=x0FZ)X)=)BnX=8oDOE~iykMeM}dXCc^=YatL2L{ zc(HY_sVfi$o_iUMYgJFM>Fm_!YDhij@J4Naum10$#@C~)vOYIMn+^S)({l8JZ3^1E zY79TVPF0tRr|i5fh}CM1LKl|}1XR?Zg(Kxvr&SPmdn*>6Z8kn8P&j7oMs#~gz$xN5 ztp!tpUm=6ie<`pq(~tBr9GSG;KS7jZDDXOkdtI*C#_f#+3fh)qkW<}E#<#dz*;Pv7 zpk+wh9NcwC2luB_e5feSjf=W5NN?-B_>nI0^%Ip)e+RhKI$$=>H z@SA;<%aB!GjjNLY^VzdjnU1S!aVWJgGbN%F{&@qZvNeP9bVlZ8*89qi2vgxmO1s<) zk0RY#;=h+wbl5wd8gC4A#<|rLRh51v9*o=H-hHh->u|V9!VyA1#1Mgg0w2x09C=5_ zSEsic6)YFt_<0}xQW!KvWa;I#rjiZyG+s4@Nlv+o|Byw z&|_y)5I-}?YZ0hk{$osCHNf+z7hbf!n&v`2Ro@<*braQ1J)B(USn{hvwqI^kqZs(v zlv~8Ki`c<>UZ`;vE(yn*gqTtHJBxYV11U%3spUH|tb1Ym99@+0z6@EIZZto;lEYY` z#f1o`?nC7|GS7*X1uU9TEVTXIoxO5YtKO~C>e#U2h2`CK@t4$!it~#a#))(dx(=|0 zK@rtO3ei*W*8J9huuyK}M53nsHp@zs@;? zae8E0VVfCrFXL8R+D!c%=2a{FtmY;HTt7YKza9~Hs)QFt@9t1$?5MZF4lexDQEAn$cov_FBbAVVw;Z?EF@D!PMnf;J?;R!sf=+^f0-^~JdYV$#kyOjh+(J07LN zi6{;MB3TUdj&6u4ErwC?#Df;uq5nOH1aA_N10Iw6FQ+*zOe z^uXI?xQfLAMf+!~iuy}efCJ|y&I<0AZ4 zw+KEQ@zTs?vRHGBe-8cENd*4mfrz7bH5gsXE%3wI-8*-;3Pj|y5AUlFW=eRcip%&( zS_rWHhw1kpMfP8u4u5)o@SGYvBVs=(P&1HDK?4LsyPN6JljW`q!JW1c-o~u(PBE!x zNibGThCaeU?kMEbHZH3IV3U1c_KBV3ILIjr4=FXyU%jS~?S-A{u<_0!9MX{qCd(y= zv>sk?K@}NrNjU2v2$KS4g>b!H$ioZjK)xhc@qSuDsA17qn}4RaL(_;`$ztAH8`=0< z7cUDp#dE=m3qxGj#aI*guYHlG%gi+Wi}gZjy!;4Bct;pS0HJR@P|3#xxprBO?)++O zsg-X$&2@q-SvE4Wa2x7W4+r*Nw2b{U{YZ1uxmTU`>uqk#@#Fd9r05-UZ>q6IKU#I< z*;}{wcw_}I;f2`^MlldPtDexvxF=2`6vV!#2V0%L;8}LSRw;r=ZeiVrfhkVA*-l4K zHXnjSBd?fV{g2{=nQkYk6{Y|m9pS;~-{s?{J%=|MyM2g335kX2g`x!>wq8*Q*9jkS z=nggra9MU3>h?b6vz}V;xRNiHA{Hzxtt?kwC}}AxtvOhDZ=9#R5bb<6#1@53&J!j@ zkC)kgzXC%Za@`2X$Y9A3mw~r80UxtZ`h1$^WbV$Q@t3vwNg|!LrY}0ygIk(2Rr7&9 zsSA)b&85V$oJ@x&%6vp@_^@D{h+twXOD#LOw|Ebq+%2$Al zzHhN$!%7rMc6~jKYszz>>bkt;w55iDf%D-_=$+sqk|q!c0>1st8wabB)YQ9-BW2AY zyp?x5_GC%3rIYpt!tcRQFww>K$ir2BzK~%W&!$WnZa(s}rKF)Bf5(Mg?v03>3)dky zYV^%n*X-K_jUn1E?M!cM6Et=-8;{w9(;e`6NZ;7RFwvx9`Mrd-$6(x5<#d(${yQ{=UN5%^5#o24TEghrg8rh91%2qZ(fTJZ|dfri`M z=eADJ0fq;_!P5H_RNz$Z9~*aWp_1mhJs>|HCmq<#TsB&dUrd>Awz&gTAfa4W;_im_ z|Iv!0&cAAS^Zo9S(kbYIS=>1Tc}nQwW}c+*AEQf>MppD>px%HxttDJOe}3N?t^b8yYX<4)O6JB~Sx2;aQc0qN&M zLPd5vGPn6Ic{QSwcZBI+vFc!lLT={}89^}_G1CWnZ?&YoF6s^Bgt?mW32gPFtjMF? zz4V`9R$KnlN5*X*bISX#KjZja2}8OECoaRhR;Md~tR+~1kB;t_7Ya6cwa~yjnN^ay z&zid&OA=;nWRrZezi-XxWjq2gZ28{E|UZUc)`MlzE zPC~uf6t5cP!7>w{OW%>E58qO~Za=D@Ur&+j<{$da{j@>#;)mn`N$TAs91MXX_J3juAgweC{6?uE;CKe|BQlRmSl_N|}on|~6E=SHQr2<_?#msg0;_qvq*mys&@ z<2^{;UKX1z=b4p@vdi_3k?o{l^D^e|13}T09joPDo>ySV;@y?Jxo?l3U!z{W>W;H8 zZHwd1d7HuKQ!46>OTT0 zqWnQT0y~VkY_K8D7$odCtbh|AOSnu4gL9G z-yUQr;C}}KPb51a$VHDa0GiPm8(w;02DxrZQ~4rj^dwG$CAI)T7N_%?8I9&$c9@V^ zKYV=qqdco7TUs<$8!HA9(9}3Zp?zguCIcfbEic)cRh$snE8b9Z_tJE&C)*rLA`Vk- zp6kM?#Z47nu2K#*vTy{}=)z!}RQ;WL9R85F3L6BCU7PC)-neo)XvcXZuKAs0VOaXS z;g>IKEKA|iW&L`z=q=T0xsca|)dU(Sf&M=+iMN2{WNO1xqKfTg9fB9_Q=gYnkEBd? zh1i@J)x6{djVfK8>*@rJ;calHf5jZC_-5rkLn zSnca`Elcgi&@U`ii9eSx4>oD9^}_0)^i`%m+5;#PsfkX@RUXE8c|bI$1l>Z&qE@Q+iyE0>oRQw#prqWk_N0uhg2 zP*Vqne!qJ224D6Scfo&?Sh$cW20g3wR{})M$>FO&RB$GZ?J^@fzTDKEH1CS~t(p$q z7znRp3qPA-Ac;Fryr%Q!*8W-srV5XImgn-m3#n8^vR~kBrM+NE@tB*=d|k$D3MA^& z^A+#LY2y&jAbAaN%`6h`3WMFEf^q9~aj9!A-E(XJFjPTbWF!c3O4t$eE3%S~XI>T0 zy;uqaZv#k%6G#&cnxXWtULdfiFguTKGfXHd6ro*h7Z;WDzq5NX`dN}OCK)#IX|ZY1>>g~t&+ngPzC z5MlDe3Q#N6iV6Tox#sc&Xee{=<=V~55CD#WA%D_0GD;b~(*LG#?85^9+)^|+KaESX z#<4`CU?v(hk8gK4%3a5b`+HY(R8q;*l468m?zHRk`*EUxa)np#k`Vu}8Za&RN693o z@+}QrOYPi8N#ztWy*G=tzLPDwapyxAnvUoSF2eKsXE6Y54E%9h((=~QuAQZ^X$J(c zl+;}-R3KV94xoAzpmb$88~mlRC_px5+&Z!~@oc77dNugnUos^2Zy8ec>wlIZ#h);L z*4k?8#o!N7(yZ;bamMvxO3ae?;YS2tV7f6tHa(>yjV%S0Ouf%gcg>D|zm0+bArp%S z{|Er86zz_CAVW`o;AGP6w{L(XIG;KsqCf+I8ecl3{*KVlfStc!KKTC*^E_|NQ26yDmVrm--1Qw{o?5N8Z=Z=`mrGD9Y%-Y0&$0 z28iu`w+DCQ67IkHz8s}Qdw|T#<>HTu5X1lklxoAkE~=|q1rq=2NY<8_3a4YIGo}=- z))0#!l9n`*O6VRS3>Iu{6F)7a!5+``VIXBFu2=7zoR@U3pC0shZpNJ1-?{s>hbtt; ztR)V`H-To*_AbwPD}XoTTV`ez@N3g<^`= zGdsVoE$gp+`)dwaktt_vd{+K2Xk}~LyDD$DC&{3P)s^T_Y#_PgOxs<&3mC4*K@a&@ zc~yNqsLIWLTotfOOHBKjPBtW`Qq*Z}h56~ewiyE=TI+&2QJnb(;n{J|G#ijDzY9Ln zHK_gUmR0ZDtmVAyxIZs0)D?BIbtQ*Jld5!9(pLw_ag+dbGMf!@mCekHGOd`unaf|C z>4o3zdt)w(WR1eB$(+K63TK)$&pBfPZ$bj ziPMD?Ju)t8M!$z22=-TIN&wM`|S=nqyc7)zZO zBQ*V0z<`0tg!LPU_-hu7iMUdI-@bO#ZUe+^aA7;iLYlsZJXGVAPlY_f)or=N;Ac5q zypO%112V0}nBX_cPbOT77V&*6=(T70#*=dg7wrLp(7s%(9c9+x;;S)pO`h#eaO|id z-ytv)Ks@~(|Bi~J(cVq7Xpb2fk z4}}0z7`6F!g1I+h*G4nEx4P&iC_s#ruHo=U*nz~2A?xVp53%xvc6NRy13QI8NcrBF zp&R1ugI91By;KSo8!~K4vG(=SmCQhuj9X_?^+ltdAw7M&!D@cRKyai?r0?;AkKmDr zh);?>+1e_4fTBo^4*3d<`{veB!=l2<)bxrykJ6zUMlT>sq|k1D`bCi-&@9|Tf@4vm zQe0Q20i@aWb=34^007al9J4dMzY4{utgB{fZcA}69G$PTUTrlM*(=cF$;v1yUkO~c z@_+e9M2KU_pxh;(f`EV|AIqYt+Kl`mkWM8M;JleSVB^}7UP;Y?#~OwC6JYrPO`W&F z0p4N&RHBd{V$r(&)o3W8%-_cdz~k+MH)coGw(D{_tti z1yT<{RPBZuI%W2=azsaC;UugNmR0B-$!BU5vKJPO$9pz3oO_~!Au15RDw)xR=}7R3 zlu11d}$);<=SRQI`I zn0rHmVIBR{P`JfV+)Fb6vG^V`F5}o6S>*uFR&P{?vG`%2956)AJsJ{uBTN$Oy|kkb zTDP`hC;2Nk&lqn%AWCA?9d2?wqWkwnTx9?E;QXf?F;XL^+>QSnH+_2a)W+Oz#~4GtJFPeGc0yoVlsJWff&Lf!J(1=kRVOE*jl#^gvJ|@2v(`4-LpHck z2X2Hy?^<#nj`)F$#Q~0gyNd54)sS54j60CNvx}McX z_IS64)qg7`G7*~GOMMwMk2;~DNbIX?Egr~bp;!w*EY4B+H>_b}pCxf{lAfi?m=u{% zg5HDwWEO>l2!P9N6ZGvkChf-r9d=nvPjn`3+Dd;OEP4*SSmM)|Bs9hMo6_aq8KP=_ z+Tc-Gma{k4(Vt?IL)Cn8`9|sG+qs#g@>f|Tu-@%ry^_4QwFGNBBuseQ;pVarhN95K zomZ{`1&4q7U586%HIq{XfIY43j#HSIdn$-p6q>FZ7H#?VXO}Wx7mkaUmvi%9ge~J7 zJV@I1BB2>`C}fA1I?IlDQsEHY|L`8%CQ*tDAsy)cTQq?wBW(+!9}RNjfT(qNHi7WK zFc?|GcyyU29xq<+`(MDy9qdc2OelJL2>3?; zGqJAfTwA~I`iN>rAP6ASMmZnN+W9W;bv~Kz^V~~yn_^4WPQz(wBR^~9U~ZD62Ea~; zzN{$-^tkMIEr4SGM{#M{_I?w}_ldi=axu@JH>ceWnR?HM>THKQpqK>Xy^EEAPZf`L?RDu_POr(s*$K4HYX{OCrgpUJyjV_RWgoRZ> zcr-$y4{+nse;X!B*yI{At~9jZHWZ6xfqWag9V#_?gu(vKI{&5Lc0>w zB6WV;<&{%bJ0%Gbp4E4?86Xw+VbG+-OaTz_G}D1V<6Hat0bNuJ%tp^;l$OiZ#>~Rr zVG1LP>jvViwszJ}zp?|18m2M+IK}-5dZHpNncZ#O@$U7?FNqsFvdN_vP(HJ>@-&S? z2H4B2_-GeHo2vRgA?Yw<+-bGKr^2M?e?{n9gnul9m?WD#IQ&>4Ar4c5v!)<9vV=q1 zP|N9d7mX*;`)R}Bah-EPP*6zg)9;I9ks85S?3OG0ff6pBUY8mZDv-TG(uD)>p|QCXMnsj8299GYa2C zw+wupPHS4AVxAs=@77$RW0_zIsxFUStR-Pb_aV6$nCX5HVy7Qz=OTLQsszmht|x^-AP}fq5}6^ zF=ip4!{85D88z5-qpAL%m{HfXuwsgw%_K$BIuc4c_9=Q1iDDa-TUTsJMsSxFL-6?0s&Waqyk-Er|NrH z7qEs!Vn26QS4|jDYp6{Ex&ygNlb2U4;dyzzfA(3>wR*Msv&Q_~ZD-P?Cg))67pC+p z?y<#Wr7ZDR#3n9+d_|%TYnAvzzg@XUsf>m8`!Q#L(+H5{+Xc!XGj**&V0PkJ5yYAO zcj2U^35+!(L8fX>Z|s)?q2mE$*B~{8r^Qjy`~eetXgFUHV3d}l7q{?n%Ct!Rp%w(D z6asW4u0@n{YA9x)JdE&B;N=w{@wZq3&2a9H28Mj|)fe@umSW+ph%JGGXr3?}YufMu zWe3VsotxOW5Wwk|&#~SKUI$!PASERySwZdv6LiQth@a0>FBn71NV?Ps2zY_}%@>V^ zqia9%nZlV*qmP|!ZFZ3(pmWnilPAW0Ip9Hoe#G3Xt8Lskt~>4q-I!=7BF%M6ZBr= ztstctV*ogDBK_b#u9TlXJsclG21mxpZv|58#y6xqh*EelxqoBF6D1+tT4TR$ue$Z@a^wUfXC zDmLkd`JL%4V-e)j1G&))x8vd1zx@CXyocNu!3JBnxU|%dypGu^&@%puM<9upviU`e zZ0+{CpR(c0hBR$z0l!$HqZaNurz8vn(~g1z0-m@<*y&eRm#4I{Hd-xdIa+jCJxA7oW=UcfsYGM`8Y(jChou^neZX2|NGE zOR-QHwU;8s6ZR9p*YAm<--psmWzwRfXmct08imNL|0W`aGyWbUKs`(UlTSy$;s1AY aN0t7=!R>2S5*~0jkesxVR58TR|9=6MAPZsu literal 0 HcmV?d00001 diff --git a/docs/en-US/images/whirrOutput.png b/docs/en-US/images/whirrOutput.png new file mode 100644 index 0000000000000000000000000000000000000000..7c3b51297e53e92ebbc82c87f6272f587adfd267 GIT binary patch literal 61831 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 z Date: Mon, 29 Jul 2013 12:21:17 -0400 Subject: [PATCH 124/907] [GSOC] Shiva Teja report Signed-off-by: Sebastien Goasguen --- docs/en-US/gsoc-midsummer-shiva.xml | 257 +++++++++++++++++- docs/en-US/images/add-account-screen.png | Bin 0 -> 71491 bytes docs/en-US/images/async-calls.png | Bin 0 -> 126157 bytes .../images/configuration-edit-success.png | Bin 0 -> 86909 bytes docs/en-US/images/configurations-screen.png | Bin 0 -> 85285 bytes docs/en-US/images/create-account-post.png | Bin 0 -> 116063 bytes docs/en-US/images/create-account-request.png | Bin 0 -> 169834 bytes docs/en-US/images/edit-configuration.png | Bin 0 -> 86589 bytes docs/en-US/images/instances-screen.png | Bin 0 -> 66865 bytes docs/en-US/images/list-domain-vms.png | Bin 0 -> 130442 bytes docs/en-US/images/list-specific-vm.png | Bin 0 -> 86323 bytes docs/en-US/images/list-virtualmachines.png | Bin 0 -> 124665 bytes docs/en-US/images/start-vm-screen.png | Bin 0 -> 65228 bytes docs/en-US/images/vm-running.png | Bin 0 -> 67708 bytes 14 files changed, 256 insertions(+), 1 deletion(-) create mode 100644 docs/en-US/images/add-account-screen.png create mode 100644 docs/en-US/images/async-calls.png create mode 100644 docs/en-US/images/configuration-edit-success.png create mode 100644 docs/en-US/images/configurations-screen.png create mode 100644 docs/en-US/images/create-account-post.png create mode 100644 docs/en-US/images/create-account-request.png create mode 100644 docs/en-US/images/edit-configuration.png create mode 100644 docs/en-US/images/instances-screen.png create mode 100644 docs/en-US/images/list-domain-vms.png create mode 100644 docs/en-US/images/list-specific-vm.png create mode 100644 docs/en-US/images/list-virtualmachines.png create mode 100644 docs/en-US/images/start-vm-screen.png create mode 100644 docs/en-US/images/vm-running.png diff --git a/docs/en-US/gsoc-midsummer-shiva.xml b/docs/en-US/gsoc-midsummer-shiva.xml index 67755c46eb1..c26c5a808a5 100644 --- a/docs/en-US/gsoc-midsummer-shiva.xml +++ b/docs/en-US/gsoc-midsummer-shiva.xml @@ -24,5 +24,260 @@
Mid-Summer Progress Updates - This section describes ... + This section describes Mid-Summer Progress of Shiva Teja - "Create A New Modular UI for Apache CloudStack" +
+ Introduction + + The progress on my project has been very smooth so far and I got to learn a lot. I started with learning git and backbone.js and then went on to learn angular.js and evantually made a basic usable UI with angular.js. Sebastien has been guiding me and helping me throughout the period. Both CloudStack and Angular.js communities have been helpful along the way. + + I am happy with the progress so far and it is possible to reach the goals with a slightly faster pace. +
+
+ Progress and Experience So Far + + I made a basic UI from which a user can list a bunch of collections, launch VMs(and similar actions), edit configurations, add accounts, search through some of the fields. I've also added a very basic notification service and work is in progress for making a dropdown notification similar to the current UI. + + + I started by learning backbone.js and improving the prototype that I've made with my proposal. Then I looked into the current UI's code and tried to make plugins. There was a lot of repeated DOM manipulation and ajax calls throughout the UI.Then I almost took a week looking into angular.js and experimenting with it. I finally chose angular.js because it does lot more than backbone and lets you do the same stuff in lesser and more elegant code, thus, easily maintainable. It was obvious that most of repetitive DOM manipulation can be removed with angular's directives and AJAX calls with, obviously, models. This is one of important reasons I feel that CloudStack should move from just jQuery to an MVC like angular. Apart from code reusabilty for custom UIs, angular offers much lesser, more structured and elegant code. Rolling out new features becomes a much easier task. Implementing features like Quick View or UI tooltips that are present in the current UI is just a matter of implementing another directive. + + + Learning the framework and developing the app while following best practices was not easy at the beginning. I had difficulties in deciding things like structure of the app. Looking into existing apps like angular-app and famous threads on the mailing list helped. + + + Another slightly challenging task was to desing the angular.js models for cloudstack. Angular.js documentation say just use any Plain Old Javascript Objects. Given that statement, there are so many possible ways of doing it. So deciding the best one was frustrating at the beginning, but turned out to be simple. A rule of thumb that I think should be followed throughout the app is to return promises whenever possible. Promises remove unnecessary callbacks and offers a much more elegant structuring of code. All the models and collections in the current UI return promises which allows us to take actions after the specified actions on models and collections takes place. + + + Making complex directives can also be frustrating at the beginning. Videos from egghead.io came handy for understanding directives in depth. I feel that these are the next most powerful things that angular offers after 'the ability to use POJOs for models'. All the DOM manipulations can be put into directives and can be reused easily. + +
+
+ Screenshots + I'll try to explain the things that you can do with the UI developed so far with some screenshots and a bit of the code assosciated +
+ Instances tab + + + + + + + + instances-screen.png: Instances tab + + + + + Simple confirmation modal when you click start vm button + + + + + + start-vm-screen.png: Start vm screen + + + This is simple directive which launches such modal on click and can perform actions for 'yes' and 'no' clicks.(can be found at static/js/common/directives/confirm.js). In this case it'll call model.start() which will call the requester service to start the vm + + + And the vm is running! + + + + + + vm-running.png: Running vm + + + Labels automatically get updated by watching model changes + + + Async calls + + + + + + async-calls.png: Example Async Calls + + + Async calls are taken care by a service named requester which returns a promise. It resolves the promise when the query-async-job request returns with a result + + +
+ +
+ Edit Configurations + + + + + + + + configurations-screen.png: Configuration Screen + + + I've moved the description of the configurations from a column in the current UI to a tooltip. These tooltips appear when you hover over the configurations. + + + An input text box like this appears when you click edit + + + + + + edit-configuration.png: Configurations edit screen + + + This is handled by edit-in-place directive that I wrote + + + This shows that the configuration has been updated and the basic notification service that pops up + + + + + + configuration-edit-success.png: Configurations edit success screen + + + It is as simple as calling model.update when the save button is clicked. As it returns a promise, it can be used to call the notification service whenever there are model changes. + + + I tried my best to give an overview on code along with the screenshots. For more on the code, I'd recommend going through it thoroughly, as I'd love to have someone look at my code point out mistakes at this early stage. +
+
+
+ RESTful API + I worked on the RESTful API for a while. I read a lot about REST but I could not get an elegant way of designing the API for the non RESTful verbs like start, stop etc. I have finished working the on the verbs that are RESTful(like list, update, delete..etc). The API can also handle sub-entities like listing virtual machines in a domain + Here are some screenshots: + + + List all virtual machines. Anything similar should work + + + + + + list-virtualmachines.png: List All Virtual Machines + + + + + List the properties of a specific vm + + + + + + list-specific-vm.png: List Properties of a specific vm + + + + + List virtual machines of a domain. Anything similar should work + + + + + + list-domain-vms.png: List virtual machines of a domain + + + + + Create an account with a POST request. You can also do update, delete etc. + + + + + + create-account-post.png: Create Account with POST request + + + + +
+
+ Miscellaneous + There are lot of other things that I've experimented with along the way which are not shown in screenshots. Although my initial timeline was designed keeping backbone.js in mind, I've been following a similar version of it till now. It has been a bit slow as I had to learn and implement at the same time. I've been rolling out things very fast for the past couple of weeks as I am good to go with most of the angular.js concepts. The project can be finished very easily if I continue the same pace. Here's a list of important things that will be implemented next, in the same order(I have already experimented with most of them.) + + + Authentication handling: This is a slightly tough task. I looked into existing apps and made a basic security service which can be used for this purpose. + + + Infinite scroll directive: I am loading all the data at a time in the current UI. This does not work well with huge production clouds. Again, changes the structure of collections slightly, important thing to be taken care of before doing further development. + + + A modal wizard directive required for adding instances. + + + After finishing those three I'd be equipped with enough UI stuff that can let me concentrate on my models. I'll try to add as many functionalities to the models which can easily used throught this UI, and also reusable in custon UIs. After finishing these, I'll implement a better notification system. + + + Tests: Although I should've done these parallelly while developing the UI, given the lack of experience, it took me some time to realize that tests are important. I have setup a test environment karma and I'll soon write tests for whatever I've written so far. + + +
+
+ Experience gained working on OSS and CloudStack + Working on OSS has been very different and offered much more to learn what a university project could offer me. Asking and answering questions is one of the important thing that really helped me and I feel this was the important part of the development so far. Although I was a bit shy to ask questions at the beginning, I really loved the way angular.js community has helped even for silly questions. Soon, I realized the same happens on the CloudStack mailing list or any OSS mailing list for that matter. Solving others problems also helps a lot in building up knowledge. So, answering questions is also one of the important thing about working on Open Source Software. Being nice and polite on the public discussions like this improves personality. I am really glad to be a part of it now and very thankful to Google for such a wonderful program that introduces students to real-world software problems at very early stages of student's experience. + I did not know much about CloudStack itself when I started working on the project. Following the discussions on mailing list, I googled for different terms used, watched a few videos on cloud and I'm really interested in learning more. I really hope to join the real CloudStack development soon. +
+
+ Conclusion + You can find a demo of the UI here live in action. + I am really happy with the progress and experience so far. The goals of the project look easily reachable with the experience I have now. I still have RESTful API to be handled at the end. So I'll have to finish most of the project by the end of the august. Each of the task in the next todo list I've mentioned above should not take much time if things go well and models required for the UI should be ready by august last week so that I can take care of any UI specific things and RESTful stuff. + + Here's small list of things that I've learned so far: + + + Git concepts, along with using JIRA and Review Board. + + + Some advanced JS concepts and JS frameworks like jQuery, backbone.js, angular.js. Using Twitter Bootstrap for faster UI development. + + + Basics of designing and structuring RESTful APIs + + + Cloudmonkey's code and usage. I had to look into its code when I was designing the RESTful API. + + + A bit more in depth understanding of Flask web framework + + + Exposure to testing environment like karma and testing the UI in different browsers + + + Code written so far is available here and here + I thank Google and CloudStack for giving me this oppurtunity, Sebastien and Kelcey for helping me along the way. +
diff --git a/docs/en-US/images/add-account-screen.png b/docs/en-US/images/add-account-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..aaa798f6766f599c01e25a0abdec80d8939d794b GIT binary patch literal 71491 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

knEIBd*v zE+B~FP``eEJ>0DB^0-%4*GB?3!^nT$IxjL=*s5D~`BD2=QO#Vf!@xSe%qjN>C*VsGWY08+ejMjXT zdp57T#r@dgX|k?@+T(=hWe1lf1+h`B+Cj%{Hl^h4L8rQJQ^a))FR#s*2*BvH_vEt#*Q?`?4~HbW>s|z@}$14%aZ?nm_3C5&FwZ^)#MK< zjZR?_d5~oHOX{t3{lxpusy+@FpeOL+-WKpM{k=$RLD(2#-Mva%y3C%Oi@ZO}p*2ei z9I(65yT0<4M;)G~oICB8jCta)5D^{yR^4S|S&7SQfAweIQWclYCCK>B^wgDLr6X%eR+iLD z$L+>`Gc|cW{ZzuwzD)b)WB{xkak(>9M@BR~*iZEcpRW)p-W_{>=g+Xk>I@-6m1}hc z#a=*0x6jkt!7hvoY0m~_zN9~_NKrrwm4WWFSp)a&;RuW=|MRuoNvH9q*S{=n^)60V z;b?q5dPzk)g{iuJB4t@blE(t_2$Obxnr|ErOVNA_&3f19pomlTB4J~LdmB|k0D zZ8t|$a}rcMu*Ga&%0wUc#KHeG=C)4>pQ}JUMlP0Q7$c2A=;4P(iQN1MMRfODeU@PmEIsr zCbn%FWgR*3`=dJzyAl2dQa27bcys*g+3Sq%L=GYUUf7ocSx^(P{o#DaCPWSQFXpDc zMyvT`C^(F1V;uYW;Z{?H#L$3W1_l2%o!io(q1_tKjGb^M&R4f%jUd|t&{-r)1HNCh zT4Vf6D?w5ti$s}3XX2{ohc?C?|1_f~U|$OECFU2r1T|8cdC);uF{{tsPVz+2>x zfm2^nK}E%zS7fa5?5CBTBKrTqOUCt$=Osfq99C(ykuV4-_jpyYKtzqc=CCPr&m>z-MQ# zKO)7$<+6D36doR4mLfsO_fVE?cy1+x()d~R%U}{k@4NXdk9VoVZz$#FWpj&?9K6;kL$FQumwZ#x+G;B z-`Aq}(>md(ee|H;Jpnlu-Wn9ze+s`xXAy?q=XBglsD1A$-dOTF`IaY7gsJOAp2jfS zSHpjFuP(wPS3;Hdv_n6JmNR`Qu<;kW5Z)&a0J>MCSe9$#kj3ylJ_Zp#td|!jXdI;z zsa`l-(is&uYWUlJ6PNqLDZF6kpzO#+tjQKR#x6|}?m{=g2dvd=a!hKpU$qtGq|o4r z3AwPm+ES4Ht3&Dp14T zEBkb3kcduR`bO8=;pwflKL-9jZPGuj<%L&RA!V$atIiu5007brV2HHr-BT<7fPf4W zd4CGs^68a0t6ONE5pelX7PbUC|QCy0h3aD zGS*)iew5AoZS{mt2?mJ}+V2~ouX4$(iY#J}TJAKBH-q@Ge@VOX01ppilSYy_XH`Pl9 zwHN7|72RSd^JTZash-xQ#?Y91!?+oWPG!yC>=AivW^mj^1b7OnotacOB!eoRV{LxG2(?+x3-lWdc z*&hf43Wl`Bpk)r<=W^D^>%A)TbLb7b*~14OHqI8x|KUeh)Qd5=S!~YP{GKH|7Jb^? zN<~Dnx7s?~6f?2N?);_FOz0g8pE5-BtQDmy;2 z!}b}JoBa5K63G-0_=p9>#-)WZ!NS6U`?a_8M%F5p5rfWLGUPlDOP7j$ay{#Iq<)qo&4g z#r8N&w5`Oj&F-I$0y5vPjK}e!uv0G?bofy=_{#h8NfxUg@Oy!2Cq$)%1%HjW*QSN< zIJ?3H7b8S?t8yMr7T=6X5Qg2D|Gvy~75_18meewK#A%zZq8@G{L^aGHD=|$uQ*T@N z%YhUDlA%&( zP^wswJW7AU)&mg=x7e#|xKtWa&i{?oR*sPb#KY&uH~^H2-I@S)PYyG&s0CnpFUe8# z`^_LoN(nT0fY_WQ_m9ePrLCwisHenX#2rw_aeYsI4vek`YZXVyW?ETb7dq2RoHcx?$QZh(giIIVU}r_ z8R5FJ+Cbe+S!-3g3Px1dE#7aF9go{zcKhEZh@k)6yLpZ5l;g+mD==|>!8pRlPw2fp z@0WJ(>D&v-E5Z1+9yLG}F`+%JULOnxHPf|0d^@kJQw}`@a;wC0OIz5i^^2ws+ zo0q<8t*H8u_TCz(P$B&WV89QI(UB4AFK>gPQ$Ad)7ePTFDoa9KpHGQ$|hjw}FY=x})(vFNO5|f2b z@v11thI@ zeDXgan=G~8!$p3zi8_~T)4U;sb_d;F}FE5+UHr(hZWZUcffN}BIX~1D* z?Q&Xgc*RdDB@b4wJsfXtK)^ya7y_ff@k8-y8PblMn}8VES^60g-M(r3cb^v>4I;-9 zO`oi9pF^I2k#_fWqnjBT=wk%BHweRaZFaOE!QI>+Jpi@by{n|r@c@tcSH!a47yn?X zz<9s~6(Ai9VH(-uw}}BD35!44_a$uPuf9LuDW?l}}VO=+%cxR;VV5cS?9!MEV8$Yc@_w`!(RC{Cqz;-aduZ z^N%k`Vc>v0lLV~P2zoi0!61jq4Ovepsa>L>l@JQ!l&y1t-7f{&fz}|PyUn}n{ynMf z-NQR=7JOj}7ZMzwo^Ce)sNw<*4&9uO4})@-yqhXi?|~r$Ou!|BmdehY3mX(mi;^8@ z?CRYK-^BXAj*TzT$K&Vf-YgA8V0S-dL$?_R{VWoshjWl*u5{>I^F6+ht6t~hYFBFs$#eok1333Kk>N+mm>ou_GLuHj9Ux14=3GkTSUc;=ovxmwLDi#h9)S;h@yuAir3l}(Q@`o3fpqw3S`{8Z2LEgOw-zVb!J&9 zE6!DCQD%$nY(Cfs-Czr)rMdi8Fi+AGCU;r@W|_AOjtje==^;= z%)TUa#}&IfdK%t&>WVUJ+MFssLE*PKf4@T;&S9k?+WNjP_EUd`#8_BB=pfN$ShE*O zPiZ^W{b0G;TCGc{r_rlEN|nT~Q1Hn_q8HN-67o^?4Fv}WzyW>MWbc&Yb7SGuanJz< za5R)S&eZaKhyfpB%sc$l>v4Kx^XW#2uGl5BD>GjbC6`JFw$%>u&`+;rgg?3eNV~S% zt5o7m|01{fdtoh!wp7z0$R{u=`%W3YfzNvMrtg&hs0Xy^aCR>DUXH&dc;Az)5}D@^ zx3ATZ$gk*@Eu!@%_q*X5KbE6YssclZoco;^xT_o7>4u_2*vZ z(Wj9i1nY}svFK8ffx5kCGDvKHpq4Ne4~z@9<|;&qp_a!Go!dYsDNEOcO7dc=3fuk} zcQ`t7$6)h2KFSm&2Jw1!j?+P`@8EP75uX|WXyyK0lphX|gWX~zl$VW0EW_6Y$1(iy z8}J9z?_XI4AH-dV97icb!nBQ|vsM4a#vxRHRO%VVYfrFJwdH+Z z!?6nP4iFg2E&jE8yKzWjehHg+GTHZdjwGiMnQLUET)ce1%#()*ZYI8!2Mt>_OkpPDTa1_|m05z9IQx8It|K_+K zM(1w%M>{3oCGa-%*)pEFDD^mtpJHSHVUwc5i(mgP6)>Yg3r zQAdZ{jdYfm^#^Pj@9mcTk2kAf38F5h-F@~-&H39N?VXF`3sRI^^;wD(`bAz>M8imw zOg>jaAU~g!X@G;786ak)1Pra3RzYCVj@}EY(ijRj;r@R2FIX(?9P$hd9ZqAYzx|F} zB^*4mNbryurhN{_DCI#{_=#!f&e_I6a5vQvxj+ycSZM<#R|jaASsbML`;`U)lCg^9 zaOvmh1X1V3^Iu<+M&_hZx_*m_heBS3q@LOHajf417uvu{>=xNt0_;LK&qOxf{GJf* zmX$_vnj2y?EWc*)wQ~&v3_eYQ0R-`>(^jHhzpd)cr1M{7PO-$*xt4D}umtxr_2&qf zE$cPck13-9t8M4=2Oa0kHQ@IPHO%y<+p9}WT=h>!(M!{Bg45~)bwiH*#m|I+Kg7fj z#`#`+s-NvAH{QHG9^jDSD|eGul)@mO0iaCEPo5eHrW9esuH4vX*W^R!HQGA_NrNF9 zmx~H1^rLo-G=*E?6qg!X563XlyPfYfmhRs{a<>bEa^#mOgbZB;$Z<~XwTa#(7+Rbw`4y9VwIhclLhn*neF7^81_UDo} z2^Y?VUl9MV7GRSzX{Ol_hf(M*lY({$EZ6kGMp8AQOS`Sgyq-d1ypk+{qTYSp)iM)P zv?q3i9pyN?%_{C1J(_e0Ixg3!W#i;_8i%E0S+@2G%o5*ZJM?JRX{t8ge9_P^np*O-B^khXRlUtl#J z#HhD4s5o*Q$F%Nfem~!-NPtvo6ukfJX2@^x9J3R$*s3>KjJ9I>aT3qmlo_6l<83Ys zbDPF8>i;C5fK+u1|2zL$KyAQr;znvvt=@7|vT8K&5-`etn!y46e|ib!3)LZ=w^eI2 z?52MOF#^prc^WPGwpz36x&eE8Idnlja+t>#U1?c&x4F`?NdeV143faG zGg?vrL_#c@*cYYQh=jW&AAjk!1C?h!RH^{$8Lm zU(#}W+&KG!zMH{5d(b*TsRjFkq(eW#;z7j>$59Rkx_gB$| z4?UZVP;{}}@PEWYOxKWr-;392C*!e+Xu)G9vzO1VtCy(66qGsVR8s_h3ybk(6&+!m ztRj5fZy-<)OR!Q1n;{v)SyBl`jC)gsT>WXkm^?i7qMlE2vXCu~Buk%|cZ$dj6W~tv zS&jx@g<)lI`p~){!_aV^-OOU65E8K1i3CAG-p6dzk(1B)hHT-sy}#IE)~>$>eC3o} zpVQN6z2AEb(Ug*^=7aH-#d_7TJegEBat(ZwT+XDkvrn;_E~%}DVGifGU-En(94(*G z`ho6`zm&T}9`LpM`6bo8!BcvnK45ubSDyY|@x(gf>aCMsPed@dR34j&!8rF?z zjt6`_1 zH{i{fpsDZ3VtgGoy*>pKS0b9va8GI&G@>8s_!5Xg+If;=+=HHtUSLU|#;mHD z4H~0y5>}i}rYW#6j-6_&dVA3RLY&4<-P>V7Ul_Z} ztoONm$}kzjC0#+rVX3$@X1SjdrsA+a7quC=M?W@pfgvuE5d3~QfHuI1F*3>5Y16u? znQ@;p$ruibona|8ZpQ`^%K|(bB09auJEp?H1h;WF@^5pSLWsoSXnZJcWoRO4O|VLV%pq+% zO!tL#zv)_>eB=)v(b2G*emoqaZ#G=Yzg~Dn(*QNGv$HgvSHIk0H95`%oat7{zyM0# zfUg;i|7Q1Eh@yz?G%=tT;6Ii*&zl||bcUGfp?|R*dnNbP(UKGnn4N}Q&lFyoLUweR ze>~wClcE&Dhu&^G1g)+co@Do|s-FH#rY({EWAcMwy-EkyCPnGZk<($_^aM)qKh5$H zfi&NnFo1S+q^@0m_JC(WMyfM8(F+maoamRXmi{XoAc27A@_6*4iH}U-rKS?KH#jIL zc+Ql@c4-SN5QTOaL_#}Sfxh@@!* zcXQ)}X?z(#3yO^_szCGo6M+WYM4z*rG*Dh4n#ul?B|NWrE4e*=e*^)X)`B^LgoeMt z6Ao%0xP94Q-Wa;}Iel)1C`f*clLImsNDSl4x(wDE-WVkGj6PEVgO%NnR}RsevB)2W zo;K%`FXJFPh#2A_-s8XEh8R+$8MYp*Th|677Veq$AS^YW&)%tp>N%`#ba>$;du8M!304 z-;r!Oucf9=k}m0AG69@dO$4`h)Jwf$z!2yby}s?lba0E@_*yPl^<6eNH`S7h$Emkj z$<+0P+l3VT`iDL90K%RtvKcOmIskLnjU(7+k)^h?a|KG#YW3PrnCzmbrmxaAYS2*i zPIg{)EOxIip8u?!lcVO5WI-1n&j~n)n8WHD$=f8`RoipQRrsV!Jgm&|G@<;prU`x>WOAQOchrXdR42yt^@r1 zG5k_tg+&QV0pgr6Dpg_hMnR}0zZicy>JZ2r)km@Gdp#pafGyRX3;ryecjwSAS2>6x zvI&Y59XvsY+rpW*Ra0pNZ~u!G$IV`H7qzei6&wy{MZLwXox)p4CuDyj4Y6PS6Dc}S z+S4~mzQwq|9m*}<>y0W!V*vRvgku~RDhOtD99$RDfmv+&i~tB zjSOM}Lc+y=?RWA{b5;+AnRC$!v6WI_^iK?&y=wf%+BC{WjUVVG#IEb?d8y?i%MO!> zU)GI^yNRu+u!611De5s|NBIwj$4>;d{-=F>H;E}`FXJDaQRB{;QO zdYvt%6PVxZO*3AGk%)40o4b1cDSf9+LU-}~?TiSGG^EpjL( zzKE0wNr8v>5?(_Js>}Q-4Ww)ogwP|#-5R1vNau3hW_q+%#w-3Sp@)|V(}ZzD5gyk7 zm4&}LTR1Gal1~zy1K)qqup|HHRM~$vZQp$%&ovV@@_NrymsRt(vntEcovv?VW?8b` z#JaM^k1-oInPdT4SA-_8#N1RXYafBtcNyNsXJ_EMp#f`pfXd%sX8l+Kzve~%)#=w# zg!I4O5Xlo0WvH>f%+<(;)B2#-fvkbxZ#UI1uRl=HfSE+J5fy5cNM@VOPTL zp!|l2xqggHbBm9)w}s1Z2?O3B;c+TASN*Cg;yOw$d{?z?WtjPmqv|&QU>;fCr?CjE z3g^Gg5`_3%TFLmn8>iqTeYYcs8BHop;E_Z;CSyl&`A5w>O-OyjNmB3td&Tl{FiVZ+ z+kv${3CTK-s}tzHU{D@4vd#5$rkknY)lrZ->VAS-{(I1u*WI2#$?>svJMFbD_x>^S zA566gcvirRC2^qS@Yt6BhyF*)8NSJ^j4arROUOSGHbI~pF27LGj&{_ZSHS8Y4zSee z{);TEj%*q7$M7xSK=2J=Zt+|A%_7MVAqk0wC6lUEZC&oaX!H4xZ598{5&Sec#Q$q= z_wpe_mX>rsx2MA)RZz0Jg>B@1d&bKr{`*%LeMgg*)g#cXX(OSB0swF1>)sd-q zJS@?g96n@*o5IFP?whAq8L!Dyrd=i6aD2_Lf&ZedxnU;w*^?C-0n=2^#vot6jQ(Fm z{%O%+XV3gF1Q_h|+D{jtqBB_Qi@ZD~FBExc^sTG>!2AO(Pb=w?vAee!w;tZJo*DE!YOba= zsT%_Eh3Hl<5!a+qpDTGFRo}kn=$jsND7BsuC7oddQF;y z1TQGSl2vk-*{VvFlgjy0Cmnz)wtZ=rnX7OTlCE{31xF5$#{$4dW>6A%yhoxCmmn9X z()8xf!6EA|Yb-<9xyOU{S%$BOkh%Y-eV;3QrZM=XgALLD?dH+eQa1+YLG4)sdoimt z8>qwL_*3~|zSngo2|K_Z0ZWZU@?nWe-~#@0u=59HVi#W7cGtm?_)JSzKF$AW;S)c! z)f!198>9*vH0kcTrj5Om#Nh$wp|V!#D4xtvfI%dpI8I;ay;7quCoh*ao)qj z9W^Djq}1>b1MSA!;BX=y7k6d)Ar~++wTtk{HeKP|$RtixFXTVa29luic>eaj=D4{DCWyz4 z@8;)!6;=y|h3||@PRr0$F8)cw`1VyYPhm|d1sfQsqveLoXt9?u6TWS}n$kcQ8HN3Y(zI~k&`7TCx@f6=~6h~Z%N z*An_dQbCORTGnUu$FeRzH@_6 z2bzFHv`i5i=21KtnmsDQ!}EA#?JpWbN3yYcgNDB`?Z}ckJ#HWpXc8a*7ECZM4{V*M(Q1Vfjf63sPF0B+DW^R#TRT_f zMk)wAlg6ufM|SAWWOrPKAWbC>oPob(7m03@jPfl|)@GXg)l&+kD!b!01egMs%K z)5{k1nw9KA7$3oZ@;~DjMK~~4?p!k&Z(MBOCD<5s^m{<1$mzl7SHTvOL=jUT@a^CJ zllZ~G*Ozf{8vkT6mX!g1_a;$%?*SuJ_b02^QBH- zl8B|)Ls0Ng*BV6HyJDL9EokUibfh}%FQm$QNgB=YFRZ8PX{G(_@JqJbp-G~|F$qxr zI?_(w=2M#NV+=7v6N?q?w>!5AznPTN9u89Kk>U1@7uj(K2ay8EW=`HUe?GUE@{AsBE)8>5WYAdFJG zsSK!9Dwc!4@$%het@eAmpQr~94>QzhSZhSBSTva)Vk{A$P1cr~b5xreRV2a*hb|k4 z`GNfA4{Dark$yNlz5PO=rejG;%7FF9TZYei5@$1`2$h;8GYh~CI=9}JgJmOS)SND0hrM=iKOtax>eFXM*K;8slKUQIm$#| zRvdKoWcO@Ke9V)}!+uBnNk_PBLv@wBE%)es_h@6BWJC98XHLlCrqx5tYz^GCDRX#rIgI4BmpD`CLq=N(sGEp z-5DEiuLMkQ1d@gPGBE)X$e%9#Bgn4*1RRoiDwx=4z6ysb<{hmU{WMXr(GNofW32ie z8yLGZxX{bwm$I*PsRYIXu5Vk4dVk8V=}wxSg~&*Usw z*(c``s8W1Zkn&N!?4c82+OTViNjkWjmgaQc_x~1F`qk!V-M=j6rI5N!-xU{X#w11k zE4>5TCwnR0_iGAr#I=e-^>kZb%M%tZs>g+Jd{dLEkz428F7q?@-WE)0EE?&=kfj_j@X=@?>`AXM9c2xW7Fv#$3iBzjk0uq<`24H z1319blN3A`uz67cvB4pnZX%RqGWjq`sGOn0{tN*K=p{bn?xOz1 zZ-6q{?91f59r=+W=%@Dk{@)mH!Sad28}eu295=zxG#)9Z83XHVvGZrbl%B6l4H>#* z{6Frfd5cj7S{n@XjRKL^fh?E~K4)L0ORCSJ940$st8tWc9c{Ra^v6aPA0qVUe!CVX zup_o`Cc^>N>VfOsL2o{1ii)XRLcQHE+m!P;mkTr}SKHPF$IbROajRK6;oT8tYS?BH zbA_;{v6C1VN^U2_pR0#GD=DA91put-S4q4p_(1Nv+W3#765Qc-zA^ipuEz%-QK2LsGE%btxs&Eg8F0$iim!TrWHt`L?iY8xK&p@MnU> zgiyZYBY^d3O^~6Yh6z2J2AO(QfocFT6M`@TH9gBd_9wgI!H18GjE;ZiG5h-_3CkX5 zV@0JkdeA-DBBst7^P5i?7;yVU-(?}bk>HGy_84ecC5~U%9e(bE{cMZZtP)HR{iG%b z5Qz8!QMBh+(8?ygRHoqn#0%Af44+|F*WzHD$fEcZ*LOgIbiwp5B zU6n)eTp+4Y`MvH;zY3nIYE)9Il-(?W+hzZ>k0{N*=|;8+7fDh+YG~WFbny5a8(H9H zeFka8a~2#5P)km#IPa-LQ1T2RA_>GPmP`;Q4|)n99=iC2U553>Q`UvWW`hxgf)be( z_ewjM!|Pb4eR_as9S4MkfllXJ?)=eHIKLnX=B?R+NbpD9-7LYqI@&vUK|K@+{br5J z1i~hA{*?NkP|Z58 z{J4eq%%9(R8)N{SPhh|%5C=~9p{BGIE{5X1Hd!slt6Dh!q)fqod!3aHiVER<_lgh< zVq@5)C|wR7L~0gpu5~_Vc)H%z^`%w(icySx@(&@-IK6Kx`)}=8lJwyY`U)o`7?21j zwsMzvlq&8LQXnoHh?Bf)g;gca?)P7RLXDRPm{1pI95Jcs07hD0Dyn&d z21_Zaw;}Uf3IJ~3M+7u&k@()J1DDM}P2T{YzZDA~E)6BQ!==*mA)tQR zdi&uDGgz0|dQdMB_>|Qe8)+<~4Sed;=2*d$@u827Hi~|c4L7*DR_sQ$mzyMs0yQ@4 z8i&a5gyjJap5vZpRBf(0$oOmzaWPhwHF zN5R})pdg0CfWHlF_1Q3fSJyN+YWjBeCFsZ*fOS{p!zCT=idbM1p3`s=RPe{o2a>_sg$EEPZy&)2Y#D;9HLB-so#`>ncRgUw?55-?OWGB)$02gd$d} zbXeunxeSXunYHci9!ec3GTvvS=0Uf=ZvSh>x^m8*B{%3$6_ZnHzaOnZ zw#Mr)jP+o)D7dI$)KPO%$-wN{-r{BBcDzvpzp4J^b-w+c-ZEXz>uDoB-rq3=8KG87 ztIO%>C-DCe_trsiHNm4ONr+;>U9x!a;7(w%V8KFgg1fsdkl+y9EiCTAWswlv-C5ih zcinxPeEHpX@1O5gy?Rp=b>`IBnVz2Ro}TWWo?N?eVX*yXaMrDeu&;p=qJJN+II#i* zX=ovM-2tGf%c$8n(`cshISb$w)mkojaEj?$9=_o!TOgG)<5f@XpYkP3MnMTlhJbb# zg2DN0BoZ37_0cAcZdt8bk(Nh?%dYn|Pf^BIVuLX$$MS8ws`K(;(G%g?*&jnh%+G&ykWXoR&utoJq*@e;jhM&WC8b;;Cz=BX@;*oT zb$gW}bPk@0iAS` zZgydTjcag42g6|C;s62ta`x@cO23i_*s!vhxs323>Z;=YBwLLZ7|rqk)NJN-z6E-g_sUYow*KAAvf>od3;0Gf^_z2Ij6DyCIN+ zf`Wn!dTO}um+ZZ;;?3b=$Yrh;`xS`q7t*crenI?bAKU79CZ>e;)4u$cq-}-8+a#{l zrqpRYDe@(kSx^%?b88LTNt!xSJX>T-%OmOO6NS*bVY5`4OllQ&Iz-P>Mvt^6^zI2F z(=5Y>&g;cD)ZX8$B)|X$1_GVYx*ugLL05J23&mygdKGnT+E!LA$g0+XA+Iu1!|LPD zuigfPG(45O6h@c4U4GYsawofQ%FluI|rO%{S@%hdT-+j*~6gD7L?Bs$? zw7BSj64^gHR;j=r8OYFGTKpJds9sP+)t6tIFXUum+7n_Z(t8nRfR?V6L>FRa%f5xs zX!=+^1cwuN*Agl?t>vi>&p90rbtWU#M-;#6-pZcEbf<|)^%N7+++EKkZTotQhptrG zJGPq&s7iN(PSNT50o*vrv`SDClkz1UMM?5d?fb0{E+MhH`Q}c80_FMilCNgCV6x@n zof|bTlXSRcMQZY~{dwPj9t z_QBJEkda?CY(v=2M=gn2x@$6Cp8Mli@^#$AgSzk5kh5%<>gpFzr$DP|5DtT#jEI0g zTNk8#u}7-3tn~wjqbu$0^WuB*L;Spz?%<}7Rw`J-+T3Ex$v_iOlG^?PY!k(ZST*LV%&kKF4dl;%rtzp=QMT<;qB zR0>}!Y;#?Puz~PMRkc>|bULIPih0ZL)1tYMn4+IDCpbn``mDnIC$NNy)ErGB=-KvO1}pQY0~<*%hR42m4Mo3*t(=j$9sJ zPaPZQ^*UMXtGQ$wX@(%oC3H8JI##D4RD^JgPd~YoQKR&k7OslK}jXR(7USTmwyeeynd;Q681~(!-rUr`2?EE z(o*?q0W3XyUFu;bM~a6vXo6i!^<_s?-HcWdHGM`JF00oabUub~M98k@Z1k2;A9Qwb z;J+w`jMcbj4t$xJEpgLYudi3Tb)cY)Jju4Ln5nb!Nktmp%SzPS=OzqfJ6ki*PvW-p z6jw)jVCilqjJrg`?*2!qR)%v|q&{gzVhk;XJ0enJ*~8Asr{6=Bj_}pSUU1;@6Zsr@<$zACoZB_QAGTXKwtRreT=R`J1qb(Of*s3(6g?rR@)(VxYgZs zcmz2I+$#p<-N2K{NIU#|i&++bcx#Q90;SqQ>a9!~WVpX2%MZkcC9VSIuPbKY%zd7^#YWFW)t{0k#QzDMk;6v(qRJs?o_4KdJ_wI2H!S4%a z+?03YozNdg+u~kGOpD2=j1${-KdtN{R1* z{9Co3iDpx|Mj|Dd=EvDDt-ObToi_tj;IY{w#Hn{DpDmw?p@h!BD8Fbsdc$QhRah*b z7L(zxJYbSZ*G|lao$U0ki7UVU?Qrm|1cip`cQ6GG>ibxl4t7$~y#vhPg-rtOBrKry zGvWBzd(GN8l0DeF>Z*mdZ;%(BAsqP(r-j&!Y4ryh*5yW<0Srv8D*I1ndH>)S{>F6U z``FrQHt~{Xk{-jk^&2t2xGvQ9ufKi#sfqVgGf_Rw=7$%m8D)2JY41gCZE^A2w-hbn zcI@5bD&F|`39B+XuPY5OkWHZrs5BJuOu-rqPJvMa_~=*WuTXx;%Az;a&XHGsKL6F~ zqX6%Y$$9m>N!9*xHJz`X$SBJO&c(|+1Ct}(p=h5Ac8aAHa1(Ezzo3*d!j^q6fP-xH z8DWt-aGI8rZCFMLOB#@x|7Dk%j~qwSFMiTlHa3ck-%zt*=m#$jLQFHU(dceEVsIaK z`uR?TQ~3w3i{>%NB}Hke1<}soA6%X@UG^G*h<1=E-u{+f7WC-O&;M0^h*BZ9cz+8! z!~gbZAeXx#-!Xd8U_mqs!2a(8MV9xkfwHkC>hZVSZ>3*Ry=0+KrE$1S*Ys%YShSrH zbNkn5t6D(&N6D#dw=7Y^Azyx|p=j5Z%p>RAu5}F^o{nAT5ODGfc+4NY?9UHW1DzCs0aSb$ z--!toynMRa_J@5*e81y~N#|Qcki^i3fvH}+fFn2U$g(o|0hk&J6l?GGp5VGIv&cme zSWDcr=OZ!-LHzf{vjle`J!R!=m}jt~X5!iDshax1stezCMa$*-G;*Ba4~eXXZMq8P>C-wwUQwMs~XX2yJ7{bTlE?lf?|g<=3$s=>=}A<^r0EIsd&t_(ppg=F?tHga6acH8=^TvGZ5`M9%f&`E-Aybr#9^$jQx<^gQUK9{z$f+osAg8j?s>z2@sk-bBzv3Dopa&65$R7hX!*|!Ak#=?!txBcEvCEfw(GNs-JNG4sm4zm@_saiqP>slZ!C*Q94PR0j&t$D(Ojz{f8=32KTq4}$8CcyF zbHTVeRz()bCHOikBxuW6Ulg%dF_OWV-|)*6w%Z$diQXX-F*NEzeWJg%fE@YB#mus~ zt?l8d{KK)JoZj5$vJ3DSu8u;94m@qSxr)>J;@0w$!M0#Uo32CH?X;lQ)LqHU(O53- za)@xn9F}`Ce5L%!Bc~sC|4~zc7!A%`gF_B{n_h=>scw!2q8hsfhUUy>R1p#GQ)t!> z3}YM-fqV?tyCY*{Hog%qLfnp$IgCQg7aJVBt`4~)T8A&Q*llZ=20UEk zA7`lfDY%?&(fdpxoKTe0ZfRzumH1IMmaqF}^Jr|)z-jz2TdMT3$Eng0Z>=vZ^Yj2x z-WwCrYd%}GH^rT$E{%E=Ql#PgFb;5AqY#{P1OUd1>-Qtg^tDz@fyNZNcXw@+sTU7v zJ#$~P9uC~ny1lmr3G-j}Sz_{)Sq`1CS)Lt{?skQs{-FxL>ZSQwD{?kg#fR$_sT6L> zNNe>^>ctpo5e(4bbH0l2Bm^h%SJTn?6_H(A!x;-hQ;+?Bt#(Y!=(>?(o0yskkPX*G zh*gmDYo#GaI~4tB_$Frl7PvScNs)&l(20QO|GL!m@>-g~4FekSq$$K|fs2+*92qfK_yDO>8j#{vYernT}<=FUdG`JQ&n%a!lg-|kJ7v|SsPd?8AldZ*$( zm^@}-VG&wUpp?~W*wqh$JK(yKXJaxG$9-P?*pjii zszxcKXY@O-nIxWIHHQ?oF(U10F003((jw>SCYlQVej_lOfyeGbtR3v<6j+H!>4uaM zz+8*@+epeo(a$LiSi#imJ$PBMy+Sbx76V1VoJv^vozy}}$)~cgo^^Wb5b3K{cf8Xd`{b%z!2}4z1$q70AD*<4gP)ta@71?)Q^#3-kx&@vBYp?8oiQj~`#R)bs#&k& zsu(7AGkp61x;tK{RxKy8OgHvea~ii4S;ig6R4zP3^o%6!D|uIOx82>eX_4G5P-CDS zLKemf7#6H*&rbe%y7%ax--{e}6|1S&4nJVg~ZDcA00n8XO=bfpCbOlN0jUbDj8J2E!VnE58X=2}d} z*Lk@GdBbg6j}3SKTv9d)3A~dq{C9@tRKCV=(pS($9#6{)Y~@%_K)&k!B+$H zO$CuMXmeQ54*qGk%MLnfQT+b)972JZHnv;8?P z&koV(p2}-~Y`^z2(ffB}oA1$Xg?q{hk$^n-#de~J!*FPX%x6Nf7%>?+7sj$a#tzU= zt*h??auJ(JoZ&(Jlp181nwn#AOq6@LAu^&>CQ4keHSs8@@X>R(o;?xw%bT#GLyrTn{P6xLqWBAF*Jd6-ttwa(9=8(jI_P1DfD);^=X=`Fh_rrV0bKJio8D*Gc)qb|B z@QvY?BA?j+lU#5HuSt{vNf5`)B?NYP@JfT62fZV4k6S)2%`_O#k0A``eRoM7N0%`X zS9f^`wMsSBxCzKrTy^xLmw6OHsyiE($r$#|)_D~vF*1JAVb2}Z9j+r#>DVFA{448a z|J4qyfQFX4frTWiRM&-C7X1Yy^Kk1;z{ zp`My!AjEwJ!n0-LA~^G6SGzAzQ-k)sC%Ud*NUM;2_ zD%E@mbm=Pcf&V@l2uW|;)`!>5t*g>jf&Gc*nlBUM{S2<=is)X~D%PcYi_7U`@wfCc zMX%UxNQho5UnSp{g%@EPvfBE(CEw}^dms{b==4$Z3T7BF)J_t-_+tzcO`?-U(RXt{e zxura{*<^7yUsyvl!$5jB=K3wWu3ZWw*)C@my_)Nen_C?UQb}dKqBkR6!;tIX_3q{i zsF$zvRhw?A-O(kM`f;XL2Xq@}CJoC@8_^wRg7`Sz>NOXQ+u9TNgL1A)Fr9-1dj>b9 zJymKzaGD8QlC*?+SSTyKCjZmjjdsb>vO@!hA!ArypP6HazVe7F8`+jM;(HUTycH9k z5Ve%&(!3@y`>EHsQG3EF{@PHbF=(>?Cz@QaP|Frp+cL;^H&Atie6@r5j{ruhH&T3L z(=ME``o=GRH=F5mgj!RhaVgvx_EqP!Ipl1dTcp-GkB5wPz6)_7dMXCYk&bFT8x~Ar z(?1Coy~3t+DPb_H; z5>gn@goYuufgbtr`;HEMugxn2a#>)zgW9!0wmRrpsSMeOt9?k27@mv3I50X32+>wf1pC*6#GKht44D!1Hb+td1r}Mchy-f$ofO``Y@#dVPJ+x`ZNM9qEwOB zRXU)z@IlJ&fHfZzvY~zTed*-n4yGY`Hx|6Td|t*R<(g&uS0VS~l%&BKb5>=hP;GG; zNNjt!SzLfq=b1<3TgaU^?DL5x-W$NOX=*O+vX7N9?8Pq6I0chj@gN zymsw(!8d_*y~9a_Ns&4~?H$8%-SNgt7N#O*G@foKYba4>RlM#>OMi?VvqPRJzHs>| zP);=}@2XyK9^Q%TN=6HwB4FIF8N14{r-SmjW24|TgE({e6zDkm`Djq%rp zpFQn~KH;n&zx6dX6tp z7#k;8?L9-~OS>%X4HF$gbF229$;rv`a!%{npSkNhECa8CC5*Zwb|vqX9vaE0uy4{H zAAzp>BG3v1$Xo%jCLVC^BsL!t52q2+-K%d5uMP-b)W|atpB07Vj)k`}@Z&E) zF67pke@+u}d5HB)!nWSZd9@I^pqo1h>>wMK??HT zbSr;QdZ5?HO=>$|zpIOAK8s4q>;Ha(rE?W`Q$O^8g?KpY_5e)5o2^Q)v@d#e#= zAT}8deD~jiBpCgB_T2iX&$?K(#x7YOCOmui*Mk}0QKF@9X51^RNgb3qyjFSJuJ3-{ zXhsGfBrWj`)V7#N`=JH0932^I&WTJ}7hhXLw`0!3d-B78hVZ~`4+Q+u%Ibg+YsR(w zhL3Bbig6An#yNIV>VOa;Zm}J8843i-yEeM34)S}uyK0eirRF$p^)AY9x_|heSbzww zgpgjo#n${(fzCWT570VKHoN*13{1cuih48~-d*lv(G{Ce8QyJN=*hmvM8QjAk?l1& z7-7!urSl=!)4OH7~>lIuA6{g6mH(7T||hV7cvyw0knWZF;w=Bx#sJ3 zTSkP8(#L)X85(A`u1`4fGfmKTV^Y3~jV-!#24Vdpi>pPa5hLInU508)T2JI^#9VU# z@hXsJzSRBK;Ci~;{aN~2YD)D{<923w`PrOVmJ-sKa%Kw(ph^e9;}z0)@CgVm!Cnvb zWCr4f0zP-lzd9XqmJ!Djar>@GWUkV8*KPbnVO{I=UNMoBzNsmhi94&wYXNmX+Z1SU z4*s&Q^dsjhOPsyg1rJ=bb#7WEcVm%ZAEujb(lp1Qix@Z$p+cO1f z>VrJjs}UEJh=*UiaGW>D{9bJ-JQW-F!Fu;57jAI3_EP=VF>9nE7cj;(2MtJF`1e;9 zeOlT1RZ&@>l~Bsb6kz6WCg0|BjS1aY_X$c+?QNQ9qs?I!<3YfkhL6)HW!OUHTKgWG z$kMT5C!jq=oy%wypT%pDv9a3rz8F5QT_N12e7upQCu(Pz>VArx{ppPMn%FVMvK*|z zU#rgsc*mHqv8HB#x{{16Zl=MhD#Nrh!>`J{L37nd*fHj3n4~s@A^bhw2g_~n%YL_I z507fa*m`rt!{j%0xq+7fCAJSuRcjf%N!IT+2O0BXg_UY50>J~s?XC*$dKufs-q7M7bc@qwy3>p91V zi)9+X@J$c~DUa=9a$1_8-I7pnheP{QRo}BTti8RxckkYLj&-Qkl2LhWREnPe>{F%= z8fmb%G^B4<;<3AFu$IG85_*#~vFgZQgmnVa#wtk4w5y+^*=?9a#xjn5-hWWYIybiX zW$+78opoQp5O(m~4)w8rL6+YA!_o58lxCDD9HMQfyK&*^HFNg9yHM|;Q~xsk4tg{^ z$k)E)AzbnD@6bl+F)%QqgfBnO?|}#o=ij~s)Q9kKgbp?|+6{iYozrl|Mc|HQ3VVGj zyG7bYpu~~gi7Z}u#l^)nHRs`Mb&j?^XKBl1?~Hp-HwT`+PZo5uU0_5yvAICE;Rq)$ z)utw9>_(koCe}2E-%0#>~%GgF$msCFHS~qvScZ z3*WcmWsM;E{wo{*Y#-+e3!nX7?XT>i2ReT?!#I*+pRa_^24DU zQY}5-omlpSm9;$_*lFlEbQLP+Ojm#^2+3h>n<#>OfnNKyW}2V2pFZ~LS;ljRK`|5y zsHe6SPCOnI{JZnT_|lEryW;?|(I)Q%g0eI+(ZdX_7ie`7TWau3sJ?m04B`-h3<`%!L`r8i* z%BV!5iDb^0wC{spQbG8|k`ni~Qu5FM_n%lyp=rCwu%w~J;$;#+rWXMQ^$R?{$1y$Y zbqm&2%vjD*|NUTP;Hwh_deG(mLfb}{2GVI_>s(8EQxx2OAe&5pPk>(v0!_f+>L()m zAO8p1l;UDW#@6590EytJOEZYfBO2^bDWiACo(>z zWlzVD%Az%oCIJz)gG5vpGEk;-r3c_VY+UfQ>-Rk4Zlb|JucG?-ud$||9&gM4c~k7e z(qr-b49@Zj1ZV(j`Pmi(FTu!NS?3Xw}`^aoT z$nwizbesGUja!&14aM2aT~rqWXxx=Xde5O40EJm*nVBcOTImrytjds!O`sJ{!^Y;A zv&9Xm*%H%6ih{)u9&Sl_z+7G!u(Po%PCw0Urg4}%wxwkq=F<8PTrtodi~*%_r-wLh0Q=rc*wj4@Hu00*>7CPH}%RK3m$y*NK5o?zvsY>Si_VjZN?7 z6C7|3^ePs<#64Y;VkR@^(PD*`6L*I=S+?;|&PcSIeobkTlvfy$RSgX>UXIQd;Z)OD zD0KoT#!kQ-=G8TgfxtwHaMUM5l}2%Q{Baq2Q3K^49%J*aj~V=6wEnn#f|`z}|EWoJ z?Igdc`?BvJ#ryeA*W;nYS%--kcN_hRlAT*op}Kt(dL^%`W|aHX)Qz{oBOHD_|O&n4*luy{iCfT1gWfw8^Pp zZNT~uYL^EYm$K@ccp)$>QT=7+07SGQuQ!s292 z13{#up)%AOS~C(6D6wI`AjwJasMGVT>>ayqQ!lLpzU zT$u>Pf)_Uep}i@25ZK8_4?tdv@jIk9MABJNcKRR5q3qcC z=wObHV^j^q0#wGQQ21o4%=hT*vYyJIle3p8qQTP$Vi?Y8^h^QNRRXqH2DK2HZ36o4 zLKcJp@rgMD1qQe5a1DCJ-Z3BYb}2G@oP#C2EIAu;rC$oVynKD7WmmvvqlF9snf!dT zuzf`r>Ah41WTuYi57?D4)u`3kSUtrP< zECyux;=R^8ugiihRo`ss2)>Ma&9~jD)!{QNYj2EB%EL84?Q)nvfholTkWKiW_G@%L zY`;&&rAR&sm4tN9GD?lITtsEtE~D}nzk@9{NB8WB#@3=`62VV!q{{^cGT5+6u#3@g z=}w90|CH@WQLi+ljQ8zwVp}QI%L+mL2e>4C?9+hQcaCrMQT~wB;Qe55V|XfeV)GU7IewgAqZ$1?bxktK{|@nArPv z9o_~IV@RSa=JKV7A(P+W!LAGSKk86GjJrBklV#;?H8I)2P5{F&-Y(i|cU4`Z&zxFP zZ`u1c9r_0&f&opE0Z^MHqNpIFo-H`q_lR`nEK49Df5%>s2FdUi`Q_R?NeY#HrZnRx z)&G#bW9Acv2>nC{U|FsgT37OBYiz;v*D^cTKKU3Qw{tGgIsN9PyaNOu zKt1nZgi5_;Hyx^`AJ#IG#rYqZh%KKxu%IBBL*e2PM@NZ($~$rq)ftR%RLz*DfHlvb zt&H;)-7Ulx){e$Elkxl3(p>r4@^$=bF%1OA^ob+eo_v-_3x1oD-dV@xPi$!(k6hx41-S<@`V~4hXhKvBPyGnYt!?{I zJ_kvLZ4C8R?Z)JHM^l8RDi*8_41NTp$_7|hFBq4T(#XjhM}%ls`iU0j&*Lh<5~&sr zip4xfDLDl5)f%u*gUM1@xoNuy>_RmEi6!=rw*uIH$ha;RoKRx<*H4ubX=QOF-(9$K z?bum|5wS!~r0hE`NHQU*D;)=R=%kE1ey6T(+&&I|4>F>f*Ge1wEN>Re%oN5f7eH)d zdoB$OR^1x=IJ*Muy!Z^P25Ks+tH-2ZV{!$hbg*i&;64gzz($jHk$Wxq{*PXcnz-{x z)o7yf>4O3kPdyC~8Y^>RKgqtPoPiV}#mJt3<&uvh;n5aOb0+OC=mqS6IV6NMbEefr zVa%x~GCwLg;*({m_@UoB@q#+FE1h+n`S82wc4Lg}{wb$F+BjtQ?!^9^N2J)B`0`!g zzsj#4et7?0|37=Ade{A|>0k3G_VZuz~1M8FT z9MeN`D%z2@YxlOubf5nfv#PoudV4yP#8UtBCjF)f^o@<9Tajqh=zqbYdC(AwVskwB zPX}MIp1E=GjXgm5zuyc<6YXIBYg7y*_CE@;!N>pK9;0vFMYb2&(TDlB@8g|cw4NhV zMsmo;5*awse$lqb>T zLP_Gkkrha+W#?0!TQGyN6nW79Yz6VK5fURD-8l7;Ux*$i02J`Q+TgDw3Cf%_kvx>! zOn<-ka<9Mnh7bOW-tj{wl~R1PawB?N+&~Hxf|9bFypIsq{RI<_W(2=W( zpMT)VPZay<_egXOi^zTjA(J+ttT@A7pV9lCQz4_0%&>EjFRaJk4D%{*QbfU;zF#A! z==Qmhe4>fEx}>sv{Qvz`>6pmycDi)V7}D~7w2XLIW`pckJ=(`dcE)4Z_Hel#CE98> zLIHs;5!@JMSflVUh4Az9w}{MfDaeZBJn}4BKBN?)grBaaO9Nu=4k1UY!ITvIjvIf& zo}MMeP)oDwH2kcrbU+5~R58~}!et(zh#__c+IUKHb8~0td)6J))xCTK&>bIK5y%6q zSY^LSp1 zcN5-o8sKmw?x_SV5OZGW`W~vdS9fy{d$Z1!z_=aCvE>|?Jb0vl`L=4Pk$&&x4R&o! z3O&Kg*bOEptehyGKRNRAG5R9ZK5+vloXE|V34|%s8>3_Z2kmsOc%s5kU4Fmwz7MICN zLbOOYl2jS(!wtdguLX&!(YsX^_g)153OR51G-u6~0(>mzROEr_k4nJ{jm|QdAx?aJgBvOcNfF>wDFR7+s~~XKI@*NL`)p zm%!&9FMNZOgZYG<2pgLhfXxpAX6ufUU{UamuaKu?@Cr3w{fyU$E_0;*tc&Y{&PKNT z`aHk*i8O3+n5@U*0pmrCC<;n?W%LWAL+&?9)RzsVsJ3EuX*Smmk@V z79U)G`P8g}D`hgj*h!jZi2r^9hKqY5!KRSi4+ z!vixZGEz>l;?QM04bI>jwKW}Q(+&63xA)4NIVG*LDyr6lRSg@?vbD-zodTTz!z|&P zbni^RrKP6!Z60H?T{_ri48JBn`GdRF=%+{?TozNu9O?QcSW z;Np!ruopGK6|F@G5MW5GsEjRxM#`bdTEi)|;mT++mdqhWiIM&i=ueZ)vSJLN{@U;* zmMS*-1(2W6qzb%91L&r)EE|-O_a4GsjQ^l$_p6Vlh;~b9kv>QMj*qgR_zMiA6n6L(0P#N|DO6=P0KHoa0j zlmBns-TC?`_1HGWNP2GL~7}KVyd5YSlJ? zd3XVg52aDY!wY4Os~2{ha=}40rL!s&)&vY#3WuL12lhma#(={xB}DNy>0+{X)g4Y} zA*3VAo{1am7ZP72>X}t1u4W{$fDj0TdBRZTv@O~5=No{B%075h+%><^z3`2B^v>~I zWKffzDfWy+tu!nL*oTJi7N%guM>5L1CY1}9;cQf~2`Ky^G>tdOYzw@1fj&f1(?#c5 z1$FgBkd+CjO_1@j;LwJ0C?B%c{-@qODO;9$WIwRhBnvbqGWC(MBFL?LTP@znh`gXO zm|81GQV~F1et=mSV^OSRT=gsDvs>sZ+bLkJhHzRL8JCwau zq{tG}iVd1qwXWjK)sXDMb`6uP5kRwgBt{<~^fs_RZCxKV^rd*J_K%d#-sdF8Xj$2u#yC z6_0<6+9wEU@MusLEOvTtpqRElRjbv-v(!bBwyv%`K!v>hw5Pi1R@Ay5SmYIK?kf)|Ob2M}>ELcq%Bn)Ipt4I&ZWj%G6u!x2T zio!P7~3q1u2vj zxIj!Pj2=@n?J~q)Y6yK<)*|J1_%bkgYh)6-8?jhb=<~IQ#Ik4(4$Ew=Ze1<=lW(G= zv9YnZc+Z&|nOuF;2w9 zH<;Wj1HWnHVofA=0*x9@S=_svx)2uSY_L@xus9>s$O5PO98JwJ>9yXDEfB&Tt&%vE z{_xU@+MiaQWn9;ped4O|(YPE;%?#Wrm`j-}nJ9#Rl_u16Jcvq4R1a3vA^!8d;!|Y* z20vfgYBiVpj5eC>jzgay@NNh9r!4R)G^-8Mct%_Pd`G17N4tBU?+aa1=#kFkW=gar z-7&u#{G-64pm;a_iQWGycahq)fTN$Vh&Z+;#KsPsW?sURSK)2&>S8-e7j-(_=!>Ht zNe6A`lng+^`n>e2k6OShhxk!TkmEgzQ1vJILn)wbwj`T_W@j<166J?!e5FOm&R$Ar z7-xl^^HB~{9mTT!MeGfW6&|w|^f2L+zTB3v_3Ufnm3Euq7qIbg4rKkpM2_O~O5vpi|&uL(Nxi#^{Yb_^OU>v=YUW4IBX3!s~*`ss)kw+B7M8l5snrZ?|+bL16AKb-mky%~?!dJ_cKb&7o?eEq&>yB7mwrHG`MJ+9n%tFFU z*%~&#KdtVmk072s@5M?|%TnVm)^pviyavhi?Ke7^CDqiF+IVeUQkL&@gni4d;$En! ziS=+p`n6d&PqkjvDkzmR(*xY#&4RWm3tAsMs_hy#69oy*->m+D6Gb>c8Hr7I)B%DD zS=4TeYCGZz9A)^uq~wTDRd9%9BI{h!ivLSXu<1j-nO6Q56RoK3>EskY5O}sd;(a{7 zput1tHk3KD?^O{1%k-|zt}WBZ{1AclxyIoBw-v>L#70<>O__dj+|s(GiIT`zpTzyw z|A_^7cSmJ&h>W+lH(lGk7lu(ZtOi?=gw#|?XECSU48$%y+p=)V^4x64;l*Z2*LA+z z6lJ9b6f>55XY1E++G1{EDe#`_4||Q>7)H40Y6kN{?p09yCSK$q!&;*_ct&;oI3*sQ zkCZ9_VG>)c%!=RA`8jPFWt-=JIyz{=gs!eLT{c52;>QoL;Yl9(-hM3m@t&(zK> zho-0NY*XfV(nZYRM~Mil^@6N&?aQ6?^SGkA{jZ7suV}9p9ZL0X2fYr7vaa8qw^zmK zO#H~GAx7)2H^mwcm(v!F{1K%47r&krQDYcVNRdHl6yYQ?+T!Q0(Xy3NmB{uLMxir# zTRSZfs;`Y0e10*pm5ZzVGdrL5qr!la6~bM>Mw~=h0TPfoBlNVT*v{NyAR{iH4Du~C zbE0)K^Ai)BT^|ZMvA*}>`ThAzS_yM)4D7)Efv=OBXE*N65c8#kBN12dnl0>w>));N z&J(1tP?Ud-I?Rvr=&SZkmC?Xb;M+PIIhDNq5v$^D=D{}rN!inP%CRVQ+uV0cC2=k8 zS5r-U*RngT&wmv6aQivH{|v~dg9vtqVwQ^(JbbjEF9tu3KZV+Pok$ZeHyLk+X7yuKo>FbrW12^4*um^$kb}uSzggx~_14WWaSqCqCqGKtt#j zneGt?v^dMuhl@Exl?<_{PnXVw6z*5ji!ylFYXM$j2>00|8VNJ~t(u+VD*;{=Atz+A=uuA%7yJ_?Tt-#&8_XL|!eeb}Cj^->cM?Zdgc z(HI%=+Uk1+cvYs|%=q~or_a1iwQhaIOYE`Co^ss=i=`UxVz|NPZJ1)aYuI=sb*`U#Xh*I(dx^n-z)=F1%!}%T5=hhj!nT0`lvA1 zRFyb|5kKyA#2|Z*d&HU=Eww-r!ceodB&Zu+&YBOkN^I4dUiZO@`v@(AJu!z-Hp7+x zT|O5|l<6r;53+wKVU&IrX-8?jFP^DqZ7iUPtPMRi8?l?q(_1*-=AHr`#@=Op{y2GR z*_E%6#OmYX6DZ}u`C&pJef|u&{3QsiE-gb<$8q?1t+m@6O|%V;-nJlS%Fv#j*J#1P z1-{TG2mepXb*7vB++`EbDDGyI6z!9}3{4-YWay05AZWWjfv$HCKG@Pr!hxW|=f%UbBo z!6)?nFWeupZdRBOo_hsorV*5DAJo)>BC;x13Pvj2EtMVaL^cNz(AccH7D)}g-R8S2 zy%X4t#4Y=(K1(BFOwbgsQ47K=LfO&(2bYSRpHx)FVR7pxd~}b+DpukCnO54Eqg6;v zYQC?krV zHsKt$NT2!tMcZ3PMfHAt!y}3)Dbgb0P|_jY>W~uBAf1YImxL%VbazP&-QC>+!q78x zcZ2kE(C__yp67SJ_j=d+$9pZ-Vi?XjSDx$I`?EiL?-WgylhTZ?jSXNG+?5teJK9i` zd4Au&e_nZ>?h0}DZ4FY~t_e=mI&YJNvQBm#JSdUEGA-cpe_&7GR2{bW=2Mw&pBky6 zMUUlU#U7ui%%?SsKR3}d2u8wehY3BK(KRff$_WfSzfi`;b7LT2hn0Z&2bjIYhWE+4 zQVyJ1hEA?-h!MnWYNVk%F3tG#DIZggl7`|Ae)6TR0q)^lP|jI`1Xr`r9fg;9c9D_r z+@C!J#)EF@AF@rhlJGSc&KPvU{oE>a5?>~bx`)IwyrZc+jT^JV!|k`Be`PD?((w*g zBLO#v1UFLhNr3H`EgBX09gnxWcn2Vz`qXaPqZv{u^UpS8{_V4u&8uB{5ExNqn7$++ z=B@WEyX`_OyL@zfaHH)f*w4>do_dVD{IDTiL^s&ierk;=)?a2RQCMJTEvb;LpH0r^ zgeAM&JJ>qcwp9?19W^wgi$-Ug2dP2R@kh~R2e%G? zs|E!HVrGJ%>ZO`b{3Y>)eo9ViQHoa)$f?vYep*$6ndK&GtLsARGEsK*#19AOz=_1%7@ z7KpL}842K|6@?gS#F!>{QD(t-UF7QK_6i8J2LhFb8}Yvc#g&bmaY;m?_Vm2;GP4Pc1gq8IFFNWrI|5$v zYARMz--CK+{h|bkhOa0$ZyzIC7){cyU+CW~6^j-`1@BQs!l?9?oC;`9a`#OGn zf=8Z2s5&I57lq0I1s4|&xH5FaL7oIYLz~lay znG?~^F+^t`2u)n&Nn7TT^7tmL|M|@=#h)pptsg!!qwRPJn#z5MStu06`wqyBP%H1q z0XFc6t`v*3K%R?+aL7)`YfC>uu@hL{D4Q*`vkkFlR!CT={N|o3a)yid-Jp1r$X_yL zV`c3^k=Y#*v{E-p!a{q5%lMD0Zd`)8g~g6G(Kx59${2gl!?M1bMo-Lk;*|uFFq?Kd zl*y`@iHV8f;qZ+gK%;Vi6tg@$YEK@>0Eu-D^fh9b`m2Ta9yODs2UX)!t(d`EyYu4q#HCng^V= zjT2}M0SQF`zqG~55& ziwL$OX`(N_26s7XtSuf zxByCGd*_Yz`*Jxh7 z=+~Zcl>4f{Qn3LndPeof5HE!A%m|;-47Qj7gqqjZmT#}xTn>e5QM{~J#8Mq1qilC* ztNazWTJaia5v&^%xWrD`q{}S>#uT6MTH4YBo5tW^`8|DTf+foI2Tx8INmAVM@p2sj zC+43OrWX~4;$_~=*Zhr?RmQPzlwxOzMJ1X*<0<5$rOpMt06}n9@6Lb|)TkrFJ^cH+ zT{%Rz`Ni6boAKAg1IbL0-S@UoULF~Go;fPqi3?YypF1Z4Vnv;u0xb*TS57X-X< zLF|K8)qVq&k~O+N`_FoUpirrR{=&@ky58i7mtpI`p#iUbV2Ma#FA}?O7>?XiLls9t zPatSkYdFVysNuNP5A&-}oJSmMo*Vu?1nHrSP|f&O_atwy-3`&DoYaNW+!`Dpdns}ZwkP|rDxQgFFFUCvEK}Z6 zmUZ1218<6gdiBLhLQC?@5D(a9#w~KK(aGj-t=|8&{&lgv{PP6l$x3ZlUhXzr<)`Wg zAhswRdlsm{5r-I-AEfPZ1QznpK=I=aH49_9d;9`hM>HE9UGKxuKB{#^FX z^>XTEvuB;dwPDt0>$O8JU19aHlisz943W#ZRv?=c>QNa5teRoK=(7i8Xiq9LWR4*I&h(lafn@jX%?VYs5Ube>v9=$nA`^`^ zPVT`19*5t^g3)e9jNj|5q^q!sl$S{Qb8gF zNd;E`$)J?NCU|&;W?X;Ed-9(mhy*2c=Ee$ehgU*%wacqL&j&@WHYPnSTuWSz611~9 z!6WSh+4;|eFV=Ukxbny?El-Q*JZm;^E>nl+<{HkT#9PnCn{Up)VNqOf$a`M27pIPR zo?R5--Op+&nBGUU%Tib{Tp!1>HWEz&f2Cee_HrgbnhvMgDMxHys@E93Ccz~b zx47zziMDIVlmPoqFp{Qqs1P_%h)iy3mtFKS@X*gD5aj1kbz@`q-$UjB=N_mf`B}C< z2+1)d5lo((2uY`Owu`cjrF@E8Ex=;7><}|I3o-X{`^p}pgWIxT%~sHb_9HBPUF|I2 zK~@c59+;6j7R}W(}iMhORc+t)NuuCqwZ=JwF9CEgoP} z6c^)#dl=lVYNvAQQhJK1h)(229p?`nhoxg*@$QT4h&u%DXo0d;&x41y5uTrhhUTQ+ z>zt&IZ9RNA-*34$Umcyeo>%%-dL_co6p>cttgzOqw-FHwe}%Sa;di=i^%+A!$Mi=J zTh4yo8`pHkH)%M!=OPr?WD)sP?SsUnHE-^w*~v^x5ro`D-x4bO;`w!15BY20^wTEk zYJoim*wXsV8E{(Tiw)MoOtI0bmhbP!Iv=kp>E|(%@jk(R=pbL1T2b^v_^dN|&ni>B z#B}dMjnqTK$=OUwDn#)BX*H*tBCJ`DBv5@Pw1CG`oUs+DwiWuI>h@G!J69UmZ9@wm z&+)U3y)w|waL%O~sTT;&Q^5+HP;5B*{nY|-wypWT+;Wf^o&IZ9=u6EIkKs`gbSBwi zvR^Y5ONEBUtj)Ei`r&UbHpqr7LbS9yRMunOrGByN900kmr!?Lr@l2kP5<%K={MTlkRg(*Yv9ftg;twpEDH zrmkc5v|EH{Q{0vKQf{VWp1|-IcHqY)Z%BHMfnCw{Vm?;L)$OGXLnlC@3@(qw18(-* zm2=3nbVE4x7yyQeF2!8@?n~6Nq-W|)lXFdGOQe2@@~Gch@%)@DJu+r)*UP+~nRzUA z#_CvYj`S!2q8tOcC$@s=OkW;`z?}1~a?nf1&1*H!BFuVgL!M>pZCu3b6l&W) zfPfKleVa(ZuQuh(25aX@gA zV)eFMHL1sF`1(sO?;!)2`eCLpMS2w#E4yzXuUyIG>ox>p<0QGb*rhlXYRj<7I(Kt= zfu@q)sma6Dd~tz8)Fd6Hbg+(rNKGt!8qG4-)M$3JHRN&YkQ^0pE^jf{)DY!eokLa9 zun-Rm2EKQamh1i2uiD6VcI-yihF_!diE5l{yupFB*b-5-=0jmcXB#cta9Bz374giS zLcOBLZC!Lj@1a*8p-}U3AX#Fn5JNpW<5r5g0*T->VVVSr1CCpD(}{HZtNJQt?GLvf zjGPRw%Wo$rYfD^v&5D^>(&g$*ZMF&T6c4A+vGMU)2Yp$%@(DMc-l5URwp@by!wEh+ zfy_g}sR3xs$$%cZXeeE?Odk%R(Iae0T8F^0ryMz>w7KACV)COcWrcGQ~zo(Nv^hy z9xvSZLt2hwp5N-l%EAC?JN0X$xA%HErsyr7;u;>#qnUbYZOKgWvuAgh%Q1xOhf!k2 z82qGp@7=@cuesX$ZZ&$7z!Fb3la^dYD;>~3J|&oN#N$7BaUBL_V*#`rA)%2Ol2{Dw z_>j9d9hP|@c~3oeRQE#NIBioO0!gPPbn6IgjOi+tzSr|~O3HGiWz$RTWXB&WDG&2b zV9RJ(A@Hvu!_2}2D^P1vFm<~0$*H}TiC81V)JjDljWDl0Yp5cqr6M{2T@zkbaLl|e zgBJZq+f)G6h0qVPaXB@3uQjZ@i48MIOzs=5B=`ftpH~H1@5?+gmf!n5 z0FTGMQ=VZ(HXpF}Z@yIK%kQmo!S7$%J@4DrlA;B7T``yi(jsb(?!^kiy8&H4M%ci6 z{w(J#H>fCRg-+tX!2*Xp<%hp{+sqBhMXtb#xVTeQw7od^^ng*{ z5@#x=Wh6F11F9c&H;O>HPkVi6g5>blXEw40r$}!$CaoAAi2&k>kT+!<%w_8cn15L~ z+X(=a?N&;qqUe=9wI0s0E;~0k+~Q4KRcVa8;kpNE;XQB`1hSF>V%`(nljGwWtw|ud zFle`s-nu)60$@tyZ0JQA>SXLnU6yTBfSK~$E z|3M*;G%70j`S}9;{B`y9cc24rSeB87W3ATM*jUe7pvp$yJFcb?mx{{AfrRJ{0P_KX zEQ9TY`xy0R1!dg5DS`OER#5=1jUK6XZl4pSQHu1#5p<$?TqrchiaG~T4C~zYb z>f02}yJr3#_6^009-uGU@2wWSKm}>M#_v?P$rUxxhTnEK(*n4}695c|pnl{{`3Puc zOUM8ATGF@&DBORFSHZu;SW(q~$)J>sL5_T)vhXhI|00dnWQ!-FyjO9MS@dH1e)SiP zZE?4V(Esq5|2OCc6@XLzma_ltNcBIoE{uZ=xKxzZG+`XTjwGoufq`cFXP|-n z3we1a`~cDsw|IvUd2It^LSXiW))?vO74T``3!*V24nl;1l~q-$YHCz>XwKOvME0I_ z5uTDdtR1)ma4pSfUppcoB6{EuYVpOHT?+Kh=fBjB?Qm+o=Bb8zGXxRJn;ar%a1 zh^R76001W#KsZtW;=1KAT-=7ezT3;zkIttNh*xA7NOm}@z?0$j)vwWF zIlg_d^x(C1t(JP2L4+c{*pu%I8eVtEs?z&98gpV_rv8lcB$8?q&LjSpPsgZG^UgMX zW3otFg{cgl;(c$^a;W>}>iQSAZp@>K**xR@C_p^5nroT7#!q3*zBoP=wmax_!F;Wi zN>U1ausWo`sD<+Cgw@SFw48bcPn;Q1KrOOtT@VFoFr3r)e0MJ{bS^fyy)Y(FmF=@m^jy`? zSB<_q_M`aq%2^~5~ZWcWb-c(1d?$wVA>T;2xN6f``ngtO$i(kN;)}-=CBuD0!}9@OEL!y)c8sOAY{9|W zmtgqa5dv%kiIk5rlBNYi&P{0XT?w*_&?42q+?-S_k}E8)ji~bv?R|7Z5be5Q?Jpkr zMlVK5P6fPGmU-1lA6|i~0v?c&Jah-H%gmAX`3Cm4*HB$2Bna!oH*)y(osJeNZA_dtR;jr*^$E!=PXeRJNwK8DbkAp;Ob@J}X~?V`U<1 zj8huyjg47h)^6&LY2R6nWW>lmbg`v*H$erH;f?4+;trU23NPv8cHBj^-O~`&;19 zgxno~J>LvZYkT7)$D>hXUWVl`nno~3^?K7NsEtsvMD@#X_sH2sJ|x8E#C-a|ac4`v z4YQe{TQM6f{`%{pQ3tbJfYyd06ybh79WN}Tt1=^bcN77oMVaR&BSWJ}t+%{DI1wtT zKoe`6B0oup%QIm0rq?PW3HrFhAyN~-5fPn=Hm_*>S-Oze(zHz4FB0`fNNtr$mVa|JrCp6 zskFm(`^yb*1EG>pA6?IDo0Q*C;2PGlIQRzQhU*$z3>%R;3C|m(gZU(@$R^!*}JIJN(Z@Ra`x zpvH+nuEO)1`~fv`#+$slHExR!!kPnGGHP%+i|d7i{qc6IQMouED zvz+jiHNL|mU@9%eT)owtVNoXo8Fi@9UopgZh~tn|Y<=B2 zKWL0G{yYR1S6jH@^K3)(o-Qpo!2Q%<=Ft6h-PP0}5nQcEb86q_JyrVr;7Vwrsk6;g zgG*?kRe%GRh4#s0gUb;i)7)>JddDFh*M=ke63x_6oIB99DAL~__{FyINjtUq)|B_7 zN6TCMFILxEsjQRd!%frPlm6~zDemqQW#?P%#a5On^+)?RAF{TV)YO`qwo1=6%}!uj zID^`Pb4NGfc+-X$$8ZU6h$}p{bj6`>Ltf5pbDZ%~*Y)H&;>7B9;Xt&&Wg@V+XnOnB z*^GW;VHK{@eDmq8|H$pZyL@3R^NXG0E!!sK?q zJXmP_T?sU|W!X;w_+?FXohn#wtux(5(RAT5AI~!`lJhiLu*vQg!8%G9=Ezszb|ua9 zoT@Y9<-%&Hh$TPnDHCGK-r1~Bnu=Wce*bE|E_d>Hg&y4Wb}95ip5pQ6>5cY*zN=3A z|4|aBJlcO>i zF|3|pa-6906z55wW1~CjE(kpRJ%2ckQS2-67T|_29^^wZedNy~=k`dxH1&D9|1>-( z%THBT*Z}vred>(x;`pa^(0|n-g8VnF+Rv)baAtFqKomxRLV^H%`H{7D@z|g9?%pSl zx4j5IQu2n=q3o^eXb~jIWRs`Tzkq_3&{e+Ze!uz;$0|RAR#@Yf?zQu2F^*L-sj$s; z>j$p!;#@wDP-%RDgIQA9YyJ)V{|*oYe+lb(b#^e->NNZKA$g&qkR4HM)$Ohm z(Wgx}S_qSj?s1&^_cS;Z9#0N)n#qQOHHG+M%rzr!huIL&V{TmOr#7$jM22-Jdi`ie;~2#FX6Sxz6gS zuRq8-R1XZ2c^>zOO=`v*$UN@8YCdTlqw>&}2AqQKq_tk2EOsUv={A(KLtb+}pCnxW zCPW9mY<-$c=JBQ_9s)-JJp>-mk|QM-|I%jRO{&WZvAjcSGci1?A$>7j&@VnfrzYyT zWGCq`pf<3a&};40JKvNgt0^YzmG}*^x$+PCEXA~|EuTH|pFP@{pyU2~8OLw#94-{}VJ&pW@iaHhWF#&Z{n$n$Y^HV`RX70>lsAXCJS>+G4>z6qZW6g#_ z=Vryf225msuaAtacXPq+taE#c)Zk|f^D}n4t0Zvypq|yCD`UqZ0l^#@9+b@+-oJ$p z<;5cjA4a%`uLMwW@l8hKU48lhYMCUlKnDq+v}h+fpHr>AWH>rOb&~~yJJlBV_At*< zZn;-`PMoQQV088fmwYoIl237*rK8T~PAxtiZT&S(*6)aiaXAlOv&rHC4}ttJO<-EO zH255D+kgLRBA~y_$Be!54;9bMN*}+0LQQB4bk~Qq`8tP$jc3s zco!HSnRR%0`2MB+!D6RB56j~+D9kiDIXUh99a#V{lY?6D{Z>HtK$LE|c^|a3XNHG| zXJ#yj#qTWNH2r1$D|tmlU2$B%PBrmI8!Uk3G5G2L^1NtF%l|(r>kBhQP|}tloE?~| zyJ8e#zn4ERw6I*=<=|&r*~J=QsN$FFNm9ia@VwT%BYP*L|Cvkj$|3O>T4XTHG#>k& zxX-`3A;7ryD%$!>d%*>@Uw3uK zPWgR69KCSuiKwD6eJ)%NG{G`3{iQc0<`9YzKNu9(C+^~8CzvoC#I6CD1&MJD^PE@g zhDU<+QgPV1O8C;G)+B78PiK@e10^K z7~bj;n)vq#RBYgcvV973JM7;PEia&yg-DDJ zAW7d9B{^D&dvUZj{emtVePuc_3*3P2h2zjlA~oUAjoRf)dm0GV;IH-*LQqWbD^}VA&uHkD^_Gr-?7u=u_Ke3Qk-Y`Zzu%x-em|#ELtnZ zMOa@Gf&>6Wnr5j(O(H6=W$Iozrkt;d{W{YeGj<~;0xTy(2qd7va}AZ{{)dC~yC*u~ z|KujcU;Xg`0J@L7PojN7k^Ff_hDOcEb#aA{~b?MjQ>~RdX}ab zpMUSI84k_hQ>h5`-N^jompMfa-%0DBc$n!22?@Yy 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 KS^UiS&Hn?|NbzI< literal 0 HcmV?d00001 diff --git a/docs/en-US/images/async-calls.png b/docs/en-US/images/async-calls.png new file mode 100644 index 0000000000000000000000000000000000000000..e24eee79beb11777807011cef088b5696912b67f GIT binary patch literal 126157 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ņY8ZeZLtK$^(G;d6>~Hcah(Y}3 zrSWA?=3B-Rs*P!Oa}x!eapYM>WYcSS?n$L572oNRf^k=-hedG;f!B_>4DR0uk0;p6 z`E%vZqL?c)G%TZiJPMU1Cx%X37S{&TygFA_N7C_1nbnUk5yA%QNxR|cET&Kd9A->n zgyc2JiIeNYu;LZl9r0d&IaRtNT%Bh`e=>0A5r5Umo*b7>5+00Z+3bF;d5nj*>8nu8 zg?CgbvYxBiq8{#DQnHMjH!JaeQ#+yTQZw_)1zyVN5nh%KPlb|1H!TTpyf#T=+?g8_vT}{Fm{zXb*}i&|!M{bLTvZ2tJ4> zX-yiXzx_GowCSUCX<&NYaBX6$O`qeeffO!iSsp2P1y*RyH(XkOYNsZA|glrQ<6CnGtB zRJlG&PWX&)pb#xbCohbcDEAtB%^Lf`WI;$3#1Zg&wcY7wWkN#w zL&qkU(`Aj^!s~+L0o2teOaVL%i|gd+-iPDM!S6fr5NJ_hrXdXg$c$elFfiA~uwj@OV*xW9oPa&B+j>9uc5V(IQ3_*tTvE*;Tk#l@1U@M2) zKHGTo3uW9fry_C^lsa#85o9SHCNYZ>mrHB10 z7`Zj7KCMD_HEc}BnypxCvz3Zs`v4UH0UtupeT|p@d4}WIaKXU=*4SJk-+T`S9PxmJN%NjQ^+&h_pNgO2MC2=IcL-LmR z+#JsRv7X|ATA^;O<9aiFO&A`KKfEmxj$u_74c;AU&g#g#-{2N@AQrZCPsk0`L;|pa zS3Wtvr2LZeiuurY4@FCTO@zm1)*nA7xEks#V=iBH{6l$c!keU{X@Ze8-ea5th31=C z`wHGo4OZLpafQR&e+y z4&3*-e+ZvFc5SRuVww_klu2R&V3vL}4oevMkQwiCKfGt)qoJy+%RgdVU3SN61RYkf8=8l)k{xSVRn z?n~|7SPEsBQR?z?TMVwBvS5l4zD&Hi-`U1d+7w9~e`bIadj-GTgat*pz@3x1y(vN$ zf-b5PDOlg5FLqo!;GOY2N_O(H0PzQkoYFS(#720s{O{ZTspMd}&;IcK$k<6g{l8XB zV}*gsw2jSz*b9tl`2GE#D$ZLJS5IPwK~>SJER(!8_CDV&gK+wO)Vq_h1NhRQ&@{53 zo$tuNMOu*)6^9Xusz2HtoaP57>2--<1vq;YaY;ZiFf66Et8nmxkSn;U;!n_-x}WOz zTrp;n#`&E2(vQc%PH3|k9!?Pk*xetn;ZZZ^wCX%~a$icAMU{4t&$h}|i(r6h#qJR* z!^**4qi5^&XGE27z=400#U{aBvOFzxa% zoM4L0m?7k0@?yc!)-Ns$vJGFa4u=VRDqrE_!jjM!vD$=emn`7WmXtU&ESt1Ta)*6n z0cS)6ixQO%F~D!vjd?iLKG0|Whk={uM@=K2U1Bj5`*({(cv-u1H)d|B`qQIVvR0?% z;lP;Ap}qNN&5_B65J4g1ug~EhqId9T!;nNs2E~*6(>p5X$mu+W&S21PH#>JDW?=T0 z$PU~X1*m*g7_P=YDWwrU0{8r-<*#zsdSw9)4fANGf*&QFaOc}E-=KS7nkeymrNc<~ zayKjI+iqpJUSxh`6qbX|BNqq8(rz&a+{eorzXQJ&0qS_l4$jN= zt5KcLxMLU>w^>Esu zJFJSrvsXgTNNZI|NIjI3xb#CCB&(>}z||RZZAeY3BS->FrqV_g<`z_Se8D$_C98mT zt$g)WM`#=N!Pu3LuE317N3O)!DF+n=1Uf~z!yJ()_oYglqT8>Ic};fh7kbGgciXp1 z-twg#YIXwtND^7IT|7?&nvWKF{)-ov{z+Yj;XQ(hcrZ!?Z=em8VW&QAeJto;5XL{l zc)DRBA4ZDPul~A8pl8Ngcy8XN!2?COTAT5-ll$=K{<8DgcizYl=lxup#jTyKc4Io{ zqffay_g2(Lx}*`&2&c))nNHc^UXg)=6g$I-yYb;o|9_JH-N#1e{JpMspUxLJm}lC!W|F3qb?|xF zQ*C|JTqGbj#|d5cx<(KS-Ag*;wtXwJvG^YS`}^TXMBeku=qE^^Djg%B$w)0lf(||TmeCLl z2mkGGx|?Y}I!E9W%gJoLGi+{3%5Xuli9INA2(ZW(Pv+$ z+3Ac76?@0o!qxWI-v+=9OoW}S5%?(9a-08u{RZQid_E1?RJ{XoE}9@fWMEN^v&QPz za>C8=B1h4a0Wr+OC0)+X$qwC*HAaYbx5;I4$|2}o8P5IGXh~(9O(rrmT4NZlJCP9O z5{}Y2+c%RikzBA%{!z_lfj?0F)A>d$Pdz`(c2+$3-*nQ2Mt4BEzC!}yPwevJyfIu2 zal&2YtFx+4TUd6Z5b8NHJ-Avvl*iS_v_&$J?Qs}`(-U|A$E<$_WxD<6*0v-t>_-r7 zTE_(fIV?-6pxXgyFLWR; zkX;R&G20Y-(NQ1i2GvB^X^)8&A5rkU%`VMAGz?HW^AsCxyCZ8dgMPdSK$NgaBgYVe zFUS-VMzUmo!sWtkg4Qc*tCU5YZrNxNX%VGpA0Dmnn-8bVxspYqn2)`D@QXhH|7#c- zHb{IJo$8?x$m)1NgigHKV3yF1bn$Ch%s9p?${>c^5S&SAGmM>q*oy<^F&9(<8>5v1 zId~Jhc;mgZ3;TUf@7Mp=da{GjQ*#@QT|W8M7PnS5zg)IjYg8U(TDlTet59;~ZS5Dg zaP{6-LoJ^n0Z0RlufM5y9%-}usHj(s!`DR_dlEXb^t3^|~$#zwrVGA6}K)qTARB#7q| zSLJwkD%jdcd?yX1j-pszx$0OYg_ocjDkiuO?)UN&&hliJ`mJ^;fG9%fnE(?kb}yy0 zH(O(}!W3;i=eM-#cf75Kn?d8e+vUd)JFj}_U3uVp}NO5^uRufHJ zUa2EY+UzLp3L*oZ6bUPz$jM1m)+4 zZo;&#WIH|YhOvjqXjIU1A{3JDR{mFa1t8#NANOchbAo}f+{n4LVMKhmZvw%#ZK#$``M*4iG~L<#6FA92rI~ z%Nl=Y{1BA_E0rXE_g&rSevvbw*!6A`Xsqh{RB5KAUaoFP5W&WkR<53rJ6Dp|1B-Zj zk~dXS`KxfPDeaq};G^sTqZG=%FJG`&anuMSAXdeI956Fq@1r|$k_FdF7Me%-mYsz= zn`%*~&ckmEp0gKoJ7ZhHj?hDl!Q@=d`+r^p5wG^CWoj5kFqrSqcKk?Tf*>-X-A^XVT&CN!I#@DEhdmspeeAxD@tlp z{s};lbDE#uPdK9n;s>#i$5Uz`==a4(Qpvb@k|}`C&s`#-!E9+|qA#o5Y|h>SE1Yx% zKYoxi%nLJ6l66h!6f6ERGxcjW?#*9W^z`yfOir@c!FBh<4|wt^~DvE+!3iWgLzw%yS~@tqC=w>|X3pJMtG=5m$OAu9SS<+mxAn z(b&xz{vbG6P*ilaI7X~rd|#_0{+~nZt1W&I0I)K^yw!zI%6^atv!YH~sq#h1La0jh zLeWuGF_QE|G=H+L-`6~^kJQL zwh5(#zEzduD@nOAeg{S>}<}U#xFR zbQHkht2x0$qD{){@pJU+)ywUN zR#@z6aKpt)v{E9Wg?|o*^g0MYKVp7jE_st!Vka*?mR7Pywly*4(cxCNGx3Boa<++< z`p}1houw0_3 zNEfY6$L3*w`^dIk=#p|Qo;53JAgagm8ZQnC^juOM`S>ceEEGYs zIN|zPI_Bm(xXJjKz?Kbj2IL*dNu%>x^>p1A?)D0mrQLq29q!56D06Ga;=fi{4JUkc zXYE6Qk1m2)saExi?%5%W1&S~GJWDWLH4MnzApJPZpVSEwiIl$;5FYc)GQASfu<^C^&W zjvSEd=dH*3rvDwS0w=@Sew((J$m0Ud7aIUV4H+;wviVL#uUd8EJgD>trj`|Cr2hJB z;!8y3y$ybLMjrMkAbjKIC!1X(_ylgodwMnrPnLh0N*xUToU%mqedpxzhWfv8`;8P0 zOZJ}GP1qizKA!vEH|;38&MHc(a#e`*B34cSl)`{y4Y~aXAA5fSCm$P(X2pR*$+lTOt!zrLAQ{Q2?zMDGxi zQpd}mTz=>Iq!@DQwLO!AK|v1UUlk1v0kOzZG7i^>>Kj^^p^9mILRAu`h1>3JxL$t{ z=Ixv#&W|-8tLpZ>Txw5?eCeto)H#18)tASokHRGn=;5=IN>@-a@d8!dmdu`y(*OV- zipSnQCBa``Vqq1z(zbPR`4@+^_Ye0!N6e=zh=kT}rC_+bJI`h>ujb-JS($-GCuFr|+0H;fUd@G*ile26M{{wH>6^?yQc%W{1NA&MY;1PO^Ca*8y%FP^X?RpZ>Fhxih99oI*l?nl5#~yRrePb9_u? zYwvhte?t;nQN%(dr=FoVIQkJnHR{Z8X#8+49JFB7zE=^{EBIYPx?K6~P*a;Sj41}^ zFG^+-0Ms~zo0w2Q!~|}ID&xE5(n zL+6zp^P2PSe^g%QmJN)CMw;NQ8a6s$$02rhTJ1E#c27DAA=W`XS7KS&hfhqciUhk}n=R&-w%YJ@NJ)#fX_8y&98nO#oB*#5+ z$@~+b=xzs#E7cx-jz>G6@l3X~LygDKq=FzLHBtFJ6$N{As@i~|rqIXxmIdP}E5f#F zDgUd}mFq?mi|=-z|AhHhp&&@PKVY!jTPHPiCL;g>ZW z;t{8V^ixvYO=oIW_>t6f;B914GrYs&T};~T|KkF%iFh@RA5+Ox__XMd{Mb{g*OP$* ztY^zypElnrue6Ob-UG=kZgXg_n5WVE2V*e6-9s=eld!g0yWrzla{Ut1wkCE5qi2+F zp42Z~yyHi2N9DBzmGokf(Z#c&Mx1WlUNA8YR&)l}0xjAB6) zRHTV?r3g}0dKaZ5V1UpGAXR$r5EP{s=~9DqLWzL%4$>h=2}tj~gdR%DjrzRr@A=mK z*1Gqu@6I2|Idf+A%$&Vv&u%m4GKauviXe z-*|faIqjfj@!;FaX*=eA=3rAwff*y7G3Czle&Kt8`gu;PX-fEVqBAEvN`WSNE21~| zQGy2CE*Z~iY#{Sempi#o2n9L0jWqLp*8Is=7oEPMvtQV%x5Zngzf5dRK8Z(173jb~ z)l*g%N2=*b-wo%g-`12byK0J^>%x#m4N?pQ@7ndxlkJUbhRv+!)yNppyM)Qv!xWVu zTj-4!w_j>3KZ2>!IR?%IakZSkGv2mjx%%AG|I$@0q5$MCmR|EEagSTXj(TOu)wWsX zHa*V8u^!tJ#1YOQ?tXA^D&ca5T2=_S7WkntT?%s%q9Dl2!vzEUB7;Y*Q_1HHTUKtl zi6yxPU}U2be508c$IDr52Pllt88OT%OW~+y_zo66;`vGi1#Vox#9V91n1#RV4cD9> zFanO?X7eyX1Igq5jmMk>Bf^{awQJGwe2ow$d^Bp!bFoj*P6KIfn*zcg-)@H4XBwdq zEs_uYN70^AMiZ5@DvM8~2QHXPx2Ktg?4TtaI+spwuI%G>WkQD4Vg z@|#~NeBz@8sNT4JpVMt0As$07{2u4PFZ-G5cvEVT7{to#_f%;8hd)*eB zNpj}CUNOPNQzc2CQy~LdUIv#rl6&`Qa}kH(+~xG@vh=Xo8l3gCG682%PH;X_)af=G z0YP9ILw^Mo&~n}EJXEo`bD%{j9J=LByG}jf%T3^fF{-Xr1ez<6YlyRRgpZ(&2(*sQ zciEzSXmQ`y$bIvIP{-D9r==f(FP-Zye>|K0;P+uEWPWnOX(`!m!k75wc}x0RpJ=8@ z!5(3edKGHp%+OF0`h)K7d{5}i83K$wJe_g38h~GU8tIx$9USTvvvAKbXINaQ$@5!N z?aZSUdvQ+G7m;d(LYU(Vua5<;YDK#6k~5P;?_bD#)cz0GAACCcpxBwb>4irfeagH^ ziH7tN=DO=;?-GFsUUf_S`cI<=7_f|gSU<;FaR3YbT_-D12ydIbtCd-C5uAaX+B!G8cp2ej&YAD`Y%J@5&JMQcKGP}&ri);maLltL-x#>_P zIUd{39~0+`yUBM4>$&t&PfrdAOiUY&3WY+UeSMs%Vx!(HH6Wy=PzwFs5Rjua8oW{6 z7%}5_^425Ih>aRZfB=AY_LX7Y0$E+`?FOQ6?2?v4X&b{7sW|)PhGdb!q-5r^6kW5p z`EnH1uF+WwwXxsuZU#GF%YcXFY=|TGjCcLZF&nLC@&NkP&bvcykQ=+9)F|X*r1JsR zi#Lnwab>4nb!}Z8S?r|Uvy`;C7YU&jlXH^wJJN3L=jpeYmjvtYOrH*9iWc25D$dPE zZF*enaIUA~(N*w{_%5{y z_p1sH@qz$lMB8~WyleJ+r-2WLge-Rm%H}@vIZTSkzrjRg!z@3PLWAFohO9Pnnter- zKWgKNobfq4E6c@Lr?>ZV3>899aTzxv` z$aMrc<<}_+i~D#yv4de$=Twn8S>iB38=%T3U>$mZz#dWee4?1*fxT0UxFzYB1+tG? zB+2~isgYLw>L5(b&3~s~P@3=Z0_7~mEWf>4T+|1%-UkhL4f<^M7G~fAEP5x$C0Q%4 zEqFU1D%gkuW~afeS=ehg7|z_0Pz#l_$EO?~0o4@bD~>;Hsq)s4>C08VD5lavYp+Ws zk~|Nkhrq|&!FYlu2#j9Wxb*^Hu1Be%Ne+~wVk&|)>YOe6g8ty4ub+s7&ioMupd( z_qCETq>Xt$L*tagxs|JiZvB+M^E&%lzYbE`7zFfw*78H!HJx-r8bf+*(6;$k`g$w( z*J$k=QNN9ec9L_<1!<_NVzjE_-URr?;wSV#ynj#fKPb!Qs;7?`SMJ9137H#nb2aGNX@-TC6eRJ@`#oLv0|55E z4swy|`iT=>1fTQQiF-hvJn0j49o|b9=FEQe*`~`SzKcolpHIVs#^HGll5BiJfKtQ?HY%x9d{a^-uG zd>v5hR!PvmJ#LT9vo~`Z-EPQZ?Wx5_662E?Bdkd`_Y$ikK+Rgz)4 zO=h0?7SRYfsi;q6owno1{^Y9-w`u7$>sGrV#2SxPX~z3m zw%19eG8&xJ_0Sn$@LIJZL&tfSyT)DI{-Q9+{jxd0N{WQ_%D1w)i>xw9%;AI|c2Z}a z$JkXddV}9iOL_=x-@oQB=!ive>DWuzJ~(Tz!j5sVvVM?m-WgS==AHF<^A~Y&XV{<*5qpkI0#uP#;9SBp5+?r<)F)p#oDdC!tDIl{VPt`({SC}o_qbP_td zI*AAgk7!jfoG(D*2W#_ku?J5koX}1zCVJzu)`dbw^|<-jjqx*Qf|DXBXV}s<5^PUR zqn6{!n7}48#IG*tVr;FrEH+Ga^TXNLk)so>@B|&;cP|NMvUQm?fWTNbJ-1wxk|w1b zc^(%WSG4Br5UE{kiw+5Wr$pj38f%ev8D{%PbR6P`#DTiE$Vvj{^V7%SnmE09i}xYIc9G$m}^^n*G1C2zn|Nh z#nod^uYF7l#IJ8@n2w=!gS`IxaUx6>P{nL0XmKv@;sL&gJjM-KzXwQ=6|?{Z0$2fV zzurN{TZl^9ZqGX!bdIJq7W!^G(!7#0&ZEdvKwch}1^_;Gd^?v9ezrP^(_Kcv~g6_)I@Ao_KR-9B-1bw%S z0Br^c+@x?_m?_v4?bqn)dc>_w)Nfi$_PcVR_A*amXEVsb-#5>vz9Eg9r=E}?3z*(t zeR4y%VKyl~!$=RnIQ<0cLrUx*1y!catoMwXZnTdXbXcw8z}vU+>HA&C0}27VjRgWQ z7=NtV&8tEtLGvFfi5Hf)hmKOSvzg`Erf*NZ1Oge0)jH0Bn#2Z z32Qg{`Larv1Omf*^d3AzQM8iGoXj&F9T*?d-~c)}yw? z2jVWF!y8@B>8^({S2x#LhiZowScH>=c zZx2cTmYzs*&EMp{{-aaAzhcb6DChdm&rl8r2Z!4oCfL74ets39kDi$^1W?k^Pgn~8 z006O!vQN8((0cRUI0|+(Jd2of9hz+{mc*r3sx^U-C4}E&3@WcLY%cC0*SC@DuFd<| zz2;>?Dcb=F=?^>)wLEO;5?D7wm;$W*(5KUmsN>^CX!#$JjiB{Tt3!>IrDdOS)1V`$ z^ZD%pQ>{;wazH(VlvjJNv_xz|LheM3^>%Y(V`C5zsno#_3Tf=wa<!QG-Wa>U(E; z+ouooUGgXG-eEtEClbU_EZ@jOJ97O(1>ry zryCQ}Uf7qz(X%Z{Nr^EJo{21X%e~N%CKMbh{JnO)b%~=&KgdZ@;6G6!PrsU7II7 zMs)xPs}j75CYwVPC(_b{n$uHB<}EHOb2wB!K<5)icpBZC`ngG^PjQ&kf;nA^zn?c) z`UJ=>%rpDNH>zt~=p`2JKCMQAPMi;g^B21&x11bWi7T&YpJaA}XGuF!dM9CZUSWwdWl$VtI)G52G<4%O4_ufP0!Z3_ef*N2R2kKp2A98aJA930fuA+xT`j_AZw_#ijU z8(>vo?U<;ey?lf+0Uq^KiNJ3DN`0wuu8OH0pQg-p+k7kg;;Xmm5K;ky68cvQR_M-$hmDte4R9FvVsqUWnc;rYG$TSe%zHp)W*HSV zMo!kzaCsmr`x4uQOk#9ahq!qrIK9PeF$FmJu8?9dwc1RcCSpb%=v!hF>)^E1nT_Ku2kyQy`lf=l*&VGJ=F51E< z;#f7(qy^_u5=&PV4BNMe9m()T3XpTnMh`X(PY=NjBu?4ngFRdZ3W+f#MpfP?S z$4G+-YdH%<>Ky}~BrcerwWu6`vl!ag)VKvD$jsb}V-4d0apTSEjFcPdvL7DWO;@cC zOiHXfM|4iHi5{d53}he@>Qlo9EnAM@4O;>AmV>k*9nPK6S_b1WIIn#q#G$v!mo*ZM zE>*{hN*TVAHSY(Vp*w~G>K7wFov8Uc4Udy5T>Rq43c4Jtv{0(#-l5xXO`C5Ll*}Iv zIq6%Z9`$G9dLHYGK5OwqpB%AVt$pkZ=<{qmy(9wZ1@y_*FSOzC=hwLo%jPK(g;C z)d>yV1+}<2~rcPtwk7F3H_a;KvC=uz<_{ zMwu8)QH(HGGLzxyXmm-oa>L8qlPILL>EXfy;b1L;xiX7>&vZ_TP}dmR=eFYy9htLd zKEW_)p&Zr&%iyi;Qc8P_$6T~u#LILA*_dHXg#s^ERYCl@yypjl#X`G7MfYg@-wcUc z#l#>e!q`G4V87g+&gX8R<8P=n`oG9+10rQ=)J$*w<~j>W=H-Zp$n>y?&IP#&?UTiyRZnB-p^H-hNA$uyfu{7Rm5EK z(nkx;U6hR%KDqMXwoj0Z@nw|^5WzJ+`!xXuHvc)ml+EaCwfO+&N`gaf-s+(Dy^Ddt z49@EnZm2<+4qLY)q!bsF!*7S}-HsKqJ04{^@fZDNEp~jK6Eo)tzF4?}5~xSCf)~t? zbMyVhe$xgqXxqM5l5pPCje`0;wv&|>E2)NtdGX@)QxsIpcTTu5Kl3LhYS(yvt@E3M z>7s-lUW%jy0>fB~<;-VGfR=3&Mg|7yah!0_y(W$9blY>m_qR+_{p;2Tl|PrdcXu@E zF_TB!g;W#XiAD){z4l*H^6llDhY#&~;v(S=)dQc5cfy+2=K^FH;Td#WaPy)$X`xPS zx6=;^PaWi;d@1lfP~}NT;v@B$#H=SX)n1wbXJ33DD{RnHJr1%`HG1MThGg&F3LWm7U$KL>H5-fC#s>|H*rRHFi9w1itp14abl z?uCC}fh4mkA-CCjD>(b_C=<|klNEKxKonKB$K#qSDk{wN9H5|u5y6?e`^0R43AtxU zk*|vp`K+Ce(^aT&EArU3EXM#W^2fKxwk&Fc)0y`@`%l-Y^{n6sY2KUd=j{ zIlovEMTl5bXz0kYO7kT)Mb*j<<>vU4l}^ZS&1gBto0itNmh}M9*ju@lCoZ;AwvCAwHsFVm(tla#B;Q_J?4?Sao@sB#G)d6d=6yPfAU-%K zEGi!puUw1{h9ChZ_LUw^COzp!Fu=a1#tdS%&0xH9 zX-1sBwc_UCWU1%&)*m#O1rY08d5?XEC2$i3KDV(d%7?)r5TCVP>Dw_v0+-2sKJG2+ zy?eRgi1iqIgX*OMZ~c}KgS>O-JM~<(BsFJuq8BJcy2Iqvu&-x6O zw+0>ypIFUaYt&V!GJ0fx7I^#_HUU0fOqtufcHtg#;Bo$#I-FmqWYT-duMRkDW0BZs zQB`y!FMLJ=;rXJr9P9WR+QX$&vfko-vY%&W`dG$Z5BUcRPS?tHxwAP8awsU1GA?%C zrYJJevEOWuC7gdeD;Oc{L-JwYU;j1vvnxLYbO~R`Dk&+&NL_3ku5#gjbHw**SvWbN z&eRA5BH}(z#iX6<+Q2PhV!Pd&)9=Jv;|nTsSUUV0o6;qVpf=UI=5?kyA0DPlxPN;4 ziXm;b3}Hh@nqm6og2GEF&Y+pa1bf~-#@j2KKso?)bEQ9j zAz)V@X5XOZzb%S-pcO`oma-!u;?Xt6!F71xdK{k^kfyPGfU1$L*h@HSaR(pN>cLr%SE}pyzj|J~lv7X@V`c9WEL6b%o@}Pb%ks1sd@Y}1zgnBQC0uFp z{*i`-9NS3u?bjw?-G-W#&5v)Q6}f*^KQW#cl^o%R8gpa5S$g(r9(=8Gq(CIpiO=s= z58wo;sZBKP{`H`XL`s!+yW(>-pO#H8_{x|hUdJ)j$w?diZ!Eyv{-!>Ix@B>p z#-QB{Ak{c;Q^46I*_tOdXXKaNbh=J0DMNo>P3|SAo-FW)81*&hlVub5gH8wd(;c4} z)iH{{Y_8VN-#_LD+ZOoZU?MMK=@=hCfcWvvAer}VsGnYSLFVi)$+if9TvBuw+xf+X z5JJt%tG3_$I6PaIdu?T9MQ8w5Bw2HfH9Ncyn&BJ3@H`8Wmi9hWfOhcvbhlrNm$!TW z-iYI^XtQm{dxbsWz2*+*czYN=o~i9q_C}8rGwn0;7uHU1EXQf$dv_KWGx3v4^cmb+ zzaOb>T@odHbwBeFs4x4I^bRddk{I z21^Z+@7Z@YOMY6J>r}~!p-JdL@1KHOh#~j20_L9jjo(Bq3#wm#(8@TM(tDlIcYCF8 z=9K||2{uUl(nZ$rIFJ!!Y;RaG`BX$hq%Hs=YHkiO$qaQ|buRjiW|(K3u!8Il>zP@E za>KLd&wmZY>>z|xP3&X?Ah~3tA)=6IH-We-zRL^B%m~O&+ zwyGGm9Qlzee-T_85#qTg*41^n^@BX^Wmi6(d6O9FR-^Y~I3d?=P~0`Q?B2DEFXT&! z5**$~?ZA1M)9o#K^EU$)kC6$Cu@1`1a|U8ge-K_PmFcrpR1^BaV#{MOVe2z9jXbim zPdhPGq-m)zE=LQviirIAqy1~n?_&8=qHY{Hc-1-za@t*Chn(~GK+Z8RG0g`rR?T|^ zs==o>w{@;)XvTT$P0sh33il2!XoIoF_RpsoqQ`|QY=^Kfz|!kC<0+Q6@-glu+6I5n z>Ou9wRoY!<;=GL-X>j_JWXK`C3e&vsjL8uPUslI?d7%yN)~MxVf-cS@HW_aNekQ>1 zF$Aa(?D>un#6XEjba5A}>3bS*(4EXT;BCJaiX)F57q6J7WZJ73-?M(3RRSpn6&|)W zpAR+TWW!#s&`6)wA&r?f;I60u^hN#V5bj;O)yf2l$u>VmvCv;Myu)p=r*FKOm{RZW8A5M=lqfC5-BDRXzLm@wwR*j~-d%;Q)$%*e?S)yzsqZ#|%EXNGy$XB| za#K}E?DuX-2_gsNtw1Td{@9-UCh8K-Sh%pm&+pUBRov6|?S=diLNHyYz}u$Rtnz*Y z-)%7a_-+*rX`WS+O`qeE=>2)DmGSJcI(9iBimS#>-|Y?S9G9t^tV`&eq<0_FV@Ja# z_x`0<%&~LQ7FvENMPcfu8n2bVi=@#RUSlmL_%5T=C))cg^39`4`d6HQI_PK4UK>ku zm*LQ1b;*+i2n5nEPbnwrceWo%Ga9A{L@`Ya0F*Cp28Y{w^^87DPy)So-m6esR zUcEZ?wB5Ff;o(uA0aMktezj+@uWlT>O5H+E1cjg&MEp8c^m}GE*7h87i@)F|qMS^8 z9D_hZN6CpotV$J=yW*a>skqWBsz54S02W5yjWBKm0D&hb6Ru2Pba{T64{8<_fV-T; z>qho;-b5@$x+v^=L4!1U|7RfAz>Yz{`}LAC zo|?X#W&7>sMYn@->x-+ST9vXZdk*yCEo{4rH9L^E91ylw^r-C$J>Evj&V@H&f0ARnBxNWnEU8bGnX;=+ z2Km$#L4-KOUbyDQnXyCtN5q6%uE}h}e>*_&rf@NL+be1(JEIE>yBoaF48QppRTSkHQB9UFu69dPvd*? zBz(jxsI?m3^3*qrkl~HB?cLSoT_D~S3evMEul@C{9O#wVa=DjM!7V&D5gVG`4Is3B zRJ5`YW`i7q2k;aUd_R8ur&EE&>+9>N5f#3w-Kp>29p(crXH)pCE>5DQ|}1p=VWc z5uw)@ZMbzP0UO`sDM(_zNvfNE>^Bb4Q^^s@aJ{! z*T}y{(1j^6SE1zPDaVR1q9nmw#I~^GtZCI$>dXq$UswxUg;0D%v5@2JSH$*osiwoq z#=-9Rr0RPMy&##E?c}D+OvW2cpqybtB-vk(t);Jk!1!K2vCDxEOkknfy0Ewr2O~4* z29k=G2e+K3J@!EQKuPtAh3R2FnWIG)y@8cD!t`bCMNs(!Uu$9|6s#C3Wni4 zSF5P|#s8FC&?hG>?=u(k<(+?Yb9a(YnV?Mc`lF-clx_Uk-+xk|?TzUxe{FaFtEa$E z?R0Zn^2R@a&IX_1)9sEzXt*qMtRgFU*q^_{wZ8OpdS?BW0Dos^XH9-wYilbYN1luf z%o6$FZ;`(x&FSJo*9P%l!Wb`Elg4>wc6j^x8jo81^Zp5bs^M*<1+P% zl0J8I`q)I~!S~`{<0qf2F5&M_ykIwM*d+kU-Ir5}lLaKO>SQDqzz0w%Hq`d!vHPzq((&Vog;ht_YZHTzv8VRY%3`9H_%AqfdZ~;$p=_ zi^SWO3r3?n-=UC9$h|n+GHxyN{sVcukyTqVKI9G(LeE5R^7CG-F5rv%Ve+m)v|)nx zdZCtl;@LMw$=Xq(!`+FutQQ}NG9hGuiql#3)3kt~iO_$c+`P#S*c8}ufz|5zB631H zs_7r9_&oVOTuuTv%cJyURXc`^!e?asFZ`1l9iD}M+WX%c^2pBr5j#M|3c|u(h%M+ zLMdnZAb(dW_1ghBHFHZQv0IzR&_Ap2w9*Y#JH6N3VBE8C`FORZK}6wAVm&Xcy8E$$ zOOgNE2gI}iI;5n}t#~g_*E{m!T(ug(eY>9O+vNQ3EGN?WqQ6kdJ!-01(~k~M|8x@w z2>ri}JNI!W4wY7N)x(b@X|r2P{s8|hq_ zxI*G}8Gw@WIL`yMoYn0BXy}K+&)TqJ&*r6X5kG9IXrZDnp&U2Em7&Vq-LB#Kmsccm zpmrt`Ue^HFsa5wQaIk6a$Z|h;j}jB|{qvPunIWWF${$`aGc!*Mjo&wZ63mNa3Q^**W{%It;!5qT1K{)Xf7=pD4|eg zD7Q7sg(@vVT69DKPl&{o0eUq)LwY0~vC8HnPFevqTX(_>xH%Te6v9aEBkw zPM1-qr_3jZ6F<*@2*2HA>;eV<4c0SVI75Gr$Z{zCQ(Ji9J?N$aFmGhJU_ka!JXXZj zOXIV=hsgEci~_J)5t$*5Vw85&$s1|f_Q(_-z27#OS4qIrbrPBfV1QTed+HmQndS7 zNMwZ{F!6Z6GtwjQe|R>YnSze&5{nH9O^!X;v->_MPfoh4$metJz4KI!MuZaDN@q0G zynf8Qg!X~^IKABY=zFo|S6lF*t_0-dO#+9_j^;<-dStM+L<*L0c*LwvBlH%IxrX60 zVxua_s2K*I_H4jkS-LU4%-(z%0H35_k4YB+yeU1T&1B2&8;}&A9DCo(n8@zAC$VD4 zvN-8#Xw39{7jn4=HJlVRG3%R+nI~g{Fv2tYW0mNnS5L2Bqq0Y@L>N(9FlSc*;u%vi zgiJK1U=W7y6VZkmn2Q-y_mwLeZC!k8dri8dV^RCqe{txQ(gdFF>aCq%ueq#8%)Pu- zYn-qj*srowzRBYQxG+Ut@o#RLw*W670xkEyo9v9SCls1bPc2uWgnHI%$|P(Wc397s z${gp;7DB2nD73YoM=hF~w2=5bFS!&S9tYm{YWPqU4Ao2^&IXtE zXl(*}Kv3gDlgzKQd~J5+PCw*a!j;H#PDsOuZ|>i^85W68q@~+aTvKVG%IZnVC&8BR znOdRv(9mP3vh0-(EA{bvfXvBN**;lmxtepWQXrK{~9x>+=(N^}EcyYa@rAmiH z6sZdrAE(YQAB;%y-7kZ8Y;MHOnzJ816%fq6s3M383GSIQ*?n(b6Xrh8k^RcNN}}Hh zeqLkF+Xv_9ga4{~UOO)drl%OScZ1naHuM|0o4w8yF>{$$d}Uv`mffxq`%*wKXJR`{ zHf;=DPjn}RB;0MW?OFk;=#dQbPDvcOG=>9k<~b%++)}i0^aWe8=nnr zL%5}M0iMx2-zeT4)B8?xC2CDB-dmlzGNs0i_S$Q-&|@aNn=wA2qA`8gAonjR=CnCH?+$CNu*<~r|LDRmQQ{{&pjG#7-3@L^3~9uI^(R;!XDX` zQ5H$vMDslC7pjz_eW81k#XFp2MS_!&Od#L}kx15gTUJ_JNSSEt(Q{JaeQZZ2RivndyQXxPB*$eZr0>ZY$<>sYo3^ zq{r$mOM*t|A2DA%pfvbm`h z9+_0V_*wz*`>cS2Ey3oHkV=0bTak5l^h@TLX3`ny{7UI%r<>UvH}A?gN6?7cy08K| z%Q0|((sMEzx5kH|70R4Sva*fZR2E8c=6dAjEnk-#XhIb`Dxu1!t_|wpE5ojS>U{Y9 zf_MQ?$ZzBGo9vMs!Zj5>4Yus?S1LjY_vF;RBtbo^l&}741@0*xOj@3qoi%WmVbM6> z9IfsdJNvx9G8YtbthzhGR*KAWj+gf!6^zrZUEW5b67a#6ceVtxDnmAZL}RGgzH)R^ z&KA4cDf=KlF0_6=8#Ap@-)8CyJKt_Gh<&FWN@-iAZZq_)^$gpz+>xU((*2q-WneXV zqcJjnS^Sh*g_ROgd>4se;}vc4eCcFjei-Pid2z!)Zp0a=;7QLNAG$+0$%Zx3czKnj z;gmtlMRA_7X_P3EUeduDX3eKIV2m47XNOWTGy7{nG9NKI8);C8y@O};@D!hJ4)YI4 zmm4%fLL99PYh)-2qSS{Iv^FAdEVjSLSn-5w`IJf2DkvK&4@7-kc6K1w}8H}6#rNwOZgJ_z+}h}vuU** zVF$mF&STE)g-knPCwan}XEo$-Wi3b=T)mdA_~U7nS+Pj<#;)f&Oxmsb2dj;QA3ohS z=Ny=-K^NCZ&jUEbrele#OGI>;;}lHH?FwFisE#K5nirBQsr<}q-oFYtRo&;nxG(x5 z!A*Ied)S}#6_Ur=h+SYVjZ3BC_&((x?@aKs{Rr@wA7b)v{`y8MEYt>MIar(&UXAwq zDVzG^iDul%M8ors|0A*Y81NZHzbVq_(nMg*-daCIwBPVk; z1plIPMf2$j;J1I&O@akWLCb+JGgR}2XGNTCw0IB}nlNHtEQqC*;cyml?{XfkRILM=ia}@9@ z+4eiXxc;DjviA*a_W{zHr2Q3mM~#iQX5&%njU(I**MNlo)GLdqCx3zA+xiZD(%gn- z`X5!1K1%1xni%ybd^}N-Q4)E$dx$>;6*6!|tjCFS>esZ~C^XF8QlpjMvYK9u*0F-HiT~A+& zAOF?)f9k_UBic-?YdBkh?wb1gTg%JKySq{6(uT3}IR_^v_;AA~JUsRgMnaiZ^k0LF zgZb@_n;(8U%o+i2;ScoB8TKj-zRK`^*xIfJB|MJ%>nV?dNm}vZ`|{a>27-H4jCTv! z(fyShoQxL2{)2LctIGdBU)Jy{=zZPviTT@>!vj1n?vcfsr(ywXNa6$^1#a-g@yZu| z7xB9k$PLeR?{J(YD8;d{>1mx922T^gE}On#ZX; zk;$;?VQH0Mi%`=P?dr$CRJr>={70bisj#y~M`7T2TD*m#?_N?g}S`ee%p_G!?|npc0~jp+XozfGyFNiMymm zIv`nDyc}Y|o;@$p+UW80qQOfhQFN?5nI-& zbd`AlP{XdokUsyNB`S3J8KJgPpA&Je#AFWFbJE4>cSVjyyRr}6!7LCQO|^Z8MDUki z&0^7@=9RMW!{r#WH@Ww??X<@kkdKWrbnU-fCANyIXJ>&O% z5b~qqt#{XAU;%Z>bcHw8&iS0nwUR!c!Livz3C*Kc*+ zwlB1ATmp4AG5!u|KiOitOHveK?2Xo($oR8RwBFejD<$_prBf)=u>+96{IB(zcnoq6M0gwzM{ASWnpHHU}F&wb5$D=pJR(p){!Gs zDwmu+$#`+8Jzy!uYJg#`K>mi$9STf ztBp! zO=0wdGyeOznLX2X%1%f(Y1e>HStnz*{dc(yD)uI>4u0{hDe)~zj@Ihsg~~!rTzh06 zQOu{|5U-48OR3HYEps5_hNjN5T9eJ4?C5++(I=^ueNq_Q#iq{CDJrWyBZ41oiQO%` zKF3Mti#aHAJ6h|UT*=n_L+-U-jbNY7Ny!}AF@)@hE|-0$NiG|~*cO80GC7``R9j7IN4x~drY|A@*kK8P-7oQH7W}6MYM+wK z&w|spclT6RGVUEHX>@+USYB%3eb(x-^`cFU*|VE7nc)Mi3spuZKG|Qdu~=G}QyCQ) z-!W7GIoN$p(?5zD@Hx;@Qg+VEMw!pDehSsnJ0w}yNl~UEb556jBAZ*m=^WW`WSjVi zIXEFAuOg>Dx8Ik|J!-q1N*oZ6y4o|&382n$Y`cTg_Y~HC#H>M;7%DrGhdXL2kiM{M z<05Txd_4bMJTqXiTqYpdC|jR&(D!^)kVbBWj)sYin6mvQZ(7AlS}!c#YA^ypsGt!4 zmaCU9r`<8X0POnirX*)!ccR#z#VL?(;Dqx^PvU(ye?}?0R@#>_HoRh{ii9bO)X>buzV)szgP%(+vdOJL)rU zN`|M|klt`Ujenb09BnhT5~lcsGybG&s@O|4HP&bv)Iw4l%K_~h_g9jIqY|4G3t7$Z z%ZG**_jXjH@GV(cn%|B6!OpBJD--oW}Y zUdJxLXA332jafO|0(YH(wEqPk%L&r zJD+NjlwNX6L5ld%u8YO4dIVIv@q}!2I|EbW`H5-R*M&BIa^iX1JSv1wzm%F3j9X#w zMEk4CQ2fK#qKapg3BqTYDS@Kl&>b34YKU$^4SWM-BVh&8V31%cF$?=4d3gkO`kYbt zoE^M@s#7VZ9I*|G;yy@SI|U>U!WgTj!*(p#U~A9#eP}3_{YUypAR^|ata%*kXbL@n z$AhZw2!Q`^?|V#Nc&3O=O?*Om%K}BeraPCBu1I7x_kum8(^ zLyO}}?{J9IQ{f#Dr zVDn5cmJzvVx~-aZ<54DKg9n1EkQS23(}mhLmTt^JWnUP0FPldKwCD5deLM*4pL%@4 z)J@uKf00I&1M)FbzFBnTPqqN=>p>7v4A@#qeD_4S;8Xn`{-hjyaxjU63e`P74|j2K zd240{^UG}V+i0+=LHPF{_?uxs3{+BM89ksAl$_Ok-NSA7ses=1X5m9%^4J8?&lpo9 zI7PP|b=U_#Nt__BrP>2^i*qGogSm6pkq44wlg5~{A5&k84E#yrn~RkrawDJDX{>eK z4#VUYr)3syxb5wzT5Lms8N*L~U#y7F&Ytj!EAy&cl$EJ+_Vq%V>b){Pk+Yyj`nYzN z>$#&kUy;C?lA7(yQV}-xgPZB_EVlJEZ$aHsnW3B7A+K*24BL1|n<@fX0ryxx=|+LN z!-N`Mk1f~+MY{`iIMJ2{uj>YD0h6xFB&1=xyKGMMJ57@fA#K*jH`J;pE$jYW`!$^-Gf07~tS-n$J0bv96JL?WBaJ@Z7v zmizxKs4r}PD{tph-bZVy=_2I^&JlTw?9+H3fI~7l!3#-Yn_GY0Il;n(bq#r|`xMFF zTl}H0)c=n%ut(!R8-Qx%N_5M!u{9kbq%a)Mf9utR))!n82w)~yl>Y~6;N7dm_$cQ* zC}+ph3E#iyCfFqszWRcw(>XnxrjxdH5=_4ze>1Z zPJ&vCa&G)yn(H#H`hOqRUMc4;M%ci1ISKF|3}T?}ukdNY`o#QIL9;Rhz$~qZBmz8H zl~w#zGw}PTh;$6DhDJp-JzfrszGm@PgA3fg`oH&;{-3K*|6d>od)#_a$X#uSeD=@l zn<1Ynxc;W`IIJO47dTTN@o^L)eLhoh)b7a7`nO16^r}3F@S(Q;-(7q7%vzzd)4hE( znmw~$d6UNy?bEC=COd!H!(TbtSmd=G0vp1y)hLg7b&~oo91vYxzYoKq`djqne6Z@B zLjh-oscY!*A?Z|{iguzRE$r+osl?F>CdUcY*wwQUPbp)cvk!?gOOC$yx;L(C47SOI z@P)2Wfv0!6!NL#UY-f+2VlDpZ{r9x(Z^SRYXNv4$8gPRdmnXQ#By>`SZff6lE;o)S zZmIiKJ1sWWAf2aA&Oa=-<0?H-rm9Ap*nP*tyGs8TXSJ$jNNFYIj1Si1YZow@= z@Zj!Fkip%C5S#!3f?IHRcL>1)1lPgc-Q{lHgUWF19QvG&Td{^)Vzqn@36z3D@29`jszFf8us+rg>r+AY^ z=gji=5!DfM)ETUuS1}lQPq~m3=BWrIe40*fC|kZ~fTes_Z|dE3{F^T{cfvJxjbR>p z)x84NMuSGy`=}3=HvvzDb#9kom~sQZZqu4QF7~JBc5b$Z$ashXi$h+ixVf$6_}2@Z z?=!f&9gE!GwrIc0%6I2EP>Qx%32$z!dARu%4V|y@xD@*fP17(n4#AUyQDn3k)^HTs zG9yBq3;91-VWbuFU8#)Qof}2;aewQvW@gujJy`%S|DZ2KVUkpaNi1hLM}hfLnb+FX znwJaG)Slq`QeAI>MeKzz{z739YR%(ZQTntXaOwy2yKShjTJhyLjL1K5VXZ$7840OK zwJ;Om&lA)Uer{hpx!T{~ceWhHq6cwzhk32h&OY#Awf1Z1RNRD$Jfx-Et-fqHT>BNb z5oFCYI(gce=Ay=>19pK1*Y=7=_r9`H@xs56q^j49CnI0NAyg?QYN&d+V7$=7q)=Y5 zzYtqmG9`YfRA)jm5-fH5b6eRyi|X^UGmTWBWF8K^b!*+d z`rYeU16@w5VX21g+Kf3`OwI2Ob{P<@eL0eTB0xkyuxQJx%`yoP35Lu6EWtUTy6JCy zHZ(LeUNw~Ot0*oXj=tj1*R}=`S!;{;HOP%X#kY z7CKRjLOffMDq~!~2}eRW#vfEf-&LDMt#op>xZW-j{&}yiNBtH|q}0OzH8SbJh~7q! zap`%a=y^Qd!QH|}35&bS(n0L4!%hyDUO9|r=o_<#bIx`l4f+!_wK$hKVjJz5>m_K> zRb}v;8H?Lq7_SXjvtbE+;K8%bVBo<9e7^dd+NKF>gP8+kmQIGQ?r*^4Nwz`o7eEwTQMm0b$XuBgYOdd;Vvq!BygCFaXk{YC@7XD_Po5j zcpz8nNj7Z!f5AOl6p6np9K`!1>+g04CBrNJ`%%_FTM!GR-!!~)Mikbi&lW#mnt8+> z@!c;FC9uPwTpbt@D(oXyLGeINS#%5x-4;)c+)-GAE1Hkj;g#p7*NaO_pTr-Lyf2U4 zmvANx#IfoDtJsty0sd3l`D-{dd|H5OV^ggOtasoY^vl%+g@kD3Qg=7Mcg3~0zsXkI zT3Nxt#r?UoNT0t*AeLEPSlEBQOJMx?+%I__I|WGedz+h!N3KdaGD}CU013a>xS_6Y zvD_Eub5hdm;^OyCL-wQr_vV(y#>V{o-tKO*ku1q@3`o=F{{Hz95dV7a>`1;i285!v zwu*#yZtw5og?5Hx05VcP;|&VPCn&GExw*D>lAC2W8>k`*skB^2uf;c5hf!e6BmbjEear>-=wJj8BRFwSHA@pX^Zb^ce1IkauZ zfoqf8I&-Iq?%g;kzbAW+^|}4|Q$!gWrBa}o+0g%Re|HFA0*!Viv$f&XSB4^G5a2xH$nbgGkrdEVOvt=!q~qG?a84 zE*f2XU+DF#V7BNIU;zQw<|9;LVh;T;!`nvHfYo<*3vVV;eGjYMa3rI<75lKa@WN`w zPD)x7qPNlf?J`O4;d-)FQf9$E3y7Xc6!A8Ybk~)=MrCa(vtN_0ze%$8G(sQHvzFAm zO48F~&Z617;FFGB^(?L4oAgerq_UG99cX@YcUN;(qbRN0cT+K~Z%KDFj(I$yM#FM7 zV1qp>a;fWecQ`vf-2_=HRr8(`oPid!tk{UO+OH9(VY-F*DySSE3~fvhl|KA4mn+W| zL5o?Z?#-{s3AUI)>m@5|3&|z{tm-Wsd~R1t4x&0-FZ5D}!|lH4s{s=R|LJw<#LqC%S?y8NZ;F;-(gSz&&$Gy5yS;t+_bVij&0eL#MrY*oyPN)ho9!0 z^`RfAd2-g<6{Pf}bQM}k4K{Lt6q|MF^|xN$mJShPt{&8-@;;x>ksZpdm>*0$5a@%_ z4~SgwdCfMrO>@ntuqcG-3$fN|0K3lvxEKu^dPD6vrY03|9>aQROC8HaD zGG~TZk+u`J@5MS4KC~wIF@fJ%?oEp0;=41gGQ^5?52R5TM`}2%Hx{gz2_Q3xmdsNO zqrOaAnsIVGh_fJzT(?T1W@EXsGlh%~U!w})EeBbgpvr`$sq3+f7&}Zq`58!r?>L6-~lUV!&d`XH($gu zlV*duC$%5S=wnCqyfsujaTScB;3itj(vszZx^I7mrvt z&2eKEszdOpN`c_|GmiYFQ zZ;LF;{iuq(xBPQ+E+*Bcr9Q!c{7r;mF3n|--FWJ@Ad+gfmPHiA+|iI&Yh+NEJIbT z8}s6gid<`=EaHY)M-sUO%S?}<*K!r(y;#~20YL#RzKvsU2VV+GTSoj?Jec&?NA!*! zG;}?7yl_A+w9&nQ^$QW{?&>mp93~$aaCi^y=;FaUCRJ0pO_SJ2OM8vq1Nr526;(B6 zEy%$mHDgW<0lzR$?2O9iat4Esh(8voB|TY^j>68ogZ0db=-W9MX;!I;nJgb3=D$t< zI_=yr%C&lAOU6>}$7vjVRF17S3%4KXU>a1%#3Qoh_(?&?c9L=AkUT6;Ixhlx#Yua5 zwBvA!4%rAxH`j9Zvb#KqnD?%@sl0tVn*tKkak+`P(3$nt?LInd;+C}$s4^JkNhKun za=JWNYn+!ueKE!DV8-O3DBt*Sd32X67$@X*@-c<+5Qm^~)=4dC&w8ImP7VV$owCzp z)|E5#VBons{Z!bFN;+1?`nqa+`A+qj?Dk9yROV4?m(cu3qrcQD~QuMPbhi%PL&BXg!<6JS8rBURzzWeK|b{XYYiM%8VEK+mHfG z6TQ_%1$JoddaXS?-cGEx>fprNyV@{aQ=u*@8jq;2hk$@UGFWV6ky+BHQ;hd@cnYT5 z*jlz&cM#G#h_7@L18bQ1!4u-eb5DI^C!(h(f+4=>maRr;85-Ie(G&E2hSb0NiCha= zUpl3lOCQ2RVCw+{Uz?AEv*~ZIuLfBy>iDY%7A9+M1`~)~ONY>Q3zikUS3sC>`Z00TdN&tlJXlnUivC;i}3Br+XHIMdgom=geQG4~GqWdY)PBrqF6GW7e({J>05;FQJdD4MuZ&Wg^}dI<^K zUUg+|Q(E6J$y3#M+37E`gP0y#xiH}RP5Ogc2%>OGioNkDqco;1VoQ2xnjGrg)o3*A zwC*e2VZKRfW9SnN2kQaQ^C!YL`?HWF6z|4Y3lgb72lGRTj9HDPJ5b9Mm>!(FQ6W3ziXld6-)CDo`i+VI9bk^C2{JW8NlzpHANdsXT-_0=i7n*H#<%tB63sLm-`>Zc9ef1n{M{?C zGRezJ>^$HToK7SczFLyDBb~2zZ%S-?ViQXD?*xEJGRw7LlxuA< znyyrXV!OJdyp0-R?V)0P@h-OTSpC#0MMA;GM($n9Hkw`hs; zM)BtNYTQ9DrN3OV9gIRPz=r$H+#v18j6P)|S)ew_V9|_;2~`o1RxBZ0A4ZL@m#asV zA&IOzVWK~AUFFhRncQQEv7U9Lh3q_B_uQu}Xavz8q6T{~C~um&3Ks3{grwvqkbJs0 z4U(`q%f~2o+Z00n@w<+9AVv|8YN)9wFR%>^xB`htNOrfjjxH`-)DZ(})=xx$n6Inf zRaeW6WP3jRt=Ab&$8R;-zB1qbrjDqG06X1K=BL->KQ3>hAro6$+cEzbDHD15-w0oj zl0U&327q7%QSdM+o~wYvx{R%DSz%!zsqd#FU;@9VryEQZAv?YkJLzVG-gtE_2)k;# zUKl~pXlt7;``{AO?!4!fY7-D`hxYRaM|0)G#l(ca$HMK$y-k1m?3tb8SGRC5i@rKJZs%nP0;=%#Q!C&!0}A0dzwVXuZvgim%$Km1WCo7jy- zt>e=~z;oi02SQEvpPsOpIz3uQZ5@^*g1En}fA<9p@i~!VKk<`aqxoFzh3}FVK{#bYEe3OW;J2zJyoUxsg@%Ey#u0C z0plP>itAV$q0JA_ND`BhygWTg{`N9eA&t^j)PI-fhG}Upxt+N&@(!c3VcdJPs$lT7 zsOW_AXQ8(sf(bx9rTLKPc)qJ4jtn3E_*YBL){z`|W?&HdSuEk=&$_SG3k{p`Z`gt) zu!SKJ^T~zWTfyhwQty7UNi^PPyVDeD_gSdbWU1-SEC@(w?{80ihg8B`NtxTz&U*#X zshK|q5BaSUvE-;(7Th2OtCwRbT`(P=Qd{0^ofNjHs$C2hbaZr1(_i}KW&8mSfF&mKaLXCp`;+;frvG;0xEUntFESZaIl=a2_gc?5>> zUB=JW)-0E=L3taB%k#2cm%sWoDpjN}RnmCYoELQw>WY1QKrbU)w#VoJYQ&~`n|GDw z9uPj`DyaMVbsH?g86GfI49j`>Q9xjD=5Wu(2`TBLRfcGsRt>5vR26n-iY-;E$@Nw~ zxR%{(^4jaR)_|8Ecg&v{wV5@7#|ov0l!f8Rtch%%ii*yi(zyf+3{8&adWOAnAxip{ z{JpCY-DNHwItmT*WNybd05On+FB;9yep> ztWB|xC*|HG2A|moYd4$78`jjgsJnU&#wap5BTi<=7VV|ry|Xcsc(YMGQ?K;F9Xy8$ za?x)jZmO(28Ov89!RYSjct?lJks!mv!y_Jug!vi@ZS6E1wx|XW0dAr&zAX?r;%>0l0%Y6Od1M z_)R-P+mda(3{6D$$;ruz0p#maU0t0FkiDa^Q7c~=0L%FJNo*B8h0}&M{o^r?ms? zTQT^YNgt0!;a}=B^2`<-5WXr?Z_!4I+?v8<_CR|TLD0VRvR$OA#Z9x0*>Bu-dAUY7 zggi>38R%d^kYb8ks|{GjXT$FYe8me*9rg|l4GaO8q@|@LJRH7l9smJ;8Un8cfFF-L zk&R~8o)R=vx%$4Z*lOUms`7JCe9_cbdKJ_rU>rN8Q+jo8J9|5?#Uq5cvu_Edw_#!4bjNCK$rUx$>Y4ARvL-o+z*3nb zo7hb)RR6Wn=E`2l-6S*6^J{$3`^wMf`nP|xh7AtQxn3T(6Y`Ez5C?Em-|mB(Bf&_Ynd9zfog8&wjGdgS={YN&OGJ!`5f;D!ILO zB0`A=I>>DP3f|@g=W*tCEg}qxm_JVh(jU?Qk)juzijDS!SJx1CaX&i7ADfv`EiTAm zTE_GWzrY?gAnTWjl%UT|);&HbAAv^fq|WQp{7 zxZ(UW1guEi=(=j_%9)uGE6Lmb2$lmn?V5?))Xhm81#xLxg?HEcX|4xjC5k#J;`$R1 z*iq)eK1NJJPtii3&QVC{Q%S?C*&?&ReT_S#s}%$OPVA_9AvO|qBJ4UZ&T<|k%k#Z^jZ zo0jFywdoGXASG4(!0JB{2|UXk*xh()c~tu z!VYV{r^EpfQ2TZ3=@d~L7_9r7 zGH{t?_1;z(uqD?{M)3tJxcn>w<1jD`I1&JP3xFe?hIW53Q;-^4f(%CB%Gw$b%DOjQ z;-v%iWs2lsW<>9x;x8NA&Les%`vjZqn8FF;**z|O-VL8Bob`|_}?i2hjUm5Ai6Fxx0 zLGB=fpCW8XcKC6FVbpERVO~80oV38H+L@{W5}1E#`^05@bQJI6RGA1VSOR<&vS|)I z@soX*b+D;ky*E}cN&`lUU@EZA?2-{Ja;tPh7jfiv4FRj~x=|FRS+Ev1HG|cu61K30 zVX3yWc`$ZQyziuHsH=3vWJ4@Odf&7ylg%>9ahY z<3Gj-aGG?ioLm7~Ln?Cv8U{vq0~<|O8{Jg#Y_foh^-Pty49&@YAiSWm?fw(;TM8do zdOsg+(}6zn#lip}xn2OdfukrbEiFmeQ9*4ifU|-9{*QpEL;9b@$KweG=tuuQM{nKR z*%=F4M>G%!XGmwLg!hggvuSeCRszmPX`4SDn@d^dt=Jotov%9d$c+4p#O zJuDEziJ=0Pzv-u8Af~x|*uZ;CRjI-I!@dGD)}#mrH$V4C+D=&>QK)_YzSk|1Ewrj2 zWScv4c(6F5wj+M=vYR=gk%9krjRF%^_;fI-(Dash#Cl0@X`b56`|hqzu^V&Z!q5@j zYNwFKR2@=>Yky>MEhWWlO0WeZV}7Gij@_om-X&}DVw3uXhHk#H@K;_CNt;}3OdJIT zc)Q@2yZbw*_mQ3u8LPsKh8zVVv+oiV)vD`jO==3I+}O|HGnE`p6g&J2qOxAR-`+G% zP}Nl^rD@%Cs&~te{6SpEolM`~OJ8I?ffcDv)M_p5TxB@0{2|P{P(&b}f?`C~gh^A6 zQs(~h^+b`@(B0Wp5{4K)?d3xG55#hYgRPAVyJa=;0tSZd@#MC;qAxuSd;TxN_&>c8 zzWF@&9w5N#h@GCb)f|?K;HfhK zg0`fhtS&ZI%h<~!g^I8+>C=o0|&BBmlRLqH2J3%-EDaqCBlwCU*P^QgZHV%vT znUQo>Ms`bJR&Yl`)LGK%3?~CK;eoR=dfbBTYe{v|`MW?FH5JLQ$lHvLF|M=YJuVG@ zj@h^$TEZk9g#j&-CX(-3Z0C3K&Ffh6!td040{iZAK)!%`RDxttu*+noM>-aFAiu=A zNYUJ=)Mi}OdZw&Ym`(WR?4#l?)0EmbE%0p08&T1QL=F}Ei7vl}k=u}rFC?u9{-FWN zX1q#O!mSO=Y~C=<;DU_23~(#?((LXk+l;cFN_L+_%*P!JhA*r5X|H}=>XEGHmZ+_6 zsEOf=&FBB96NJN3(DF~N&|9E`wV0;~LYu+oXS-n#0iGDu)z&zwe$e%vdg|!8qMuxUujV!`_tBnRKl_4fjR+zKgVVph6SX+|eWitz`6(!IrvMj{9KQ=& zxR-anJ7pN?>z9&}=o`@56Yom&3L&<>Ssm<~@!G6Jpq`dwkBn4gk5qsaoQ24SQ&|YR zR>f2~nQ)06hf04%!wJ??oZnI8m;ffB;6QyT#w$`oLoyUw(b!v*N+&6%f{ubu_^ZU^ zj0KfquQYKmxDwStk@FZu^+rMKeF948Z{E1JvE484EBwZ?UV}3WR0OQL&ru>m4rSQth7K?ZwVig+y6UUKO)2_4M`3R2cQoY8@-y&WcSP{hl>IBOJtSY0xd9w7W(2 z&#z(scD{Lz!WA5ce?ZsMOFyMU!b*PDl94#;d=Tl(aB92=yjeM=hg(*fCIzdP&AXWp zT4Qs6Cr$7YY_R0jDahyru=>9&$!M5!Dj3^WQ3+DdN91{X_=kL)!t73nd^c|i9XylT zKO1w*Wz7Ro+O}4LKr~N_CnQAQQpA;Dt~W2+^Gq18^;@357~iD?+gUl6LoDbce-Cjl zNs+(6sdmb@(Z1^aUck`DT#%=R^9)f`R1AC^A{o9;XVF(M_^UvTpqJHr3JrwS%}Q^h z(;1Sned|eiA^Tzm{y8cikd74t>sjYp@Um^`i&1WiV2Sdj;5>9S)K@ix&+u`RpQ$mC zgO{}%(cLe@nO`cd0;4xEQw7lkV@m-y(uPihq2PBg34xdH0$+e)sC?!E#KAZT&6EP` z+lU%YT8vm%?`K+=9PToxl@%7o3$oe34b>hIO~CRL5c*uxPxobzLAH+qVwv)`MW{8; zbmRK%^f+q08fN3&^tdYO-H(XkJAjmH!R?;Tdpt>kZU zr>*qBw*>*N@7JQ5@BM#BP=!UKNZLUP-$+MgCBsT@2#H>By_gMM9rvdWJIV)=_ZOIR z{rt5|G-U2m zO2EOC#w2E)60|X!TZ>ypXVO&SaG7XZiaVw%Ae)KUuKOJzPQR<*W_J^EQB)_%A%{#Jw$JZiG;6B%3GKg{wuwz=o?euRVzE zEua{$Y-k_au(FPF0b2k>P(I41+CO>bkTl5%*EVRT59Ne6^ykIz z1;5Dr^5nDe8;%i2JM8MFx9K>jij|7{=_~2A9iMX;dYK`V;PSWzCXw9TK2_PN?Onfd zJ9vLjy%{1WPXc;|0;knlPe|3FbKLrV{^M%ne3%*^enM=)FoI2#NqLu7+>$daflEk6 zL&afxVDG%9Ekf=@2&^~B!ltY)3ExZ77`4EKnzhuzS~bENw2P&l^qqsVlgU=Yg?f{2&=+pI5A@3vpf6y-tc_ zauIh<{@2Cbia_ zs_6MrQL4CH;@*c4yI*wc>-i`+s=HRvresrL(Oh5f2Ae^CB8X)Ij(i(_7o@w3_l?s) zT5upchnT%F1i}mmp)wqZjz;ipUQ<;VoxKxN*B>^7z74>MnhMp_)huAM&pIOJnRi_I zqgVTo0+5Dn1XaF?NLF}8vb?J2X&^EwpeaA<+&~S%*Z+J1f&MQ{=g+ro^t>NX+Wxo_ z{(R%JG6nq4Xe#N06cAco`9K+`cZw_Yo%@t@pq*^1)?`pqa2J)sl2b%^WOPXjA(>|F zFCt(|DUb!43hp(4Ab~5CNqJKS(FJQH=)ho>n>S$q0dK~dTprt_9aejYsNC8ZnA}mWEh*Sdx^TQ)Bm=Xyl244K4mJ14en`D1i94G?ZKaE= z2!JSOTFKhjF>2uR#lL7sD3mN6F@*h{yLf$)1o)3?&Lk^x^F-9R9Y153UEtIQ?sm}_Lt z+=?SM+m8ec#c=NCDU)8_n-pxTnyk`YxOHgU=2GWY{od;Mhb{WlD18I{I6% z!QhddQzAU^u}PQ7DEH=im{lljrlcllZhDesrf}O^7P7qO=H{Fs@cGxwSVq@5)~mjq zEy@R$=d6 zv72mazZwR@&Q}wayGf#T1TZS`?gB`zY6^E)URL(OKq=Rrsb%A_;kw&;LH&c(j=7L0HVtNkupE?QN38UlJr5208y^bN_qE%M zv36NFUduV{6T`eBXV(ZdMczvopgxn3ssN+m`=X)=X-`(YujEE%%j>8~`5$2HZ*lz5 z&6lCkK-%P&9#-*UUITBai~CL?w5b%wN6A%x5P-j1JGk=?h)v4LE(XJH%Cy;OSnRA* ze6X$1s%`(t9G~~!r(ml6&ZQFYSH2e&{j%CKGou+OjQf|$3EF+~U)KKN^Z8?z)S0sR z;eVOsf>vz*GXMW4vmbNmFUx*K^4(EQcp_0pwyZd^J*i8DOWO~B&Qxgo@F!5)rSBgg zx@|LM{yZ-BGcpNj=Kxw9e@vqYw|OWvJ(FStc2}CK* z&(CYKTwETl@bU4rx3}BZ-(n1yn3`e~Ppe{9Ajv-B0#c@s^+0s3aaE6R@MW|rl5b@+ zW6swHbX1<0KVt`Kj3`uO6~UZpcOQQmb7I#(>G+ybY(lS4F-OcDna<*(Afsu5Z_cQc znUP`0Vf|5AD*^Atix~MlcllCO{V_DNW4vDL-I2_~9C8YpmCd|Dx7P-3@7h29PHCRI zi*C5d?QdpA!okAQaJ*~48=c~Tm0n503W-mg7m)yNBsKL~cARd5?b45@p^w2Am6Z`{t=K-pXS)gFL-2)Hzs*B_g6qhdlrf_?p* zssq3}wXrEJep#;_&gA3p$QOyO_Ijn)A*P1X7Jh3y?Pl5G$75~9?7=0@qT6^gOLlLU z_j*G0Tcn3W)b|~k7=Bw=I6|Nm#;TZo;O<$34yk$3Ofi9?L?K;1hiGZ|QN>*!JA+i< z?mmA*>3(|)3&;mZNSzN|Z%r$_y$>^5Xg%69LxtkIB?P&CT25|d(%uy6f>ge5Ep=T{ z?|n5)P>aB0$dO=JehJK1C_XC-9bMhd5wKhUzV2gEHvqg*W}wc9rj@(jfZo$$l>^0+ z!@~^@p4L_4V!gn}2NE}N5V#PHriei22L=XIPk{0YszvI6L$lqq5;iwCm?k2Uh>wO@ zf1`sT{|AWK?U7e>Kga1H-@A_6PAIddmv*>+Yhki+zyIi}@_O@o{rStGqJ@+CYZ8&`PMuqqFL6|Dutl@@;ipM})&H^5J)1V>q65A8WBWXVhz= zw3xUQ@^sE8j1zekt;}DRun7lOg_?69E4BXYa|Rtg!C@44(6sA|j}vk+8{SPlA=-S9 zD>B&N{ki;#ub;m`0GY=i(MSHcFFBv^Qr?(V+fR{@wX{V`8V{#T#6Qsv7&PX_?iXk4 zjq^$h6K%MkkA@onH+2-cvVPRo4 zOdw!QSb?LYvH?Hp#WjZkeBFY9%p;#97$LcvSAy6M@OqFjC|(H@w{ZEq5sJgUa6Voi zY9i^JOtaBwDy5%18Rqdw9MziZoAmEfzZSY78YvXSV|8dv$8GEQEWlVzezDD}BhIMo zTULGluJl-Gc36zGTf}~^iwSx*?3;XMUbRwLbVw2Slu~KM&wLW;N=Jnn#qM_BQrz}- zC2H3Gg1!Nd`50_b%%UVtLt71g0>a3gX%^1atT?JPO!)47Q)oWkr4HWauM>s{6f@p) zzqjDk{8l4eEO9(Nv-+_kr=qLq(3ZuC6sEQj_f04?Z)frP3%0E4QLQ94WITt9k8dfG z+HR7;26nf7&Cyy!y3i$E1z=NW`AI*Kc|ycVkYpUc^uh^(2c}!0Cr2&~$2jZ{Lpb|6 z2@$Q8eJMfr^7k1R{o*3#`+8q1mtE|l{f(_luDYSE*{YFr90v;v;dQ58q1|)xsWs*I zun!`P4YcUB!(oUeI}37p3~N#Q_Gjm%++@pabEQ^W!cOTbugCT_p$HqD`fPr04b05U zq@?;PO!^-u8la@W+^6atHW1<4i!>@f_FO^%o;@&em8JtTz%{@x*38+eg{3hKv~SbP z>gp~v@!D#Jx$p5&{9Ra3aj?ZW7I$a|IJO_htvxj=NXMP-|RVgP+Ciyr}0E(EUY`F|n=a&&wx3 ztu3Kl8egq3tm$S>Ny|aqC9gE`k$k&=zW78sBznplo7RMS02_N!FIK0CQoy}OPo}V` zNFgdR=9P5M+I4qPe^_S0NP~e*^Gj~D_`_czunpob%WDVs=LcM@(6X*G&$D4lT1^*E zGxF`?9ucp)4x-zc5s{zuX*aX^8O=lnj=SqT{%Y%iPif@}M6RwM_*^L1c8hm=Q#)*` z1{dmV^Dl4H<}YW-3X951AJ+ZF2^=c%SYi?jQRTiRFG<(eVxsT*4VZ>@8rEyS#K-5^ zg#*|YfNwc~_yH$!++y$GptV|APcN-_tjr4YX&r1Ha6(s33p$2QTfHP9Az5PdeFnH3 zZ0-MbpuJu?4hKAyX{r1?d0XrXk3KNOJ*SP#+Pj~O7CnMtT%g4zLwVy)ZJim`?ix_S z8z(ke>P)G`T1vTfr+zr?rD~h7x02uGCuh8FbBL%U^P{>(wpGC~O+{RuPP^zhnf1$4 z#=!+eIsLyiRdT{)W0x!7dBfkp@+iwMrD#_}vJJr;A5|z1uW%w|v#GTx0HD!$f~l0Eb|6p7iKKjCyjio2P~FUG5%!%bdbP9FFNy z)7R(1SXhKJBGZM!nYy zT+96MA*^_(+1IE@yZ-n9`fyX$czb*6$PWYbB^%O*G(k7T+|eh<$P1c)?xdbOnj+|S zJfQ=`!ZDocb6GjmoILZNEz8Mm2_rL6w8>yfmiAVkl ziLM;k6*7st#@p-rcMtM3sx?K4d`788luzoA=gM|rX(m(Nc$apPT59pJ3KY7HMlKqghZ*@L z73Ecn<<$s`iK(>}raOW>N zvZ_8OE`E z3B$x@RZ}!Q8rk%J7==b3ud|e;P8~v9O0S5I-a-{Lars?ZHU+>LZz>hcC@^zShrj16 zeCLduH>L*TMfU(eBcn#+hnzPEHyFfjg5Zt_J?gta)uD-C$x_n?t#zAVBoAa6vCwLd zw#_ztOm4;eSB#8|9302a$W&BRV-piV;(D3HSLU0SX+gkI$BgtDi;N6vnSXhC31nw# zI-Af+^E~eT&}fxyXcX8wy*YCYt(gkioM`|7`byo&D5AmJA3(uuS+tiL$}q981S-YS zpwx37xy@Ii*WuwRv$DnfkP$j9c!G^O-KfH*x?<$X+!&Ne z>)vo2%SOP<+0anML$b&khE>>y(l_`K0B?UmOJ$>yiG zt?t@Ih-~V(dc2D<_ntxWG{ zRMq93#iRizPmOnH2#FgbKxfVVX;**}qFfo32}xis?a5+ul3aQd6N^@?a!z?nX8hBl^ve=ZN@0byyv2{en&%f z7ssUNOdkkymGlsmoYNC)Ikk+-CQiFq?cY$nK26~@qAj+V*>M+UX)8=IKuG~TCu`{sCkYM!s$U^QJa8^iB)?Fd*g)%Bov z(m?hyjM=%ldWXQ02baB100Yotf3E)GDr(8V4+wtvrrtD`u-mDZtX%{>oib`!>;JG7 z69&+t3@h*kFlIQDb}TU%%vAu^(h*u@#70)}5Ta;V(8rJTOc)?cRKV2*_8*owD0aJU zW=#6oFCzSv(>QrQt;$4tC*YP#Zk3qNJ5o|hSRw{ZEt-vkYog9HO<(7{%*eAee$^Is zJu&8IfQm2`SuAZMbv2H392y>XmBOwKtD}bw;9Q9qA8$+2qhjbu}{= z%P5{BSl%nK+_T!mEO~ES$L+5gb=)3XgRXWS&}oKm*8MctczXIc+4qH<72wxXiiTGy znDvLlNjaMGs1~3*ou0~rMo^EO(VwR>6tE{c>h!IBDsN4ibvt&IT#A^THlQzD@s^B@ zB_n#+X_ii8TO0TFoRT)qqs)olh$B zH}%$DrVrgtI-m|Yr)=d&Ahl%j`pM9E+?`F{-Q68{(+yXjU3ov;0A@!QvFIx{w#EJZ zmw0&2fhyOK?CqVMI3|td?QQ-aiqKmiE31sDk$3m^>{Z z%k}KpGaxSCrR7+p2=HwKWg=6By)@}?1N{7Yj4KRm;0S8Q0FHB&CPYF);_cfX5>oB1 z&JSrH8=dz;f`SNoBde>cFs!GbiY&Gkkf)S`gm)xWC!!$>1&Zu@CQLiz*p+&O= zZ6AZ@FRcf}>mMlcM4vnFG(7w-P^CXt*&hZn9a#3QjNyTtCXbv~L>$~r6b; zpu1i=5dOJ2$f#G>5{^wLmKhzke!yXjdgI;w@W^0B5DIetdkGD1BQtW(^CP~NeIA`c zo|uD@e#f-wGUXmhu+HQ%1fNnDZDF_LcXI1j&FT79kFWhMAM~DA@%eQt)rxwK(R%!J z-%Kut?P6oStTT(;Ngt_9BS12rY*ilei$PAf@GSAHH2*%mjJlP!0RqEis@3%DnMA*xK})yr}4Yv~knKjPTBHJXa>9vn?r$MmLIR)#5MeCb{^3NpOd@WhwZ3EH7Ee;WZm<7UU^N3-O{MhyRnU3Ajl~ML%5vHUDW~&+LIIV*d|h z6CSH$^hC}3zA<9%;9TyaR@L;`q|)2t4`6T`M>Ve0d?r`Sdx!!Q6FR6yYRFAjEdO7X-#Vt ziQwWUowaG*SpM8yxnv=_B=j*Hzm3=TFRm(9dNRc>9%!qz!pA+;=wbti%w#?X-_M_; zqoU6DVFJgB06Yhj&vM(!jWYHMYhQB3ZZ#hL~6=D=W)%p@&&8j{adMVQ!kheMw!CnFni3gx$F)kKWrGgetl`IM&y8>H{8v&=S2#L!z6U8!nN24=1B}jJY;rj_j6sM`vdi^|HmvAz=Xk23+b0JUKoV1uK}DZ2(x9nBw-~QU_3pbh_4N;TydY zAmxB&t;WE~sl*aDYq1YR#_#P_k5k6=M?SHY1qQ~Uq9$V9a_Xxh0F_{B<8>nG-FNKP z#DK?LKIDh3BNLFd(Ovc4vwB>R;&l!qfo|6rkX@?YAu{>UiT?Ec{t6ZGNrpZGY8R1F za5GKKR9F`QSBL^zx%k*?Lqwb}3DUM`vAaV?wH(&d4DRQOe)6(~T|ymm%zqRbG}zXnw2 z?Os@T=q7^}@jPse<^s%q09^#?((mr>g2?&!u4ZjopMdyNQq$7p+{Jy|=|N9XQ2_%X zQ+|7U)WpPOYiq05662pXI5d+5a)o3XR4+;Q|_eYKKr|y<>ELth9~Z4fE)c6_@`H%s0;ND2*rFL zk`4Okz3^R$Us&$boR;=eL!n<%+E>}&{NU4{PHC4Mll$g(8@s3zMfP0e6~v_x*hO!> zSpNmLhya>|#YGa>W%l$B;ex(znu?0K=oN~RAiZX$-8gn(ti3&|i#OoKTVhOrU*r$hyoF(l3=X(?Ycc&8EZH4I1bOeuw90qC8$Q|nl;-LRbE)Q2yVhV( z)pax)x@N}Wad_WWgQ|WE3wdoRamDUx(G_wj^il?7(C5;TvtAOmu+mP2j^H&#=d9<= z-JNnye%{%v_G*KjR2(uUo#re&PHS71d8ljN@Z2ha99zv8)ek=5%Nw(*akC_OxGdjX zYHaRk@N;R=*OvX-}}8Y%Z&AllnaeAD`P?ot-0p%77`WPJ<&*1UQaGhltZu29~{A zMQFzhY|vi`oPZx=EfWNKojVHGHaPfy$a)K?I+iYKuyKMDG`JJoA-GHM5FilT9fG?A z4+IOr-7UB~L4&(%aCf&moxJzHnfd>_SggCCx~l6`b@i!T`<%_p$oL~G<%eV=!LtnG z`2`2uuf~^ZheR*G2Z)2YM2%B5n$E+n7Jjj^TyLD-ag>L`LyNq-oJji3%ERc>l6ES! zJCw&EUP@^e*nm7MoyWYllJ-K9=h@8|v!;_I^R>rbOV?LwgEP^Y$H9YwGVS^0y9zsn zEneDfmWV11hu13c6;BimUe5kOS?o!`D9aEngHrOJmx1Coli9VM&IhQ8ss1+ zeXpQ9c+6;$7256TFCs<<*5=!6-jMaTBvsgm+r#7Y`tq1LmUk}B_m-hGJx=ur|L~3f z#X+W3h+sW4kztBjYvjLn6?Y1;5gg6LS7-Vy=$_OCzgFu+=+*KX8_Z%t_xd%yu+Jm7 zkn&j1>4SlY=|?@`cwng4$_fegJp>*e-oU^BjIvs+xAQ$)5ArBlUtdpFLGAqg30xp7 zrJy#Ex1M~_Lf*S-UW#@SLV-`?iTg9t6L+)r8!65(_W~C!{xI}aCIkYw0l1Kp3){HK z-iW<8o+V|Yo3<*ayA#bDe&?m>7rusAwH}Y%f)}9B<`1pkqStzDSGQO^$LZ+EFM~$3 z-Nm=;p@xn(U>c$*Y;mE0&2Guuk4i79%Dhtye&ZM?QTX!jn5tGf%DDDwEg}W($2wBd zcX=Ee3R}@kPPzAn0n9LfLzx7XgSh(FlM$%=qQ0-x$Bzx6s=*g-=)Z>xRmnxhheM@t zMcZc1+Z#mX{116MYA!!wx|j#8XKE;Fs}^6iP>Ws@(M(Pl9rNim5S@iy&R9*bjv*+0 zbE7yA#&n%RpJZN2ZS$mOI2eeqddnM9h72`eSSQe$%<^FTbIi^QRqyeR>eA^&pZD6# zR%-Dbc`7%2R4iV(&)LL)eODMa%_g$R(+nEP!03vc9;z4!c`n+U7ud zZWrCXi~Mj_mTRD5fn(!RL&FJz0uKyLlSZKSpRm*$)K}q^-{S^ z(*1q4m$i#C^__5SRl}#5y+f_|nfl`44{V}Y^U+)IwFr@Dp8(M zPu+9ZEPl`;-_QOliElLVfTWh4=FW6#-97BpkAQp)X$kHA7bq`#B)6P0*pw{{Ib-=* zyFHYqhAH%R2H$zz)Vid8b!}`#qo@>n|OLQTp%NGxK zjKLGt0a7DbPpU=;#(PfW$-P~zs;KxiJS^yaf7u&BsCEzO@9zf_|IE*8wocJzczsJu zOiWE(D%IkNs|WR^t}ZXZ>_2Zm(E2`SJU&B`gXrk!KqnHEa>>2G9(&k*etP)0-AxW$ z#^m59DJRj`KvHaNL03M`f8Zs7czq2K<6>HdEoz+I2(17qW{O~$oEgv7H)_rK=YsHI zgoWjkfG9wu6m`#|7U01Puczc+6WY;RQ??wH%tT>&~tDf2RWex4Wj#-s*VX?0~t5Zls z_Sc$86$$!t4a)HZ$>DS1RfSm8OwT%v7k`=!@Ej0CqPd#^EgBl~gI9toSE&^V|nxVX1+*ySt5R z;a4}R+UEj`3=|jgMJP_Mw(qes$DQNkL@k~hCWD%utX=2F^JthE-mDd<|G2 zUU%cj;pP!Pt`lLcK!OPsP4`s-3?Tn-*7kK!IM{S9q+w9HPChMwC>;Id%g9;)>&|&3 z)9)`~Y4ld*WX)esnZ{pvVc=2++kJt#i9RN(BmVIHr892;3#07UImh?8Y$%r?KQX*e z$_2)|-fmxjz3{^S&V?x2G*?Yswh-`Oe&SVEeV&#!tZ;cSWpDP4K9Dy{CS$v4cX0n5 z$zfLSN;u`LZbu-%;-T175$$`#%j(JR%O+yByHHv1{E9!{#$6>0`>-j>nW3I|!V%bW zq#NV!G_3{^Gl%u=FMQzI$?A3c2~62UNlA$mRAt=%E%^WfQg^@**4pZ7LLsk)d=>CJ zDiV^cqGCLYDkGO+H{!%}V^b5o5Ttw?0dCi+siedTi|18q)F)iv{`I(1fm7B4B<)ad z{z#qlf+MH9+VFkE24d#KV=5o0C!8$DM?B&#WaT>{<5x!m-z-&kAPM7_tfF&sac-Cg ztNpgNQAI5;F6YTt+@24x3<{(R5yz6Gm}7IEi!7F0de@$&Q#7VjkFwAvXf_>Rw4x<} zQsy{zT|u3j<`#MJ{d0DaZ^cd-nfKxpWp1;+#mIM&gZc^_M6STcXkFnIM;wg?1UJoG z#1g!+RrYDma729EWAerN4+@ACXejF>FY3{Xk``6s99wQYFh8YS?A0I#c5t<9D68v)kCM>ztXdu%dTyf>F;tbeJJR0!D|d4wG{~_ax~AKIN~~$Kd|n z+NyOsGnA7Xysw6y63DO{&z1zSZWzC?FeGttacSv3zVrzemMf5pK`tI#p~1)`XS380 zBb%3>pFbl2QPPb{O9Oq{1A?ZcU6{iy_zRyIym;l!lKfm?qtpq8(KpiIZBUz?v zS)@3#?XH=^kJK5fEx%!Jz0!MuEg$z~WWt{}OTr2$Cr0_hMKr9epTPQ@_3mhKu&}U* ziJva_-lK&~)>?gFVPToj0%YV`z3#q^?zkQ;aDj_Uib^4u)jh-<+}Y1QO982Hei&ki zUZDxXRu+N#pDz{hS&)XF){H~P?#gcUK^AAPwA}QY67;ZJn^x@<;>Y~<02y2E@R{3);TfOCfY325OOwL1b$&6MikrCp+w9!W%j!d z1^#yfR61tf)6O#=n26!T5Y=L$preHzNbO+%sSvDH=ykHs!-)|AbTlFdy%rz*-`oDv zR#3|zIdGPQb>r0L+tPkXTvi<%*nZmK+Z<-XRB8KPvE5Qu4vtBo9eyI{*G%(j9f{U- z^Ufc}UgB+-xOd`eF#IvqA46PT-`?Mo2>Z0GSc8VVxw`Upje;3+OZLrJygn6an>*O*8%zPF11 z*DjWH5*3pa6%69fQU8^$T$LMseG0Ed7xjrp9qnazSg&ww2+kR8~apR2o+bm(D7#q1u7$(A7Y5iFNbDO zq$hA$G3Iu!*SANi%TnOV<-HW6v6>K$sVL%_dSrND*&fSC!r43lk5u{*>Z;vleRP|T zJbZEnX1qj_Rr(j-ogK>GF3dCFj;?rds%c}b@IOe*maPBGs`bQjA5fURM=zb3^rQc1 zqyM*Kh1BNulzwmS){0v#z9r8dg_P;epDZtlbTnUITsH^IuvA%HvJ8KD@4H%akpB1* zzrY5sAPY)dXJ{pMwKP_SnjJJoEFGh)VCxa5&2H*D!H6wnS-TJt84}i;aFQmFIJLx! z`~1uCtVVITs@)hC5dHO?qSzbcrpi!L*>$A+2$!a05n}uSyH<0;=42|PXX_|2`SqOH zZW%)>vqq+Vwlj`=X2iRrGtc+cV`7Q!Q^r&paL_^ILevhlQ>{ znwgwx4Yl8`rOYm8S4XSqMhe=zeXT#+ao$ZjDF}nf4nmQ?jdXXf$TAcH$)AIAP8y<> zw6=;eUog#RpBuS8-gcWkWvBm`f&7;IW1IWAR=S;oJx9(~)dHQ_Xw$KWaFgfw^C2f4 z7(Z7hg}034N2=Vp@NILMH-|V-M}8TQ&4J1Q1o{TOkhz*(yJyQk;yd)zh(Uc&F9GEw zm+SfzQ;wyfJwOBl{E6PNgaQ?+rz86-3#yxXyVWP{ns3YXL9a6?(@zg$Ni7S-HjoK67Gfb`Q^H+QLPMKs&=sXi zsZ4|ERDyIrj5RNlIJt6Z3)(1}Oh=yI(>B)S!2mK7XxB7b!7ls)CINv zn8{KVOHC_@q*3Li1|#3#f_JpiV^>L0`On_3obdK_vQO(DW+^B~1cr*nxDI}E*s2Iy z39jiZv|fFNY)iU0VYJ_SOS{eQPEYdv48Qo@zM{CJ20duHl>EvYwdam!H1+X7*YwpV zB7eLgXYO%JXL@_NZo?u8iuYbbnetL&b7@Cw*BSOl1$SB#mdrzPCcwAHW{8BIA{_?n zum_lj^|m_{p4~s%RKoTN7hsfPJbd`%E8seS7cgw`tpyT9T#llFZ!Q^-eSi>U>^7P- zmUVe7JdUS=M4z<8jq2w79~VGL09xuz{UlufU*W@7j& zhIG%w)prGZr^zFaqxE;6BWjf_cGPLpz)a3|hs)VbvlGj9{{fH32Q)gK1P}gjQ3`i= z)5${)z$Um%b7{v!%?;^_TP}9MYM?Fo^&SqpKdJqlY28jJniFtNtPm3Rb?#T}PCB-X z)9`{Ul@mfwegI7dLU+;5XzoYYa@4bEv+ZQfS?eN)2ar8p!^<(X?6*K+#fG}myD$n} z@zvU!cI32rGu9{6@;gni4R5Rp4O9Rcj2KPiZa-#;Pn&8s`O_)IpSMcZOhBGpruZZi z-9T(RBi+Dc)?U@+L6gJe=8JWlBC}3kUqSujSq_w{k;AaB4T~0${L8m19g|ogx28TQE4X6nAGpm99E;_7~DtpxhhZVcx(v1EQdml<0y_l+ohv| zNV%R})OpUOUi+lKbxmtE$xO=qW{U_G`;FPSTriwsK3x1dC&|2?j|7Eomuqu5SmhuK_bs7k;yORh-C}DgT{~?kydBb2O~~P1V{x}pJx&WT z9wnI6>>TuvJR+$ojQS!WWAv7q9U8H+@U~wVb94bV($OX-2P0L20y7pB>eCNxM%@hF zS3gnl_h;S;g-uPMF6u|TN#|0{_6Usi@gg7~X1ThaPS8K6lg^&e&OMU15;nY({cu;I zKQA}EpIrHtK?RHC^D+uv$ZWmgNVge!+SJ?kdJPnJLs^cGLL7MRpBOTFBvVzxi!FAb z?0*I@zV-B#-Wtk160b{fB6Kn}9}uFpVVj_oex#rgpm>P2xXAxl?JyEVs(|IE=Uq#< z5TS8f`x&aG$>p`cx)@7H49x(-SAuWoEPovbO9gYzkNgaaACmUY-vPwQw)_lQ1f^xR zZ7xwT-%nrqXjd4X9pZ$Wl?#JOcSf<=o33HC9}(tW5hmVTI&%2LC2CzU+VS;uM;jT= zPUZ+kjMz-hjLj_!*Dj}Y`tvwrTNrh2B|3dNwKv_NZ71BHBcng6CA%}Q8)NDhY zzLFf4_=XGdn}t$E;-GBttX-h+5eC?>6%Qs57W5R9(@6Uut@4S5nCPK#4!>$~?&iQm zIa*tTZWM*{qnc({WEyJNdn5*D`iu90@WGuscUxpk@=Oy46X{8gv}*frKI!9O)!8H9 zwI2_ey;X~wl$U?gWNjp_<8Bi-kEf)~=!#0Tpr*%Lv2Q+|=*8#!R;HjzE@Xyj-u`sr zA}ro+PRgSDOumk3K-x`wptwk=V%B;gPUJwCxjTqbFUZm{rpA$YC(zV-BFqdF(LtDX zaT=k0;#U=rk(q5s=qWGD^Oy6}EUZQh_U!qZ82Y>f(!x2+}bSBdE3q_RMMe2@Wwe>Mys zHhqxgoYAkf5Clk@@m4O3NR|qngk(|0qX{T-Ra{+%hXs~^K7UjNQyuLsyt^^B>?iE? z%`=5*p`K00{*Wjzn78PbjM0<#a#`t(JQ5C22)}KeCf^n+TdJGZ@+K~ul1V`c#+z2o z$XyW*8!1kfS~ykXXbHx&>EY}f3kfnmwqk~0W)NW=9f7?-NeORf|Dff3Y2K^L#D=kU zVz~q(4QH+9b1XipT!acW!CG#;*!X;1g*S^#jNraUd)vtpkN?^m7n@tYD?}zW z0pI=7OC?xDEa!8#SV|~3bm3dE)&DrZCGS*HM_K5mvi6{X_S|UMoPiAF%r7&e(5$}+ zVwcBdH}H1}Zc^I3S|%oc;WSfNS{1g-F!2GQR_)^iF6T+yz8#?mG5ks-%`+Bz1q@`2&@;a!*_RC9?QZGX;SzePXXn28J_jkvLV31eCGJ33CFKc&-Q zjB6%VZ+bRM6|Z0ym|ik#dAJZ(d^X|ptg#~OQF~{>Nzht0g1?-bGCG!C-$mMDTKlPs z`)zEb+0lR{F_LswLDjuYm5Z&h465Bk6>a?_b=+R_4Aro}+K1MkB6oG)Ti+UYE z)=ud+GB&*vy|hhNup9x96|E(l4a#mo=(_OvqNTpg}N3WrFG*$Xjxu?7R3FZbqVN9wyr8(^>3` z-azQc3|4S^H~ni72Q5AA%5S=jlJ;aE4*||3584NA&v9VyNT@cTnQez;^HlckZXOQj zW2vIIBdA>%Av^sJwkd~GXF|n2z z^h{0u&>A>iW`?)d>O0}&S+kL-;cQgUvyA=m%2sYRtNvsWheW68doKe^f7`|A(*QH` zjK?`n@sAACeE~1|jB`2Km*>=BCu4=G6TGzRA9%`X^R`dJ^mYnXnq$=aEv%+0!H3a3 zrce0^%0hmA8|mvMFq7CkqU6+-@*T2TYaMwJIIX2#wsL#5&%}@*U-Nltadaj6*t|&% zLQ;cZHnKGQJMP@wB#z#h>q(%a>f*u*vc6fiYDcxRiHFxB>-}lxv&h5s`1a6P;Cn+s zCaGZCt(CW44BM9b2VoPbLwH{9{NH>+vC$>j%-xI;fKW%q zjQ6;Vx0y4Q@(`#l7AA8fBG9gDgw9!vsj1FKqbn)QGYN8WF%X~Eg<5d0Gac7*;h&lM^%Xa|3rt${u z__)C2;k1^IgY)-y4cBl5s=<+cUc-rkb_hw+QL4o3oP=0)78HI0CTB2 zTPQ4@3P{x78C&yN94N(0`NFlC&!M5ZKMetz!4}@kZ2?pXt{fA9?N1MZn z);OVn8zeX-P8k^~31$ z735#|kByIm3AL~C|C|N?3x-|(eAkBQ2L$Wx6#3Y7);%v<9GDR!`bXao2PPHFdimb> z5MnMHp0?O+Hxm3jNFj_TZP7ZHVw^dcst-9U2|?Fu{p?~Z$2~-7&N$G9U3Yccb?8u8 zIXTA_E?jL=vvf@!2(mpMR^h&z+3vahdz-`MmbfBn2!J2pQSgqVphctkDk`1dtE8NQ z{fCs@JinB52*ez+G`4HjO5?=LGK70``#jg81k2Nw=DT#8l4jO?@c6LNIrcuuR-DvY z5H73^VKR+Q#6Bd|5)bh=deA>o*Jl1VxJ z3x??Zn(#H7*z#gGDOznLu*DKL??fJCkJ+>DBmZ(qwR~%rLjCmF(`>G zL!*P2nE31;J#abm6MZ%<#5pMc0a1knia}m6xcC2h&yxJf<~Z_#&k*qc6@@IQx?XRz znt5H$GNg4UQyB}2_y*{zg(>F1gi6AWHOnto=e2+7#E~(F`yk5Jb7`bV=%j0I{(Li= zCztS%FVMs5ey`vU3jb$<+&N zAQ}@^brdu&H)R~|#kMQ|Zl8j`-`*%XjIk}@GHD4y>!8O7FvJz1aNzpk%`1&^%T z;$~oEl(V<>VBQ({f{EB)3IxaP_Avf=r65RN;X!R8`UB<{^QmmUOwE!Q5(wpNFt&ld zY`R04lRtlC_^2rcshksR$}vg*NY<@7deDTj^Ru1u9TWP#VnC$B+S+X`%P;sR!a8Fq-_5 znR7QDDk)eGHgnuuJQ#%>aUIOM41mY4tj51E2qN<7Ad8grEI50FRjX$owK|*awEkJo zpmHz}v!Vdb(|9Nad=&VE!8pk9mV?&zz3*LX97nw_z4>P@9ueCqs?}Er99n!|XUfTJ z_oldF%9H5`{|;Ai>^TecpJ$KM9O>gKGT@8`yVT--u~7Sm4hMV!4|WJ5wvUg?ru(HX z&6jKRhPZ7rY!txfVj_H%F@m6GYv*S^s*oKfh{U!;EN%wfBp@(F!TLG*|U}VF18GTRI9;Pho%d`KbY&^5$1doG&&#Q+BhL z<2r+9hG<}ffw$*-rDp5D>rSC!O}>yt3&nwYc4oCF50>Si@CDI(dA8~AVva-5GD=EO zQBet_kOY=5QBgb`9M!e8-p#bduF~CjdkDvGT7D3oazF%YEEW^2zCxbcSPC$??D?Y7 zmmB9dU@#KGH8Yr3*-MeX8?S_eyWrXOWRmCo*c$_k4hrLqG6Nv{>uUQmo9o2PUF#Lp zZZL}XDd}qE^Ta)I?LhF~>98*``K|@fI9t#7#o(?2WU|lM@ZB8kSodTV>(Or(=)A?g zBG}c>%@Gfk)oWdM4pg^K!}@#k+`BEAbnSV0c?AUpDJg_$iU@wALJvc8b8{0DDkb+@ z?uglZ9Pe7`vjr$^Z=Tz2&D3|buF~p^7Yb~4LAF8NkL9NdXg`w;4x8bG)(EJ9$q}2? zrw=MI606@CUQRw>!HNQJ=g%+oe3yKmEh_QNBdgmMH=k)dM$>a#!+Sa$QtNysGd*aD zSrcij(L#ROU#9Rf(Vv6Dt6}qIv({nq19(u&?$f{Zf|D=a=ge3OIq;UIF85f?&)5ZP zhK`KBSXrUITAwzmah%@w* zOY21Qjrq%%oy1`%ff#aPKU-r<{cZs8ck}ihe{6qp@!e5^D3Q0c`J~B}>nYG-OfH}% z)?G7vsDAm)y0#K3R99!Um3H036b=|JtUg(=3$R%UvB&)L&}F%PrHJj%y#Ml^U5vt? z8$=eBlGuF$Q$%Ot$!dRMxjzkt+U{s?cR&72G>f{E-4(C-)auZG(rGw><{KW6fXVx%^|KvE6prx0y)fa`m|s6QngDFSoiMW%AH&A>%msn8daD zDtUeOu-W7RW>cK%f(=2UxaUW@cA<1iG^gmzgQ7S4k4Vi4krp2{8RY}p5VIyRCT zrQnRC20aEsvBf;(rCio?mVjqL&f__ntjL0r=S0B$l-N; z!&Eu>&EC883Q7Xr>2+}_>0cj_E|bn%uK3B6hJM)VQmosBGZO=QW974v2TbVs%MmI8 z`s1;_XrQ=lIU3WJM%8aZT6Gz1MResT^K_M?l83`4WNlL}@MA{3)1XM#nC8>Ax8Qgf z8bHR}dcA>u25eDF+N~J-@^7u~%M;6X1KB?=3=ou-hnX=a0V)?VW)>DWaZm59YGij! zlY3^pAFo`jA^GmKOoI8tDVIeig0a(|vrg&_`W~5Sh_J9CA4UCoWKS-_FJS#I_f`^0 z@aAyC0Y(9s;i%NszKiW{0b@^=+F~Zj^wp)wAWXuPek0vq)fwEH4J<-=4P9Ht!8@E6 z9-T1m9A)>N#k*6zIyXO3i6S_;gZAqV=xp<|zyvkSUhi!+sJIWUx(h#==b*pM%NsZ{ zC`O+*tX)X0F@KbroSlRjCj^tk=wzT7vbj%lRmLS?f4RC(wqOH3|9Rzr6uKhjXdE4W z_e%n0C)6Q+^ivmo7#Vk^G8zG95QR}D4_jpvFDWteI3fnR&r$2cx;U3OHP7mizh+^+u&u;5-j)c$R( zO3-}1=qA?7zCIy0=^n=}7u-TmX1r-)Ld^~yCUFt|v`0*AUF5m(xV=sj?&WHJZn2CuK&BWmijWyO{>$}xU<@-Fp$Y;u7^t87!`oe6)cX2Oe40bN{B`Eg9xtt#r_f-&2C8T5f(C?WT z9B<5R*c(1%310r1EznMpN$K_daLJE;NYmzc8r26!oyU@H%Hz%QcmLpBSey>0%!S(E zL6`N0O@j&!K0uKiC4e0VBw$!{sJ< z0GCmyTKNlqvdgAn4PJVuldL>89N-7DQG7YN@vBBq^kNxim8FRu9uO=mAc@Fa1WQqS zofPGTqrv#42gwl2Ut5s&kHD-DT$_}0o4sPOQ`^% z40M6E`>44Otx_MqaY{Ds*U`eLwuG)UuPMXfFQDkWS)7a}>#*&us`R`GW(kcOQ)rIR z$mcVTj4Z66%?k-E`^m zREj#Po}5A*2|sRyTS1zWG-+}iAJBGB^*XI)W1fazf17p9E?0&}Iq1r(ak4`I9ZR*h zwZe3uBR{#k{B)G&^f3<9omNa_&C1Ie+Xd-k!;LJmwv0MnE3SR;dO4;gRnr*lBXn@$ zg77WhK{$xVk%M1hejwi?M)$~BeuNm)N z>l-jBiTdAzST5oSbGTXBzx%y3XutR*t^3@-6#~jAQlBgHJ+c)vse+;u7X_QW*MEKO zkHTA;0O(ZhAtb+q&6=!gNAx3ry8$^{peZe-INi~~Et$cj&w!tRqg-Ej@mkwI46b3B zow-V*|3665a)n2py9pYk^p5=QZ(k9~oxzmUU^HX$3Ks{*#nlzuT{ZBx*}sc!`ouPS zx&ZptGVI^|*Izfp6b}!tV3>2|AO6$-%OfJcY%4Z;Zud|m`j?ajHXwxb2KGPH2GJY) z7byam((PoqnHC!<&)AqZuh2igNI4YH5vfR_ zqx+4^_1fbhrheRrTKS6HZU!%#)pKbJscD)wiSVAPDq$Gta{PAO| zIBaQ-%PQNkMu+_5&Z^Z#o2OYq6j%Q=c+r*m{1dJWHt2R1YE?aOrd!{bSp z)Np=Je#55Iq0t@p1w5)A{&tJrUtDLeoZ)pZ+qYutOgtHp+i|On65&2A)#*0dv+ecv z@Wr4A<`2auK_o;sd+2R>Q{Z-M@l#r#oB@e`Bh<8vxJQf zrnS`mhlWzKBz1RT1*C$bLKX=_D{CJBI=J0&;q@hPj ziw+?Vryx0p3fsVoICniiwLiz_K2Isc7D{Y_o8Rf_-GK)DSQ*Z7-6B8fn@W8}nY&d+ zR3>WoT4Mb(fU787-RMdf`vSUjclvXNqX$Wl%MXc=^b4!J_t@Vd_HTx~>( zJAH|ZaL@04i;`T;la**3@mRAPg8TVrB+A-#+CKaXysE&Cx=MW*zi3+M*t-0%9HiXg z!X~6?Z-p7`{gT3Jx{n;cW5ss;Ro)3ex&K@$+^-nTSR9Lj0cg@ajYesELhj9umw&iD_>r-QPwj|2_T=6YKU;Y6 z=;4T%PMzx+%*0gJvyi4!zp1*jBLPItuDDjaZ#1523w)e^4pD~RocVV_-Zo)2IxA}d zuZ8N}qQM1d8WL>X#G*O~(^0W^q+c}Wtct9g_{uk+FI-Q^L|No?j%&R3NIA6vqT8p5 zwe=ow+o_kdZ%f|jEVZ;Oi{s7h5nhM!6X^yFD*bXXIX9{3O4NnlZq`n5l(0atp7CLL zUw<5mG%!W-WzbDE;~x@s;NI&!DQP$xtY7|JQW}%dk5#$o0BVZmt6TffpaXus-ZAB) zYg;d_^@3inWQwkQr7uxloHbU+Y765_&W3xuUbH)y{_~qkQ<8!_(W&0tc$cW8OdBJV zbA(0opO+{X%H0NV0CE;&G9U$Qsbb`$hHHH8AD{0p&UMNQ6fYfr)3>TQv2f?e{W6#4 z1{OX2caFEtSR}U9PT2U-Qnp{!2|NdVirJadO>ymMOMH{$%LfH-qt@Qnw!*s#ZkNs4 z?N(fNNt9sy4d3bI-St9$j{do=aXVZU_QvV=m%cs5D7Y1Fe{+LM5!en@1`V*K0(xtG zbvSV|0I1GMpyU^dKyb0NGIP1!AC6So!1=QN{-TOo32g<13_Dc5`82RYasI|};8$tE z(p9$z@o==8`^a@5?MS>>ttz^-o0kQQnzhP;FDc9k*Dd(JTFIl z#_`=wcO($)NKT)#n6RP^0KYdV4YD&^ZLLk61%_6T>(SA@+q5!1oC27%bljvJa_{`6%n2D#kCHLl$dUkM??z65f9G673 zeC<_+b0UpPUfs(B@L0f*4t(O{Cl)0{;-u(=Q&3ar0~!$kyz33}b(~nIg(HF*KQM$E z(%krT?rAqV&o5vGb9%yvv|uv12us4i?cZMkgBLR0qSF5&Q#(HGjP~tQzU=2&)z`A~ zT#~%i%QVQf>(y`Tb;*l|LXVJ`*`rH|n(Pq^`$tx)6XlsM{h`^{~FwNeSs=Mo1x$j;* zH)h9iiTE<%vbP!E5YZqBm#Y(%(=z5_ht`XKJuXWEZdhe$JH1JV^RPf@@`7r};q*|= zS##`pJnH^0Y^oLvKf%y9kt;L8l8?^~qj-`2w;L}g`lh+R7La+Qbp?>%wh$Iz1unPM z89@7WO^LEvOfm=eY~HC8z?eE%TEUkE+8Db-@l$c1rx5gV_a*e&7efeEJ?oAeLzm1?^)D6 zm2)aKZzE>;4L#~0BTWOGX6TG?-5gM$`x&&Kb{_?S(Tnc-n-t?SsA^A+24_#J+%_JY z*H`ciYkm%ttZ{tPVZ77vtZxYRX>&-1^gXxrr`O#-Ldf!18LnqxcR>aAf`>Oc(4Lzl zU%ZIktgeq_X{|NZQpRT7h#4DpnILjtjcg}7eQ@h0)8xo6`O#T~x9CtX(57xhG+d%g zCVQu69hsIsUUPy(7`4#p@+Sj zlIW@NgE0gLnr+r%Y6jJN>&A333bjhWyTc)?-h|j*%Z*{C#ZvS!wXsVn6u`G>g=e$& z@ZIw@SX3@oK!Jy0e0&4wAHTB3sq_MKx6&d>d>uid0h}HmJHCu=)v{f_dK3`yd%~#o zSC4gN9MlqWy(NLFXdV`-{W$0XS4cmo)#lX@3*ggu&yddVk8V*DEqZnqmDHzo!Xku6 zr-7po8-cE{Vm5pa3@|M||S_CWyA1 zuluiL*xg-Tm#h9t@3#cMMWXZaQ}^Xo1na(VQ5sa$qXWxLkW1o0kC?!pSGw)@BdI+Z z#4lg*D=k+1j3M_Ts`avWDi%RGMDx+JNwg~%6aHW)^?8B*4O;O-a_Itgr~Gh9VI1DW z!Af9^U~4I#n6B5H5(K{4eNjVXB#3g+4#5L$S7SCLoA+1q6Xfv%9dL7Z2bCAAw5=aR zKXX51hf4wxAeZS(H3G`M#cp!*Daz>>#JjW-~}4P+6Qv*hhP-C@a^PeI8833apiYQstLZ z=xcfq_T9~$cLR>MICujPA@<|?{^=q^(~0$ex36%2qOW`qGeMQFh{U_{24!jKf_ZLa z@~Px00cd3-2q}PXjdp6A`=Z5jc7zr)pL$cnZNX~1WT)UM1xCRw`QLaQ8BLu(p7%p< z1T?4kS9NmVUQTf?#H{UUFbSxK11qtq0%u0Gn_F(-w!4qJ*^S_CrM}{HDN?FWd-oL# zU>Ag)d2iv5VzgsHNC4p!{b#crT?LN$Ai46W3x zR^;SK0wLb&N7aA&;++ewa${rf{9Nl^{oA`hjAE^T5P*Oa>2!n}=6~B_=MpQ#%&ghR z>4f&`;r|6}DKGD5z>R(XKdw*N*1Pz#f9A>o=w{2$t_g&*}yTHnc@8@kvC z-^ouzGl~D#WHfYXI^0-h2sFk5gd%foe);8v&rH*mw8cIytJp+anf||&0Yq}ugnKh6 zbKhY-@5abTMdB;u=VmR#qC;ykIB8MCR$dD*aA%ow&kbR zz2g&w)#s*<`%r)``*ibvWUwoOqyf%N03RK56oTAMs60-OD0)?q&YT zZttmLmoxt74okhA#b5J?rIu!`?F8dr?JBocpTFcW+P0K}AFHumEw{rO#?oMbKoCiJ z2SeoTG@>8XN$2yC77rK`=L|{e1DR|;pJJQ2OZD1)p6*MtXzf~mz`kxGX%b|I`4a$F z3*S_Sl@V2Gg_`pX{1(3Ld*M)+_jy6<#1ti)3xg&|G7e6XHm@M#RLw5LRcZ2u17;QL zh7iYK+LZ=QXJ?gORkN@~%HTfBZy_k?L!AQgl3aTE>{`)c88$Z~VBj(J=%-r;ep;co zrSp)XL~hRqp6|{-<1LoK_{XQYO`MiHcG5oF6d*{bpEN8CTQAfrZQ0O{Z{oa|%!%(` z?5g|F@rb1qI4!59^#TaoVV469*Vh|6%Jb!{TVVZsEoyxVyUtXK;5-a1S0VxCIFwoB+Yy-Q5BNcNts)!98g3 zZ*u2;-se5vIs9V!;_7Cqt9I?Z)~dCOG9JMyEU4@0*PQ3V@mX0ogm3Y1zs{wJK9fV) zL*^zQvf4r?Ks$MgJZ4zo_Q_JjdVXf7T$`QL>iM|$S_nz3Fh}lUcw5tUp(<@l%j?c_ ztUh*Ak>$^+MhxVTsUq!%`KbqgL6ncG1q&_Lvw%u5+^f|TfMmf}o@W&IfvJ~Xbo^d^ z|NTf@cUz;AIF8l)XMNR~*=(9joo}D@YHBG-u{IOz-|*qVk+fZJ4_8V;Rr9K>-AFMg z-5;DQHs4)J2wiA(8Am1`b-vcl2BM2~qNjvy8CAyw={0`UAS7eG=^8KAv#CnO}o zA$Zwo>AohwC*pU+ey4F!D&x4Z=KZU7t|VCjaY8N5)Uz)Sxl~a4AJHz5P!^@~n0dp%r*)HzEJNrCt5>=`x32CO6EsOGpK_#v*gGNZ&z%U3a@B?0sD z=<-H&@7bj7ClHbtunR(BJT{$M*?vmSCc3a4Vn48UE2_Y?C`ClRBI@69Zq1kA3T6VI zQVKK*P@W#@P0dblip!ic;Il1QXv`fTUnf%@x@Fb%o;Za_=0mr5Q&A1CV`K~%rE_GL zMSB{vgKPc91MyX+f|*51A!|CTL?6pfllK2t|W*qo#t% z;hOR#F?UmgLx!_RMEON}fN5dc=d2LS$J8R;Be~=X!27uB#3`$UiUme|QHqO?+v~FN z*@o379^a=po(mCieREMnVWA81DRBg}HQs(gAb||r5 za>1Ws=*zs`tew?G%&I3Cv=}6-_ms)fYQp5tSPn%`O=N&*QExIYbgfck;7b}-(cZ_N zFF#lf6?wOXsG!938jgo}2>A0&AISbPxpDe){hVJ^Sc6VlbwLQHMzj1js z7G^A%5Xgwc4-m_h$Ggu4gDeE|4cGD!3uWJS9eu}UO=w$36?bL|I0Cue_{pfH_>B6P z9^n{l_VXv3#XEU%0&y7;D9dQ#-z}rSS

nc!gIKY#fWugdVC`1c2?6$Y+Dw>9e(UT#I34GN3I;%Tw z2(O9S2&;*DM_KK4<2s@VvFCipbN5x7NHlgd+Fh2zUJ&%=VEpQ$qlnhi)nHIB+urdd zbu8p-4{~!alb)QMjOeLTREKFb>uhgZjHf)0@X>#0Xm6=?wYQ}15!rmcZ=PP_eJ-)< zgu^g7^~ZL!dUmknXrQ3L%eJR^QYWnuG(=b?)xOc49^;`n;6OU9b67~&>FWIAlTlSc zs`f-11Q4Y2BL-&gKlIFGZXkuKJ#>#G8-#ZP+!T!Jrar!Duak z2=&%w^#%u{2zuBQn~!Qtm0`VThdTH_ELBN(zlsnY`~G2IuB{2Tx4W)?YNo+i+xPL? z!%!PnTxn^hS}rv=vUul;r10Uf4 zqjvrXy`_g`5O+CmSNJnr^Mv;<)}r~;jGI!K(Fm!SSwP@ufG}BpecBPm8t`~Qs-_UW z9@iD`t8sKt5klL*Db3$NX+B!e8Ru#eU1cO&Widb~FSc$za=p35EPxxzSmMTP`rfia zpvf_ryXfPwUH3Lt71;U_xiE_bhu8j8Z7~==@Z9`a1p%|W*RQ_&-@rZ^ucBR-jIqp! z-cUqzzbr~RJKYe3x(QzRZ)=tf3=lfJoE7ZJgLvBXV~-WleTXX$h`P~HA}YM2uZ-$7 zxIO^>u~Ab~^Fxu=`C(-ICqPBBV|M`x$CYoIK>Z45AY<-1NQ8qrg&U-nA12%{L#^k3 z@Rl7FRGdFi+Kky{kn`Rg_q{y$2+zzSZ|RjZm})02TSa$EHTK)Ne4<&^ z{(xm^kDNe9BieMd8B~%sa`8N`mZScg&F)2A`b<=LtWVoW)6N5VOnlsZE}rJNt;~7L zS9n4K$zbbw+XI>W4=;7~YFgL(=u_huhX=9lV810)j_7r#qbSVbBaJf#`0flwmS=~* zYQDcW_ciV3a+~ur?AV4En$S}$x^hWPg%wwCu>@QS-vibS9zo}?m^e9) ziD0Ll%s%^}*#R#jR|oia@uR-cYfjm4>A@c-wHj9FBAHPa>9jOtvvSDo=eF!56s|_yDw$6{UYTA2QK@{LR4C{RUJI z9$e*XN^LAH^!cXKMrf9o=(W8O#R}W8!qk4Y#MWu??JH@^>sMfFn&-i=p`} zM@rX8mp=}UkCV@vbJ2)s`!@-w>H6~^?scWQDr4V+X+&xJ6BkN#Ptr!{twhImiJHsB zWA*|f7I{4ehzOfkk3yy@R|3RIOk^xSG14*1PuDd5T36SpE!I8h{LW;igRe}IYFGA_ zLVtBtJ)K{DJ-;NoG88muty^ny%v1((gKq@+o>X;nb9~vBa=!}5xAm|C;vGO8ba!Vd zseTx?Z}6yxikRY4#+Q0VI>ytVGVv2{i#hFzCe(`wrZF4wpz2KoMT`>~TW_bJ6);9E z{4K?GWKCAhZ@t{9EWJ#qwasRGZDp>3m3pyF0cXb37mtQa-m@Xe?}$D2$GK0Djx=y! zTTQVxGW*#ukjQ=#NO?9XnH%#=GMMkn=(i$_Mb@Ux6T-*xNquWohuEUey6?MOli&HB ze=l5?SY79BQT&e&D+O*)#_6mR&Hf#PXQh1K=kF9`sd>r01e+7efgJa#7J8@bn4 zLRNdVEQy@KfwJm}?ZD`*?V6~bC4aFru9K5bfOGC1WH$!}0g8xkfN~tP2%fb-jxCoI8u<+ZM*bE98ZMPb79os28wsc zM*#Ib%vfFvYr!)xhA2WBorq2xQ#i9tv0#scg;GPtJPe#Hjmu?GT=V)c zxtGiFxk8$b^Ni86JwZFQ01PqCaV8X^GEvuMY&AYTlTO(Opo;!!YFb$~)d|%@t(-Lv zBnw!7Vy4N@jN+{O+HjtdS75eFO%(h*;EN)9W<7?`{WV#&M~OYJgAj^p-4@XYa{J%2 ziH&oEV;_C^@W{qzSj=VX=s2&ZvG^Xf$6SHTR4iu$udrnnpR0_7N5`*{Mq;}AmKvpD zTxNqw#QgNr8PX58y*Tu8lJcU+^*9Ah)1!W>RSJ1~OEW6d+SdGkti5GGT*0;_+z}#Z za0nLM5;V9ap>YTvf(LhZCjvAcLU0Qn+}(mZ1a}GUu8s5*N$#CH@4h$R%zUqYopibn zb*k!A?Y;KeYuh!bvv{Sb3D|hvqSiN{rV}88i6!{rW0?TLG7%qjDx0m0rCQor>}SjT z#rMw0yKSH_;mcX+0e{w)To<8`HO0x-J#WigB`4*TCr3G06~46PPQ+$BRp%{oSj>nR zpfLGd93ja>>l?=SF^vLCB*Q`yZ6H%RC^#WvjGu>*kqO3sqf+W!)85|h2b)Z48yg;e zZZ%sAhr=-`Ma^ex&*61E`Fc)uWy7I0+S;cE9mP#vS7xWkBN%hfOQ0=_`!HuHxuRVO z*&#~2yj%(qUmiPWZ49CsMB*!|#+l?V*haoCpqcw0y&T_#?9At$&_XjMmuwd%EphvUhw46ALy zP;`_*4Rh|}v+s4+WzFTPb_#wnm^JD`4)goko0QyF*NTeuda0gV2jk60Iwr>lyZIVV zkkN^w&oA!dp{*x#V0u@dm+fc!)8XX+ZlYMvp}PU;R*ZY zNQzVDT`juTiB9tvUQ?XZKb9BxUgvvp)|vDsa@}zhIBgosBCBIh%yRZvsrC-`@}SRE z_vp;d&IYa~%3V^&`olSLKBt|afPjs@L|k0l2KO-)miaOS_SNJu(G^OhSdBJA(+=OB z*G|ojM?VqeD-7r-t(ssVb7|++=o7E&02pkCFJiXnc&<`?Oggw!#$txwZ38x;_?t5d zfz)<93)ZP|nk_L3twAJ(hc9k!^4YEQfY}~(_UkxnBLBF+W4Y^HBbxq< z=R?i!`^{^m%F)5-n3+RiAdE>P6T7szIW;`|H7bf02YF_)4`wOi*u4lwzPcN3MU9`0nU4tweEVt%OcxQa1XFkx*&Etgf^Jv+O zw%P0`FhzA!pN)hs-WeL}^>mr&dp7i8cLnph=`ZIL;_W6WE!_jG$s&*p2K@YxDO}{% zFVs>%U3)e0NB_fieUE*l(Du#BP(V0S9bLDFi!~IQSRseDFLH;ptN*g*=4RTrLPWP0 zKMk9U9-Bo_eBAY1co#}Kl>kEEe_E|Dm(i_91F4~ckFl}sG*1&3xig2>?Rlpv0JhMl zrlT6!zF4IQ8Frj%03SC1`sPkWtr-s_?eFjBwVG`-oZ42c5)~_p{N`-PU+ivN*8Ghy zK_Iiq7bTD%l>C3|Z$Z9k|M(kW0#iQAeOfR3&z`_}NkeHLJ&1ozo3v{XK9TS`^X=1m zOP!|Ke}r8i&hNdwA%U%I*7HAR(U(S_b8$(f56*_9L`0>_{^`y)vW0!;#>PfKnP~Ds zdD?yA$UW0koI7A_ZfS{*j$SWjcuPq|WiH}|_jc2G7wa*f@bh18O_XqOa6~a_ZfwJ< zS9W*F2nf#RKVl%?{oqE0^au~nQDwpV`pzFb2~w#HqW=A>C_YVld)B8Z-X88IFPxH+ z+82TH^xpX;_{E=_Lw??wR)qkwN0S~>F^isw`!_uVGEV|ma+)O4;d$}ri{75M{=#RF z|C3AEyWVc94h{}heqelWMcoi3)-XQb1|PnC`}XETt#8%UkNAds^~vQzfYXa39BHs4~?CFs)u`}@7LtyMfagi8TLw$aEiFA|4(LGGt+?OPDq*Qjzh4WVH2jw)XE$w=~V?wCfGvKXld*H$gejoCo#jA@y&Y=q}HJ z+#SA^#8KAN!Q9wu-!)1RaMI#MjCxJCgo%IUCpYhIzSELnCodAkams@cuZPB&M2Ni; zXEPA((q?Fk*%yMs48y^$dae8zkA#h^*cSTXq5P=_0si+&eYGQh4%!i~fMbo}i#NS@ z^6wxFHr1Tv!;;C`I&q$rW1OlqIIc(rhvR3X_QZH1P`#$_{vDnx@z8Wg{xX+!*cZd3 z(uuD^{o@7-mrM(*e)pqu`g_L}%R0Q2-V06S_O@U8z2RRr%I8mqADPd5`h}}_Kblb% z?ILr3e6O%5DyT#%Pcbogc#av6E+k40+k51TpOLg7EF5!Yg%-wbv&NM&C*B;6et#b` z8Y{ATZ%c+G8FO6la&4Hx;Ug z=N<-ktD_VkE%<>hQMrBD?8mt8$$eQp*(g+7Jk))!_?Mkawrwb|o+(`T`{R71X0Uzs znB#?X8o^eMah0wm`2of(pV#MCOlf#x35wtLYzViQsxyR{)$${|U>#oHM9p&xt6Odh zs>Y!(JZ^2i-{;9`>bOhH@uy$YG*R6Spyu5C{QP}VXK$Tou(-{hc5^;|9?xx~yVMcp zL51>DogR`o(RD86EEE^7>lK#kK&g$nrN_6goBAm3Drd8$elLaW4RZRb8Qf`*>%$`M|5WXcG393L+uO~*8Yf%EwKmDkb;tl~h zW+>?Bq|c4ztl9@PQJd)^B$MUds;J;&VKpu8yYi*XO5S>|J!$)%%Q0JfjhZZOz>-Gc z5oXl}6L%|Ca*#O}v&Hwzmu{k$zdraGogHSiru61yZ)U%oN@q+Xwte?Lz&r|rI6qO| z)za}y*vXC+;Dk5rtks$rm^nC)A8*)Jx$;G-Q$|RdnVRAti)f4AIvQ8H8`ax2s#!dy zS*)z2{kDFyUBUk{&pMfb|4DX{<2hGU?^1S-V8bP}|F2YAKIsGO9rYBmqVbSv9XH<`L$^ZOmh*hIa{D|psz&T<}hX6>(*%FUUy?=B( z{}i%QkQ9HGbCDi8KTz0sKj~cgtGD=dPMs`Y8G;{IuFapSezKjc%m2~m^%doPzu-E= zh#g|Y{3(85bW!vDhIIah){ZZih6XrcI!J9BBI@-nv2@(l@A`&>Q&^B7JG^cm!_X8Y z-S_|w2+Tb%h&gu=8g! z>h1X?lRm+f*ic~|3Et8lB*rEt=Od;CcJ90_RPj9^l zEg_P$pFAS~Oz9B+p^YOnD0KMSn91U>se|<8pt7q_r`*~` z^GIa{ZiZY75D$)|d{at~#VFZ@cswu98uR?O#5NBZw)LO7vo3x|H8H~{HH`qMv+8$naxgq6Lv^#J`_paQz zk3JodU7b}SRGtG4E>C)WHOpV+!)s59xuV}@#TP|C)u&_Rgr?OKXJYw(pukq4>F|dI z`2}<>`!j}9q*EaWs77=4DZEiKprr^9mk#=h<*&rLxD@$V@szi}=X=x)8kAX@$Y>1T zYpjUT8pXmT0I_oHmOE{oHvUc0g0aXpcKRYx1!+w_A;A^U@Wlz+l(ZC53Z6?W+8w7? z8xQpMnSsup8AL=x1d|B~=6*C8%D|LYR2+)uv5REZzTWjhT!cI>j5Fm+x}Guu0t0JF z<6TW?CG^fpz(PD-`XtT((y_cb&=0z`6loPi;!|tpNVE*&eDSg2%H);uRsdGw^`#Z;UOo{4z7j+6Z9)B#SzD%^)F zFFv3`PB|~V>{IK{)rhX&cXj3ph&N&7cvACiH} zoMbK++ZA{2+)27Ao15fS?~yuTp2+9KgbDl|iFAdi?p8e)eqWa@Sw1b7@d6L7sCV95 zzR2fLe!(Psw(AIoFbr}3Ept6~qK?ygljB)@)*lIa&+xF$JJTsBqzvTC>tm=Rm13dF z%ASd{#J&8 zdQJ?wQMynaDQa}IuQAs@eR?48Cr~pN*?z{C)ezC%6%igzfqG6PiRM@w&oofm}_T# zmDL}OOU5OT&Q0}<>zRUmZ{mz)x7}sprqyDRt--4|qtAzY)80C0zz5`H9)JjKWz6q+ zM~=-^XYVWYbj?*GiBll{5?f}y_DoY4jKTa4;65j#%RVwUHI3!6((>@Qf?-l}TFts& z%@U6l)y%4Gw9gb2T(Ie@{%W``bMx8ovx-%v01g3^Kjm{))kNqyQXd`NKrqR8c)P=@ zv(v%bRv`ETs>9R}pdH;8I4P@I_I=FIEkiya{1FD*il|xZ>+@%+0#$gayRB)z*^o#HhR=B`7r0#^67Tz7m56omldtGEyEakxctk9i?Lx4{{L4#W z_Rc%*>T2=C?GN=akOsXbCs(-pM&4Y$ZX0$(0`5y5G|Z&hhcM=l*798^v;7B7Cj$*& zc-<^f2!v!>6#0i?NuE|6FDK{d*jUtJB^>UWEa%LD^dbn#Nku00<#uaIATsei1dZlPazIL&Aeh6Z*W8S5b)q?PhGhG=b{eHUL2Z?ly>* zgQ$3O{Zq4S3uA(x$?W}SNN{?ZK3C(Z^4|MiR{^3Yik&MBT*aXpL${kBsh{fU9e#f4 zsa5uEG$8{5N}1o1@dFn26Nm)#rP8kCZ(TUheXgi_MSFXn!fEI4AaS5C}DJrZi zrD{<9%1OXIgfjBVcBYoOfL=hfLYvER?|H(`s|?G=a4YKou|(nmZnH&hC;F)FWvt7M z&i(i6n}!Xw=Btq=jZTLTymSEP+f{8&6EMHwj2bsdt8l?nTko06@ZQD!5K@8ae|PbB z9vnLJhlvAxjCW_zw(4!QqBDPD^RIdC*K|0=Po&Q-SweaFlpdc42__2|NizjA`WZ+-IQ z$q(Hk;Nlck+^OOK8C42dr4^~h%LeOzOERzdIrD2-TNln)Hdz0<-CbNq^17n%DJU=w z*fJkKegv|Hf7&PY0rF0Zb@nL*~h_wxM<@4pmI$cqXv zoPtTrILOV-%`<_wPxjMq&3JeMw|#N3dG#<1z|+6m8j};Acl)A?3i6Mk9ie0mcvb3%WgWoX3nm| zT8K#<3yv1qBLv*evHKud@h5Y8IqT{0W< zDkbymA@dv;GbR1LOY6hPl9ly_>pf3FO_uNxHP($}MMV)^x2vxtqxAiv8@u?i{fM-Q zbG;S13HATfgD&&OAnjnMOZ4v{Y|2C#*1Dt0Y-|}cuW%I<`nUy~!jqK!hkLQ>)^&+| z7bb~Wq2?OZ(a8_B9`6NL?Fb@(kSybZ=7Rs5v1=Dw991JqtVUH5(p87nOA~Jmk|=xL{&AD)mEO|G=xgYkzIG8I>NKnb7=yW zz3~jKQ1AK-00V%UZ;)N@?wjE|x?dM|dk>RtGB)D;v)^m@2uXZ<2%#3ANgjFQ+Pkpc z&MY-?;{6}*JB18L5jNB0nc@_xM`w3I$?d_ilqN}{!wvIDeSN=2M!>Bnu{2_`ab4T037>8(A#Hb;ez(Pz2~-&;Mt_3;v6?i;)p zR5Hk+{DO%&fw9IMOX=5h(%_O6a#s9;O#aKok2tN+WS3>X^F!AW9TIs2Ky70(dLR~#$=3-s)(;OH!Ip~;BOe~#0;Y_ z|M}KTc!evxDzhbSjm1bUB@nfa}NfyP26sD276Pc2j4#!_jThHeD1=rVNF#ayq z`IDn%Rmi1|-mcg2v=;|acPoYA)?T9(eZLiJalo7}EQ`LBa7jW^(gEu z5mWrZx<7q+So_YdoL`cA_ij%KM#9mvLl^tEKM!7<;9#EL_u>v8iA+3rwg|=QJXpst zy(-Al2?E_YXFTb%f69=DOt;t}_UP1l9E1$4+5axX7urpWm79K*H5gp7O%`iK1!(n2 zke@PtrpT)5Kj8l!=c0cG5dx_+`^Rn!S;POAOZb7U_uucRRQ+!trz4Vo;FNo}nW8pZ z{ILPniow4JX=VXC@z~o)3u9w$n}rsT@p>VS_f7U6$eJ}aaXVN;NcZn!JbvE62uDC$ zSb`L?P|?xzb8>3J{q|=>{)w%7ko-R9larHyqCkaS6$dy2GBQK~=H*;F8-nzQ3Af`w z+zvV_$Ob`zSi5nDl&Iy+vR%(%HnY6RDGSy31a|F8w=Fc$?z(Zn7I5at9I7%MVaOTT za1b_vK*oO6Dq4A&s{oYRI%=HJp=1T0V0+9;FoA@u3bvuoHBK#sCBDGbSWPOt+U{JwB1Ugl zx2lUsOuRnq7or45l2+GD*v@wSrG;r|!x-=uy=#0pRNtNpjN`pP7#8%r?&PGg6sVLj zVCWvsC{XYy<`7)lxOf>}K}s+-xomaKWMv{cvg9+6GV71~O>xK43y5I6cmfQ=1ZkR0 zN)*LAkm+o}!LSppO1LmWpX=*d={_qcEI@*tIkG;p=!)i=!1)?r7A?%Zqtq?NQqQ3J zSx?2KetsV@b%=kXVp@tFmi&aAiJDK5h%D3J-+#!E%;brlMAx8jZ${`!OFGHAJwe?s z@f`)H)Y!BhtdDhv;z1T+RQfn08bXQA!s_PDVbfo^onRAUk6|63;~qtQsd}!J7a}#J z&QE-sP>MZ#L3dJ(qkP0ePdTx9=TUF(E2KTwlih%>t=M$`FoiHB+@x}rwBoh3GVEK> z!6#fM7CMeG&pFK2<@6!nLgAN({fLu_hCJoTqEd`Pf!JT@n^`?J**RceVgqOA#kC{TE?oFqP@`0MI3 znX&wcsI{-Hq!eLznH3@jn%9B!e&Y|vl+uEB$0OgvOwo%_DoCf7R3f6j6mxn_(t?7u zGRw-C>O!i7O`iolMvwgp3mvZ}59F)TeFlPxs02(rw5GWe+@=qFv(s9+eCski?tMt! z%K*zvAiVMC(SG8_sNjBxt$;FSB{QYPmF&EJ-O?M42#2)go~jHHy1=@0PN@0P2plC|$F1?D&hXt@h61}xdhZ)&2kZV3nFoah4%@Q|>sSq3 z=*c~7#t3%2a39p=R$th#j12>(y#7MhrxczDXq&Le@v()4%W4^+(UP%H5>Mw0+hOe0<=(9`pU0^M5Rn6tfM6v3u zmrFgQYN`c>Si=_n^=$)N;cZdTh05}&L;DirS;k5k3CPz_nai*8#lW#|F6Q_s3RI!J)k zM!=&)Q$ZzI&06Q8q$ILpaC#IlFfzI=26Oc#3C-0Tw7@VgPPPGB8_RCgH&J3#VKH^G zmKr+idB;)l86!s6tdE=<*63~TYyZ5b8gUf`wUJB7m<*BB)Ew%lG@|+D0zM)K4|o(M za$Db}Om3G9Pfba&4bViw2(n5SF+5}iKA26&v>A$$4syCPeaTr;GAMQnXi*xGwsr9n z|9-jRz^>q;&Z0nZ!9lc5it!#lAto*|PCJ^%3pih?*edlg84nMXaHk~3E$%zyfMq}= zlm*+0JW-ss)Da;kO%xfn*1wP+SjroiJz<2vV^CYh@^$QUiKlpo{ZOx? z!^2IK{;YeDwG7L?+hCZ)23YTdxA0f6JgWlKNBq(s}-dxgKlWSKB&_76yC zbP7iz!gI^1437d6Ku7v4VH(#Znc_H5j2I5rv2VRu2_3T9BF`eUGw})^B<*bM|0HEMo9s7N*t- z5d=>1JE)0tyOA=Kzt{_Lou!x=(7I4%w<<}6rGE=DPkIPY<@@*U2_nFLBZP3j5G|SD zciPdQ0Q}}JlIcuQf$ay*sE6Z8jr(6K#f^ zKT&8ET(nytP9bG)#g}NK0$@)gL?+;dk#7}Du#}b0U0hQWo@SmdkCJ!C2UKzN-)%i`^H`KmLip7yXpqv*n1oHJ zPQ~uD#COOk`oMQ+uy|5}wn@Q7afg#~$+ZF0AE$WuB>WwOZO zU;T@UN)BRajSO0m298%NTaAq)#prDC0kHNubLfh1{HmWe(K)5C(E9vfIm!Lt;mwW| z`rnLY*;WbIuPoHqE<$59HEo5Zf53D6m zPfvU%jYom4H)Y1F;bRt{gfV2kpcmT{C4MmHkOJ+5%dUn3`Yu$jvb7od_xJ(ft0ZU5 zbLBD*t*g#L!Z(v-tkg-HQr#CC&>7_^eAnBFaFYa?%t_8u!ME2oNu;yvKs za$ju_cHEgJ#Kj#+5MX3rD8z%jV05#v5e*=BQMVkFYb#`K=)tOD!@2STwyjg8(JcUu zfL4k?^;n59GUuE^VXiIIYY%BB^U|QgA_u0J$HadNdF8a4UI~ammI5-=I-a3^UsC0J z>V}^WC#NH9Ue=KSu;Rze;+A*+YA679t|aPI@-<=rVksff3AUdFo6pF=u&E5j@$NNL zuXA-UH_t67U~abote02Gd#1?V1pemYa-R$99<=lLNB@u$f+vqQ+1w&tE#??`?uvc~ z*xLEg>P~^e)-^+n@@a+josMY-31T^OHe_9m6Q|; zz-+8BfO-HR4!F3uWMyRmsWAYl-9#}<_1e*s<-W_&@ose&XH5F~-Xh^W4ATCVbVGORLJ=I=`@PoV1_J+zEY$tNpZ8R3N~UndoZT z_yK8iG!Og1-G+;q-RXWL9AqEVMdb$lTi+1tD;w}Y0JYV*9*2b*g}f&pGzB6S-o=d?y!oE2S(*&n&Zvuld@&Z2Qpjc3ogLrv{ck90#~hk|!KI<2qNvd2eeV{^7yF^--o!-PuB*kB`q#hD^9* zx;wLbH3z6*2?P>mofm_9(@xsi7cm9o=@j(I2d!2p#%5ZX8GXaP4zb8~Y^ z$u2;AEmhkNWUj9?pD0En;=EiHLbxpW)4F?jxbeM!c;`F(8&=2cKUm*tSmH2>++7Ul z{Ry|fl}}v*{O-aBJbc5lX7{ZpGhkIitalgpon`s=TL3%A^Du5sI-Z*qoLtPzvJ4TT zA|f7ufezN-etuFR1fsdXou8iGYLgck8M(>i#3al620R+?$su38b;F1rP+Xi&ErF0=H)}vAm+ib!3cq29pSZih@QEe(#9F%tEMWQUG*Eb-MXh&eQWV$ooOs-4EtTX z-w-TJCwjR%>H@sKaCr6Zd8ohtIiTQN17n8&blPsQJ(P^)9R%#1kgJ!Wy|?EDxICaC zU&NrCaTdEm{e5%Cio+DjN>SSv-F6x1LDgmZ?kWihIGVdR*xFC#y>oXVA)!-}yq#wh zVa9`L5<4~eV8zMNZOuHm1*z`bq?tYC5Qw}zA4nb4lq3sXVpe-jzL%HKi^~~MoJdsO zo&B&BKYr1WUw}gH~40XZKIi;{~Hq5K72FoYudby*HaZRDA=Wk)j^ez zX@y&RmqVGVJkHRZo!%3F z|FHQ^&&aCbR+ie5Q1*+#HyZ#7YxsAtD{}n#V(Pv9Pq3tRRF_?B@6}`QOPCP#KemZt# z#V|{0a!S5*qX@^_&TW8eY6?O9rIz=wz9=s^5HIUW*;AkUjW#BMF2N!#7FYF>rYNw+C(Iwj&^P#EriS|;Fg5{u zu*7egHP^m#EnuhsVk9`&?%uu2f;u#X=@4u%;p=;k0vQc$+o}ZOEPLhoHsp&eRQF-( zBd6%9UzBnWU>(XvwgFcn#iM!dB88#bY0cAc*?+;umZ7H;%mE}+Cl)o^+AQWUZ`k)` z)0u_B`{>fw^oM7mi|9NeSe+^DWF3Sd53T-mMyt((@&&NEfwuwt4kpd&VbGP{xj7*g z7Vtii;XJr|^$h7p)On!tLELmnqe_Q|xoAzyG~@X{c`A9WcRZl)8#D3flt7%&tULw@ zH6b^ZL7gNl2-e~G!fSw-N532~B54to|Jkw#4n8CIXyk3pWn8zR?TB)c zwx@3f^t^1Yq9EWwK(*58Bo_!LPx+vfRJaRWqzV6LJZk?lUE9ZxRqaszYZ}W^-|Yvr zGIQ$)#oed(#|h61P6W4yuMd@85Ym1*GbQt)qkZ)Pe{%L%Wh-I*t&$obu!My^+4)t7 zL57Ek^l!kKzj!Vh{_FFj7M!ULJq*A90LZPwSwH=mil4MIXE5waYJov=y!#v4Xh)ZC z_B=8N3$CRwF3}b0}3xru9GhEb6#LN&b{B{LgrAUv`|z>u>LC*_FK}X zFxPG8g={nZ&AYEu$K3t`bU%8JmT|l{zg|N-Xd}OWZ;Y<{2af3nx1Ea>lE&^das8u1 zaYLkerJeW}W`sbTWN!Xpoe9EJZa3H~`X5x!3&bm?yZ>`Q_Q78%lAC?*pRttxyUXcy z;amGp4E~G|q`*3p9>On9Xo)-c2RgKN0|}}?^hr@Me8hBn`)xH%m^gUFfyHokSC2DzTtpB_FalqBh6n&E0xN~M{n(Kk`af|&vi}2I5Ksg97rFaP%Urw9yu?tO z-{!sPxeeJfJh?|nl=k(+kpMEkZOsZWq)J?mG|KHd5UlzZab@r5-ZMyfva_X@701!= zV?06ADhe>WX+*55BEIt$Cyln640dg6THW=Y`swKFShv4YT^mhcyQrrSGOduX?LZWY zW5^@}3zW|RkXjIpR$Q36ExbH?qlrYT06b}R`^@=jE%tHD5)!CUFnteDl9n5cQOIK> zsyiN_qTY56o8qyksgCYgRN2tATvYgJ4UPKZNk^xn)AnYDEZ+rC9SvPdX^$Yf7AdB!axE$y!MD@-AQQ;c0y?$+~YwJUhg@Ll#PYbq}4zN?Xb!NFgpWouDwE$a;GvM;4fB&FSf$hH0C zV=0A5$J%IT?l@`cP4fWRd4XmZe#tBz7Rs09GjUka3qfaZ9YFu~2evmW zN=%Tlz9vOl6=Gv@lxh+$L>X>k>6WHPYOlD8L>`!hbk`OA1}z0{Kuh7%{75hp)|oeK zqfWW6<=4jgE409*5US(|yE69BGVsgFL8D%$Kkt25bw89$u#l$M-9mEKgb%YQ;~*Q> zBP%#jRP@B^Lz4T-{qzaeF?2Tvt-TspM2*yOQm#DdGIAX<^4DJ)(;ODw>6Q5 zuFlYW)(QQ-GVcnypM|3;E4#2uK@+*O1R^aMDUZ0?%m)gz)deM0Trbal&14N0AG<6& zQiKu-kQT2B+^SVvom-6+-s;J_k3lxhJE2g@iLk#I(|DY~-RJqevTLSS@Ic-`{MDsg zXl5S2r`gU(pad=c=QkDB$%SinfzYgK=y{mEMLD(3W@B?Y??`=_LB{8Y$=PQSohij1 z82AWLw9RX{*HRcyM>OiVreEV8yEeARI~U?IaAZ#cf38*b!APRar`-R z>AF2h8JVws9|X>AXV45w&Ve$WQ+l@L#&+m7LmD79kHykRhUnt{Hk z@&`YR0QeymQtMMd$)abpMMQ@J%GMi(h?fb{$#trYCc+}nm%?H`Kfkw}B~zq)gUQ=U z<@sz=MDMg)@hh0irT<}prQqks(-?tNlQi`9Ceq_a?6d|1iY^lV^@CKw{UcEuDI(CI z%wSTC2|XJK^YVV2EEI}~qPVD}ATMYCfu==4vAY~UOq8~DJQPo5!vApyp0Y2M^c#7e zqz(6fZ~?}QTvzcQrC8!LWd9PES6*uBJjlL8TNYNymmpxkm7v7Nrlg}%!-Z0X20i)M zsCz?EE7c;tp{Hro5&dG)F1WdC7xo~QucSoUaPD-q#WFWNVRt}|lGG6ROoYNf+H^&K z5MNoX+8ih#&%gQl|HUu!@)vRR)Om{nfzy^3TU*T5AE!k{Pt#NJ`OC!FdlUjPwTEk1>E!Z{0B?McGMfvb`EtcFA zphjrv_#Q?NS@Be|zSv7rY-~vHUfv$euE9rk+m=ste?>QfM^XlT8e}PO8Y|-{q+I$1 z_BPx&urfn|;yjGaOlwNC^X??hp<5SmYj76WG(Uotyo%^nl$^?8=^6&T$ZTojy64aAVs5k!#tIj;uZwTIuNRsS|9EpXcL7`~y4;0-?>0y#WCpG0#*b_4M zusfG2Hj3GRk+I|Y-^-ZWXAa@eE_HQ9JAE{&OCFY_!9W4RFQAU#M9AV>Nf`yGg{9-Z z2};_0Gq7iH7a|NAJ^wig-HYHXlX?V4!FKP-qPpMtkp^Kr#`4H zq6}qK?<$F^uhgQ zUE4zx*y@5OrtOJ+(d@e-uCMsZqz*}Qwmf>QYETB5=ZZ1fa+WM#@r`OL>mom-MIJPz z(@!mDnLMV?dhVZ{eaR2VcacLE2LUx>7xlrL%5wHibc!!6{Tp97rg}ERFKr{m(J2G@6a*p)%bHoVm(=pM1&p@=OK%Nz4QPH&Mu*3Y1w7wy{K{O)1101`b`ZKXMzQ=$} zxH0~9;q!2=kFdy+joxYC9p|j6E5V!v?4@3u1cD)6?72geseN7Bp_^HJ85_Zv8az=# z)7IC;X^i!XkOC`ffkNh@3pHi!x#n%fcs54*L-D2V&eZ6GvO{)^tT&cJCIosP6O<%W z0dmWh*`B>Pcsyv_aAI=GC6KM&pjAey^1tL>hB25ZjxMcSrulD-(-SUZGFEKp{uWfN z=>+Z&FaOKJtSpn+S{DG#QHlnQ*SZ`YyV+^9@3@*}kvTQg?{t4Q@Ik=Gc5t)F>P-y& zVeN~U`><8{{7Lkt1?F};e zDR)XG`YWJ+gYOD?>}uAT@2^Pr2D9@`UnDuZ>4ZGhJN)oqWpZqlk)bDBOw>^U)$-+O z1Ly4EBZzZNy;~J`0+CRI>2l+Aw0dVMA#!->MccBa=7!F@nYXd5UUgT?GZO=4%Nd{7 zl3zlhCz3Nq=`@-qoIB&UZU{>0>C01A4Z$$jT3;VF?Q5!(kM}XK05w_>!~y^#bMIF( zm*w=DJ@0C7T!m3TDa8U$y{E$g<5)g&$A3Q{?5h6^Qoix=G=xR=%B7b$qQ;FWFt(OT zk>>o{Y>z_w>$0kakG;DdaErQ+_dc~zJyYdZZG9Bh?0!~<%OhsWgc70mC6YNY`^zIY zEyQdM88MGt=gU_J>)sEzD5Qk*MJDa%?8nzdj5H!y1Qd_?xm|olG@NI9z66mMCyvJ* z&gNSMqaR=-rD;YIOTo*k3z+%Vj(zaiM?)q?u3ZnaU&2p0J(J=QE0il3kp;Z$wn3>2 zn}>#eavUa|$QECNIxa`ttQt-yVx*d0Qa-2LIBrY3%SuUL(s_Ei`YW z{OGkW3%Fl9sSQS*hQ44gatvTfX2CjUt>MNKCzqfWVpE=~ z&C8Rn+8`X^gYxOL5`@8ma7(v( z6ZEKzkl7t#kg_kSi)H6LcQ3vN^;(5|Rm~B6dkn83lZL6y+hD!dU)mMpdyjPBg0hxVHOPza(WIHynZ0}e&#A3Xkmmi*7Yvfktv6W&)c051 zXDZMsC?2yI%3K$h6JD=2T<40$l$~&K z6Bs7-(#dkeBO}Yp%juw+LRy+N2uf&xR0|Lo`1C6IRq|RPb9byM(c^peYd!3q?>z(j zOGqcnEe;#C8&blql#0)HgSRNhN`J7lj9!h8^Xq?3QVBjf5l4RKExpE~VZNQtP8nHy z7&7uQgdHhoR*z(xuW0n}4H(iXk6S@d>f~m_`#t>WIOg!LjelI1f}`05LLq%9-DrR$D=<$r+np{uK zYBgJL*ry)vQPeOwap+RvrOC_^d&&K0_cKMHi*MbrHs z7oIF$-RmXB6>jOchY^NZWGFhmulg!T|A8Hc{EOU?choV`;;ZY$6I<3+26=`#)}MQF z`zM^8JBpn~ThI+*d0ncNqtg;Yqs=*Z^;~q64Gzfl`W=-0{Ol|2nm%C(*~C?0n2f@bx`c<7No{ndp8lcCf$#FlZeAF;t;xQp=n`6xuI7(YUHPT3KEzF%t3& zgfVEeM@c(y_`$bK-k?AXLUww4m0xafSnK2T)Reut0(w)C%1^I9FJ6RVB!$NEf9l(G zQWn=`S30^fz>?I*^6gMNUOxf*zET3eq8!$-5{^M#Ubsopz$XkW-XPi&JYt(q%!;g3 zMC=l(m1b@e9j)QY`gGl$)1Ex*30xdhY2Emnn|ayfSk)`XGN^>?CO`8r1iATjU*@)) zsWuu#iHq1*>DJ_1|11___SE0|*7)($EB{;~?B5A^0P9kmiAQet@_{l)K%Z-vaVMG zJl6q3DlwLx&#eszUZd^H{!e%A`IsfT(oFA700ool#gyvZmbr$0h|v=^3e<-z5}U@i zO+OLYHOjOUJe;){HYe{@skLBvGce=pjx8fiZt_I4_2^zTTBWEpS=g@Nn=ct(%CTy6 zD_-rqF;AsZpNPHhiY=k5G3Uat)Dm8Szzc(^hqEJgA}-Grp-bgf^+)b=<%p}n4KLC! zF!kN*xYZQ>W(nL3pb=s%X*T$WSUY^HZ1)BS6EqPA;GWFED zbgwe>1up7jwXQPD7#X0JMLn9=mk5jWKj{#b4>ZTFRFfL)U;k<%tlt&&Zsa&WRmi7a z^S^kqOq5%2^>)spBu^0tke*n`MqQo4V^`_n4KSjUG2ezH$YskIz=W~qK>C&+ndjMY zftSF~_Zq?df)`tfZaWV#$c)ggC%rISHuEZ0da91HkH1rjg%IQ$P&u1u*VZhjt9V%u zJsP;4zU&sdtl&6wTmeTv*lqon@69~0wo_C*7(?_%dbye$6A9Y}E+_g)j`kbvf-pLO zMrS`1op`}ql1+Q`yTQi zTIh>Mu;5@2Aq}UMMYn&V(za|1DyO^lXxX=!L4qhcEzC;Z7tc=7<`h5*(B7*gptP8sEq7k+jw zu^9j+BIR>5KiQhVrb1yM|M2^k^H}zpyE{9t#lt!-u|*<$Jf_4%qds?#24+h20$6x$Oy#FQ&Q;Ohb)VxL+;6*)}L+WR|t*0 z4rq}Ma6PIou!u2>wH=w^5lpJmd)GY~BSleAjUwyh=W%tby`Y}JG4RVHqpk+T$zZ8E zg$UGl4sm)ShT-MHW`1y8HbjAu=#dcbu>LDwSm~w@-ZpF1f-EeLo^B%Qm6S;c2p*&} zc zo~(#TkM1Q?k~uV-S&?mDP%K|HaEhQ~)L#wE_lT4TCZ@lBNT%U+a%|vNv-16s^mLu$ zvsqnadjimh7j!XCu-E4u^b{Z;cQHN*oy=QEVW9$&=LLM~V{>{)@=I3HfFqBS%*!_B z>*KGM@i@mz+OmlK+>Va$r2fn07jNQgPV8hwYp*j~mO>j$0&p-@cE5}v_*ZL8gwUP% ztBk-fMN@|jj_qe&dLb6HW!H6sTpjll)C~y@rUg9~3AfyeY~J;yOf*!F#eHO9szT&n zED9!6)f^rxnVlw{jNP+0fuCIq&4kTdWe$v;EK$xqN7G_Zx*D)*A)P=hN0zZl-4jeY z9D1K?lIVd*cfeq@8_cM$bCyhTt`>rC6?r)k6MQDrW;aR@JhpkGW_Qpr)v)8dAI{7t z_BAWA@>!_+)c}E`(F20h{VszXi`I)AHs-iE+lq*1j9~$q)a?13!49hBlkv;Xe1fM| zC$2&^HY!7-1Qh1!%yOj>UHLa}d8OfOr`KKv1fY#vKw!hf)iyQ}(Jf2We7W{~=;~ox zjNPv5)Wzs}qL|md$Pz;QTB)UQvmTTc z!+pF~P3#7)3wmvfWl18$stMDlaQ}L->(Gh@%g?{)#wNxx-6A#EhQ*y^M<>Xq@AR_L z?-p>0@K%>N+Fx@!97J|7lU^OK#{?Sf#^E|H)yWnMj_u;FZ?3r?9IAVko$Tc9HCD`> zpLMQ`Q_lq?2R$J$M$a_7mJ}23VqlVzO76N@*n6xmX$BiN+j4n`$SzK{PRZh*j}Igu zhEnAb)=Sq;)pKMxnCm;-=htcK75dQ`pNOzB=dKqEFh)p832-o31!FMvg8k!Jx67%U zuL`CFD0V#j5L2#Jm(od|HGHnKN&2&FT&@8Gxh1*1E~C`pOarUm8*gowvhv$VpHT9< zuTZUTl0E*qugN*wQh3PZ;^Au&AgbXnR?uHV8_M|3azl=uL9+cL_~Q>UO5XFBPAuJo{gt! z>dZ5W^6csV(cX7PHPvqGV!?)jND~!MREjj|9rP1KqXf}FLP)cY@6+)33 zNN7rvE;T^tRR~F>MoP$igMMe+J@&qPoPF*YW1k=A{lQ2`M%H@Qde>TW&gYrW(?Xep zaT5}%U-Ow9JI3E89V@^uGyk?TLoWqc{l4&qytS*2m6iHT&%J2N9mz;xVIg;wORG%h za$z;K*^A#taJ^;X3H+w1zKh5AEbo`_ZpG9~G_1cSJj8Ze?nIKe?yj;THF03HHTz{T z^8PV!e6Mnie=6GuleG1&t(O_n@xYs|HynHqmW36gInr?g_s5B*T?G!>2OqR|K>y}} zKplSb+xxJWX~~(PDe0;@+r++6Zv@^`X?|C~-rYiDD*sw|)Wa)8LH|W8{6>grZLctU zG_4?R1~;>D>*l99y)oYKd7e`@v9@psoeGOmQDX2;-yFR}`@eGGdrziGS2 zsOSw35W{cLT!+bn%H5of{%5wfmI_3jlmQB?MpmKQRDR<4Km+ph+ zH9}uoc=XKP@Z>uNe)bUV)2l+ZWbcKWo6nZLA{YB*K=_GhOz-0Wa2cbjhJOazju19npxZ3V4g5m5=T z{R$An|^kq;i4m>_PNG*5^+l_W|DLP9i~C9aDqkNZjrN3plQeO$irQ49It zc4Dd%j6>VA0_dT@^p_>IyCoB8q`Pmh4|n-4u4GYnJHg=kC?{hF(THq$&D1*Yw1Es5 znWgkx38cNTfty+Kq@7;t*zo|u1cZRY;_*TIYi$~-5~bjozK28NS5CS}BShREed3Fs z2wPr!YYUgXMcNt>kehM~S|u+2kZW7!i_U8i^0cbHk=xuW`HeWsmSx%?F10@2-WIsK zRNs(3;UJ0M{Q45jO10-hgt(E!^KPV1xzBDI;z@+!e)-m+$;+d}z9kLT;fHupy*BKC zb(O#ySHlB@wfaC?Z2E!0avcZkEQ>APgoGXlXXe&`o)gNInvPmSRz^+zJQ|X0TPjS0 zHr@Zaxm)-nmh^K8b4{>eeOu11i^eYI4J*FPeMu1+Hc#=M*gCedRz7xTGw z)aW{E24m5-?hjCxJB21C&<1MWHtdidwBwLZg2Jfy3JvJ+~CGi^SLOjl1`@ zG&k$bJ!uD|-#CI8tH&2e@JH)M|8>`3g4{fsohyo1~-0V+hXnGJ? zJ0){;iZ?jcbX7vr9UNjE`)~64uhk7q)uXsL+nO&X%k#{#QNu8Kicwfeju~u@LEv1Q zrW(SvKYJ^7Jeln}``nhV9Hy?Ft<8UJ_H%E!+(kLQxbsZJk*Thqt_GVqR?`PB{Z3nT zmefn`>&=yZlxO8KSExP2C5QNyg9y3Xb9KdRHj+A57i!I8c_Q@gtYb9HsKA1>4{x9T2! z0i+6mmi+lQ2!s^yl3VkkSJQmF^{gRi;}s;US8U_ul+eO+>T~Q7pWol$^O;$wu;rkI zdv)ZrFh9pXa}u{{WwwpkTU)PYizVpHZk7;Nf&#F$_fDJcRevQ|H+2J7jCTHKZAYz6sF@8^FIwt2UPvjuljf$1Q8~@ zozYc}4)(@`354@zVXqhQ#{wZPePRbah4Y)-U1l?ehH*u(XNKJfC@)xl_Ptuk{&EK{ z!~c2-W{evJG#)?_w>*$%+GgWqcdxsfMT6Cgh3!pJd%UTULxAfpB|-FM$nTt6r{swD zUtEB{&A*f4;$}7GUQsbcd+*8{jilNU_GQ$Y*YgwIMHf`9Q=5p zDB$lhnZHuVHb@+ZtB&7->EQNo0$#k~TRvy+vAqjIehiw!>6!)Yq&4g{jd>rqKJ%Lo zRWXeTz%KQw5nyHYb#=sFX@1^XC5d%?*wDEmYFNg9gh^z&ZPvqml^h6Qj1XFqs8}y2l&)tKZA>UbZx2b`yhk25&Bo ze4Lq~HAXe%jWckPe61XeQL@(R4GE%K!M{0Vr>J$`9KCqu$~X{=+27d!vPvLTTwV?j z3zJAZdfv1DEqZS5dQW;L<~qCG_@K>BMQ1*y6oF%2#mk5WUc8%lblS@U+zcoh)ouc- zB?UleQ_OzZwD^Sk|OG4UfYZNi^ctON4ag-Zn$+{#v^SfMdiaJn^b~-;VeGKepigW!kawp^SlOz$_ zxONM_mHfO~;zbW*5o}$eZoT*9sC#Fiu@}j4)Y6hurL&&!BX+a7!O!RJZ1`tkjWa+9 zApM6ltI2uY&2{sspzR`5IbHD*LtxAA>VVU&71?e|;}#h8fo{cqo17cUWKNyhoM&Eet1u4}460WLWWrpDS4?ewAPvyYHhsgNBy`(zL2wLhwl1CoXCSb;aD2@3}g@ zetn>)H?kFRLcH$7hieC4$lI%yI?z4x#0a&i5DaQL19=*zC4Zhj1FDDx1J)8oK=ksIV|$SQ9w)jbX!{+Up+@%rbzy7@!L$UnVA`o8JuVmWhkHW0k1$o$y|)% z>|6T@>f7w>?0~zEczL)FjV;Zst)R;U)H+T|z2*U87@+p>KIe{u> zSg#Bj-$w%#cS7fw)CN|)kev$;L1ja^fV@ReFDmeLKK?*mUCwn@0aPyjTvcVGqoZSD z@?J{w25i{)!);MC3PfZAA7U_t`FRU`ZZMs{{T+O&speZSgBPFwQpO1KEvJacJPy<# zc)ra<0aHlwI7LloC&d!=FV%Y*>5jMvW4?bs<#CGQ`7u+n2@L(~qmA7Tpw{$^`pBL0 zz%+dt19t6r^Es2y>EFHFfBfZ`@~^%4!{5{U#iGVq}JR%$evtsKvx zk)E2AWOG~f?U48H<#=^^%?BVc39nz@b{rGY);`A4vtSDyMx!CCBc*`Ntnr$+@#U$* z0~f6F&68{%dhOZ_xLuu#*l7s+SYTJG2Q1|gNTjDRjfVvL<6kv74mo4g-rgRtz*t%H zIm*)c4*0~UrKN%9V{k~N7=NEGy7XcU(CheIc7RvW9(wldNC8FglSN#m{Tk!I%T>qO zDDpu!(xtOtXQ};ol;VC(tnQ*kvGn|Qo~_|%*-)id5Yz-e=};+|OxfLYSqLRnd_}U~mM^%k^y3p5_^U2DYS&OI4Ln+f7}lq*Z9SVSzUJ#+YHokeG8gZ= z-P)hot%jvm6V0+ij7!i-X|jdFt9;%RrDSI;rNOF?3PH+ESq!W-uL!Q+(s6f?r#}czB(ac_!R{{+J=6H!8e4U}%54 zImqRRGj>Kb+Iuu?<8Z+uPp!LKuJACMnBncW{j!ir|Dvkh&o&$V8KN=Ciqa{a;+44x zqO5ZME+_*nEniOygp17c_2+=qXNgvS3B>qTTkRd=bTFM{<$Abx~ED>)1PH6mmL>& zQm7@{sH|4?z#Q(ltQpaO=n*vRBKeJXxWBQXC4p;gTwEE<3#XUD`X6~)uL3&oeeqDL zZmmrBjn?F%Z!mX16L9ITtnFfF~cDti(;YNc?C74yhPQex3#Ox z_uu?v&R33uCJHxkUC4;D^YW6cq=G1$CdxN)u_qMn^V&|127Zp-$F28;PQGDAwq}`^%qL|P4Mz^QqnBoiaB6kV|VntMpyh*t0($a1mlzPq~Mf)Js@v9UZnq z+@qr%vZ$XI8A~!T(ALu~FZbB8N=zEqh%n{uieRGERLkw7Q_H-hWNIQ3`$Q~O?t8P1 z5DZ$RdwF1(^K5*Wp-AXN4m7@Je8ySCu)81kO@NV%Af2z+H_{{rSQ!vpO;Xau$d*~z zxYX2IPt0(Ay&P>akQnp#-v@G0vZht^vYY!sQIb2wUouFY@Hqe2YWe)1J>_{~IQ~fV z7Pf)-WCB-2HE8~BY9hN~eIRrGs-eww%HTgOrVKY9#aEi4KJ!Lujyv9rq`I;+DFThl z9Lm>NE$H0}G^~bTsk2(0 zEnHGtWq%>vzW~bHH`d3$WRu&7{Uq7!pi``Lo4iy#oKFZMFRGp^steeyH4E-oP>Z*k*n-5ouW%}bA$O> zAes6OLb2#*mP?l|v9ij!C)QsQTo`VbGt2x^>pU8yyEdN%bU7NubsTmr^EiNo{A$Bq zdq|MnursN~F#|%_^==pUo1L?i^q5zfK9kvd4t1XRe3v(}w?jgzx&<>0nN>M4VRn zq5ETj6nUUpVK~-W@I@pGf1ar(eZi22vBoYzpev~%J6klz2cn;AyZ@v$hI~&Se+e2L znwL&L|BtMv2Gl)3o4#08W$~UmN~w3(0YzgPD6l-5)2NJZ6$)q{5NbwqL67jp*Ja^RblBp2ZKKCAkVzlzi4BcIr+pFLj(PuJk{!axRk zCX@{@5PlB$%zSyp4%);6X_xVM(@HyS4UJxq$(lfbZ^0X~fdy`|&QRg)2l@RceN;>M zGaq|)?@q|`g-h!LUR6E*z^pA!FShOWrsfVja#tJ|cyl{(Y6mG_7_h{~^ie6WdUIg} z6?ic2(co0fbdvsab&?H;ZgTSc~)=w1xC6OjOoFGR$`KQR!FFlhcQitn{Mj< zQgW%MF(Fk__WST4aB(A#=S|w#6emue6n7Z89dxk&@gtWp3IyOF>gvg%P)HM5*#7x5 ztUT}gZdlkQaZv*~tlNrTVKL;yp0q|Z+x>4j6ky+y9u)4J3#~rf$!ZSp@MeExY|O__ zNl8f~yZI-u`~-3X;KEZ-cuANL7U}LALZi_GhXakqxJXPO(yLuYjWe(#RU~&cBhE`z z#KpH>2d4^d84#@VjLfMue13-u&tGI9G4fl3T9?Hfd^Wnp1H?(f7th9Xs0k&jYRGQA zg|odVj?AqitalK4q#;hDC7rkiK4jslh3zPT_25nVPhA>;2Qq>mF_Yy$xtnu8CX}g} zp>BVKkP(2{T78M}ePt?Gb*xz}l2}LaGrR;$h(iwV6&!ewSj6>EMWqvj`yhe|hy^&C z9C331P!l%PUot2PUW$&${8_c;BLmG{MzDgx$e4Q=>SvxkcMklAmiB`!Gz{1PTs(UM zPj^z_vWAk<$={Hp3*~;{(erP>x)u-?cJJCWL2ZGh1xC3NI4uHV5xKSznLb(+Zi`i< zH*aY1R6x`{fTucP==TY95^~Jv@xp!`4?-96IDciolx1w7=vwHi;?i@x{nDdBpk zr{`LQ(TM59Kt&cbEIW#o3OBo)%4`zVC4Iu*L1pgWq5Nr!S_%f#Rg6 zhsSZL;}oBtk%V4m4JZ{Jj(_dN zHJNX}F1u-_*tUU*iHXC`zw_Vq_?JXqZcW0gLUwtsAs3)SP<9A6crd^9O3qTJX@y4sDrzhX58s>&>3_SgfF zx|ur4*LyyrvxQ%VryI_L@2kp8wl}b*T70=70OIuG=Zh|Oi>JpfgHK!rp#Lo74*7S6 z+yTenLoui)sh#0$;z_R5V+C#rY{uy7fKp|@%NvQc*$jAe@@0XZdlrX%Sf&qCZryzSjEsNT7var?Pbz$udoT57kRtyM%84Cr zwvQRk;%-4+N+CE@Tp8I{O{?_Lo%;~bverE$>gc4>vwdr7QUui}X1~_6yBmUqjcfP5 zg-f+H%c;Luqm^RVJUVGXS1QWp8BvWURHc-a4W{+d55ab%x7lQ> z^LXouWP%2+<@G9+W{vd!`L}RUMalZ16Z?lAciGLYEi4+2M|dpc-3fA7dVTcHgNGf( zV>RZEeznyQ7HE5+6pI|4OW{Fy-ui3aG(T?^`;@0vuPR?aD6WHjYm0HFA$5T$mx=GSa79s{hs09AFMT8ib z;|G>vfZPNIl@8fNX#{0Tps)B}t^m33bS_ZDsCe@E`LbMDc{#Z{NLp)SGi?YYo@DcP zQ9D-6Vr;I9c~0>!#QI<7r#k;L!M>butQfSbzzQ?e<1B6RBAZHpeEQ^*;^J5M?JGx9 zi{kX57#nWqs!DslIFp2V2bcWCY~elni`_cq71HBNa%bRK6F05Om%H}3t!(SY4+Zy( zMCEk{rvUr}0uz1?j#jf$pIAW1ah^a_mXv5HEcT>bW@D3gUsUZ)S*Ta4+ zk=BcDOkKxm+^XML&5uTQ&UyvxIm_$8A(*3EdJEp-%O(32Tsv{XFT+FWDgJm9;M}L8 zHXLDmvYhw6EBqZVze_4)z~*6uPM%yTOb)f@ID@N{j$(|@!j?@S{sH*VUvgWld-;=n zoE1H7-o)Z#zO|KwOA@WfRM!{Eo>5F61aES7YYq(FD6aVORwQpoUwi7RfuC}RMf^9K_?-FK^5#6pw0@0X?#3%iDGY~=?Uu@#bJ?$)VlUDE(jetxHJs3?FiBq5&w(Ag5f z!2U>A*IFnU#1NU>5e0HT2+s8`_!_<l!l6 z1EZ-AduE>}nPwIxmJ-F@Q-$cTO5~8E+#zEL#sEubOJnbu+fwXIcqcO2i@zfpf$Us# zL4a&WdeHytA|tJ}{Q|6Cwc|${>el=rbbSUe81)unqAt|#mZ56o`lD#M zdr{~+hx4y_@G^IBmAOiM@{>NBsvz_clfKlHZyt}RbPLyT;W)jan(vElZrtQBbe$tP zF>w(|dS=grD)Lzn@n`n5QOG`G#D8N!$ZJb*QpJVJBRN*KLT` zG)WNTEA|i9w#zoW@6f9_DJoW(Z>;YyM@AatTHP!?JUB-Me!&zYQ&SCY3mxg{=>S}W z0IQsX%xxS!VWH1C$0VtFe-jEpgAn!ns~qma zz#RRKTi`&0;;cJ2g(jz3jjWv9>?$`xjyy3Uj#<674ne zzp2XqrYirNs{D^iRTw{B1DAVn$;k2K2PXvpc%X@!dncKUp{^m?j_Fi6cot1$d_zM0y6Q=fUKyQhy0(8wsstTVtP8`iG$iygCb7wT!}by#2nJ=>^g@AZ8PQ zWsF68RC)4@qIs=gFzqo47p;Gq0A2q#CP1m;p`V6g(C-O<4&|;R68P0JwaTbEBisuQ zD9<(u)J3PZaHng7>ZDgU3YGI|mz4tqxb@vYHM|z90j_F>R zGBO@mteSTyS;wlmvp52*qOinyq`t#=OVt;q)g!KcY_G>UVr6KbWsin+Tq|KxM@Vyb zn1bR$64@glybBn`U!br^bCOaK&~91l9&9x0|P?1^OWauhsLvmk)CUm!LQ%GHLi4T8{718 zB}j?H>w8N1bBt{t^DJ7don5fy5Nx%U)0F5PeT)KBKjrpL6}TQR6AY`ZR zt%AvYzOIv}hr*6cRm;k|hYUe${LNhvSs!p*l3;>Ib3mUg5PTa5u&}m{d=L~wnv0dM z4Hk~0S7d5hBr;7b)T6GHcP_fTXvia!gT0{LzrChH zu&$!uQ-PKB@=7d-e;jBYFOeGh^D&a zkye3x?B1VjNQ}0E>5s8E$sax8BI$(giMupF2ud)gElrcO5rHapjkdg!w7pMj@9MfS z8|RlIE!%A)wWrZzk!I&sDP0+PKo+{tZR%y%0!Tao1U{f-RjS83c^x=-8p55h7!2JT zpnBQb*4CRUIj~`=(s!?y)Rq*FzqP;9;Lp=e2-}N~z{^1F=5S@z##0AqnqllD;*PA& z&V<@7k38Q)>N3)b@{z0bqXfpfL5rdh&)c15^xlT;vq#%%#G`YwZ9G@#kSp$WQ;awh zWRs1cZ}e?FT!0?Z>VnOpJqiFt6hB zh%lQf^}JC#>UvHl@-52e--4=Gcu;*R|IMp1R7kD5*B$EMMC)3mQw+(i9mO$fJ$e+U zDVm(s!d71wZc{X*9qKoMo4hCbjxSfyH~)UdwN}U1aqm*hVBF51BwHrX23nIhHrD%9 z6E7YOZYTr=jHt0nSpnro5x|4_%iEuuwY=V1mc}Vs+3?ETvX-QG@n*{HBIp$!OssT^ zqdo7`xK($j22~lkCdeTpkFNtBk>}rN!*tGNxULN5Gw|qaZf*ja0yWS&qM^yCQ8A59 za>H1#32Hu_gs(QheAfGbS>E(z9x-B>79C*QY)=s_n&jCqaMI%FQV?Ehs|41dy&fnJ zIYL2~CJOh^?teB!B`j2)peyY*oLjIhmLWw!PDF}zkbY0^w|*I_j5E{}G&t`P(g#hm zbn;z(^SsWBR_UIvrtiJPux5cI3coWMTB zePOhp8J_jX>eX%AUl@u}WH8()dKSY<5&S0uBO`~L#`#r%pVYWn0{mpcd#cV6T~%7- zIpK|v^BcBC2L4=!DEH#_vCiJI&cw}Fel-PpMOsaTxO#o&dfTn1CN7X^D;r`L}t6vK6wcK`c*@5sI z{Tt#Q;qZ=BpbY~ABdc!c)|h=sbW~KKQH>jbRM<1m5@$|Enn(oc-tio!Svjy(9&g{( z<{<q_GcuE`gd!~p_vC^dKJF@FdIRb6<+Z#){d!FtA5Xhb^ zVVsUtPJPavBs*UOp9JdCG4gz|fUji&?vP|^kBg%H$Yd+X$+mk)aEH+g3=EYX%l#mo z=?nBQe!NwmXqTSB60rUDQ<9G{XNJ4<-9vy(c-$ou(+325mF12(CV5ANRme2+$!9_X)5 zO_>@Sv(VDc1Q5=uxqEObi>>XrK_TV{5H{g%1>5$#?NF% zHwsJPI$#zgKoK}g2KK^xku2{sNR~Vi{r&xAU9sO;q0B8o%7c=d`qA`^qiX>>pRyPBaV3P zZ<_T~M3ryjt$oUB+_SjcQCmqV)5 z%cG9~x}%mMC;ROh#i^sdjlQaaX$>WnYNf7Hspbd2k89E&c30jS)cg~kQ!z* z%HflKk-zY$Cz%7Db%4tS9z+1(1avOu`1Zlk(d4A0pF=qm`{J5T4-Qw#w3&x7cy67F z*d+-bcF=wE1Z|~Z0N!$W_p8ed`nt~8lunX-CwQ53TIdb638-vjjkoc*3!zxt_6917 z97b0Rkn(EIKF)!zVkMnjU-jw-0&7C*OGiPXL^-xNbt=`-bwVOC;H`PW>U%*k{#e*SOnJ1~zXIW|j~`g0GCTotKtJO_Gzl9|Cs zj@;;kLVAPHqdJC3DenM6S}M^{*au=_Lv7sb^L|fBX67j$8E5Q~#JRLKCMMQP)GeqF#oM;9F&J`>8GZ$;pzhq-jJG7M6H>y1sVt*?x)~xqN0g4b!cYlJd^f zASnabNX3`eW(Tg)6Kfw)64uIECfQmqdym6@+#h|6cIt+h87BTV02 zH0q4-s>9Bi5+7fva@1O~27Qma*ia=>QQ^`0dOshdO0Da@iFSN}l)>doQ1q4D)PhAo z@DVoq~~nb1OJBwqobng@9LoS{6Qg_3cUI|`u(-##IlW5*S5M5 z?P@dzT2aWkm<;-F1bWAG20TX39r4eWDfKEHvWU{??SAOy<>eX+&Ibj@N1!S}NyVs2 zc$1dK#}44nSowpWyIUA}VDN2!sS*1f`f<-&-`CpETj!u zCCVQ0Ra*jWmvV)==*iRgu&`X)_50Yh@i^v0*3X>P!spc32gy4P=aFZE4g{tiuFK9IWY0?X zrjJ!4d7V&j()J5aB%J@xSnWXX_=66O$T+}X-wi>IoH!16bP=nNNE5pa@c#FRK_7fmV6T!fvkX>BdVXu7uN^Rr zpYorX{9fMuUjbZhV*eg+iQ-Gpjh@AoNv49tVvJgpt*l0|dDNf=m%MI;G*kt>7WaoN zVi<#dZgXT->gckpcp@P*LyxPH7#DIb1%$l*PG9a-TR*z!0Z3cgl{RjrV0E5>3|uZ+ zRO}q!Tgxichb`Kkw1Yz0@V*WXV4`>K?D*n|jg7%!g$9*&KcfH?U!+%>nU}{YCgx>h zV*@0DyNq}3n%^37?uCV)*{HW98Mnm8%Kd0OHlHnRJy2#PKqtxAMG;VxA#h@S;$d3vpuGG<=lee!Z~C13k@F~=41?au5SnnEiw&q z78Ut?DcRlq$GFP1HT@P6=~i^cR)~Z_=%$>@sRZjLTLDJXeFNlvg8!$Iqj3wht(s0U zx{MCK!9x~j;nB}EZ=bpUnd>5D))V?D@a8y$u(0s4ezTu|G7c;!>H>)dDk}EiiT1sK zL{h>P-}96;&>HYi5DFTt53qm8fJ-HcLyUcd{aWhj4HHGk0F*VJ2MHy*kS9#A1JGQkl#A8$j?gdUx dPT=P$RKsr^cYBqe1r`;BvZA^|@gGl~{~uryBisN0 literal 0 HcmV?d00001 diff --git a/docs/en-US/images/configurations-screen.png b/docs/en-US/images/configurations-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..54586086c4cc6ad5745c7c00ccaeec2bc8e4c165 GIT binary patch literal 85285 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 YL5u}2X&2E^ogD&`Rfgu?x&P$<0OQRfO#lD@ literal 0 HcmV?d00001 diff --git a/docs/en-US/images/create-account-post.png b/docs/en-US/images/create-account-post.png new file mode 100644 index 0000000000000000000000000000000000000000..ea5ce3feb7d99e9531a060ed0d344e0ddeef5559 GIT binary patch literal 116063 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Π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

MTw#L&n`Qu5;qQvp@$|?n!)F_p&R1O zD&tXh`z~YU%6F^r!#1c$8EZG@DWrUJx##Ef<5leA4576=i2fafGIg|FGv?a;%0h6~N33FTMYM!VN$QAXlI5D=v*R^81k7M*+Ae z(%zu;^?RA@U1iR<1U}c<1Y%lmRX^Cp#%nC9F~C&h;L0%%6YYxTWUWNY(a3ev63_;P zW_Q(x#B1cij1LmOzliv@;+yJMdg;E70b4L8*H-vKxExz8kaIA2Uh`Uf1}@UrWGY&$cIicVdsQQuMje& zgYMMjS6^0g`zx68+c3}R>$#CtXZ^)82%nM3^{i;{d6!3L7WA9zB{=^waU`Db8SEg^ zx&EG)-J>}rKO0TFGK&e?mjS;qnX}7ABSFGbUu-*w+U76gM8SW#sk(w;)%kA~jN;6t z7lT@Y-}IKu8U4J}uiXdfSt=VZ)vHjA_frxy8Mf*=W2_zp|FF=q*%s$fv@)EOPNIfo zV{0UUy@ZpvsoI->*OKuIWA0HacME)UANpPyO-Es(=7NRZua8c}@tB_nd`2^z2NP`^ zRektxT{_brg|^h$GNemdIgy>JU|@E1mn&wsbkv_>T(BN5TbC&XP4kn4D=BXV!1u4k zOKvX8P0Zv;HVm=8)(t4`WBye!`aXsJqQ(0vXtfL7*LzGFa$ue1uKx#?rVva_o)#*_ z2CgOK;M|aIfDJb9 zGvhe^6kt0)SZlI!TPOaMw%=%0J8#~%CpcrzU9emICe6It(5b?J6c&c~E|7MSvz8pQ z&~hXz>J!p^wq-7EvOCOb9)~l%`o0)gyxFeStj%-t5fS(8mul+s?AuIBBJaqvN5l`54O{P#1E*EkVH>;3S+s5y0?xx5J51 zUv|XxCH2wUE|LFs7JJS<`3>vIA=hNB2Bi5pnS!9?D?&DG@9Zi&hSr1@<-D(p%k+;B zH;QXoDNF`2UXw@1RmOh57FJz&*2Zz~o-JnU?MSuiMciR7E7|o5lHeW_lADNs7~=jp zitRxbrjm|$GQ*J}H;B+uMFLAqH`qQNOx~I$jbhW+o0u6p9q+Uh8A{e;e^ZLtVW3(c z%PWvRyT(O^3Kliq36GsbvbyGzMg^qd{J$Lce$Lqdy1C+)!bKAJ?j5{or}0=1){(YZ z{Sp;QJV!OL$?rcy{wMgKt9mu}J%IV}1uA?mBM^1dQAbv>ysN{gjE33Y47FCLm)}w_MA4 z7Em-%5B?+K-!*sZ@i|iqSW$6JZ*;R%cCBsTy*@w84!3@ybj+@qs1-%(dvCQp@h)zu zHSOK%O7a~L$%EKC?<+AJi2WkpR_%9m0%YHC=jk}YI>ibA_);=vbCpDHNJkOSaij62 z=+`WD;K;?^q0>)9{g3~n1#l`^zplmXHF@ic(R^kU-hW+cWiR>e0rInFL(-gDSuR?U z?>n*Y#-HDHh;+eZPZws>g0#o!Z4jjbm|b|!z~j8j(4b-$<)P<)?Eth=E{7#9E*fXg z<>C*~4$|0a2iqrB>G?lDsQ+RQ@yA0k`?3mAC^=@lcvApF8;Ab^2kFal0O`~6?|RvM zS`*)`OcK}56P&mq?C>yLczSd1WeZxgo7;aORmh~milM0dG_WUirAqu6yMVON3zEQ^ZNtyj5czEXuU5*vq68j=s!F;-x^uBrV&vE zFHZ4^Z|Bp z9Ad2~D~m)>lzac-W>Qo0w6(sjC)hSs5cKj0URa z)!RHru?uS4OcXg?lAOEzY z6sQsS9H@vfwDyWvJcBv~$9 zQgV?K_!~^!STIda{dZnZnOy-Nha_a;Kz%RC%3!#o&^>R>p;Xs>ypW@}?#KRx;xCoieA zC|TczcTemxQUEj0l<7cTfh%+e`W)#ceEep=rX0r)f zWo`g{Mhctd)~#Sy=n`b=>gPc6_iQ0MiK0|#xo_(_wgH`q&VEI5f?OgZb>%BqxS+?A z0rtYGjh9sM&V@xUDaVRBb*KcvO*}6&6}?kbUY*3AkTaBp4G9IgE6twBJ#3oE>Nhn> zOUX!Svc|1gg(TB_Tc0)8u5PTprwvTfx-fhZ0cP{+s5Oh0Gl@xX7=F={7r)+p%oW5V zDhvGb6Z;551&Fs}{9|4rC;eFDzT-~q(etqhDw|iVuGi&s`YwNr6IdD8GHbk!EB`L0 zs4-&39W!>;l%Dj;W(FR8>GK^F5eyO2ojQ@itE%sp}6 zn4$kmc?*lbbm4Br?5<@CUb^`)gEMu$4pv+>8T%-TZ5MOosS66f;plz0tEVf+xuDN| zYU=d6I6H{=?QRl_CcU{g9>G+5cSAY!1@Edtxfo4~M`%^)os~U!-P}@%hw3=>+`-t#H=}+UbBU_>`_H`vA(YZ zMsiv@;g>!IYoxOJ^ah=Nz#xypLpg5I?l~Qg1+yX5R9lexl>#thB7UDbwWNN0zeY zI*3#k6&twxE;&MD-IVQ*Ml}LCRS{RbaahJj1HBENoF_# zX&wjKL^iF%SJ{Z_%U3(xm5^ayD^mS(e+T4L+34!j`}X!Q+`uYpqOjo;JkhtFr@nbZ z=O|+acHi5>j@tRCWXc4Yt@T~@AA3|=ZXhJQWUaS34w$J-wDeAg`#v_iU3Q0eiWL_1 zu;P`ftn>Z8X&URb)XNFa&rE3{!TYf!8zlFlP9oi3-7qOiOng3#Fk@9$H2_)I1JTp6 z{$^n>!a;iR&U_k@vnh*U&zgQEqctKMY{CRpPTM8-_9jDjOpPs>wm^}$klGl{M00R~ zOB)p+wxP-LO=?ZB-b~O7NcH7B6ll+u5UBZW@WCH1FMSrk`L~lkc4Lz<`E@^bd3AGOfc@hsKTM=JPLi@cnvF;d)Bi0WEkJFQ9 ziiVlkqRWrpSypqon%2BCGWT@HRuYCCiW;>B_BL8mC`kx^dSKlxzT|Dsh`!(0QB;|> zOhsnwtP_pZg9{CoAIPs6H`clb*gu%^T5gT5jv5$lA-cqyV(xT=ZY15k`&`Cx=fc+C z>aQG-hGl~zT=wmiZ2AaR@b^s(iMeY28)`N3`E%^cMlZst9I%ScK(JC%|zFYsJX4$_S&`$rk;)X5#YyY;e#G2(Q53HTy)$FiltZKjVrZ9 zg~M8plh+*jQ-Dki z1qdv~y2^IlbQ=Q#Mvy$?Bd0g2MD@R#5C!fgZ+Ugw-EYG*%D$CdG%AO=+>SU-U+#or z!?U~lDV9r(h?nZ^1p)Jln(*;R0H)pC@ilt(b!VXI+Q;FV@>c9ycG_pJpQkq0wgn%0 z0;B5o$*0YI$eiG^RD>@Jfwc6$UL*%p_Kz<=O4QTaD>1D#UGQ?5H2BW-<(q(icdW0D znU3wDn%lm}G&1lJHTiu;bI0-9ATv%Qsj^(9_O}5G9OWDbLeu7TH+!%eStrW>!HEmr*gXI@WFb4&8SEmz%%v(&T+6`Cy5;LQ*s!qC2)EK#*yyfQX=#+ZYGn7P zX+gQb#>KD@pnntI)S!Kyru9qP+bcAU^l8(?EU9u_>KOxvCQB%w&;OF zo(RQLf_g~L3Q>F8+WM98*~_UgRDRT1!^g$`KTi-5N8&rVqA+|&<$koe{S&#P=gFri zdEjlbp#Be|CjiCIf2ZwE&kx`H0R0$}!3pz0|JIjZiGp=T&nE*y%b=*_#>4jfj8`Z? z+e|$ktiYms(nBpGgzwkf$n2oHJWG)xoBP7!ibAM#Is{kLjmV)a znfGfjl$Aj)-bGIop5IAtc&Gj%w-&Qj=b*Bl4STl7tIEG^a6czA33XE|KT%h~G%>lr z+iNNldTF)u_tpWAb+^S9rtRm3PxqRxe(+>)LNw?qV8piMvR{2w6Dl>jPSKdIRdx?` zTfc@l%Jv&it@~b4QHdceU~{GL4zM<25G~v+UQH!PO$7NGkt=JkzTRV(mKVjPqLC?% zr7V6c%U4u3iWU}x4Ipee5lmDoz7kBQE0Nt6evNXAna>`dNd|hZu1r9XkXNZSB@P>- z<5CG#Rr^;>ymRXG)=nGrg44&}+SXQeCgm_4@6+Kjp6HXXXyYDRnM6MIG9lo$7{}%2 zX7AI`k|@(kmoZFz%hY1C+|87P=tXcp?%v(Uc=``AE;Abk;jS{xXG*chn?ZAuL5J;d zr3Y`|YdF_B$`pk>7h_Dv90V%(76Y{5%#lfnV(HqpxZ%! zeB-=XYMuPs8JxN6j~4)C7~mU^^@dV0{jA3IN}QInGJ1uafhcL^s2nxG2lkMqz28C0 z$dI+-TO;=1*{~a+oo0}7jD%MG;!abdWb5hT580gFh{}^=i(u=5-2|6iri`!hWx-^h z2QE3G4&F0;u?Cp*QAWd{4UHx5*6!2v2oG9acHp+-MC6wzov^7{HSC7jvN=O{Xt>b) z`9?yIm>~R%FV^@QHgr@oUVFUk*=sNyemh&O*w>$h-S;5!ru4gh5=VTA=c+A}&@PdP z;I(Rwl59cgG0uTFeWPL zT3@1F=Br1JuHl_k>8+%*u7}?5y6@jxd~-fNnHIwZ#N#OUR{OZTYp#2L(B=pwT( z1UQh7$EuE#^N+io!RCW{u&x;S15SH)4}T?7`?c*MClA<__uwNvYu&x`z{D*SNkG8o zuD%J!Os08J;Fg!-(w@?;AE{-lHZlx^M?VC{G_QKhO&Z)fkQeJDP8~hzJF2L$D7aap zAeejrs>^89P9+3!Bw^1d`XAK8s%CFL%R&*vccs4`ShTpE#8G=d;Rz%Qje3G(9pr#F zNrMiR5vf8bE|;LEC3U4P(;Pyeii4GQi`^zeaVdrQxx;I8`)2m8VMcPakUzUf(!!ei zD_uMnib?^8nd&gE0U@v;5YSN^R$SaKKzu(V=Icl@;!Jgn z#LXf7rs?|9l+1t(?kWlTt|4HDt$u;&eNb-uY@BO48~K)O!WYBqhW3jz0bH}-Zy|*v z-yJj%c7!+(O;L(O?M1Z42IoG(&7UYKND6B07Zh`NNei379ZIz9wYJ}GJk`HSaIsB{ zg#;TIYviuk?inomc1A~w@{5+IxSV&**Qe`=PWpZdkW?aQ^^f1(`R_-w}x0yrzbelf>x53{-xj`odn#L7;DULf!l15KCuU1lROsZhT** z)a0CJyMxg8bgW_a6Iga&2^aN)COs`JnX)7wOs3tsXVjsWApN26$R;B#0H9lu3zd7MqjyF{__f~UDhw`-ce&)I(+mlF|?qj zd6mKs7ncxSqB-0^HrP^z%N;2VHhB8}$<)?cO(e-wxZUF_uGgmvmiHN7+NT+95w0jB zJyujoDxuHS-z$&Xsm;Ac8a*02{yN$>kxI1^*$jU&3^|#`_S?izqG^IKA?_T2Hk5@g z2J&HF$@QwT_Z5+p*)wZB?Dl{m$@E2IDpYF#=tra zWu%Oa_UT)BScj`^ToMZF5b+Mi#;TTBwkVzt(Duymq@mw*$Zp<8R|W z28zV@=wKS<0gX#x&%(f{V`jb#+8liOtd@N%Wm@oJG+XS%>aghGYyDIi*lhgW^cv`Z zkG9oBI0H0yjs+Lu6>OUr7dC=qUVHaXofC#r)_+U8r0StbJ6UXfB|GMA1G8aOF*BHX z(F@r_NX+?#@(%=`MI@-OqLuGY;}jPU9Wm;0iEF<+a8ltWaW8NnVkzv%DkD+Tu1oEVz7He!(}o?jhix!_CnXh z{^G}xSl6~0Ok;LrYpH#wM(2-edUf^_VkW@wpEjjHO4q;UNrDyy`>Y1s;PR?*zm*7n zZZj9h?UX=uc?y%tQlZ?PfvnOW7RDOm$%1{1Mvl~Vb9vNpM924^1-^q!8loDA@Z2wV zkKDv=s0nDJsFF$p%d_tx?_n^JvplX*Q+fOTNA1ErS^Z|-{Jsh5IHn|6SwiQSBD{aeL z%WUVl{NS=pq3Wf{rQ0-V8Jc`e_^p!+kT>vZNqg#>f~{JXXHEBR42OD>Xy)dmNI#?* z-QJ8eL&u&dz^iCL;c^97u>^;qM&TK5?t)z+8NjlIDWm1L-AhNEf%f$$=EKe zCEgb^3`(eG;<{Fhz_MA)-X+X^Jm0@lb4qRbLht_6?C9RtwmJD{$`gnoo2cL`^a$=Y zqh;?lhdriW__vFKyPth!ZcEl+tAAXhfQ243xAQfjV=!^j4i@@BED+9c0mD>y=7Pte zs_smu+7}%ldy%GLh4H2o@&FT61NCpI@HRqOgFF! zOgCt=DQg*h739Zk)-C%I*Va^K5gAgaT6^U@b%82$g|5uyBhr`6mj&5JMcO?>W*jN# zBBvg72-+`RH)O^BtCT(-ZAVZZ|S5;#)S{d9uhDhw5qRQ%FdF}Y?WSt`=dFh zoO=)F@%22kG2QQK!)U`tS=#6iV%Igoy%N(eL=!MI+u^0hAITeKj1mY0%J5HPl6M%~ z*u9j3K1J99K9JAm%vY)~j_AO5{O9i)!dapPeCJ)dgrIE~m9sD6(DTPl-d0=ZhY=Fi zY6pU9H4;zG`~dMTnGq`APQ9vn>InOwHJgJFG3u+~OclDBP_q@z_$pnvah{u~wk~tW16zu1b>S5AxC;C6rk>BM{`w<- zS8@E^JR0Fl=Twl#g0MOXBMmoe_GllSiligqP6S`+bInwL?V`BT!RM4`#P;Nt@SJpCEhzqTnm+uWPujorn^h%|-clozeolW2J)C;!BU-x+Uuw? zl^BqFmyefr1QoMcEvi!B@e9*QgdAFLoQ+aH%kM#_r@vo1c^+4(FbCNjyl~;Y!3^_U z-!6hvJ$_$k&69stu5O84cbc8K0+{VFYni<)xYB`P7KHt!2?(DHjdm{CFKAVG#l&_&w%OgB0| zB9vd)4Ac-VpNpnROVrcQhw*H)Uu=*Utg^Cl`sA}5i{H|Y4qCDL(`>F<9*rM34p?%3 zjHrSM*g!2A!fKFhbJCONp?0x}E@HLK*J0{W4YfT4Sbhb(HH*IKG0)&6*Qp{Bj2_Z| z2)JcF5A7Bp0g#78i$CxGmJ0eRv1l0&b_<%>Tg1*;Tp{Z1HY^wkk)r$hmsYg%ly!n7 z2dkN;U=h8P3|No`;f{9bD`5Z!($Z)6?;q3CX3&=V9L$)2gp^{9e@$J(X)_?QIvW%2?5 zFgki!R8W64VPZLluWv%WLXm1@cE?%AbeKDNG0JxI?roCFuEOY!tBjbwZ7jh~MyV@Ip&Ka)o) zl5gxSN!$3}f1sejb~e0`5o9NznDn@^vyhhiTc_*XUp(3jiQn!e(L~?&N#@}!(2&;;SC68~eUL?E7_7k%ms>UIsVUN< zvr&HsAf>*vH(L-d1#v^Je(^@Zgc04z%A6k~%$U)n%3z8ICm8Dq(91MytysVZ?GeE~ zz}>fBJ%pOfJyxh4$`t1cVNIn$&fQ0w{gQ&0k<8Eb(6T zL$4C1)F?3MOt0V#lB75>YOUblcY8?{3*F3k@|facdXwk_j>M%DlVPK|88q1k0P6O7 zz2LO3a^?6HGIQcZ*M@xgUJLKQ0c>&=(1U*7{XI3c#zGm3Z97e0@Uti!-jQ9tfH3X& z_N#)&FsWYo>}7%R9Ch4dWUfH_yIdf-W`x_y>I_{B@qt(Pvv>#N2J*58=FwA1BrdJV zFW%3XLXQluOPMl;aI2ALuDXW?OwMH>-A_%h%ma?BN1PgWF0(u+Jn2Us}|o1Xh^evvAqCkghcxmfu;ee)&&p+9G(-2DqP$Ze3Vad57m3pk@DG(m- z9v{^6Zr6Z==(7RE6i=Gk?vYNE0a>G$@S*oJ@?^OMV?N;{K-4TU%nUf)B7G@ z%#aP?;!WnD1H`{2IX!=Zwah`L&l>UB9d9`j zs^EF5*G8==NYq!EmZCR$O=VusiGSP#%g;9Nw!hedU$U+ljjM$XUv!RR&ECh4-8q*l zZfv;jVKsP7z+PNmkMvFdJq*Q{q!BMmQ7<*v0_Abnmq4YZy@0_Ieyyk{K4tdJKQh#x4J|SiQQEm%pPVzPeEQI;VgfVH zwPJNB!1(m zcIbFm3Z={60gclJ9aS>>C^^17Sh~Mme_1P>#YEkVT(94cE4&Bv_VZ02k%HLiv!Eiz zttpPQZW)ULe!M7S((P@4EM_RE4U@cD^8XJnSZBxk`Nfy8NyQ-=@STQPC&bq|Om_ zINJPjqGroz4z_L{CsQcZ1D;;$jC1#@#fVW@MeFIqH*sq;;Zf8y{FPI6m!|I~d|FU) z1_aL-W&OgK*&GD{e?P90SQv!GS^AqZ6`vhMjCI@Er<*ZCTEGXY6&Dm-83V@?ui-GP zz((5re^}1en>m#){hluUZJr8W01{^+S=Q2CTnm*zzGS1nN(El?wnC4=*M}Gy^MK1W znz_A<3=nc2-&@`_%b8>Tv`6ddyi~^h`SGb*2iVsQsi+`1E%v8QH01x$0)UjU$&jCT z)Q9Yg3;gO=NYdy@dmXY_cFou8j+KXpm*aG{SFZ!{5~st#)J9@=aiB2&^R<$1?5#4J z-eR@LE;_A*SfHb$3y|DPq3lUe0roE@>eHW(lXMw2`={jFX@OjtU%?9Uz8(Qj?QGZq zgfmWNX`OY6|F1`462DKx9U~$)X5qXxdCUBM{EHbWKScbOEyE4|9FFfgmwO02{X_qR zb+8L<{z{?b=*MB@rB6$Ft`tZ{Nap@oNTlDe>6oM!-slLyn;Dq(*j(IFLGi)kByhQu zG{21ZNM%j5t#Op8q@O^s<$BhaxF?+V6%K1|-*i!_604J#eg@8QS z>H#NP`R1nS1?lKpB^uMUJ2AF`mD;x(|4zq`Hv0zWxIR{lB}DdGmkMjBYYr|{216lSLYQ}C(fF7;{^Y&tgta<$rjzTZUy3jn8ldz8f3ZuFoht-i{>qh+ z;pJ_aMe=fs8Oxd(_&?B}wZJU9M*eHUws=bUIEvCVqz%QAJ%}tn4%cfi66;yrU5hTe zbx^WbqqPoEhRids+4j8ChZEhnJ2`a*BI+?y9V46L%qjPoL-(m{LFPhbE)|?=<#~$7Jx@iPitO?y{`Dpfb>KEvxnz7?fQov{2#rLg--AK?d6thtpx& zfu#MS*PWU#?kY*z#XK)DJ?mhN>>u~`JwS(#MRS4HJ4=&n4_As+&O`g^aC$%M@|VYf zh*TKu=TWJu(W+yLT8~#N)xAdiTDD{tpXxr^y5U=nP4tr#s;q*fHdwbEd@Z31hh57r z*&8nQb3elcLEsH`=c1<7U-#x@y`l7Ht0`tkm?k^Nrj%dvV!i)1ObwJrw(TO_xItr` zU{VKeRN_h|lZgtHkwSICNNPlj^ZJfxw1ay`4|`aq`n=|Vl6{{BZG(eKI#r2YPWQnx zrng#!&#n*d0&b;Wo%y8nBwyB8T%0SO_Y{S4_Ili|1%i#(8u+<4O)>&&$ZKHJYx$Ou zq0n73%y8fLjXvGdk?U|<&C9Qdh`o%--vJh)WwVW^Sscy3i?_x_HEJVu0B#cO^6s8N zGnSeBZZx$VvNP;3Wf1Bzm!vwt?S7qTRm+pNX`do-k=?Q_6(R(?NbOZ;cs1@f_&U$I z)}U}Pcdy$?1+uIC$x9uA?=A#cYSF@nOe;42!0^j_k4GWcx=hK4KER`)OdmW#NulM& zJ}=;jn_Ogs)AU|JwT0MdRUb>*M^sML{vkY|SfEbsub4%dOF?9Bhv^m}r-jI4dkc1nj=t|pl7zLd(&5Xb!3YE#|^uQV;z zIzJbt+`Cgr()-#!&6lNSTH|ETd>P_LQMH-V7CN$q&GnB~DwFMpO`1Qum^ITJ=E8f;L%-1e zFY_uhMbkw&2xEkP9!{rsq|BX}Fr}+QphxR+T0UZI4 zJGkAO!Xf?h{HN&$?u+~o#sBgiX3cSL(tr5z<78qeccX{|pJ>+s^nHNueRkSmto%!h z#ToC7d`roz@6vJ(oG~W`q}~0K2ly4XbH0Y_6jRL)D?+=t~1BF8u%6;+DJ<;9MWW#&gG<*UFF9JNM_DmVygncP)wviF^0!S z>i+l9F#m+3Y*3y=qZ$Ml5;jJ6n~SazNl z{w06F0K)}&<9>Sfvw@fqu)?lIqs#?f57w%;5txEmUD_G^MEvH##O8!QlWkyYD3D3BxnFG# zuM)$pbqnk(jice%j`-M;y*xfeMhZ25Zd&WB>%w2ZdlTSh?4<$YN{N1{1}Wkao+)Au z)nc`0dJb5U6J+#}vye)>U%)!6eSLtf_Z9^Vf6guj4@F}0S<&sWF_nD1bW$KPk|1){iVDmFQCow4^4v4o@y2RV`Hx9eqDZCF)m0~pvm@NQ z4YlZrg|Zuf^PV`{R-$3Iz!}i2?)6*B(m#587Jc6SuPa&=GW@1hKQMsWFHTib8}4Ae zX7+}x8%^`-Ejat79Jor{i2?Z)d!{pJ-MmkAtTd8esYtI1NhS<9#!mb9Y7LM^o`1L0 zETPNG`WwsLt>Sm|uLpc9NlTJ!PLP}jr3+1~dQ?OJFQ*MrkRS9=!=(oF5=(MI);DJe z(Vqn7F`YLCGc*4NH<4Fa@C$(fdd1e;da^v=kSB)o@s!L!eJ~jyNOcVAT3G;)TevaA zE-7>OfcD=Y9y6t3lMJJU2Jv2X`0qv65u1&O=icl11#1|s8v!Mp_vK>W8+EC^gDJ%HPoAm|TGsw75W<^{bp0sc zRg$bCRje=YeYdGSC2HY(-W@{c^K`q`Gx%|HWA!Q+?}W(v%;LJha572x={feMv!6UhUH zqzOEfWgA2zf?WySQm^2^w;=9$YC_DU4{;kWwp%YfZ_Vx#H6Xn+f!@T-Lm2MDLv;`MwgRrl+TS#&GAzeUx6)k zE6X5CBrlGTdjG`T*sru$)Uh>N*nj9-oxtFl$$^%N;rF(~UOpP_^Jt_H^gZ;dfOos8 zED3yadDQBhc^*h_-}@cIfZ|79{8}>eJIST2icuV{53^oN4_6tx-v9J5=&xd*O{&{h<) zK;m56_)LOkt;@&=`WDmqmiWZhrd8W8I1-DO^Vm<&^L94famYEllWsq(q%%aApBA;ugeYV#SKH@8z4B1Ab|{4*tSt5FMZAVhAISC7$JXp8dI(P+$>+$xzja&3l1AxBC4K_peVn zf3tsB2f@iV0Dur*(&UgB&7&;@aH)Y-25&DsU7D3_Cy%H5F*^ zI`}5%ckN837x$K}eTyR|B4lN(IL$7B~c2? z)TS11_YH#b?q8{?soNWj&2p#2yG+tpJqZZh3LEH6dsuJfu1-Z;?rnp&ja(!d_US(N zo$#e+avl>~u_3$n)_LfnT@Oa~w!G)?#%bk-VfsY226uH zlWG9P@sf*e1$#Ykyla?qBryBQ{h;T_q!Gyp3fFHWK&gz9;O)!eA>Q5tGP5m8}i z++-c;y+#doV3X-EV;%2|U=>1rl%j5L4^{8>wSSuL_!#uXgu2o1>isq2i zP=8_NRXo@9*kfRf3AsDWl9)AdSz6f3I~6FsvrsUJ$E~_)S`36nQUK3h%Q2ZVUhs-=(d~T|L}aA7 zCExN$o4iomYWw=o(WXA2lyCbDXr%pkR$7K#LwZ9ig;i`q}W~R>Kb4Q?H%4etoPwS zTvo1)@ph!`UP-Gj`BpyK=_ZgO31CC$+pc7TQNnz7+?&bP>yee9E8SXM`kTDegCLBp zcN#+y)TO*1_(%aT5FA{$SoUw0uxG%xMk@U?#K(&Mns?jr?UBX{g1ZM3JQY2Wp9QMKRYj;BWdnmAu5X9b1}!`Q0Mh+$by$5OoypDZ zbTa1Dvn%&xVzpB{D<=iq>*|uPk;uNZLS{xa?727?rr|sX(hMXeVPyk!_^CX5aSEde z`?!q$ABzQAGiEVLJ(y=YiLY+nQ(Q`coBka$Ha{wG29-L|6;eSm=MX@UgpBAuGmlPr%%a28tr!^ z4}b4@L-#*#p95rXXpZ|V_BL%cEE^E*^v{X{>Te&Mjh1c9;0;~PiY2d|d<7Wp#{yO_ zN;RJ*<_BZQ1byf8E_zQMhV)T?0& zuF0qm<9h>eISL_pzRm-^Wf-gsJ^Z6i`mJj88W0iuQaW7E_MNVXBGd+MWP~;P39tMO}jRE#TdP-g$uJBoWJ5H2c@v=X=GKK3*1w}Y4a zZo8TmXUfbs}7sWLrF*lJ*X@|-PQQc+Pc|S z@4__1i-YF36#xl>CPJ^Da&^E2`fk&7HwRa4<|>V(l(auUj{mr$<9VHZC}R?)uLnjHNB-XF z?6iR09dpu|;ihM_jwB49wW@3B*_!>aRxh$@9x#2+wfH;bN%m>m>Fs66BVwu`{2kyyk)CE4!_4HO8F*(2YZ22GpkeZa{oRLWdpzu zmObNSPrbmc-*pi z^bwq(2LPPbPD*oqr>}&ousL6g>g@gIq<0>OTJnwL@v-m2R6E*`&aUQcWc1C_Ld8Kx z+o+qh#o3Fy4g2YCR#v*=3ak_SL@&4dmA0Q&%~IVnMg>o(`jj{#lUHAdu>=vO?9D44 zWua*^@b?_4)Beh^jU4Y;Pd+04MF6$~2JyxUDZu?#-#F)fI^P*kM%LU>?3!4UH=$>@ zhj0!3IY4l#pZi996IlREgYxR1H2=()y&O~xN7QM)!e8gUw0t#Ir=}8ax!dp2)Kd4` zvXHev@aWWgx}_A??yLE8R_DhYI(p5r1+M#Oo6WbC0CFj>M1B7)n&>N9`&k`Y+q^j( zZ9f>z6v4oqn(=41-+Cy=hOX|zTD+6i0gWHfWUNLEq4jg*(xBhDCFo|MC_u~$4%#Nm zR2$jf8h-io*tS~-0(*!Xd1|OPY2b30lZOckO75&H_$vS{zoz9ws9tu)?_6X(8;}wd z0^i|sQ58dxv|mX7d%I2%e?IW-X!~^EH!{bd|Ct?$$YgztT~ABp@hFYKwC7ViJK*7@ z)SG2riOs7OkyXzIHPxi!kB|Jg!MT;L+=_XRW4f=h-^cYnB=|9Jk}WDEmA|t$Hp)>n z-N#%kE*LC~jL( z!~g-^Orw)lHQ5Xki(}%lQrE$&9;~5`UDe%Qmg6HdI&*&Ns6(-r#{X99#lyXs%Ebdl z>EGXmCz$ZC&M^7Mw16Mg0XyT?47Z{7IYILLNQH!9UJ|MI!JebngGVVoMd#Pcn`a2_ zo&@Yi<*#$@7W4rY#kPVo=-Ib=nk+_On}*L&a}V6J!UC{x%C=N zEOe<}38^A0q`rS+^$!7BTFVhmBKnYO&Fym|W_DV5XZlv} zXnY^WB~A>Ja+<03_IiKeI5S-uq%RhqY36UgCpzBWa8M0Ndip#NR(hewPvVgWAzEul>U#RH)xfa{8J zHW3adc~0tMDTomxX0f=nhm}K}N+N^LXLbC8Q^~h{ntUVmZ=7CVcA_{a(qmS%YIHbv zgVvp2IC`D=!1CwOJ3(5|-cp_2m%@OP`AK_QK^hbH8_n+bM?Um=#&C_g!i@#TTH+@l z=e2ovIv=|UzGvxyqP)I;{!haeZj^Bm$9UIku=cs?TEjt9vy7wRCRGj+CZ^dR zm6K^WHkpW&{smX66bw{6y#fan$B9iu0RTp2NX_2@&cyv?oXU|XTGIma&UE&Y)Ug}9 zzXzR#wg~LqdjVOc}VH$jT@(ak3b)g0?e<=@+8pu0NnT?cSTasDQ7~IgXINe1^6E{;TQEk zp}Kh@74WV_rfU9H8W%-)dFNbzR848P?=)*vL5UfP9WHiqvHOK9C)hnc!yQi>5}#Pg z4~PLYt2!94Ke`iBkeRsfD64Vz;gf0#uBSKf{SP-#hdQ5d70CmN(`e zMrUVK7pVwZd^w*vW}8%1>j0QgYeUEykqf6LxqUsQe67DRBF zC~O3X5d-`rC;@&;1L%#p?E-4$a`kE4 z-hY>p)h@iv`Ozt@V*Ls*KtBQCZ4r%GwotmivgcPVz&-~L50Cr5Ek3I)w|nsIwmzdh z+B8E@i9dnn0yx~d@_;;6{<5a#{++P>|7Jj>6VlSAbpmO6$a{DHgdv=9ieXLTshinp zbbRTcpXS*&fZOML|IK%Nec�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 C7SuBU literal 0 HcmV?d00001 diff --git a/docs/en-US/images/create-account-request.png b/docs/en-US/images/create-account-request.png new file mode 100644 index 0000000000000000000000000000000000000000..b36d1ff557a733bc4df557744350b9cf054e80a3 GIT binary patch literal 169834 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 JduZtQzW_O0`aS>v literal 0 HcmV?d00001 diff --git a/docs/en-US/images/instances-screen.png b/docs/en-US/images/instances-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..74a1f08e43d427e0db3f24f7d10e84a372893270 GIT binary patch literal 66865 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

?cJGpuWCQ%eK*ai0&P? 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 literal 0 HcmV?d00001 diff --git a/docs/en-US/images/list-specific-vm.png b/docs/en-US/images/list-specific-vm.png new file mode 100644 index 0000000000000000000000000000000000000000..4fa1da451d5640de32a321c1434caafaf06dee61 GIT binary patch literal 86323 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

D9!l9fpb%OP2xr@oLS-=NOYKMqyS+}6=6??=n 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

6e{SJ( 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 b|C#IJOzzu@+yGwv#=zj|>gTe~DWM4f{5hL- literal 0 HcmV?d00001 diff --git a/docs/en-US/images/start-vm-screen.png b/docs/en-US/images/start-vm-screen.png new file mode 100644 index 0000000000000000000000000000000000000000..75a604a7a0ee51357081f1260e0ce1be40b49713 GIT binary patch literal 65228 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%0D{>UVfmlb2#?es&!& zbh7|qV{<%YpDlJRU^JLpm_zjs`1VaaH^e96eRFf(uRjaB{^JUjUc*}5+13#W6Uyo2 zDW3}wzSuzWUJw=E&RY;!Qi9h-B)t_*2Rj5!`wol8XbW-pZSOn}W_P?X(jQ%dJXh`> z7)%z6vg0o{s(Xi{+VdahSsh4m=4!jV?Fr{)Aez>XY01rL(e}QRzzmljm5kvrnI#b8gE$R8Pj?Zx_4rQ z*xD}()8lQ$v&-W;S2T)jdwu(Xtq7WJa^8NCm}PzO6>bcr^jVF$zyl^0i3tKb$Vevy zR>D0TWL1SbS|u2MCoK@~y^e`ff}#|h-V+PG+pnXg`t*T9d)VZ1dB5yUfHXd#Sjnrw zTE)2yBWdP2vA3JFSeSG8S0~d8pFK@Y2YzJx6>Q;v&^;}-pP z%qN)i4rA*(3wCsLf9ZkS`lqXMM@>UET z?K>`?r=AQt2rL(=eKC_KtX%LC-QU>h-S_j4e2I7&^`^?T*(*O2tZUvY?s?gJM-}RS z-S>^#bv|QATAZi`~tU^x-KjNebU$_wlsKr|xQL1BF(JHDkRu!j|3IarGl zD@4G5Pl##2`P;&drU5JeU3!wqVc!-etJwr_9Ym|q>Xq(kT!+bidNltDrH_4I+ROba_tj=R{=@)HhBs1+2WFUAwoK)3Y*1 zzRUuTb-I5HmZGfGH?#BkRvSI+yZ3H(wG#j4?mHs`+L|VA0In}?fUX!?c~}q@=WF-n zW9F(x*e#9=TePC%P??spUWxP;pO7o0*v@MiwKU%g@h$+z;z1PbAcM(3HMI z21b_vZXOSeAx3 zASok%LojS+KLYP2tP#op%z#Qp7aggQzis>BPOn8P?$^k##(-%wnJ<%{mxmwT17twA z{^>v}YdQ;2q4T;J7u~YsdNx2HG)Ik&+x$=C?EFdbfUPKDv6F@#pu30(Yc)^4ac+&^ z42_X$Ojvw~zH9hPP_*lO?3W75ZRu8&e*n@705AwWyiY?h-*R=h?9b8;M87`Xajm`K z1ab#2_9nfrDl>&eM6ln!wRu--GM)ucZGA$E6W{v&>8po_ht+;hc(ZNQ^o*Vpd_Nu& zX^`smx9FA@qQ9n98{vd#YhlTb8V=5EK$FsNlTrx{XVR&Re6N9VzUe7XpfbTtOTkM} zr^6)_4}CBQFXk7SAvJ&4<7!m(l5gHFOr_CqNNA{fmB~0@@~pTWl-Tc#G~cX;vazwP zcte|qjSdD=s(5ZDI%{qi6EK-D61tFsRRc)$xYhrP#>dtfN)k{$*Y(l{LHE~C=3{{b zE;CU->tP&G!%3kS1&d*_S!7Qqo7<=avnM=Upr(F2dHn8eHl$Qi zSMX%8J;Jgug4AVej{%;ExQu7Z3|q7qhyNWSjYusMK2V)LQp~EP1_!nkyci3YhZPL6 z=62AV*$EIw3V&BPlWxva99oD=&XmC!UtVdbp4!&$$xJC+{Ej^KvRlIc$yYasTto+s zNdmA_+ibuj3ZIUobv3JR>oW&EyZE&KELEAx6Dd3D=&Q1Ga9jgvc|`mkb>g`gaBGp? z4;w%tVl}WDUc7n(5H(%Rg@YJ4{hgtPc!#9lXmF(=7zyZ=WJbXxKQ^2|2!AEuBXkyc z1If(iS|s}CvLTB3i$!T@L&E$vDid8j3cv+RxK*sJ>}A~*?XYcn{x90$i2eeRWCuD~M^wP}7opYiFc2y2T?!U8az zE(oMkF|170#XfQ`d7QuV1zAQ(K1Y;zZYT}|5c{lI`M9yM0m$0pDF6K-PU}s#5Gvm$ zklXi4)+clRT`H;;E>F^HMMh?HTfLZH0Dz|wu&3hp@lUBL2qU;_%MOT%1h94=0A|*p zzjpWl2*b;W7FF2vRJQY{zWMFyYAHNzB7tL!a3b^yH?_WR5@mx2kr@TA5vB#ce?c#( z5}FmsNWV*;OZf=VFe=Uz`2-MXaXZ@tsR>Gp#!9>cuV1ojd7nv!b6c3lNs6%QuKyZ( z6g3M<0i4o(uV%Yw6!o%#NN5A`m|H40`G0hM1nsW3lpbiIe?h|qgUdfcbP+|U4WCZN z{B>!1_0cOpM39JM;sir1MEFid%}0-j4GNizcSJ;^jA0t|iDJhV#Cb=s+Dgtpx)0r4 z5Q^e3D8bT_6C)%bI?_68_*F|G(8J?nYHDg{M+dJaI>^k@QurCxSY_X@Z2bN?EBjcL zz!4SQ+Je3G!|Z|h?w>`p;chsO*!D2x5cB_u1t34)P#~07ouK*D_xppP2JO(%p@_jyLS{>hc+E1i>|oF+ved0=cmRRn|Hmo zi|ITjU;7Om5igC?U#Y#@IeMtmxiU5bb{Dy5VqLt~v_Yx>oSHzAu!n%-UTHSYg5pxtdfDR!%4`CiP4!b(18@Vb1fgO zc_<~o-4K9Ev2ae}=@mfZDj zeo(mT-zJ>3ZaZ9vNRe+bxm5A$FD#w(e@U`*2sBjKp7L+amou9`?sbcr?#CkHC3AdI(`YH@#eW#s`Y%P3`11Ib8@r%nqH-=o@p~O@7lH_WVAW< z36rw|L&%FnJ=4kHxcHm_M~p0knO%?c4muWl%mNE&HyOCsSUOs0EM1|vI1GPaH`d{O zahI3w^GB**eAm{+wQIGc>tuvHD@BEZV- zSi-sh0JsP-Ff2|GPTvwVKVn26dbR|G<6~Xpxu&mAX*q~)68)_XuI~~42cIWE?F4up zJzX+5@WTNg&*+E5G2=m)W$GDwV`lMU27&xx9*r1HL+}n&&%nPAo`b-|QwqKGvb)Zkg*YUd7Hh6jZ)SxcV9l381 zu3iw_b@$WA6SSKay8G}P0?^hr1M~;MNVnS5P0u%nc_DcH5#-nn8^rAvar{aJ`Iq;8 z%}-AIe)j9s;E}%%>Ea6mxG(C4OBb*V8Ytp~ylvyZOZA#OKR*a`;)4cit6m-W1MK9&JLc7b2)`4_2u$CI(6TBF?T@(rZ3 zDo+y+cr>@{TpPguuCDFdva7DG9o#xwehcV!9c?>1JH6*k{RZo<%ae}(My$i48ywiO z6A)-!emk*%_7QN(Fi3!QUjQIE&@xJ&eKCN@Q(m&ep#cJ-z7L~?a0M;TCQ|Ft$+;(v~2;0(Y5X6ax1gZNK50KWZynuCA8@=>l+7XnGAF7NMg z|JM;Ru_p%XubMrrqBnC!tWK7;Da^{=0@WjP_HO^9UM|0%wPCiKUL!>K7fJ@0j9XMb z+nskq+`ZwsTd5Y#HUEM{K%nKkQ9)4F9w|g!V8)tFyQR}*U15M{g{4e!5b+H?zd?0O z$I-eo+S#9-#yeXXL5U!wqk#FkfFs%g5Kx-XO0^vHLv##ZU( z-P7Vkiw-Dpbew6b4-9kWY?T-38whFJ(+91n)K)V*!D%z$3vbMn6j{nV%UqRPFEz?~ z@&9|ki&vi5usYygRP7_$8CISp5gDpnUapwdpPdj$IIJp@;-os7vH`V6g zSElpxZ+LD~)I#YxG7ALcG0_^XVEo00%$_x!iJ6ljC7|{M%Z$thB@#M%y@ffn?09zP z!FdQd;w>h6e;1wVkT9F2JKee}OLl7BegECD%zrbr%CyeUm!fSmo>Mu_6N%-ILIMW2 z6m%Q%tT5BG=F-0An9?Peot0Nja`QXydLzWc_N#&VYk04;m1WJ?>y*21hZZFg+r0(c z7!@S#-~*Dt=pe{?R4Bt>edj)=*RskKufZi66M8@Rcq!V2=DHEnHlALZel*SDWM5W; zsLA0EU0~<<{JdH1f+l@p{=q*0W!^djL`)STSp@f+^+ ztCAk4j?H?%+?9V5n4Oy|Oo#pI)vG}R+$)$DUw}OT@X7)kosDu^FAOg%3hLO)RcU+9 zcNDREQw8$C)-7Y51@h!X|NesGpkG&hG=0Go6QBq}3FDsyPUFhxzWGI7^P_gvz;}@1 zFpWF*#_`XP_1F4_fvx6T@4km%OHhPiK#R7E`KcJyBva6z#x27`ud4}ytqTE)7%Hi7 zC5`cBeM7R0sPFwY)kYpmR^-exnN#uaR@@>elUX4nF)DuV*L<9x9$XU)$Nx*d@Dc|{ z!@F69Kle z<+wJ0>ufNYX%XHn8#qnN^?L(Q2q-XuOEceo_wJa({f@-{W) ziV4IB|Bf|48UFuqI$k-@_Jr?7z!H=C`uZ$1lC>ISE@c7hQ@?-zo>~t`9j)i1 zbsgw9>*4uQ@c#Q;XS(q`pTHGj|E;JMG}5BVxGru_%+yN6uIWC%C+?y+Yk!33^(^1y z)lmWNF`c?&1U);@T*IHZsT-RCf*IY{Hq^iY8AQcP&&0$;VkJq%rW8+?oZ7em>GJO; z>mu*^X8XQKQS+14-mvom$O<#IrMP0;>SQB3Yp#=!3`N3&yIfwQ&OKW#yGeh?waS8djH0C5>rCQjzq7fn^ge5oqguo!%&?X4!+ zniU;Nxo^FOo7;vE>Pz7Q7DQxQQ*L?JIjoS!VzEVc6!xVUmqDxnqk!7${ z3T8F~?Sgew0Hx7~uma86yyB7Kv1d$?hde6ir{i_X7Oi+8{*j!cq})}-JI&u%yDvYExdee#iKeiG%niwai#Yrcl zC$I)*<7ShC-_GY0Hys+FICp+P8-9O`D;=8>n)l$FjA)2OCl3k$M9!Gfoq zu_)uVqA+#QP@AdnKlPox>HE&tIn1aqI~UwTN2|d?9@XcRW72AuYw9W`EQ)ORK7=C>698udAD`vcH}9aNikQ;Y}nuO>kEGb`yIq z1P4e{t}j%`OsJ--uQ3o-ZSP1ML!Fh}Q%XA$YmdQ-4`2I?v~7A}2ybXedluU|BuyYR zc&)6ki(_OWS-ntn^fo1KUI?nqM=|xQ)vY@u-PT;MR8dDS!!PJ(d2w2WcdKNh)osEV zmP8?@S7vjuZRc4`1(tQr{#jOCz`AfK`xJE#Z!>XElV@iF`FZ?__pe`p*&S`hW%MPf zvFV8_%|^Eg6&N zDkUa?GMN}3_aT#E+AB%cQ|S5a+zFa@pM`N;VTP-IsguMJgXHaF*(b)~<;;J}@BQMa zx)mT?DRm$)6b#OKPf)+slY%|ZQs+;xFUS#hsC{R!kFDt;=qH`1oc4nZ%-pT9BYCeY zQVTavVBunuIFX2TM2XMBKwISWwD>_$7^|dV^JCTwZ7b{SmZSFy`O-_@#m)Z0{FCc- zfBY&u>%d?TC{d0k7h=HZK$Kxvxe&DLVkzvH&C1_+Gk7A-kil22>Z)4MUr_IAFW9eD zoqHGKnz7hdyiQ2up%RylPlTDRh&hLXlGj#Og`2gp;LH(KP*XJ^{Uf+P<-Hk3O3JnS zhq)r9;@_rqM!tmidKDFN`DFPAg27@u478r&c4~5*(e*#trE?e<3P?lxwPIt-85z8# zsn`fJgUvsmRFWpmR7 zcZ&N*)sm{s9t)L~w{ip7mUWOIm4Q4XP6oqSccx6i=9pNq3MXMgn8Ve9&n*F3_aMj;?z>D17E-PR|r!I5O%RPR5 zh-LEPF$vfs`fan4syL+-+~lanpBxR{vfj6{igr1;uXN_%Al1*sPFH)i`{5iMQ2{tZ zk3j{H_0d1xJ>sFGcU)0ejJ2hxj#yZO7R^o4IL4O{Cx*BGUM6>}Fc@DQC6WHpU{V=a z4sk~uXw+{Z5GOEVm`rG_l5)J#JG}bVdFdYoe1OX)=SP7n(ty!hg;EvWol?c`jj(39 zaY16#`JZH6Ekk~vMOv4U#>2bo=KFZ0! zgk(4cSk4R>NF&Kg95=e;N<^JFg>O+6Wx;;i`X{NW$czq zt3pj{bvpzonK>ZhwedW2fUaa@R!zH6fhcd^H}yqbv&BmI({up2xkEaRHBYSOqvQcS zyybVI%A=KEOCQPD;#;HT_nyM%ROB>L6S9xjBx3uf?5R0iD;fr_d9pxSs3ahtW65d5 zX(zB{meS{GO?69(iJa}XQ2r?;WlhDJ((g@nQnH$IFVWHWitsH?Nx4#Wy-CsG12mc2 z3xCiVyQ*rssIA>2>HXyO+&|;K9&H3(m#L!RUV!6E7JuViR^Wy&L^64 zHYA6Gt3NTlkS=PWc*r)>+{sQ4b^p|ForC~?b0)kYiO;!-p10SF9hLMHbxO~2=d3dH zWx+(^&89`Q@L(u@PmWCM8g`Hos&hmExA)VTIE#ONiE8}3rRfJp6I@w+{pw|Q@(@yW z{rHTaj)sw)M2@pm6E&03j}R2Y^Gprdd}*2oVh#~J>|6<{g_hF737bWoR=PR1`IkRX zF09j$VCD~K1`oJ7@CQN)akj56a_brEcl4~z3>@Q6t{17gKuzxea}^Sfb;}hlUXgq; zt>_3yy&-u(^pPII_i{ROt9D!A#WerV_}2-)s2qFeCciLyM^kexerf6cI8m41t8u1j z!7&%qXT^fI@05TwjUMf8t8A$7chhc4q4Lnm+QwJh5E&Vipv}~ra5;i4lZZ{jZ~37E zZSa#*f2W8Yr?AjVcmInDZx8`yd|It;sx%6NEupkOR$6ui(kb6#Kqi)`V5Q2rlJ=7+ zE>SUcIwY+4BGts#=gi147e!g6h+eq5!EDa*;c$;u*kMddnXG8IX z;d5L$ScBc|3`S$Th?h1y`J>2Ikhqn#qxaMLo{a`wGWLHa!2L?Jnvfj$)ODrtf}w6WmHs6yS+Ga)~1G8U;MT4ea86 zdxm)rCVjJ!G+f7x1oFy63&t+8pTYQrkqbd$c(JAOXy~T$Wwj{`9Cn|UC)0&0%G6dJ zO_>pubGyZgB$i#WbCd`bOe2TQWJp*Ur3#1&Ae_$Q!4=ORMt6DuI zRN3;S)RdC2x|cNmZgFi!EcHAK0sCiG0|S>%h7T3%%9HDY1T?i41s2HRspm6yY37;~ zLhb>n7@UUFcZM>(-{ubrX=sb~C4cB+RL+)(zaeXQO0H3dZ599y`CJBud6^t(=}D(_ zlAx!odWB(Zw{C;SFhm<8Q5fG}}`5ePR`c%$;My1UTpb^^?vEt>f7%mF(=a$-B zJJ&Y;2N%qK-2(jwc%fEulrx7bkTaJP_o8N z2DLaAx^2wDG_)1QBQ{*{?)bmbGa%>mmOAS1l0E)?L45@nOk@cr51gty^c%tQcs%Mg z)vwbQDedLD24tC&*9;s!H(LEP@BQ4kOe6joH)UcX%6+QPS=>kpPxdW2X=negv(z}i z7d2<-$TYseCX7neKo~BdQ8fC$yP!6C#J%nUrM_Q#jR~+B6)7!teoCJSCz@{cxahFO z!F-SX>#kpy+6(tzK0aV`goyGq?2P1Cn3ao!bEdK>2}o(3j*l-IWds#tpTBR_Wkbrk zlqXYfy)i9Oldrs4xd6ThSpVK216Rz`Pr)HCoFDw`9Q9Xey`?_?cCMEk5TMHQ0W%{E z;|b0FO0~Lt8**&=S!Di?w#_rYo{&`HwA`}a|EX2B^;yd37uc#ISCzVmLpvYScve_t^ZCq_US+OXYph+tS=PTi} z#n*^<=(q4q9%a9>NpaADkJjl$!-Nzh`Pu#CZ_rQO2)viR#w3x4*8j}2j1=ZIH*%PC z5WxFSXppHqnb22hZt}1bk30r{K7>lZ+X)dWfiZ%G7B4X{gH;qo2^mCa4Jt<9AT;p$ zylcBoa+SXoA z`xyfP$nFh@AZKiRu8%k#@7hSm{(vk&ckrkIAQeTQAS49-2f^pcnZ|75{Pu@-WCad9FfabaFli?2C{{zOb+TMz?Xa$5Z zWR$|T5h`eFM~b{z4TyZ<0*C+pJIcq*J;Pu9v6wKd^KHBKQVb_71i{6_!<94d(;WM3 zg}5{m5(PNexo-3BCPQU{jKYm9ZJC6gd41)>D+NJ*kOy5w6K<0>%e`m>qm2Az^dpnfLY`2A$ zkg~Ke*Y~>f$>uESc-Rb&GM$me#PIiCHHy>30JDf#o|lJC;pGz_>V?f1nlVIH$P+*S zWYFPXA*=lZ0RBmlkFP&E+*$&QyHQ=}n!%>q;68k`ylrkv=0WAvS6fxa)gRF>9NPZ} zVfj9KQBm%Ck>~TD2#zWLZ{X;o%|N5u?izVU>3_@rqxaXp@oUc)|KH%@f4}!p-VFqb zs6V$0B5UuftK)3N4?F6-n$Z$)D2U==DG!TXJI@ZeUHSiz*F|dY$HODb=>=ZR(Dzko z)~+Y1*HTL7*6;7DpV2GNSD630JB};NR?H~vs9xNfeo-rx%AT8-7eT;5&&8#&FFl5J0Z^fX(lyNCUX3Rm0<&Q)puSU=c@K7y(CV z;r_NB{WD!EudAK3^vHO&C|3j$A|kijg$eL=vp;q;Q^1?F-p|jEGh(69*;-m!+Q7g7 zsMEprrWRo6KPGP+{4}NG^BmQZI$3p--dTj=p}h(F2feLIFZNX`5r_362DO^m6rh=qm4Lx;p0vw1F{ z;>R-#;nYm;qg6rJpPJQJrMsfWblZQ5QX3a^Dd$2Iy@RZJJ%~WqCUoJA} zzwiZPQT9zBDIeeC?M|iu5Iliml+2_rA|WxD^EsCPX7y`X%bghzN&=ktH1UPGxrRMq zcpNd$!6n)NM=Zb%dtATs9>5s@PSBz)wI&x^p!9U(<~cA=0^ZA-(yp#tS)doMXJA1L zy&Q8?IgxfSE`mSlc^JftnjG|n_OjCKq?}F@`+wBzJBDJ@51}k%lpSRJycF{%@o2we z`}_kS@LPwiw{q{q*zVdaqbgV>Ky?(a-Vo4_VYCpy-wzP6+W=Y-bq^sx! zXjhqR4SG38M5)QUz>Qz%-27xVO%j@;+&xfTpX=?h*=t$g&1tb`iM1vTM4^~f1N08f z^7+yL&9s%0(oFTF^?X%9eZ6bPx7Ysu{>L9)y?J*t3Vo0P=zpTcQc_bnEazG6w}%e4 z!2pA92k@Ykht>3;OitSlLShpuE2mx@;39IMXE2xTde?_0tvVjSHSy&?B<6KZR!ruT zF6M4C(S=O-Tp<>LOxnQjxr!30)lL57Sg=w=Og{jv{~za2#Gsw)ogzp>UcWmet*|)V ze~IUYJ(il)w%yMlJOoDqsy8r2J_P}HR0=m{!|5oG^Jsw zUlHW2y$<$emqSC3E~ug6sQr0XmprAP@#LvB^VV>>gPK+l2{6XjgZirMpW^(O4r&?R zea_p@T5JlXw$JQ$G~X3_3ah_6WSH%;ht!Y)n2@E$)mDm2X|I{j zH6!8TjaD|0Gb}6M?zWx-72{z#fu{4D^X|ocE8OJYG-JxB42kc2i_r_e@i`Sj;-q>c zjbZ;}S1$+Qv#jFquCeNEx2HVfJ0=JB&YdSzN^8+=8#E0M(U88pq~8WLgJb($GPG;0 zmLdpwv|P91>+0%?au;hXQz776AT8j;%WbvISGCgUGZ}`zV7Wnm%;MrAL(9$j09u=2 z{o>jAd6{}S3IY32ra)_H=?I}VF*q0^2vI93U>uzKpICqzcUG9Y#^o!m|Ap?rpOVr8 z-i`=Z&psAFNBZS(EIE*eJ=cY9tiLsbNttiOl|oohoUIrMfK}BY)`B zo>$@~>~3IPG~R7}x{R80;vSa%w!dTRfJ}Jf!O+C7B-g=;4&=sj`-GwVOCkedM~SSk zeldlSll{$FrMHSju_29eVx1V1`1Z95wbIELVpCsK&4NBlSOVxOucUSpS-xE5;a9bg-5;lFmO6hWoq-WqbV|j-m{BON479JPDB!U$P$coYCZXZw@+)IXg?KIJ=GO0L)XRw1WL3n z*o-n=-VRoX=T_wAlJoHal+t@Z1lj-){#7dJ1QbT`7i6;A6x*MH60w?m(bZk+izZbr zQFA=}T~2F{ha6C#a>a)L zZ@enkknBae|Nr6T;nkG!S?E`2HX1)`xLG{Bk!YP~LlU^LGu9P(5DTZ^_f&NX({=BE zlJKUtlimBgKOa-51kMULi{X|MDcoMSGW|)%F2dqeya-uX`^mJaItiXzK024_a{;DFYOe=J2pP|L$ z@zHR6DDr;B!pug4?*oV6t>;stgv7A!Y49jCtg)x3$S7La;L+J{#%{M{akS`#=ml;f z>?pv}XI9g6td*MVrce8;P~iuIb)a5hprmqNqT%4ES^^>xY=vXtg$!xzyl zO;sdj(jDYNSzL~SDI(fx0L}VODz@%i&6amCA2TcQ_J?wmoLPmXOB6AqhjTc-Yy{vD zhTlgE#~aCKw~vH>o|IMW_mVePG)XZ<_mKE2(IN!-~shANuva565H2s+GU#5Xh>S z=3^H;9FZ3ZLTVES>$N1WP`86T1+}zN5yU+ zq7~#~o-R#p{Uym~?P=TK{@O^!CPsS2SZy^`ORCDf1XIq5>-Isox|h-=vR^c_gM+doS_IJZkrl-{ zcRatO>__O%sSzM+B*loOCJ<{XsL7VjnolmCe()DDWw2&NqYe&IqYV+43`XK9TeKZu z^!M~OUNd0XMafa3<)V&WvU0X&Bal=sdg+3ru78<-Pn-JqbawZ9rOe~zOOJpI1`~v= zoJRx4MQO@YCusPX49ufxr&-e*uDnDWiyj?^%pN%H*zPM!>5L9k#fp!|!o;+%hU@R| z2f{eHxVXN)MA=^kSoD>(T>TB_a&mHL?a9f>j}~fA;+3^-dj+0s=jfeFzkSQdCmK#- z>IBj!8?7Ky)%0y)cr2x!9G`YY84&?Uik397W!TCg1_%`LEZy7kG$M_zu6Lc8|62Km zE9{cek-WDyW8*UgN^~VzLLdDw{Ft_lZ;G_9M&}jzxkTK#k|AZGRLS3#CxP+JbYuE% z;$ec6qGHdv)FoRfHUXXOr~7LN z3NXCHbWEB>+SfhO&Eb-w;ww}vzk{hH6H6^MVzu46fFu*S27{ikw6m8$+Cd(rIPDqI z1?lAa;%P}+(iBrb7TdxlMFpEeQ@NgIb+h^!zGk6Pt5vsCbFf9p^np^GyoOqw+z-Wt z$T+24shXMn7&gVLBBd8ikz0WS9f-94e0LKH;KqYAf6n2bH}`Cn8HBd(qe&5&`;l{> zStzO5NbYJ|LuDH}QC3wE{lT=fMRj#I_`r^m!tdFjRHRs-KsRV)Xy~X3m64L-bJ&ei zDoO|FF{bSZxgDt3*s9IxK3;18F69@!IEM0-<)o^-^Q#R`vRIj z$N%PTjnVF#$)BF#b9^dOyl+}CAS5WarNhC%l4b44sCObdpKr~Z5mypmBUAG*rT2O2 zb;|kqecr0fOaC}lo@YqQelrGrP`98+DR(|}n;+v|$IX|-c3K@TB|}^efcbtG6=D_a z@m-z1*qF>33Ln_qe9!XYqW;&EVo?mTb&dcokKt#CIi8yPSgg4n$djZ$<{9#9v3pxCLMWsIe znKAF#YM4heJ)4Hxw3$yLS}-m++Fh4KeR@Rz+AclsDnm|{Qrn_DTkN&EHJf=iw-;;K z6(kJg2s3s40<>?X0kq)K`e>EUqwXJGDL3DZW{2#;59XPr%A^Jz2En)_Naxei(@RT8 zG)8x6KK@yGJa&%$+Wpjlzv(BqCdAX$_Lm66rH`AjOA`KkO!-vi{qtjNab#$457$47 zi!FdU@PTg#J}4w4t&xuyG*k{)EH2u^rvigOl+(*8P4LP+pSdKf1yJ!ivc!} z$6jH_WmhPaQ6MS%#ZceRu+_+D1VQkJ(wtAVjgqq>b6vPo7Jkb|0S>LEd76_GDPH=A z%_|cQ93x51mNSUO>z36Q?KGc}zXqHs<_^9;4#32i$N8|CmIN!K` zWj6Mm3H;);DI@ZMDJ}VcJF{~Gw|RM|q4f3D)3(Zb4GIC&GCc?`g1x2L{qTn9^a6_FUtu=`L^}tIe;03dcAZI2IAPRavtu!7#t|YqHOP{6HVZYEREC-@H zfw($Vc5I8JeGGbIspS%RO<12gJ?wvfe>$~(VnRb~S$MKq`Ld!gYv;?=Z$GoSbQkG; z9x1Ph;8O?w3tCW&&$ixFmjU%3LfVeUmo=U43G`hq%9|fd;G3>?j&~+*SS~hNO^hx`G{}Ty(t;pWb_|AAw8B{e*)a z>?UOQ;qI?tzsikMdjxV+vd>zw8?U^JZoqkypk6U=C8Go(8`IYC1Vaa1<4w7>cTOt; zmX%-WQ=B8u?hg%U2;=Pzc=PXSyeko4KSZJ2-1$(b$&>9hJB}m7bUT;HN02aW7+}8Q zU@c&mM;h~siVtv;b;N|q{Jni2C#fUixm`L*rO3q1vm z%GwXti$+#%=VHP#3V=HHtH0uVJ@1OUc8c4t?6Ys>7Uw9}NysY?6UO@$DE!WWMdn7s zGg#%897-u3rFkSZ|H95zn_PxrgCJfF2W>LF@2J!&i%skM8*Hp>|F8DGGpfmLT^AeZ z0z_0giXw`11(6Oap*QKhh#n6_cvr;~8L+#!DRIK(!EI?72@5 zVVp-T{T#Hhp`kaC@$pYx%)VQxL&)MbjAYmrS0dl2ZqG^%`r=y(&fO{rou}M!y{5PA z(kC5o+x6v9$`s9^s4g}vsr$w7Vw-kdK}Qp}pTTD|wwU)+lF`_7vp4Q#bKI|QXLd;> zX(m6@1zHxg?DV;l)#LmkHX@o1bZU5bN=H~(MeRz)<5Gq^;Ap_<$@bAU!{yR1zh>03 z4iNG_vPVZ3)zyXxy~aO(Xs6WV-E$lcS>O>6a4k_Hx$^-F1|@v=&w*A(210 znh1?D$}vo5rAGYv#K$e^ndqu3moCMrn1lX!B}hH2KcBeb);KQJHjSP7N=B?Tpw;?egX5Wl;m^(ut6nd_pH7I>3FKcl6_iaujs#-5q`^Q(>9 zYaZqY9`8$%8>*qiZ;~HpSx4bQ z=@C0ACydX|7V}QT6u3Ij+wEe}sSh0v#^xjwV`Hmq`U}u7Pg8G5T3Q;yAM0wm->EBW z7@wG^=2DS_4JFC)o_H@8smle#Xx{I)#S>(JYYgWf_w?Px9)VO;(?#8vN^7wr6;psF zb|=;baCwo7VnzZENTs#oK0s9mMa+}nQPNue$L*+u*F?4l2Gfp2Dxs{Sik2C z?$@Lmt0(~qPc_%spvcLjHUhqH`n1tnJ%0T7ONrQZuaDVcZeL(%J|_-mon`nhvw5?& zQEjRRTU}43^^d!d@d+TUmm>7siC zInQLWwq!T=#Rh>H>2duXn#S1x;v9BXm8@R&4q>3sAIvCBleD$@D@ImU7HW^&h%fh> z0fZCXk!heT^Ww^iaih;R0tidP;CE`_`#nxTe9wKz;3x{^J8bM}tN_8_W`%%wA15Hm zLp)G<5|JhXU{uM8w%R5p<0B)&qniMW0|r@eRPFimTO7^XZ_bl2(rugcz+vC2H+JJ2 zJboI)xo%9%u#7ouH@N0~l<=cmI&;T1WAj6MQ$6?o*B~?>__UPR-Q zgd4!aNwtR<|CwJkjl3j#55ngMDG5^E`f{|H(D634L#p38A9FTj}*T)B_yXA=;OHNPcVFh^n zK_Ymcj`}`hq=baTRN47GYc6UeP>38D2)Ft!z+p>F%&Ip{WOUQm6YUNR;`Y`SedISF z<%oxehe^-5=LRYB9)XUvhbaT6l;1w>Da+*xHs7d{@_on+>3X;)8l5P()g($UkZko? z$4Y0GQ&F$fzrXS5dvcWg*PN|^l5KJ&?px0d2U9|>=`+N83zV`}{%ArE8II?dAQd{b zOqraA$W)?NM_{GT3SE_dyTr(tQu|_QNQ}9IwS%h@+k;=A+Vu=cQ&O3es@VFHDdaa8 zXMg#^xhE|#7FEXdtlcK=tBT&%!}x4%tHW!faJ%x3I#-#>@9#rLbjlRQ;7jO$xltr5 z>yfXg_r?(Ss2W9J@eq1zB&yxi+v&zj^}ZD3O$ET4C_6}yhDOj=^t8DlbR8A#V3^vl z`=urtf!ZI95|0g~5ETEklWd7-#Q)M@7&X;g9|_4Et9a;dKX3;x-&iWtO$I#)VKD?_$S{Z7{Sf7;gi|~}ED2Iz0)mSYY%9FeekGX3 zlW%M7++QD~?z_!{e^Yh+zQR?RFxgxn^2y%c|0p+F zvK~mRqU66ZsB0?77WAfj(<~^)&VX%*DcXM*o#-UEsCYRf z6TekRCBF8^*Z0u+w;Qaox$2Hk?-$k}`JgMekq$g?z65i;INwutpI8L6BJS!oIDf&#_M zbG*+2Yh;K`$~oXY2BTGlfnwh_xTdoelp}GE+qe!7hs)A=em2g{yrM}Ja=&uQEZp0~ z%ewt~`))u}fAZFN6~@a9;rtMj@P3u3pHlY%`OYTwG zM+ot~r^sE0axlW9&GHeGn=AiSYD}Lgeo<=t!T=yiM4NtkXK~bXC7+hs`!lx7brrnZ z7S#{&9NXR&bd9+^R?Lq!_93bT)qBLHHRU- zT2Zl6P6|K(D*%-pNZ-?$v^y-qU{m5#|SRyDOR3r4KXl-*!>D+TxYA4e-%xh9+K~rboRhEeP>XQ|JgN z`MntjeJiogc24k6dC#db4>{zW_7ErbUROs&De(i3-SI>+9s6FTv}y=Rner}-&zIQ{ z-Z=D(zsF>KP;Ll$StidHQFa9FiMH=hqU~SSHbp~SieBpaPKNV9p7@$NQiW};qTQW= z{K`>%x=2AzdH2#FQ|%AtV+R_wjtM$e1BQc6mR|YS_*5B z7lAz8p#>UAz^lQ>dDN37x|$yEAsoWSc!5$?72 zu76#I**6cq1v zJ->ane8d%e=5TQpUbSwTA-U7#84?dS*ePXk@VbG<%ut3=usDbzxe_LyRJm2-5mwQJ zIoH*ry+^`z_k@PISy^wcM!?7}u1f8gE9q6zqVHk9h$O(f_(OS?3<*sWrb9>&x3^H9 zA8*$Uxlz0EMc>0ZsHbG*E?2=T*lN>ZA{;mK*{LU0i0{(*dDgdjvXud?{q{TBAhiX8Jzsnx`e9^SfcQ3Kh$67eD$Mbdj2x;X18m z%zlBB>5m|JpT0(KH7S&v@L^Em8OU{!TIyf>0=*`69qR*KzB^P6)Gh&tXO|Jvrnj9% z?xfyQ7?q;Ge7^%(0T1QyHqn^ODaYexRB{<~ir~J@aT(k(jdgd|nfQbReZ-Nea+{@W zavRQ5WM^1A0RF5Z2n!w(_ri9hbBIXT>@~WkD_J)S+<0hM$)RrH<>j?yZDuyFVfpCR zJE%%Dx>D5V7mRSU>kGcw8JUUP?vAYW8$XB&mFE^`4*kyU|60D=Q}il5wL2RpD{15R z(9oou%h#A0!rs116e+sPnk|LLs1R1)+fs~xuH6fO;xa+zg}v`61et|yP20E37EWi%4_?YQ#=w|v^ zL^>3~j~jUYHC1=7iRI?94{oMKI{T(t%T)AgZ7DJ?ogYd@O`Y7hI8O7*7$M$&S7x_t zZ(b9Rd&as+(6_C?@{FJw9Lo^%)U%(81?)i>nTTtt z;{dKWRqh+iHUK9e+nFq9W*esS>``kIiK*h!+4v(^#<-YY2Y(jjt?YnCL6~(lw%WH&G`C@vetjcDcP0Z znC>LYbxebRd)=u9Extx?xE8U}}mJ zbl8FUrC>F}_FdTcClBuzD=x7TY5M&u9@;D;H)0Y}G-__%!rWk;Gn~<(@?m1VkL+*q zLLhnRcnn89#QIO&OMiQDSiB1Cr5E6ZIbg|!H-nbb;H2 z^vrupBOCAx+%K3F#u$qIkRJU}k@ltJhWu1iA@<TT!MUgmubiJKuKKN)7iGcwExRsIKJ*^J;r%0LL_Zlu^!j!0S%iC)%slj&VW?3OzDFNtCHqe1~a@tb)Cw;^8@{)z4E= zTsChPoL+MxVQSRx}#uIT+j;V-RRrd=3D58H1uQXfe zZ{+hupFQ2!<16j&uW8&BqU<_r0VK=2ZF;bwMR)qf_{lvK0HDO6Z0R2$=)%K_@;`h5 zh&WB;4~?^zE_x3Xmk~jwK#t3Z^JaP2w^Db+*G+1qqUOZ;#I^9T(2`g4T4_wjrvw($ zwV!WZg)FKx2uT>#@ZF=Kn#vvjaW##m|M8P2PuMOeFLECDGYfCyJH1xDQ$6yNGhAaJ zXngiQLm}3vqGI%&sn%%{`RS#1P5cgSYtUObwO`%TBOq3v27U_wT=Cm1td1IyHzLAC*^hC{U-69p(uW>5<52*uMxsspUv}yE>5$ zPV*l32l*6+J(Ci`y^j%1O$h_u8GS)W@)B27+EsEb8so(`e+F3BUeDqFE5N#7VJco= zps1+mL~M$R;W>9TjfweO{P=I(x+N_w9RLU8ar;*m*d?hSeJ(~0Q@;~|;O_#ilW#4u z7C}DR!F!}~pyX##y2`4-kJ&~aj(?eb6>5H8A8~yE*}rAG6uPRxKESj*SJqvU7;$}r zD>-6mn7MppxXwkb)#4#chp((t&=?lcR{i_|<6Lh#3WLG)_qPD)RZZ$nz**kCsX&e| zk!09Y%AAcRnMp~)V7y;$pYVr($;+qCs_J+w!s|q=d>7~IgFYOXR>u?YT5YlrL2bU3 z65Uo#*2^VMi`z4n!tG*u*8LFl&CF0^5P%kk-F=a3>=xe2Chl{MdNp2UUiZj~O(GW` z5K>gQ1fJuyndj^=(4a5ezm&u%oBMLS!TZ=)05s)%ujO;UY*uU@7S{h%*HRHF)!rmceY#$r`$zdMm<4_-gOzU+mBCPk$osKKqb7VXe?;gzU*`aHusjmw zP{jyX72Z`2DwR}HvO*W(oAFqi^u8kaZ7UD&MQ7A)J}r(eepR$tJHLYC_Xd*LdtRs*vCK#VQ`Dl;laswEA+HLYiMb9QiMK5&ogz|+=C~6h z3(21_-Twyc`)_pla_`H|3BW~ssyl=K7u5*G5h35nu(!m&NUTp2^8k>Lq&zx_@C>{I zC{)KS>jLOM+U51l>+I@e=~AN5xt7fBT8o}CBLPgZn+k&eNBpMICtEw!3Kta^aRL3R zzm$0X5r}OfV_QfkpFOnI51(BU+{-70csRtS`%R*Luvb1ZmDy_ik%0V2W5;ou)9|eaR(P(B`hIw9x z^R#7%2#JQt=|uacgx>HgeHCa(wppy@V^{B{-KGcIW^yxOMF{l7Vv2s1yNo?5GX72` z#6~_ng^Rc!%xqg7Xq#o+!ef3>$&N;E)#UYVj-^@9RJ`CT>J`y%;L9qbrH+N%P@t|r z2#T>S8a&hlex*O7%3Oad!)@cf+f#vhclr9dEQN>vz?JaMb4n!2KpdbBbw!?VJT}2h z>;60&eUS}=mW!t1YA;`U3WQkJz^qeQ`|PFlbI)mAzjpjrTBiouB85#Dz4A%lwojg$ z;|8UqN}vpbu9@%Irzk|WGEb1hq%cOUC3M=L4kIJ@tXEr8Z@e$-ohoFF&r9tx8yCKl z#1#t`;k2jE;szxyyscA+u=g2c*+`dQ+};6Qt?KhZ7O+l=>?Ky-3NATJY`=bB-!=R0 zD;Iqi1TPSip$-NIET`7F*G()2m(8xV*Am&vuX^g*^EXOJLmKh#hs&X#eLGDT?eC#D ztKR(`W%3^@z^f0kkTXzt#Hw24d7J7w$V+-WgCo#0V}t5*(cv-HLQAb?(}36NaZ9;e z`M1`|)}merep8-hu!JOPSu$Dt+Av;l`HfC; z%)NU*_b8mB;-06YGCRRLXh++p8g z7x&IvSR|d8$ll1T)}{oNS2o-IJejxtq-Q1MfPd^K160ZE#}0=sm1<7iVVMD@%ZG2m zle~Vvs_DyU64LsOOe#@2xus}I-4m?%S z{b(WWC^P@YF4{@$-W~J1ou*G=4+pR7{Ii+*a+mynu}xI@y>~4O5oBLcaUWm?Q!A0gZ<=agobaA_jDup=yG@Csf&9UqW?_i(yLz`qpxRVaG45F-pFtC_o; zpUKC)%;jCCyYDyDak^?0sg3LW5I&H~*h$rbJ6 zdn;SBu}*C}1KeJ12BNu1oDTru>VGcQthC0AQ$kYb@8D-{)26=(>CCX%4KF$&VQ}ez z{%yEx;sdw%7d#vdAS$3jc$k9M){|Q%+90ir5&xINZyVY%l1N{5SAOdq?~mW~ zJCWgldZ1MCgjSxV%@Y2y{y^gL3RL6er3PwHe3e*o`lzUOiCSBGX9EFRP zfVb(m`zqq&qX{ygobmS~<p_nJ!@a#QVy;7(3 z-J}@Ts~@uD|3MTVJlz-zJX)<(r z2(eXDPmU2!$qab@XKFcTC$;z&dfLUFszDr>X7`(p)Q_eMVHa^*IJG;QElhM*GbHLd zw9Q_!g%#G7-*(TKn`MK93i>{F@9miMKUFhtPyRO!M)QiRb`MbovZ>ReDH_40v*f)c z^lq0a2C6AI>p1c~=Mujym=oVT$z!sXt~tGSMk{{_1iH^Y8h^iPeVY{a7?`i$1-!xE zmD%NJbtfk_w-TY<;_=NDW%4JDouPLHdU+0orY-0}psy@Dr53zprmhXWmiKfR8||EoA>QGpn}ba)Y& zD40K8vBrNTM5&;kwn7&Z1*?0k-z9g?Zfpz1>4QN3LhXzu9H)>6TAAF13cckLCKwuf zY`xa&5%v*v$w~mj6veTX>{`a5ONB>HAFP-uO2~VrH`%)g?u(?nl2UJtA zQrjnAMP`m=uC)f_FPg2V`ty{80?T5;Ys1-p?{be%y-S8Y1pfNvUjBjl(a{VabG1~3 z)I`|PkkvTfVfjsrrOyR`9_E$W-tbvpdd0oBb2X4y*Y3%c zZCyBe!B1hdNxWUOnEfIdXU1w#daAnSiyrly@m`Z*LpjCx)WuEZMC(i2!L9hdVOqoO zgE(eO4Ljnrm|bqWefm6=gVPpQEqAHsoydzhD+-F+M!D{YPeRhNV2hss;zl}#K~LIoraT7AQ5hsV1b+V%xM8c*p)b@BY#LaMz;!nX=*6 z+J-!BU&?TELA`B#2hUr^ou34Z=Zx0qz(9?q>G@7n%NII-o_kmb{?wB^97j|97q1&` z7;zyeCwoyS4raVM$g(-y$Rod=!=A4*?ucMvdQ9P^WWxCV^>QpKfd$4>mtTRNxt=~G zWyF$xn;s?^7@o%LF{<_K_(AKU!Ub&}^V?X1TKTq+dxDdO(%*Q|Q z%OV-p1BQ6J7h)8w$qd>NWQx1z2Dkqr0-H=~DCc`(;#@x!9%R)nr$aZW6Q{K#^p;bR{hGhY_p#S z9AC4te#15F4|;FP%wvkUnqX$d>s#908mE@CI=)nf+{gelsxU1=qv3oV({_t-f+8gtrt3+lSFPmK9c^ zwo0Vj9AWsrmo|N6Zd1@N&$}p_?em!x9eYreAQxT%udfnvZY^KwOeYFXC{Ebe83FXDiQgQL0wBcc) zi&D3aE#GtPP05CdOl6MqwoOK=L_*v=9o|LiPO3Cx5K&*=xHdRdll}_&>X9pCcpFzi zcPs4eEET!4MNcOSE(_OelL>0XUYU{06P8k-{ve;VkyR32bjCkE{X+gZ0du_Gce78a zZmhR@4(n~DU5YJthT2?}T21R=kfCd9dxNx|(Mu}uJd_K?-`R5iko}+4t!-P*yKKCe zp>T6@($>CE%Pg#Z?JD&@W3qmkCqw*O8vxX=)F~Ng9B>8dm% z(D{K3SC-12a?~XbUzmdqAhBntLwyvqp^tq)TXzmC;M1!Sd#neOgZl9dq;1f(iL&Rt zEGxRoVQ=ePx%$<#JgFiq8?JB_3z{Z`2V*x9eSAS6r@Ni$m}(!WG3al+crW+GTQWpo zM72JS5BODWOe}SGnPl)ZVt1TvTCy3+Z*v>J*RZ~Qu-o8_&Dc(D<92ECPJ z`wuKap5^5a!j4LZ4#t;f2Ri^4Q3q`xjsiM!$AHpye}9<8xBh}IacY~V!_>}ZJtU*d zmvN2gcVnIWZm0(d<|38Vy3g@9y2(#KkJ9*&%viDzPTL)It=6gro$)bLJ`4W&0EAE6 zi~Qj zmy_$0+;V7e82$RbjXjsRBshI{4>=6LQnl=mL@q&{jW&HAxTI#ypa%2uUm_~(YLo_0 zqxuIs%^6wT#%8VuWT-T675xvRLTFTU+CnHBx1w690sK?z*Pp~#gyy_ZrL$RVFxvJ` z6H(T4(3rN4w>AZ7sfhzoO*5-pNHoMxa>?SA{>n0Ez>K`iqDnmLWeO;_;ZF}3#{f!u z;K%S~Ro(}oyL#X%q)vQ6>?>D^!$U=r1>NvUwQ=$O;YD7*P3wSzNK1Z`OdFPqrGw-6 zgYVrbW8||p^aNJ&3t9xzza<=2`VGqYFG*>_p0ZCcyxJ^3@^4Gz(Y~-Pg2-gOYF}v~ zl*rC?#$?X*T6~vAN!)mh(2xiwqxAg>WwjVE?FqKSrp_Hi2)-?5Qj68$OVOOXX#`IrznVJ5x3363 zw`3X6)gaZ^uTm1e%w}b8Vg2}~z{hL7IWMf=Bk*4{Q(wI6Nn{9uvX8Q(?Bko5Gt!a~ z1`=6ub5YlB$@vG}%IW@;2}=O*EBWe~%l;Wo#YyiHo{lg9<$hZxpzrlG--S~|>w*Uk zEApcRXS1~VNNtT}(9`|aB95|Lq&UzL;8r}hj`%ap+frAld} z)P4H>8eI{jT%Ly#&tSLy*;`Bp?5u2O9MB}QFJtNt8BIvgv1dS4^rn;~dJJ-z(@;#b}8;|H$fSPlK=Bwhz)C?9b{! zeIdH~tvPGX--oMI5LfskrAd-;=S>n4vT_B`W37ry&GlZ6VS7rRo`dyguER$su`e4J z65R}=9y24WHjl!je4LL>eOiOQ$Qd-sP+R*e z51FbKnG7Id^3Ih-iGsD_KrnrF(p$e*B#&j2M4c)a^3&&JtnV^iT%o3J%)aXx(7%ZE zpspBMdKmSYanwri8^}oyCSK)Hr{Kd|qR!DJC|SW*;a9OfnZaXI!xYlRIQrtjH{}c#H;LOM;1~@8{}?AMb`Q zC-BO1JP6~wu+z|;;#dngXeRvtlrk%!WY||G?kW=Hs5g4t9)poUgzquu`8exCOK^v+rylcQP>^`9>Nn?aIKESz`}uHAOP6@$2j^@K@!Wq)(fs;` zHSo=wH}Y&QrHZc#fC@eH+Xug^%MUD`PzUDR4S*92;!mqEFfuACE2o`!cRZ55bM;hr zh6HML_t38i2&%NxzEtK5coPH#1p(d!JIhE-W1=gJwfqxq+En>NpbHRgKQZx4=j^ZF z7Pb#sTU(J;R!ouKiciv{Kd{L8-LA8z^^56bH2+({M1L^a{{}Dq-!1?Z{hzm4{S_nm z|8J_FAY1uXL4j(gA&O$pq0kALeCvExr! k$G`vgg#R6-KQE2*R~ Date: Mon, 29 Jul 2013 13:32:45 -0400 Subject: [PATCH 125/907] [GSOC] Angular based UI Signed-off-by: Sebastien Goasguen --- tools/ngui/README.md | 2 + tools/ngui/api.py | 22 + tools/ngui/app.py | 23 + tools/ngui/config.py | 6 + tools/ngui/precache.py | 19 + tools/ngui/requester.py | 153 + .../bootstrap/css/bootstrap-responsive.css | 1109 ++ .../css/bootstrap-responsive.min.css | 9 + tools/ngui/static/bootstrap/css/bootstrap.css | 6315 +++++++ .../static/bootstrap/css/bootstrap.min.css | 874 + .../img/glyphicons-halflings-white.png | Bin 0 -> 8777 bytes .../bootstrap/img/glyphicons-halflings.png | Bin 0 -> 12799 bytes tools/ngui/static/bootstrap/js/bootstrap.js | 2291 +++ .../ngui/static/bootstrap/js/bootstrap.min.js | 7 + tools/ngui/static/css/app.css | 27 + tools/ngui/static/images/ajax-inverse.gif | Bin 0 -> 6488 bytes tools/ngui/static/images/ajax-loader.gif | Bin 0 -> 3208 bytes tools/ngui/static/js/app/accounts/accounts.js | 85 + .../static/js/app/accounts/accounts.tpl.html | 18 + tools/ngui/static/js/app/app.js | 60 + .../ngui/static/js/app/dashboard/dashboard.js | 0 tools/ngui/static/js/app/domains/domains.js | 20 + tools/ngui/static/js/app/events/events.js | 20 + .../js/app/globalsettings/globalsettings.js | 21 + .../globalsettings/globalsettings.tpl.html | 19 + .../js/app/infrastructure/infrastructure.js | 0 .../app/instances/instance-details.tpl.html | 6 + .../ngui/static/js/app/instances/instances.js | 37 + .../js/app/instances/instances.tpl.html | 36 + tools/ngui/static/js/app/networks/networks.js | 20 + tools/ngui/static/js/app/projects/projects.js | 20 + .../app/serviceofferings/serviceofferings.js | 20 + tools/ngui/static/js/app/storage/storage.js | 136 + .../static/js/app/storage/storage.tpl.html | 33 + .../js/app/storage/upload-volume.tpl.html | 0 .../ngui/static/js/app/templates/templates.js | 20 + tools/ngui/static/js/common/dictionary.js | 51 + .../static/js/common/directives/confirm.js | 26 + .../js/common/directives/edit-in-place.js | 32 + .../common/directives/edit-in-place.tpl.html | 8 + .../ngui/static/js/common/directives/label.js | 25 + .../static/js/common/directives/modal-form.js | 53 + .../js/common/directives/modal-form.tpl.html | 24 + .../static/js/common/resources/accounts.js | 24 + .../js/common/resources/configurations.js | 27 + .../js/common/resources/diskofferings.js | 16 + .../static/js/common/resources/domains.js | 16 + .../ngui/static/js/common/resources/events.js | 16 + .../static/js/common/resources/networks.js | 16 + .../static/js/common/resources/projects.js | 16 + .../js/common/resources/serviceofferings.js | 16 + .../static/js/common/resources/snapshots.js | 16 + .../static/js/common/resources/templates.js | 16 + .../ngui/static/js/common/resources/users.js | 23 + .../js/common/resources/virtualmachines.js | 58 + .../static/js/common/resources/volumes.js | 16 + .../ngui/static/js/common/resources/zones.js | 16 + .../static/js/common/services/breadcrumbs.js | 15 + .../js/common/services/helperfunctions.js | 22 + .../js/common/services/notifications.js | 17 + .../static/js/common/services/requester.js | 30 + tools/ngui/static/js/lib/angular-ui.min.js | 2 + tools/ngui/static/js/lib/angular.js | 14847 ++++++++++++++++ tools/ngui/static/js/lib/jquery-1.7.2.js | 9404 ++++++++++ tools/ngui/templates/index.html | 127 + 65 files changed, 36403 insertions(+) create mode 100644 tools/ngui/README.md create mode 100644 tools/ngui/api.py create mode 100644 tools/ngui/app.py create mode 100644 tools/ngui/config.py create mode 100644 tools/ngui/precache.py create mode 100644 tools/ngui/requester.py create mode 100644 tools/ngui/static/bootstrap/css/bootstrap-responsive.css create mode 100644 tools/ngui/static/bootstrap/css/bootstrap-responsive.min.css create mode 100644 tools/ngui/static/bootstrap/css/bootstrap.css create mode 100644 tools/ngui/static/bootstrap/css/bootstrap.min.css create mode 100644 tools/ngui/static/bootstrap/img/glyphicons-halflings-white.png create mode 100644 tools/ngui/static/bootstrap/img/glyphicons-halflings.png create mode 100644 tools/ngui/static/bootstrap/js/bootstrap.js create mode 100644 tools/ngui/static/bootstrap/js/bootstrap.min.js create mode 100644 tools/ngui/static/css/app.css create mode 100644 tools/ngui/static/images/ajax-inverse.gif create mode 100644 tools/ngui/static/images/ajax-loader.gif create mode 100644 tools/ngui/static/js/app/accounts/accounts.js create mode 100644 tools/ngui/static/js/app/accounts/accounts.tpl.html create mode 100644 tools/ngui/static/js/app/app.js create mode 100644 tools/ngui/static/js/app/dashboard/dashboard.js create mode 100644 tools/ngui/static/js/app/domains/domains.js create mode 100644 tools/ngui/static/js/app/events/events.js create mode 100644 tools/ngui/static/js/app/globalsettings/globalsettings.js create mode 100644 tools/ngui/static/js/app/globalsettings/globalsettings.tpl.html create mode 100644 tools/ngui/static/js/app/infrastructure/infrastructure.js create mode 100644 tools/ngui/static/js/app/instances/instance-details.tpl.html create mode 100644 tools/ngui/static/js/app/instances/instances.js create mode 100644 tools/ngui/static/js/app/instances/instances.tpl.html create mode 100644 tools/ngui/static/js/app/networks/networks.js create mode 100644 tools/ngui/static/js/app/projects/projects.js create mode 100644 tools/ngui/static/js/app/serviceofferings/serviceofferings.js create mode 100644 tools/ngui/static/js/app/storage/storage.js create mode 100644 tools/ngui/static/js/app/storage/storage.tpl.html create mode 100644 tools/ngui/static/js/app/storage/upload-volume.tpl.html create mode 100644 tools/ngui/static/js/app/templates/templates.js create mode 100644 tools/ngui/static/js/common/dictionary.js create mode 100644 tools/ngui/static/js/common/directives/confirm.js create mode 100644 tools/ngui/static/js/common/directives/edit-in-place.js create mode 100644 tools/ngui/static/js/common/directives/edit-in-place.tpl.html create mode 100644 tools/ngui/static/js/common/directives/label.js create mode 100644 tools/ngui/static/js/common/directives/modal-form.js create mode 100644 tools/ngui/static/js/common/directives/modal-form.tpl.html create mode 100644 tools/ngui/static/js/common/resources/accounts.js create mode 100644 tools/ngui/static/js/common/resources/configurations.js create mode 100644 tools/ngui/static/js/common/resources/diskofferings.js create mode 100644 tools/ngui/static/js/common/resources/domains.js create mode 100644 tools/ngui/static/js/common/resources/events.js create mode 100644 tools/ngui/static/js/common/resources/networks.js create mode 100644 tools/ngui/static/js/common/resources/projects.js create mode 100644 tools/ngui/static/js/common/resources/serviceofferings.js create mode 100644 tools/ngui/static/js/common/resources/snapshots.js create mode 100644 tools/ngui/static/js/common/resources/templates.js create mode 100644 tools/ngui/static/js/common/resources/users.js create mode 100644 tools/ngui/static/js/common/resources/virtualmachines.js create mode 100644 tools/ngui/static/js/common/resources/volumes.js create mode 100644 tools/ngui/static/js/common/resources/zones.js create mode 100644 tools/ngui/static/js/common/services/breadcrumbs.js create mode 100644 tools/ngui/static/js/common/services/helperfunctions.js create mode 100644 tools/ngui/static/js/common/services/notifications.js create mode 100644 tools/ngui/static/js/common/services/requester.js create mode 100644 tools/ngui/static/js/lib/angular-ui.min.js create mode 100644 tools/ngui/static/js/lib/angular.js create mode 100644 tools/ngui/static/js/lib/jquery-1.7.2.js create mode 100644 tools/ngui/templates/index.html diff --git a/tools/ngui/README.md b/tools/ngui/README.md new file mode 100644 index 00000000000..e4033e25a28 --- /dev/null +++ b/tools/ngui/README.md @@ -0,0 +1,2 @@ +#UI for CloudStack using Angular.js +And a flask wrapper on top CloudStack API to make things easy on the client side. diff --git a/tools/ngui/api.py b/tools/ngui/api.py new file mode 100644 index 00000000000..55fecac271f --- /dev/null +++ b/tools/ngui/api.py @@ -0,0 +1,22 @@ +from requester import make_request +from precache import apicache +from config import * +import re + +def get_error_code(error): + return int(re.findall("\d{3}",error)[0]) #Find the error code by regular expression + # return int(error[11:14]) #Ugly + +def get_command(verb, subject): + commandlist = apicache.get(verb, None) + if commandlist is not None: + command = commandlist.get(subject, None) + if command is not None: + return command["name"] + return None + +def apicall(command, data ): + response, error = make_request(command, data, None, host, port, apikey, secretkey, protocol, path) + if error is not None: + return error, get_error_code(error) + return response diff --git a/tools/ngui/app.py b/tools/ngui/app.py new file mode 100644 index 00000000000..8fe0b1ae423 --- /dev/null +++ b/tools/ngui/app.py @@ -0,0 +1,23 @@ +from flask import Flask, url_for, render_template, request, json, abort, send_from_directory +from api import apicall + +app = Flask(__name__) + +def get_args(multidict): + """Default type of request.args or request.json is multidict. Converts it to dict so that can be passed to make_request""" + data = {} + for key in multidict.keys(): + data[key] = multidict.get(key) + return data + +@app.route('/api/', methods=['GET']) +def rawapi(command): + if request.method == 'GET': + return apicall(command, get_args(request.args)) + +@app.route('/') +def index(): + return send_from_directory("templates", "index.html") + +if __name__ == '__main__': + app.run(debug=True) diff --git a/tools/ngui/config.py b/tools/ngui/config.py new file mode 100644 index 00000000000..27a5525eba2 --- /dev/null +++ b/tools/ngui/config.py @@ -0,0 +1,6 @@ +apikey='DNi_vTVLPNfTEFuqu5F9MrPI3iecf8iRQ3QtGUH1IM2Nd96wNwNlf7BzmF1W8aw6cE2ejZCgyE53wT5VpzauuA' +secretkey='x4jM12uE4LNho3ZNJa8J-Ve6WsgEXd8df1mGGfeuJHMtolkaSBkD5pLX0tvj8YrWhBgtZbKgYsTB00kb7z_3BA' +path='/client/api' +host='localhost' +port='8080' +protocol='http' diff --git a/tools/ngui/precache.py b/tools/ngui/precache.py new file mode 100644 index 00000000000..9399b54491e --- /dev/null +++ b/tools/ngui/precache.py @@ -0,0 +1,19 @@ +# -*- coding: utf-8 -*- +# Auto-generated code by cachemaker.py +# 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. +apicache = {u'authorize': {u'securitygroupingress': {u'name': u'authorizeSecurityGroupIngress', u'related': [u'authorizeSecurityGroupEgress'], u'isasync': True, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the security group. If the account parameter is used, domainId must also be used.'}, {u'name': u'startport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'start port for this ingress rule'}, {u'name': u'securitygroupid', u'required': False, u'related': [u'createSecurityGroup', u'listSecurityGroups'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the security group. Mutually exclusive with securityGroupName parameter'}, {u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list associated'}, {u'name': u'usersecuritygrouplist', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'user to security group mapping'}, {u'name': u'securitygroupname', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The name of the security group. Mutually exclusive with securityGroupName parameter'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the security group. Must be used with domainId.'}, {u'name': u'icmpcode', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'error code for this icmp message'}, {u'name': u'protocol', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'TCP is default. UDP is the other supported protocol'}, {u'name': u'icmptype', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'type of the icmp message being sent'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'an optional project of the security group'}, {u'name': u'endport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'end port for this ingress rule'}], u'requiredparams': [], u'description': u'Authorizes a particular ingress rule for this security group'}, u'securitygroupegress': {u'name': u'authorizeSecurityGroupEgress', u'related': [], u'isasync': True, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the security group. Must be used with domainId.'}, {u'name': u'securitygroupname', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The name of the security group. Mutually exclusive with securityGroupName parameter'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the security group. If the account parameter is used, domainId must also be used.'}, {u'name': u'icmpcode', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'error code for this icmp message'}, {u'name': u'securitygroupid', u'required': False, u'related': [u'createSecurityGroup', u'listSecurityGroups'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the security group. Mutually exclusive with securityGroupName parameter'}, {u'name': u'icmptype', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'type of the icmp message being sent'}, {u'name': u'protocol', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'TCP is default. UDP is the other supported protocol'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'an optional project of the security group'}, {u'name': u'endport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'end port for this egress rule'}, {u'name': u'usersecuritygrouplist', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'user to security group mapping'}, {u'name': u'startport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'start port for this egress rule'}, {u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list associated'}], u'requiredparams': [], u'description': u'Authorizes a particular egress rule for this security group'}}, u'restore': {u'virtualmachine': {u'name': u'restoreVirtualMachine', u'related': [u'stopVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine'], u'isasync': True, u'params': [{u'name': u'virtualmachineid', u'required': True, u'related': [u'stopVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'Virtual Machine ID'}], u'requiredparams': [u'virtualmachineid'], u'description': u'Restore a VM to original template or specific snapshot'}}, u'suspend': {u'project': {u'name': u'suspendProject', u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'suspendProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'id of the project to be suspended'}], u'requiredparams': [u'id'], u'description': u'Suspends a project'}}, u'revoke': {u'securitygroupingress': {u'name': u'revokeSecurityGroupIngress', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'The ID of the ingress rule'}], u'requiredparams': [u'id'], u'description': u'Deletes a particular ingress rule from this security group'}, u'securitygroupegress': {u'name': u'revokeSecurityGroupEgress', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'The ID of the egress rule'}], u'requiredparams': [u'id'], u'description': u'Deletes a particular egress rule from this security group'}}, u'disassociate': {u'ipaddress': {u'name': u'disassociateIpAddress', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'the id of the public ip address to disassociate'}], u'requiredparams': [u'id'], u'description': u'Disassociates an ip address from the account.'}}, u'migrate': {u'volume': {u'name': u'migrateVolume', u'related': [u'detachVolume', u'resizeVolume', u'attachVolume', u'uploadVolume', u'createVolume'], u'isasync': True, u'params': [{u'name': u'volumeid', u'required': True, u'related': [u'migrateVolume', u'detachVolume', u'resizeVolume', u'attachVolume', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the volume'}, {u'name': u'storageid', u'required': True, u'related': [u'cancelStorageMaintenance', u'enableStorageMaintenance', u'updateStoragePool', u'createStoragePool', u'listStoragePools'], u'length': 255, u'type': u'uuid', u'description': u'destination storage pool ID to migrate the volume to'}], u'requiredparams': [u'volumeid', u'storageid'], u'description': u'Migrate volume'}, u'systemvm': {u'name': u'migrateSystemVm', u'related': [], u'isasync': True, u'params': [{u'name': u'virtualmachineid', u'required': True, u'related': [u'rebootSystemVm', u'listSystemVms'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine'}, {u'name': u'hostid', u'required': True, u'related': [u'addHost', u'updateHost', u'listHosts', u'listExternalLoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'destination Host ID to migrate VM to'}], u'requiredparams': [u'virtualmachineid', u'hostid'], u'description': u'Attempts Migration of a system virtual machine to the host specified.'}, u'virtualmachine': {u'name': u'migrateVirtualMachine', u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'deployVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'storageid', u'required': False, u'related': [u'cancelStorageMaintenance'], u'length': 255, u'type': u'long', u'description': u'Destination storage pool ID to migrate VM volumes to. Required for migrating the root disk volume'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine'}, {u'name': u'hostid', u'required': False, u'related': [u'addHost', u'updateHost', u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'Destination Host ID to migrate VM to. Required for live migrating a VM from host to host'}], u'requiredparams': [u'virtualmachineid'], u'description': u'Attempts Migration of a VM to a different host or Root volume of the vm to a different storage pool'}}, u'lock': {u'account': {u'name': u'lockAccount', u'related': [u'markDefaultZoneForAccount'], u'isasync': False, u'params': [{u'name': u'domainid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Locks the specified account on this domain.'}, {u'name': u'account', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Locks the specified account.'}], u'requiredparams': [u'domainid', u'account'], u'description': u'Locks an account'}, u'user': {u'name': u'lockUser', u'related': [u'listUsers'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'lockUser', u'listUsers'], u'length': 255, u'type': u'uuid', u'description': u'Locks user by user ID.'}], u'requiredparams': [u'id'], u'description': u'Locks a user account'}}, u'dissociate': {u'lun': {u'name': u'dissociateLun', u'related': [], u'isasync': False, u'params': [{u'name': u'iqn', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Guest IQN.'}, {u'name': u'path', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'LUN path.'}], u'requiredparams': [u'iqn', u'path'], u'description': u'Dissociate a LUN'}}, u'activate': {u'project': {u'name': u'activateProject', u'related': [u'createProject', u'listProjectAccounts'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createProject', u'listProjectAccounts', u'activateProject'], u'length': 255, u'type': u'uuid', u'description': u'id of the project to be modified'}], u'requiredparams': [u'id'], u'description': u'Activates a project'}}, u'reconnect': {u'host': {u'name': u'reconnectHost', u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addSecondaryStorage', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers', u'prepareHostForMaintenance'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addSecondaryStorage', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'reconnectHost', u'listExternalLoadBalancers', u'prepareHostForMaintenance'], u'length': 255, u'type': u'uuid', u'description': u'the host ID'}], u'requiredparams': [u'id'], u'description': u'Reconnects a host.'}}, u'cancel': {u'hostmaintenance': {u'name': u'cancelHostMaintenance', u'related': [u'listSwifts', u'addHost', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'the host ID'}], u'requiredparams': [u'id'], u'description': u'Cancels host maintenance.'}, u'storagemaintenance': {u'name': u'cancelStorageMaintenance', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'cancelStorageMaintenance'], u'length': 255, u'type': u'uuid', u'description': u'the primary storage ID'}], u'requiredparams': [u'id'], u'description': u'Cancels maintenance for primary storage'}}, u'query': {u'asyncjobresult': {u'name': u'queryAsyncJobResult', u'related': [], u'isasync': False, u'params': [{u'name': u'jobid', u'required': True, u'related': [u'queryAsyncJobResult'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the asychronous job'}], u'requiredparams': [u'jobid'], u'description': u'Retrieves the current status of asynchronous job.'}}, u'recover': {u'virtualmachine': {u'name': u'recoverVirtualMachine', u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}], u'requiredparams': [u'id'], u'description': u'Recovers a virtual machine.'}}, u'extract': {u'volume': {u'name': u'extractVolume', u'related': [u'extractTemplate', u'extractIso'], u'isasync': True, u'params': [{u'name': u'url', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the url to which the volume would be extracted'}, {u'name': u'id', u'required': True, u'related': [u'migrateVolume', u'detachVolume', u'resizeVolume', u'attachVolume', u'listVolumes', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the volume'}, {u'name': u'mode', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the mode of extraction - HTTP_DOWNLOAD or FTP_UPLOAD'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone where the volume is located'}], u'requiredparams': [u'id', u'mode', u'zoneid'], u'description': u'Extracts volume'}, u'iso': {u'name': u'extractIso', u'related': [u'extractTemplate'], u'isasync': True, u'params': [{u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone where the ISO is originally located'}, {u'name': u'url', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the url to which the ISO would be extracted'}, {u'name': u'mode', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the mode of extraction - HTTP_DOWNLOAD or FTP_UPLOAD'}, {u'name': u'id', u'required': True, u'related': [u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the ISO file'}], u'requiredparams': [u'mode', u'id'], u'description': u'Extracts an ISO'}, u'template': {u'name': u'extractTemplate', u'related': [], u'isasync': True, u'params': [{u'name': u'mode', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the mode of extraction - HTTP_DOWNLOAD or FTP_UPLOAD'}, {u'name': u'id', u'required': True, u'related': [u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the template'}, {u'name': u'url', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the url to which the ISO would be extracted'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone where the ISO is originally located'}], u'requiredparams': [u'mode', u'id'], u'description': u'Extracts a template'}}, u'copy': {u'iso': {u'name': u'copyIso', u'related': [u'updateIso', u'listIsos'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'Template ID.'}, {u'name': u'destzoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'ID of the zone the template is being copied to.'}, {u'name': u'sourcezoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'ID of the zone the template is currently hosted on.'}], u'requiredparams': [u'id', u'destzoneid', u'sourcezoneid'], u'description': u'Copies an iso from one zone to another.'}, u'template': {u'name': u'copyTemplate', u'related': [u'listTemplates', u'registerIso', u'updateTemplate', u'prepareTemplate', u'registerTemplate', u'copyIso', u'updateIso', u'listIsos'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'copyTemplate', u'listTemplates', u'registerIso', u'updateTemplate', u'prepareTemplate', u'registerTemplate', u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'Template ID.'}, {u'name': u'destzoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'ID of the zone the template is being copied to.'}, {u'name': u'sourcezoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'ID of the zone the template is currently hosted on.'}], u'requiredparams': [u'id', u'destzoneid', u'sourcezoneid'], u'description': u'Copies a template from one zone to another.'}}, u'prepare': {u'hostformaintenance': {u'name': u'prepareHostForMaintenance', u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addSecondaryStorage', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addSecondaryStorage', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers', u'prepareHostForMaintenance'], u'length': 255, u'type': u'uuid', u'description': u'the host ID'}], u'requiredparams': [u'id'], u'description': u'Prepares a host for maintenance.'}, u'template': {u'name': u'prepareTemplate', u'related': [u'registerIso', u'updateTemplate', u'copyIso', u'updateIso', u'listIsos'], u'isasync': False, u'params': [{u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'zone ID of the template to be prepared in primary storage(s).'}, {u'name': u'templateid', u'required': True, u'related': [u'registerIso', u'updateTemplate', u'prepareTemplate', u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'template ID of the template to be prepared in primary storage(s).'}], u'requiredparams': [u'zoneid', u'templateid'], u'description': u'load template into primary storage'}}, u'attach': {u'volume': {u'name': u'attachVolume', u'related': [u'detachVolume', u'resizeVolume', u'uploadVolume', u'createVolume'], u'isasync': True, u'params': [{u'name': u'deviceid', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'the ID of the device to map the volume to within the guest OS. If no deviceId is passed in, the next available deviceId will be chosen. Possible values for a Linux OS are:* 1 - /dev/xvdb* 2 - /dev/xvdc* 4 - /dev/xvde* 5 - /dev/xvdf* 6 - /dev/xvdg* 7 - /dev/xvdh* 8 - /dev/xvdi* 9 - /dev/xvdj'}, {u'name': u'id', u'required': True, u'related': [u'detachVolume', u'resizeVolume', u'attachVolume', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u' the ID of the virtual machine'}], u'requiredparams': [u'id', u'virtualmachineid'], u'description': u'Attaches a disk volume to a virtual machine.'}, u'iso': {u'name': u'attachIso', u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'virtualmachineid', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine'}, {u'name': u'id', u'required': True, u'related': [u'listTemplates', u'registerIso', u'updateTemplate', u'prepareTemplate', u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the ISO file'}], u'requiredparams': [u'virtualmachineid', u'id'], u'description': u'Attaches an ISO to a virtual machine.'}}, u'create': {u'loadbalancerrule': {u'name': u'createLoadBalancerRule', u'related': [u'updateLoadBalancerRule'], u'isasync': True, u'params': [{u'name': u'openfirewall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true, firewall rule for source/end pubic port is automatically created; if false - firewall rule has to be created explicitely. If not specified 1) defaulted to false when LB rule is being created for VPC guest network 2) in all other cases defaulted to true'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account associated with the load balancer. Must be used with the domainId parameter.'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the domain ID associated with the load balancer'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'zone where the load balancer is going to be created. This parameter is required when LB service provider is ElasticLoadBalancerVm'}, {u'name': u'publicipid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'public ip address id from where the network traffic will be load balanced from'}, {u'name': u'algorithm', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'load balancer algorithm (source, roundrobin, leastconn)'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the load balancer rule'}, {u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list to forward traffic from'}, {u'name': u'publicport', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the public port from where the network traffic will be load balanced from'}, {u'name': u'description', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the description of the load balancer rule'}, {u'name': u'privateport', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the private port of the private ip address/virtual machine where the network traffic will be load balanced to'}, {u'name': u'networkid', u'required': False, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'The guest network this rule will be created for. Required when public Ip address is not associated with any Guest network yet (VPC case)'}], u'requiredparams': [u'algorithm', u'name', u'publicport', u'privateport'], u'description': u'Creates a load balancer rule'}, u'domain': {u'name': u'createDomain', u'related': [], u'isasync': False, u'params': [{u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'creates domain with this name'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Domain UUID, required for adding domain from another Region'}, {u'name': u'networkdomain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Network domain for networks in the domain'}, {u'name': u'parentdomainid', u'required': False, u'related': [u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'assigns new domain a parent domain by domain ID of the parent. If no parent domain is specied, the ROOT domain is assumed.'}], u'requiredparams': [u'name'], u'description': u'Creates a domain'}, u'snapshotpolicy': {u'name': u'createSnapshotPolicy', u'related': [u'listSnapshotPolicies'], u'isasync': False, u'params': [{u'name': u'intervaltype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'valid values are HOURLY, DAILY, WEEKLY, and MONTHLY'}, {u'name': u'maxsnaps', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'maximum number of snapshots to retain'}, {u'name': u'schedule', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'time the snapshot is scheduled to be taken. Format is:* if HOURLY, MM* if DAILY, MM:HH* if WEEKLY, MM:HH:DD (1-7)* if MONTHLY, MM:HH:DD (1-28)'}, {u'name': u'timezone', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.'}, {u'name': u'volumeid', u'required': True, u'related': [u'detachVolume', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume'}], u'requiredparams': [u'intervaltype', u'maxsnaps', u'schedule', u'timezone', u'volumeid'], u'description': u'Creates a snapshot policy for the account.'}, u'diskoffering': {u'name': u'createDiskOffering', u'related': [u'listDiskOfferings'], u'isasync': False, u'params': [{u'name': u'customized', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'whether disk offering is custom or not'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 4096, u'type': u'string', u'description': u'alternate display text of the disk offering'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the containing domain, null for public offerings'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the disk offering'}, {u'name': u'disksize', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'size of the disk offering in GB'}, {u'name': u'storagetype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the storage type of the disk offering. Values are local and shared.'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'tags for the disk offering'}], u'requiredparams': [u'displaytext', u'name'], u'description': u'Creates a disk offering.'}, u'securitygroup': {u'name': u'createSecurityGroup', u'related': [u'listSecurityGroups'], u'isasync': False, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the security group. Must be used with domainId.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the security group. If the account parameter is used, domainId must also be used.'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the security group'}, {u'name': u'description', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the description of the security group'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Deploy vm for the project'}], u'requiredparams': [u'name'], u'description': u'Creates a security group'}, u'portforwardingrule': {u'name': u'createPortForwardingRule', u'related': [u'listIpForwardingRules'], u'isasync': True, u'params': [{u'name': u'privateport', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u"the starting port of port forwarding rule's private port range"}, {u'name': u'ipaddressid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the IP address id of the port forwarding rule'}, {u'name': u'protocol', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the protocol for the port fowarding rule. Valid values are TCP or UDP.'}, {u'name': u'openfirewall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true, firewall rule for source/end pubic port is automatically created; if false - firewall rule has to be created explicitely. If not specified 1) defaulted to false when PF rule is being created for VPC guest network 2) in all other cases defaulted to true'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine for the port forwarding rule'}, {u'name': u'privateendport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u"the ending port of port forwarding rule's private port range"}, {u'name': u'networkid', u'required': False, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'The network of the vm the Port Forwarding rule will be created for. Required when public Ip address is not associated with any Guest network yet (VPC case)'}, {u'name': u'publicendport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u"the ending port of port forwarding rule's private port range"}, {u'name': u'publicport', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u"the starting port of port forwarding rule's public port range"}, {u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list to forward traffic from'}], u'requiredparams': [u'privateport', u'ipaddressid', u'protocol', u'virtualmachineid', u'publicport'], u'description': u'Creates a port forwarding rule'}, u'pod': {u'name': u'createPod', u'related': [u'updatePod', u'listPods'], u'isasync': False, u'params': [{u'name': u'startip', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the starting IP address for the Pod'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the Pod'}, {u'name': u'zoneid', u'required': True, u'related': [u'listZones'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID in which the Pod will be created'}, {u'name': u'endip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IP address for the Pod'}, {u'name': u'netmask', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the netmask for the Pod'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this Pod for allocation of new resources'}, {u'name': u'gateway', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway for the Pod'}], u'requiredparams': [u'startip', u'name', u'zoneid', u'netmask', u'gateway'], u'description': u'Creates a new Pod.'}, u'ipforwardingrule': {u'name': u'createIpForwardingRule', u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'listPortForwardingRules', u'createPortForwardingRule'], u'isasync': True, u'params': [{u'name': u'endport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the end port for the rule'}, {u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list to forward traffic from'}, {u'name': u'ipaddressid', u'required': True, u'related': [u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'the public IP address id of the forwarding rule, already associated via associateIp'}, {u'name': u'openfirewall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true, firewall rule for source/end pubic port is automatically created; if false - firewall rule has to be created explicitely. Has value true by default'}, {u'name': u'startport', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the start port for the rule'}, {u'name': u'protocol', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the protocol for the rule. Valid values are TCP or UDP.'}], u'requiredparams': [u'ipaddressid', u'startport', u'protocol'], u'description': u'Creates an ip forwarding rule'}, u'vpnconnection': {u'name': u'createVpnConnection', u'related': [u'listVpnConnections', u'resetVpnConnection'], u'isasync': True, u'params': [{u'name': u's2svpngatewayid', u'required': True, u'related': [u'createVpnGateway', u'listVpnGateways'], u'length': 255, u'type': u'uuid', u'description': u'id of the vpn gateway'}, {u'name': u's2scustomergatewayid', u'required': True, u'related': [u'updateVpnCustomerGateway', u'createVpnCustomerGateway', u'listVpnCustomerGateways'], u'length': 255, u'type': u'uuid', u'description': u'id of the customer gateway'}], u'requiredparams': [u's2svpngatewayid', u's2scustomergatewayid'], u'description': u'Create site to site vpn connection'}, u'vpncustomergateway': {u'name': u'createVpnCustomerGateway', u'related': [], u'isasync': True, u'params': [{u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the domain ID associated with the gateway. If used with the account parameter returns the gateway associated with the account for the specified domain.'}, {u'name': u'gateway', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'public ip address id of the customer gateway'}, {u'name': u'esplifetime', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'Lifetime of phase 2 VPN connection to the customer gateway, in seconds'}, {u'name': u'esppolicy', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'ESP policy of the customer gateway'}, {u'name': u'ikepolicy', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'IKE policy of the customer gateway'}, {u'name': u'cidrlist', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'guest cidr list of the customer gateway'}, {u'name': u'dpd', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'If DPD is enabled for VPN connection'}, {u'name': u'ipsecpsk', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'IPsec Preshared-Key of the customer gateway'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account associated with the gateway. Must be used with the domainId parameter.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of this customer gateway'}, {u'name': u'ikelifetime', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'Lifetime of phase 1 VPN connection to the customer gateway, in seconds'}], u'requiredparams': [u'gateway', u'esppolicy', u'ikepolicy', u'cidrlist', u'ipsecpsk'], u'description': u'Creates site to site vpn customer gateway'}, u'lbstickinesspolicy': {u'name': u'createLBStickinessPolicy', u'related': [], u'isasync': True, u'params': [{u'name': u'lbruleid', u'required': True, u'related': [u'listIpForwardingRules'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the load balancer rule'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the LB Stickiness policy'}, {u'name': u'methodname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the LB Stickiness policy method, possible values can be obtained from ListNetworks API '}, {u'name': u'description', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the description of the LB Stickiness policy'}, {u'name': u'param', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'param list. Example: param[0].name=cookiename¶m[0].value=LBCookie '}], u'requiredparams': [u'lbruleid', u'name', u'methodname'], u'description': u'Creates a Load Balancer stickiness policy '}, u'vpcoffering': {u'name': u'createVPCOffering', u'related': [u'listVPCOfferings'], u'isasync': True, u'params': [{u'name': u'displaytext', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the vpc offering'}, {u'name': u'supportedservices', u'required': True, u'related': [], u'length': 255, u'type': u'list', u'description': u'services supported by the vpc offering'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the vpc offering'}], u'requiredparams': [u'displaytext', u'supportedservices', u'name'], u'description': u'Creates VPC offering'}, u'network': {u'name': u'createNetwork', u'related': [u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'isasync': False, u'params': [{u'name': u'endipv6', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IPv6 address in the IPv6 network range'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'an optional project for the ssh key'}, {u'name': u'ip6cidr', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the CIDR of IPv6 network, must be at least /64'}, {u'name': u'acltype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Access control type; supported values are account and domain. In 3.0 all shared networks should have aclType=Domain, and all Isolated networks - Account. Account means that only the account owner can use the network, domain - all accouns in the domain can use the network'}, {u'name': u'gateway', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway of the network. Required for Shared networks and Isolated networks when it belongs to VPC'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the network'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID the network belongs to'}, {u'name': u'subdomainaccess', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Defines whether to allow subdomains to use networks dedicated to their parent domain(s). Should be used with aclType=Domain, defaulted to allow.subdomain.network.access global config if not specified'}, {u'name': u'startip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the beginning IP address in the network IP range'}, {u'name': u'netmask', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the netmask of the network. Required for Shared networks and Isolated networks when it belongs to VPC'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'domain ID of the account owning a network'}, {u'name': u'networkdomain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'network domain'}, {u'name': u'ip6gateway', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway of the IPv6 network. Required for Shared networks and Isolated networks when it belongs to VPC'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'account who will own the network'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the network'}, {u'name': u'startipv6', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the beginning IPv6 address in the IPv6 network range'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the network'}, {u'name': u'vpcid', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs', u'createVPC'], u'length': 255, u'type': u'uuid', u'description': u'the VPC network belongs to'}, {u'name': u'endip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IP address in the network IP range. If not specified, will be defaulted to startIP'}, {u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ID or VID of the network'}, {u'name': u'networkofferingid', u'required': True, u'related': [u'createNetworkOffering', u'updateNetworkOffering'], u'length': 255, u'type': u'uuid', u'description': u'the network offering id'}], u'requiredparams': [u'displaytext', u'zoneid', u'name', u'networkofferingid'], u'description': u'Creates a network'}, u'zone': {u'name': u'createZone', u'related': [u'listZones'], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the containing domain, null for public zones'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the Zone'}, {u'name': u'ip6dns2', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the second DNS for IPv6 network in the Zone'}, {u'name': u'domain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Network domain name for the networks in the zone'}, {u'name': u'internaldns1', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the first internal DNS for the Zone'}, {u'name': u'localstorageenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if local storage offering enabled, false otherwise'}, {u'name': u'securitygroupenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if network is security group enabled, false otherwise'}, {u'name': u'networktype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'network type of the zone, can be Basic or Advanced'}, {u'name': u'internaldns2', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the second internal DNS for the Zone'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this Zone for allocation of new resources'}, {u'name': u'guestcidraddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the guest CIDR address for the Zone'}, {u'name': u'dns1', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the first DNS for the Zone'}, {u'name': u'ip6dns1', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the first DNS for IPv6 network in the Zone'}, {u'name': u'dns2', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the second DNS for the Zone'}], u'requiredparams': [u'name', u'internaldns1', u'networktype', u'dns1'], u'description': u'Creates a Zone.'}, u'remoteaccessvpn': {u'name': u'createRemoteAccessVpn', u'related': [], u'isasync': True, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the VPN. Must be used with domainId.'}, {u'name': u'openfirewall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true, firewall rule for source/end pubic port is automatically created; if false - firewall rule has to be created explicitely. Has value true by default'}, {u'name': u'publicipid', u'required': True, u'related': [u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'public ip address id of the vpn server'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the VPN. If the account parameter is used, domainId must also be used.'}, {u'name': u'iprange', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the range of ip addresses to allocate to vpn clients. The first ip in the range will be taken by the vpn server'}], u'requiredparams': [u'publicipid'], u'description': u'Creates a l2tp/ipsec remote access vpn'}, u'instancegroup': {u'name': u'createInstanceGroup', u'related': [], u'isasync': False, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account of the instance group. The account parameter must be used with the domainId parameter.'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'The project of the instance group'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the instance group'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the domain ID of account owning the instance group'}], u'requiredparams': [u'name'], u'description': u'Creates a vm group'}, u'autoscalepolicy': {u'name': u'createAutoScalePolicy', u'related': [u'updateAutoScalePolicy'], u'isasync': True, u'params': [{u'name': u'action', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the action to be executed if all the conditions evaluate to true for the specified duration.'}, {u'name': u'quiettime', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the cool down period for which the policy should not be evaluated after the action has been taken'}, {u'name': u'conditionids', u'required': True, u'related': [], u'length': 255, u'type': u'list', u'description': u'the list of IDs of the conditions that are being evaluated on every interval'}, {u'name': u'duration', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the duration for which the conditions have to be true before action is taken'}], u'requiredparams': [u'action', u'conditionids', u'duration'], u'description': u'Creates an autoscale policy for a provision or deprovision action, the action is taken when the all the conditions evaluates to true for the specified duration. The policy is in effect once it is attached to a autscale vm group.'}, u'tags': {u'name': u'createTags', u'related': [], u'isasync': True, u'params': [{u'name': u'tags', u'required': True, u'related': [], u'length': 255, u'type': u'map', u'description': u'Map of tags (key/value pairs)'}, {u'name': u'resourcetype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'type of the resource'}, {u'name': u'customer', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u"identifies client specific tag. When the value is not null, the tag can't be used by cloudStack code internally"}, {u'name': u'resourceids', u'required': True, u'related': [], u'length': 255, u'type': u'list', u'description': u'list of resources to create the tags for'}], u'requiredparams': [u'tags', u'resourcetype', u'resourceids'], u'description': u'Creates resource tag(s)'}, u'serviceoffering': {u'name': u'createServiceOffering', u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings'], u'isasync': False, u'params': [{u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the service offering'}, {u'name': u'storagetype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the storage type of the service offering. Values are local and shared.'}, {u'name': u'issystem', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'is this a system vm offering'}, {u'name': u'cpunumber', u'required': True, u'related': [], u'length': 255, u'type': u'long', u'description': u'the CPU number of the service offering'}, {u'name': u'systemvmtype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the system VM type. Possible types are "domainrouter", "consoleproxy" and "secondarystoragevm".'}, {u'name': u'limitcpuuse', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'restrict the CPU usage to committed service offering'}, {u'name': u'hosttags', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the host tag for this service offering.'}, {u'name': u'offerha', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'the HA for the service offering'}, {u'name': u'memory', u'required': True, u'related': [], u'length': 255, u'type': u'long', u'description': u'the total memory of the service offering in MB'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the containing domain, null for public offerings'}, {u'name': u'cpuspeed', u'required': True, u'related': [], u'length': 255, u'type': u'long', u'description': u'the CPU speed of the service offering in MHz.'}, {u'name': u'networkrate', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'data transfer rate in megabits per second allowed. Supported only for non-System offering and system offerings having "domainrouter" systemvmtype'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the service offering'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the tags for this service offering.'}], u'requiredparams': [u'name', u'cpunumber', u'memory', u'cpuspeed', u'displaytext'], u'description': u'Creates a service offering.'}, u'condition': {u'name': u'createCondition', u'related': [], u'isasync': True, u'params': [{u'name': u'threshold', u'required': True, u'related': [], u'length': 255, u'type': u'long', u'description': u'Threshold value.'}, {u'name': u'counterid', u'required': True, u'related': [u'listConditions', u'listCounters', u'createCounter'], u'length': 255, u'type': u'uuid', u'description': u'ID of the Counter.'}, {u'name': u'relationaloperator', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Relational Operator to be used with threshold.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account of the condition. Must be used with the domainId parameter.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the domain ID of the account.'}], u'requiredparams': [u'threshold', u'counterid', u'relationaloperator'], u'description': u'Creates a condition'}, u'storagepool': {u'name': u'createStoragePool', u'related': [u'cancelStorageMaintenance', u'listStoragePools'], u'isasync': False, u'params': [{u'name': u'clusterid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the cluster ID for the storage pool'}, {u'name': u'zoneid', u'required': True, u'related': [u'listZones'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the storage pool'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name for the storage pool'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the tags for the storage pool'}, {u'name': u'podid', u'required': True, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID for the storage pool'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the URL of the storage pool'}, {u'name': u'details', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'the details for the storage pool'}], u'requiredparams': [u'clusterid', u'zoneid', u'name', u'podid', u'url'], u'description': u'Creates a storage pool.'}, u'vpngateway': {u'name': u'createVpnGateway', u'related': [], u'isasync': True, u'params': [{u'name': u'vpcid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'public ip address id of the vpn gateway'}], u'requiredparams': [u'vpcid'], u'description': u'Creates site to site vpn local gateway'}, u'autoscalevmgroup': {u'name': u'createAutoScaleVmGroup', u'related': [u'updateAutoScaleVmGroup'], u'isasync': True, u'params': [{u'name': u'vmprofileid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the autoscale profile that contains information about the vms in the vm group.'}, {u'name': u'scaledownpolicyids', u'required': True, u'related': [u'updateAutoScalePolicy'], u'length': 255, u'type': u'list', u'description': u'list of scaledown autoscale policies'}, {u'name': u'scaleuppolicyids', u'required': True, u'related': [u'updateAutoScalePolicy'], u'length': 255, u'type': u'list', u'description': u'list of scaleup autoscale policies'}, {u'name': u'interval', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the frequency at which the conditions have to be evaluated'}, {u'name': u'minmembers', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.'}, {u'name': u'maxmembers', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.'}, {u'name': u'lbruleid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the load balancer rule'}], u'requiredparams': [u'vmprofileid', u'scaledownpolicyids', u'scaleuppolicyids', u'minmembers', u'maxmembers', u'lbruleid'], u'description': u'Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.'}, u'networkacl': {u'name': u'createNetworkACL', u'related': [], u'isasync': True, u'params': [{u'name': u'icmpcode', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'error code for this icmp message'}, {u'name': u'endport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the ending port of ACL'}, {u'name': u'traffictype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the traffic type for the ACL,can be Ingress or Egress, defaulted to Ingress if not specified'}, {u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list to allow traffic from/to'}, {u'name': u'networkid', u'required': True, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'The network of the vm the ACL will be created for'}, {u'name': u'protocol', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the protocol for the ACL rule. Valid values are TCP/UDP/ICMP.'}, {u'name': u'startport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the starting port of ACL'}, {u'name': u'icmptype', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'type of the icmp message being sent'}], u'requiredparams': [u'networkid', u'protocol'], u'description': u'Creates a ACL rule the given network (the network has to belong to VPC)'}, u'template': {u'name': u'createTemplate', u'related': [u'cancelStorageMaintenance', u'enableStorageMaintenance', u'updateStoragePool', u'createStoragePool', u'listStoragePools'], u'isasync': True, u'params': [{u'name': u'ostypeid', u'required': True, u'related': [u'listOsTypes'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the OS Type that best represents the OS of this template.'}, {u'name': u'templatetag', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the tag for this template.'}, {u'name': u'bits', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'32 or 64 bit'}, {u'name': u'ispublic', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if this template is a public template, false otherwise'}, {u'name': u'volumeid', u'required': False, u'related': [u'migrateVolume', u'detachVolume', u'resizeVolume', u'attachVolume', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume the template is being created from. Either this parameter, or snapshotId has to be passed in'}, {u'name': u'passwordenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template supports the password reset feature; default is false'}, {u'name': u'snapshotid', u'required': False, u'related': [u'createSnapshot', u'listSnapshots'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the snapshot the template is being created from. Either this parameter, or volumeId has to be passed in'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'listLoadBalancerRuleInstances', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'Optional, VM ID. If this presents, it is going to create a baremetal template for VM this ID refers to. This is only for VM whose hypervisor type is BareMetal'}, {u'name': u'url', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Optional, only for baremetal hypervisor. The directory name where template stored on CIFS server'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the display text of the template. This is usually used for display purposes.'}, {u'name': u'details', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'Template details in key/value pairs.'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the template'}, {u'name': u'isfeatured', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if this template is a featured template, false otherwise'}, {u'name': u'requireshvm', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template requres HVM, false otherwise'}], u'requiredparams': [u'ostypeid', u'displaytext', u'name'], u'description': u'Creates a template of a virtual machine. The virtual machine must be in a STOPPED state. A template created from this command is automatically designated as a private template visible to the account that created it.'}, u'privategateway': {u'name': u'createPrivateGateway', u'related': [], u'isasync': True, u'params': [{u'name': u'vlan', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the Vlan for the private gateway'}, {u'name': u'gateway', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway of the Private gateway'}, {u'name': u'netmask', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the netmask of the Private gateway'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID the network belongs to'}, {u'name': u'vpcid', u'required': True, u'related': [u'restartVPC'], u'length': 255, u'type': u'uuid', u'description': u'the VPC network belongs to'}, {u'name': u'ipaddress', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the IP address of the Private gateaway'}], u'requiredparams': [u'vlan', u'gateway', u'netmask', u'vpcid', u'ipaddress'], u'description': u'Creates a private gateway'}, u'volumeonfiler': {u'name': u'createVolumeOnFiler', u'related': [], u'isasync': False, u'params': [{u'name': u'volumename', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'volume name.'}, {u'name': u'aggregatename', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'aggregate name.'}, {u'name': u'poolname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'pool name.'}, {u'name': u'snapshotpolicy', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'snapshot policy.'}, {u'name': u'ipaddress', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'ip address.'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'password.'}, {u'name': u'size', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'volume size.'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'user name.'}, {u'name': u'snapshotreservation', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'snapshot reservation.'}], u'requiredparams': [u'volumename', u'aggregatename', u'poolname', u'ipaddress', u'password', u'size', u'username'], u'description': u'Create a volume'}, u'staticroute': {u'name': u'createStaticRoute', u'related': [], u'isasync': True, u'params': [{u'name': u'gatewayid', u'required': True, u'related': [u'createPrivateGateway'], u'length': 255, u'type': u'uuid', u'description': u'the gateway id we are creating static route for'}, {u'name': u'cidr', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'static route cidr'}], u'requiredparams': [u'gatewayid', u'cidr'], u'description': u'Creates a static route'}, u'volume': {u'name': u'createVolume', u'related': [u'detachVolume', u'uploadVolume'], u'isasync': True, u'params': [{u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the disk volume'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the availability zone'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts'], u'length': 255, u'type': u'uuid', u'description': u'the project associated with the volume. Mutually exclusive with account parameter'}, {u'name': u'diskofferingid', u'required': False, u'related': [u'updateDiskOffering', u'createDiskOffering', u'listDiskOfferings'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk offering. Either diskOfferingId or snapshotId must be passed in.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account associated with the disk volume. Must be used with the domainId parameter.'}, {u'name': u'size', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'Arbitrary volume size'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the domain ID associated with the disk offering. If used with the account parameter returns the disk volume associated with the account for the specified domain.'}, {u'name': u'snapshotid', u'required': False, u'related': [u'createSnapshot', u'listSnapshots'], u'length': 255, u'type': u'uuid', u'description': u'the snapshot ID for the disk volume. Either diskOfferingId or snapshotId must be passed in.'}], u'requiredparams': [u'name'], u'description': u'Creates a disk volume from a disk offering. This disk volume must still be attached to a virtual machine to make use of it.'}, u'user': {u'name': u'createUser', u'related': [u'lockUser', u'listUsers'], u'isasync': False, u'params': [{u'name': u'account', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Creates the user under the specified account. If no account is specified, the username will be used as the account name.'}, {u'name': u'userid', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'User UUID, required for adding account from external provisioning system'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Unique username.'}, {u'name': u'timezone', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Creates the user under the specified domain. Has to be accompanied with the account parameter'}, {u'name': u'email', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'email'}, {u'name': u'lastname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'lastname'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Hashed password (Default is MD5). If you wish to use any other hashing algorithm, you would need to write a custom authentication adapter See Docs section.'}, {u'name': u'firstname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'firstname'}], u'requiredparams': [u'account', u'username', u'email', u'lastname', u'password', u'firstname'], u'description': u'Creates a user for an account that already exists'}, u'vpc': {u'name': u'createVPC', u'related': [u'updateVPC', u'restartVPC', u'listVPCs'], u'isasync': True, u'params': [{u'name': u'displaytext', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the VPC'}, {u'name': u'zoneid', u'required': True, u'related': [u'listZones'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the availability zone'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the VPC'}, {u'name': u'vpcofferingid', u'required': True, u'related': [u'listVPCOfferings', u'createVPCOffering'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the VPC offering'}, {u'name': u'networkdomain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'VPC network domain. All networks inside the VPC will belong to this domain'}, {u'name': u'cidr', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u"the cidr of the VPC. All VPC guest networks' cidrs should be within this CIDR"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account associated with the VPC. Must be used with the domainId parameter.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the domain ID associated with the VPC. If used with the account parameter returns the VPC associated with the account for the specified domain.'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts'], u'length': 255, u'type': u'uuid', u'description': u'create VPC for the project'}], u'requiredparams': [u'displaytext', u'zoneid', u'name', u'vpcofferingid', u'cidr'], u'description': u'Creates a VPC'}, u'storagenetworkiprange': {u'name': u'createStorageNetworkIpRange', u'related': [u'listStorageNetworkIpRange', u'updateStorageNetworkIpRange'], u'isasync': True, u'params': [{u'name': u'startip', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the beginning IP address'}, {u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Optional. The vlan the ip range sits on, default to Null when it is not specificed which means you network is not on any Vlan. This is mainly for Vmware as other hypervisors can directly reterive bridge from pyhsical network traffic type table'}, {u'name': u'podid', u'required': True, u'related': [u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'UUID of pod where the ip range belongs to'}, {u'name': u'netmask', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the netmask for storage network'}, {u'name': u'endip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IP address'}, {u'name': u'gateway', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway for storage network'}], u'requiredparams': [u'startip', u'podid', u'netmask', u'gateway'], u'description': u'Creates a Storage network IP range.'}, u'pool': {u'name': u'createPool', u'related': [], u'isasync': False, u'params': [{u'name': u'algorithm', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'algorithm.'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'pool name.'}], u'requiredparams': [u'algorithm', u'name'], u'description': u'Create a pool'}, u'autoscalevmprofile': {u'name': u'createAutoScaleVmProfile', u'related': [u'updateAutoScaleVmProfile', u'listAutoScaleVmProfiles'], u'isasync': True, u'params': [{u'name': u'otherdeployparams', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'parameters other than zoneId/serviceOfferringId/templateId of the auto deployed virtual machine'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'availability zone for the auto deployed virtual machine'}, {u'name': u'serviceofferingid', u'required': True, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings', u'createServiceOffering', u'updateServiceOffering'], u'length': 255, u'type': u'uuid', u'description': u'the service offering of the auto deployed virtual machine'}, {u'name': u'destroyvmgraceperiod', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the time allowed for existing connections to get closed before a vm is destroyed'}, {u'name': u'counterparam', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'counterparam list. Example: counterparam[0].name=snmpcommunity&counterparam[0].value=public&counterparam[1].name=snmpport&counterparam[1].value=161'}, {u'name': u'templateid', u'required': True, u'related': [u'registerIso', u'updateTemplate', u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the template of the auto deployed virtual machine'}, {u'name': u'autoscaleuserid', u'required': False, u'related': [u'disableUser', u'lockUser', u'listUsers', u'enableUser', u'createUser', u'updateUser'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the user used to launch and destroy the VMs'}], u'requiredparams': [u'zoneid', u'serviceofferingid', u'templateid'], u'description': u'Creates a profile that contains information about the virtual machine which will be provisioned automatically by autoscale feature.'}, u'account': {u'name': u'createAccount', u'related': [u'disableUser', u'lockUser', u'listUsers', u'enableUser', u'createUser', u'getUser', u'updateUser'], u'isasync': False, u'params': [{u'name': u'lastname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'lastname'}, {u'name': u'accounttype', u'required': True, u'related': [], u'length': 255, u'type': u'short', u'description': u'Type of the account. Specify 0 for user, 1 for root admin, and 2 for domain admin'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Unique username.'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Hashed password (Default is MD5). If you wish to use any other hashing algorithm, you would need to write a custom authentication adapter See Docs section.'}, {u'name': u'firstname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'firstname'}, {u'name': u'userid', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'User UUID, required for adding account from external provisioning system'}, {u'name': u'timezone', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Creates the user under the specified account. If no account is specified, the username will be used as the account name.'}, {u'name': u'accountdetails', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'details for account used to store specific parameters'}, {u'name': u'email', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'email'}, {u'name': u'networkdomain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u"Network domain for the account's networks"}, {u'name': u'accountid', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Account UUID, required for adding account from external provisioning system'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'Creates the user under the specified domain.'}], u'requiredparams': [u'lastname', u'accounttype', u'username', u'password', u'firstname', u'email'], u'description': u'Creates an account'}, u'firewallrule': {u'name': u'createFirewallRule', u'related': [u'listEgressFirewallRules'], u'isasync': True, u'params': [{u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list to forward traffic from'}, {u'name': u'protocol', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the protocol for the firewall rule. Valid values are TCP/UDP/ICMP.'}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'type of firewallrule: system/user'}, {u'name': u'ipaddressid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the IP address id of the port forwarding rule'}, {u'name': u'startport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the starting port of firewall rule'}, {u'name': u'icmptype', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'type of the icmp message being sent'}, {u'name': u'icmpcode', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'error code for this icmp message'}, {u'name': u'endport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the ending port of firewall rule'}], u'requiredparams': [u'protocol', u'ipaddressid'], u'description': u'Creates a firewall rule for a given ip address'}, u'networkoffering': {u'name': u'createNetworkOffering', u'related': [u'updateNetworkOffering'], u'isasync': False, u'params': [{u'name': u'serviceproviderlist', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'provider to service mapping. If not specified, the provider for the service will be mapped to the default provider on the physical network'}, {u'name': u'serviceofferingid', u'required': False, u'related': [u'updateHypervisorCapabilities'], u'length': 255, u'type': u'uuid', u'description': u'the service offering ID used by virtual router provider'}, {u'name': u'supportedservices', u'required': True, u'related': [], u'length': 255, u'type': u'list', u'description': u'services supported by the network offering'}, {u'name': u'networkrate', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'data transfer rate in megabits per second allowed'}, {u'name': u'ispersistent', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if network offering supports persistent networks; defaulted to false if not specified'}, {u'name': u'servicecapabilitylist', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'desired service capabilities as part of network offering'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the network offering'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the tags for the network offering.'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the network offering'}, {u'name': u'conservemode', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the network offering is IP conserve mode enabled'}, {u'name': u'guestiptype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'guest type of the network offering: Shared or Isolated'}, {u'name': u'traffictype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the traffic type for the network offering. Supported type in current release is GUEST only'}, {u'name': u'specifyvlan', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if network offering supports vlans'}, {u'name': u'availability', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the availability of network offering. Default value is Optional'}, {u'name': u'specifyipranges', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if network offering supports specifying ip ranges; defaulted to false if not specified'}], u'requiredparams': [u'supportedservices', u'name', u'displaytext', u'guestiptype', u'traffictype'], u'description': u'Creates a network offering.'}, u'vlaniprange': {u'name': u'createVlanIpRange', u'related': [u'listVlanIpRanges'], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'domain ID of the account owning a VLAN'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'suspendProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'project who will own the VLAN. If VLAN is Zone wide, this parameter should be ommited'}, {u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ID or VID of the VLAN. If not specified, will be defaulted to the vlan of the network or if vlan of the network is null - to Untagged'}, {u'name': u'networkid', u'required': False, u'related': [u'createNetwork', u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'length': 255, u'type': u'uuid', u'description': u'the network id'}, {u'name': u'forvirtualnetwork', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if VLAN is of Virtual type, false if Direct'}, {u'name': u'podid', u'required': False, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'optional parameter. Have to be specified for Direct Untagged vlan only.'}, {u'name': u'ip6cidr', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the CIDR of IPv6 network, must be at least /64'}, {u'name': u'endipv6', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IPv6 address in the IPv6 network range'}, {u'name': u'startip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the beginning IP address in the VLAN IP range'}, {u'name': u'startipv6', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the beginning IPv6 address in the IPv6 network range'}, {u'name': u'gateway', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway of the VLAN IP range'}, {u'name': u'netmask', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the netmask of the VLAN IP range'}, {u'name': u'endip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IP address in the VLAN IP range'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'account who will own the VLAN. If VLAN is Zone wide, this parameter should be ommited'}, {u'name': u'ip6gateway', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway of the IPv6 network. Required for Shared networks and Isolated networks when it belongs to VPC'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'updatePhysicalNetwork', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the physical network id'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID of the VLAN IP range'}], u'requiredparams': [], u'description': u'Creates a VLAN IP range.'}, u'counter': {u'name': u'createCounter', u'related': [u'listCounters'], u'isasync': True, u'params': [{u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Name of the counter.'}, {u'name': u'source', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Source of the counter.'}, {u'name': u'value', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Value of the counter e.g. oid in case of snmp.'}], u'requiredparams': [u'name', u'source', u'value'], u'description': u'Adds metric counter'}, u'lunonfiler': {u'name': u'createLunOnFiler', u'related': [], u'isasync': False, u'params': [{u'name': u'size', u'required': True, u'related': [], u'length': 255, u'type': u'long', u'description': u'LUN size.'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'pool name.'}], u'requiredparams': [u'size', u'name'], u'description': u'Create a LUN from a pool'}, u'project': {u'name': u'createProject', u'related': [], u'isasync': True, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'account who will be Admin for the project'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the project'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'domain ID of the account owning a project'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'display text of the project'}], u'requiredparams': [u'name', u'displaytext'], u'description': u'Creates a project'}, u'physicalnetwork': {u'name': u'createPhysicalNetwork', u'related': [u'listPhysicalNetworks'], u'isasync': True, u'params': [{u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the physical network'}, {u'name': u'zoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the physical network'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'Tag the physical network'}, {u'name': u'networkspeed', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the speed for the physical network[1G/10G]'}, {u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the VLAN for the physical network'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'domain ID of the account owning a physical network'}, {u'name': u'broadcastdomainrange', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the broadcast domain range for the physical network[Pod or Zone]. In Acton release it can be Zone only in Advance zone, and Pod in Basic'}, {u'name': u'isolationmethods', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the isolation method for the physical network[VLAN/L3/GRE]'}], u'requiredparams': [u'name', u'zoneid'], u'description': u'Creates a physical network'}, u'snapshot': {u'name': u'createSnapshot', u'related': [u'listSnapshots'], u'isasync': True, u'params': [{u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'The domain ID of the snapshot. If used with the account parameter, specifies a domain for the account associated with the disk volume.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The account of the snapshot. The account parameter must be used with the domainId parameter.'}, {u'name': u'volumeid', u'required': True, u'related': [u'detachVolume'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the disk volume'}, {u'name': u'policyid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'policy id of the snapshot, if this is null, then use MANUAL_POLICY.'}], u'requiredparams': [u'volumeid'], u'description': u'Creates an instant snapshot of a volume.'}, u'virtualrouterelement': {u'name': u'createVirtualRouterElement', u'related': [], u'isasync': True, u'params': [{u'name': u'nspid', u'required': True, u'related': [u'updateNetworkServiceProvider'], u'length': 255, u'type': u'uuid', u'description': u'the network service provider ID of the virtual router element'}], u'requiredparams': [u'nspid'], u'description': u'Create a virtual router element.'}, u'egressfirewallrule': {u'name': u'createEgressFirewallRule', u'related': [u'createFirewallRule', u'listEgressFirewallRules'], u'isasync': True, u'params': [{u'name': u'networkid', u'required': True, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'the network id of the port forwarding rule'}, {u'name': u'startport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the starting port of firewall rule'}, {u'name': u'icmpcode', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'error code for this icmp message'}, {u'name': u'icmptype', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'type of the icmp message being sent'}, {u'name': u'cidrlist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the cidr list to forward traffic from'}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'type of firewallrule: system/user'}, {u'name': u'protocol', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the protocol for the firewall rule. Valid values are TCP/UDP/ICMP.'}, {u'name': u'endport', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the ending port of firewall rule'}], u'requiredparams': [u'networkid', u'protocol'], u'description': u'Creates a egress firewall rule for a given network '}, u'sshkeypair': {u'name': u'createSSHKeyPair', u'related': [u'listSSHKeyPairs'], u'isasync': False, u'params': [{u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'an optional project for the ssh key'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the ssh key. If the account parameter is used, domainId must also be used.'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Name of the keypair'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the ssh key. Must be used with domainId.'}], u'requiredparams': [u'name'], u'description': u'Create a new keypair and returns the private key'}}, u'deploy': {u'virtualmachine': {u'name': u'deployVirtualMachine', u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'keypair', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the ssh key pair used to login to the virtual machine'}, {u'name': u'userdata', u'required': False, u'related': [], u'length': 2048, u'type': u'string', u'description': u'an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Currently only HTTP GET is supported. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding.'}, {u'name': u'hypervisor', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the hypervisor on which to deploy the virtual machine'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the virtual machine. If the account parameter is used, domainId must also be used.'}, {u'name': u'size', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'the arbitrary size for the DATADISK volume. Mutually exclusive with diskOfferingId'}, {u'name': u'diskofferingid', u'required': False, u'related': [u'createDiskOffering', u'listDiskOfferings'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk offering for the virtual machine. If the template is of ISO format, the diskOfferingId is for the root disk volume. Otherwise this parameter is used to indicate the offering for the data disk volume. If the templateId parameter passed is from a Template object, the diskOfferingId refers to a DATA Disk Volume created. If the templateId parameter passed is from an ISO object, the diskOfferingId refers to a ROOT Disk Volume created.'}, {u'name': u'securitygroupids', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'comma separated list of security groups id that going to be applied to the virtual machine. Should be passed only when vm is created from a zone with Basic Network support. Mutually exclusive with securitygroupnames parameter'}, {u'name': u'serviceofferingid', u'required': True, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the service offering for the virtual machine'}, {u'name': u'ipaddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u"the ip address for default vm's network"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the virtual machine. Must be used with domainId.'}, {u'name': u'hostid', u'required': False, u'related': [u'addHost', u'updateHost', u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'destination Host ID to deploy the VM to - parameter available for root admin only'}, {u'name': u'iptonetworklist', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u"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"}, {u'name': u'ip6address', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u"the ipv6 address for default vm's network"}, {u'name': u'keyboard', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'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'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject'], u'length': 255, u'type': u'uuid', u'description': u'Deploy vm for the project'}, {u'name': u'networkids', u'required': False, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'list', u'description': u"list of network ids used by virtual machine. Can't be specified with ipToNetworkList parameter"}, {u'name': u'displayname', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional user generated name for the virtual machine'}, {u'name': u'securitygroupnames', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'comma separated list of security groups names that going to be applied to the virtual machine. Should be passed only when vm is created from a zone with Basic Network support. Mutually exclusive with securitygroupids parameter'}, {u'name': u'templateid', u'required': True, u'related': [u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the template for the virtual machine'}, {u'name': u'zoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'availability zone for the virtual machine'}, {u'name': u'group', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional group for the virtual machine'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'host name for the virtual machine'}, {u'name': u'startvm', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if network offering supports specifying ip ranges; defaulted to true if not specified'}], u'requiredparams': [u'serviceofferingid', u'templateid', u'zoneid'], u'description': u'Creates and automatically starts a virtual machine based on a service offering, disk offering, and template.'}}, u'restart': {u'network': {u'name': u'restartNetwork', u'related': [u'associateIpAddress'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'The id of the network to restart.'}, {u'name': u'cleanup', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'If cleanup old network elements'}], u'requiredparams': [u'id'], u'description': u'Restarts the network; includes 1) restarting network elements - virtual routers, dhcp servers 2) reapplying all public ips 3) reapplying loadBalancing/portForwarding rules'}, u'vpc': {u'name': u'restartVPC', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': False, u'related': [u'restartVPC'], u'length': 255, u'type': u'uuid', u'description': u'the id of the VPC'}], u'requiredparams': [], u'description': u'Restarts a VPC'}}, u'reboot': {u'systemvm': {u'name': u'rebootSystemVm', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'rebootSystemVm'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the system virtual machine'}], u'requiredparams': [u'id'], u'description': u'Reboots a system VM.'}, u'router': {u'name': u'rebootRouter', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'rebootRouter'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the router'}], u'requiredparams': [u'id'], u'description': u'Starts a router.'}, u'virtualmachine': {u'name': u'rebootVirtualMachine', u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}], u'requiredparams': [u'id'], u'description': u'Reboots a virtual machine.'}}, u'mark': {u'defaultzoneforaccount': {u'name': u'markDefaultZoneForAccount', u'related': [], u'isasync': True, u'params': [{u'name': u'account', u'required': True, u'related': [u'markDefaultZoneForAccount'], u'length': 255, u'type': u'string', u'description': u'Name of the account that is to be marked.'}, {u'name': u'domainid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Marks the account that belongs to the specified domain.'}, {u'name': u'zoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'The Zone ID with which the account is to be marked.'}], u'requiredparams': [u'account', u'domainid', u'zoneid'], u'description': u'Marks a default zone for this account'}}, u'start': {u'systemvm': {u'name': u'startSystemVm', u'related': [u'rebootSystemVm', u'listSystemVms', u'changeServiceForSystemVm'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'startSystemVm', u'rebootSystemVm', u'listSystemVms', u'changeServiceForSystemVm'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the system virtual machine'}], u'requiredparams': [u'id'], u'description': u'Starts a system virtual machine.'}, u'router': {u'name': u'startRouter', u'related': [u'destroyRouter', u'rebootRouter'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'destroyRouter', u'rebootRouter', u'startRouter'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the router'}], u'requiredparams': [u'id'], u'description': u'Starts a router.'}, u'virtualmachine': {u'name': u'startVirtualMachine', u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}, {u'name': u'hostid', u'required': False, u'related': [u'addHost', u'updateHost', u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'destination Host ID to deploy the VM to - parameter available for root admin only'}], u'requiredparams': [u'id'], u'description': u'Starts a virtual machine.'}}, u'add': {u'trafficmonitor': {u'name': u'addTrafficMonitor', u'related': [u'listTrafficMonitors'], u'isasync': False, u'params': [{u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'URL of the traffic monitor Host'}, {u'name': u'includezones', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Traffic going into the listed zones will be metered'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'Zone in which to add the external firewall appliance.'}, {u'name': u'excludezones', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Traffic going into the listed zones will not be metered'}], u'requiredparams': [u'url', u'zoneid'], u'description': u'Adds Traffic Monitor Host for Direct Network Usage'}, u'secondarystorage': {u'name': u'addSecondaryStorage', u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers'], u'isasync': False, u'params': [{u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the secondary storage'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the URL for the secondary storage'}], u'requiredparams': [u'url'], u'description': u'Adds secondary storage.'}, u'nictovirtualmachine': {u'name': u'addNicToVirtualMachine', u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'listLoadBalancerRuleInstances', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'networkid', u'required': True, u'related': [u'createNetwork', u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'length': 255, u'type': u'uuid', u'description': u'Network ID'}, {u'name': u'ipaddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'IP Address for the new network'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'addNicToVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'listLoadBalancerRuleInstances', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'Virtual Machine ID'}], u'requiredparams': [u'networkid', u'virtualmachineid'], u'description': u'Adds VM to specified network by creating a NIC'}, u'netscalerloadbalancer': {u'name': u'addNetscalerLoadBalancer', u'related': [u'listNetscalerLoadBalancers', u'configureNetscalerLoadBalancer'], u'isasync': True, u'params': [{u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to reach netscaler load balancer device'}, {u'name': u'physicalnetworkid', u'required': True, u'related': [u'listPhysicalNetworks', u'updatePhysicalNetwork', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to reach netscaler load balancer device'}, {u'name': u'networkdevicetype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Netscaler device type supports NetscalerMPXLoadBalancer, NetscalerVPXLoadBalancer, NetscalerSDXLoadBalancer'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'URL of the netscaler load balancer appliance.'}], u'requiredparams': [u'password', u'physicalnetworkid', u'username', u'networkdevicetype', u'url'], u'description': u'Adds a netscaler load balancer device'}, u'cluster': {u'name': u'addCluster', u'related': [u'listClusters', u'updateCluster'], u'isasync': False, u'params': [{u'name': u'url', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the URL'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this cluster for allocation of new resources'}, {u'name': u'vsmpassword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the password for the VSM associated with this cluster'}, {u'name': u'podid', u'required': True, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID for the host'}, {u'name': u'vsmipaddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ipaddress of the VSM associated with this cluster'}, {u'name': u'hypervisor', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'hypervisor type of the cluster: XenServer,KVM,VMware,Hyperv,BareMetal,Simulator'}, {u'name': u'vsmusername', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the username for the VSM associated with this cluster'}, {u'name': u'username', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the username for the cluster'}, {u'name': u'clustertype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'type of the cluster: CloudManaged, ExternalManaged'}, {u'name': u'clustername', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the cluster name'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the cluster'}, {u'name': u'password', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the password for the host'}], u'requiredparams': [u'podid', u'hypervisor', u'clustertype', u'clustername', u'zoneid'], u'description': u'Adds a new cluster'}, u's3': {u'name': u'addS3', u'related': [], u'isasync': False, u'params': [{u'name': u'connectiontimeout', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'connection timeout (milliseconds)'}, {u'name': u'accesskey', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'S3 access key'}, {u'name': u'bucket', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the template storage bucket'}, {u'name': u'endpoint', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'S3 host name'}, {u'name': u'secretkey', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'S3 secret key'}, {u'name': u'sockettimeout', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'socket timeout (milliseconds)'}, {u'name': u'maxerrorretry', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'maximum number of times to retry on error'}, {u'name': u'usehttps', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'connect to the S3 endpoint via HTTPS?'}], u'requiredparams': [u'accesskey', u'bucket', u'secretkey'], u'description': u'Adds S3'}, u'accounttoproject': {u'name': u'addAccountToProject', u'related': [], u'isasync': True, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the account to be added to the project'}, {u'name': u'email', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'email to which invitation to the project is going to be sent'}, {u'name': u'projectid', u'required': True, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'suspendProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'id of the project to add the account to'}], u'requiredparams': [u'projectid'], u'description': u'Adds acoount to a project'}, u'region': {u'name': u'addRegion', u'related': [], u'isasync': False, u'params': [{u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Name of the region'}, {u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Id of the Region'}, {u'name': u'endpoint', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Region service endpoint'}], u'requiredparams': [u'name', u'id', u'endpoint'], u'description': u'Adds a Region'}, u'externalloadbalancer': {u'name': u'addExternalLoadBalancer', u'related': [], u'isasync': False, u'params': [{u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Username of the external load balancer appliance.'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'URL of the external load balancer appliance.'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Password of the external load balancer appliance.'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'Zone in which to add the external load balancer appliance.'}], u'requiredparams': [u'username', u'url', u'password', u'zoneid'], u'description': u'Adds F5 external load balancer appliance.'}, u'vpnuser': {u'name': u'addVpnUser', u'related': [u'listVpnUsers'], u'isasync': True, u'params': [{u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'password for the username'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'username for the vpn user'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the vpn user. Must be used with domainId.'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the vpn user. If the account parameter is used, domainId must also be used.'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject'], u'length': 255, u'type': u'uuid', u'description': u'add vpn user to the specific project'}], u'requiredparams': [u'password', u'username'], u'description': u'Adds vpn users'}, u'baremetalhost': {u'name': u'addBaremetalHost', u'related': [u'listSwifts', u'addHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers'], u'isasync': False, u'params': [{u'name': u'ipaddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'ip address intentionally allocated to this host after provisioning'}, {u'name': u'hosttags', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list of tags to be added to the host'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the host URL'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the username for the host'}, {u'name': u'zoneid', u'required': True, u'related': [u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the host'}, {u'name': u'clustername', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the cluster name for the host'}, {u'name': u'clusterid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the cluster ID for the host'}, {u'name': u'hypervisor', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'hypervisor type of the host'}, {u'name': u'podid', u'required': True, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID for the host'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the password for the host'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this Host for allocation of new resources'}], u'requiredparams': [u'url', u'username', u'zoneid', u'hypervisor', u'podid', u'password'], u'description': u'add a baremetal host'}, u'traffictype': {u'name': u'addTrafficType', u'related': [u'updateTrafficType'], u'isasync': True, u'params': [{u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The VLAN id to be used for Management traffic by VMware host'}, {u'name': u'kvmnetworklabel', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The network name label of the physical device dedicated to this traffic on a KVM host'}, {u'name': u'traffictype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the trafficType to be added to the physical network'}, {u'name': u'physicalnetworkid', u'required': True, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'vmwarenetworklabel', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The network name label of the physical device dedicated to this traffic on a VMware host'}, {u'name': u'xennetworklabel', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The network name label of the physical device dedicated to this traffic on a XenServer host'}], u'requiredparams': [u'traffictype', u'physicalnetworkid'], u'description': u'Adds traffic type to a physical network'}, u'niciranvpdevice': {u'name': u'addNiciraNvpDevice', u'related': [], u'isasync': True, u'params': [{u'name': u'physicalnetworkid', u'required': True, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'hostname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Hostname of ip address of the Nicira NVP Controller.'}, {u'name': u'l3gatewayserviceuuid', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The L3 Gateway Service UUID configured on the Nicira Controller'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to access the Nicira Controller API'}, {u'name': u'transportzoneuuid', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'The Transportzone UUID configured on the Nicira Controller'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to access the Nicira Controller API'}], u'requiredparams': [u'physicalnetworkid', u'hostname', u'username', u'transportzoneuuid', u'password'], u'description': u'Adds a Nicira NVP device'}, u'host': {u'name': u'addHost', u'related': [u'updateHost', u'listHosts'], u'isasync': False, u'params': [{u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the username for the host'}, {u'name': u'podid', u'required': True, u'related': [u'updatePod'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID for the host'}, {u'name': u'clustername', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the cluster name for the host'}, {u'name': u'zoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the host'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the host URL'}, {u'name': u'clusterid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the cluster ID for the host'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the password for the host'}, {u'name': u'hosttags', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list of tags to be added to the host'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this Host for allocation of new resources'}, {u'name': u'hypervisor', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'hypervisor type of the host'}], u'requiredparams': [u'username', u'podid', u'zoneid', u'url', u'password', u'hypervisor'], u'description': u'Adds a new host.'}, u'f5loadbalancer': {u'name': u'addF5LoadBalancer', u'related': [u'configureF5LoadBalancer', u'listF5LoadBalancers'], u'isasync': True, u'params': [{u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to reach F5 BigIP load balancer device'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to reach F5 BigIP load balancer device'}, {u'name': u'physicalnetworkid', u'required': True, u'related': [u'listPhysicalNetworks', u'updatePhysicalNetwork', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'networkdevicetype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'supports only F5BigIpLoadBalancer'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'URL of the F5 load balancer appliance.'}], u'requiredparams': [u'password', u'username', u'physicalnetworkid', u'networkdevicetype', u'url'], u'description': u'Adds a F5 BigIP load balancer device'}, u'networkdevice': {u'name': u'addNetworkDevice', u'related': [], u'isasync': False, u'params': [{u'name': u'networkdevicetype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Network device type, now supports ExternalDhcp, PxeServer, NetscalerMPXLoadBalancer, NetscalerVPXLoadBalancer, NetscalerSDXLoadBalancer, F5BigIpLoadBalancer, JuniperSRXFirewall'}, {u'name': u'networkdeviceparameterlist', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'parameters for network device'}], u'requiredparams': [], u'description': u'Adds a network device of one of the following types: ExternalDhcp, ExternalFirewall, ExternalLoadBalancer, PxeServer'}, u'bigswitchvnsdevice': {u'name': u'addBigSwitchVnsDevice', u'related': [], u'isasync': True, u'params': [{u'name': u'physicalnetworkid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'hostname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Hostname of ip address of the BigSwitch VNS Controller.'}], u'requiredparams': [u'physicalnetworkid', u'hostname'], u'description': u'Adds a BigSwitch VNS device'}, u'srxfirewall': {u'name': u'addSrxFirewall', u'related': [], u'isasync': True, u'params': [{u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to reach SRX firewall device'}, {u'name': u'networkdevicetype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'supports only JuniperSRXFirewall'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Credentials to reach SRX firewall device'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'URL of the SRX appliance.'}, {u'name': u'physicalnetworkid', u'required': True, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}], u'requiredparams': [u'password', u'networkdevicetype', u'username', u'url', u'physicalnetworkid'], u'description': u'Adds a SRX firewall device'}, u'swift': {u'name': u'addSwift', u'related': [u'listSwifts', u'addHost', u'updateHost', u'listHosts', u'listExternalLoadBalancers'], u'isasync': False, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account for swift'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the URL for swift'}, {u'name': u'username', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the username for swift'}, {u'name': u'key', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u' key for the user for swift'}], u'requiredparams': [u'url'], u'description': u'Adds Swift.'}, u'externalfirewall': {u'name': u'addExternalFirewall', u'related': [], u'isasync': False, u'params': [{u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'URL of the external firewall appliance.'}, {u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Password of the external firewall appliance.'}, {u'name': u'zoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Zone in which to add the external firewall appliance.'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Username of the external firewall appliance.'}], u'requiredparams': [u'url', u'password', u'zoneid', u'username'], u'description': u'Adds an external firewall appliance'}, u'networkserviceprovider': {u'name': u'addNetworkServiceProvider', u'related': [u'updateNetworkServiceProvider'], u'isasync': True, u'params': [{u'name': u'destinationphysicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the destination Physical Network ID to bridge to'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name for the physical network service provider'}, {u'name': u'servicelist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the list of services to be enabled for this physical network service provider'}, {u'name': u'physicalnetworkid', u'required': True, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID to add the provider to'}], u'requiredparams': [u'name', u'physicalnetworkid'], u'description': u'Adds a network serviceProvider to a physical network'}}, u'verbs': [u'authorize', u'restore', u'suspend', u'revoke', u'disassociate', u'migrate', u'lock', u'dissociate', u'activate', u'reconnect', u'cancel', u'query', u'recover', u'extract', u'detach', u'prepare', u'start', u'create', u'associate', u'reboot', u'mark', u'attach', u'add', u'change', u'deploy', u'ldap', u'destroy', u'enable', u'configure', u'get', u'modify', u'stop', u'update', u'disable', u'resize', u'copy', u'generate', u'restart', u'reset', u'register', u'list', u'upload', u'remove', u'assign', u'delete'], u'resize': {u'volume': {u'name': u'resizeVolume', u'related': [u'detachVolume', u'uploadVolume', u'createVolume'], u'isasync': True, u'params': [{u'name': u'diskofferingid', u'required': False, u'related': [u'updateDiskOffering', u'createDiskOffering', u'listDiskOfferings'], u'length': 255, u'type': u'uuid', u'description': u'new disk offering id'}, {u'name': u'id', u'required': False, u'related': [u'detachVolume', u'resizeVolume', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume'}, {u'name': u'shrinkok', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Verify OK to Shrink'}, {u'name': u'size', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'New volume size in G'}], u'requiredparams': [], u'description': u'Resizes a volume'}}, u'ldap': {u'config': {u'name': u'ldapConfig', u'related': [u'ldapRemove'], u'isasync': False, u'params': [{u'name': u'hostname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Hostname or ip address of the ldap server eg: my.ldap.com'}, {u'name': u'ssl', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Check Use SSL if the external LDAP server is configured for LDAP over SSL.'}, {u'name': u'truststore', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Enter the path to trust certificates store.'}, {u'name': u'queryfilter', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'You specify a query filter here, which narrows down the users, who can be part of this domain.'}, {u'name': u'searchbase', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'The search base defines the starting point for the search in the directory tree Example: dc=cloud,dc=com.'}, {u'name': u'port', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Specify the LDAP port if required, default is 389.'}, {u'name': u'binddn', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Specify the distinguished name of a user with the search permission on the directory.'}, {u'name': u'truststorepass', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Enter the password for trust store.'}, {u'name': u'bindpass', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Enter the password.'}], u'requiredparams': [u'hostname', u'queryfilter', u'searchbase'], u'description': u'Configure the LDAP context for this site.'}, u'remove': {u'name': u'ldapRemove', u'related': [], u'isasync': False, u'params': [], u'requiredparams': [], u'description': u'Remove the LDAP context for this site.'}}, u'destroy': {u'systemvm': {u'name': u'destroySystemVm', u'related': [u'startSystemVm', u'rebootSystemVm', u'listSystemVms', u'stopSystemVm', u'changeServiceForSystemVm'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'startSystemVm', u'destroySystemVm', u'rebootSystemVm', u'listSystemVms', u'stopSystemVm', u'changeServiceForSystemVm'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the system virtual machine'}], u'requiredparams': [u'id'], u'description': u'Destroyes a system virtual machine.'}, u'router': {u'name': u'destroyRouter', u'related': [u'rebootRouter'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'destroyRouter', u'rebootRouter'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the router'}], u'requiredparams': [u'id'], u'description': u'Destroys a router.'}, u'volumeonfiler': {u'name': u'destroyVolumeOnFiler', u'related': [], u'isasync': False, u'params': [{u'name': u'volumename', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'volume name.'}, {u'name': u'ipaddress', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'ip address.'}, {u'name': u'aggregatename', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'aggregate name.'}], u'requiredparams': [u'volumename', u'ipaddress', u'aggregatename'], u'description': u'Destroy a Volume'}, u'lunonfiler': {u'name': u'destroyLunOnFiler', u'related': [], u'isasync': False, u'params': [{u'name': u'path', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'LUN path.'}], u'requiredparams': [u'path'], u'description': u'Destroy a LUN'}, u'virtualmachine': {u'name': u'destroyVirtualMachine', u'related': [u'listVirtualMachines'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listVirtualMachines', u'destroyVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}], u'requiredparams': [u'id'], u'description': u'Destroys a virtual machine. Once destroyed, only the administrator can recover it.'}}, u'get': {u'apilimit': {u'name': u'getApiLimit', u'related': [u'resetApiLimit'], u'isasync': False, u'params': [], u'requiredparams': [], u'description': u'Get API limit count for the caller'}, u'vmpassword': {u'name': u'getVMPassword', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}], u'requiredparams': [u'id'], u'description': u'Returns an encrypted password for the VM'}, u'user': {u'name': u'getUser', u'related': [u'disableUser', u'lockUser', u'listUsers', u'enableUser', u'createUser', u'updateUser'], u'isasync': False, u'params': [{u'name': u'userapikey', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'API key of the user'}], u'requiredparams': [u'userapikey'], u'description': u'Find user account by API key'}, u'cloudidentifier': {u'name': u'getCloudIdentifier', u'related': [], u'isasync': False, u'params': [{u'name': u'userid', u'required': True, u'related': [u'lockUser', u'listUsers', u'createUser'], u'length': 255, u'type': u'uuid', u'description': u'the user ID for the cloud identifier'}], u'requiredparams': [u'userid'], u'description': u'Retrieves a cloud identifier.'}}, u'count': 355, u'enable': {u'account': {u'name': u'enableAccount', u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount', u'disableAccount'], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'Enables specified account in this domain.'}, {u'name': u'id', u'required': False, u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount', u'enableAccount', u'disableAccount'], u'length': 255, u'type': u'uuid', u'description': u'Account id'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Enables specified account.'}], u'requiredparams': [], u'description': u'Enables an account'}, u'storagemaintenance': {u'name': u'enableStorageMaintenance', u'related': [u'cancelStorageMaintenance', u'updateStoragePool', u'createStoragePool', u'listStoragePools'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'cancelStorageMaintenance', u'enableStorageMaintenance', u'updateStoragePool', u'createStoragePool', u'listStoragePools'], u'length': 255, u'type': u'uuid', u'description': u'Primary storage ID'}], u'requiredparams': [u'id'], u'description': u'Puts storage pool into maintenance state'}, u'cisconexusvsm': {u'name': u'enableCiscoNexusVSM', u'related': [u'disableCiscoNexusVSM'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'disableCiscoNexusVSM', u'enableCiscoNexusVSM'], u'length': 255, u'type': u'uuid', u'description': u'Id of the Cisco Nexus 1000v VSM device to be enabled'}], u'requiredparams': [u'id'], u'description': u'Enable a Cisco Nexus VSM device'}, u'staticnat': {u'name': u'enableStaticNat', u'related': [], u'isasync': False, u'params': [{u'name': u'ipaddressid', u'required': True, u'related': [u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'the public IP address id for which static nat feature is being enabled'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine for enabling static nat feature'}, {u'name': u'networkid', u'required': False, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'The network of the vm the static nat will be enabled for. Required when public Ip address is not associated with any Guest network yet (VPC case)'}], u'requiredparams': [u'ipaddressid', u'virtualmachineid'], u'description': u'Enables static nat for given ip address'}, u'user': {u'name': u'enableUser', u'related': [u'lockUser', u'listUsers', u'createUser'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'lockUser', u'listUsers', u'enableUser', u'createUser'], u'length': 255, u'type': u'uuid', u'description': u'Enables user by user ID.'}], u'requiredparams': [u'id'], u'description': u'Enables a user account'}, u'autoscalevmgroup': {u'name': u'enableAutoScaleVmGroup', u'related': [u'createAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createAutoScaleVmGroup', u'enableAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale group'}], u'requiredparams': [u'id'], u'description': u'Enables an AutoScale Vm Group'}}, u'configure': {u'srxfirewall': {u'name': u'configureSrxFirewall', u'related': [u'listSrxFirewalls', u'addSrxFirewall'], u'isasync': True, u'params': [{u'name': u'fwdeviceid', u'required': True, u'related': [u'listSrxFirewalls', u'configureSrxFirewall', u'addSrxFirewall'], u'length': 255, u'type': u'uuid', u'description': u'SRX firewall device ID'}, {u'name': u'fwdevicecapacity', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'capacity of the firewall device, Capacity will be interpreted as number of networks device can handle'}], u'requiredparams': [u'fwdeviceid'], u'description': u'Configures a SRX firewall device'}, u'f5loadbalancer': {u'name': u'configureF5LoadBalancer', u'related': [], u'isasync': True, u'params': [{u'name': u'lbdeviceid', u'required': True, u'related': [u'configureF5LoadBalancer'], u'length': 255, u'type': u'uuid', u'description': u'F5 load balancer device ID'}, {u'name': u'lbdevicecapacity', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'capacity of the device, Capacity will be interpreted as number of networks device can handle'}], u'requiredparams': [u'lbdeviceid'], u'description': u'configures a F5 load balancer device'}, u'netscalerloadbalancer': {u'name': u'configureNetscalerLoadBalancer', u'related': [u'listNetscalerLoadBalancers'], u'isasync': True, u'params': [{u'name': u'podids', u'required': False, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'list', u'description': u"Used when NetScaler device is provider of EIP service. This parameter represents the list of pod's, for which there exists a policy based route on datacenter L3 router to route pod's subnet IP to a NetScaler device."}, {u'name': u'lbdevicecapacity', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'capacity of the device, Capacity will be interpreted as number of networks device can handle'}, {u'name': u'lbdeviceid', u'required': True, u'related': [u'listNetscalerLoadBalancers', u'configureNetscalerLoadBalancer'], u'length': 255, u'type': u'uuid', u'description': u'Netscaler load balancer device ID'}, {u'name': u'inline', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if netscaler load balancer is intended to be used in in-line with firewall, false if netscaler load balancer will side-by-side with firewall'}, {u'name': u'lbdevicededicated', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if this netscaler device to dedicated for a account, false if the netscaler device will be shared by multiple accounts'}], u'requiredparams': [u'lbdeviceid'], u'description': u'configures a netscaler load balancer device'}, u'virtualrouterelement': {u'name': u'configureVirtualRouterElement', u'related': [u'createVirtualRouterElement'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createVirtualRouterElement', u'configureVirtualRouterElement'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual router provider'}, {u'name': u'enabled', u'required': True, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Enabled/Disabled the service provider'}], u'requiredparams': [u'id', u'enabled'], u'description': u'Configures a virtual router element.'}}, u'associate': {u'ipaddress': {u'name': u'associateIpAddress', u'related': [], u'isasync': True, u'params': [{u'name': u'networkid', u'required': False, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'The network this ip address should be associated to.'}, {u'name': u'vpcid', u'required': False, u'related': [u'restartVPC', u'listVPCs'], u'length': 255, u'type': u'uuid', u'description': u'the VPC you want the ip address to be associated with'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account to associate with this IP address'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the availability zone you want to acquire an public IP address from'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts'], u'length': 255, u'type': u'uuid', u'description': u'Deploy vm for the project'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the domain to associate with this IP address'}], u'requiredparams': [], u'description': u'Acquires and associates a public IP to an account.'}, u'lun': {u'name': u'associateLun', u'related': [], u'isasync': False, u'params': [{u'name': u'iqn', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Guest IQN to which the LUN associate.'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'LUN name.'}], u'requiredparams': [u'iqn', u'name'], u'description': u'Associate a LUN with a guest IQN'}}, u'stop': {u'systemvm': {u'name': u'stopSystemVm', u'related': [u'startSystemVm', u'rebootSystemVm', u'listSystemVms', u'changeServiceForSystemVm'], u'isasync': True, u'params': [{u'name': u'forced', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Force stop the VM. The caller knows the VM is stopped.'}, {u'name': u'id', u'required': True, u'related': [u'startSystemVm', u'rebootSystemVm', u'listSystemVms', u'stopSystemVm', u'changeServiceForSystemVm'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the system virtual machine'}], u'requiredparams': [u'id'], u'description': u'Stops a system VM.'}, u'router': {u'name': u'stopRouter', u'related': [u'changeServiceForRouter', u'destroyRouter', u'rebootRouter', u'startRouter'], u'isasync': True, u'params': [{u'name': u'forced', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Force stop the VM. The caller knows the VM is stopped.'}, {u'name': u'id', u'required': True, u'related': [u'changeServiceForRouter', u'stopRouter', u'destroyRouter', u'rebootRouter', u'startRouter'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the router'}], u'requiredparams': [u'id'], u'description': u'Stops a router.'}, u'virtualmachine': {u'name': u'stopVirtualMachine', u'related': [u'listVirtualMachines', u'destroyVirtualMachine'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'stopVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}, {u'name': u'forced', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Force stop the VM (vm is marked as Stopped even when command fails to be send to the backend). The caller knows the VM is stopped.'}], u'requiredparams': [u'id'], u'description': u'Stops a virtual machine.'}}, u'modify': {u'pool': {u'name': u'modifyPool', u'related': [], u'isasync': False, u'params': [{u'name': u'algorithm', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'algorithm.'}, {u'name': u'poolname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'pool name.'}], u'requiredparams': [u'algorithm', u'poolname'], u'description': u'Modify pool'}}, u'update': {u'loadbalancerrule': {u'name': u'updateLoadBalancerRule', u'related': [], u'isasync': True, u'params': [{u'name': u'description', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the description of the load balancer rule'}, {u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the id of the load balancer rule to update'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the load balancer rule'}, {u'name': u'algorithm', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'load balancer algorithm (source, roundrobin, leastconn)'}], u'requiredparams': [u'id'], u'description': u'Updates load balancer'}, u'domain': {u'name': u'updateDomain', u'related': [u'listDomainChildren', u'createDomain'], u'isasync': False, u'params': [{u'name': u'networkdomain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u"Network domain for the domain's networks; empty string will update domainName with NULL value"}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'updates domain with this name'}, {u'name': u'id', u'required': True, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'ID of domain to update'}], u'requiredparams': [u'id'], u'description': u'Updates a domain with a new name'}, u'projectinvitation': {u'name': u'updateProjectInvitation', u'related': [], u'isasync': True, u'params': [{u'name': u'accept', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true, accept the invitation, decline if false. True by default'}, {u'name': u'projectid', u'required': True, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'id of the project to join'}, {u'name': u'token', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list invitations for specified account; this parameter has to be specified with domainId'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'account that is joining the project'}], u'requiredparams': [u'projectid'], u'description': u'Accepts or declines project invitation'}, u'diskoffering': {u'name': u'updateDiskOffering', u'related': [u'createDiskOffering', u'listDiskOfferings'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateDiskOffering', u'createDiskOffering', u'listDiskOfferings'], u'length': 255, u'type': u'uuid', u'description': u'ID of the disk offering'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'updates alternate display text of the disk offering with this value'}, {u'name': u'sortkey', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'sort key of the disk offering, integer'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'updates name of the disk offering with this value'}], u'requiredparams': [u'id'], u'description': u'Updates a disk offering.'}, u'virtualmachine': {u'name': u'updateVirtualMachine', u'related': [u'stopVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': False, u'params': [{u'name': u'displayname', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'user generated name'}, {u'name': u'group', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'group of the virtual machine'}, {u'name': u'haenable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if high-availability is enabled for the virtual machine, false otherwise'}, {u'name': u'id', u'required': True, u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}, {u'name': u'ostypeid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the OS type that best represents this VM.'}, {u'name': u'userdata', u'required': False, u'related': [], u'length': 2048, u'type': u'string', u'description': u'an optional binary data that can be sent to the virtual machine upon a successful deployment. This binary data must be base64 encoded before adding it to the request. Currently only HTTP GET is supported. Using HTTP GET (via querystring), you can send up to 2KB of data after base64 encoding.'}], u'requiredparams': [u'id'], u'description': u'Updates properties of a virtual machine. The VM has to be stopped and restarted for the new properties to take effect. UpdateVirtualMachine does not first check whether the VM is stopped. Therefore, stop the VM manually before issuing this call.'}, u'portforwardingrule': {u'name': u'updatePortForwardingRule', u'related': [u'listIpForwardingRules', u'listPortForwardingRules', u'createPortForwardingRule'], u'isasync': True, u'params': [{u'name': u'privateport', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the private port of the port forwarding rule'}, {u'name': u'publicport', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the public port of the port forwarding rule'}, {u'name': u'privateip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the private IP address of the port forwarding rule'}, {u'name': u'ipaddressid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the IP address id of the port forwarding rule'}, {u'name': u'protocol', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the protocol for the port fowarding rule. Valid values are TCP or UDP.'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine for the port forwarding rule'}], u'requiredparams': [u'privateport', u'publicport', u'ipaddressid', u'protocol'], u'description': u'Updates a port forwarding rule. Only the private port and the virtual machine can be updated.'}, u'cluster': {u'name': u'updateCluster', u'related': [], u'isasync': False, u'params': [{u'name': u'hypervisor', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'hypervisor type of the cluster'}, {u'name': u'id', u'required': True, u'related': [u'updateCluster'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the Cluster'}, {u'name': u'managedstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'whether this cluster is managed by cloudstack'}, {u'name': u'clustername', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the cluster name'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this cluster for allocation of new resources'}, {u'name': u'clustertype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'hypervisor type of the cluster'}], u'requiredparams': [u'id'], u'description': u'Updates an existing cluster'}, u'hostpassword': {u'name': u'updateHostPassword', u'related': [], u'isasync': False, u'params': [{u'name': u'password', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the new password for the host/cluster'}, {u'name': u'hostid', u'required': False, u'related': [u'listSwifts', u'addHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'the host ID'}, {u'name': u'clusterid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the cluster ID'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the username for the host/cluster'}], u'requiredparams': [u'password', u'username'], u'description': u'Update password of a host/pool on management server.'}, u'pod': {u'name': u'updatePod', u'related': [], u'isasync': False, u'params': [{u'name': u'endip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IP address for the Pod'}, {u'name': u'gateway', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the gateway for the Pod'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this cluster for allocation of new resources'}, {u'name': u'id', u'required': True, u'related': [u'updatePod'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the Pod'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the Pod'}, {u'name': u'startip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the starting IP address for the Pod'}, {u'name': u'netmask', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the netmask of the Pod'}], u'requiredparams': [u'id'], u'description': u'Updates a Pod.'}, u'isopermissions': {u'name': u'updateIsoPermissions', u'related': [], u'isasync': False, u'params': [{u'name': u'isextractable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template/iso is extractable, false other wise. Can be set only by root admin'}, {u'name': u'isfeatured', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true for featured template/iso, false otherwise'}, {u'name': u'accounts', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'a comma delimited list of accounts. If specified, "op" parameter has to be passed in.'}, {u'name': u'ispublic', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true for public template/iso, false for private templates/isos'}, {u'name': u'projectids', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'list', u'description': u'a comma delimited list of projects. If specified, "op" parameter has to be passed in.'}, {u'name': u'op', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'permission operator (add, remove, reset)'}, {u'name': u'id', u'required': True, u'related': [u'registerIso', u'updateTemplate', u'prepareTemplate', u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the template ID'}], u'requiredparams': [u'id'], u'description': u'Updates iso permissions'}, u'resourcelimit': {u'name': u'updateResourceLimit', u'related': [], u'isasync': False, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Update resource for a specified account. Must be used with the domainId parameter.'}, {u'name': u'resourcetype', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Type of resource to update. Values are 0, 1, 2, 3, and 4. 0 - Instance. Number of instances a user can create. 1 - IP. Number of public IP addresses a user can own. 2 - Volume. Number of disk volumes a user can create.3 - Snapshot. Number of snapshots a user can create.4 - Template. Number of templates that a user can register/create.'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Update resource limits for all accounts in specified domain. If used with the account parameter, updates resource limits for a specified account in specified domain.'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Update resource limits for project'}, {u'name': u'max', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u' Maximum resource limit.'}], u'requiredparams': [u'resourcetype'], u'description': u'Updates resource limits for an account or domain.'}, u'vpcoffering': {u'name': u'updateVPCOffering', u'related': [u'listVPCOfferings', u'createVPCOffering'], u'isasync': True, u'params': [{u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the VPC offering'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'update state for the VPC offering; supported states - Enabled/Disabled'}, {u'name': u'id', u'required': False, u'related': [u'listVPCOfferings', u'createVPCOffering', u'updateVPCOffering'], u'length': 255, u'type': u'uuid', u'description': u'the id of the VPC offering'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the VPC offering'}], u'requiredparams': [], u'description': u'Updates VPC offering'}, u'network': {u'name': u'updateNetwork', u'related': [u'listNetscalerLoadBalancerNetworks'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the network'}, {u'name': u'networkofferingid', u'required': False, u'related': [u'updateNetworkOffering'], u'length': 255, u'type': u'uuid', u'description': u'network offering ID'}, {u'name': u'changecidr', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Force update even if cidr type is different'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the new name for the network'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the new display text for the network'}, {u'name': u'networkdomain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'network domain'}], u'requiredparams': [u'id'], u'description': u'Updates a network'}, u'zone': {u'name': u'updateZone', u'related': [u'listZones', u'createZone'], u'isasync': False, u'params': [{u'name': u'internaldns1', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the first internal DNS for the Zone'}, {u'name': u'dnssearchorder', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the dns search order list'}, {u'name': u'internaldns2', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the second internal DNS for the Zone'}, {u'name': u'domain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Network domain name for the networks in the zone; empty string will update domain with NULL value'}, {u'name': u'details', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'the details for the Zone'}, {u'name': u'ip6dns1', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the first DNS for IPv6 network in the Zone'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Allocation state of this cluster for allocation of new resources'}, {u'name': u'ip6dns2', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the second DNS for IPv6 network in the Zone'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the Zone'}, {u'name': u'id', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the Zone'}, {u'name': u'ispublic', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'updates a private zone to public if set, but not vice-versa'}, {u'name': u'dns2', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the second DNS for the Zone'}, {u'name': u'guestcidraddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the guest CIDR address for the Zone'}, {u'name': u'dhcpprovider', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the dhcp Provider for the Zone'}, {u'name': u'dns1', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the first DNS for the Zone'}, {u'name': u'localstorageenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if local storage offering enabled, false otherwise'}], u'requiredparams': [u'id'], u'description': u'Updates a Zone.'}, u'instancegroup': {u'name': u'updateInstanceGroup', u'related': [u'createInstanceGroup'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateInstanceGroup', u'createInstanceGroup'], u'length': 255, u'type': u'uuid', u'description': u'Instance group ID'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'new instance group name'}], u'requiredparams': [u'id'], u'description': u'Updates a vm group'}, u'autoscalepolicy': {u'name': u'updateAutoScalePolicy', u'related': [], u'isasync': True, u'params': [{u'name': u'duration', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the duration for which the conditions have to be true before action is taken'}, {u'name': u'id', u'required': True, u'related': [u'updateAutoScalePolicy'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale policy'}, {u'name': u'quiettime', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the cool down period for which the policy should not be evaluated after the action has been taken'}, {u'name': u'conditionids', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the list of IDs of the conditions that are being evaluated on every interval'}], u'requiredparams': [u'id'], u'description': u'Updates an existing autoscale policy.'}, u'serviceoffering': {u'name': u'updateServiceOffering', u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings', u'createServiceOffering'], u'isasync': False, u'params': [{u'name': u'sortkey', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'sort key of the service offering, integer'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the service offering to be updated'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the service offering to be updated'}, {u'name': u'id', u'required': True, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings', u'createServiceOffering', u'updateServiceOffering'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the service offering to be updated'}], u'requiredparams': [u'id'], u'description': u'Updates a service offering.'}, u'storagepool': {u'name': u'updateStoragePool', u'related': [u'cancelStorageMaintenance', u'createStoragePool', u'listStoragePools'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'cancelStorageMaintenance', u'updateStoragePool', u'createStoragePool', u'listStoragePools'], u'length': 255, u'type': u'uuid', u'description': u'the Id of the storage pool'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'comma-separated list of tags for the storage pool'}], u'requiredparams': [u'id'], u'description': u'Updates a storage pool.'}, u'hypervisorcapabilities': {u'name': u'updateHypervisorCapabilities', u'related': [], u'isasync': False, u'params': [{u'name': u'securitygroupenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'set true to enable security group for this hypervisor.'}, {u'name': u'maxguestslimit', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'the max number of Guest VMs per host for this hypervisor.'}, {u'name': u'id', u'required': False, u'related': [u'listHypervisorCapabilities'], u'length': 255, u'type': u'uuid', u'description': u'ID of the hypervisor capability'}], u'requiredparams': [], u'description': u'Updates a hypervisor capabilities.'}, u'template': {u'name': u'updateTemplate', u'related': [u'registerIso', u'copyIso', u'updateIso', u'listIsos'], u'isasync': False, u'params': [{u'name': u'bootable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if image is bootable, false otherwise'}, {u'name': u'passwordenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the image supports the password reset feature; default is false'}, {u'name': u'format', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the format for the image'}, {u'name': u'ostypeid', u'required': False, u'related': [u'listOsTypes'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the OS type that best represents the OS of this image.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the image file'}, {u'name': u'id', u'required': True, u'related': [u'registerIso', u'updateTemplate', u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the image file'}, {u'name': u'sortkey', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'sort key of the template, integer'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the display text of the image'}], u'requiredparams': [u'id'], u'description': u'Updates attributes of a template.'}, u'defaultnicforvirtualmachine': {u'name': u'updateDefaultNicForVirtualMachine', u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'nicid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'NIC ID'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'Virtual Machine ID'}], u'requiredparams': [u'nicid', u'virtualmachineid'], u'description': u'Changes the default NIC on a VM'}, u'traffictype': {u'name': u'updateTrafficType', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateTrafficType'], u'length': 255, u'type': u'uuid', u'description': u'traffic type id'}, {u'name': u'xennetworklabel', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The network name label of the physical device dedicated to this traffic on a XenServer host'}, {u'name': u'vmwarenetworklabel', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The network name label of the physical device dedicated to this traffic on a VMware host'}, {u'name': u'kvmnetworklabel', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The network name label of the physical device dedicated to this traffic on a KVM host'}], u'requiredparams': [u'id'], u'description': u'Updates traffic type of a physical network'}, u'host': {u'name': u'updateHost', u'related': [u'listHosts'], u'isasync': False, u'params': [{u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Change resource state of host, valid values are [Enable, Disable]. Operation may failed if host in states not allowing Enable/Disable'}, {u'name': u'oscategoryid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the id of Os category to update the host with'}, {u'name': u'hosttags', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list of tags to be added to the host'}, {u'name': u'id', u'required': True, u'related': [u'updateHost', u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the host to update'}, {u'name': u'url', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the new uri for the secondary storage: nfs://host/path'}], u'requiredparams': [u'id'], u'description': u'Updates a host.'}, u'user': {u'name': u'updateUser', u'related': [u'disableUser', u'lockUser', u'listUsers', u'enableUser', u'createUser'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'disableUser', u'lockUser', u'listUsers', u'enableUser', u'createUser', u'updateUser'], u'length': 255, u'type': u'uuid', u'description': u'User uuid'}, {u'name': u'timezone', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Specifies a timezone for this command. For more information on the timezone parameter, see Time Zone Format.'}, {u'name': u'email', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'email'}, {u'name': u'usersecretkey', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The secret key for the user. Must be specified with userApiKey'}, {u'name': u'username', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Unique username'}, {u'name': u'firstname', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'first name'}, {u'name': u'lastname', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'last name'}, {u'name': u'password', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Hashed password (default is MD5). If you wish to use any other hasing algorithm, you would need to write a custom authentication adapter'}, {u'name': u'userapikey', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The API key for the user. Must be specified with userSecretKey'}], u'requiredparams': [u'id'], u'description': u'Updates a user account'}, u'vpc': {u'name': u'updateVPC', u'related': [u'restartVPC', u'listVPCs'], u'isasync': True, u'params': [{u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the VPC'}, {u'name': u'id', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs'], u'length': 255, u'type': u'uuid', u'description': u'the id of the VPC'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the VPC'}], u'requiredparams': [], u'description': u'Updates a VPC'}, u'resourcecount': {u'name': u'updateResourceCount', u'related': [], u'isasync': False, u'params': [{u'name': u'resourcetype', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Type of resource to update. If specifies valid values are 0, 1, 2, 3, and 4. If not specified will update all resource counts0 - Instance. Number of instances a user can create. 1 - IP. Number of public IP addresses a user can own. 2 - Volume. Number of disk volumes a user can create.3 - Snapshot. Number of snapshots a user can create.4 - Template. Number of templates that a user can register/create.'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Update resource limits for project'}, {u'name': u'domainid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'If account parameter specified then updates resource counts for a specified account in this domain else update resource counts for all accounts & child domains in specified domain.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Update resource count for a specified account. Must be used with the domainId parameter.'}], u'requiredparams': [u'domainid'], u'description': u'Recalculate and update resource count for an account or domain.'}, u'storagenetworkiprange': {u'name': u'updateStorageNetworkIpRange', u'related': [], u'isasync': True, u'params': [{u'name': u'endip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ending IP address'}, {u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Optional. the vlan the ip range sits on'}, {u'name': u'netmask', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the netmask for storage network'}, {u'name': u'id', u'required': True, u'related': [u'updateStorageNetworkIpRange'], u'length': 255, u'type': u'uuid', u'description': u'UUID of storage network ip range'}, {u'name': u'startip', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the beginning IP address'}], u'requiredparams': [u'id'], u'description': u'Update a Storage network IP range, only allowed when no IPs in this range have been allocated.'}, u'configuration': {u'name': u'updateConfiguration', u'related': [u'listConfigurations'], u'isasync': False, u'params': [{u'name': u'value', u'required': False, u'related': [], u'length': 4095, u'type': u'string', u'description': u'the value of the configuration'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the configuration'}], u'requiredparams': [u'name'], u'description': u'Updates a configuration.'}, u'templatepermissions': {u'name': u'updateTemplatePermissions', u'related': [], u'isasync': False, u'params': [{u'name': u'isfeatured', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true for featured template/iso, false otherwise'}, {u'name': u'isextractable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template/iso is extractable, false other wise. Can be set only by root admin'}, {u'name': u'projectids', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'a comma delimited list of projects. If specified, "op" parameter has to be passed in.'}, {u'name': u'op', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'permission operator (add, remove, reset)'}, {u'name': u'id', u'required': True, u'related': [u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the template ID'}, {u'name': u'ispublic', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true for public template/iso, false for private templates/isos'}, {u'name': u'accounts', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'a comma delimited list of accounts. If specified, "op" parameter has to be passed in.'}], u'requiredparams': [u'id'], u'description': u'Updates a template visibility permissions. A public template is visible to all accounts within the same domain. A private template is visible only to the owner of the template. A priviledged template is a private template with account permissions added. Only accounts specified under the template permissions are visible to them.'}, u'autoscalevmprofile': {u'name': u'updateAutoScaleVmProfile', u'related': [u'listAutoScaleVmProfiles'], u'isasync': True, u'params': [{u'name': u'destroyvmgraceperiod', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the time allowed for existing connections to get closed before a vm is destroyed'}, {u'name': u'autoscaleuserid', u'required': False, u'related': [u'lockUser', u'listUsers', u'enableUser', u'createUser'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the user used to launch and destroy the VMs'}, {u'name': u'templateid', u'required': False, u'related': [u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the template of the auto deployed virtual machine'}, {u'name': u'id', u'required': True, u'related': [u'updateAutoScaleVmProfile', u'listAutoScaleVmProfiles'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale vm profile'}, {u'name': u'counterparam', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'counterparam list. Example: counterparam[0].name=snmpcommunity&counterparam[0].value=public&counterparam[1].name=snmpport&counterparam[1].value=161'}], u'requiredparams': [u'id'], u'description': u'Updates an existing autoscale vm profile.'}, u'account': {u'name': u'updateAccount', u'related': [u'markDefaultZoneForAccount', u'listAccounts', u'lockAccount'], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount'], u'length': 255, u'type': u'uuid', u'description': u'Account id'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the domain where the account exists'}, {u'name': u'networkdomain', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u"Network domain for the account's networks; empty string will update domainName with NULL value"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the current account name'}, {u'name': u'accountdetails', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'details for account used to store specific parameters'}, {u'name': u'newname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'new name for the account'}], u'requiredparams': [u'newname'], u'description': u'Updates account information for the authenticated user'}, u'networkoffering': {u'name': u'updateNetworkOffering', u'related': [], u'isasync': False, u'params': [{u'name': u'sortkey', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'sort key of the network offering, integer'}, {u'name': u'id', u'required': False, u'related': [u'updateNetworkOffering'], u'length': 255, u'type': u'uuid', u'description': u'the id of the network offering'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the display text of the network offering'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the network offering'}, {u'name': u'availability', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the availability of network offering. Default value is Required for Guest Virtual network offering; Optional for Guest Direct network offering'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'update state for the network offering'}], u'requiredparams': [], u'description': u'Updates a network offering.'}, u'vpncustomergateway': {u'name': u'updateVpnCustomerGateway', u'related': [u'createVpnCustomerGateway'], u'isasync': True, u'params': [{u'name': u'ikelifetime', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'Lifetime of phase 1 VPN connection to the customer gateway, in seconds'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the domain ID associated with the gateway. If used with the account parameter returns the gateway associated with the account for the specified domain.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of this customer gateway'}, {u'name': u'id', u'required': True, u'related': [u'updateVpnCustomerGateway', u'createVpnCustomerGateway'], u'length': 255, u'type': u'uuid', u'description': u'id of customer gateway'}, {u'name': u'esplifetime', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'Lifetime of phase 2 VPN connection to the customer gateway, in seconds'}, {u'name': u'ikepolicy', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'IKE policy of the customer gateway'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account associated with the gateway. Must be used with the domainId parameter.'}, {u'name': u'esppolicy', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'ESP policy of the customer gateway'}, {u'name': u'gateway', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'public ip address id of the customer gateway'}, {u'name': u'ipsecpsk', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'IPsec Preshared-Key of the customer gateway'}, {u'name': u'dpd', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'If DPD is enabled for VPN connection'}, {u'name': u'cidrlist', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'guest cidr of the customer gateway'}], u'requiredparams': [u'id', u'ikepolicy', u'esppolicy', u'gateway', u'ipsecpsk', u'cidrlist'], u'description': u'Update site to site vpn customer gateway'}, u'region': {u'name': u'updateRegion', u'related': [u'addRegion', u'listRegions'], u'isasync': False, u'params': [{u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'updates region with this name'}, {u'name': u'endpoint', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'updates region with this end point'}, {u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Id of region to update'}], u'requiredparams': [u'id'], u'description': u'Updates a region'}, u'project': {u'name': u'updateProject', u'related': [u'createProject', u'listProjectAccounts', u'activateProject'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'id of the project to be modified'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'display text of the project'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'new Admin account for the project'}], u'requiredparams': [u'id'], u'description': u'Updates a project'}, u'physicalnetwork': {u'name': u'updatePhysicalNetwork', u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'isasync': True, u'params': [{u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the VLAN for the physical network'}, {u'name': u'id', u'required': True, u'related': [u'listPhysicalNetworks', u'updatePhysicalNetwork', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'physical network id'}, {u'name': u'networkspeed', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the speed for the physical network[1G/10G]'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'Tag the physical network'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Enabled/Disabled'}], u'requiredparams': [u'id'], u'description': u'Updates a physical network'}, u'iso': {u'name': u'updateIso', u'related': [u'listIsos'], u'isasync': False, u'params': [{u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the image file'}, {u'name': u'id', u'required': True, u'related': [u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the image file'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the display text of the image'}, {u'name': u'format', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the format for the image'}, {u'name': u'sortkey', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'sort key of the template, integer'}, {u'name': u'ostypeid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the OS type that best represents the OS of this image.'}, {u'name': u'passwordenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the image supports the password reset feature; default is false'}, {u'name': u'bootable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if image is bootable, false otherwise'}], u'requiredparams': [u'id'], u'description': u'Updates an ISO file.'}, u'networkserviceprovider': {u'name': u'updateNetworkServiceProvider', u'related': [], u'isasync': True, u'params': [{u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Enabled/Disabled/Shutdown the physical network service provider'}, {u'name': u'id', u'required': True, u'related': [u'updateNetworkServiceProvider'], u'length': 255, u'type': u'uuid', u'description': u'network service provider id'}, {u'name': u'servicelist', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'the list of services to be enabled for this physical network service provider'}], u'requiredparams': [u'id'], u'description': u'Updates a network serviceProvider of a physical network'}, u'autoscalevmgroup': {u'name': u'updateAutoScaleVmGroup', u'related': [], u'isasync': True, u'params': [{u'name': u'scaledownpolicyids', u'required': False, u'related': [u'updateAutoScalePolicy'], u'length': 255, u'type': u'list', u'description': u'list of scaledown autoscale policies'}, {u'name': u'interval', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the frequency at which the conditions have to be evaluated'}, {u'name': u'minmembers', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the minimum number of members in the vmgroup, the number of instances in the vm group will be equal to or more than this number.'}, {u'name': u'maxmembers', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the maximum number of members in the vmgroup, The number of instances in the vm group will be equal to or less than this number.'}, {u'name': u'id', u'required': True, u'related': [u'updateAutoScaleVmGroup'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale group'}, {u'name': u'scaleuppolicyids', u'required': False, u'related': [u'updateAutoScalePolicy'], u'length': 255, u'type': u'list', u'description': u'list of scaleup autoscale policies'}], u'requiredparams': [u'id'], u'description': u'Updates an existing autoscale vm group.'}}, u'disable': {u'account': {u'name': u'disableAccount', u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount'], u'isasync': True, u'params': [{u'name': u'lock', u'required': True, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'If true, only lock the account; else disable the account'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Disables specified account.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'Disables specified account in this domain.'}, {u'name': u'id', u'required': False, u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount', u'disableAccount'], u'length': 255, u'type': u'uuid', u'description': u'Account id'}], u'requiredparams': [u'lock'], u'description': u'Disables an account'}, u'autoscalevmgroup': {u'name': u'disableAutoScaleVmGroup', u'related': [u'listAutoScaleVmGroups', u'createAutoScaleVmGroup', u'enableAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listAutoScaleVmGroups', u'createAutoScaleVmGroup', u'disableAutoScaleVmGroup', u'enableAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale group'}], u'requiredparams': [u'id'], u'description': u'Disables an AutoScale Vm Group'}, u'cisconexusvsm': {u'name': u'disableCiscoNexusVSM', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'disableCiscoNexusVSM'], u'length': 255, u'type': u'uuid', u'description': u'Id of the Cisco Nexus 1000v VSM device to be deleted'}], u'requiredparams': [u'id'], u'description': u'disable a Cisco Nexus VSM device'}, u'staticnat': {u'name': u'disableStaticNat', u'related': [], u'isasync': True, u'params': [{u'name': u'ipaddressid', u'required': True, u'related': [u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'the public IP address id for which static nat feature is being disableed'}], u'requiredparams': [u'ipaddressid'], u'description': u'Disables static rule for given ip address'}, u'user': {u'name': u'disableUser', u'related': [u'lockUser', u'listUsers', u'enableUser', u'createUser'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'disableUser', u'lockUser', u'listUsers', u'enableUser', u'createUser'], u'length': 255, u'type': u'uuid', u'description': u'Disables user by user ID.'}], u'requiredparams': [u'id'], u'description': u'Disables a user account'}}, u'detach': {u'volume': {u'name': u'detachVolume', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': False, u'related': [u'detachVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume'}, {u'name': u'deviceid', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'the device ID on the virtual machine where volume is detached from'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'listVirtualMachines'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine where the volume is detached from'}], u'requiredparams': [], u'description': u'Detaches a disk volume from a virtual machine.'}, u'iso': {u'name': u'detachIso', u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'virtualmachineid', u'required': True, u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}], u'requiredparams': [u'virtualmachineid'], u'description': u'Detaches any ISO file (if any) currently attached to a virtual machine.'}}, u'generate': {u'usagerecords': {u'name': u'generateUsageRecords', u'related': [], u'isasync': False, u'params': [{u'name': u'enddate', u'required': True, u'related': [], u'length': 255, u'type': u'date', u'description': u'End date range for usage record query. Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'List events for the specified domain.'}, {u'name': u'startdate', u'required': True, u'related': [], u'length': 255, u'type': u'date', u'description': u'Start date range for usage record query. Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.'}], u'requiredparams': [u'enddate', u'startdate'], u'description': u'Generates usage records. This will generate records only if there any records to be generated, i.e if the scheduled usage job was not run or failed'}}, u'change': {u'serviceforvirtualmachine': {u'name': u'changeServiceForVirtualMachine', u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}, {u'name': u'serviceofferingid', u'required': True, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings'], u'length': 255, u'type': u'uuid', u'description': u'the service offering ID to apply to the virtual machine'}], u'requiredparams': [u'id', u'serviceofferingid'], u'description': u'Changes the service offering for a virtual machine. The virtual machine must be in a "Stopped" state for this command to take effect.'}, u'serviceforsystemvm': {u'name': u'changeServiceForSystemVm', u'related': [u'rebootSystemVm', u'listSystemVms'], u'isasync': False, u'params': [{u'name': u'serviceofferingid', u'required': True, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings', u'createServiceOffering'], u'length': 255, u'type': u'uuid', u'description': u'the service offering ID to apply to the system vm'}, {u'name': u'id', u'required': True, u'related': [u'rebootSystemVm', u'listSystemVms', u'changeServiceForSystemVm'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the system vm'}], u'requiredparams': [u'serviceofferingid', u'id'], u'description': u'Changes the service offering for a system vm (console proxy or secondary storage). The system vm must be in a "Stopped" state for this command to take effect.'}, u'serviceforrouter': {u'name': u'changeServiceForRouter', u'related': [u'destroyRouter', u'rebootRouter', u'startRouter'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'changeServiceForRouter', u'destroyRouter', u'rebootRouter', u'startRouter'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the router'}, {u'name': u'serviceofferingid', u'required': True, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings', u'createServiceOffering', u'updateServiceOffering'], u'length': 255, u'type': u'uuid', u'description': u'the service offering ID to apply to the domain router'}], u'requiredparams': [u'id', u'serviceofferingid'], u'description': u'Upgrades domain router to a new service offering'}}, u'reset': {u'apilimit': {u'name': u'resetApiLimit', u'related': [], u'isasync': False, u'params': [{u'name': u'account', u'required': False, u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the acount whose limit to be reset'}], u'requiredparams': [], u'description': u'Reset api count'}, u'sshkeyforvirtualmachine': {u'name': u'resetSSHKeyForVirtualMachine', u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'an optional project for the ssh key'}, {u'name': u'keypair', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the ssh key pair used to login to the virtual machine'}, {u'name': u'id', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the ssh key. Must be used with domainId.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the virtual machine. If the account parameter is used, domainId must also be used.'}], u'requiredparams': [u'keypair', u'id'], u'description': u'Resets the SSH Key for virtual machine. The virtual machine must be in a "Stopped" state. [async]'}, u'passwordforvirtualmachine': {u'name': u'resetPasswordForVirtualMachine', u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the virtual machine'}], u'requiredparams': [u'id'], u'description': u'Resets the password for virtual machine. The virtual machine must be in a "Stopped" state and the template must already support this feature for this command to take effect. [async]'}, u'vpnconnection': {u'name': u'resetVpnConnection', u'related': [u'listVpnConnections'], u'isasync': True, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for connection. Must be used with domainId.'}, {u'name': u'id', u'required': True, u'related': [u'listVpnConnections', u'resetVpnConnection'], u'length': 255, u'type': u'uuid', u'description': u'id of vpn connection'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for connection. If the account parameter is used, domainId must also be used.'}], u'requiredparams': [u'id'], u'description': u'Reset site to site vpn connection'}}, u'register': {u'userkeys': {u'name': u'registerUserKeys', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'lockUser', u'listUsers', u'enableUser', u'createUser'], u'length': 255, u'type': u'uuid', u'description': u'User id'}], u'requiredparams': [u'id'], u'description': u'This command allows a user to register for the developer API, returning a secret key and an API key. This request is made through the integration API port, so it is a privileged command and must be made on behalf of a user. It is up to the implementer just how the username and password are entered, and then how that translates to an integration API request. Both secret key and API key should be returned to the user'}, u'iso': {u'name': u'registerIso', u'related': [u'copyIso', u'updateIso', u'listIsos'], u'isasync': False, u'params': [{u'name': u'ostypeid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the OS Type that best represents the OS of this ISO. If the iso is bootable this parameter needs to be passed'}, {u'name': u'checksum', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the MD5 checksum value of this ISO'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the ISO'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId. If the account parameter is used, domainId must also be used.'}, {u'name': u'bootable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if this ISO is bootable. If not passed explicitly its assumed to be true'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts'], u'length': 255, u'type': u'uuid', u'description': u'Register iso for the project'}, {u'name': u'ispublic', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if you want to register the ISO to be publicly available to all users, false otherwise.'}, {u'name': u'zoneid', u'required': True, u'related': [u'listZones'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone you wish to register the ISO to.'}, {u'name': u'isextractable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the iso or its derivatives are extractable; default is false'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the display text of the ISO. This is usually used for display purposes.'}, {u'name': u'isfeatured', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if you want this ISO to be featured'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the URL to where the ISO is currently being hosted'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account name. Must be used with domainId.'}], u'requiredparams': [u'name', u'zoneid', u'displaytext', u'url'], u'description': u'Registers an existing ISO into the CloudStack Cloud.'}, u'sshkeypair': {u'name': u'registerSSHKeyPair', u'related': [u'createSSHKeyPair', u'listSSHKeyPairs'], u'isasync': False, u'params': [{u'name': u'publickey', u'required': True, u'related': [], u'length': 5120, u'type': u'string', u'description': u'Public key material of the keypair'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the ssh key. If the account parameter is used, domainId must also be used.'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Name of the keypair'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'an optional project for the ssh key'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the ssh key. Must be used with domainId.'}], u'requiredparams': [u'publickey', u'name'], u'description': u'Register a public key in a keypair under a certain name'}, u'template': {u'name': u'registerTemplate', u'related': [u'listTemplates', u'registerIso', u'updateTemplate', u'prepareTemplate', u'copyIso', u'updateIso', u'listIsos'], u'isasync': False, u'params': [{u'name': u'isextractable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template or its derivatives are extractable; default is false'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone the template is to be hosted on'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId. If the account parameter is used, domainId must also be used.'}, {u'name': u'checksum', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the MD5 checksum value of this template'}, {u'name': u'templatetag', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the tag for this template.'}, {u'name': u'ispublic', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template is available to all accounts; default is true'}, {u'name': u'passwordenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template supports the password reset feature; default is false'}, {u'name': u'displaytext', u'required': True, u'related': [], u'length': 4096, u'type': u'string', u'description': u'the display text of the template. This is usually used for display purposes.'}, {u'name': u'sshkeyenabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the template supports the sshkey upload feature; default is false'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'Register template for the project'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the template'}, {u'name': u'isfeatured', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if this template is a featured template, false otherwise'}, {u'name': u'format', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the format for the template. Possible values include QCOW2, RAW, and VHD.'}, {u'name': u'requireshvm', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if this template requires HVM'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional accountName. Must be used with domainId.'}, {u'name': u'ostypeid', u'required': True, u'related': [u'listOsTypes'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the OS Type that best represents the OS of this template.'}, {u'name': u'hypervisor', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the target hypervisor for the template'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the URL of where the template is hosted. Possible URL include http:// and https://'}, {u'name': u'bits', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'32 or 64 bits support. 64 by default'}, {u'name': u'details', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'Template details in key/value pairs.'}], u'requiredparams': [u'zoneid', u'displaytext', u'name', u'format', u'ostypeid', u'hypervisor', u'url'], u'description': u'Registers an existing template into the CloudStack cloud. '}}, u'list': {u'instancegroups': {u'name': u'listInstanceGroups', u'related': [u'updateInstanceGroup', u'createInstanceGroup'], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [u'listInstanceGroups', u'updateInstanceGroup', u'createInstanceGroup'], u'length': 255, u'type': u'uuid', u'description': u'list instance groups by ID'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list instance groups by name'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}], u'requiredparams': [], u'description': u'Lists vm groups'}, u'physicalnetworks': {u'name': u'listPhysicalNetworks', u'related': [], u'isasync': False, u'params': [{u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the physical network'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [u'listPhysicalNetworks'], u'length': 255, u'type': u'uuid', u'description': u'list physical network by id'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'search by name'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists physical networks'}, u'networks': {u'name': u'listNetworks', u'related': [u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks'], u'isasync': False, u'params': [{u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'issystem', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if network is system, false otherwise'}, {u'name': u'vpcid', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs', u'createVPC'], u'length': 255, u'type': u'uuid', u'description': u'List networks by VPC'}, {u'name': u'acltype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list networks by ACL (access control list) type. Supported values are Account and Domain'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'specifyipranges', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if need to list only networks which support specifying ip ranges'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID of the network'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'restartrequired', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list networks by restartRequired'}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the type of the network. Supported values are: Isolated and Shared'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'list networks by physical network id'}, {u'name': u'supportedservices', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list networks supporting certain services'}, {u'name': u'traffictype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'type of the traffic'}, {u'name': u'id', u'required': False, u'related': [u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'length': 255, u'type': u'uuid', u'description': u'list networks by id'}, {u'name': u'canusefordeploy', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list networks available for vm deployment'}, {u'name': u'forvpc', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'the network belongs to vpc'}], u'requiredparams': [], u'description': u'Lists all available networks.'}, u'capabilities': {u'name': u'listCapabilities', u'related': [], u'isasync': False, u'params': [], u'requiredparams': [], u'description': u'Lists capabilities'}, u'clusters': {u'name': u'listClusters', u'related': [u'updateCluster'], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'listClusters', u'updateCluster'], u'length': 255, u'type': u'uuid', u'description': u'lists clusters by the cluster ID'}, {u'name': u'managedstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'whether this cluster is managed by cloudstack'}, {u'name': u'hypervisor', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists clusters by hypervisor type'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists clusters by allocation state'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'lists clusters by Zone ID'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists clusters by the cluster name'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'clustertype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists clusters by cluster type'}, {u'name': u'showcapacities', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'flag to display the capacity of the clusters'}, {u'name': u'podid', u'required': False, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'lists clusters by Pod ID'}], u'requiredparams': [], u'description': u'Lists clusters.'}, u'resourcelimits': {u'name': u'listResourceLimits', u'related': [u'updateResourceLimit'], u'isasync': False, u'params': [{u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'resourcetype', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'Type of resource to update. Values are 0, 1, 2, 3, and 4. 0 - Instance. Number of instances a user can create. 1 - IP. Number of public IP addresses a user can own. 2 - Volume. Number of disk volumes a user can create.3 - Snapshot. Number of snapshots a user can create.4 - Template. Number of templates that a user can register/create.'}, {u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'Lists resource limits by ID.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}], u'requiredparams': [], u'description': u'Lists resource limits.'}, u'firewallrules': {u'name': u'listFirewallRules', u'related': [u'createEgressFirewallRule', u'createFirewallRule', u'listEgressFirewallRules'], u'isasync': False, u'params': [{u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'id', u'required': False, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'Lists rule with the specified ID.'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'ipaddressid', u'required': False, u'related': [u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'the id of IP address of the firwall services'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}], u'requiredparams': [], u'description': u'Lists all firewall rules for an IP address.'}, u'supportednetworkservices': {u'name': u'listSupportedNetworkServices', u'related': [], u'isasync': False, u'params': [{u'name': u'service', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'network service name to list providers and capabilities of'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'provider', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'network service provider name'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists all network services provided by CloudStack or for the given Provider.'}, u'loadbalancerrules': {u'name': u'listLoadBalancerRules', u'related': [u'createLoadBalancerRule', u'updateLoadBalancerRule'], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the availability zone ID'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine of the load balancer rule'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'id', u'required': False, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the load balancer rule'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'publicipid', u'required': False, u'related': [u'restartNetwork', u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'the public IP address id of the load balancer rule '}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the load balancer rule'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}], u'requiredparams': [], u'description': u'Lists load balancer rules.'}, u'autoscalepolicies': {u'name': u'listAutoScalePolicies', u'related': [u'createAutoScalePolicy', u'updateAutoScalePolicy'], u'isasync': False, u'params': [{u'name': u'action', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the action to be executed if all the conditions evaluate to true for the specified duration.'}, {u'name': u'id', u'required': False, u'related': [u'createAutoScalePolicy', u'updateAutoScalePolicy', u'listAutoScalePolicies'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale policy'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'vmgroupid', u'required': False, u'related': [u'createAutoScaleVmGroup', u'enableAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale vm group'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'conditionid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the condition of the policy'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists autoscale policies.'}, u'niciranvpdevices': {u'name': u'listNiciraNvpDevices', u'related': [u'addNiciraNvpDevice'], u'isasync': False, u'params': [{u'name': u'nvpdeviceid', u'required': False, u'related': [u'addNiciraNvpDevice', u'listNiciraNvpDevices'], u'length': 255, u'type': u'uuid', u'description': u'nicira nvp device ID'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists Nicira NVP devices'}, u'f5loadbalancernetworks': {u'name': u'listF5LoadBalancerNetworks', u'related': [u'createNetwork', u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'lbdeviceid', u'required': True, u'related': [u'configureF5LoadBalancer', u'addF5LoadBalancer', u'listF5LoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'f5 load balancer device ID'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [u'lbdeviceid'], u'description': u'lists network that are using a F5 load balancer device'}, u'templatepermissions': {u'name': u'listTemplatePermissions', u'related': [u'listIsoPermissions'], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'listIsoPermissions', u'listTemplatePermissions'], u'length': 255, u'type': u'uuid', u'description': u'the template ID'}], u'requiredparams': [u'id'], u'description': u'List template visibility and all accounts that have permissions to view this template.'}, u'projects': {u'name': u'listProjects', u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List projects by tags (key/value pairs)'}, {u'name': u'id', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list projects by project ID'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list projects by name'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list projects by state'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list projects by display text'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}], u'requiredparams': [], u'description': u'Lists projects and provides detailed information for listed projects'}, u'systemvms': {u'name': u'listSystemVms', u'related': [u'rebootSystemVm'], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID of the system VM'}, {u'name': u'hostid', u'required': False, u'related': [u'addHost', u'updateHost', u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'the host ID of the system VM'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the state of the system VM'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'storageid', u'required': False, u'related': [u'cancelStorageMaintenance'], u'length': 255, u'type': u'uuid', u'description': u"the storage ID where vm's volumes belong to"}, {u'name': u'systemvmtype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the system VM type. Possible types are "consoleproxy" and "secondarystoragevm".'}, {u'name': u'podid', u'required': False, u'related': [u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID of the system VM'}, {u'name': u'id', u'required': False, u'related': [u'rebootSystemVm', u'listSystemVms'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the system VM'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the system VM'}], u'requiredparams': [], u'description': u'List system virtual machines.'}, u'portforwardingrules': {u'name': u'listPortForwardingRules', u'related': [u'listIpForwardingRules', u'createPortForwardingRule'], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'id', u'required': False, u'related': [u'listIpForwardingRules', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'Lists rule with the specified ID.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'ipaddressid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the id of IP address of the port forwarding services'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}], u'requiredparams': [], u'description': u'Lists all port forwarding rules for an IP address.'}, u'hypervisors': {u'name': u'listHypervisors', u'related': [], u'isasync': False, u'params': [{u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the zone id for listing hypervisors.'}], u'requiredparams': [], u'description': u'List hypervisors'}, u'publicipaddresses': {u'name': u'listPublicIpAddresses', u'related': [u'restartNetwork', u'associateIpAddress'], u'isasync': False, u'params': [{u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'lists all public IP addresses by Zone ID'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'allocatedonly', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'limits search results to allocated public IP addresses'}, {u'name': u'id', u'required': False, u'related': [u'restartNetwork', u'listPublicIpAddresses', u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'lists ip address by id'}, {u'name': u'forloadbalancing', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list only ips used for load balancing'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'isstaticnat', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list only static nat ip addresses'}, {u'name': u'issourcenat', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list only source nat ip addresses'}, {u'name': u'vlanid', u'required': False, u'related': [u'listVlanIpRanges'], u'length': 255, u'type': u'uuid', u'description': u'lists all public IP addresses by VLAN ID'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'ipaddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists the specified IP address'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'lists all public IP addresses by physical network id'}, {u'name': u'associatednetworkid', u'required': False, u'related': [u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'length': 255, u'type': u'uuid', u'description': u'lists all public IP addresses associated to the network specified'}, {u'name': u'forvirtualnetwork', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'the virtual network for the IP address'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'vpcid', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs', u'createVPC'], u'length': 255, u'type': u'uuid', u'description': u'List ips belonging to the VPC'}], u'requiredparams': [], u'description': u'Lists all public ip addresses'}, u'vpngateways': {u'name': u'listVpnGateways', u'related': [u'createVpnGateway'], u'isasync': False, u'params': [{u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'id', u'required': False, u'related': [u'createVpnGateway', u'listVpnGateways'], u'length': 255, u'type': u'uuid', u'description': u'id of the vpn gateway'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'vpcid', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs', u'createVPC'], u'length': 255, u'type': u'uuid', u'description': u'id of vpc'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}], u'requiredparams': [], u'description': u'Lists site 2 site vpn gateways'}, u'loadbalancerruleinstances': {u'name': u'listLoadBalancerRuleInstances', u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'applied', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if listing all virtual machines currently applied to the load balancer rule; default is true'}, {u'name': u'id', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the load balancer rule'}], u'requiredparams': [u'id'], u'description': u'List all virtual machine instances that are assigned to a load balancer rule.'}, u'hosts': {u'name': u'listHosts', u'related': [], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'podid', u'required': False, u'related': [u'updatePod'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID for the host'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the state of the host'}, {u'name': u'resourcestate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list hosts by resource state. Resource state represents current state determined by admin of host, valule can be one of [Enabled, Disabled, Unmanaged, PrepareForMaintenance, ErrorInMaintenance, Maintenance, Error]'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the host'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the host'}, {u'name': u'virtualmachineid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'lists hosts in the same cluster as this VM and flag hosts with enough CPU/RAm to host this VM'}, {u'name': u'clusterid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'lists hosts existing in particular cluster'}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the host type'}, {u'name': u'id', u'required': False, u'related': [u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'the id of the host'}, {u'name': u'details', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'comma separated list of host details requested, value can be a list of [ min, all, capacity, events, stats]'}, {u'name': u'hahost', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true, list only hosts dedicated to HA'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists hosts.'}, u'pools': {u'name': u'listPools', u'related': [], u'isasync': False, u'params': [], u'requiredparams': [], u'description': u'List Pool'}, u'counters': {u'name': u'listCounters', u'related': [], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'source', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Source of the counter.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'id', u'required': False, u'related': [u'listCounters'], u'length': 255, u'type': u'uuid', u'description': u'ID of the Counter.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Name of the counter.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'List the counters'}, u'configurations': {u'name': u'listConfigurations', u'related': [], u'isasync': False, u'params': [{u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists configuration by name'}, {u'name': u'category', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists configurations by category'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists all configurations.'}, u'usagerecords': {u'name': u'listUsageRecords', u'related': [], u'isasync': False, u'params': [{u'name': u'enddate', u'required': True, u'related': [], u'length': 255, u'type': u'date', u'description': u'End date range for usage record query. Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-03.'}, {u'name': u'startdate', u'required': True, u'related': [], u'length': 255, u'type': u'date', u'description': u'Start date range for usage record query. Use yyyy-MM-dd as the date format, e.g. startDate=2009-06-01.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'List usage records for the specified usage type'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject'], u'length': 255, u'type': u'uuid', u'description': u'List usage records for specified project'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List usage records for the specified user.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'List usage records for the specified domain.'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'accountid', u'required': False, u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount'], u'length': 255, u'type': u'uuid', u'description': u'List usage records for the specified account'}], u'requiredparams': [u'enddate', u'startdate'], u'description': u'Lists usage records for accounts'}, u'storagepools': {u'name': u'listStoragePools', u'related': [u'cancelStorageMaintenance'], u'isasync': False, u'params': [{u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID for the storage pool'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'path', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the storage pool path'}, {u'name': u'clusterid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list storage pools belongig to the specific cluster'}, {u'name': u'id', u'required': False, u'related': [u'cancelStorageMaintenance', u'listStoragePools'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the storage pool'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'ipaddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the IP address for the storage pool'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the storage pool'}, {u'name': u'podid', u'required': False, u'related': [u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID for the storage pool'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists storage pools.'}, u'vpncustomergateways': {u'name': u'listVpnCustomerGateways', u'related': [u'updateVpnCustomerGateway', u'createVpnCustomerGateway'], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'updateVpnCustomerGateway', u'createVpnCustomerGateway', u'listVpnCustomerGateways'], u'length': 255, u'type': u'uuid', u'description': u'id of the customer gateway'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}], u'requiredparams': [], u'description': u'Lists site to site vpn customer gateways'}, u'zones': {u'name': u'listZones', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'listZones'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone'}, {u'name': u'available', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if you want to retrieve all available Zones. False if you only want to return the Zones from which you have at least one VM. Default is false.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the zone'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the domain associated with the zone'}, {u'name': u'showcapacities', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'flag to display the capacity of the zones'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists zones'}, u'serviceofferings': {u'name': u'listServiceOfferings', u'related': [u'updateHypervisorCapabilities'], u'isasync': False, u'params': [{u'name': u'systemvmtype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the system VM type. Possible types are "consoleproxy", "secondarystoragevm" or "domainrouter".'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the domain associated with the service offering'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the service offering'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'stopVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine. Pass this in if you want to see the available service offering that a virtual machine can be changed to.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'issystem', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'is this a system vm offering'}, {u'name': u'id', u'required': False, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings'], u'length': 255, u'type': u'uuid', u'description': u'ID of the service offering'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists all available service offerings.'}, u'externalfirewalls': {u'name': u'listExternalFirewalls', u'related': [u'addExternalFirewall'], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'zoneid', u'required': True, u'related': [u'listZones'], u'length': 255, u'type': u'uuid', u'description': u'zone Id'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [u'zoneid'], u'description': u'List external firewall appliances.'}, u'networkserviceproviders': {u'name': u'listNetworkServiceProviders', u'related': [u'addNetworkServiceProvider', u'listTrafficTypes', u'updateNetworkServiceProvider'], u'isasync': False, u'params': [{u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list providers by state'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list providers by name'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'updatePhysicalNetwork', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists network serviceproviders for a given physical network.'}, u'capacity': {u'name': u'listCapacity', u'related': [], u'isasync': False, u'params': [{u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'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.'}, {u'name': u'clusterid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'lists capacity by the Cluster ID'}, {u'name': u'sortby', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Sort the results. Available values: Usage'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'fetchlatest', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'recalculate capacities and fetch the latest'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'lists capacity by the Zone ID'}, {u'name': u'podid', u'required': False, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'lists capacity by the Pod ID'}], u'requiredparams': [], u'description': u'Lists all the system wide capacities.'}, u'diskofferings': {u'name': u'listDiskOfferings', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'listDiskOfferings'], u'length': 255, u'type': u'uuid', u'description': u'ID of the disk offering'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the disk offering'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the domain of the disk offering.'}], u'requiredparams': [], u'description': u'Lists all available disk offerings.'}, u'lbstickinesspolicies': {u'name': u'listLBStickinessPolicies', u'related': [u'createLBStickinessPolicy'], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'lbruleid', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the load balancer rule'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [u'lbruleid'], u'description': u'Lists LBStickiness policies.'}, u'srxfirewallnetworks': {u'name': u'listSrxFirewallNetworks', u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'isasync': False, u'params': [{u'name': u'lbdeviceid', u'required': True, u'related': [u'addSrxFirewall'], u'length': 255, u'type': u'uuid', u'description': u'netscaler load balancer device ID'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [u'lbdeviceid'], u'description': u'lists network that are using SRX firewall device'}, u'securitygroups': {u'name': u'listSecurityGroups', u'related': [], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'id', u'required': False, u'related': [u'listSecurityGroups'], u'length': 255, u'type': u'uuid', u'description': u'list the security group by the id provided'}, {u'name': u'securitygroupname', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists security groups by name'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'lists security groups by virtual machine id'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists security groups'}, u'conditions': {u'name': u'listConditions', u'related': [u'listCounters', u'createCounter'], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'ID of the Condition.'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'counterid', u'required': False, u'related': [u'listConditions', u'listCounters', u'createCounter'], u'length': 255, u'type': u'uuid', u'description': u'Counter-id of the condition.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'policyid', u'required': False, u'related': [u'createAutoScalePolicy', u'updateAutoScalePolicy'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the policy'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}], u'requiredparams': [], u'description': u'List Conditions for the specific user'}, u'swifts': {u'name': u'listSwifts', u'related': [u'addHost', u'updateHost', u'listHosts', u'listExternalLoadBalancers'], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'the id of the swift'}], u'requiredparams': [], u'description': u'List Swift.'}, u'hypervisorcapabilities': {u'name': u'listHypervisorCapabilities', u'related': [], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [u'listHypervisorCapabilities'], u'length': 255, u'type': u'uuid', u'description': u'ID of the hypervisor capability'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'hypervisor', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the hypervisor for which to restrict the search'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists all hypervisor capabilities.'}, u'tags': {u'name': u'listTags', u'related': [], u'isasync': False, u'params': [{u'name': u'resourceid', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by resource id'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'resourcetype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by resource type'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'key', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by key'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'customer', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by customer name'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'value', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by value'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'List resource tag(s)'}, u'routers': {u'name': u'listRouters', u'related': [u'changeServiceForRouter', u'stopRouter', u'destroyRouter', u'rebootRouter', u'startRouter'], u'isasync': False, u'params': [{u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the state of the router'}, {u'name': u'vpcid', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs', u'createVPC'], u'length': 255, u'type': u'uuid', u'description': u'List networks by VPC'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'podid', u'required': False, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID of the router'}, {u'name': u'hostid', u'required': False, u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addSecondaryStorage', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers', u'prepareHostForMaintenance'], u'length': 255, u'type': u'uuid', u'description': u'the host ID of the router'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the router'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID of the router'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'id', u'required': False, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'addNicToVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'listLoadBalancerRuleInstances', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk router'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'suspendProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'networkid', u'required': False, u'related': [u'createNetwork', u'listNiciraNvpDeviceNetworks', u'updateNetwork', u'listF5LoadBalancerNetworks', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'length': 255, u'type': u'uuid', u'description': u'list by network id'}, {u'name': u'forvpc', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true is passed for this parameter, list only VPC routers'}], u'requiredparams': [], u'description': u'List routers.'}, u'traffictypes': {u'name': u'listTrafficTypes', u'related': [u'addNetworkServiceProvider', u'updateNetworkServiceProvider'], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'physicalnetworkid', u'required': True, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [u'physicalnetworkid'], u'description': u'Lists traffic types of a given physical network.'}, u'projectinvitations': {u'name': u'listProjectInvitations', u'related': [], u'isasync': False, u'params': [{u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'activeonly', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'if true, list only active invitations - having Pending state and ones that are not timed out yet'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list by project id'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list invitations by state'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'id', u'required': False, u'related': [u'listProjectInvitations'], u'length': 255, u'type': u'uuid', u'description': u'list invitations by id'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}], u'requiredparams': [], u'description': u'Lists projects and provides detailed information for listed projects'}, u'isos': {u'name': u'listIsos', u'related': [], u'isasync': False, u'params': [{u'name': u'bootable', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the ISO is bootable, false otherwise'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list all isos by name'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'id', u'required': False, u'related': [u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'list ISO by id'}, {u'name': u'ispublic', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if the ISO is publicly available to all users, false otherwise.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isofilter', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'possible values are "featured", "self", "selfexecutable","sharedexecutable","executable", and "community". * featured : templates that have been marked as featured and public. * self : templates that have been registered or created by the calling user. * selfexecutable : same as self, but only returns templates that can be used to deploy a new VM. * sharedexecutable : templates ready to be deployed that have been granted to the calling user by another user. * executable : templates that are owned by the calling user, or public templates, that can be used to deploy a VM. * community : templates that have been marked as public but not featured. * all : all templates (only usable by admins).'}, {u'name': u'hypervisor', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the hypervisor for which to restrict the search'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'isready', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if this ISO is ready to be deployed'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists all available ISO files.'}, u'users': {u'name': u'listUsers', u'related': [], u'isasync': False, u'params': [{u'name': u'username', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List user by the username'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'accounttype', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'List users by account type. Valid types include admin, domain-admin, read-only-admin, or user.'}, {u'name': u'id', u'required': False, u'related': [u'listUsers'], u'length': 255, u'type': u'uuid', u'description': u'List user by ID.'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List users by state of the user account.'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists user accounts'}, u'sshkeypairs': {u'name': u'listSSHKeyPairs', u'related': [], u'isasync': False, u'params': [{u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'fingerprint', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'A public key fingerprint to look for'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'A key pair name to look for'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}], u'requiredparams': [], u'description': u'List registered keypairs'}, u'privategateways': {u'name': u'listPrivateGateways', u'related': [u'createPrivateGateway'], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'createPrivateGateway', u'listPrivateGateways'], u'length': 255, u'type': u'uuid', u'description': u'list private gateway by id'}, {u'name': u'ipaddress', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list gateways by ip address'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'vpcid', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs', u'createVPC'], u'length': 255, u'type': u'uuid', u'description': u'list gateways by vpc'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list gateways by state'}, {u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list gateways by vlan'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}], u'requiredparams': [], u'description': u'List private gateways'}, u'usagetypes': {u'name': u'listUsageTypes', u'related': [], u'isasync': False, u'params': [], u'requiredparams': [], u'description': u'List Usage Types'}, u'domainchildren': {u'name': u'listDomainChildren', u'related': [u'createDomain'], u'isasync': False, u'params': [{u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list children domains by name'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list children domain by parent domain ID.'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'to return the entire tree, use the value "true". To return the first level children, use the value "false".'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists all children domains belonging to a specified domain'}, u'domains': {u'name': u'listDomains', u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'List domain by domain ID.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List domain by domain name.'}, {u'name': u'level', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'List domains by domain level.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}], u'requiredparams': [], u'description': u'Lists domains and provides detailed information for listed domains'}, u'externalloadbalancers': {u'name': u'listExternalLoadBalancers', u'related': [u'addHost', u'updateHost', u'listHosts'], u'isasync': False, u'params': [{u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'zone Id'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists F5 external load balancer appliances added in a zone.'}, u'netscalerloadbalancers': {u'name': u'listNetscalerLoadBalancers', u'related': [], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'lbdeviceid', u'required': False, u'related': [u'listNetscalerLoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'netscaler load balancer device ID'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'lists netscaler load balancer devices'}, u's3s': {u'name': u'listS3s', u'related': [u'addS3'], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists S3s'}, u'bigswitchvnsdevices': {u'name': u'listBigSwitchVnsDevices', u'related': [u'addBigSwitchVnsDevice'], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'vnsdeviceid', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'bigswitch vns device ID'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}], u'requiredparams': [], u'description': u'Lists BigSwitch Vns devices'}, u'accounts': {u'name': u'listAccounts', u'related': [u'markDefaultZoneForAccount', u'lockAccount'], u'isasync': False, u'params': [{u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list accounts by state. Valid states are enabled, disabled, and locked.'}, {u'name': u'iscleanuprequired', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list accounts by cleanuprequred attribute (values are true or false)'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'accounttype', u'required': False, u'related': [], u'length': 255, u'type': u'long', u'description': u'list accounts by account type. Valid account types are 1 (admin), 2 (domain-admin), and 0 (user).'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'id', u'required': False, u'related': [u'markDefaultZoneForAccount', u'listAccounts', u'lockAccount'], u'length': 255, u'type': u'uuid', u'description': u'list account by account ID'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list account by account name'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}], u'requiredparams': [], u'description': u'Lists accounts and provides detailed account information for listed accounts'}, u'networkdevice': {u'name': u'listNetworkDevice', u'related': [u'addNetworkDevice'], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'networkdevicetype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Network device type, now supports ExternalDhcp, PxeServer, NetscalerMPXLoadBalancer, NetscalerVPXLoadBalancer, NetscalerSDXLoadBalancer, F5BigIpLoadBalancer, JuniperSRXFirewall'}, {u'name': u'networkdeviceparameterlist', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'parameters for network device'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'List network devices'}, u'vlanipranges': {u'name': u'listVlanIpRanges', u'related': [], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'networkid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'network id of the VLAN IP range'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the domain ID with which the VLAN IP range is associated. If used with the account parameter, returns all VLAN IP ranges for that account in the specified domain.'}, {u'name': u'id', u'required': False, u'related': [u'listVlanIpRanges'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the VLAN IP range'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks'], u'length': 255, u'type': u'uuid', u'description': u'physical network id of the VLAN IP range'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'project who will own the VLAN'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account with which the VLAN IP range is associated. Must be used with the domainId parameter.'}, {u'name': u'vlan', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the ID or VID of the VLAN. Default is an "untagged" VLAN.'}, {u'name': u'podid', u'required': False, u'related': [u'updatePod'], u'length': 255, u'type': u'uuid', u'description': u'the Pod ID of the VLAN IP range'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Zone ID of the VLAN IP range'}, {u'name': u'forvirtualnetwork', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if VLAN is of Virtual type, false if Direct'}], u'requiredparams': [], u'description': u'Lists all VLAN IP ranges.'}, u'traffictypeimplementors': {u'name': u'listTrafficTypeImplementors', u'related': [], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'traffictype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'Optional. The network traffic type, if specified, return its implementor. Otherwise, return all traffic types with their implementor'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists implementors of implementor of a network traffic type or implementors of all network traffic types'}, u'storagenetworkiprange': {u'name': u'listStorageNetworkIpRange', u'related': [u'updateStorageNetworkIpRange'], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'optional parameter. Zone uuid, if specicied and both pod uuid and range uuid are absent, using it to search the range.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'id', u'required': False, u'related': [u'listStorageNetworkIpRange', u'updateStorageNetworkIpRange'], u'length': 255, u'type': u'uuid', u'description': u'optional parameter. Storaget network IP range uuid, if specicied, using it to search the range.'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'podid', u'required': False, u'related': [u'updatePod'], u'length': 255, u'type': u'uuid', u'description': u'optional parameter. Pod uuid, if specicied and range uuid is absent, using it to search the range.'}], u'requiredparams': [], u'description': u'List a storage network IP range.'}, u'isopermissions': {u'name': u'listIsoPermissions', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'listIsoPermissions'], u'length': 255, u'type': u'uuid', u'description': u'the template ID'}], u'requiredparams': [u'id'], u'description': u'List iso visibility and all accounts that have permissions to view this iso.'}, u'snapshotpolicies': {u'name': u'listSnapshotPolicies', u'related': [], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'volumeid', u'required': True, u'related': [u'detachVolume', u'uploadVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [u'volumeid'], u'description': u'Lists snapshot policies.'}, u'autoscalevmgroups': {u'name': u'listAutoScaleVmGroups', u'related': [u'createAutoScaleVmGroup', u'enableAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'isasync': False, u'params': [{u'name': u'policyid', u'required': False, u'related': [u'createAutoScalePolicy', u'updateAutoScalePolicy', u'listAutoScalePolicies'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the policy'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'vmprofileid', u'required': False, u'related': [u'updateAutoScaleVmProfile', u'createAutoScaleVmProfile', u'listAutoScaleVmProfiles'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the profile'}, {u'name': u'lbruleid', u'required': False, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the loadbalancer'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the availability zone ID'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'id', u'required': False, u'related': [u'listAutoScaleVmGroups', u'createAutoScaleVmGroup', u'enableAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale vm group'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists autoscale vm groups.'}, u'projectaccounts': {u'name': u'listProjectAccounts', u'related': [u'createProject'], u'isasync': False, u'params': [{u'name': u'projectid', u'required': True, u'related': [u'createProject', u'listProjectAccounts'], u'length': 255, u'type': u'uuid', u'description': u'id of the project'}, {u'name': u'role', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list accounts of the project by role'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list accounts of the project by account name'}], u'requiredparams': [u'projectid'], u'description': u"Lists project's accounts"}, u'autoscalevmprofiles': {u'name': u'listAutoScaleVmProfiles', u'related': [], u'isasync': False, u'params': [{u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'domainid', u'required': False, u'related': [u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'id', u'required': False, u'related': [u'listAutoScaleVmProfiles'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale vm profile'}, {u'name': u'templateid', u'required': False, u'related': [u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the templateid of the autoscale vm profile'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'otherdeployparams', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the otherdeployparameters of the autoscale vm profile'}], u'requiredparams': [], u'description': u'Lists autoscale vm profiles.'}, u'apis': {u'name': u'listApis', u'related': [], u'isasync': False, u'params': [{u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'API name'}], u'requiredparams': [], u'description': u'lists all available apis on the server, provided by the Api Discovery plugin'}, u'vpcs': {u'name': u'listVPCs', u'related': [u'restartVPC'], u'isasync': False, u'params': [{u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'domainid', u'required': False, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by name of the VPC'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'cidr', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u"list by cidr of the VPC. All VPC guest networks' cidrs should be within this CIDR"}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'restartrequired', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list VPCs by restartRequired option'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list VPCs by state'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by display text of the VPC'}, {u'name': u'id', u'required': False, u'related': [u'restartVPC', u'listVPCs'], u'length': 255, u'type': u'uuid', u'description': u'list VPC by id'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list by zone'}, {u'name': u'supportedservices', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list VPC supporting certain services'}, {u'name': u'vpcofferingid', u'required': False, u'related': [u'listVPCOfferings', u'createVPCOffering'], u'length': 255, u'type': u'uuid', u'description': u'list by ID of the VPC offering'}], u'requiredparams': [], u'description': u'Lists VPCs'}, u'f5loadbalancers': {u'name': u'listF5LoadBalancers', u'related': [u'configureF5LoadBalancer'], u'isasync': False, u'params': [{u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'updatePhysicalNetwork', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'lbdeviceid', u'required': False, u'related': [u'configureF5LoadBalancer', u'listF5LoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'f5 load balancer device ID'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'lists F5 load balancer devices'}, u'snapshots': {u'name': u'listSnapshots', u'related': [], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'id', u'required': False, u'related': [u'listSnapshots'], u'length': 255, u'type': u'uuid', u'description': u'lists snapshot by snapshot ID'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'intervaltype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'valid values are HOURLY, DAILY, WEEKLY, and MONTHLY.'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'volumeid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'lists snapshot by snapshot name'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'snapshottype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'valid values are MANUAL or RECURRING.'}], u'requiredparams': [], u'description': u'Lists all available snapshots for the account.'}, u'networkofferings': {u'name': u'listNetworkOfferings', u'related': [u'createNetworkOffering', u'updateNetworkOffering'], u'isasync': False, u'params': [{u'name': u'isdefault', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if need to list only default network offerings. Default value is false'}, {u'name': u'sourcenatsupported', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if need to list only netwok offerings where source nat is supported, false otherwise'}, {u'name': u'supportedservices', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list network offerings supporting certain services'}, {u'name': u'networkid', u'required': False, u'related': [u'createNetwork', u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the network. Pass this in if you want to see the available network offering that a network can be changed to.'}, {u'name': u'specifyipranges', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if need to list only network offerings which support specifying ip ranges'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list network offerings by name'}, {u'name': u'id', u'required': False, u'related': [u'listNetworkOfferings', u'createNetworkOffering', u'updateNetworkOffering'], u'length': 255, u'type': u'uuid', u'description': u'list network offerings by id'}, {u'name': u'specifyvlan', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'the tags for the network offering.'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'list netowrk offerings available for network creation in specific zone'}, {u'name': u'forvpc', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'the network offering can be used only for network creation inside the VPC'}, {u'name': u'traffictype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by traffic type'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'guestiptype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list network offerings by guest type: Shared or Isolated'}, {u'name': u'istagged', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if offering has tags specified'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 4096, u'type': u'string', u'description': u'list network offerings by tags'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list network offerings by display text'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list network offerings by state'}, {u'name': u'availability', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the availability of network offering. Default value is Required'}], u'requiredparams': [], u'description': u'Lists all available network offerings.'}, u'virtualmachines': {u'name': u'listVirtualMachines', u'related': [], u'isasync': False, u'params': [{u'name': u'templateid', u'required': False, u'related': [u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'list vms by template'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'networkid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list by network id'}, {u'name': u'storageid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u"the storage ID where vm's volumes belong to"}, {u'name': u'isoid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list vms by iso'}, {u'name': u'vpcid', u'required': False, u'related': [u'restartVPC'], u'length': 255, u'type': u'uuid', u'description': u'list vms by vpc'}, {u'name': u'podid', u'required': False, u'related': [u'updatePod'], u'length': 255, u'type': u'uuid', u'description': u'the pod ID'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the virtual machine'}, {u'name': u'details', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'comma separated list of host details requested, value can be a list of [all, group, nics, stats, secgrp, tmpl, servoff, iso, volume, min]. If no parameter is passed in, the details will be defaulted to all'}, {u'name': u'hypervisor', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the target hypervisor for the template'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'groupid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the group ID'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the availability zone ID'}, {u'name': u'hostid', u'required': False, u'related': [u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'the host ID'}, {u'name': u'id', u'required': False, u'related': [u'listVirtualMachines'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine'}, {u'name': u'forvirtualnetwork', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list by network type; true if need to list vms using Virtual Network, false otherwise'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'state of the virtual machine'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'List the virtual machines owned by the account.'}, u'netscalerloadbalancernetworks': {u'name': u'listNetscalerLoadBalancerNetworks', u'related': [], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'lbdeviceid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'netscaler load balancer device ID'}], u'requiredparams': [u'lbdeviceid'], u'description': u'lists network that are using a netscaler load balancer device'}, u'oscategories': {u'name': u'listOsCategories', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'listOsCategories'], u'length': 255, u'type': u'uuid', u'description': u'list Os category by id'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list os category by name'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists all supported OS categories for this cloud.'}, u'virtualrouterelements': {u'name': u'listVirtualRouterElements', u'related': [u'createVirtualRouterElement', u'configureVirtualRouterElement'], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'nspid', u'required': False, u'related': [u'addNetworkServiceProvider', u'listTrafficTypes', u'updateNetworkServiceProvider'], u'length': 255, u'type': u'uuid', u'description': u'list virtual router elements by network service provider id'}, {u'name': u'id', u'required': False, u'related': [u'createVirtualRouterElement', u'configureVirtualRouterElement', u'listVirtualRouterElements'], u'length': 255, u'type': u'uuid', u'description': u'list virtual router elements by id'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'enabled', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'list network offerings by enabled state'}], u'requiredparams': [], u'description': u'Lists all available virtual router elements.'}, u'lunsonfiler': {u'name': u'listLunsOnFiler', u'related': [], u'isasync': False, u'params': [{u'name': u'poolname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'pool name.'}], u'requiredparams': [u'poolname'], u'description': u'List LUN'}, u'asyncjobs': {u'name': u'listAsyncJobs', u'related': [u'queryAsyncJobResult'], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'startdate', u'required': False, u'related': [], u'length': 255, u'type': u'tzdate', u'description': u'the start date of the async job'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}], u'requiredparams': [], u'description': u'Lists all pending asynchronous jobs for the account.'}, u'ostypes': {u'name': u'listOsTypes', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [u'listOsTypes'], u'length': 255, u'type': u'uuid', u'description': u'list by Os type Id'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'oscategoryid', u'required': False, u'related': [u'listOsCategories'], u'length': 255, u'type': u'uuid', u'description': u'list by Os Category id'}, {u'name': u'description', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list os by description'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists all supported OS types for this cloud.'}, u'networkacls': {u'name': u'listNetworkACLs', u'related': [u'createNetworkACL'], u'isasync': False, u'params': [{u'name': u'traffictype', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list network ACLs by traffic type - Ingress or Egress'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'id', u'required': False, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'Lists network ACL with the specified ID.'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'suspendProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'networkid', u'required': False, u'related': [u'createNetwork', u'listNiciraNvpDeviceNetworks', u'updateNetwork', u'listF5LoadBalancerNetworks', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'length': 255, u'type': u'uuid', u'description': u'list network ACLs by network Id'}], u'requiredparams': [], u'description': u'Lists all network ACLs'}, u'volumesonfiler': {u'name': u'listVolumesOnFiler', u'related': [], u'isasync': False, u'params': [{u'name': u'poolname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'pool name.'}], u'requiredparams': [u'poolname'], u'description': u'List Volumes'}, u'eventtypes': {u'name': u'listEventTypes', u'related': [], u'isasync': False, u'params': [], u'requiredparams': [], u'description': u'List Event Types'}, u'remoteaccessvpns': {u'name': u'listRemoteAccessVpns', u'related': [u'createRemoteAccessVpn'], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'publicipid', u'required': True, u'related': [u'restartNetwork', u'listPublicIpAddresses', u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'public ip address id of the vpn server'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}], u'requiredparams': [u'publicipid'], u'description': u'Lists remote access vpns'}, u'alerts': {u'name': u'listAlerts', u'related': [], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list by alert type'}, {u'name': u'id', u'required': False, u'related': [u'listAlerts'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the alert'}], u'requiredparams': [], u'description': u'Lists all alerts.'}, u'regions': {u'name': u'listRegions', u'related': [u'addRegion'], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'List Region by region ID.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List Region by region name.'}], u'requiredparams': [], u'description': u'Lists Regions'}, u'vpcofferings': {u'name': u'listVPCOfferings', u'related': [], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [u'listVPCOfferings'], u'length': 255, u'type': u'uuid', u'description': u'list VPC offerings by id'}, {u'name': u'state', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list VPC offerings by state'}, {u'name': u'supportedservices', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list VPC offerings supporting certain services'}, {u'name': u'displaytext', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list VPC offerings by display text'}, {u'name': u'isdefault', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if need to list only default VPC offerings. Default value is false'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list VPC offerings by name'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists VPC offerings'}, u'niciranvpdevicenetworks': {u'name': u'listNiciraNvpDeviceNetworks', u'related': [u'createNetwork', u'updateNetwork', u'listF5LoadBalancerNetworks', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks', u'listNetworks'], u'isasync': False, u'params': [{u'name': u'nvpdeviceid', u'required': True, u'related': [u'addNiciraNvpDevice', u'listNiciraNvpDevices'], u'length': 255, u'type': u'uuid', u'description': u'nicira nvp device ID'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [u'nvpdeviceid'], u'description': u'lists network that are using a nicira nvp device'}, u'events': {u'name': u'listEvents', u'related': [], u'isasync': False, u'params': [{u'name': u'startdate', u'required': False, u'related': [], u'length': 255, u'type': u'date', u'description': u'the start date range of the list you want to retrieve (use format "yyyy-MM-dd" or the new format "yyyy-MM-dd HH:mm:ss")'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'enddate', u'required': False, u'related': [], u'length': 255, u'type': u'date', u'description': u'the end date range of the list you want to retrieve (use format "yyyy-MM-dd" or the new format "yyyy-MM-dd HH:mm:ss")'}, {u'name': u'duration', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the duration of the event'}, {u'name': u'id', u'required': False, u'related': [u'listEvents'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the event'}, {u'name': u'level', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the event level (INFO, WARN, ERROR)'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'entrytime', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'the time the event was entered'}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the event type (see event types)'}], u'requiredparams': [], u'description': u'A command to list events.'}, u'templates': {u'name': u'listTemplates', u'related': [u'registerIso', u'updateTemplate', u'prepareTemplate', u'copyIso', u'updateIso', u'listIsos'], u'isasync': False, u'params': [{u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'templatefilter', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'possible values are "featured", "self", "selfexecutable","sharedexecutable","executable", and "community". * featured : templates that have been marked as featured and public. * self : templates that have been registered or created by the calling user. * selfexecutable : same as self, but only returns templates that can be used to deploy a new VM. * sharedexecutable : templates ready to be deployed that have been granted to the calling user by another user. * executable : templates that are owned by the calling user, or public templates, that can be used to deploy a VM. * community : templates that have been marked as public but not featured. * all : all templates (only usable by admins).'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [u'listTemplates', u'registerIso', u'updateTemplate', u'prepareTemplate', u'copyIso', u'updateIso', u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the template ID'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the template name'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'hypervisor', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the hypervisor for which to restrict the search'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'list templates by zoneId'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}], u'requiredparams': [u'templatefilter'], u'description': u'List all public, private, and privileged templates.'}, u'cisconexusvsms': {u'name': u'listCiscoNexusVSMs', u'related': [u'disableCiscoNexusVSM', u'enableCiscoNexusVSM'], u'isasync': False, u'params': [{u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'clusterid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Id of the CloudStack cluster in which the Cisco Nexus 1000v VSM appliance.'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'Id of the CloudStack cluster in which the Cisco Nexus 1000v VSM appliance.'}], u'requiredparams': [], u'description': u'Retrieves a Cisco Nexus 1000v Virtual Switch Manager device associated with a Cluster'}, u'ipforwardingrules': {u'name': u'listIpForwardingRules', u'related': [], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'id', u'required': False, u'related': [u'listIpForwardingRules'], u'length': 255, u'type': u'uuid', u'description': u'Lists rule with the specified ID.'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'listVirtualMachines', u'destroyVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'Lists all rules applied to the specified Vm.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'ipaddressid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list the rule belonging to this public ip address'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}], u'requiredparams': [], u'description': u'List the ip forwarding rules'}, u'srxfirewalls': {u'name': u'listSrxFirewalls', u'related': [u'addSrxFirewall'], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'physicalnetworkid', u'required': False, u'related': [u'listPhysicalNetworks', u'createPhysicalNetwork'], u'length': 255, u'type': u'uuid', u'description': u'the Physical Network ID'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'fwdeviceid', u'required': False, u'related': [u'listSrxFirewalls', u'addSrxFirewall'], u'length': 255, u'type': u'uuid', u'description': u'SRX firewall device ID'}], u'requiredparams': [], u'description': u'lists SRX firewall devices in a physical network'}, u'vpnconnections': {u'name': u'listVpnConnections', u'related': [], u'isasync': False, u'params': [{u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'vpcid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'id of vpc'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'id', u'required': False, u'related': [u'listVpnConnections'], u'length': 255, u'type': u'uuid', u'description': u'id of the vpn connection'}], u'requiredparams': [], u'description': u'Lists site to site vpn connection gateways'}, u'trafficmonitors': {u'name': u'listTrafficMonitors', u'related': [], u'isasync': False, u'params': [{u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'zoneid', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'zone Id'}], u'requiredparams': [u'zoneid'], u'description': u'List traffic monitor Hosts.'}, u'vpnusers': {u'name': u'listVpnUsers', u'related': [], u'isasync': False, u'params': [{u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'id', u'required': False, u'related': [u'listVpnUsers'], u'length': 255, u'type': u'uuid', u'description': u'The uuid of the Vpn user'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'username', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the username of the vpn user.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}], u'requiredparams': [], u'description': u'Lists vpn users'}, u'egressfirewallrules': {u'name': u'listEgressFirewallRules', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Lists rule with the specified ID.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'networkid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the id network network for the egress firwall services'}, {u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Lists rule with the specified ID.'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'ipaddressid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the id of IP address of the firwall services'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}], u'requiredparams': [], u'description': u'Lists all egress firewall rules for network id.'}, u'staticroutes': {u'name': u'listStaticRoutes', u'related': [u'createStaticRoute'], u'isasync': False, u'params': [{u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'gatewayid', u'required': False, u'related': [u'createPrivateGateway'], u'length': 255, u'type': u'uuid', u'description': u'list static routes by gateway id'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'vpcid', u'required': False, u'related': [u'updateVPC', u'restartVPC', u'listVPCs', u'createVPC'], u'length': 255, u'type': u'uuid', u'description': u'list static routes by vpc id'}, {u'name': u'id', u'required': False, u'related': [u'createStaticRoute', u'listStaticRoutes'], u'length': 255, u'type': u'uuid', u'description': u'list static route by id'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}], u'requiredparams': [], u'description': u'Lists all static routes'}, u'volumes': {u'name': u'listVolumes', u'related': [u'migrateVolume', u'detachVolume', u'resizeVolume', u'attachVolume', u'uploadVolume', u'createVolume'], u'isasync': False, u'params': [{u'name': u'isrecursive', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'defaults to false, but if true, lists all resources from the parent specified by the domainId till leaves.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the disk volume'}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'listProjects', u'suspendProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'list objects by project'}, {u'name': u'hostid', u'required': False, u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addSecondaryStorage', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers', u'prepareHostForMaintenance'], u'length': 255, u'type': u'uuid', u'description': u'list volumes on specified host'}, {u'name': u'id', u'required': False, u'related': [u'migrateVolume', u'detachVolume', u'resizeVolume', u'attachVolume', u'listVolumes', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the disk volume'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'List resources by tags (key/value pairs)'}, {u'name': u'zoneid', u'required': False, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the availability zone'}, {u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'list only resources belonging to the domain specified'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list resources by account. Must be used with the domainId parameter.'}, {u'name': u'virtualmachineid', u'required': False, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'rebootVirtualMachine', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'attachIso', u'listLoadBalancerRuleInstances', u'deployVirtualMachine', u'detachIso', u'resetSSHKeyForVirtualMachine', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the virtual machine'}, {u'name': u'type', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the type of disk volume'}, {u'name': u'listall', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u"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"}, {u'name': u'podid', u'required': False, u'related': [u'createPod', u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the pod id the disk volume belongs to'}], u'requiredparams': [], u'description': u'Lists all volumes.'}, u'pods': {u'name': u'listPods', u'related': [u'updatePod'], u'isasync': False, u'params': [{u'name': u'showcapacities', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'flag to display the capacity of the pods'}, {u'name': u'allocationstate', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list pods by allocation state'}, {u'name': u'pagesize', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'list Pods by Zone ID'}, {u'name': u'id', u'required': False, u'related': [u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'list Pods by ID'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'list Pods by name'}, {u'name': u'page', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u''}, {u'name': u'keyword', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'List by keyword'}], u'requiredparams': [], u'description': u'Lists all Pods.'}}, u'upload': {u'volume': {u'name': u'uploadVolume', u'related': [u'detachVolume'], u'isasync': True, u'params': [{u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the name of the volume'}, {u'name': u'format', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the format for the volume. Possible values include QCOW2, OVA, and VHD.'}, {u'name': u'url', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'the URL of where the volume is hosted. Possible URL include http:// and https://'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional accountName. Must be used with domainId.'}, {u'name': u'domainid', u'required': False, u'related': [u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId. If the account parameter is used, domainId must also be used.'}, {u'name': u'checksum', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the MD5 checksum value of this volume'}, {u'name': u'zoneid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone the volume is to be hosted on'}], u'requiredparams': [u'name', u'format', u'url', u'zoneid'], u'description': u'Uploads a data disk.'}, u'customcertificate': {u'name': u'uploadCustomCertificate', u'related': [], u'isasync': True, u'params': [{u'name': u'domainsuffix', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'DNS domain suffix that the certificate is granted for.'}, {u'name': u'certificate', u'required': True, u'related': [], u'length': 65535, u'type': u'string', u'description': u'The certificate to be uploaded.'}, {u'name': u'privatekey', u'required': False, u'related': [], u'length': 65535, u'type': u'string', u'description': u'The private key for the attached certificate.'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'A name / alias for the certificate.'}, {u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'integer', u'description': u'An integer providing the location in a chain that the certificate will hold. Usually, this can be left empty. When creating a chain, the top level certificate should have an ID of 1, with each step in the chain incrementing by one. Example, CA with id = 1, Intermediate CA with id = 2, Site certificate with ID = 3'}], u'requiredparams': [u'domainsuffix', u'certificate'], u'description': u'Uploads a custom certificate for the console proxy VMs to use for SSL. Can be used to upload a single certificate signed by a known CA. Can also be used, through multiple calls, to upload a chain of certificates from CA to the custom certificate itself.'}}, u'remove': {u'region': {u'name': u'removeRegion', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'integer', u'description': u'ID of the region to delete'}], u'requiredparams': [u'id'], u'description': u'Removes specified region'}, u'nicfromvirtualmachine': {u'name': u'removeNicFromVirtualMachine', u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': True, u'params': [{u'name': u'nicid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'NIC ID'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'startVirtualMachine', u'updateDefaultNicForVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'resetPasswordForVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'removeNicFromVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'Virtual Machine ID'}], u'requiredparams': [u'nicid', u'virtualmachineid'], u'description': u'Removes VM from specified network by deleting a NIC'}, u'fromloadbalancerrule': {u'name': u'removeFromLoadBalancerRule', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listIpForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the load balancer rule'}, {u'name': u'virtualmachineids', u'required': True, u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'list', u'description': u'the list of IDs of the virtual machines that are being removed from the load balancer rule (i.e. virtualMachineIds=1,2,3)'}], u'requiredparams': [u'id', u'virtualmachineids'], u'description': u'Removes a virtual machine or a list of virtual machines from a load balancer rule.'}, u'vpnuser': {u'name': u'removeVpnUser', u'related': [], u'isasync': True, u'params': [{u'name': u'domainid', u'required': False, u'related': [u'updateDomain', u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'an optional domainId for the vpn user. If the account parameter is used, domainId must also be used.'}, {u'name': u'projectid', u'required': False, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'remove vpn user from the project'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'an optional account for the vpn user. Must be used with domainId.'}, {u'name': u'username', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'username for the vpn user'}], u'requiredparams': [u'username'], u'description': u'Removes vpn user'}}, u'asyncapis': [u'createCondition', u'reconnectHost', u'copyTemplate', u'deleteBigSwitchVnsDevice', u'addNicToVirtualMachine', u'extractVolume', u'addAccountToProject', u'deleteEgressFirewallRule', u'deleteCiscoNexusVSM', u'createVpnConnection', u'suspendProject', u'addF5LoadBalancer', u'deleteAutoScaleVmGroup', u'authorizeSecurityGroupIngress', u'addNetscalerLoadBalancer', u'deleteDomain', u'configureNetscalerLoadBalancer', u'disableAutoScaleVmGroup', u'authorizeSecurityGroupEgress', u'createTemplate', u'migrateVolume', u'updatePhysicalNetwork', u'prepareHostForMaintenance', u'deletePrivateGateway', u'deleteStaticRoute', u'deleteTrafficType', u'deleteLoadBalancerRule', u'attachIso', u'destroySystemVm', u'deletePortForwardingRule', u'enableStorageMaintenance', u'stopRouter', u'configureSrxFirewall', u'attachVolume', u'updateVPCOffering', u'resetSSHKeyForVirtualMachine', u'updateProjectInvitation', u'createTags', u'enableAutoScaleVmGroup', u'deleteTags', u'deleteAccountFromProject', u'removeVpnUser', u'updateVpnCustomerGateway', u'stopSystemVm', u'uploadCustomCertificate', u'restartNetwork', u'createAutoScaleVmProfile', u'rebootVirtualMachine', u'enableCiscoNexusVSM', u'cancelHostMaintenance', u'deleteStorageNetworkIpRange', u'deleteFirewallRule', u'deleteVpnConnection', u'startSystemVm', u'deleteF5LoadBalancer', u'deleteNiciraNvpDevice', u'updateProject', u'deleteNetwork', u'deleteProject', u'deleteNetscalerLoadBalancer', u'deleteIpForwardingRule', u'addTrafficType', u'disableUser', u'resizeVolume', u'configureVirtualRouterElement', u'createStaticRoute', u'deleteProjectInvitation', u'migrateSystemVm', u'activateProject', u'removeNicFromVirtualMachine', u'revokeSecurityGroupIngress', u'updateDefaultNicForVirtualMachine', u'disableStaticNat', u'createNetworkACL', u'createVPC', u'configureF5LoadBalancer', u'disassociateIpAddress', u'createIpForwardingRule', u'createVolume', u'resetPasswordForVirtualMachine', u'assignToLoadBalancerRule', u'startRouter', u'extractIso', u'deleteRemoteAccessVpn', u'resetVpnConnection', u'createRemoteAccessVpn', u'extractTemplate', u'startVirtualMachine', u'detachIso', u'updateVPC', u'deleteAccount', u'associateIpAddress', u'updateAutoScaleVmProfile', u'disableAccount', u'updatePortForwardingRule', u'migrateVirtualMachine', u'createStorageNetworkIpRange', u'cancelStorageMaintenance', u'deployVirtualMachine', u'removeFromLoadBalancerRule', u'revokeSecurityGroupEgress', u'deleteCondition', u'createPortForwardingRule', u'addVpnUser', u'createVPCOffering', u'createEgressFirewallRule', u'deleteLBStickinessPolicy', u'destroyRouter', u'createPrivateGateway', u'disableCiscoNexusVSM', u'deleteAutoScaleVmProfile', u'updateTrafficType', u'deleteSnapshot', u'createProject', u'createLoadBalancerRule', u'addSrxFirewall', u'addNiciraNvpDevice', u'createAutoScalePolicy', u'restoreVirtualMachine', u'copyIso', u'uploadVolume', u'createLBStickinessPolicy', u'stopVirtualMachine', u'createCounter', u'createSnapshot', u'destroyVirtualMachine', u'updateNetwork', u'deleteVpnGateway', u'createAutoScaleVmGroup', u'rebootRouter', u'deleteNetworkServiceProvider', u'deleteIso', u'createVpnCustomerGateway', u'createFirewallRule', u'deleteAutoScalePolicy', u'deleteSrxFirewall', u'addNetworkServiceProvider', u'rebootSystemVm', u'detachVolume', u'deleteNetworkACL', u'markDefaultZoneForAccount', u'deleteVPC', u'restartVPC', u'updateAutoScaleVmGroup', u'updateLoadBalancerRule', u'createPhysicalNetwork', u'deleteTemplate', u'deletePhysicalNetwork', u'deleteVpnCustomerGateway', u'deleteVPCOffering', u'createVirtualRouterElement', u'updateAutoScalePolicy', u'addBigSwitchVnsDevice', u'createVpnGateway', u'updateNetworkServiceProvider', u'deleteCounter', u'updateStorageNetworkIpRange'], u'assign': {u'toloadbalancerrule': {u'name': u'assignToLoadBalancerRule', u'related': [], u'isasync': True, u'params': [{u'name': u'virtualmachineids', u'required': True, u'related': [u'startVirtualMachine', u'updateVirtualMachine', u'stopVirtualMachine', u'recoverVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'migrateVirtualMachine', u'changeServiceForVirtualMachine', u'deployVirtualMachine', u'detachIso', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'list', u'description': u'the list of IDs of the virtual machine that are being assigned to the load balancer rule(i.e. virtualMachineIds=1,2,3)'}, {u'name': u'id', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the load balancer rule'}], u'requiredparams': [u'virtualmachineids', u'id'], u'description': u'Assigns virtual machine or a list of virtual machines to a load balancer rule.'}, u'virtualmachine': {u'name': u'assignVirtualMachine', u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'isasync': False, u'params': [{u'name': u'networkids', u'required': False, u'related': [u'updateNetwork', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'list', u'description': u'list of new network ids in which the moved VM will participate. In case no network ids are provided the VM will be part of the default network for that zone. In case there is no network yet created for the new account the default network will be created.'}, {u'name': u'domainid', u'required': True, u'related': [u'listDomainChildren', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'domain id of the new VM owner.'}, {u'name': u'securitygroupids', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list of security group ids to be applied on the virtual machine. In case no security groups are provided the VM is part of the default security group.'}, {u'name': u'account', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'account name of the new VM owner.'}, {u'name': u'virtualmachineid', u'required': True, u'related': [u'updateVirtualMachine', u'stopVirtualMachine', u'assignVirtualMachine', u'listVirtualMachines', u'destroyVirtualMachine', u'restoreVirtualMachine'], u'length': 255, u'type': u'uuid', u'description': u'id of the VM to be moved'}], u'requiredparams': [u'domainid', u'account', u'virtualmachineid'], u'description': u'Assign a VM from one account to another under the same domain. This API is available for Basic zones with security groups and Advance zones with guest networks. The VM is restricted to move between accounts under same domain.'}}, u'delete': {u'loadbalancerrule': {u'name': u'deleteLoadBalancerRule', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the load balancer rule'}], u'requiredparams': [u'id'], u'description': u'Deletes a load balancer rule.'}, u'domain': {u'name': u'deleteDomain', u'related': [], u'isasync': True, u'params': [{u'name': u'cleanup', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'true if all domain resources (child domains, accounts) have to be cleaned up, false otherwise'}, {u'name': u'id', u'required': True, u'related': [u'updateDomain', u'listDomainChildren', u'listDomains', u'createDomain'], u'length': 255, u'type': u'uuid', u'description': u'ID of domain to delete'}], u'requiredparams': [u'id'], u'description': u'Deletes a specified domain'}, u'instancegroup': {u'name': u'deleteInstanceGroup', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the instance group'}], u'requiredparams': [u'id'], u'description': u'Deletes a vm group'}, u'diskoffering': {u'name': u'deleteDiskOffering', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateDiskOffering', u'createDiskOffering', u'listDiskOfferings'], u'length': 255, u'type': u'uuid', u'description': u'ID of the disk offering'}], u'requiredparams': [u'id'], u'description': u'Updates a disk offering.'}, u'externalloadbalancer': {u'name': u'deleteExternalLoadBalancer', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'listSwifts', u'addHost', u'cancelHostMaintenance', u'addBaremetalHost', u'updateHost', u'addSwift', u'listHosts', u'listExternalLoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'Id of the external loadbalancer appliance.'}], u'requiredparams': [u'id'], u'description': u'Deletes a F5 external load balancer appliance added in a zone.'}, u'securitygroup': {u'name': u'deleteSecurityGroup', u'related': [], u'isasync': False, u'params': [{u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the domain ID of account owning the security group'}, {u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'The ID of the security group. Mutually exclusive with name parameter'}, {u'name': u'name', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'The ID of the security group. Mutually exclusive with id parameter'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account of the security group. Must be specified with domain ID'}, {u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the project of the security group'}], u'requiredparams': [], u'description': u'Deletes security group'}, u'portforwardingrule': {u'name': u'deletePortForwardingRule', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the port forwarding rule'}], u'requiredparams': [u'id'], u'description': u'Deletes a port forwarding rule'}, u'cluster': {u'name': u'deleteCluster', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the cluster ID'}], u'requiredparams': [u'id'], u'description': u'Deletes a cluster.'}, u'accountfromproject': {u'name': u'deleteAccountFromProject', u'related': [], u'isasync': True, u'params': [{u'name': u'projectid', u'required': True, u'related': [u'createProject', u'listProjectAccounts', u'activateProject', u'updateProject'], u'length': 255, u'type': u'uuid', u'description': u'id of the project to remove the account from'}, {u'name': u'account', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'name of the account to be removed from the project'}], u'requiredparams': [u'projectid', u'account'], u'description': u'Deletes account from the project'}, u'networkdevice': {u'name': u'deleteNetworkDevice', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'addHost', u'updateHost', u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'Id of network device to delete'}], u'requiredparams': [u'id'], u'description': u'Deletes network device.'}, u'firewallrule': {u'name': u'deleteFirewallRule', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the firewall rule'}], u'requiredparams': [u'id'], u'description': u'Deletes a firewall rule'}, u'pod': {u'name': u'deletePod', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'updatePod', u'listPods'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the Pod'}], u'requiredparams': [u'id'], u'description': u'Deletes a Pod.'}, u'ipforwardingrule': {u'name': u'deleteIpForwardingRule', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the id of the forwarding rule'}], u'requiredparams': [u'id'], u'description': u'Deletes an ip forwarding rule'}, u'vpnconnection': {u'name': u'deleteVpnConnection', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listVpnConnections', u'resetVpnConnection'], u'length': 255, u'type': u'uuid', u'description': u'id of vpn connection'}], u'requiredparams': [u'id'], u'description': u'Delete site to site vpn connection'}, u'lbstickinesspolicy': {u'name': u'deleteLBStickinessPolicy', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createLBStickinessPolicy'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the LB stickiness policy'}], u'requiredparams': [u'id'], u'description': u'Deletes a LB stickiness policy.'}, u'vpcoffering': {u'name': u'deleteVPCOffering', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the VPC offering'}], u'requiredparams': [u'id'], u'description': u'Deletes VPC offering'}, u'network': {u'name': u'deleteNetwork', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateNetwork', u'listSrxFirewallNetworks', u'listNetscalerLoadBalancerNetworks'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the network'}], u'requiredparams': [u'id'], u'description': u'Deletes a network'}, u'zone': {u'name': u'deleteZone', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateZone', u'listZones', u'createZone'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the Zone'}], u'requiredparams': [u'id'], u'description': u'Deletes a Zone.'}, u'remoteaccessvpn': {u'name': u'deleteRemoteAccessVpn', u'related': [], u'isasync': True, u'params': [{u'name': u'publicipid', u'required': True, u'related': [u'associateIpAddress'], u'length': 255, u'type': u'uuid', u'description': u'public ip address id of the vpn server'}], u'requiredparams': [u'publicipid'], u'description': u'Destroys a l2tp/ipsec remote access vpn'}, u'storagenetworkiprange': {u'name': u'deleteStorageNetworkIpRange', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listStorageNetworkIpRange', u'createStorageNetworkIpRange', u'updateStorageNetworkIpRange'], u'length': 255, u'type': u'uuid', u'description': u'the uuid of the storage network ip range'}], u'requiredparams': [u'id'], u'description': u'Deletes a storage network IP Range.'}, u'bigswitchvnsdevice': {u'name': u'deleteBigSwitchVnsDevice', u'related': [], u'isasync': True, u'params': [{u'name': u'vnsdeviceid', u'required': True, u'related': [], u'length': 255, u'type': u'long', u'description': u'BigSwitch device ID'}], u'requiredparams': [u'vnsdeviceid'], u'description': u' delete a bigswitch vns device'}, u'projectinvitation': {u'name': u'deleteProjectInvitation', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listProjectInvitations'], u'length': 255, u'type': u'uuid', u'description': u'id of the invitation'}], u'requiredparams': [u'id'], u'description': u'Accepts or declines project invitation'}, u'autoscalepolicy': {u'name': u'deleteAutoScalePolicy', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateAutoScalePolicy'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale policy'}], u'requiredparams': [u'id'], u'description': u'Deletes a autoscale policy.'}, u'niciranvpdevice': {u'name': u'deleteNiciraNvpDevice', u'related': [], u'isasync': True, u'params': [{u'name': u'nvpdeviceid', u'required': True, u'related': [u'addNiciraNvpDevice', u'listNiciraNvpDevices'], u'length': 255, u'type': u'uuid', u'description': u'Nicira device ID'}], u'requiredparams': [u'nvpdeviceid'], u'description': u' delete a nicira nvp device'}, u'serviceoffering': {u'name': u'deleteServiceOffering', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'updateHypervisorCapabilities', u'listServiceOfferings'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the service offering'}], u'requiredparams': [u'id'], u'description': u'Deletes a service offering.'}, u'condition': {u'name': u'deleteCondition', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the condition.'}], u'requiredparams': [u'id'], u'description': u'Removes a condition'}, u'storagepool': {u'name': u'deleteStoragePool', u'related': [], u'isasync': False, u'params': [{u'name': u'forced', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Force destroy storage pool (force expunge volumes in Destroyed state as a part of pool removal)'}, {u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'Storage pool id'}], u'requiredparams': [u'id'], u'description': u'Deletes a storage pool.'}, u'vpngateway': {u'name': u'deleteVpnGateway', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createVpnGateway'], u'length': 255, u'type': u'uuid', u'description': u'id of customer gateway'}], u'requiredparams': [u'id'], u'description': u'Delete site to site vpn gateway'}, u'snapshot': {u'name': u'deleteSnapshot', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createSnapshot', u'listSnapshots'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the snapshot'}], u'requiredparams': [u'id'], u'description': u'Deletes a snapshot of a disk volume.'}, u'autoscalevmgroup': {u'name': u'deleteAutoScaleVmGroup', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listAutoScaleVmGroups', u'createAutoScaleVmGroup', u'disableAutoScaleVmGroup', u'enableAutoScaleVmGroup', u'updateAutoScaleVmGroup'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale group'}], u'requiredparams': [u'id'], u'description': u'Deletes a autoscale vm group.'}, u'trafficmonitor': {u'name': u'deleteTrafficMonitor', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'Id of the Traffic Monitor Host.'}], u'requiredparams': [u'id'], u'description': u'Deletes an traffic monitor host.'}, u'networkacl': {u'name': u'deleteNetworkACL', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the network ACL'}], u'requiredparams': [u'id'], u'description': u'Deletes a Network ACL'}, u'template': {u'name': u'deleteTemplate', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the template'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of zone of the template'}], u'requiredparams': [u'id'], u'description': u'Deletes a template from the system. All virtual machines using the deleted template will not be affected.'}, u'tags': {u'name': u'deleteTags', u'related': [], u'isasync': True, u'params': [{u'name': u'resourceids', u'required': True, u'related': [], u'length': 255, u'type': u'list', u'description': u'Delete tags for resource id(s)'}, {u'name': u'tags', u'required': False, u'related': [], u'length': 255, u'type': u'map', u'description': u'Delete tags matching key/value pairs'}, {u'name': u'resourcetype', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Delete tag by resource type'}], u'requiredparams': [u'resourceids', u'resourcetype'], u'description': u'Deleting resource tag(s)'}, u'snapshotpolicies': {u'name': u'deleteSnapshotPolicies', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the Id of the snapshot policy'}, {u'name': u'ids', u'required': False, u'related': [], u'length': 255, u'type': u'list', u'description': u'list of snapshots policy IDs separated by comma'}], u'requiredparams': [], u'description': u'Deletes snapshot policies for the account.'}, u'privategateway': {u'name': u'deletePrivateGateway', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createPrivateGateway', u'listPrivateGateways'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the private gateway'}], u'requiredparams': [u'id'], u'description': u'Deletes a Private gateway'}, u'traffictype': {u'name': u'deleteTrafficType', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'addTrafficType', u'updateTrafficType'], u'length': 255, u'type': u'uuid', u'description': u'traffic type id'}], u'requiredparams': [u'id'], u'description': u'Deletes traffic type of a physical network'}, u'host': {u'name': u'deleteHost', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the host ID'}, {u'name': u'forcedestroylocalstorage', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Force destroy local storage on this host. All VMs created on this local storage will be destroyed'}, {u'name': u'forced', u'required': False, u'related': [], u'length': 255, u'type': u'boolean', u'description': u'Force delete the host. All HA enabled vms running on the host will be put to HA; HA disabled ones will be stopped'}], u'requiredparams': [u'id'], u'description': u'Deletes a host.'}, u'staticroute': {u'name': u'deleteStaticRoute', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createStaticRoute', u'listStaticRoutes'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the static route'}], u'requiredparams': [u'id'], u'description': u'Deletes a static route'}, u'vpc': {u'name': u'deleteVPC', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'restartVPC'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the VPC'}], u'requiredparams': [u'id'], u'description': u'Deletes a VPC'}, u'srxfirewall': {u'name': u'deleteSrxFirewall', u'related': [], u'isasync': True, u'params': [{u'name': u'fwdeviceid', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'srx firewall device ID'}], u'requiredparams': [u'fwdeviceid'], u'description': u' delete a SRX firewall device'}, u'externalfirewall': {u'name': u'deleteExternalFirewall', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'listHosts'], u'length': 255, u'type': u'uuid', u'description': u'Id of the external firewall appliance.'}], u'requiredparams': [u'id'], u'description': u'Deletes an external firewall appliance.'}, u'pool': {u'name': u'deletePool', u'related': [], u'isasync': False, u'params': [{u'name': u'poolname', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'pool name.'}], u'requiredparams': [u'poolname'], u'description': u'Delete a pool'}, u'autoscalevmprofile': {u'name': u'deleteAutoScaleVmProfile', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listAutoScaleVmProfiles'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the autoscale profile'}], u'requiredparams': [u'id'], u'description': u'Deletes a autoscale vm profile.'}, u'volume': {u'name': u'deleteVolume', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'detachVolume', u'resizeVolume', u'uploadVolume', u'createVolume'], u'length': 255, u'type': u'uuid', u'description': u'The ID of the disk volume'}], u'requiredparams': [u'id'], u'description': u'Deletes a detached disk volume.'}, u'account': {u'name': u'deleteAccount', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'markDefaultZoneForAccount', u'updateAccount', u'listAccounts', u'lockAccount', u'disableAccount'], u'length': 255, u'type': u'uuid', u'description': u'Account id'}], u'requiredparams': [u'id'], u'description': u'Deletes a account, and all users associated with this account'}, u'cisconexusvsm': {u'name': u'deleteCiscoNexusVSM', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'disableCiscoNexusVSM', u'listCiscoNexusVSMs', u'enableCiscoNexusVSM'], u'length': 255, u'type': u'uuid', u'description': u'Id of the Cisco Nexus 1000v VSM device to be deleted'}], u'requiredparams': [u'id'], u'description': u' delete a Cisco Nexus VSM device'}, u'netscalerloadbalancer': {u'name': u'deleteNetscalerLoadBalancer', u'related': [], u'isasync': True, u'params': [{u'name': u'lbdeviceid', u'required': True, u'related': [u'listNetscalerLoadBalancers'], u'length': 255, u'type': u'uuid', u'description': u'netscaler load balancer device ID'}], u'requiredparams': [u'lbdeviceid'], u'description': u' delete a netscaler load balancer device'}, u'networkoffering': {u'name': u'deleteNetworkOffering', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'createNetworkOffering', u'updateNetworkOffering'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the network offering'}], u'requiredparams': [u'id'], u'description': u'Deletes a network offering.'}, u'vpncustomergateway': {u'name': u'deleteVpnCustomerGateway', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'id of customer gateway'}], u'requiredparams': [u'id'], u'description': u'Delete site to site vpn customer gateway'}, u'counter': {u'name': u'deleteCounter', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the counter'}], u'requiredparams': [u'id'], u'description': u'Deletes a counter'}, u'physicalnetwork': {u'name': u'deletePhysicalNetwork', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the Physical network'}], u'requiredparams': [u'id'], u'description': u'Deletes a Physical Network.'}, u'project': {u'name': u'deleteProject', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'createProject', u'listProjectAccounts', u'activateProject'], u'length': 255, u'type': u'uuid', u'description': u'id of the project to be deleted'}], u'requiredparams': [u'id'], u'description': u'Deletes a project'}, u'vlaniprange': {u'name': u'deleteVlanIpRange', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'listVlanIpRanges'], u'length': 255, u'type': u'uuid', u'description': u'the id of the VLAN IP range'}], u'requiredparams': [u'id'], u'description': u'Creates a VLAN IP range.'}, u'f5loadbalancer': {u'name': u'deleteF5LoadBalancer', u'related': [], u'isasync': True, u'params': [{u'name': u'lbdeviceid', u'required': True, u'related': [u'configureF5LoadBalancer'], u'length': 255, u'type': u'uuid', u'description': u'netscaler load balancer device ID'}], u'requiredparams': [u'lbdeviceid'], u'description': u' delete a F5 load balancer device'}, u'iso': {u'name': u'deleteIso', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'listIsos'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the ISO file'}, {u'name': u'zoneid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the ID of the zone of the ISO file. If not specified, the ISO will be deleted from all the zones'}], u'requiredparams': [u'id'], u'description': u'Deletes an ISO file.'}, u'egressfirewallrule': {u'name': u'deleteEgressFirewallRule', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'updatePortForwardingRule', u'listIpForwardingRules', u'createIpForwardingRule', u'listPortForwardingRules', u'createPortForwardingRule'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the firewall rule'}], u'requiredparams': [u'id'], u'description': u'Deletes an ggress firewall rule'}, u'networkserviceprovider': {u'name': u'deleteNetworkServiceProvider', u'related': [], u'isasync': True, u'params': [{u'name': u'id', u'required': True, u'related': [u'addNetworkServiceProvider', u'listTrafficTypes', u'updateNetworkServiceProvider'], u'length': 255, u'type': u'uuid', u'description': u'the ID of the network service provider'}], u'requiredparams': [u'id'], u'description': u'Deletes a Network Service Provider.'}, u'sshkeypair': {u'name': u'deleteSSHKeyPair', u'related': [], u'isasync': False, u'params': [{u'name': u'projectid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the project associated with keypair'}, {u'name': u'domainid', u'required': False, u'related': [], u'length': 255, u'type': u'uuid', u'description': u'the domain ID associated with the keypair'}, {u'name': u'name', u'required': True, u'related': [], u'length': 255, u'type': u'string', u'description': u'Name of the keypair'}, {u'name': u'account', u'required': False, u'related': [], u'length': 255, u'type': u'string', u'description': u'the account associated with the keypair. Must be used with the domainId parameter.'}], u'requiredparams': [u'name'], u'description': u'Deletes a keypair by name'}, u'user': {u'name': u'deleteUser', u'related': [], u'isasync': False, u'params': [{u'name': u'id', u'required': True, u'related': [u'lockUser', u'listUsers'], u'length': 255, u'type': u'uuid', u'description': u'id of the user to be deleted'}], u'requiredparams': [u'id'], u'description': u'Deletes a user for an account'}}} \ No newline at end of file diff --git a/tools/ngui/requester.py b/tools/ngui/requester.py new file mode 100644 index 00000000000..3f3337d3b4e --- /dev/null +++ b/tools/ngui/requester.py @@ -0,0 +1,153 @@ +#!/usr/bin/python +# -*- coding: utf-8 -*- +# 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. + +try: + import base64 + import hashlib + import hmac + import httplib + import json + import os + import pdb + import re + import shlex + import sys + import time + import types + import urllib + import urllib2 + +except ImportError, e: + print "Import error in %s : %s" % (__name__, e) + import sys + sys.exit() + + +def logger_debug(logger, message): + if logger is not None: + logger.debug(message) + + +def make_request(command, args, logger, host, port, + apikey, secretkey, protocol, path): + response = None + error = None + + if protocol != 'http' and protocol != 'https': + error = "Protocol must be 'http' or 'https'" + return None, error + + if args is None: + args = {} + + args["command"] = command + args["apiKey"] = apikey + args["response"] = "json" + request = zip(args.keys(), args.values()) + request.sort(key=lambda x: x[0].lower()) + + request_url = "&".join(["=".join([r[0], urllib.quote_plus(str(r[1]))]) + for r in request]) + hashStr = "&".join(["=".join([r[0].lower(), + str.lower(urllib.quote_plus(str(r[1]))).replace("+", + "%20")]) for r in request]) + + sig = urllib.quote_plus(base64.encodestring(hmac.new(secretkey, hashStr, + hashlib.sha1).digest()).strip()) + request_url += "&signature=%s" % sig + request_url = "%s://%s:%s%s?%s" % (protocol, host, port, path, request_url) + + try: + logger_debug(logger, "Request sent: %s" % request_url) + connection = urllib2.urlopen(request_url) + response = connection.read() + except Exception, e: + error = str(e) + + logger_debug(logger, "Response received: %s" % response) + if error is not None: + logger_debug(logger, error) + + return response, error + + +def monkeyrequest(command, args, isasync, asyncblock, logger, host, port, + apikey, secretkey, timeout, protocol, path): + + response = None + error = None + logger_debug(logger, "======== START Request ========") + logger_debug(logger, "Requesting command=%s, args=%s" % (command, args)) + response, error = make_request(command, args, logger, host, port, + apikey, secretkey, protocol, path) + logger_debug(logger, "======== END Request ========\n") + + if error is not None: + return response, error + + def process_json(response): + try: + response = json.loads(str(response)) + except ValueError, e: + error = "Error processing json response, %s" % e + logger_debug(logger, "Error processing json", e) + return response + + response = process_json(response) + if response is None: + return response, error + + isasync = isasync and (asyncblock == "true") + responsekey = filter(lambda x: 'response' in x, response.keys())[0] + + if isasync and 'jobid' in response[responsekey]: + jobid = response[responsekey]['jobid'] + command = "queryAsyncJobResult" + request = {'jobid': jobid} + timeout = int(timeout) + pollperiod = 3 + progress = 1 + while timeout > 0: + print '\r' + '.' * progress, + time.sleep(pollperiod) + timeout = timeout - pollperiod + progress += 1 + logger_debug(logger, "Job %s to timeout in %ds" % (jobid, timeout)) + sys.stdout.flush() + response, error = monkeyrequest(command, request, isasync, + asyncblock, logger, + host, port, apikey, secretkey, + timeout, protocol, path) + response = process_json(response) + responsekeys = filter(lambda x: 'response' in x, response.keys()) + if len(responsekeys) < 1: + continue + result = response[responsekeys[0]] + jobstatus = result['jobstatus'] + if jobstatus == 2: + jobresult = result["jobresult"] + error = "\rAsync job %s failed\nError %s, %s" % (jobid, + jobresult["errorcode"], jobresult["errortext"]) + return response, error + elif jobstatus == 1: + print '\r', + return response, error + error = "Error: Async query timeout occurred for jobid %s" % jobid + + return response, error diff --git a/tools/ngui/static/bootstrap/css/bootstrap-responsive.css b/tools/ngui/static/bootstrap/css/bootstrap-responsive.css new file mode 100644 index 00000000000..09e88ce3fec --- /dev/null +++ b/tools/ngui/static/bootstrap/css/bootstrap-responsive.css @@ -0,0 +1,1109 @@ +/*! + * Bootstrap Responsive v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ + +.clearfix { + *zoom: 1; +} + +.clearfix:before, +.clearfix:after { + display: table; + line-height: 0; + content: ""; +} + +.clearfix:after { + clear: both; +} + +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} + +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} + +@-ms-viewport { + width: device-width; +} + +.hidden { + display: none; + visibility: hidden; +} + +.visible-phone { + display: none !important; +} + +.visible-tablet { + display: none !important; +} + +.hidden-desktop { + display: none !important; +} + +.visible-desktop { + display: inherit !important; +} + +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} + +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} + +.visible-print { + display: none !important; +} + +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} + +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} + +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + line-height: 0; + content: ""; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + line-height: 0; + content: ""; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + float: left; + width: 100%; + min-height: 30px; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} + +@media (max-width: 767px) { + body { + padding-right: 20px; + padding-left: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-right: -20px; + margin-left: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + width: auto; + clear: none; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + display: block; + float: none; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + right: 20px; + left: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} + +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-right: 10px; + padding-left: 10px; + } + .media .pull-left, + .media .pull-right { + display: block; + float: none; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + right: 10px; + left: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} + +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-right: 10px; + padding-left: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + padding: 0; + margin-top: 5px; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + display: none; + float: none; + max-width: none; + padding: 0; + margin: 0 15px; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + -moz-box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + box-shadow: inset 0 1px 0 rgba(255, 255, 255, 0.1), 0 1px 0 rgba(255, 255, 255, 0.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + height: 0; + overflow: hidden; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-right: 10px; + padding-left: 10px; + } +} + +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/tools/ngui/static/bootstrap/css/bootstrap-responsive.min.css b/tools/ngui/static/bootstrap/css/bootstrap-responsive.min.css new file mode 100644 index 00000000000..d1b7f4b0b82 --- /dev/null +++ b/tools/ngui/static/bootstrap/css/bootstrap-responsive.min.css @@ -0,0 +1,9 @@ +/*! + * Bootstrap Responsive v2.3.1 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */.clearfix{*zoom:1}.clearfix:before,.clearfix:after{display:table;line-height:0;content:""}.clearfix:after{clear:both}.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0}.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}@-ms-viewport{width:device-width}.hidden{display:none;visibility:hidden}.visible-phone{display:none!important}.visible-tablet{display:none!important}.hidden-desktop{display:none!important}.visible-desktop{display:inherit!important}@media(min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-tablet{display:inherit!important}.hidden-tablet{display:none!important}}@media(max-width:767px){.hidden-desktop{display:inherit!important}.visible-desktop{display:none!important}.visible-phone{display:inherit!important}.hidden-phone{display:none!important}}.visible-print{display:none!important}@media print{.visible-print{display:inherit!important}.hidden-print{display:none!important}}@media(min-width:1200px){.row{margin-left:-30px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:30px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px}.span12{width:1170px}.span11{width:1070px}.span10{width:970px}.span9{width:870px}.span8{width:770px}.span7{width:670px}.span6{width:570px}.span5{width:470px}.span4{width:370px}.span3{width:270px}.span2{width:170px}.span1{width:70px}.offset12{margin-left:1230px}.offset11{margin-left:1130px}.offset10{margin-left:1030px}.offset9{margin-left:930px}.offset8{margin-left:830px}.offset7{margin-left:730px}.offset6{margin-left:630px}.offset5{margin-left:530px}.offset4{margin-left:430px}.offset3{margin-left:330px}.offset2{margin-left:230px}.offset1{margin-left:130px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%}.row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%}.row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%}.row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%}.row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%}.row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%}.row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%}.row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%}.row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%}.row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%}.row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%}.row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%}.row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%}.row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%}.row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%}.row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%}.row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%}.row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%}.row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%}.row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%}.row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%}.row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%}.row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%}.row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%}.row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%}.row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%}.row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%}.row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%}.row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%}.row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%}.row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%}.row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%}.row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%}.row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%}.row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:30px}input.span12,textarea.span12,.uneditable-input.span12{width:1156px}input.span11,textarea.span11,.uneditable-input.span11{width:1056px}input.span10,textarea.span10,.uneditable-input.span10{width:956px}input.span9,textarea.span9,.uneditable-input.span9{width:856px}input.span8,textarea.span8,.uneditable-input.span8{width:756px}input.span7,textarea.span7,.uneditable-input.span7{width:656px}input.span6,textarea.span6,.uneditable-input.span6{width:556px}input.span5,textarea.span5,.uneditable-input.span5{width:456px}input.span4,textarea.span4,.uneditable-input.span4{width:356px}input.span3,textarea.span3,.uneditable-input.span3{width:256px}input.span2,textarea.span2,.uneditable-input.span2{width:156px}input.span1,textarea.span1,.uneditable-input.span1{width:56px}.thumbnails{margin-left:-30px}.thumbnails>li{margin-left:30px}.row-fluid .thumbnails{margin-left:0}}@media(min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1}.row:before,.row:after{display:table;line-height:0;content:""}.row:after{clear:both}[class*="span"]{float:left;min-height:1px;margin-left:20px}.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px}.span12{width:724px}.span11{width:662px}.span10{width:600px}.span9{width:538px}.span8{width:476px}.span7{width:414px}.span6{width:352px}.span5{width:290px}.span4{width:228px}.span3{width:166px}.span2{width:104px}.span1{width:42px}.offset12{margin-left:764px}.offset11{margin-left:702px}.offset10{margin-left:640px}.offset9{margin-left:578px}.offset8{margin-left:516px}.offset7{margin-left:454px}.offset6{margin-left:392px}.offset5{margin-left:330px}.offset4{margin-left:268px}.offset3{margin-left:206px}.offset2{margin-left:144px}.offset1{margin-left:82px}.row-fluid{width:100%;*zoom:1}.row-fluid:before,.row-fluid:after{display:table;line-height:0;content:""}.row-fluid:after{clear:both}.row-fluid [class*="span"]{display:block;float:left;width:100%;min-height:30px;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="span"]:first-child{margin-left:0}.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%}.row-fluid .span12{width:100%;*width:99.94680851063829%}.row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%}.row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%}.row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%}.row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%}.row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%}.row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%}.row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%}.row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%}.row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%}.row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%}.row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%}.row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%}.row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%}.row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%}.row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%}.row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%}.row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%}.row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%}.row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%}.row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%}.row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%}.row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%}.row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%}.row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%}.row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%}.row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%}.row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%}.row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%}.row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%}.row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%}.row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%}.row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%}.row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%}.row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%}.row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%}input,textarea,.uneditable-input{margin-left:0}.controls-row [class*="span"]+[class*="span"]{margin-left:20px}input.span12,textarea.span12,.uneditable-input.span12{width:710px}input.span11,textarea.span11,.uneditable-input.span11{width:648px}input.span10,textarea.span10,.uneditable-input.span10{width:586px}input.span9,textarea.span9,.uneditable-input.span9{width:524px}input.span8,textarea.span8,.uneditable-input.span8{width:462px}input.span7,textarea.span7,.uneditable-input.span7{width:400px}input.span6,textarea.span6,.uneditable-input.span6{width:338px}input.span5,textarea.span5,.uneditable-input.span5{width:276px}input.span4,textarea.span4,.uneditable-input.span4{width:214px}input.span3,textarea.span3,.uneditable-input.span3{width:152px}input.span2,textarea.span2,.uneditable-input.span2{width:90px}input.span1,textarea.span1,.uneditable-input.span1{width:28px}}@media(max-width:767px){body{padding-right:20px;padding-left:20px}.navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-right:-20px;margin-left:-20px}.container-fluid{padding:0}.dl-horizontal dt{float:none;width:auto;clear:none;text-align:left}.dl-horizontal dd{margin-left:0}.container{width:auto}.row-fluid{width:100%}.row,.thumbnails{margin-left:0}.thumbnails>li{float:none;margin-left:0}[class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{display:block;float:none;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.row-fluid [class*="offset"]:first-child{margin-left:0}.input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box}.input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto}.controls-row [class*="span"]+[class*="span"]{margin-left:0}.modal{position:fixed;top:20px;right:20px;left:20px;width:auto;margin:0}.modal.fade{top:-100px}.modal.fade.in{top:20px}}@media(max-width:480px){.nav-collapse{-webkit-transform:translate3d(0,0,0)}.page-header h1 small{display:block;line-height:20px}input[type="checkbox"],input[type="radio"]{border:1px solid #ccc}.form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left}.form-horizontal .controls{margin-left:0}.form-horizontal .control-list{padding-top:0}.form-horizontal .form-actions{padding-right:10px;padding-left:10px}.media .pull-left,.media .pull-right{display:block;float:none;margin-bottom:10px}.media-object{margin-right:0;margin-left:0}.modal{top:10px;right:10px;left:10px}.modal-header .close{padding:10px;margin:-10px}.carousel-caption{position:static}}@media(max-width:979px){body{padding-top:0}.navbar-fixed-top,.navbar-fixed-bottom{position:static}.navbar-fixed-top{margin-bottom:20px}.navbar-fixed-bottom{margin-top:20px}.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px}.navbar .container{width:auto;padding:0}.navbar .brand{padding-right:10px;padding-left:10px;margin:0 0 0 -5px}.nav-collapse{clear:both}.nav-collapse .nav{float:none;margin:0 0 10px}.nav-collapse .nav>li{float:none}.nav-collapse .nav>li>a{margin-bottom:2px}.nav-collapse .nav>.divider-vertical{display:none}.nav-collapse .nav .nav-header{color:#777;text-shadow:none}.nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px}.nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px}.nav-collapse .dropdown-menu li+li a{margin-bottom:2px}.nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2}.navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999}.navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111}.nav-collapse.in .btn-group{padding:0;margin-top:5px}.nav-collapse .dropdown-menu{position:static;top:auto;left:auto;display:none;float:none;max-width:none;padding:0;margin:0 15px;background-color:transparent;border:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none}.nav-collapse .open>.dropdown-menu{display:block}.nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none}.nav-collapse .dropdown-menu .divider{display:none}.nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none}.nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1);box-shadow:inset 0 1px 0 rgba(255,255,255,0.1),0 1px 0 rgba(255,255,255,0.1)}.navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111;border-bottom-color:#111}.navbar .nav-collapse .nav.pull-right{float:none;margin-left:0}.nav-collapse,.nav-collapse.collapse{height:0;overflow:hidden}.navbar .btn-navbar{display:block}.navbar-static .navbar-inner{padding-right:10px;padding-left:10px}}@media(min-width:980px){.nav-collapse.collapse{height:auto!important;overflow:visible!important}} diff --git a/tools/ngui/static/bootstrap/css/bootstrap.css b/tools/ngui/static/bootstrap/css/bootstrap.css new file mode 100644 index 00000000000..f857ba213f6 --- /dev/null +++ b/tools/ngui/static/bootstrap/css/bootstrap.css @@ -0,0 +1,6315 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix { + *zoom: 1; +} +.clearfix:before, +.clearfix:after { + display: table; + content: ""; + line-height: 0; +} +.clearfix:after { + clear: both; +} +.hide-text { + font: 0/0 a; + color: transparent; + text-shadow: none; + background-color: transparent; + border: 0; +} +.input-block-level { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +article, +aside, +details, +figcaption, +figure, +footer, +header, +hgroup, +nav, +section { + display: block; +} +audio, +canvas, +video { + display: inline-block; + *display: inline; + *zoom: 1; +} +audio:not([controls]) { + display: none; +} +html { + font-size: 100%; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +a:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +a:hover, +a:active { + outline: 0; +} +sub, +sup { + position: relative; + font-size: 75%; + line-height: 0; + vertical-align: baseline; +} +sup { + top: -0.5em; +} +sub { + bottom: -0.25em; +} +img { + /* Responsive images (ensure images don't scale beyond their parents) */ + + max-width: 100%; + /* Part 1: Set a maxium relative to the parent */ + + width: auto\9; + /* IE7-8 need help adjusting responsive images */ + + height: auto; + /* Part 2: Scale the height according to the width, otherwise you get stretching */ + + vertical-align: middle; + border: 0; + -ms-interpolation-mode: bicubic; +} +#map_canvas img, +.google-maps img { + max-width: none; +} +button, +input, +select, +textarea { + margin: 0; + font-size: 100%; + vertical-align: middle; +} +button, +input { + *overflow: visible; + line-height: normal; +} +button::-moz-focus-inner, +input::-moz-focus-inner { + padding: 0; + border: 0; +} +button, +html input[type="button"], +input[type="reset"], +input[type="submit"] { + -webkit-appearance: button; + cursor: pointer; +} +label, +select, +button, +input[type="button"], +input[type="reset"], +input[type="submit"], +input[type="radio"], +input[type="checkbox"] { + cursor: pointer; +} +input[type="search"] { + -webkit-box-sizing: content-box; + -moz-box-sizing: content-box; + box-sizing: content-box; + -webkit-appearance: textfield; +} +input[type="search"]::-webkit-search-decoration, +input[type="search"]::-webkit-search-cancel-button { + -webkit-appearance: none; +} +textarea { + overflow: auto; + vertical-align: top; +} +@media print { + * { + text-shadow: none !important; + color: #000 !important; + background: transparent !important; + box-shadow: none !important; + } + a, + a:visited { + text-decoration: underline; + } + a[href]:after { + content: " (" attr(href) ")"; + } + abbr[title]:after { + content: " (" attr(title) ")"; + } + .ir a:after, + a[href^="javascript:"]:after, + a[href^="#"]:after { + content: ""; + } + pre, + blockquote { + border: 1px solid #999; + page-break-inside: avoid; + } + thead { + display: table-header-group; + } + tr, + img { + page-break-inside: avoid; + } + img { + max-width: 100% !important; + } + @page { + margin: 0.5cm; + } + p, + h2, + h3 { + orphans: 3; + widows: 3; + } + h2, + h3 { + page-break-after: avoid; + } +} +body { + margin: 0; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + line-height: 20px; + color: #333333; + background-color: #ffffff; +} +a { + color: #0088cc; + text-decoration: none; +} +a:hover, +a:focus { + color: #005580; + text-decoration: underline; +} +.img-rounded { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.img-polaroid { + padding: 4px; + background-color: #fff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); +} +.img-circle { + -webkit-border-radius: 500px; + -moz-border-radius: 500px; + border-radius: 500px; +} +.row { + margin-left: -20px; + *zoom: 1; +} +.row:before, +.row:after { + display: table; + content: ""; + line-height: 0; +} +.row:after { + clear: both; +} +[class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; +} +.container, +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.span12 { + width: 940px; +} +.span11 { + width: 860px; +} +.span10 { + width: 780px; +} +.span9 { + width: 700px; +} +.span8 { + width: 620px; +} +.span7 { + width: 540px; +} +.span6 { + width: 460px; +} +.span5 { + width: 380px; +} +.span4 { + width: 300px; +} +.span3 { + width: 220px; +} +.span2 { + width: 140px; +} +.span1 { + width: 60px; +} +.offset12 { + margin-left: 980px; +} +.offset11 { + margin-left: 900px; +} +.offset10 { + margin-left: 820px; +} +.offset9 { + margin-left: 740px; +} +.offset8 { + margin-left: 660px; +} +.offset7 { + margin-left: 580px; +} +.offset6 { + margin-left: 500px; +} +.offset5 { + margin-left: 420px; +} +.offset4 { + margin-left: 340px; +} +.offset3 { + margin-left: 260px; +} +.offset2 { + margin-left: 180px; +} +.offset1 { + margin-left: 100px; +} +.row-fluid { + width: 100%; + *zoom: 1; +} +.row-fluid:before, +.row-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.row-fluid:after { + clear: both; +} +.row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.127659574468085%; + *margin-left: 2.074468085106383%; +} +.row-fluid [class*="span"]:first-child { + margin-left: 0; +} +.row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.127659574468085%; +} +.row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; +} +.row-fluid .span11 { + width: 91.48936170212765%; + *width: 91.43617021276594%; +} +.row-fluid .span10 { + width: 82.97872340425532%; + *width: 82.92553191489361%; +} +.row-fluid .span9 { + width: 74.46808510638297%; + *width: 74.41489361702126%; +} +.row-fluid .span8 { + width: 65.95744680851064%; + *width: 65.90425531914893%; +} +.row-fluid .span7 { + width: 57.44680851063829%; + *width: 57.39361702127659%; +} +.row-fluid .span6 { + width: 48.93617021276595%; + *width: 48.88297872340425%; +} +.row-fluid .span5 { + width: 40.42553191489362%; + *width: 40.37234042553192%; +} +.row-fluid .span4 { + width: 31.914893617021278%; + *width: 31.861702127659576%; +} +.row-fluid .span3 { + width: 23.404255319148934%; + *width: 23.351063829787233%; +} +.row-fluid .span2 { + width: 14.893617021276595%; + *width: 14.840425531914894%; +} +.row-fluid .span1 { + width: 6.382978723404255%; + *width: 6.329787234042553%; +} +.row-fluid .offset12 { + margin-left: 104.25531914893617%; + *margin-left: 104.14893617021275%; +} +.row-fluid .offset12:first-child { + margin-left: 102.12765957446808%; + *margin-left: 102.02127659574467%; +} +.row-fluid .offset11 { + margin-left: 95.74468085106382%; + *margin-left: 95.6382978723404%; +} +.row-fluid .offset11:first-child { + margin-left: 93.61702127659574%; + *margin-left: 93.51063829787232%; +} +.row-fluid .offset10 { + margin-left: 87.23404255319149%; + *margin-left: 87.12765957446807%; +} +.row-fluid .offset10:first-child { + margin-left: 85.1063829787234%; + *margin-left: 84.99999999999999%; +} +.row-fluid .offset9 { + margin-left: 78.72340425531914%; + *margin-left: 78.61702127659572%; +} +.row-fluid .offset9:first-child { + margin-left: 76.59574468085106%; + *margin-left: 76.48936170212764%; +} +.row-fluid .offset8 { + margin-left: 70.2127659574468%; + *margin-left: 70.10638297872339%; +} +.row-fluid .offset8:first-child { + margin-left: 68.08510638297872%; + *margin-left: 67.9787234042553%; +} +.row-fluid .offset7 { + margin-left: 61.70212765957446%; + *margin-left: 61.59574468085106%; +} +.row-fluid .offset7:first-child { + margin-left: 59.574468085106375%; + *margin-left: 59.46808510638297%; +} +.row-fluid .offset6 { + margin-left: 53.191489361702125%; + *margin-left: 53.085106382978715%; +} +.row-fluid .offset6:first-child { + margin-left: 51.063829787234035%; + *margin-left: 50.95744680851063%; +} +.row-fluid .offset5 { + margin-left: 44.68085106382979%; + *margin-left: 44.57446808510638%; +} +.row-fluid .offset5:first-child { + margin-left: 42.5531914893617%; + *margin-left: 42.4468085106383%; +} +.row-fluid .offset4 { + margin-left: 36.170212765957444%; + *margin-left: 36.06382978723405%; +} +.row-fluid .offset4:first-child { + margin-left: 34.04255319148936%; + *margin-left: 33.93617021276596%; +} +.row-fluid .offset3 { + margin-left: 27.659574468085104%; + *margin-left: 27.5531914893617%; +} +.row-fluid .offset3:first-child { + margin-left: 25.53191489361702%; + *margin-left: 25.425531914893618%; +} +.row-fluid .offset2 { + margin-left: 19.148936170212764%; + *margin-left: 19.04255319148936%; +} +.row-fluid .offset2:first-child { + margin-left: 17.02127659574468%; + *margin-left: 16.914893617021278%; +} +.row-fluid .offset1 { + margin-left: 10.638297872340425%; + *margin-left: 10.53191489361702%; +} +.row-fluid .offset1:first-child { + margin-left: 8.51063829787234%; + *margin-left: 8.404255319148938%; +} +[class*="span"].hide, +.row-fluid [class*="span"].hide { + display: none; +} +[class*="span"].pull-right, +.row-fluid [class*="span"].pull-right { + float: right; +} +.container { + margin-right: auto; + margin-left: auto; + *zoom: 1; +} +.container:before, +.container:after { + display: table; + content: ""; + line-height: 0; +} +.container:after { + clear: both; +} +.container-fluid { + padding-right: 20px; + padding-left: 20px; + *zoom: 1; +} +.container-fluid:before, +.container-fluid:after { + display: table; + content: ""; + line-height: 0; +} +.container-fluid:after { + clear: both; +} +p { + margin: 0 0 10px; +} +.lead { + margin-bottom: 20px; + font-size: 19.5px; + font-weight: 200; + line-height: 30px; +} +small { + font-size: 85%; +} +strong { + font-weight: bold; +} +em { + font-style: italic; +} +cite { + font-style: normal; +} +.muted { + color: #999999; +} +a.muted:hover, +a.muted:focus { + color: #808080; +} +.text-warning { + color: #c09853; +} +a.text-warning:hover, +a.text-warning:focus { + color: #a47e3c; +} +.text-error { + color: #b94a48; +} +a.text-error:hover, +a.text-error:focus { + color: #953b39; +} +.text-info { + color: #3a87ad; +} +a.text-info:hover, +a.text-info:focus { + color: #2d6987; +} +.text-success { + color: #468847; +} +a.text-success:hover, +a.text-success:focus { + color: #356635; +} +.text-left { + text-align: left; +} +.text-right { + text-align: right; +} +.text-center { + text-align: center; +} +h1, +h2, +h3, +h4, +h5, +h6 { + margin: 10px 0; + font-family: inherit; + font-weight: bold; + line-height: 20px; + color: inherit; + text-rendering: optimizelegibility; +} +h1 small, +h2 small, +h3 small, +h4 small, +h5 small, +h6 small { + font-weight: normal; + line-height: 1; + color: #999999; +} +h1, +h2, +h3 { + line-height: 40px; +} +h1 { + font-size: 35.75px; +} +h2 { + font-size: 29.25px; +} +h3 { + font-size: 22.75px; +} +h4 { + font-size: 16.25px; +} +h5 { + font-size: 13px; +} +h6 { + font-size: 11.049999999999999px; +} +h1 small { + font-size: 22.75px; +} +h2 small { + font-size: 16.25px; +} +h3 small { + font-size: 13px; +} +h4 small { + font-size: 13px; +} +.page-header { + padding-bottom: 9px; + margin: 20px 0 30px; + border-bottom: 1px solid #eeeeee; +} +ul, +ol { + padding: 0; + margin: 0 0 10px 25px; +} +ul ul, +ul ol, +ol ol, +ol ul { + margin-bottom: 0; +} +li { + line-height: 20px; +} +ul.unstyled, +ol.unstyled { + margin-left: 0; + list-style: none; +} +ul.inline, +ol.inline { + margin-left: 0; + list-style: none; +} +ul.inline > li, +ol.inline > li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding-left: 5px; + padding-right: 5px; +} +dl { + margin-bottom: 20px; +} +dt, +dd { + line-height: 20px; +} +dt { + font-weight: bold; +} +dd { + margin-left: 10px; +} +.dl-horizontal { + *zoom: 1; +} +.dl-horizontal:before, +.dl-horizontal:after { + display: table; + content: ""; + line-height: 0; +} +.dl-horizontal:after { + clear: both; +} +.dl-horizontal dt { + float: left; + width: 160px; + clear: left; + text-align: right; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.dl-horizontal dd { + margin-left: 180px; +} +hr { + margin: 20px 0; + border: 0; + border-top: 1px solid #eeeeee; + border-bottom: 1px solid #ffffff; +} +abbr[title], +abbr[data-original-title] { + cursor: help; + border-bottom: 1px dotted #999999; +} +abbr.initialism { + font-size: 90%; + text-transform: uppercase; +} +blockquote { + padding: 0 0 0 15px; + margin: 0 0 20px; + border-left: 5px solid #eeeeee; +} +blockquote p { + margin-bottom: 0; + font-size: 16.25px; + font-weight: 300; + line-height: 1.25; +} +blockquote small { + display: block; + line-height: 20px; + color: #999999; +} +blockquote small:before { + content: '\2014 \00A0'; +} +blockquote.pull-right { + float: right; + padding-right: 15px; + padding-left: 0; + border-right: 5px solid #eeeeee; + border-left: 0; +} +blockquote.pull-right p, +blockquote.pull-right small { + text-align: right; +} +blockquote.pull-right small:before { + content: ''; +} +blockquote.pull-right small:after { + content: '\00A0 \2014'; +} +q:before, +q:after, +blockquote:before, +blockquote:after { + content: ""; +} +address { + display: block; + margin-bottom: 20px; + font-style: normal; + line-height: 20px; +} +code, +pre { + padding: 0 3px 2px; + font-family: Monaco, Menlo, Consolas, "Courier New", monospace; + font-size: 11px; + color: #333333; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +code { + padding: 2px 4px; + color: #d14; + background-color: #f7f7f9; + border: 1px solid #e1e1e8; + white-space: nowrap; +} +pre { + display: block; + padding: 9.5px; + margin: 0 0 10px; + font-size: 12px; + line-height: 20px; + word-break: break-all; + word-wrap: break-word; + white-space: pre; + white-space: pre-wrap; + background-color: #f5f5f5; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.15); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +pre.prettyprint { + margin-bottom: 20px; +} +pre code { + padding: 0; + color: inherit; + white-space: pre; + white-space: pre-wrap; + background-color: transparent; + border: 0; +} +.pre-scrollable { + max-height: 340px; + overflow-y: scroll; +} +.label, +.badge { + display: inline-block; + padding: 2px 4px; + font-size: 10.998px; + font-weight: bold; + line-height: 14px; + color: #ffffff; + vertical-align: baseline; + white-space: nowrap; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #999999; +} +.label { + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.badge { + padding-left: 9px; + padding-right: 9px; + -webkit-border-radius: 9px; + -moz-border-radius: 9px; + border-radius: 9px; +} +.label:empty, +.badge:empty { + display: none; +} +a.label:hover, +a.label:focus, +a.badge:hover, +a.badge:focus { + color: #ffffff; + text-decoration: none; + cursor: pointer; +} +.label-important, +.badge-important { + background-color: #b94a48; +} +.label-important[href], +.badge-important[href] { + background-color: #953b39; +} +.label-warning, +.badge-warning { + background-color: #f89406; +} +.label-warning[href], +.badge-warning[href] { + background-color: #c67605; +} +.label-success, +.badge-success { + background-color: #468847; +} +.label-success[href], +.badge-success[href] { + background-color: #356635; +} +.label-info, +.badge-info { + background-color: #3a87ad; +} +.label-info[href], +.badge-info[href] { + background-color: #2d6987; +} +.label-inverse, +.badge-inverse { + background-color: #333333; +} +.label-inverse[href], +.badge-inverse[href] { + background-color: #1a1a1a; +} +.btn .label, +.btn .badge { + position: relative; + top: -1px; +} +.btn-mini .label, +.btn-mini .badge { + top: 0; +} +table { + max-width: 100%; + background-color: transparent; + border-collapse: collapse; + border-spacing: 0; +} +.table { + width: 100%; + margin-bottom: 20px; +} +.table th, +.table td { + padding: 8px; + line-height: 20px; + text-align: left; + vertical-align: top; + border-top: 1px solid #dddddd; +} +.table th { + font-weight: bold; +} +.table thead th { + vertical-align: bottom; +} +.table caption + thead tr:first-child th, +.table caption + thead tr:first-child td, +.table colgroup + thead tr:first-child th, +.table colgroup + thead tr:first-child td, +.table thead:first-child tr:first-child th, +.table thead:first-child tr:first-child td { + border-top: 0; +} +.table tbody + tbody { + border-top: 2px solid #dddddd; +} +.table .table { + background-color: #ffffff; +} +.table-condensed th, +.table-condensed td { + padding: 4px 5px; +} +.table-bordered { + border: 1px solid #dddddd; + border-collapse: separate; + *border-collapse: collapse; + border-left: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.table-bordered th, +.table-bordered td { + border-left: 1px solid #dddddd; +} +.table-bordered caption + thead tr:first-child th, +.table-bordered caption + tbody tr:first-child th, +.table-bordered caption + tbody tr:first-child td, +.table-bordered colgroup + thead tr:first-child th, +.table-bordered colgroup + tbody tr:first-child th, +.table-bordered colgroup + tbody tr:first-child td, +.table-bordered thead:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child th, +.table-bordered tbody:first-child tr:first-child td { + border-top: 0; +} +.table-bordered thead:first-child tr:first-child > th:first-child, +.table-bordered tbody:first-child tr:first-child > td:first-child, +.table-bordered tbody:first-child tr:first-child > th:first-child { + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.table-bordered thead:first-child tr:first-child > th:last-child, +.table-bordered tbody:first-child tr:first-child > td:last-child, +.table-bordered tbody:first-child tr:first-child > th:last-child { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; +} +.table-bordered thead:last-child tr:last-child > th:first-child, +.table-bordered tbody:last-child tr:last-child > td:first-child, +.table-bordered tbody:last-child tr:last-child > th:first-child, +.table-bordered tfoot:last-child tr:last-child > td:first-child, +.table-bordered tfoot:last-child tr:last-child > th:first-child { + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.table-bordered thead:last-child tr:last-child > th:last-child, +.table-bordered tbody:last-child tr:last-child > td:last-child, +.table-bordered tbody:last-child tr:last-child > th:last-child, +.table-bordered tfoot:last-child tr:last-child > td:last-child, +.table-bordered tfoot:last-child tr:last-child > th:last-child { + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.table-bordered tfoot + tbody:last-child tr:last-child td:first-child { + -webkit-border-bottom-left-radius: 0; + -moz-border-radius-bottomleft: 0; + border-bottom-left-radius: 0; +} +.table-bordered tfoot + tbody:last-child tr:last-child td:last-child { + -webkit-border-bottom-right-radius: 0; + -moz-border-radius-bottomright: 0; + border-bottom-right-radius: 0; +} +.table-bordered caption + thead tr:first-child th:first-child, +.table-bordered caption + tbody tr:first-child td:first-child, +.table-bordered colgroup + thead tr:first-child th:first-child, +.table-bordered colgroup + tbody tr:first-child td:first-child { + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.table-bordered caption + thead tr:first-child th:last-child, +.table-bordered caption + tbody tr:first-child td:last-child, +.table-bordered colgroup + thead tr:first-child th:last-child, +.table-bordered colgroup + tbody tr:first-child td:last-child { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; +} +.table-striped tbody > tr:nth-child(odd) > td, +.table-striped tbody > tr:nth-child(odd) > th { + background-color: #f9f9f9; +} +.table-hover tbody tr:hover > td, +.table-hover tbody tr:hover > th { + background-color: #f5f5f5; +} +table td[class*="span"], +table th[class*="span"], +.row-fluid table td[class*="span"], +.row-fluid table th[class*="span"] { + display: table-cell; + float: none; + margin-left: 0; +} +.table td.span1, +.table th.span1 { + float: none; + width: 44px; + margin-left: 0; +} +.table td.span2, +.table th.span2 { + float: none; + width: 124px; + margin-left: 0; +} +.table td.span3, +.table th.span3 { + float: none; + width: 204px; + margin-left: 0; +} +.table td.span4, +.table th.span4 { + float: none; + width: 284px; + margin-left: 0; +} +.table td.span5, +.table th.span5 { + float: none; + width: 364px; + margin-left: 0; +} +.table td.span6, +.table th.span6 { + float: none; + width: 444px; + margin-left: 0; +} +.table td.span7, +.table th.span7 { + float: none; + width: 524px; + margin-left: 0; +} +.table td.span8, +.table th.span8 { + float: none; + width: 604px; + margin-left: 0; +} +.table td.span9, +.table th.span9 { + float: none; + width: 684px; + margin-left: 0; +} +.table td.span10, +.table th.span10 { + float: none; + width: 764px; + margin-left: 0; +} +.table td.span11, +.table th.span11 { + float: none; + width: 844px; + margin-left: 0; +} +.table td.span12, +.table th.span12 { + float: none; + width: 924px; + margin-left: 0; +} +.table tbody tr.success > td { + background-color: #dff0d8; +} +.table tbody tr.error > td { + background-color: #f2dede; +} +.table tbody tr.warning > td { + background-color: #fcf8e3; +} +.table tbody tr.info > td { + background-color: #d9edf7; +} +.table-hover tbody tr.success:hover > td { + background-color: #d0e9c6; +} +.table-hover tbody tr.error:hover > td { + background-color: #ebcccc; +} +.table-hover tbody tr.warning:hover > td { + background-color: #faf2cc; +} +.table-hover tbody tr.info:hover > td { + background-color: #c4e3f3; +} +form { + margin: 0 0 20px; +} +fieldset { + padding: 0; + margin: 0; + border: 0; +} +legend { + display: block; + width: 100%; + padding: 0; + margin-bottom: 20px; + font-size: 19.5px; + line-height: 40px; + color: #333333; + border: 0; + border-bottom: 1px solid #e5e5e5; +} +legend small { + font-size: 15px; + color: #999999; +} +label, +input, +button, +select, +textarea { + font-size: 13px; + font-weight: normal; + line-height: 20px; +} +input, +button, +select, +textarea { + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; +} +label { + display: block; + margin-bottom: 5px; +} +select, +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + display: inline-block; + height: 20px; + padding: 4px 6px; + margin-bottom: 10px; + font-size: 13px; + line-height: 20px; + color: #555555; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + vertical-align: middle; +} +input, +textarea, +.uneditable-input { + width: 206px; +} +textarea { + height: auto; +} +textarea, +input[type="text"], +input[type="password"], +input[type="datetime"], +input[type="datetime-local"], +input[type="date"], +input[type="month"], +input[type="time"], +input[type="week"], +input[type="number"], +input[type="email"], +input[type="url"], +input[type="search"], +input[type="tel"], +input[type="color"], +.uneditable-input { + background-color: #ffffff; + border: 1px solid #cccccc; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -webkit-transition: border linear .2s, box-shadow linear .2s; + -moz-transition: border linear .2s, box-shadow linear .2s; + -o-transition: border linear .2s, box-shadow linear .2s; + transition: border linear .2s, box-shadow linear .2s; +} +textarea:focus, +input[type="text"]:focus, +input[type="password"]:focus, +input[type="datetime"]:focus, +input[type="datetime-local"]:focus, +input[type="date"]:focus, +input[type="month"]:focus, +input[type="time"]:focus, +input[type="week"]:focus, +input[type="number"]:focus, +input[type="email"]:focus, +input[type="url"]:focus, +input[type="search"]:focus, +input[type="tel"]:focus, +input[type="color"]:focus, +.uneditable-input:focus { + border-color: rgba(82, 168, 236, 0.8); + outline: 0; + outline: thin dotted \9; + /* IE6-9 */ + + -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); + box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); +} +input[type="radio"], +input[type="checkbox"] { + margin: 4px 0 0; + *margin-top: 0; + /* IE7 */ + + margin-top: 1px \9; + /* IE8-9 */ + + line-height: normal; +} +input[type="file"], +input[type="image"], +input[type="submit"], +input[type="reset"], +input[type="button"], +input[type="radio"], +input[type="checkbox"] { + width: auto; +} +select, +input[type="file"] { + height: 30px; + /* In IE7, the height of the select element cannot be changed by height, only font-size */ + + *margin-top: 4px; + /* For IE7, add top margin to align select with labels */ + + line-height: 30px; +} +select { + width: 220px; + border: 1px solid #cccccc; + background-color: #ffffff; +} +select[multiple], +select[size] { + height: auto; +} +select:focus, +input[type="file"]:focus, +input[type="radio"]:focus, +input[type="checkbox"]:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.uneditable-input, +.uneditable-textarea { + color: #999999; + background-color: #fcfcfc; + border-color: #cccccc; + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); + cursor: not-allowed; +} +.uneditable-input { + overflow: hidden; + white-space: nowrap; +} +.uneditable-textarea { + width: auto; + height: auto; +} +input:-moz-placeholder, +textarea:-moz-placeholder { + color: #999999; +} +input:-ms-input-placeholder, +textarea:-ms-input-placeholder { + color: #999999; +} +input::-webkit-input-placeholder, +textarea::-webkit-input-placeholder { + color: #999999; +} +.radio, +.checkbox { + min-height: 20px; + padding-left: 20px; +} +.radio input[type="radio"], +.checkbox input[type="checkbox"] { + float: left; + margin-left: -20px; +} +.controls > .radio:first-child, +.controls > .checkbox:first-child { + padding-top: 5px; +} +.radio.inline, +.checkbox.inline { + display: inline-block; + padding-top: 5px; + margin-bottom: 0; + vertical-align: middle; +} +.radio.inline + .radio.inline, +.checkbox.inline + .checkbox.inline { + margin-left: 10px; +} +.input-mini { + width: 60px; +} +.input-small { + width: 90px; +} +.input-medium { + width: 150px; +} +.input-large { + width: 210px; +} +.input-xlarge { + width: 270px; +} +.input-xxlarge { + width: 530px; +} +input[class*="span"], +select[class*="span"], +textarea[class*="span"], +.uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"] { + float: none; + margin-left: 0; +} +.input-append input[class*="span"], +.input-append .uneditable-input[class*="span"], +.input-prepend input[class*="span"], +.input-prepend .uneditable-input[class*="span"], +.row-fluid input[class*="span"], +.row-fluid select[class*="span"], +.row-fluid textarea[class*="span"], +.row-fluid .uneditable-input[class*="span"], +.row-fluid .input-prepend [class*="span"], +.row-fluid .input-append [class*="span"] { + display: inline-block; +} +input, +textarea, +.uneditable-input { + margin-left: 0; +} +.controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; +} +input.span12, +textarea.span12, +.uneditable-input.span12 { + width: 926px; +} +input.span11, +textarea.span11, +.uneditable-input.span11 { + width: 846px; +} +input.span10, +textarea.span10, +.uneditable-input.span10 { + width: 766px; +} +input.span9, +textarea.span9, +.uneditable-input.span9 { + width: 686px; +} +input.span8, +textarea.span8, +.uneditable-input.span8 { + width: 606px; +} +input.span7, +textarea.span7, +.uneditable-input.span7 { + width: 526px; +} +input.span6, +textarea.span6, +.uneditable-input.span6 { + width: 446px; +} +input.span5, +textarea.span5, +.uneditable-input.span5 { + width: 366px; +} +input.span4, +textarea.span4, +.uneditable-input.span4 { + width: 286px; +} +input.span3, +textarea.span3, +.uneditable-input.span3 { + width: 206px; +} +input.span2, +textarea.span2, +.uneditable-input.span2 { + width: 126px; +} +input.span1, +textarea.span1, +.uneditable-input.span1 { + width: 46px; +} +.controls-row { + *zoom: 1; +} +.controls-row:before, +.controls-row:after { + display: table; + content: ""; + line-height: 0; +} +.controls-row:after { + clear: both; +} +.controls-row [class*="span"], +.row-fluid .controls-row [class*="span"] { + float: left; +} +.controls-row .checkbox[class*="span"], +.controls-row .radio[class*="span"] { + padding-top: 5px; +} +input[disabled], +select[disabled], +textarea[disabled], +input[readonly], +select[readonly], +textarea[readonly] { + cursor: not-allowed; + background-color: #eeeeee; +} +input[type="radio"][disabled], +input[type="checkbox"][disabled], +input[type="radio"][readonly], +input[type="checkbox"][readonly] { + background-color: transparent; +} +.control-group.warning .control-label, +.control-group.warning .help-block, +.control-group.warning .help-inline { + color: #c09853; +} +.control-group.warning .checkbox, +.control-group.warning .radio, +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + color: #c09853; +} +.control-group.warning input, +.control-group.warning select, +.control-group.warning textarea { + border-color: #c09853; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.warning input:focus, +.control-group.warning select:focus, +.control-group.warning textarea:focus { + border-color: #a47e3c; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; +} +.control-group.warning .input-prepend .add-on, +.control-group.warning .input-append .add-on { + color: #c09853; + background-color: #fcf8e3; + border-color: #c09853; +} +.control-group.error .control-label, +.control-group.error .help-block, +.control-group.error .help-inline { + color: #b94a48; +} +.control-group.error .checkbox, +.control-group.error .radio, +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + color: #b94a48; +} +.control-group.error input, +.control-group.error select, +.control-group.error textarea { + border-color: #b94a48; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.error input:focus, +.control-group.error select:focus, +.control-group.error textarea:focus { + border-color: #953b39; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; +} +.control-group.error .input-prepend .add-on, +.control-group.error .input-append .add-on { + color: #b94a48; + background-color: #f2dede; + border-color: #b94a48; +} +.control-group.success .control-label, +.control-group.success .help-block, +.control-group.success .help-inline { + color: #468847; +} +.control-group.success .checkbox, +.control-group.success .radio, +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + color: #468847; +} +.control-group.success input, +.control-group.success select, +.control-group.success textarea { + border-color: #468847; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.success input:focus, +.control-group.success select:focus, +.control-group.success textarea:focus { + border-color: #356635; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; +} +.control-group.success .input-prepend .add-on, +.control-group.success .input-append .add-on { + color: #468847; + background-color: #dff0d8; + border-color: #468847; +} +.control-group.info .control-label, +.control-group.info .help-block, +.control-group.info .help-inline { + color: #3a87ad; +} +.control-group.info .checkbox, +.control-group.info .radio, +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + color: #3a87ad; +} +.control-group.info input, +.control-group.info select, +.control-group.info textarea { + border-color: #3a87ad; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); +} +.control-group.info input:focus, +.control-group.info select:focus, +.control-group.info textarea:focus { + border-color: #2d6987; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; +} +.control-group.info .input-prepend .add-on, +.control-group.info .input-append .add-on { + color: #3a87ad; + background-color: #d9edf7; + border-color: #3a87ad; +} +input:focus:invalid, +textarea:focus:invalid, +select:focus:invalid { + color: #b94a48; + border-color: #ee5f5b; +} +input:focus:invalid:focus, +textarea:focus:invalid:focus, +select:focus:invalid:focus { + border-color: #e9322d; + -webkit-box-shadow: 0 0 6px #f8b9b7; + -moz-box-shadow: 0 0 6px #f8b9b7; + box-shadow: 0 0 6px #f8b9b7; +} +.form-actions { + padding: 19px 20px 20px; + margin-top: 20px; + margin-bottom: 20px; + background-color: #f5f5f5; + border-top: 1px solid #e5e5e5; + *zoom: 1; +} +.form-actions:before, +.form-actions:after { + display: table; + content: ""; + line-height: 0; +} +.form-actions:after { + clear: both; +} +.help-block, +.help-inline { + color: #595959; +} +.help-block { + display: block; + margin-bottom: 10px; +} +.help-inline { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + vertical-align: middle; + padding-left: 5px; +} +.input-append, +.input-prepend { + display: inline-block; + margin-bottom: 10px; + vertical-align: middle; + font-size: 0; + white-space: nowrap; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input, +.input-append .dropdown-menu, +.input-prepend .dropdown-menu, +.input-append .popover, +.input-prepend .popover { + font-size: 13px; +} +.input-append input, +.input-prepend input, +.input-append select, +.input-prepend select, +.input-append .uneditable-input, +.input-prepend .uneditable-input { + position: relative; + margin-bottom: 0; + *margin-left: 0; + vertical-align: top; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-append input:focus, +.input-prepend input:focus, +.input-append select:focus, +.input-prepend select:focus, +.input-append .uneditable-input:focus, +.input-prepend .uneditable-input:focus { + z-index: 2; +} +.input-append .add-on, +.input-prepend .add-on { + display: inline-block; + width: auto; + height: 20px; + min-width: 16px; + padding: 4px 5px; + font-size: 13px; + font-weight: normal; + line-height: 20px; + text-align: center; + text-shadow: 0 1px 0 #ffffff; + background-color: #eeeeee; + border: 1px solid #ccc; +} +.input-append .add-on, +.input-prepend .add-on, +.input-append .btn, +.input-prepend .btn, +.input-append .btn-group > .dropdown-toggle, +.input-prepend .btn-group > .dropdown-toggle { + vertical-align: top; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-append .active, +.input-prepend .active { + background-color: #a9dba9; + border-color: #46a546; +} +.input-prepend .add-on, +.input-prepend .btn { + margin-right: -1px; +} +.input-prepend .add-on:first-child, +.input-prepend .btn:first-child { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-append input, +.input-append select, +.input-append .uneditable-input { + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-append input + .btn-group .btn:last-child, +.input-append select + .btn-group .btn:last-child, +.input-append .uneditable-input + .btn-group .btn:last-child { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-append .add-on, +.input-append .btn, +.input-append .btn-group { + margin-left: -1px; +} +.input-append .add-on:last-child, +.input-append .btn:last-child, +.input-append .btn-group:last-child > .dropdown-toggle { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append input, +.input-prepend.input-append select, +.input-prepend.input-append .uneditable-input { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.input-prepend.input-append input + .btn-group .btn, +.input-prepend.input-append select + .btn-group .btn, +.input-prepend.input-append .uneditable-input + .btn-group .btn { + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append .add-on:first-child, +.input-prepend.input-append .btn:first-child { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.input-prepend.input-append .add-on:last-child, +.input-prepend.input-append .btn:last-child { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.input-prepend.input-append .btn-group:first-child { + margin-left: 0; +} +input.search-query { + padding-right: 14px; + padding-right: 4px \9; + padding-left: 14px; + padding-left: 4px \9; + /* IE7-8 doesn't have border-radius, so don't indent the padding */ + + margin-bottom: 0; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +/* Allow for input prepend/append in search forms */ +.form-search .input-append .search-query, +.form-search .input-prepend .search-query { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.form-search .input-append .search-query { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search .input-append .btn { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .search-query { + -webkit-border-radius: 0 14px 14px 0; + -moz-border-radius: 0 14px 14px 0; + border-radius: 0 14px 14px 0; +} +.form-search .input-prepend .btn { + -webkit-border-radius: 14px 0 0 14px; + -moz-border-radius: 14px 0 0 14px; + border-radius: 14px 0 0 14px; +} +.form-search input, +.form-inline input, +.form-horizontal input, +.form-search textarea, +.form-inline textarea, +.form-horizontal textarea, +.form-search select, +.form-inline select, +.form-horizontal select, +.form-search .help-inline, +.form-inline .help-inline, +.form-horizontal .help-inline, +.form-search .uneditable-input, +.form-inline .uneditable-input, +.form-horizontal .uneditable-input, +.form-search .input-prepend, +.form-inline .input-prepend, +.form-horizontal .input-prepend, +.form-search .input-append, +.form-inline .input-append, +.form-horizontal .input-append { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .hide, +.form-inline .hide, +.form-horizontal .hide { + display: none; +} +.form-search label, +.form-inline label, +.form-search .btn-group, +.form-inline .btn-group { + display: inline-block; +} +.form-search .input-append, +.form-inline .input-append, +.form-search .input-prepend, +.form-inline .input-prepend { + margin-bottom: 0; +} +.form-search .radio, +.form-search .checkbox, +.form-inline .radio, +.form-inline .checkbox { + padding-left: 0; + margin-bottom: 0; + vertical-align: middle; +} +.form-search .radio input[type="radio"], +.form-search .checkbox input[type="checkbox"], +.form-inline .radio input[type="radio"], +.form-inline .checkbox input[type="checkbox"] { + float: left; + margin-right: 3px; + margin-left: 0; +} +.control-group { + margin-bottom: 10px; +} +legend + .control-group { + margin-top: 20px; + -webkit-margin-top-collapse: separate; +} +.form-horizontal .control-group { + margin-bottom: 20px; + *zoom: 1; +} +.form-horizontal .control-group:before, +.form-horizontal .control-group:after { + display: table; + content: ""; + line-height: 0; +} +.form-horizontal .control-group:after { + clear: both; +} +.form-horizontal .control-label { + float: left; + width: 160px; + padding-top: 5px; + text-align: right; +} +.form-horizontal .controls { + *display: inline-block; + *padding-left: 20px; + margin-left: 180px; + *margin-left: 0; +} +.form-horizontal .controls:first-child { + *padding-left: 180px; +} +.form-horizontal .help-block { + margin-bottom: 0; +} +.form-horizontal input + .help-block, +.form-horizontal select + .help-block, +.form-horizontal textarea + .help-block, +.form-horizontal .uneditable-input + .help-block, +.form-horizontal .input-prepend + .help-block, +.form-horizontal .input-append + .help-block { + margin-top: 10px; +} +.form-horizontal .form-actions { + padding-left: 180px; +} +.btn { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + padding: 4px 12px; + margin-bottom: 0; + font-size: 13px; + line-height: 20px; + text-align: center; + vertical-align: middle; + cursor: pointer; + color: #333333; + text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); + background-color: #f5f5f5; + background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); + background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); + background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); + background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); + border-color: #e6e6e6 #e6e6e6 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e6e6e6; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + border: 1px solid #cccccc; + *border: 0; + border-bottom-color: #b3b3b3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + *margin-left: .3em; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); +} +.btn:hover, +.btn:focus, +.btn:active, +.btn.active, +.btn.disabled, +.btn[disabled] { + color: #333333; + background-color: #e6e6e6; + *background-color: #d9d9d9; +} +.btn:active, +.btn.active { + background-color: #cccccc \9; +} +.btn:first-child { + *margin-left: 0; +} +.btn:hover, +.btn:focus { + color: #333333; + text-decoration: none; + background-position: 0 -15px; + -webkit-transition: background-position 0.1s linear; + -moz-transition: background-position 0.1s linear; + -o-transition: background-position 0.1s linear; + transition: background-position 0.1s linear; +} +.btn:focus { + outline: thin dotted #333; + outline: 5px auto -webkit-focus-ring-color; + outline-offset: -2px; +} +.btn.active, +.btn:active { + background-image: none; + outline: 0; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn.disabled, +.btn[disabled] { + cursor: default; + background-image: none; + opacity: 0.65; + filter: alpha(opacity=65); + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-large { + padding: 11px 19px; + font-size: 16.25px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.btn-large [class^="icon-"], +.btn-large [class*=" icon-"] { + margin-top: 4px; +} +.btn-small { + padding: 2px 10px; + font-size: 11.049999999999999px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.btn-small [class^="icon-"], +.btn-small [class*=" icon-"] { + margin-top: 0; +} +.btn-mini [class^="icon-"], +.btn-mini [class*=" icon-"] { + margin-top: -1px; +} +.btn-mini { + padding: 0 6px; + font-size: 9.75px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.btn-block { + display: block; + width: 100%; + padding-left: 0; + padding-right: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; +} +.btn-block + .btn-block { + margin-top: 5px; +} +input[type="submit"].btn-block, +input[type="reset"].btn-block, +input[type="button"].btn-block { + width: 100%; +} +.btn-primary.active, +.btn-warning.active, +.btn-danger.active, +.btn-success.active, +.btn-info.active, +.btn-inverse.active { + color: rgba(255, 255, 255, 0.75); +} +.btn-primary { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #006dcc; + background-image: -moz-linear-gradient(top, #0088cc, #0044cc); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); + background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); + background-image: -o-linear-gradient(top, #0088cc, #0044cc); + background-image: linear-gradient(to bottom, #0088cc, #0044cc); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); + border-color: #0044cc #0044cc #002a80; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #0044cc; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-primary:hover, +.btn-primary:focus, +.btn-primary:active, +.btn-primary.active, +.btn-primary.disabled, +.btn-primary[disabled] { + color: #ffffff; + background-color: #0044cc; + *background-color: #003bb3; +} +.btn-primary:active, +.btn-primary.active { + background-color: #003399 \9; +} +.btn-warning { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); + border-color: #f89406 #f89406 #ad6704; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #f89406; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-warning:hover, +.btn-warning:focus, +.btn-warning:active, +.btn-warning.active, +.btn-warning.disabled, +.btn-warning[disabled] { + color: #ffffff; + background-color: #f89406; + *background-color: #df8505; +} +.btn-warning:active, +.btn-warning.active { + background-color: #c67605 \9; +} +.btn-danger { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #da4f49; + background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); + background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); + background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); + border-color: #bd362f #bd362f #802420; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #bd362f; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-danger:hover, +.btn-danger:focus, +.btn-danger:active, +.btn-danger.active, +.btn-danger.disabled, +.btn-danger[disabled] { + color: #ffffff; + background-color: #bd362f; + *background-color: #a9302a; +} +.btn-danger:active, +.btn-danger.active { + background-color: #942a25 \9; +} +.btn-success { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #5bb75b; + background-image: -moz-linear-gradient(top, #62c462, #51a351); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); + background-image: -webkit-linear-gradient(top, #62c462, #51a351); + background-image: -o-linear-gradient(top, #62c462, #51a351); + background-image: linear-gradient(to bottom, #62c462, #51a351); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); + border-color: #51a351 #51a351 #387038; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #51a351; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-success:hover, +.btn-success:focus, +.btn-success:active, +.btn-success.active, +.btn-success.disabled, +.btn-success[disabled] { + color: #ffffff; + background-color: #51a351; + *background-color: #499249; +} +.btn-success:active, +.btn-success.active { + background-color: #408140 \9; +} +.btn-info { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #49afcd; + background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); + background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); + background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); + background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); + border-color: #2f96b4 #2f96b4 #1f6377; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #2f96b4; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-info:hover, +.btn-info:focus, +.btn-info:active, +.btn-info.active, +.btn-info.disabled, +.btn-info[disabled] { + color: #ffffff; + background-color: #2f96b4; + *background-color: #2a85a0; +} +.btn-info:active, +.btn-info.active { + background-color: #24748c \9; +} +.btn-inverse { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #363636; + background-image: -moz-linear-gradient(top, #444444, #222222); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); + background-image: -webkit-linear-gradient(top, #444444, #222222); + background-image: -o-linear-gradient(top, #444444, #222222); + background-image: linear-gradient(to bottom, #444444, #222222); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); + border-color: #222222 #222222 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #222222; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.btn-inverse:hover, +.btn-inverse:focus, +.btn-inverse:active, +.btn-inverse.active, +.btn-inverse.disabled, +.btn-inverse[disabled] { + color: #ffffff; + background-color: #222222; + *background-color: #151515; +} +.btn-inverse:active, +.btn-inverse.active { + background-color: #080808 \9; +} +button.btn, +input[type="submit"].btn { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn::-moz-focus-inner, +input[type="submit"].btn::-moz-focus-inner { + padding: 0; + border: 0; +} +button.btn.btn-large, +input[type="submit"].btn.btn-large { + *padding-top: 7px; + *padding-bottom: 7px; +} +button.btn.btn-small, +input[type="submit"].btn.btn-small { + *padding-top: 3px; + *padding-bottom: 3px; +} +button.btn.btn-mini, +input[type="submit"].btn.btn-mini { + *padding-top: 1px; + *padding-bottom: 1px; +} +.btn-link, +.btn-link:active, +.btn-link[disabled] { + background-color: transparent; + background-image: none; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; +} +.btn-link { + border-color: transparent; + cursor: pointer; + color: #0088cc; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-link:hover, +.btn-link:focus { + color: #005580; + text-decoration: underline; + background-color: transparent; +} +.btn-link[disabled]:hover, +.btn-link[disabled]:focus { + color: #333333; + text-decoration: none; +} +[class^="icon-"], +[class*=" icon-"] { + display: inline-block; + width: 14px; + height: 14px; + *margin-right: .3em; + line-height: 14px; + vertical-align: text-top; + background-image: url("../img/glyphicons-halflings.png"); + background-position: 14px 14px; + background-repeat: no-repeat; + margin-top: 1px; +} +/* White icons with optional class, or on hover/focus/active states of certain elements */ +.icon-white, +.nav-pills > .active > a > [class^="icon-"], +.nav-pills > .active > a > [class*=" icon-"], +.nav-list > .active > a > [class^="icon-"], +.nav-list > .active > a > [class*=" icon-"], +.navbar-inverse .nav > .active > a > [class^="icon-"], +.navbar-inverse .nav > .active > a > [class*=" icon-"], +.dropdown-menu > li > a:hover > [class^="icon-"], +.dropdown-menu > li > a:focus > [class^="icon-"], +.dropdown-menu > li > a:hover > [class*=" icon-"], +.dropdown-menu > li > a:focus > [class*=" icon-"], +.dropdown-menu > .active > a > [class^="icon-"], +.dropdown-menu > .active > a > [class*=" icon-"], +.dropdown-submenu:hover > a > [class^="icon-"], +.dropdown-submenu:focus > a > [class^="icon-"], +.dropdown-submenu:hover > a > [class*=" icon-"], +.dropdown-submenu:focus > a > [class*=" icon-"] { + background-image: url("../img/glyphicons-halflings-white.png"); +} +.icon-glass { + background-position: 0 0; +} +.icon-music { + background-position: -24px 0; +} +.icon-search { + background-position: -48px 0; +} +.icon-envelope { + background-position: -72px 0; +} +.icon-heart { + background-position: -96px 0; +} +.icon-star { + background-position: -120px 0; +} +.icon-star-empty { + background-position: -144px 0; +} +.icon-user { + background-position: -168px 0; +} +.icon-film { + background-position: -192px 0; +} +.icon-th-large { + background-position: -216px 0; +} +.icon-th { + background-position: -240px 0; +} +.icon-th-list { + background-position: -264px 0; +} +.icon-ok { + background-position: -288px 0; +} +.icon-remove { + background-position: -312px 0; +} +.icon-zoom-in { + background-position: -336px 0; +} +.icon-zoom-out { + background-position: -360px 0; +} +.icon-off { + background-position: -384px 0; +} +.icon-signal { + background-position: -408px 0; +} +.icon-cog { + background-position: -432px 0; +} +.icon-trash { + background-position: -456px 0; +} +.icon-home { + background-position: 0 -24px; +} +.icon-file { + background-position: -24px -24px; +} +.icon-time { + background-position: -48px -24px; +} +.icon-road { + background-position: -72px -24px; +} +.icon-download-alt { + background-position: -96px -24px; +} +.icon-download { + background-position: -120px -24px; +} +.icon-upload { + background-position: -144px -24px; +} +.icon-inbox { + background-position: -168px -24px; +} +.icon-play-circle { + background-position: -192px -24px; +} +.icon-repeat { + background-position: -216px -24px; +} +.icon-refresh { + background-position: -240px -24px; +} +.icon-list-alt { + background-position: -264px -24px; +} +.icon-lock { + background-position: -287px -24px; +} +.icon-flag { + background-position: -312px -24px; +} +.icon-headphones { + background-position: -336px -24px; +} +.icon-volume-off { + background-position: -360px -24px; +} +.icon-volume-down { + background-position: -384px -24px; +} +.icon-volume-up { + background-position: -408px -24px; +} +.icon-qrcode { + background-position: -432px -24px; +} +.icon-barcode { + background-position: -456px -24px; +} +.icon-tag { + background-position: 0 -48px; +} +.icon-tags { + background-position: -25px -48px; +} +.icon-book { + background-position: -48px -48px; +} +.icon-bookmark { + background-position: -72px -48px; +} +.icon-print { + background-position: -96px -48px; +} +.icon-camera { + background-position: -120px -48px; +} +.icon-font { + background-position: -144px -48px; +} +.icon-bold { + background-position: -167px -48px; +} +.icon-italic { + background-position: -192px -48px; +} +.icon-text-height { + background-position: -216px -48px; +} +.icon-text-width { + background-position: -240px -48px; +} +.icon-align-left { + background-position: -264px -48px; +} +.icon-align-center { + background-position: -288px -48px; +} +.icon-align-right { + background-position: -312px -48px; +} +.icon-align-justify { + background-position: -336px -48px; +} +.icon-list { + background-position: -360px -48px; +} +.icon-indent-left { + background-position: -384px -48px; +} +.icon-indent-right { + background-position: -408px -48px; +} +.icon-facetime-video { + background-position: -432px -48px; +} +.icon-picture { + background-position: -456px -48px; +} +.icon-pencil { + background-position: 0 -72px; +} +.icon-map-marker { + background-position: -24px -72px; +} +.icon-adjust { + background-position: -48px -72px; +} +.icon-tint { + background-position: -72px -72px; +} +.icon-edit { + background-position: -96px -72px; +} +.icon-share { + background-position: -120px -72px; +} +.icon-check { + background-position: -144px -72px; +} +.icon-move { + background-position: -168px -72px; +} +.icon-step-backward { + background-position: -192px -72px; +} +.icon-fast-backward { + background-position: -216px -72px; +} +.icon-backward { + background-position: -240px -72px; +} +.icon-play { + background-position: -264px -72px; +} +.icon-pause { + background-position: -288px -72px; +} +.icon-stop { + background-position: -312px -72px; +} +.icon-forward { + background-position: -336px -72px; +} +.icon-fast-forward { + background-position: -360px -72px; +} +.icon-step-forward { + background-position: -384px -72px; +} +.icon-eject { + background-position: -408px -72px; +} +.icon-chevron-left { + background-position: -432px -72px; +} +.icon-chevron-right { + background-position: -456px -72px; +} +.icon-plus-sign { + background-position: 0 -96px; +} +.icon-minus-sign { + background-position: -24px -96px; +} +.icon-remove-sign { + background-position: -48px -96px; +} +.icon-ok-sign { + background-position: -72px -96px; +} +.icon-question-sign { + background-position: -96px -96px; +} +.icon-info-sign { + background-position: -120px -96px; +} +.icon-screenshot { + background-position: -144px -96px; +} +.icon-remove-circle { + background-position: -168px -96px; +} +.icon-ok-circle { + background-position: -192px -96px; +} +.icon-ban-circle { + background-position: -216px -96px; +} +.icon-arrow-left { + background-position: -240px -96px; +} +.icon-arrow-right { + background-position: -264px -96px; +} +.icon-arrow-up { + background-position: -289px -96px; +} +.icon-arrow-down { + background-position: -312px -96px; +} +.icon-share-alt { + background-position: -336px -96px; +} +.icon-resize-full { + background-position: -360px -96px; +} +.icon-resize-small { + background-position: -384px -96px; +} +.icon-plus { + background-position: -408px -96px; +} +.icon-minus { + background-position: -433px -96px; +} +.icon-asterisk { + background-position: -456px -96px; +} +.icon-exclamation-sign { + background-position: 0 -120px; +} +.icon-gift { + background-position: -24px -120px; +} +.icon-leaf { + background-position: -48px -120px; +} +.icon-fire { + background-position: -72px -120px; +} +.icon-eye-open { + background-position: -96px -120px; +} +.icon-eye-close { + background-position: -120px -120px; +} +.icon-warning-sign { + background-position: -144px -120px; +} +.icon-plane { + background-position: -168px -120px; +} +.icon-calendar { + background-position: -192px -120px; +} +.icon-random { + background-position: -216px -120px; + width: 16px; +} +.icon-comment { + background-position: -240px -120px; +} +.icon-magnet { + background-position: -264px -120px; +} +.icon-chevron-up { + background-position: -288px -120px; +} +.icon-chevron-down { + background-position: -313px -119px; +} +.icon-retweet { + background-position: -336px -120px; +} +.icon-shopping-cart { + background-position: -360px -120px; +} +.icon-folder-close { + background-position: -384px -120px; + width: 16px; +} +.icon-folder-open { + background-position: -408px -120px; + width: 16px; +} +.icon-resize-vertical { + background-position: -432px -119px; +} +.icon-resize-horizontal { + background-position: -456px -118px; +} +.icon-hdd { + background-position: 0 -144px; +} +.icon-bullhorn { + background-position: -24px -144px; +} +.icon-bell { + background-position: -48px -144px; +} +.icon-certificate { + background-position: -72px -144px; +} +.icon-thumbs-up { + background-position: -96px -144px; +} +.icon-thumbs-down { + background-position: -120px -144px; +} +.icon-hand-right { + background-position: -144px -144px; +} +.icon-hand-left { + background-position: -168px -144px; +} +.icon-hand-up { + background-position: -192px -144px; +} +.icon-hand-down { + background-position: -216px -144px; +} +.icon-circle-arrow-right { + background-position: -240px -144px; +} +.icon-circle-arrow-left { + background-position: -264px -144px; +} +.icon-circle-arrow-up { + background-position: -288px -144px; +} +.icon-circle-arrow-down { + background-position: -312px -144px; +} +.icon-globe { + background-position: -336px -144px; +} +.icon-wrench { + background-position: -360px -144px; +} +.icon-tasks { + background-position: -384px -144px; +} +.icon-filter { + background-position: -408px -144px; +} +.icon-briefcase { + background-position: -432px -144px; +} +.icon-fullscreen { + background-position: -456px -144px; +} +.btn-group { + position: relative; + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + font-size: 0; + vertical-align: middle; + white-space: nowrap; + *margin-left: .3em; +} +.btn-group:first-child { + *margin-left: 0; +} +.btn-group + .btn-group { + margin-left: 5px; +} +.btn-toolbar { + font-size: 0; + margin-top: 10px; + margin-bottom: 10px; +} +.btn-toolbar > .btn + .btn, +.btn-toolbar > .btn-group + .btn, +.btn-toolbar > .btn + .btn-group { + margin-left: 5px; +} +.btn-group > .btn { + position: relative; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group > .btn + .btn { + margin-left: -1px; +} +.btn-group > .btn, +.btn-group > .dropdown-menu, +.btn-group > .popover { + font-size: 13px; +} +.btn-group > .btn-mini { + font-size: 9.75px; +} +.btn-group > .btn-small { + font-size: 11.049999999999999px; +} +.btn-group > .btn-large { + font-size: 16.25px; +} +.btn-group > .btn:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.btn-group > .btn:last-child, +.btn-group > .dropdown-toggle { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.btn-group > .btn.large:first-child { + margin-left: 0; + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.btn-group > .btn.large:last-child, +.btn-group > .large.dropdown-toggle { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.btn-group > .btn:hover, +.btn-group > .btn:focus, +.btn-group > .btn:active, +.btn-group > .btn.active { + z-index: 2; +} +.btn-group .dropdown-toggle:active, +.btn-group.open .dropdown-toggle { + outline: 0; +} +.btn-group > .btn + .dropdown-toggle { + padding-left: 8px; + padding-right: 8px; + -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); + *padding-top: 5px; + *padding-bottom: 5px; +} +.btn-group > .btn-mini + .dropdown-toggle { + padding-left: 5px; + padding-right: 5px; + *padding-top: 2px; + *padding-bottom: 2px; +} +.btn-group > .btn-small + .dropdown-toggle { + *padding-top: 5px; + *padding-bottom: 4px; +} +.btn-group > .btn-large + .dropdown-toggle { + padding-left: 12px; + padding-right: 12px; + *padding-top: 7px; + *padding-bottom: 7px; +} +.btn-group.open .dropdown-toggle { + background-image: none; + -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); + box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); +} +.btn-group.open .btn.dropdown-toggle { + background-color: #e6e6e6; +} +.btn-group.open .btn-primary.dropdown-toggle { + background-color: #0044cc; +} +.btn-group.open .btn-warning.dropdown-toggle { + background-color: #f89406; +} +.btn-group.open .btn-danger.dropdown-toggle { + background-color: #bd362f; +} +.btn-group.open .btn-success.dropdown-toggle { + background-color: #51a351; +} +.btn-group.open .btn-info.dropdown-toggle { + background-color: #2f96b4; +} +.btn-group.open .btn-inverse.dropdown-toggle { + background-color: #222222; +} +.btn .caret { + margin-top: 8px; + margin-left: 0; +} +.btn-large .caret { + margin-top: 6px; +} +.btn-large .caret { + border-left-width: 5px; + border-right-width: 5px; + border-top-width: 5px; +} +.btn-mini .caret, +.btn-small .caret { + margin-top: 8px; +} +.dropup .btn-large .caret { + border-bottom-width: 5px; +} +.btn-primary .caret, +.btn-warning .caret, +.btn-danger .caret, +.btn-info .caret, +.btn-success .caret, +.btn-inverse .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.btn-group-vertical { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; +} +.btn-group-vertical > .btn { + display: block; + float: none; + max-width: 100%; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.btn-group-vertical > .btn + .btn { + margin-left: 0; + margin-top: -1px; +} +.btn-group-vertical > .btn:first-child { + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.btn-group-vertical > .btn:last-child { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.btn-group-vertical > .btn-large:first-child { + -webkit-border-radius: 6px 6px 0 0; + -moz-border-radius: 6px 6px 0 0; + border-radius: 6px 6px 0 0; +} +.btn-group-vertical > .btn-large:last-child { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.nav { + margin-left: 0; + margin-bottom: 20px; + list-style: none; +} +.nav > li > a { + display: block; +} +.nav > li > a:hover, +.nav > li > a:focus { + text-decoration: none; + background-color: #eeeeee; +} +.nav > li > a > img { + max-width: none; +} +.nav > .pull-right { + float: right; +} +.nav-header { + display: block; + padding: 3px 15px; + font-size: 11px; + font-weight: bold; + line-height: 20px; + color: #999999; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + text-transform: uppercase; +} +.nav li + .nav-header { + margin-top: 9px; +} +.nav-list { + padding-left: 15px; + padding-right: 15px; + margin-bottom: 0; +} +.nav-list > li > a, +.nav-list .nav-header { + margin-left: -15px; + margin-right: -15px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); +} +.nav-list > li > a { + padding: 3px 15px; +} +.nav-list > .active > a, +.nav-list > .active > a:hover, +.nav-list > .active > a:focus { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); + background-color: #0088cc; +} +.nav-list [class^="icon-"], +.nav-list [class*=" icon-"] { + margin-right: 2px; +} +.nav-list .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.nav-tabs, +.nav-pills { + *zoom: 1; +} +.nav-tabs:before, +.nav-pills:before, +.nav-tabs:after, +.nav-pills:after { + display: table; + content: ""; + line-height: 0; +} +.nav-tabs:after, +.nav-pills:after { + clear: both; +} +.nav-tabs > li, +.nav-pills > li { + float: left; +} +.nav-tabs > li > a, +.nav-pills > li > a { + padding-right: 12px; + padding-left: 12px; + margin-right: 2px; + line-height: 14px; +} +.nav-tabs { + border-bottom: 1px solid #ddd; +} +.nav-tabs > li { + margin-bottom: -1px; +} +.nav-tabs > li > a { + padding-top: 8px; + padding-bottom: 8px; + line-height: 20px; + border: 1px solid transparent; + -webkit-border-radius: 4px 4px 0 0; + -moz-border-radius: 4px 4px 0 0; + border-radius: 4px 4px 0 0; +} +.nav-tabs > li > a:hover, +.nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #dddddd; +} +.nav-tabs > .active > a, +.nav-tabs > .active > a:hover, +.nav-tabs > .active > a:focus { + color: #555555; + background-color: #ffffff; + border: 1px solid #ddd; + border-bottom-color: transparent; + cursor: default; +} +.nav-pills > li > a { + padding-top: 8px; + padding-bottom: 8px; + margin-top: 2px; + margin-bottom: 2px; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; + border-radius: 5px; +} +.nav-pills > .active > a, +.nav-pills > .active > a:hover, +.nav-pills > .active > a:focus { + color: #ffffff; + background-color: #0088cc; +} +.nav-stacked > li { + float: none; +} +.nav-stacked > li > a { + margin-right: 0; +} +.nav-tabs.nav-stacked { + border-bottom: 0; +} +.nav-tabs.nav-stacked > li > a { + border: 1px solid #ddd; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.nav-tabs.nav-stacked > li:first-child > a { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; +} +.nav-tabs.nav-stacked > li:last-child > a { + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.nav-tabs.nav-stacked > li > a:hover, +.nav-tabs.nav-stacked > li > a:focus { + border-color: #ddd; + z-index: 2; +} +.nav-pills.nav-stacked > li > a { + margin-bottom: 3px; +} +.nav-pills.nav-stacked > li:last-child > a { + margin-bottom: 1px; +} +.nav-tabs .dropdown-menu { + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; +} +.nav-pills .dropdown-menu { + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.nav .dropdown-toggle .caret { + border-top-color: #0088cc; + border-bottom-color: #0088cc; + margin-top: 6px; +} +.nav .dropdown-toggle:hover .caret, +.nav .dropdown-toggle:focus .caret { + border-top-color: #005580; + border-bottom-color: #005580; +} +/* move down carets for tabs */ +.nav-tabs .dropdown-toggle .caret { + margin-top: 8px; +} +.nav .active .dropdown-toggle .caret { + border-top-color: #fff; + border-bottom-color: #fff; +} +.nav-tabs .active .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.nav > .dropdown.active > a:hover, +.nav > .dropdown.active > a:focus { + cursor: pointer; +} +.nav-tabs .open .dropdown-toggle, +.nav-pills .open .dropdown-toggle, +.nav > li.dropdown.open.active > a:hover, +.nav > li.dropdown.open.active > a:focus { + color: #ffffff; + background-color: #999999; + border-color: #999999; +} +.nav li.dropdown.open .caret, +.nav li.dropdown.open.active .caret, +.nav li.dropdown.open a:hover .caret, +.nav li.dropdown.open a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; + opacity: 1; + filter: alpha(opacity=100); +} +.tabs-stacked .open > a:hover, +.tabs-stacked .open > a:focus { + border-color: #999999; +} +.tabbable { + *zoom: 1; +} +.tabbable:before, +.tabbable:after { + display: table; + content: ""; + line-height: 0; +} +.tabbable:after { + clear: both; +} +.tab-content { + overflow: auto; +} +.tabs-below > .nav-tabs, +.tabs-right > .nav-tabs, +.tabs-left > .nav-tabs { + border-bottom: 0; +} +.tab-content > .tab-pane, +.pill-content > .pill-pane { + display: none; +} +.tab-content > .active, +.pill-content > .active { + display: block; +} +.tabs-below > .nav-tabs { + border-top: 1px solid #ddd; +} +.tabs-below > .nav-tabs > li { + margin-top: -1px; + margin-bottom: 0; +} +.tabs-below > .nav-tabs > li > a { + -webkit-border-radius: 0 0 4px 4px; + -moz-border-radius: 0 0 4px 4px; + border-radius: 0 0 4px 4px; +} +.tabs-below > .nav-tabs > li > a:hover, +.tabs-below > .nav-tabs > li > a:focus { + border-bottom-color: transparent; + border-top-color: #ddd; +} +.tabs-below > .nav-tabs > .active > a, +.tabs-below > .nav-tabs > .active > a:hover, +.tabs-below > .nav-tabs > .active > a:focus { + border-color: transparent #ddd #ddd #ddd; +} +.tabs-left > .nav-tabs > li, +.tabs-right > .nav-tabs > li { + float: none; +} +.tabs-left > .nav-tabs > li > a, +.tabs-right > .nav-tabs > li > a { + min-width: 74px; + margin-right: 0; + margin-bottom: 3px; +} +.tabs-left > .nav-tabs { + float: left; + margin-right: 19px; + border-right: 1px solid #ddd; +} +.tabs-left > .nav-tabs > li > a { + margin-right: -1px; + -webkit-border-radius: 4px 0 0 4px; + -moz-border-radius: 4px 0 0 4px; + border-radius: 4px 0 0 4px; +} +.tabs-left > .nav-tabs > li > a:hover, +.tabs-left > .nav-tabs > li > a:focus { + border-color: #eeeeee #dddddd #eeeeee #eeeeee; +} +.tabs-left > .nav-tabs .active > a, +.tabs-left > .nav-tabs .active > a:hover, +.tabs-left > .nav-tabs .active > a:focus { + border-color: #ddd transparent #ddd #ddd; + *border-right-color: #ffffff; +} +.tabs-right > .nav-tabs { + float: right; + margin-left: 19px; + border-left: 1px solid #ddd; +} +.tabs-right > .nav-tabs > li > a { + margin-left: -1px; + -webkit-border-radius: 0 4px 4px 0; + -moz-border-radius: 0 4px 4px 0; + border-radius: 0 4px 4px 0; +} +.tabs-right > .nav-tabs > li > a:hover, +.tabs-right > .nav-tabs > li > a:focus { + border-color: #eeeeee #eeeeee #eeeeee #dddddd; +} +.tabs-right > .nav-tabs .active > a, +.tabs-right > .nav-tabs .active > a:hover, +.tabs-right > .nav-tabs .active > a:focus { + border-color: #ddd #ddd #ddd transparent; + *border-left-color: #ffffff; +} +.nav > .disabled > a { + color: #999999; +} +.nav > .disabled > a:hover, +.nav > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + cursor: default; +} +.navbar { + overflow: visible; + margin-bottom: 20px; + *position: relative; + *z-index: 2; +} +.navbar-inner { + min-height: 40px; + padding-left: 20px; + padding-right: 20px; + background-color: #fafafa; + background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); + background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); + background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); + background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); + border: 1px solid #d4d4d4; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); + *zoom: 1; +} +.navbar-inner:before, +.navbar-inner:after { + display: table; + content: ""; + line-height: 0; +} +.navbar-inner:after { + clear: both; +} +.navbar .container { + width: auto; +} +.nav-collapse.collapse { + height: auto; + overflow: visible; +} +.navbar .brand { + float: left; + display: block; + padding: 10px 20px 10px; + margin-left: -20px; + font-size: 20px; + font-weight: 200; + color: #777777; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .brand:hover, +.navbar .brand:focus { + text-decoration: none; +} +.navbar-text { + margin-bottom: 0; + line-height: 40px; + color: #777777; +} +.navbar-link { + color: #777777; +} +.navbar-link:hover, +.navbar-link:focus { + color: #333333; +} +.navbar .divider-vertical { + height: 40px; + margin: 0 9px; + border-left: 1px solid #f2f2f2; + border-right: 1px solid #ffffff; +} +.navbar .btn, +.navbar .btn-group { + margin-top: 5px; +} +.navbar .btn-group .btn, +.navbar .input-prepend .btn, +.navbar .input-append .btn, +.navbar .input-prepend .btn-group, +.navbar .input-append .btn-group { + margin-top: 0; +} +.navbar-form { + margin-bottom: 0; + *zoom: 1; +} +.navbar-form:before, +.navbar-form:after { + display: table; + content: ""; + line-height: 0; +} +.navbar-form:after { + clear: both; +} +.navbar-form input, +.navbar-form select, +.navbar-form .radio, +.navbar-form .checkbox { + margin-top: 5px; +} +.navbar-form input, +.navbar-form select, +.navbar-form .btn { + display: inline-block; + margin-bottom: 0; +} +.navbar-form input[type="image"], +.navbar-form input[type="checkbox"], +.navbar-form input[type="radio"] { + margin-top: 3px; +} +.navbar-form .input-append, +.navbar-form .input-prepend { + margin-top: 5px; + white-space: nowrap; +} +.navbar-form .input-append input, +.navbar-form .input-prepend input { + margin-top: 0; +} +.navbar-search { + position: relative; + float: left; + margin-top: 5px; + margin-bottom: 0; +} +.navbar-search .search-query { + margin-bottom: 0; + padding: 4px 14px; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 13px; + font-weight: normal; + line-height: 1; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.navbar-static-top { + position: static; + margin-bottom: 0; +} +.navbar-static-top .navbar-inner { + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-fixed-top, +.navbar-fixed-bottom { + position: fixed; + right: 0; + left: 0; + z-index: 1030; + margin-bottom: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + border-width: 0 0 1px; +} +.navbar-fixed-bottom .navbar-inner { + border-width: 1px 0 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-fixed-bottom .navbar-inner { + padding-left: 0; + padding-right: 0; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; +} +.navbar-static-top .container, +.navbar-fixed-top .container, +.navbar-fixed-bottom .container { + width: 940px; +} +.navbar-fixed-top { + top: 0; +} +.navbar-fixed-top .navbar-inner, +.navbar-static-top .navbar-inner { + -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); + -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); + box-shadow: 0 1px 10px rgba(0,0,0,.1); +} +.navbar-fixed-bottom { + bottom: 0; +} +.navbar-fixed-bottom .navbar-inner { + -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); + -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); + box-shadow: 0 -1px 10px rgba(0,0,0,.1); +} +.navbar .nav { + position: relative; + left: 0; + display: block; + float: left; + margin: 0 10px 0 0; +} +.navbar .nav.pull-right { + float: right; + margin-right: 0; +} +.navbar .nav > li { + float: left; +} +.navbar .nav > li > a { + float: none; + padding: 10px 15px 10px; + color: #777777; + text-decoration: none; + text-shadow: 0 1px 0 #ffffff; +} +.navbar .nav .dropdown-toggle .caret { + margin-top: 8px; +} +.navbar .nav > li > a:focus, +.navbar .nav > li > a:hover { + background-color: transparent; + color: #333333; + text-decoration: none; +} +.navbar .nav > .active > a, +.navbar .nav > .active > a:hover, +.navbar .nav > .active > a:focus { + color: #555555; + text-decoration: none; + background-color: #e5e5e5; + -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); + box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); +} +.navbar .btn-navbar { + display: none; + float: right; + padding: 7px 10px; + margin-left: 5px; + margin-right: 5px; + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #ededed; + background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); + background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); + background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); + border-color: #e5e5e5 #e5e5e5 #bfbfbf; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #e5e5e5; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); +} +.navbar .btn-navbar:hover, +.navbar .btn-navbar:focus, +.navbar .btn-navbar:active, +.navbar .btn-navbar.active, +.navbar .btn-navbar.disabled, +.navbar .btn-navbar[disabled] { + color: #ffffff; + background-color: #e5e5e5; + *background-color: #d9d9d9; +} +.navbar .btn-navbar:active, +.navbar .btn-navbar.active { + background-color: #cccccc \9; +} +.navbar .btn-navbar .icon-bar { + display: block; + width: 18px; + height: 2px; + background-color: #f5f5f5; + -webkit-border-radius: 1px; + -moz-border-radius: 1px; + border-radius: 1px; + -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); + box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); +} +.btn-navbar .icon-bar + .icon-bar { + margin-top: 3px; +} +.navbar .nav > li > .dropdown-menu:before { + content: ''; + display: inline-block; + border-left: 7px solid transparent; + border-right: 7px solid transparent; + border-bottom: 7px solid #ccc; + border-bottom-color: rgba(0, 0, 0, 0.2); + position: absolute; + top: -7px; + left: 9px; +} +.navbar .nav > li > .dropdown-menu:after { + content: ''; + display: inline-block; + border-left: 6px solid transparent; + border-right: 6px solid transparent; + border-bottom: 6px solid #ffffff; + position: absolute; + top: -6px; + left: 10px; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:before { + border-top: 7px solid #ccc; + border-top-color: rgba(0, 0, 0, 0.2); + border-bottom: 0; + bottom: -7px; + top: auto; +} +.navbar-fixed-bottom .nav > li > .dropdown-menu:after { + border-top: 6px solid #ffffff; + border-bottom: 0; + bottom: -6px; + top: auto; +} +.navbar .nav li.dropdown > a:hover .caret, +.navbar .nav li.dropdown > a:focus .caret { + border-top-color: #333333; + border-bottom-color: #333333; +} +.navbar .nav li.dropdown.open > .dropdown-toggle, +.navbar .nav li.dropdown.active > .dropdown-toggle, +.navbar .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #e5e5e5; + color: #555555; +} +.navbar .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #777777; + border-bottom-color: #777777; +} +.navbar .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #555555; + border-bottom-color: #555555; +} +.navbar .pull-right > li > .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right { + left: auto; + right: 0; +} +.navbar .pull-right > li > .dropdown-menu:before, +.navbar .nav > li > .dropdown-menu.pull-right:before { + left: auto; + right: 12px; +} +.navbar .pull-right > li > .dropdown-menu:after, +.navbar .nav > li > .dropdown-menu.pull-right:after { + left: auto; + right: 13px; +} +.navbar .pull-right > li > .dropdown-menu .dropdown-menu, +.navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { + left: auto; + right: 100%; + margin-left: 0; + margin-right: -1px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} +.navbar-inverse .navbar-inner { + background-color: #1b1b1b; + background-image: -moz-linear-gradient(top, #222222, #111111); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); + background-image: -webkit-linear-gradient(top, #222222, #111111); + background-image: -o-linear-gradient(top, #222222, #111111); + background-image: linear-gradient(to bottom, #222222, #111111); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); + border-color: #252525; +} +.navbar-inverse .brand, +.navbar-inverse .nav > li > a { + color: #999999; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); +} +.navbar-inverse .brand:hover, +.navbar-inverse .nav > li > a:hover, +.navbar-inverse .brand:focus, +.navbar-inverse .nav > li > a:focus { + color: #ffffff; +} +.navbar-inverse .brand { + color: #999999; +} +.navbar-inverse .navbar-text { + color: #999999; +} +.navbar-inverse .nav > li > a:focus, +.navbar-inverse .nav > li > a:hover { + background-color: transparent; + color: #ffffff; +} +.navbar-inverse .nav .active > a, +.navbar-inverse .nav .active > a:hover, +.navbar-inverse .nav .active > a:focus { + color: #ffffff; + background-color: #111111; +} +.navbar-inverse .navbar-link { + color: #999999; +} +.navbar-inverse .navbar-link:hover, +.navbar-inverse .navbar-link:focus { + color: #ffffff; +} +.navbar-inverse .divider-vertical { + border-left-color: #111111; + border-right-color: #222222; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { + background-color: #111111; + color: #ffffff; +} +.navbar-inverse .nav li.dropdown > a:hover .caret, +.navbar-inverse .nav li.dropdown > a:focus .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { + border-top-color: #999999; + border-bottom-color: #999999; +} +.navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, +.navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { + border-top-color: #ffffff; + border-bottom-color: #ffffff; +} +.navbar-inverse .navbar-search .search-query { + color: #ffffff; + background-color: #515151; + border-color: #111111; + -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); + -webkit-transition: none; + -moz-transition: none; + -o-transition: none; + transition: none; +} +.navbar-inverse .navbar-search .search-query:-moz-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { + color: #cccccc; +} +.navbar-inverse .navbar-search .search-query:focus, +.navbar-inverse .navbar-search .search-query.focused { + padding: 5px 15px; + color: #333333; + text-shadow: 0 1px 0 #ffffff; + background-color: #ffffff; + border: 0; + -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); + outline: 0; +} +.navbar-inverse .btn-navbar { + color: #ffffff; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e0e0e; + background-image: -moz-linear-gradient(top, #151515, #040404); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); + background-image: -webkit-linear-gradient(top, #151515, #040404); + background-image: -o-linear-gradient(top, #151515, #040404); + background-image: linear-gradient(to bottom, #151515, #040404); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); + border-color: #040404 #040404 #000000; + border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); + *background-color: #040404; + /* Darken IE7 buttons by default so they stand out more given they won't have borders */ + + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); +} +.navbar-inverse .btn-navbar:hover, +.navbar-inverse .btn-navbar:focus, +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active, +.navbar-inverse .btn-navbar.disabled, +.navbar-inverse .btn-navbar[disabled] { + color: #ffffff; + background-color: #040404; + *background-color: #000000; +} +.navbar-inverse .btn-navbar:active, +.navbar-inverse .btn-navbar.active { + background-color: #000000 \9; +} +.breadcrumb { + padding: 8px 15px; + margin: 0 0 20px; + list-style: none; + background-color: #f5f5f5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.breadcrumb > li { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + text-shadow: 0 1px 0 #ffffff; +} +.breadcrumb > li > .divider { + padding: 0 5px; + color: #ccc; +} +.breadcrumb > .active { + color: #999999; +} +.pagination { + margin: 20px 0; +} +.pagination ul { + display: inline-block; + *display: inline; + /* IE7 inline-block hack */ + + *zoom: 1; + margin-left: 0; + margin-bottom: 0; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); + box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); +} +.pagination ul > li { + display: inline; +} +.pagination ul > li > a, +.pagination ul > li > span { + float: left; + padding: 4px 12px; + line-height: 20px; + text-decoration: none; + background-color: #ffffff; + border: 1px solid #dddddd; + border-left-width: 0; +} +.pagination ul > li > a:hover, +.pagination ul > li > a:focus, +.pagination ul > .active > a, +.pagination ul > .active > span { + background-color: #f5f5f5; +} +.pagination ul > .active > a, +.pagination ul > .active > span { + color: #999999; + cursor: default; +} +.pagination ul > .disabled > span, +.pagination ul > .disabled > a, +.pagination ul > .disabled > a:hover, +.pagination ul > .disabled > a:focus { + color: #999999; + background-color: transparent; + cursor: default; +} +.pagination ul > li:first-child > a, +.pagination ul > li:first-child > span { + border-left-width: 1px; + -webkit-border-top-left-radius: 4px; + -moz-border-radius-topleft: 4px; + border-top-left-radius: 4px; + -webkit-border-bottom-left-radius: 4px; + -moz-border-radius-bottomleft: 4px; + border-bottom-left-radius: 4px; +} +.pagination ul > li:last-child > a, +.pagination ul > li:last-child > span { + -webkit-border-top-right-radius: 4px; + -moz-border-radius-topright: 4px; + border-top-right-radius: 4px; + -webkit-border-bottom-right-radius: 4px; + -moz-border-radius-bottomright: 4px; + border-bottom-right-radius: 4px; +} +.pagination-centered { + text-align: center; +} +.pagination-right { + text-align: right; +} +.pagination-large ul > li > a, +.pagination-large ul > li > span { + padding: 11px 19px; + font-size: 16.25px; +} +.pagination-large ul > li:first-child > a, +.pagination-large ul > li:first-child > span { + -webkit-border-top-left-radius: 6px; + -moz-border-radius-topleft: 6px; + border-top-left-radius: 6px; + -webkit-border-bottom-left-radius: 6px; + -moz-border-radius-bottomleft: 6px; + border-bottom-left-radius: 6px; +} +.pagination-large ul > li:last-child > a, +.pagination-large ul > li:last-child > span { + -webkit-border-top-right-radius: 6px; + -moz-border-radius-topright: 6px; + border-top-right-radius: 6px; + -webkit-border-bottom-right-radius: 6px; + -moz-border-radius-bottomright: 6px; + border-bottom-right-radius: 6px; +} +.pagination-mini ul > li:first-child > a, +.pagination-small ul > li:first-child > a, +.pagination-mini ul > li:first-child > span, +.pagination-small ul > li:first-child > span { + -webkit-border-top-left-radius: 3px; + -moz-border-radius-topleft: 3px; + border-top-left-radius: 3px; + -webkit-border-bottom-left-radius: 3px; + -moz-border-radius-bottomleft: 3px; + border-bottom-left-radius: 3px; +} +.pagination-mini ul > li:last-child > a, +.pagination-small ul > li:last-child > a, +.pagination-mini ul > li:last-child > span, +.pagination-small ul > li:last-child > span { + -webkit-border-top-right-radius: 3px; + -moz-border-radius-topright: 3px; + border-top-right-radius: 3px; + -webkit-border-bottom-right-radius: 3px; + -moz-border-radius-bottomright: 3px; + border-bottom-right-radius: 3px; +} +.pagination-small ul > li > a, +.pagination-small ul > li > span { + padding: 2px 10px; + font-size: 11.049999999999999px; +} +.pagination-mini ul > li > a, +.pagination-mini ul > li > span { + padding: 0 6px; + font-size: 9.75px; +} +.pager { + margin: 20px 0; + list-style: none; + text-align: center; + *zoom: 1; +} +.pager:before, +.pager:after { + display: table; + content: ""; + line-height: 0; +} +.pager:after { + clear: both; +} +.pager li { + display: inline; +} +.pager li > a, +.pager li > span { + display: inline-block; + padding: 5px 14px; + background-color: #fff; + border: 1px solid #ddd; + -webkit-border-radius: 15px; + -moz-border-radius: 15px; + border-radius: 15px; +} +.pager li > a:hover, +.pager li > a:focus { + text-decoration: none; + background-color: #f5f5f5; +} +.pager .next > a, +.pager .next > span { + float: right; +} +.pager .previous > a, +.pager .previous > span { + float: left; +} +.pager .disabled > a, +.pager .disabled > a:hover, +.pager .disabled > a:focus, +.pager .disabled > span { + color: #999999; + background-color: #fff; + cursor: default; +} +.thumbnails { + margin-left: -20px; + list-style: none; + *zoom: 1; +} +.thumbnails:before, +.thumbnails:after { + display: table; + content: ""; + line-height: 0; +} +.thumbnails:after { + clear: both; +} +.row-fluid .thumbnails { + margin-left: 0; +} +.thumbnails > li { + float: left; + margin-bottom: 20px; + margin-left: 20px; +} +.thumbnail { + display: block; + padding: 4px; + line-height: 20px; + border: 1px solid #ddd; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); + -webkit-transition: all 0.2s ease-in-out; + -moz-transition: all 0.2s ease-in-out; + -o-transition: all 0.2s ease-in-out; + transition: all 0.2s ease-in-out; +} +a.thumbnail:hover, +a.thumbnail:focus { + border-color: #0088cc; + -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); + box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); +} +.thumbnail > img { + display: block; + max-width: 100%; + margin-left: auto; + margin-right: auto; +} +.thumbnail .caption { + padding: 9px; + color: #555555; +} +.alert { + padding: 8px 35px 8px 14px; + margin-bottom: 20px; + text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); + background-color: #fcf8e3; + border: 1px solid #fbeed5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.alert, +.alert h4 { + color: #c09853; +} +.alert h4 { + margin: 0; +} +.alert .close { + position: relative; + top: -2px; + right: -21px; + line-height: 20px; +} +.alert-success { + background-color: #dff0d8; + border-color: #d6e9c6; + color: #468847; +} +.alert-success h4 { + color: #468847; +} +.alert-danger, +.alert-error { + background-color: #f2dede; + border-color: #eed3d7; + color: #b94a48; +} +.alert-danger h4, +.alert-error h4 { + color: #b94a48; +} +.alert-info { + background-color: #d9edf7; + border-color: #bce8f1; + color: #3a87ad; +} +.alert-info h4 { + color: #3a87ad; +} +.alert-block { + padding-top: 14px; + padding-bottom: 14px; +} +.alert-block > p, +.alert-block > ul { + margin-bottom: 0; +} +.alert-block p + p { + margin-top: 5px; +} +@-webkit-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-moz-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-ms-keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +@-o-keyframes progress-bar-stripes { + from { + background-position: 0 0; + } + to { + background-position: 40px 0; + } +} +@keyframes progress-bar-stripes { + from { + background-position: 40px 0; + } + to { + background-position: 0 0; + } +} +.progress { + overflow: hidden; + height: 20px; + margin-bottom: 20px; + background-color: #f7f7f7; + background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); + background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); + background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); + -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.progress .bar { + width: 0%; + height: 100%; + color: #ffffff; + float: left; + font-size: 12px; + text-align: center; + text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); + background-color: #0e90d2; + background-image: -moz-linear-gradient(top, #149bdf, #0480be); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); + background-image: -webkit-linear-gradient(top, #149bdf, #0480be); + background-image: -o-linear-gradient(top, #149bdf, #0480be); + background-image: linear-gradient(to bottom, #149bdf, #0480be); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); + -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + -webkit-transition: width 0.6s ease; + -moz-transition: width 0.6s ease; + -o-transition: width 0.6s ease; + transition: width 0.6s ease; +} +.progress .bar + .bar { + -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); + box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); +} +.progress-striped .bar { + background-color: #149bdf; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + -webkit-background-size: 40px 40px; + -moz-background-size: 40px 40px; + -o-background-size: 40px 40px; + background-size: 40px 40px; +} +.progress.active .bar { + -webkit-animation: progress-bar-stripes 2s linear infinite; + -moz-animation: progress-bar-stripes 2s linear infinite; + -ms-animation: progress-bar-stripes 2s linear infinite; + -o-animation: progress-bar-stripes 2s linear infinite; + animation: progress-bar-stripes 2s linear infinite; +} +.progress-danger .bar, +.progress .bar-danger { + background-color: #dd514c; + background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); + background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); + background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); + background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); +} +.progress-danger.progress-striped .bar, +.progress-striped .bar-danger { + background-color: #ee5f5b; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-success .bar, +.progress .bar-success { + background-color: #5eb95e; + background-image: -moz-linear-gradient(top, #62c462, #57a957); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); + background-image: -webkit-linear-gradient(top, #62c462, #57a957); + background-image: -o-linear-gradient(top, #62c462, #57a957); + background-image: linear-gradient(to bottom, #62c462, #57a957); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); +} +.progress-success.progress-striped .bar, +.progress-striped .bar-success { + background-color: #62c462; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-info .bar, +.progress .bar-info { + background-color: #4bb1cf; + background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); + background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); + background-image: -o-linear-gradient(top, #5bc0de, #339bb9); + background-image: linear-gradient(to bottom, #5bc0de, #339bb9); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); +} +.progress-info.progress-striped .bar, +.progress-striped .bar-info { + background-color: #5bc0de; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.progress-warning .bar, +.progress .bar-warning { + background-color: #faa732; + background-image: -moz-linear-gradient(top, #fbb450, #f89406); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); + background-image: -webkit-linear-gradient(top, #fbb450, #f89406); + background-image: -o-linear-gradient(top, #fbb450, #f89406); + background-image: linear-gradient(to bottom, #fbb450, #f89406); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); +} +.progress-warning.progress-striped .bar, +.progress-striped .bar-warning { + background-color: #fbb450; + background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); + background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); + background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); +} +.hero-unit { + padding: 60px; + margin-bottom: 30px; + font-size: 18px; + font-weight: 200; + line-height: 30px; + color: inherit; + background-color: #eeeeee; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.hero-unit h1 { + margin-bottom: 0; + font-size: 60px; + line-height: 1; + color: inherit; + letter-spacing: -1px; +} +.hero-unit li { + line-height: 30px; +} +.media, +.media-body { + overflow: hidden; + *overflow: visible; + zoom: 1; +} +.media, +.media .media { + margin-top: 15px; +} +.media:first-child { + margin-top: 0; +} +.media-object { + display: block; +} +.media-heading { + margin: 0 0 5px; +} +.media > .pull-left { + margin-right: 10px; +} +.media > .pull-right { + margin-left: 10px; +} +.media-list { + margin-left: 0; + list-style: none; +} +.tooltip { + position: absolute; + z-index: 1030; + display: block; + visibility: visible; + font-size: 11px; + line-height: 1.4; + opacity: 0; + filter: alpha(opacity=0); +} +.tooltip.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.tooltip.top { + margin-top: -3px; + padding: 5px 0; +} +.tooltip.right { + margin-left: 3px; + padding: 0 5px; +} +.tooltip.bottom { + margin-top: 3px; + padding: 5px 0; +} +.tooltip.left { + margin-left: -3px; + padding: 0 5px; +} +.tooltip-inner { + max-width: 200px; + padding: 8px; + color: #ffffff; + text-align: center; + text-decoration: none; + background-color: #000000; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.tooltip-arrow { + position: absolute; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.tooltip.top .tooltip-arrow { + bottom: 0; + left: 50%; + margin-left: -5px; + border-width: 5px 5px 0; + border-top-color: #000000; +} +.tooltip.right .tooltip-arrow { + top: 50%; + left: 0; + margin-top: -5px; + border-width: 5px 5px 5px 0; + border-right-color: #000000; +} +.tooltip.left .tooltip-arrow { + top: 50%; + right: 0; + margin-top: -5px; + border-width: 5px 0 5px 5px; + border-left-color: #000000; +} +.tooltip.bottom .tooltip-arrow { + top: 0; + left: 50%; + margin-left: -5px; + border-width: 0 5px 5px; + border-bottom-color: #000000; +} +.popover { + position: absolute; + top: 0; + left: 0; + z-index: 1010; + display: none; + max-width: 276px; + padding: 1px; + text-align: left; + background-color: #ffffff; + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + white-space: normal; +} +.popover.top { + margin-top: -10px; +} +.popover.right { + margin-left: 10px; +} +.popover.bottom { + margin-top: 10px; +} +.popover.left { + margin-left: -10px; +} +.popover-title { + margin: 0; + padding: 8px 14px; + font-size: 14px; + font-weight: normal; + line-height: 18px; + background-color: #f7f7f7; + border-bottom: 1px solid #ebebeb; + -webkit-border-radius: 5px 5px 0 0; + -moz-border-radius: 5px 5px 0 0; + border-radius: 5px 5px 0 0; +} +.popover-title:empty { + display: none; +} +.popover-content { + padding: 9px 14px; +} +.popover .arrow, +.popover .arrow:after { + position: absolute; + display: block; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; +} +.popover .arrow { + border-width: 11px; +} +.popover .arrow:after { + border-width: 10px; + content: ""; +} +.popover.top .arrow { + left: 50%; + margin-left: -11px; + border-bottom-width: 0; + border-top-color: #999; + border-top-color: rgba(0, 0, 0, 0.25); + bottom: -11px; +} +.popover.top .arrow:after { + bottom: 1px; + margin-left: -10px; + border-bottom-width: 0; + border-top-color: #ffffff; +} +.popover.right .arrow { + top: 50%; + left: -11px; + margin-top: -11px; + border-left-width: 0; + border-right-color: #999; + border-right-color: rgba(0, 0, 0, 0.25); +} +.popover.right .arrow:after { + left: 1px; + bottom: -10px; + border-left-width: 0; + border-right-color: #ffffff; +} +.popover.bottom .arrow { + left: 50%; + margin-left: -11px; + border-top-width: 0; + border-bottom-color: #999; + border-bottom-color: rgba(0, 0, 0, 0.25); + top: -11px; +} +.popover.bottom .arrow:after { + top: 1px; + margin-left: -10px; + border-top-width: 0; + border-bottom-color: #ffffff; +} +.popover.left .arrow { + top: 50%; + right: -11px; + margin-top: -11px; + border-right-width: 0; + border-left-color: #999; + border-left-color: rgba(0, 0, 0, 0.25); +} +.popover.left .arrow:after { + right: 1px; + border-right-width: 0; + border-left-color: #ffffff; + bottom: -10px; +} +.modal-backdrop { + position: fixed; + top: 0; + right: 0; + bottom: 0; + left: 0; + z-index: 1040; + background-color: #000000; +} +.modal-backdrop.fade { + opacity: 0; +} +.modal-backdrop, +.modal-backdrop.fade.in { + opacity: 0.8; + filter: alpha(opacity=80); +} +.modal { + position: fixed; + top: 10%; + left: 50%; + z-index: 1050; + width: 560px; + margin-left: -280px; + background-color: #ffffff; + border: 1px solid #999; + border: 1px solid rgba(0, 0, 0, 0.3); + *border: 1px solid #999; + /* IE6-7 */ + + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); + -webkit-background-clip: padding-box; + -moz-background-clip: padding-box; + background-clip: padding-box; + outline: none; +} +.modal.fade { + -webkit-transition: opacity .3s linear, top .3s ease-out; + -moz-transition: opacity .3s linear, top .3s ease-out; + -o-transition: opacity .3s linear, top .3s ease-out; + transition: opacity .3s linear, top .3s ease-out; + top: -25%; +} +.modal.fade.in { + top: 10%; +} +.modal-header { + padding: 9px 15px; + border-bottom: 1px solid #eee; +} +.modal-header .close { + margin-top: 2px; +} +.modal-header h3 { + margin: 0; + line-height: 30px; +} +.modal-body { + position: relative; + overflow-y: auto; + max-height: 400px; + padding: 15px; +} +.modal-form { + margin-bottom: 0; +} +.modal-footer { + padding: 14px 15px 15px; + margin-bottom: 0; + text-align: right; + background-color: #f5f5f5; + border-top: 1px solid #ddd; + -webkit-border-radius: 0 0 6px 6px; + -moz-border-radius: 0 0 6px 6px; + border-radius: 0 0 6px 6px; + -webkit-box-shadow: inset 0 1px 0 #ffffff; + -moz-box-shadow: inset 0 1px 0 #ffffff; + box-shadow: inset 0 1px 0 #ffffff; + *zoom: 1; +} +.modal-footer:before, +.modal-footer:after { + display: table; + content: ""; + line-height: 0; +} +.modal-footer:after { + clear: both; +} +.modal-footer .btn + .btn { + margin-left: 5px; + margin-bottom: 0; +} +.modal-footer .btn-group .btn + .btn { + margin-left: -1px; +} +.modal-footer .btn-block + .btn-block { + margin-left: 0; +} +.dropup, +.dropdown { + position: relative; +} +.dropdown-toggle { + *margin-bottom: -3px; +} +.dropdown-toggle:active, +.open .dropdown-toggle { + outline: 0; +} +.caret { + display: inline-block; + width: 0; + height: 0; + vertical-align: top; + border-top: 4px solid #000000; + border-right: 4px solid transparent; + border-left: 4px solid transparent; + content: ""; +} +.dropdown .caret { + margin-top: 8px; + margin-left: 2px; +} +.dropdown-menu { + position: absolute; + top: 100%; + left: 0; + z-index: 1000; + display: none; + float: left; + min-width: 160px; + padding: 5px 0; + margin: 2px 0 0; + list-style: none; + background-color: #ffffff; + border: 1px solid #ccc; + border: 1px solid rgba(0, 0, 0, 0.2); + *border-right-width: 2px; + *border-bottom-width: 2px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; + -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); + -webkit-background-clip: padding-box; + -moz-background-clip: padding; + background-clip: padding-box; +} +.dropdown-menu.pull-right { + right: 0; + left: auto; +} +.dropdown-menu .divider { + *width: 100%; + height: 1px; + margin: 9px 1px; + *margin: -5px 0 5px; + overflow: hidden; + background-color: #e5e5e5; + border-bottom: 1px solid #ffffff; +} +.dropdown-menu > li > a { + display: block; + padding: 3px 20px; + clear: both; + font-weight: normal; + line-height: 20px; + color: #333333; + white-space: nowrap; +} +.dropdown-menu > li > a:hover, +.dropdown-menu > li > a:focus, +.dropdown-submenu:hover > a, +.dropdown-submenu:focus > a { + text-decoration: none; + color: #ffffff; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu > .active > a, +.dropdown-menu > .active > a:hover, +.dropdown-menu > .active > a:focus { + color: #ffffff; + text-decoration: none; + outline: 0; + background-color: #0081c2; + background-image: -moz-linear-gradient(top, #0088cc, #0077b3); + background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); + background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); + background-image: -o-linear-gradient(top, #0088cc, #0077b3); + background-image: linear-gradient(to bottom, #0088cc, #0077b3); + background-repeat: repeat-x; + filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); +} +.dropdown-menu > .disabled > a, +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + color: #999999; +} +.dropdown-menu > .disabled > a:hover, +.dropdown-menu > .disabled > a:focus { + text-decoration: none; + background-color: transparent; + background-image: none; + filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); + cursor: default; +} +.open { + *z-index: 1000; +} +.open > .dropdown-menu { + display: block; +} +.dropdown-backdrop { + position: fixed; + left: 0; + right: 0; + bottom: 0; + top: 0; + z-index: 990; +} +.pull-right > .dropdown-menu { + right: 0; + left: auto; +} +.dropup .caret, +.navbar-fixed-bottom .dropdown .caret { + border-top: 0; + border-bottom: 4px solid #000000; + content: ""; +} +.dropup .dropdown-menu, +.navbar-fixed-bottom .dropdown .dropdown-menu { + top: auto; + bottom: 100%; + margin-bottom: 1px; +} +.dropdown-submenu { + position: relative; +} +.dropdown-submenu > .dropdown-menu { + top: 0; + left: 100%; + margin-top: -6px; + margin-left: -1px; + -webkit-border-radius: 0 6px 6px 6px; + -moz-border-radius: 0 6px 6px 6px; + border-radius: 0 6px 6px 6px; +} +.dropdown-submenu:hover > .dropdown-menu { + display: block; +} +.dropup .dropdown-submenu > .dropdown-menu { + top: auto; + bottom: 0; + margin-top: 0; + margin-bottom: -2px; + -webkit-border-radius: 5px 5px 5px 0; + -moz-border-radius: 5px 5px 5px 0; + border-radius: 5px 5px 5px 0; +} +.dropdown-submenu > a:after { + display: block; + content: " "; + float: right; + width: 0; + height: 0; + border-color: transparent; + border-style: solid; + border-width: 5px 0 5px 5px; + border-left-color: #cccccc; + margin-top: 5px; + margin-right: -10px; +} +.dropdown-submenu:hover > a:after { + border-left-color: #ffffff; +} +.dropdown-submenu.pull-left { + float: none; +} +.dropdown-submenu.pull-left > .dropdown-menu { + left: -100%; + margin-left: 10px; + -webkit-border-radius: 6px 0 6px 6px; + -moz-border-radius: 6px 0 6px 6px; + border-radius: 6px 0 6px 6px; +} +.dropdown .dropdown-menu .nav-header { + padding-left: 20px; + padding-right: 20px; +} +.typeahead { + z-index: 1051; + margin-top: 2px; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion { + margin-bottom: 20px; +} +.accordion-group { + margin-bottom: 2px; + border: 1px solid #e5e5e5; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; +} +.accordion-heading { + border-bottom: 0; +} +.accordion-heading .accordion-toggle { + display: block; + padding: 8px 15px; +} +.accordion-toggle { + cursor: pointer; +} +.accordion-inner { + padding: 9px 15px; + border-top: 1px solid #e5e5e5; +} +.carousel { + position: relative; + margin-bottom: 20px; + line-height: 1; +} +.carousel-inner { + overflow: hidden; + width: 100%; + position: relative; +} +.carousel-inner > .item { + display: none; + position: relative; + -webkit-transition: 0.6s ease-in-out left; + -moz-transition: 0.6s ease-in-out left; + -o-transition: 0.6s ease-in-out left; + transition: 0.6s ease-in-out left; +} +.carousel-inner > .item > img, +.carousel-inner > .item > a > img { + display: block; + line-height: 1; +} +.carousel-inner > .active, +.carousel-inner > .next, +.carousel-inner > .prev { + display: block; +} +.carousel-inner > .active { + left: 0; +} +.carousel-inner > .next, +.carousel-inner > .prev { + position: absolute; + top: 0; + width: 100%; +} +.carousel-inner > .next { + left: 100%; +} +.carousel-inner > .prev { + left: -100%; +} +.carousel-inner > .next.left, +.carousel-inner > .prev.right { + left: 0; +} +.carousel-inner > .active.left { + left: -100%; +} +.carousel-inner > .active.right { + left: 100%; +} +.carousel-control { + position: absolute; + top: 40%; + left: 15px; + width: 40px; + height: 40px; + margin-top: -20px; + font-size: 60px; + font-weight: 100; + line-height: 30px; + color: #ffffff; + text-align: center; + background: #222222; + border: 3px solid #ffffff; + -webkit-border-radius: 23px; + -moz-border-radius: 23px; + border-radius: 23px; + opacity: 0.5; + filter: alpha(opacity=50); +} +.carousel-control.right { + left: auto; + right: 15px; +} +.carousel-control:hover, +.carousel-control:focus { + color: #ffffff; + text-decoration: none; + opacity: 0.9; + filter: alpha(opacity=90); +} +.carousel-indicators { + position: absolute; + top: 15px; + right: 15px; + z-index: 5; + margin: 0; + list-style: none; +} +.carousel-indicators li { + display: block; + float: left; + width: 10px; + height: 10px; + margin-left: 5px; + text-indent: -999px; + background-color: #ccc; + background-color: rgba(255, 255, 255, 0.25); + border-radius: 5px; +} +.carousel-indicators .active { + background-color: #fff; +} +.carousel-caption { + position: absolute; + left: 0; + right: 0; + bottom: 0; + padding: 15px; + background: #333333; + background: rgba(0, 0, 0, 0.75); +} +.carousel-caption h4, +.carousel-caption p { + color: #ffffff; + line-height: 20px; +} +.carousel-caption h4 { + margin: 0 0 5px; +} +.carousel-caption p { + margin-bottom: 0; +} +.well { + min-height: 20px; + padding: 19px; + margin-bottom: 20px; + background-color: #f5f5f5; + border: 1px solid #e3e3e3; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); + box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); +} +.well blockquote { + border-color: #ddd; + border-color: rgba(0, 0, 0, 0.15); +} +.well-large { + padding: 24px; + -webkit-border-radius: 6px; + -moz-border-radius: 6px; + border-radius: 6px; +} +.well-small { + padding: 9px; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; +} +.close { + float: right; + font-size: 20px; + font-weight: bold; + line-height: 20px; + color: #000000; + text-shadow: 0 1px 0 #ffffff; + opacity: 0.2; + filter: alpha(opacity=20); +} +.close:hover, +.close:focus { + color: #000000; + text-decoration: none; + cursor: pointer; + opacity: 0.4; + filter: alpha(opacity=40); +} +button.close { + padding: 0; + cursor: pointer; + background: transparent; + border: 0; + -webkit-appearance: none; +} +.pull-right { + float: right; +} +.pull-left { + float: left; +} +.hide { + display: none; +} +.show { + display: block; +} +.invisible { + visibility: hidden; +} +.affix { + position: fixed; +} +.fade { + opacity: 0; + -webkit-transition: opacity 0.15s linear; + -moz-transition: opacity 0.15s linear; + -o-transition: opacity 0.15s linear; + transition: opacity 0.15s linear; +} +.fade.in { + opacity: 1; +} +.collapse { + position: relative; + height: 0; + overflow: hidden; + -webkit-transition: height 0.35s ease; + -moz-transition: height 0.35s ease; + -o-transition: height 0.35s ease; + transition: height 0.35s ease; +} +.collapse.in { + height: auto; +} +@-ms-viewport { + width: device-width; +} +.hidden { + display: none; + visibility: hidden; +} +.visible-phone { + display: none !important; +} +.visible-tablet { + display: none !important; +} +.hidden-desktop { + display: none !important; +} +.visible-desktop { + display: inherit !important; +} +@media (min-width: 768px) and (max-width: 979px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important ; + } + .visible-tablet { + display: inherit !important; + } + .hidden-tablet { + display: none !important; + } +} +@media (max-width: 767px) { + .hidden-desktop { + display: inherit !important; + } + .visible-desktop { + display: none !important; + } + .visible-phone { + display: inherit !important; + } + .hidden-phone { + display: none !important; + } +} +.visible-print { + display: none !important; +} +@media print { + .visible-print { + display: inherit !important; + } + .hidden-print { + display: none !important; + } +} +@media (max-width: 767px) { + body { + padding-left: 20px; + padding-right: 20px; + } + .navbar-fixed-top, + .navbar-fixed-bottom, + .navbar-static-top { + margin-left: -20px; + margin-right: -20px; + } + .container-fluid { + padding: 0; + } + .dl-horizontal dt { + float: none; + clear: none; + width: auto; + text-align: left; + } + .dl-horizontal dd { + margin-left: 0; + } + .container { + width: auto; + } + .row-fluid { + width: 100%; + } + .row, + .thumbnails { + margin-left: 0; + } + .thumbnails > li { + float: none; + margin-left: 0; + } + [class*="span"], + .uneditable-input[class*="span"], + .row-fluid [class*="span"] { + float: none; + display: block; + width: 100%; + margin-left: 0; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .span12, + .row-fluid .span12 { + width: 100%; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .row-fluid [class*="offset"]:first-child { + margin-left: 0; + } + .input-large, + .input-xlarge, + .input-xxlarge, + input[class*="span"], + select[class*="span"], + textarea[class*="span"], + .uneditable-input { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + } + .input-prepend input, + .input-append input, + .input-prepend input[class*="span"], + .input-append input[class*="span"] { + display: inline-block; + width: auto; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 0; + } + .modal { + position: fixed; + top: 20px; + left: 20px; + right: 20px; + width: auto; + margin: 0; + } + .modal.fade { + top: -100px; + } + .modal.fade.in { + top: 20px; + } +} +@media (max-width: 480px) { + .nav-collapse { + -webkit-transform: translate3d(0, 0, 0); + } + .page-header h1 small { + display: block; + line-height: 20px; + } + input[type="checkbox"], + input[type="radio"] { + border: 1px solid #ccc; + } + .form-horizontal .control-label { + float: none; + width: auto; + padding-top: 0; + text-align: left; + } + .form-horizontal .controls { + margin-left: 0; + } + .form-horizontal .control-list { + padding-top: 0; + } + .form-horizontal .form-actions { + padding-left: 10px; + padding-right: 10px; + } + .media .pull-left, + .media .pull-right { + float: none; + display: block; + margin-bottom: 10px; + } + .media-object { + margin-right: 0; + margin-left: 0; + } + .modal { + top: 10px; + left: 10px; + right: 10px; + } + .modal-header .close { + padding: 10px; + margin: -10px; + } + .carousel-caption { + position: static; + } +} +@media (min-width: 768px) and (max-width: 979px) { + .row { + margin-left: -20px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + line-height: 0; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 20px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 724px; + } + .span12 { + width: 724px; + } + .span11 { + width: 662px; + } + .span10 { + width: 600px; + } + .span9 { + width: 538px; + } + .span8 { + width: 476px; + } + .span7 { + width: 414px; + } + .span6 { + width: 352px; + } + .span5 { + width: 290px; + } + .span4 { + width: 228px; + } + .span3 { + width: 166px; + } + .span2 { + width: 104px; + } + .span1 { + width: 42px; + } + .offset12 { + margin-left: 764px; + } + .offset11 { + margin-left: 702px; + } + .offset10 { + margin-left: 640px; + } + .offset9 { + margin-left: 578px; + } + .offset8 { + margin-left: 516px; + } + .offset7 { + margin-left: 454px; + } + .offset6 { + margin-left: 392px; + } + .offset5 { + margin-left: 330px; + } + .offset4 { + margin-left: 268px; + } + .offset3 { + margin-left: 206px; + } + .offset2 { + margin-left: 144px; + } + .offset1 { + margin-left: 82px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + line-height: 0; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.7624309392265194%; + *margin-left: 2.709239449864817%; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.7624309392265194%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.43646408839778%; + *width: 91.38327259903608%; + } + .row-fluid .span10 { + width: 82.87292817679558%; + *width: 82.81973668743387%; + } + .row-fluid .span9 { + width: 74.30939226519337%; + *width: 74.25620077583166%; + } + .row-fluid .span8 { + width: 65.74585635359117%; + *width: 65.69266486422946%; + } + .row-fluid .span7 { + width: 57.18232044198895%; + *width: 57.12912895262725%; + } + .row-fluid .span6 { + width: 48.61878453038674%; + *width: 48.56559304102504%; + } + .row-fluid .span5 { + width: 40.05524861878453%; + *width: 40.00205712942283%; + } + .row-fluid .span4 { + width: 31.491712707182323%; + *width: 31.43852121782062%; + } + .row-fluid .span3 { + width: 22.92817679558011%; + *width: 22.87498530621841%; + } + .row-fluid .span2 { + width: 14.3646408839779%; + *width: 14.311449394616199%; + } + .row-fluid .span1 { + width: 5.801104972375691%; + *width: 5.747913483013988%; + } + .row-fluid .offset12 { + margin-left: 105.52486187845304%; + *margin-left: 105.41847889972962%; + } + .row-fluid .offset12:first-child { + margin-left: 102.76243093922652%; + *margin-left: 102.6560479605031%; + } + .row-fluid .offset11 { + margin-left: 96.96132596685082%; + *margin-left: 96.8549429881274%; + } + .row-fluid .offset11:first-child { + margin-left: 94.1988950276243%; + *margin-left: 94.09251204890089%; + } + .row-fluid .offset10 { + margin-left: 88.39779005524862%; + *margin-left: 88.2914070765252%; + } + .row-fluid .offset10:first-child { + margin-left: 85.6353591160221%; + *margin-left: 85.52897613729868%; + } + .row-fluid .offset9 { + margin-left: 79.8342541436464%; + *margin-left: 79.72787116492299%; + } + .row-fluid .offset9:first-child { + margin-left: 77.07182320441989%; + *margin-left: 76.96544022569647%; + } + .row-fluid .offset8 { + margin-left: 71.2707182320442%; + *margin-left: 71.16433525332079%; + } + .row-fluid .offset8:first-child { + margin-left: 68.50828729281768%; + *margin-left: 68.40190431409427%; + } + .row-fluid .offset7 { + margin-left: 62.70718232044199%; + *margin-left: 62.600799341718584%; + } + .row-fluid .offset7:first-child { + margin-left: 59.94475138121547%; + *margin-left: 59.838368402492065%; + } + .row-fluid .offset6 { + margin-left: 54.14364640883978%; + *margin-left: 54.037263430116376%; + } + .row-fluid .offset6:first-child { + margin-left: 51.38121546961326%; + *margin-left: 51.27483249088986%; + } + .row-fluid .offset5 { + margin-left: 45.58011049723757%; + *margin-left: 45.47372751851417%; + } + .row-fluid .offset5:first-child { + margin-left: 42.81767955801105%; + *margin-left: 42.71129657928765%; + } + .row-fluid .offset4 { + margin-left: 37.01657458563536%; + *margin-left: 36.91019160691196%; + } + .row-fluid .offset4:first-child { + margin-left: 34.25414364640884%; + *margin-left: 34.14776066768544%; + } + .row-fluid .offset3 { + margin-left: 28.45303867403315%; + *margin-left: 28.346655695309746%; + } + .row-fluid .offset3:first-child { + margin-left: 25.69060773480663%; + *margin-left: 25.584224756083227%; + } + .row-fluid .offset2 { + margin-left: 19.88950276243094%; + *margin-left: 19.783119783707537%; + } + .row-fluid .offset2:first-child { + margin-left: 17.12707182320442%; + *margin-left: 17.02068884448102%; + } + .row-fluid .offset1 { + margin-left: 11.32596685082873%; + *margin-left: 11.219583872105325%; + } + .row-fluid .offset1:first-child { + margin-left: 8.56353591160221%; + *margin-left: 8.457152932878806%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 20px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 710px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 648px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 586px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 524px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 462px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 400px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 338px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 276px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 214px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 152px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 90px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 28px; + } +} +@media (min-width: 1200px) { + .row { + margin-left: -30px; + *zoom: 1; + } + .row:before, + .row:after { + display: table; + content: ""; + line-height: 0; + } + .row:after { + clear: both; + } + [class*="span"] { + float: left; + min-height: 1px; + margin-left: 30px; + } + .container, + .navbar-static-top .container, + .navbar-fixed-top .container, + .navbar-fixed-bottom .container { + width: 1170px; + } + .span12 { + width: 1170px; + } + .span11 { + width: 1070px; + } + .span10 { + width: 970px; + } + .span9 { + width: 870px; + } + .span8 { + width: 770px; + } + .span7 { + width: 670px; + } + .span6 { + width: 570px; + } + .span5 { + width: 470px; + } + .span4 { + width: 370px; + } + .span3 { + width: 270px; + } + .span2 { + width: 170px; + } + .span1 { + width: 70px; + } + .offset12 { + margin-left: 1230px; + } + .offset11 { + margin-left: 1130px; + } + .offset10 { + margin-left: 1030px; + } + .offset9 { + margin-left: 930px; + } + .offset8 { + margin-left: 830px; + } + .offset7 { + margin-left: 730px; + } + .offset6 { + margin-left: 630px; + } + .offset5 { + margin-left: 530px; + } + .offset4 { + margin-left: 430px; + } + .offset3 { + margin-left: 330px; + } + .offset2 { + margin-left: 230px; + } + .offset1 { + margin-left: 130px; + } + .row-fluid { + width: 100%; + *zoom: 1; + } + .row-fluid:before, + .row-fluid:after { + display: table; + content: ""; + line-height: 0; + } + .row-fluid:after { + clear: both; + } + .row-fluid [class*="span"] { + display: block; + width: 100%; + min-height: 30px; + -webkit-box-sizing: border-box; + -moz-box-sizing: border-box; + box-sizing: border-box; + float: left; + margin-left: 2.564102564102564%; + *margin-left: 2.5109110747408616%; + } + .row-fluid [class*="span"]:first-child { + margin-left: 0; + } + .row-fluid .controls-row [class*="span"] + [class*="span"] { + margin-left: 2.564102564102564%; + } + .row-fluid .span12 { + width: 100%; + *width: 99.94680851063829%; + } + .row-fluid .span11 { + width: 91.45299145299145%; + *width: 91.39979996362975%; + } + .row-fluid .span10 { + width: 82.90598290598291%; + *width: 82.8527914166212%; + } + .row-fluid .span9 { + width: 74.35897435897436%; + *width: 74.30578286961266%; + } + .row-fluid .span8 { + width: 65.81196581196582%; + *width: 65.75877432260411%; + } + .row-fluid .span7 { + width: 57.26495726495726%; + *width: 57.21176577559556%; + } + .row-fluid .span6 { + width: 48.717948717948715%; + *width: 48.664757228587014%; + } + .row-fluid .span5 { + width: 40.17094017094017%; + *width: 40.11774868157847%; + } + .row-fluid .span4 { + width: 31.623931623931625%; + *width: 31.570740134569924%; + } + .row-fluid .span3 { + width: 23.076923076923077%; + *width: 23.023731587561375%; + } + .row-fluid .span2 { + width: 14.52991452991453%; + *width: 14.476723040552828%; + } + .row-fluid .span1 { + width: 5.982905982905983%; + *width: 5.929714493544281%; + } + .row-fluid .offset12 { + margin-left: 105.12820512820512%; + *margin-left: 105.02182214948171%; + } + .row-fluid .offset12:first-child { + margin-left: 102.56410256410257%; + *margin-left: 102.45771958537915%; + } + .row-fluid .offset11 { + margin-left: 96.58119658119658%; + *margin-left: 96.47481360247316%; + } + .row-fluid .offset11:first-child { + margin-left: 94.01709401709402%; + *margin-left: 93.91071103837061%; + } + .row-fluid .offset10 { + margin-left: 88.03418803418803%; + *margin-left: 87.92780505546462%; + } + .row-fluid .offset10:first-child { + margin-left: 85.47008547008548%; + *margin-left: 85.36370249136206%; + } + .row-fluid .offset9 { + margin-left: 79.48717948717949%; + *margin-left: 79.38079650845607%; + } + .row-fluid .offset9:first-child { + margin-left: 76.92307692307693%; + *margin-left: 76.81669394435352%; + } + .row-fluid .offset8 { + margin-left: 70.94017094017094%; + *margin-left: 70.83378796144753%; + } + .row-fluid .offset8:first-child { + margin-left: 68.37606837606839%; + *margin-left: 68.26968539734497%; + } + .row-fluid .offset7 { + margin-left: 62.393162393162385%; + *margin-left: 62.28677941443899%; + } + .row-fluid .offset7:first-child { + margin-left: 59.82905982905982%; + *margin-left: 59.72267685033642%; + } + .row-fluid .offset6 { + margin-left: 53.84615384615384%; + *margin-left: 53.739770867430444%; + } + .row-fluid .offset6:first-child { + margin-left: 51.28205128205128%; + *margin-left: 51.175668303327875%; + } + .row-fluid .offset5 { + margin-left: 45.299145299145295%; + *margin-left: 45.1927623204219%; + } + .row-fluid .offset5:first-child { + margin-left: 42.73504273504273%; + *margin-left: 42.62865975631933%; + } + .row-fluid .offset4 { + margin-left: 36.75213675213675%; + *margin-left: 36.645753773413354%; + } + .row-fluid .offset4:first-child { + margin-left: 34.18803418803419%; + *margin-left: 34.081651209310785%; + } + .row-fluid .offset3 { + margin-left: 28.205128205128204%; + *margin-left: 28.0987452264048%; + } + .row-fluid .offset3:first-child { + margin-left: 25.641025641025642%; + *margin-left: 25.53464266230224%; + } + .row-fluid .offset2 { + margin-left: 19.65811965811966%; + *margin-left: 19.551736679396257%; + } + .row-fluid .offset2:first-child { + margin-left: 17.094017094017094%; + *margin-left: 16.98763411529369%; + } + .row-fluid .offset1 { + margin-left: 11.11111111111111%; + *margin-left: 11.004728132387708%; + } + .row-fluid .offset1:first-child { + margin-left: 8.547008547008547%; + *margin-left: 8.440625568285142%; + } + input, + textarea, + .uneditable-input { + margin-left: 0; + } + .controls-row [class*="span"] + [class*="span"] { + margin-left: 30px; + } + input.span12, + textarea.span12, + .uneditable-input.span12 { + width: 1156px; + } + input.span11, + textarea.span11, + .uneditable-input.span11 { + width: 1056px; + } + input.span10, + textarea.span10, + .uneditable-input.span10 { + width: 956px; + } + input.span9, + textarea.span9, + .uneditable-input.span9 { + width: 856px; + } + input.span8, + textarea.span8, + .uneditable-input.span8 { + width: 756px; + } + input.span7, + textarea.span7, + .uneditable-input.span7 { + width: 656px; + } + input.span6, + textarea.span6, + .uneditable-input.span6 { + width: 556px; + } + input.span5, + textarea.span5, + .uneditable-input.span5 { + width: 456px; + } + input.span4, + textarea.span4, + .uneditable-input.span4 { + width: 356px; + } + input.span3, + textarea.span3, + .uneditable-input.span3 { + width: 256px; + } + input.span2, + textarea.span2, + .uneditable-input.span2 { + width: 156px; + } + input.span1, + textarea.span1, + .uneditable-input.span1 { + width: 56px; + } + .thumbnails { + margin-left: -30px; + } + .thumbnails > li { + margin-left: 30px; + } + .row-fluid .thumbnails { + margin-left: 0; + } +} +@media (max-width: 979px) { + body { + padding-top: 0; + } + .navbar-fixed-top, + .navbar-fixed-bottom { + position: static; + } + .navbar-fixed-top { + margin-bottom: 20px; + } + .navbar-fixed-bottom { + margin-top: 20px; + } + .navbar-fixed-top .navbar-inner, + .navbar-fixed-bottom .navbar-inner { + padding: 5px; + } + .navbar .container { + width: auto; + padding: 0; + } + .navbar .brand { + padding-left: 10px; + padding-right: 10px; + margin: 0 0 0 -5px; + } + .nav-collapse { + clear: both; + } + .nav-collapse .nav { + float: none; + margin: 0 0 10px; + } + .nav-collapse .nav > li { + float: none; + } + .nav-collapse .nav > li > a { + margin-bottom: 2px; + } + .nav-collapse .nav > .divider-vertical { + display: none; + } + .nav-collapse .nav .nav-header { + color: #777777; + text-shadow: none; + } + .nav-collapse .nav > li > a, + .nav-collapse .dropdown-menu a { + padding: 9px 15px; + font-weight: bold; + color: #777777; + -webkit-border-radius: 3px; + -moz-border-radius: 3px; + border-radius: 3px; + } + .nav-collapse .btn { + padding: 4px 10px 4px; + font-weight: normal; + -webkit-border-radius: 4px; + -moz-border-radius: 4px; + border-radius: 4px; + } + .nav-collapse .dropdown-menu li + li a { + margin-bottom: 2px; + } + .nav-collapse .nav > li > a:hover, + .nav-collapse .nav > li > a:focus, + .nav-collapse .dropdown-menu a:hover, + .nav-collapse .dropdown-menu a:focus { + background-color: #f2f2f2; + } + .navbar-inverse .nav-collapse .nav > li > a, + .navbar-inverse .nav-collapse .dropdown-menu a { + color: #999999; + } + .navbar-inverse .nav-collapse .nav > li > a:hover, + .navbar-inverse .nav-collapse .nav > li > a:focus, + .navbar-inverse .nav-collapse .dropdown-menu a:hover, + .navbar-inverse .nav-collapse .dropdown-menu a:focus { + background-color: #111111; + } + .nav-collapse.in .btn-group { + margin-top: 5px; + padding: 0; + } + .nav-collapse .dropdown-menu { + position: static; + top: auto; + left: auto; + float: none; + display: none; + max-width: none; + margin: 0 15px; + padding: 0; + background-color: transparent; + border: none; + -webkit-border-radius: 0; + -moz-border-radius: 0; + border-radius: 0; + -webkit-box-shadow: none; + -moz-box-shadow: none; + box-shadow: none; + } + .nav-collapse .open > .dropdown-menu { + display: block; + } + .nav-collapse .dropdown-menu:before, + .nav-collapse .dropdown-menu:after { + display: none; + } + .nav-collapse .dropdown-menu .divider { + display: none; + } + .nav-collapse .nav > li > .dropdown-menu:before, + .nav-collapse .nav > li > .dropdown-menu:after { + display: none; + } + .nav-collapse .navbar-form, + .nav-collapse .navbar-search { + float: none; + padding: 10px 15px; + margin: 10px 0; + border-top: 1px solid #f2f2f2; + border-bottom: 1px solid #f2f2f2; + -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); + } + .navbar-inverse .nav-collapse .navbar-form, + .navbar-inverse .nav-collapse .navbar-search { + border-top-color: #111111; + border-bottom-color: #111111; + } + .navbar .nav-collapse .nav.pull-right { + float: none; + margin-left: 0; + } + .nav-collapse, + .nav-collapse.collapse { + overflow: hidden; + height: 0; + } + .navbar .btn-navbar { + display: block; + } + .navbar-static .navbar-inner { + padding-left: 10px; + padding-right: 10px; + } +} +@media (min-width: 980px) { + .nav-collapse.collapse { + height: auto !important; + overflow: visible !important; + } +} diff --git a/tools/ngui/static/bootstrap/css/bootstrap.min.css b/tools/ngui/static/bootstrap/css/bootstrap.min.css new file mode 100644 index 00000000000..622b27fb02f --- /dev/null +++ b/tools/ngui/static/bootstrap/css/bootstrap.min.css @@ -0,0 +1,874 @@ +/*! + * Bootstrap v2.3.2 + * + * Copyright 2012 Twitter, Inc + * Licensed under the Apache License v2.0 + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Designed and built with all the love in the world @twitter by @mdo and @fat. + */ +.clearfix{*zoom:1;}.clearfix:before,.clearfix:after{display:table;content:"";line-height:0;} +.clearfix:after{clear:both;} +.hide-text{font:0/0 a;color:transparent;text-shadow:none;background-color:transparent;border:0;} +.input-block-level{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} +article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block;} +audio,canvas,video{display:inline-block;*display:inline;*zoom:1;} +audio:not([controls]){display:none;} +html{font-size:100%;-webkit-text-size-adjust:100%;-ms-text-size-adjust:100%;} +a:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +a:hover,a:active{outline:0;} +sub,sup{position:relative;font-size:75%;line-height:0;vertical-align:baseline;} +sup{top:-0.5em;} +sub{bottom:-0.25em;} +img{max-width:100%;width:auto\9;height:auto;vertical-align:middle;border:0;-ms-interpolation-mode:bicubic;} +#map_canvas img,.google-maps img{max-width:none;} +button,input,select,textarea{margin:0;font-size:100%;vertical-align:middle;} +button,input{*overflow:visible;line-height:normal;} +button::-moz-focus-inner,input::-moz-focus-inner{padding:0;border:0;} +button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer;} +label,select,button,input[type="button"],input[type="reset"],input[type="submit"],input[type="radio"],input[type="checkbox"]{cursor:pointer;} +input[type="search"]{-webkit-box-sizing:content-box;-moz-box-sizing:content-box;box-sizing:content-box;-webkit-appearance:textfield;} +input[type="search"]::-webkit-search-decoration,input[type="search"]::-webkit-search-cancel-button{-webkit-appearance:none;} +textarea{overflow:auto;vertical-align:top;} +@media print{*{text-shadow:none !important;color:#000 !important;background:transparent !important;box-shadow:none !important;} a,a:visited{text-decoration:underline;} a[href]:after{content:" (" attr(href) ")";} abbr[title]:after{content:" (" attr(title) ")";} .ir a:after,a[href^="javascript:"]:after,a[href^="#"]:after{content:"";} pre,blockquote{border:1px solid #999;page-break-inside:avoid;} thead{display:table-header-group;} tr,img{page-break-inside:avoid;} img{max-width:100% !important;} @page {margin:0.5cm;}p,h2,h3{orphans:3;widows:3;} h2,h3{page-break-after:avoid;}}body{margin:0;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;line-height:20px;color:#333333;background-color:#ffffff;} +a{color:#0088cc;text-decoration:none;} +a:hover,a:focus{color:#005580;text-decoration:underline;} +.img-rounded{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.img-polaroid{padding:4px;background-color:#fff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);box-shadow:0 1px 3px rgba(0, 0, 0, 0.1);} +.img-circle{-webkit-border-radius:500px;-moz-border-radius:500px;border-radius:500px;} +.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} +.row:after{clear:both;} +[class*="span"]{float:left;min-height:1px;margin-left:20px;} +.container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} +.span12{width:940px;} +.span11{width:860px;} +.span10{width:780px;} +.span9{width:700px;} +.span8{width:620px;} +.span7{width:540px;} +.span6{width:460px;} +.span5{width:380px;} +.span4{width:300px;} +.span3{width:220px;} +.span2{width:140px;} +.span1{width:60px;} +.offset12{margin-left:980px;} +.offset11{margin-left:900px;} +.offset10{margin-left:820px;} +.offset9{margin-left:740px;} +.offset8{margin-left:660px;} +.offset7{margin-left:580px;} +.offset6{margin-left:500px;} +.offset5{margin-left:420px;} +.offset4{margin-left:340px;} +.offset3{margin-left:260px;} +.offset2{margin-left:180px;} +.offset1{margin-left:100px;} +.row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} +.row-fluid:after{clear:both;} +.row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.127659574468085%;*margin-left:2.074468085106383%;} +.row-fluid [class*="span"]:first-child{margin-left:0;} +.row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.127659574468085%;} +.row-fluid .span12{width:100%;*width:99.94680851063829%;} +.row-fluid .span11{width:91.48936170212765%;*width:91.43617021276594%;} +.row-fluid .span10{width:82.97872340425532%;*width:82.92553191489361%;} +.row-fluid .span9{width:74.46808510638297%;*width:74.41489361702126%;} +.row-fluid .span8{width:65.95744680851064%;*width:65.90425531914893%;} +.row-fluid .span7{width:57.44680851063829%;*width:57.39361702127659%;} +.row-fluid .span6{width:48.93617021276595%;*width:48.88297872340425%;} +.row-fluid .span5{width:40.42553191489362%;*width:40.37234042553192%;} +.row-fluid .span4{width:31.914893617021278%;*width:31.861702127659576%;} +.row-fluid .span3{width:23.404255319148934%;*width:23.351063829787233%;} +.row-fluid .span2{width:14.893617021276595%;*width:14.840425531914894%;} +.row-fluid .span1{width:6.382978723404255%;*width:6.329787234042553%;} +.row-fluid .offset12{margin-left:104.25531914893617%;*margin-left:104.14893617021275%;} +.row-fluid .offset12:first-child{margin-left:102.12765957446808%;*margin-left:102.02127659574467%;} +.row-fluid .offset11{margin-left:95.74468085106382%;*margin-left:95.6382978723404%;} +.row-fluid .offset11:first-child{margin-left:93.61702127659574%;*margin-left:93.51063829787232%;} +.row-fluid .offset10{margin-left:87.23404255319149%;*margin-left:87.12765957446807%;} +.row-fluid .offset10:first-child{margin-left:85.1063829787234%;*margin-left:84.99999999999999%;} +.row-fluid .offset9{margin-left:78.72340425531914%;*margin-left:78.61702127659572%;} +.row-fluid .offset9:first-child{margin-left:76.59574468085106%;*margin-left:76.48936170212764%;} +.row-fluid .offset8{margin-left:70.2127659574468%;*margin-left:70.10638297872339%;} +.row-fluid .offset8:first-child{margin-left:68.08510638297872%;*margin-left:67.9787234042553%;} +.row-fluid .offset7{margin-left:61.70212765957446%;*margin-left:61.59574468085106%;} +.row-fluid .offset7:first-child{margin-left:59.574468085106375%;*margin-left:59.46808510638297%;} +.row-fluid .offset6{margin-left:53.191489361702125%;*margin-left:53.085106382978715%;} +.row-fluid .offset6:first-child{margin-left:51.063829787234035%;*margin-left:50.95744680851063%;} +.row-fluid .offset5{margin-left:44.68085106382979%;*margin-left:44.57446808510638%;} +.row-fluid .offset5:first-child{margin-left:42.5531914893617%;*margin-left:42.4468085106383%;} +.row-fluid .offset4{margin-left:36.170212765957444%;*margin-left:36.06382978723405%;} +.row-fluid .offset4:first-child{margin-left:34.04255319148936%;*margin-left:33.93617021276596%;} +.row-fluid .offset3{margin-left:27.659574468085104%;*margin-left:27.5531914893617%;} +.row-fluid .offset3:first-child{margin-left:25.53191489361702%;*margin-left:25.425531914893618%;} +.row-fluid .offset2{margin-left:19.148936170212764%;*margin-left:19.04255319148936%;} +.row-fluid .offset2:first-child{margin-left:17.02127659574468%;*margin-left:16.914893617021278%;} +.row-fluid .offset1{margin-left:10.638297872340425%;*margin-left:10.53191489361702%;} +.row-fluid .offset1:first-child{margin-left:8.51063829787234%;*margin-left:8.404255319148938%;} +[class*="span"].hide,.row-fluid [class*="span"].hide{display:none;} +[class*="span"].pull-right,.row-fluid [class*="span"].pull-right{float:right;} +.container{margin-right:auto;margin-left:auto;*zoom:1;}.container:before,.container:after{display:table;content:"";line-height:0;} +.container:after{clear:both;} +.container-fluid{padding-right:20px;padding-left:20px;*zoom:1;}.container-fluid:before,.container-fluid:after{display:table;content:"";line-height:0;} +.container-fluid:after{clear:both;} +p{margin:0 0 10px;} +.lead{margin-bottom:20px;font-size:19.5px;font-weight:200;line-height:30px;} +small{font-size:85%;} +strong{font-weight:bold;} +em{font-style:italic;} +cite{font-style:normal;} +.muted{color:#999999;} +a.muted:hover,a.muted:focus{color:#808080;} +.text-warning{color:#c09853;} +a.text-warning:hover,a.text-warning:focus{color:#a47e3c;} +.text-error{color:#b94a48;} +a.text-error:hover,a.text-error:focus{color:#953b39;} +.text-info{color:#3a87ad;} +a.text-info:hover,a.text-info:focus{color:#2d6987;} +.text-success{color:#468847;} +a.text-success:hover,a.text-success:focus{color:#356635;} +.text-left{text-align:left;} +.text-right{text-align:right;} +.text-center{text-align:center;} +h1,h2,h3,h4,h5,h6{margin:10px 0;font-family:inherit;font-weight:bold;line-height:20px;color:inherit;text-rendering:optimizelegibility;}h1 small,h2 small,h3 small,h4 small,h5 small,h6 small{font-weight:normal;line-height:1;color:#999999;} +h1,h2,h3{line-height:40px;} +h1{font-size:35.75px;} +h2{font-size:29.25px;} +h3{font-size:22.75px;} +h4{font-size:16.25px;} +h5{font-size:13px;} +h6{font-size:11.049999999999999px;} +h1 small{font-size:22.75px;} +h2 small{font-size:16.25px;} +h3 small{font-size:13px;} +h4 small{font-size:13px;} +.page-header{padding-bottom:9px;margin:20px 0 30px;border-bottom:1px solid #eeeeee;} +ul,ol{padding:0;margin:0 0 10px 25px;} +ul ul,ul ol,ol ol,ol ul{margin-bottom:0;} +li{line-height:20px;} +ul.unstyled,ol.unstyled{margin-left:0;list-style:none;} +ul.inline,ol.inline{margin-left:0;list-style:none;}ul.inline>li,ol.inline>li{display:inline-block;*display:inline;*zoom:1;padding-left:5px;padding-right:5px;} +dl{margin-bottom:20px;} +dt,dd{line-height:20px;} +dt{font-weight:bold;} +dd{margin-left:10px;} +.dl-horizontal{*zoom:1;}.dl-horizontal:before,.dl-horizontal:after{display:table;content:"";line-height:0;} +.dl-horizontal:after{clear:both;} +.dl-horizontal dt{float:left;width:160px;clear:left;text-align:right;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;} +.dl-horizontal dd{margin-left:180px;} +hr{margin:20px 0;border:0;border-top:1px solid #eeeeee;border-bottom:1px solid #ffffff;} +abbr[title],abbr[data-original-title]{cursor:help;border-bottom:1px dotted #999999;} +abbr.initialism{font-size:90%;text-transform:uppercase;} +blockquote{padding:0 0 0 15px;margin:0 0 20px;border-left:5px solid #eeeeee;}blockquote p{margin-bottom:0;font-size:16.25px;font-weight:300;line-height:1.25;} +blockquote small{display:block;line-height:20px;color:#999999;}blockquote small:before{content:'\2014 \00A0';} +blockquote.pull-right{float:right;padding-right:15px;padding-left:0;border-right:5px solid #eeeeee;border-left:0;}blockquote.pull-right p,blockquote.pull-right small{text-align:right;} +blockquote.pull-right small:before{content:'';} +blockquote.pull-right small:after{content:'\00A0 \2014';} +q:before,q:after,blockquote:before,blockquote:after{content:"";} +address{display:block;margin-bottom:20px;font-style:normal;line-height:20px;} +code,pre{padding:0 3px 2px;font-family:Monaco,Menlo,Consolas,"Courier New",monospace;font-size:11px;color:#333333;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +code{padding:2px 4px;color:#d14;background-color:#f7f7f9;border:1px solid #e1e1e8;white-space:nowrap;} +pre{display:block;padding:9.5px;margin:0 0 10px;font-size:12px;line-height:20px;word-break:break-all;word-wrap:break-word;white-space:pre;white-space:pre-wrap;background-color:#f5f5f5;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.15);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}pre.prettyprint{margin-bottom:20px;} +pre code{padding:0;color:inherit;white-space:pre;white-space:pre-wrap;background-color:transparent;border:0;} +.pre-scrollable{max-height:340px;overflow-y:scroll;} +.label,.badge{display:inline-block;padding:2px 4px;font-size:10.998px;font-weight:bold;line-height:14px;color:#ffffff;vertical-align:baseline;white-space:nowrap;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#999999;} +.label{-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.badge{padding-left:9px;padding-right:9px;-webkit-border-radius:9px;-moz-border-radius:9px;border-radius:9px;} +.label:empty,.badge:empty{display:none;} +a.label:hover,a.label:focus,a.badge:hover,a.badge:focus{color:#ffffff;text-decoration:none;cursor:pointer;} +.label-important,.badge-important{background-color:#b94a48;} +.label-important[href],.badge-important[href]{background-color:#953b39;} +.label-warning,.badge-warning{background-color:#f89406;} +.label-warning[href],.badge-warning[href]{background-color:#c67605;} +.label-success,.badge-success{background-color:#468847;} +.label-success[href],.badge-success[href]{background-color:#356635;} +.label-info,.badge-info{background-color:#3a87ad;} +.label-info[href],.badge-info[href]{background-color:#2d6987;} +.label-inverse,.badge-inverse{background-color:#333333;} +.label-inverse[href],.badge-inverse[href]{background-color:#1a1a1a;} +.btn .label,.btn .badge{position:relative;top:-1px;} +.btn-mini .label,.btn-mini .badge{top:0;} +table{max-width:100%;background-color:transparent;border-collapse:collapse;border-spacing:0;} +.table{width:100%;margin-bottom:20px;}.table th,.table td{padding:8px;line-height:20px;text-align:left;vertical-align:top;border-top:1px solid #dddddd;} +.table th{font-weight:bold;} +.table thead th{vertical-align:bottom;} +.table caption+thead tr:first-child th,.table caption+thead tr:first-child td,.table colgroup+thead tr:first-child th,.table colgroup+thead tr:first-child td,.table thead:first-child tr:first-child th,.table thead:first-child tr:first-child td{border-top:0;} +.table tbody+tbody{border-top:2px solid #dddddd;} +.table .table{background-color:#ffffff;} +.table-condensed th,.table-condensed td{padding:4px 5px;} +.table-bordered{border:1px solid #dddddd;border-collapse:separate;*border-collapse:collapse;border-left:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.table-bordered th,.table-bordered td{border-left:1px solid #dddddd;} +.table-bordered caption+thead tr:first-child th,.table-bordered caption+tbody tr:first-child th,.table-bordered caption+tbody tr:first-child td,.table-bordered colgroup+thead tr:first-child th,.table-bordered colgroup+tbody tr:first-child th,.table-bordered colgroup+tbody tr:first-child td,.table-bordered thead:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child th,.table-bordered tbody:first-child tr:first-child td{border-top:0;} +.table-bordered thead:first-child tr:first-child>th:first-child,.table-bordered tbody:first-child tr:first-child>td:first-child,.table-bordered tbody:first-child tr:first-child>th:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} +.table-bordered thead:first-child tr:first-child>th:last-child,.table-bordered tbody:first-child tr:first-child>td:last-child,.table-bordered tbody:first-child tr:first-child>th:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} +.table-bordered thead:last-child tr:last-child>th:first-child,.table-bordered tbody:last-child tr:last-child>td:first-child,.table-bordered tbody:last-child tr:last-child>th:first-child,.table-bordered tfoot:last-child tr:last-child>td:first-child,.table-bordered tfoot:last-child tr:last-child>th:first-child{-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.table-bordered thead:last-child tr:last-child>th:last-child,.table-bordered tbody:last-child tr:last-child>td:last-child,.table-bordered tbody:last-child tr:last-child>th:last-child,.table-bordered tfoot:last-child tr:last-child>td:last-child,.table-bordered tfoot:last-child tr:last-child>th:last-child{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.table-bordered tfoot+tbody:last-child tr:last-child td:first-child{-webkit-border-bottom-left-radius:0;-moz-border-radius-bottomleft:0;border-bottom-left-radius:0;} +.table-bordered tfoot+tbody:last-child tr:last-child td:last-child{-webkit-border-bottom-right-radius:0;-moz-border-radius-bottomright:0;border-bottom-right-radius:0;} +.table-bordered caption+thead tr:first-child th:first-child,.table-bordered caption+tbody tr:first-child td:first-child,.table-bordered colgroup+thead tr:first-child th:first-child,.table-bordered colgroup+tbody tr:first-child td:first-child{-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} +.table-bordered caption+thead tr:first-child th:last-child,.table-bordered caption+tbody tr:first-child td:last-child,.table-bordered colgroup+thead tr:first-child th:last-child,.table-bordered colgroup+tbody tr:first-child td:last-child{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;} +.table-striped tbody>tr:nth-child(odd)>td,.table-striped tbody>tr:nth-child(odd)>th{background-color:#f9f9f9;} +.table-hover tbody tr:hover>td,.table-hover tbody tr:hover>th{background-color:#f5f5f5;} +table td[class*="span"],table th[class*="span"],.row-fluid table td[class*="span"],.row-fluid table th[class*="span"]{display:table-cell;float:none;margin-left:0;} +.table td.span1,.table th.span1{float:none;width:44px;margin-left:0;} +.table td.span2,.table th.span2{float:none;width:124px;margin-left:0;} +.table td.span3,.table th.span3{float:none;width:204px;margin-left:0;} +.table td.span4,.table th.span4{float:none;width:284px;margin-left:0;} +.table td.span5,.table th.span5{float:none;width:364px;margin-left:0;} +.table td.span6,.table th.span6{float:none;width:444px;margin-left:0;} +.table td.span7,.table th.span7{float:none;width:524px;margin-left:0;} +.table td.span8,.table th.span8{float:none;width:604px;margin-left:0;} +.table td.span9,.table th.span9{float:none;width:684px;margin-left:0;} +.table td.span10,.table th.span10{float:none;width:764px;margin-left:0;} +.table td.span11,.table th.span11{float:none;width:844px;margin-left:0;} +.table td.span12,.table th.span12{float:none;width:924px;margin-left:0;} +.table tbody tr.success>td{background-color:#dff0d8;} +.table tbody tr.error>td{background-color:#f2dede;} +.table tbody tr.warning>td{background-color:#fcf8e3;} +.table tbody tr.info>td{background-color:#d9edf7;} +.table-hover tbody tr.success:hover>td{background-color:#d0e9c6;} +.table-hover tbody tr.error:hover>td{background-color:#ebcccc;} +.table-hover tbody tr.warning:hover>td{background-color:#faf2cc;} +.table-hover tbody tr.info:hover>td{background-color:#c4e3f3;} +form{margin:0 0 20px;} +fieldset{padding:0;margin:0;border:0;} +legend{display:block;width:100%;padding:0;margin-bottom:20px;font-size:19.5px;line-height:40px;color:#333333;border:0;border-bottom:1px solid #e5e5e5;}legend small{font-size:15px;color:#999999;} +label,input,button,select,textarea{font-size:13px;font-weight:normal;line-height:20px;} +input,button,select,textarea{font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;} +label{display:block;margin-bottom:5px;} +select,textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{display:inline-block;height:20px;padding:4px 6px;margin-bottom:10px;font-size:13px;line-height:20px;color:#555555;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;vertical-align:middle;} +input,textarea,.uneditable-input{width:206px;} +textarea{height:auto;} +textarea,input[type="text"],input[type="password"],input[type="datetime"],input[type="datetime-local"],input[type="date"],input[type="month"],input[type="time"],input[type="week"],input[type="number"],input[type="email"],input[type="url"],input[type="search"],input[type="tel"],input[type="color"],.uneditable-input{background-color:#ffffff;border:1px solid #cccccc;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-webkit-transition:border linear .2s, box-shadow linear .2s;-moz-transition:border linear .2s, box-shadow linear .2s;-o-transition:border linear .2s, box-shadow linear .2s;transition:border linear .2s, box-shadow linear .2s;}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="datetime"]:focus,input[type="datetime-local"]:focus,input[type="date"]:focus,input[type="month"]:focus,input[type="time"]:focus,input[type="week"]:focus,input[type="number"]:focus,input[type="email"]:focus,input[type="url"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="color"]:focus,.uneditable-input:focus{border-color:rgba(82, 168, 236, 0.8);outline:0;outline:thin dotted \9;-webkit-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);-moz-box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);box-shadow:inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6);} +input[type="radio"],input[type="checkbox"]{margin:4px 0 0;*margin-top:0;margin-top:1px \9;line-height:normal;} +input[type="file"],input[type="image"],input[type="submit"],input[type="reset"],input[type="button"],input[type="radio"],input[type="checkbox"]{width:auto;} +select,input[type="file"]{height:30px;*margin-top:4px;line-height:30px;} +select{width:220px;border:1px solid #cccccc;background-color:#ffffff;} +select[multiple],select[size]{height:auto;} +select:focus,input[type="file"]:focus,input[type="radio"]:focus,input[type="checkbox"]:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.uneditable-input,.uneditable-textarea{color:#999999;background-color:#fcfcfc;border-color:#cccccc;-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.025);cursor:not-allowed;} +.uneditable-input{overflow:hidden;white-space:nowrap;} +.uneditable-textarea{width:auto;height:auto;} +input:-moz-placeholder,textarea:-moz-placeholder{color:#999999;} +input:-ms-input-placeholder,textarea:-ms-input-placeholder{color:#999999;} +input::-webkit-input-placeholder,textarea::-webkit-input-placeholder{color:#999999;} +.radio,.checkbox{min-height:20px;padding-left:20px;} +.radio input[type="radio"],.checkbox input[type="checkbox"]{float:left;margin-left:-20px;} +.controls>.radio:first-child,.controls>.checkbox:first-child{padding-top:5px;} +.radio.inline,.checkbox.inline{display:inline-block;padding-top:5px;margin-bottom:0;vertical-align:middle;} +.radio.inline+.radio.inline,.checkbox.inline+.checkbox.inline{margin-left:10px;} +.input-mini{width:60px;} +.input-small{width:90px;} +.input-medium{width:150px;} +.input-large{width:210px;} +.input-xlarge{width:270px;} +.input-xxlarge{width:530px;} +input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"]{float:none;margin-left:0;} +.input-append input[class*="span"],.input-append .uneditable-input[class*="span"],.input-prepend input[class*="span"],.input-prepend .uneditable-input[class*="span"],.row-fluid input[class*="span"],.row-fluid select[class*="span"],.row-fluid textarea[class*="span"],.row-fluid .uneditable-input[class*="span"],.row-fluid .input-prepend [class*="span"],.row-fluid .input-append [class*="span"]{display:inline-block;} +input,textarea,.uneditable-input{margin-left:0;} +.controls-row [class*="span"]+[class*="span"]{margin-left:20px;} +input.span12,textarea.span12,.uneditable-input.span12{width:926px;} +input.span11,textarea.span11,.uneditable-input.span11{width:846px;} +input.span10,textarea.span10,.uneditable-input.span10{width:766px;} +input.span9,textarea.span9,.uneditable-input.span9{width:686px;} +input.span8,textarea.span8,.uneditable-input.span8{width:606px;} +input.span7,textarea.span7,.uneditable-input.span7{width:526px;} +input.span6,textarea.span6,.uneditable-input.span6{width:446px;} +input.span5,textarea.span5,.uneditable-input.span5{width:366px;} +input.span4,textarea.span4,.uneditable-input.span4{width:286px;} +input.span3,textarea.span3,.uneditable-input.span3{width:206px;} +input.span2,textarea.span2,.uneditable-input.span2{width:126px;} +input.span1,textarea.span1,.uneditable-input.span1{width:46px;} +.controls-row{*zoom:1;}.controls-row:before,.controls-row:after{display:table;content:"";line-height:0;} +.controls-row:after{clear:both;} +.controls-row [class*="span"],.row-fluid .controls-row [class*="span"]{float:left;} +.controls-row .checkbox[class*="span"],.controls-row .radio[class*="span"]{padding-top:5px;} +input[disabled],select[disabled],textarea[disabled],input[readonly],select[readonly],textarea[readonly]{cursor:not-allowed;background-color:#eeeeee;} +input[type="radio"][disabled],input[type="checkbox"][disabled],input[type="radio"][readonly],input[type="checkbox"][readonly]{background-color:transparent;} +.control-group.warning .control-label,.control-group.warning .help-block,.control-group.warning .help-inline{color:#c09853;} +.control-group.warning .checkbox,.control-group.warning .radio,.control-group.warning input,.control-group.warning select,.control-group.warning textarea{color:#c09853;} +.control-group.warning input,.control-group.warning select,.control-group.warning textarea{border-color:#c09853;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.warning input:focus,.control-group.warning select:focus,.control-group.warning textarea:focus{border-color:#a47e3c;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #dbc59e;} +.control-group.warning .input-prepend .add-on,.control-group.warning .input-append .add-on{color:#c09853;background-color:#fcf8e3;border-color:#c09853;} +.control-group.error .control-label,.control-group.error .help-block,.control-group.error .help-inline{color:#b94a48;} +.control-group.error .checkbox,.control-group.error .radio,.control-group.error input,.control-group.error select,.control-group.error textarea{color:#b94a48;} +.control-group.error input,.control-group.error select,.control-group.error textarea{border-color:#b94a48;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.error input:focus,.control-group.error select:focus,.control-group.error textarea:focus{border-color:#953b39;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #d59392;} +.control-group.error .input-prepend .add-on,.control-group.error .input-append .add-on{color:#b94a48;background-color:#f2dede;border-color:#b94a48;} +.control-group.success .control-label,.control-group.success .help-block,.control-group.success .help-inline{color:#468847;} +.control-group.success .checkbox,.control-group.success .radio,.control-group.success input,.control-group.success select,.control-group.success textarea{color:#468847;} +.control-group.success input,.control-group.success select,.control-group.success textarea{border-color:#468847;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.success input:focus,.control-group.success select:focus,.control-group.success textarea:focus{border-color:#356635;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7aba7b;} +.control-group.success .input-prepend .add-on,.control-group.success .input-append .add-on{color:#468847;background-color:#dff0d8;border-color:#468847;} +.control-group.info .control-label,.control-group.info .help-block,.control-group.info .help-inline{color:#3a87ad;} +.control-group.info .checkbox,.control-group.info .radio,.control-group.info input,.control-group.info select,.control-group.info textarea{color:#3a87ad;} +.control-group.info input,.control-group.info select,.control-group.info textarea{border-color:#3a87ad;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075);}.control-group.info input:focus,.control-group.info select:focus,.control-group.info textarea:focus{border-color:#2d6987;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.075),0 0 6px #7ab5d3;} +.control-group.info .input-prepend .add-on,.control-group.info .input-append .add-on{color:#3a87ad;background-color:#d9edf7;border-color:#3a87ad;} +input:focus:invalid,textarea:focus:invalid,select:focus:invalid{color:#b94a48;border-color:#ee5f5b;}input:focus:invalid:focus,textarea:focus:invalid:focus,select:focus:invalid:focus{border-color:#e9322d;-webkit-box-shadow:0 0 6px #f8b9b7;-moz-box-shadow:0 0 6px #f8b9b7;box-shadow:0 0 6px #f8b9b7;} +.form-actions{padding:19px 20px 20px;margin-top:20px;margin-bottom:20px;background-color:#f5f5f5;border-top:1px solid #e5e5e5;*zoom:1;}.form-actions:before,.form-actions:after{display:table;content:"";line-height:0;} +.form-actions:after{clear:both;} +.help-block,.help-inline{color:#595959;} +.help-block{display:block;margin-bottom:10px;} +.help-inline{display:inline-block;*display:inline;*zoom:1;vertical-align:middle;padding-left:5px;} +.input-append,.input-prepend{display:inline-block;margin-bottom:10px;vertical-align:middle;font-size:0;white-space:nowrap;}.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input,.input-append .dropdown-menu,.input-prepend .dropdown-menu,.input-append .popover,.input-prepend .popover{font-size:13px;} +.input-append input,.input-prepend input,.input-append select,.input-prepend select,.input-append .uneditable-input,.input-prepend .uneditable-input{position:relative;margin-bottom:0;*margin-left:0;vertical-align:top;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;}.input-append input:focus,.input-prepend input:focus,.input-append select:focus,.input-prepend select:focus,.input-append .uneditable-input:focus,.input-prepend .uneditable-input:focus{z-index:2;} +.input-append .add-on,.input-prepend .add-on{display:inline-block;width:auto;height:20px;min-width:16px;padding:4px 5px;font-size:13px;font-weight:normal;line-height:20px;text-align:center;text-shadow:0 1px 0 #ffffff;background-color:#eeeeee;border:1px solid #ccc;} +.input-append .add-on,.input-prepend .add-on,.input-append .btn,.input-prepend .btn,.input-append .btn-group>.dropdown-toggle,.input-prepend .btn-group>.dropdown-toggle{vertical-align:top;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.input-append .active,.input-prepend .active{background-color:#a9dba9;border-color:#46a546;} +.input-prepend .add-on,.input-prepend .btn{margin-right:-1px;} +.input-prepend .add-on:first-child,.input-prepend .btn:first-child{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.input-append input,.input-append select,.input-append .uneditable-input{-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;}.input-append input+.btn-group .btn:last-child,.input-append select+.btn-group .btn:last-child,.input-append .uneditable-input+.btn-group .btn:last-child{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-append .add-on,.input-append .btn,.input-append .btn-group{margin-left:-1px;} +.input-append .add-on:last-child,.input-append .btn:last-child,.input-append .btn-group:last-child>.dropdown-toggle{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append input,.input-prepend.input-append select,.input-prepend.input-append .uneditable-input{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;}.input-prepend.input-append input+.btn-group .btn,.input-prepend.input-append select+.btn-group .btn,.input-prepend.input-append .uneditable-input+.btn-group .btn{-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append .add-on:first-child,.input-prepend.input-append .btn:first-child{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.input-prepend.input-append .add-on:last-child,.input-prepend.input-append .btn:last-child{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.input-prepend.input-append .btn-group:first-child{margin-left:0;} +input.search-query{padding-right:14px;padding-right:4px \9;padding-left:14px;padding-left:4px \9;margin-bottom:0;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.form-search .input-append .search-query,.form-search .input-prepend .search-query{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.form-search .input-append .search-query{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} +.form-search .input-append .btn{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} +.form-search .input-prepend .search-query{-webkit-border-radius:0 14px 14px 0;-moz-border-radius:0 14px 14px 0;border-radius:0 14px 14px 0;} +.form-search .input-prepend .btn{-webkit-border-radius:14px 0 0 14px;-moz-border-radius:14px 0 0 14px;border-radius:14px 0 0 14px;} +.form-search input,.form-inline input,.form-horizontal input,.form-search textarea,.form-inline textarea,.form-horizontal textarea,.form-search select,.form-inline select,.form-horizontal select,.form-search .help-inline,.form-inline .help-inline,.form-horizontal .help-inline,.form-search .uneditable-input,.form-inline .uneditable-input,.form-horizontal .uneditable-input,.form-search .input-prepend,.form-inline .input-prepend,.form-horizontal .input-prepend,.form-search .input-append,.form-inline .input-append,.form-horizontal .input-append{display:inline-block;*display:inline;*zoom:1;margin-bottom:0;vertical-align:middle;} +.form-search .hide,.form-inline .hide,.form-horizontal .hide{display:none;} +.form-search label,.form-inline label,.form-search .btn-group,.form-inline .btn-group{display:inline-block;} +.form-search .input-append,.form-inline .input-append,.form-search .input-prepend,.form-inline .input-prepend{margin-bottom:0;} +.form-search .radio,.form-search .checkbox,.form-inline .radio,.form-inline .checkbox{padding-left:0;margin-bottom:0;vertical-align:middle;} +.form-search .radio input[type="radio"],.form-search .checkbox input[type="checkbox"],.form-inline .radio input[type="radio"],.form-inline .checkbox input[type="checkbox"]{float:left;margin-right:3px;margin-left:0;} +.control-group{margin-bottom:10px;} +legend+.control-group{margin-top:20px;-webkit-margin-top-collapse:separate;} +.form-horizontal .control-group{margin-bottom:20px;*zoom:1;}.form-horizontal .control-group:before,.form-horizontal .control-group:after{display:table;content:"";line-height:0;} +.form-horizontal .control-group:after{clear:both;} +.form-horizontal .control-label{float:left;width:160px;padding-top:5px;text-align:right;} +.form-horizontal .controls{*display:inline-block;*padding-left:20px;margin-left:180px;*margin-left:0;}.form-horizontal .controls:first-child{*padding-left:180px;} +.form-horizontal .help-block{margin-bottom:0;} +.form-horizontal input+.help-block,.form-horizontal select+.help-block,.form-horizontal textarea+.help-block,.form-horizontal .uneditable-input+.help-block,.form-horizontal .input-prepend+.help-block,.form-horizontal .input-append+.help-block{margin-top:10px;} +.form-horizontal .form-actions{padding-left:180px;} +.btn{display:inline-block;*display:inline;*zoom:1;padding:4px 12px;margin-bottom:0;font-size:13px;line-height:20px;text-align:center;vertical-align:middle;cursor:pointer;color:#333333;text-shadow:0 1px 1px rgba(255, 255, 255, 0.75);background-color:#f5f5f5;background-image:-moz-linear-gradient(top, #ffffff, #e6e6e6);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6));background-image:-webkit-linear-gradient(top, #ffffff, #e6e6e6);background-image:-o-linear-gradient(top, #ffffff, #e6e6e6);background-image:linear-gradient(to bottom, #ffffff, #e6e6e6);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0);border-color:#e6e6e6 #e6e6e6 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e6e6e6;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);border:1px solid #cccccc;*border:0;border-bottom-color:#b3b3b3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;*margin-left:.3em;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);}.btn:hover,.btn:focus,.btn:active,.btn.active,.btn.disabled,.btn[disabled]{color:#333333;background-color:#e6e6e6;*background-color:#d9d9d9;} +.btn:active,.btn.active{background-color:#cccccc \9;} +.btn:first-child{*margin-left:0;} +.btn:hover,.btn:focus{color:#333333;text-decoration:none;background-position:0 -15px;-webkit-transition:background-position 0.1s linear;-moz-transition:background-position 0.1s linear;-o-transition:background-position 0.1s linear;transition:background-position 0.1s linear;} +.btn:focus{outline:thin dotted #333;outline:5px auto -webkit-focus-ring-color;outline-offset:-2px;} +.btn.active,.btn:active{background-image:none;outline:0;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} +.btn.disabled,.btn[disabled]{cursor:default;background-image:none;opacity:0.65;filter:alpha(opacity=65);-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-large{padding:11px 19px;font-size:16.25px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.btn-large [class^="icon-"],.btn-large [class*=" icon-"]{margin-top:4px;} +.btn-small{padding:2px 10px;font-size:11.049999999999999px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.btn-small [class^="icon-"],.btn-small [class*=" icon-"]{margin-top:0;} +.btn-mini [class^="icon-"],.btn-mini [class*=" icon-"]{margin-top:-1px;} +.btn-mini{padding:0 6px;font-size:9.75px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.btn-block{display:block;width:100%;padding-left:0;padding-right:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} +.btn-block+.btn-block{margin-top:5px;} +input[type="submit"].btn-block,input[type="reset"].btn-block,input[type="button"].btn-block{width:100%;} +.btn-primary.active,.btn-warning.active,.btn-danger.active,.btn-success.active,.btn-info.active,.btn-inverse.active{color:rgba(255, 255, 255, 0.75);} +.btn-primary{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#006dcc;background-image:-moz-linear-gradient(top, #0088cc, #0044cc);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc));background-image:-webkit-linear-gradient(top, #0088cc, #0044cc);background-image:-o-linear-gradient(top, #0088cc, #0044cc);background-image:linear-gradient(to bottom, #0088cc, #0044cc);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0);border-color:#0044cc #0044cc #002a80;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#0044cc;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-primary:hover,.btn-primary:focus,.btn-primary:active,.btn-primary.active,.btn-primary.disabled,.btn-primary[disabled]{color:#ffffff;background-color:#0044cc;*background-color:#003bb3;} +.btn-primary:active,.btn-primary.active{background-color:#003399 \9;} +.btn-warning{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);border-color:#f89406 #f89406 #ad6704;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#f89406;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-warning:hover,.btn-warning:focus,.btn-warning:active,.btn-warning.active,.btn-warning.disabled,.btn-warning[disabled]{color:#ffffff;background-color:#f89406;*background-color:#df8505;} +.btn-warning:active,.btn-warning.active{background-color:#c67605 \9;} +.btn-danger{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#da4f49;background-image:-moz-linear-gradient(top, #ee5f5b, #bd362f);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f));background-image:-webkit-linear-gradient(top, #ee5f5b, #bd362f);background-image:-o-linear-gradient(top, #ee5f5b, #bd362f);background-image:linear-gradient(to bottom, #ee5f5b, #bd362f);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0);border-color:#bd362f #bd362f #802420;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#bd362f;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-danger:hover,.btn-danger:focus,.btn-danger:active,.btn-danger.active,.btn-danger.disabled,.btn-danger[disabled]{color:#ffffff;background-color:#bd362f;*background-color:#a9302a;} +.btn-danger:active,.btn-danger.active{background-color:#942a25 \9;} +.btn-success{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#5bb75b;background-image:-moz-linear-gradient(top, #62c462, #51a351);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351));background-image:-webkit-linear-gradient(top, #62c462, #51a351);background-image:-o-linear-gradient(top, #62c462, #51a351);background-image:linear-gradient(to bottom, #62c462, #51a351);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0);border-color:#51a351 #51a351 #387038;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#51a351;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-success:hover,.btn-success:focus,.btn-success:active,.btn-success.active,.btn-success.disabled,.btn-success[disabled]{color:#ffffff;background-color:#51a351;*background-color:#499249;} +.btn-success:active,.btn-success.active{background-color:#408140 \9;} +.btn-info{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#49afcd;background-image:-moz-linear-gradient(top, #5bc0de, #2f96b4);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4));background-image:-webkit-linear-gradient(top, #5bc0de, #2f96b4);background-image:-o-linear-gradient(top, #5bc0de, #2f96b4);background-image:linear-gradient(to bottom, #5bc0de, #2f96b4);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0);border-color:#2f96b4 #2f96b4 #1f6377;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#2f96b4;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-info:hover,.btn-info:focus,.btn-info:active,.btn-info.active,.btn-info.disabled,.btn-info[disabled]{color:#ffffff;background-color:#2f96b4;*background-color:#2a85a0;} +.btn-info:active,.btn-info.active{background-color:#24748c \9;} +.btn-inverse{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#363636;background-image:-moz-linear-gradient(top, #444444, #222222);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222));background-image:-webkit-linear-gradient(top, #444444, #222222);background-image:-o-linear-gradient(top, #444444, #222222);background-image:linear-gradient(to bottom, #444444, #222222);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0);border-color:#222222 #222222 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#222222;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.btn-inverse:hover,.btn-inverse:focus,.btn-inverse:active,.btn-inverse.active,.btn-inverse.disabled,.btn-inverse[disabled]{color:#ffffff;background-color:#222222;*background-color:#151515;} +.btn-inverse:active,.btn-inverse.active{background-color:#080808 \9;} +button.btn,input[type="submit"].btn{*padding-top:3px;*padding-bottom:3px;}button.btn::-moz-focus-inner,input[type="submit"].btn::-moz-focus-inner{padding:0;border:0;} +button.btn.btn-large,input[type="submit"].btn.btn-large{*padding-top:7px;*padding-bottom:7px;} +button.btn.btn-small,input[type="submit"].btn.btn-small{*padding-top:3px;*padding-bottom:3px;} +button.btn.btn-mini,input[type="submit"].btn.btn-mini{*padding-top:1px;*padding-bottom:1px;} +.btn-link,.btn-link:active,.btn-link[disabled]{background-color:transparent;background-image:none;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} +.btn-link{border-color:transparent;cursor:pointer;color:#0088cc;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-link:hover,.btn-link:focus{color:#005580;text-decoration:underline;background-color:transparent;} +.btn-link[disabled]:hover,.btn-link[disabled]:focus{color:#333333;text-decoration:none;} +[class^="icon-"],[class*=" icon-"]{display:inline-block;width:14px;height:14px;*margin-right:.3em;line-height:14px;vertical-align:text-top;background-image:url("../img/glyphicons-halflings.png");background-position:14px 14px;background-repeat:no-repeat;margin-top:1px;} +.icon-white,.nav-pills>.active>a>[class^="icon-"],.nav-pills>.active>a>[class*=" icon-"],.nav-list>.active>a>[class^="icon-"],.nav-list>.active>a>[class*=" icon-"],.navbar-inverse .nav>.active>a>[class^="icon-"],.navbar-inverse .nav>.active>a>[class*=" icon-"],.dropdown-menu>li>a:hover>[class^="icon-"],.dropdown-menu>li>a:focus>[class^="icon-"],.dropdown-menu>li>a:hover>[class*=" icon-"],.dropdown-menu>li>a:focus>[class*=" icon-"],.dropdown-menu>.active>a>[class^="icon-"],.dropdown-menu>.active>a>[class*=" icon-"],.dropdown-submenu:hover>a>[class^="icon-"],.dropdown-submenu:focus>a>[class^="icon-"],.dropdown-submenu:hover>a>[class*=" icon-"],.dropdown-submenu:focus>a>[class*=" icon-"]{background-image:url("../img/glyphicons-halflings-white.png");} +.icon-glass{background-position:0 0;} +.icon-music{background-position:-24px 0;} +.icon-search{background-position:-48px 0;} +.icon-envelope{background-position:-72px 0;} +.icon-heart{background-position:-96px 0;} +.icon-star{background-position:-120px 0;} +.icon-star-empty{background-position:-144px 0;} +.icon-user{background-position:-168px 0;} +.icon-film{background-position:-192px 0;} +.icon-th-large{background-position:-216px 0;} +.icon-th{background-position:-240px 0;} +.icon-th-list{background-position:-264px 0;} +.icon-ok{background-position:-288px 0;} +.icon-remove{background-position:-312px 0;} +.icon-zoom-in{background-position:-336px 0;} +.icon-zoom-out{background-position:-360px 0;} +.icon-off{background-position:-384px 0;} +.icon-signal{background-position:-408px 0;} +.icon-cog{background-position:-432px 0;} +.icon-trash{background-position:-456px 0;} +.icon-home{background-position:0 -24px;} +.icon-file{background-position:-24px -24px;} +.icon-time{background-position:-48px -24px;} +.icon-road{background-position:-72px -24px;} +.icon-download-alt{background-position:-96px -24px;} +.icon-download{background-position:-120px -24px;} +.icon-upload{background-position:-144px -24px;} +.icon-inbox{background-position:-168px -24px;} +.icon-play-circle{background-position:-192px -24px;} +.icon-repeat{background-position:-216px -24px;} +.icon-refresh{background-position:-240px -24px;} +.icon-list-alt{background-position:-264px -24px;} +.icon-lock{background-position:-287px -24px;} +.icon-flag{background-position:-312px -24px;} +.icon-headphones{background-position:-336px -24px;} +.icon-volume-off{background-position:-360px -24px;} +.icon-volume-down{background-position:-384px -24px;} +.icon-volume-up{background-position:-408px -24px;} +.icon-qrcode{background-position:-432px -24px;} +.icon-barcode{background-position:-456px -24px;} +.icon-tag{background-position:0 -48px;} +.icon-tags{background-position:-25px -48px;} +.icon-book{background-position:-48px -48px;} +.icon-bookmark{background-position:-72px -48px;} +.icon-print{background-position:-96px -48px;} +.icon-camera{background-position:-120px -48px;} +.icon-font{background-position:-144px -48px;} +.icon-bold{background-position:-167px -48px;} +.icon-italic{background-position:-192px -48px;} +.icon-text-height{background-position:-216px -48px;} +.icon-text-width{background-position:-240px -48px;} +.icon-align-left{background-position:-264px -48px;} +.icon-align-center{background-position:-288px -48px;} +.icon-align-right{background-position:-312px -48px;} +.icon-align-justify{background-position:-336px -48px;} +.icon-list{background-position:-360px -48px;} +.icon-indent-left{background-position:-384px -48px;} +.icon-indent-right{background-position:-408px -48px;} +.icon-facetime-video{background-position:-432px -48px;} +.icon-picture{background-position:-456px -48px;} +.icon-pencil{background-position:0 -72px;} +.icon-map-marker{background-position:-24px -72px;} +.icon-adjust{background-position:-48px -72px;} +.icon-tint{background-position:-72px -72px;} +.icon-edit{background-position:-96px -72px;} +.icon-share{background-position:-120px -72px;} +.icon-check{background-position:-144px -72px;} +.icon-move{background-position:-168px -72px;} +.icon-step-backward{background-position:-192px -72px;} +.icon-fast-backward{background-position:-216px -72px;} +.icon-backward{background-position:-240px -72px;} +.icon-play{background-position:-264px -72px;} +.icon-pause{background-position:-288px -72px;} +.icon-stop{background-position:-312px -72px;} +.icon-forward{background-position:-336px -72px;} +.icon-fast-forward{background-position:-360px -72px;} +.icon-step-forward{background-position:-384px -72px;} +.icon-eject{background-position:-408px -72px;} +.icon-chevron-left{background-position:-432px -72px;} +.icon-chevron-right{background-position:-456px -72px;} +.icon-plus-sign{background-position:0 -96px;} +.icon-minus-sign{background-position:-24px -96px;} +.icon-remove-sign{background-position:-48px -96px;} +.icon-ok-sign{background-position:-72px -96px;} +.icon-question-sign{background-position:-96px -96px;} +.icon-info-sign{background-position:-120px -96px;} +.icon-screenshot{background-position:-144px -96px;} +.icon-remove-circle{background-position:-168px -96px;} +.icon-ok-circle{background-position:-192px -96px;} +.icon-ban-circle{background-position:-216px -96px;} +.icon-arrow-left{background-position:-240px -96px;} +.icon-arrow-right{background-position:-264px -96px;} +.icon-arrow-up{background-position:-289px -96px;} +.icon-arrow-down{background-position:-312px -96px;} +.icon-share-alt{background-position:-336px -96px;} +.icon-resize-full{background-position:-360px -96px;} +.icon-resize-small{background-position:-384px -96px;} +.icon-plus{background-position:-408px -96px;} +.icon-minus{background-position:-433px -96px;} +.icon-asterisk{background-position:-456px -96px;} +.icon-exclamation-sign{background-position:0 -120px;} +.icon-gift{background-position:-24px -120px;} +.icon-leaf{background-position:-48px -120px;} +.icon-fire{background-position:-72px -120px;} +.icon-eye-open{background-position:-96px -120px;} +.icon-eye-close{background-position:-120px -120px;} +.icon-warning-sign{background-position:-144px -120px;} +.icon-plane{background-position:-168px -120px;} +.icon-calendar{background-position:-192px -120px;} +.icon-random{background-position:-216px -120px;width:16px;} +.icon-comment{background-position:-240px -120px;} +.icon-magnet{background-position:-264px -120px;} +.icon-chevron-up{background-position:-288px -120px;} +.icon-chevron-down{background-position:-313px -119px;} +.icon-retweet{background-position:-336px -120px;} +.icon-shopping-cart{background-position:-360px -120px;} +.icon-folder-close{background-position:-384px -120px;width:16px;} +.icon-folder-open{background-position:-408px -120px;width:16px;} +.icon-resize-vertical{background-position:-432px -119px;} +.icon-resize-horizontal{background-position:-456px -118px;} +.icon-hdd{background-position:0 -144px;} +.icon-bullhorn{background-position:-24px -144px;} +.icon-bell{background-position:-48px -144px;} +.icon-certificate{background-position:-72px -144px;} +.icon-thumbs-up{background-position:-96px -144px;} +.icon-thumbs-down{background-position:-120px -144px;} +.icon-hand-right{background-position:-144px -144px;} +.icon-hand-left{background-position:-168px -144px;} +.icon-hand-up{background-position:-192px -144px;} +.icon-hand-down{background-position:-216px -144px;} +.icon-circle-arrow-right{background-position:-240px -144px;} +.icon-circle-arrow-left{background-position:-264px -144px;} +.icon-circle-arrow-up{background-position:-288px -144px;} +.icon-circle-arrow-down{background-position:-312px -144px;} +.icon-globe{background-position:-336px -144px;} +.icon-wrench{background-position:-360px -144px;} +.icon-tasks{background-position:-384px -144px;} +.icon-filter{background-position:-408px -144px;} +.icon-briefcase{background-position:-432px -144px;} +.icon-fullscreen{background-position:-456px -144px;} +.btn-group{position:relative;display:inline-block;*display:inline;*zoom:1;font-size:0;vertical-align:middle;white-space:nowrap;*margin-left:.3em;}.btn-group:first-child{*margin-left:0;} +.btn-group+.btn-group{margin-left:5px;} +.btn-toolbar{font-size:0;margin-top:10px;margin-bottom:10px;}.btn-toolbar>.btn+.btn,.btn-toolbar>.btn-group+.btn,.btn-toolbar>.btn+.btn-group{margin-left:5px;} +.btn-group>.btn{position:relative;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group>.btn+.btn{margin-left:-1px;} +.btn-group>.btn,.btn-group>.dropdown-menu,.btn-group>.popover{font-size:13px;} +.btn-group>.btn-mini{font-size:9.75px;} +.btn-group>.btn-small{font-size:11.049999999999999px;} +.btn-group>.btn-large{font-size:16.25px;} +.btn-group>.btn:first-child{margin-left:0;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.btn-group>.btn:last-child,.btn-group>.dropdown-toggle{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.btn-group>.btn.large:first-child{margin-left:0;-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.btn-group>.btn.large:last-child,.btn-group>.large.dropdown-toggle{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.btn-group>.btn:hover,.btn-group>.btn:focus,.btn-group>.btn:active,.btn-group>.btn.active{z-index:2;} +.btn-group .dropdown-toggle:active,.btn-group.open .dropdown-toggle{outline:0;} +.btn-group>.btn+.dropdown-toggle{padding-left:8px;padding-right:8px;-webkit-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05);*padding-top:5px;*padding-bottom:5px;} +.btn-group>.btn-mini+.dropdown-toggle{padding-left:5px;padding-right:5px;*padding-top:2px;*padding-bottom:2px;} +.btn-group>.btn-small+.dropdown-toggle{*padding-top:5px;*padding-bottom:4px;} +.btn-group>.btn-large+.dropdown-toggle{padding-left:12px;padding-right:12px;*padding-top:7px;*padding-bottom:7px;} +.btn-group.open .dropdown-toggle{background-image:none;-webkit-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);-moz-box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);box-shadow:inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05);} +.btn-group.open .btn.dropdown-toggle{background-color:#e6e6e6;} +.btn-group.open .btn-primary.dropdown-toggle{background-color:#0044cc;} +.btn-group.open .btn-warning.dropdown-toggle{background-color:#f89406;} +.btn-group.open .btn-danger.dropdown-toggle{background-color:#bd362f;} +.btn-group.open .btn-success.dropdown-toggle{background-color:#51a351;} +.btn-group.open .btn-info.dropdown-toggle{background-color:#2f96b4;} +.btn-group.open .btn-inverse.dropdown-toggle{background-color:#222222;} +.btn .caret{margin-top:8px;margin-left:0;} +.btn-large .caret{margin-top:6px;} +.btn-large .caret{border-left-width:5px;border-right-width:5px;border-top-width:5px;} +.btn-mini .caret,.btn-small .caret{margin-top:8px;} +.dropup .btn-large .caret{border-bottom-width:5px;} +.btn-primary .caret,.btn-warning .caret,.btn-danger .caret,.btn-info .caret,.btn-success .caret,.btn-inverse .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.btn-group-vertical{display:inline-block;*display:inline;*zoom:1;} +.btn-group-vertical>.btn{display:block;float:none;max-width:100%;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.btn-group-vertical>.btn+.btn{margin-left:0;margin-top:-1px;} +.btn-group-vertical>.btn:first-child{-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;} +.btn-group-vertical>.btn:last-child{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;} +.btn-group-vertical>.btn-large:first-child{-webkit-border-radius:6px 6px 0 0;-moz-border-radius:6px 6px 0 0;border-radius:6px 6px 0 0;} +.btn-group-vertical>.btn-large:last-child{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} +.nav{margin-left:0;margin-bottom:20px;list-style:none;} +.nav>li>a{display:block;} +.nav>li>a:hover,.nav>li>a:focus{text-decoration:none;background-color:#eeeeee;} +.nav>li>a>img{max-width:none;} +.nav>.pull-right{float:right;} +.nav-header{display:block;padding:3px 15px;font-size:11px;font-weight:bold;line-height:20px;color:#999999;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);text-transform:uppercase;} +.nav li+.nav-header{margin-top:9px;} +.nav-list{padding-left:15px;padding-right:15px;margin-bottom:0;} +.nav-list>li>a,.nav-list .nav-header{margin-left:-15px;margin-right:-15px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);} +.nav-list>li>a{padding:3px 15px;} +.nav-list>.active>a,.nav-list>.active>a:hover,.nav-list>.active>a:focus{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.2);background-color:#0088cc;} +.nav-list [class^="icon-"],.nav-list [class*=" icon-"]{margin-right:2px;} +.nav-list .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} +.nav-tabs,.nav-pills{*zoom:1;}.nav-tabs:before,.nav-pills:before,.nav-tabs:after,.nav-pills:after{display:table;content:"";line-height:0;} +.nav-tabs:after,.nav-pills:after{clear:both;} +.nav-tabs>li,.nav-pills>li{float:left;} +.nav-tabs>li>a,.nav-pills>li>a{padding-right:12px;padding-left:12px;margin-right:2px;line-height:14px;} +.nav-tabs{border-bottom:1px solid #ddd;} +.nav-tabs>li{margin-bottom:-1px;} +.nav-tabs>li>a{padding-top:8px;padding-bottom:8px;line-height:20px;border:1px solid transparent;-webkit-border-radius:4px 4px 0 0;-moz-border-radius:4px 4px 0 0;border-radius:4px 4px 0 0;}.nav-tabs>li>a:hover,.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #dddddd;} +.nav-tabs>.active>a,.nav-tabs>.active>a:hover,.nav-tabs>.active>a:focus{color:#555555;background-color:#ffffff;border:1px solid #ddd;border-bottom-color:transparent;cursor:default;} +.nav-pills>li>a{padding-top:8px;padding-bottom:8px;margin-top:2px;margin-bottom:2px;-webkit-border-radius:5px;-moz-border-radius:5px;border-radius:5px;} +.nav-pills>.active>a,.nav-pills>.active>a:hover,.nav-pills>.active>a:focus{color:#ffffff;background-color:#0088cc;} +.nav-stacked>li{float:none;} +.nav-stacked>li>a{margin-right:0;} +.nav-tabs.nav-stacked{border-bottom:0;} +.nav-tabs.nav-stacked>li>a{border:1px solid #ddd;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.nav-tabs.nav-stacked>li:first-child>a{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;} +.nav-tabs.nav-stacked>li:last-child>a{-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.nav-tabs.nav-stacked>li>a:hover,.nav-tabs.nav-stacked>li>a:focus{border-color:#ddd;z-index:2;} +.nav-pills.nav-stacked>li>a{margin-bottom:3px;} +.nav-pills.nav-stacked>li:last-child>a{margin-bottom:1px;} +.nav-tabs .dropdown-menu{-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;} +.nav-pills .dropdown-menu{-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.nav .dropdown-toggle .caret{border-top-color:#0088cc;border-bottom-color:#0088cc;margin-top:6px;} +.nav .dropdown-toggle:hover .caret,.nav .dropdown-toggle:focus .caret{border-top-color:#005580;border-bottom-color:#005580;} +.nav-tabs .dropdown-toggle .caret{margin-top:8px;} +.nav .active .dropdown-toggle .caret{border-top-color:#fff;border-bottom-color:#fff;} +.nav-tabs .active .dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} +.nav>.dropdown.active>a:hover,.nav>.dropdown.active>a:focus{cursor:pointer;} +.nav-tabs .open .dropdown-toggle,.nav-pills .open .dropdown-toggle,.nav>li.dropdown.open.active>a:hover,.nav>li.dropdown.open.active>a:focus{color:#ffffff;background-color:#999999;border-color:#999999;} +.nav li.dropdown.open .caret,.nav li.dropdown.open.active .caret,.nav li.dropdown.open a:hover .caret,.nav li.dropdown.open a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;opacity:1;filter:alpha(opacity=100);} +.tabs-stacked .open>a:hover,.tabs-stacked .open>a:focus{border-color:#999999;} +.tabbable{*zoom:1;}.tabbable:before,.tabbable:after{display:table;content:"";line-height:0;} +.tabbable:after{clear:both;} +.tab-content{overflow:auto;} +.tabs-below>.nav-tabs,.tabs-right>.nav-tabs,.tabs-left>.nav-tabs{border-bottom:0;} +.tab-content>.tab-pane,.pill-content>.pill-pane{display:none;} +.tab-content>.active,.pill-content>.active{display:block;} +.tabs-below>.nav-tabs{border-top:1px solid #ddd;} +.tabs-below>.nav-tabs>li{margin-top:-1px;margin-bottom:0;} +.tabs-below>.nav-tabs>li>a{-webkit-border-radius:0 0 4px 4px;-moz-border-radius:0 0 4px 4px;border-radius:0 0 4px 4px;}.tabs-below>.nav-tabs>li>a:hover,.tabs-below>.nav-tabs>li>a:focus{border-bottom-color:transparent;border-top-color:#ddd;} +.tabs-below>.nav-tabs>.active>a,.tabs-below>.nav-tabs>.active>a:hover,.tabs-below>.nav-tabs>.active>a:focus{border-color:transparent #ddd #ddd #ddd;} +.tabs-left>.nav-tabs>li,.tabs-right>.nav-tabs>li{float:none;} +.tabs-left>.nav-tabs>li>a,.tabs-right>.nav-tabs>li>a{min-width:74px;margin-right:0;margin-bottom:3px;} +.tabs-left>.nav-tabs{float:left;margin-right:19px;border-right:1px solid #ddd;} +.tabs-left>.nav-tabs>li>a{margin-right:-1px;-webkit-border-radius:4px 0 0 4px;-moz-border-radius:4px 0 0 4px;border-radius:4px 0 0 4px;} +.tabs-left>.nav-tabs>li>a:hover,.tabs-left>.nav-tabs>li>a:focus{border-color:#eeeeee #dddddd #eeeeee #eeeeee;} +.tabs-left>.nav-tabs .active>a,.tabs-left>.nav-tabs .active>a:hover,.tabs-left>.nav-tabs .active>a:focus{border-color:#ddd transparent #ddd #ddd;*border-right-color:#ffffff;} +.tabs-right>.nav-tabs{float:right;margin-left:19px;border-left:1px solid #ddd;} +.tabs-right>.nav-tabs>li>a{margin-left:-1px;-webkit-border-radius:0 4px 4px 0;-moz-border-radius:0 4px 4px 0;border-radius:0 4px 4px 0;} +.tabs-right>.nav-tabs>li>a:hover,.tabs-right>.nav-tabs>li>a:focus{border-color:#eeeeee #eeeeee #eeeeee #dddddd;} +.tabs-right>.nav-tabs .active>a,.tabs-right>.nav-tabs .active>a:hover,.tabs-right>.nav-tabs .active>a:focus{border-color:#ddd #ddd #ddd transparent;*border-left-color:#ffffff;} +.nav>.disabled>a{color:#999999;} +.nav>.disabled>a:hover,.nav>.disabled>a:focus{text-decoration:none;background-color:transparent;cursor:default;} +.navbar{overflow:visible;margin-bottom:20px;*position:relative;*z-index:2;} +.navbar-inner{min-height:40px;padding-left:20px;padding-right:20px;background-color:#fafafa;background-image:-moz-linear-gradient(top, #ffffff, #f2f2f2);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2));background-image:-webkit-linear-gradient(top, #ffffff, #f2f2f2);background-image:-o-linear-gradient(top, #ffffff, #f2f2f2);background-image:linear-gradient(to bottom, #ffffff, #f2f2f2);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0);border:1px solid #d4d4d4;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);-moz-box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);box-shadow:0 1px 4px rgba(0, 0, 0, 0.065);*zoom:1;}.navbar-inner:before,.navbar-inner:after{display:table;content:"";line-height:0;} +.navbar-inner:after{clear:both;} +.navbar .container{width:auto;} +.nav-collapse.collapse{height:auto;overflow:visible;} +.navbar .brand{float:left;display:block;padding:10px 20px 10px;margin-left:-20px;font-size:20px;font-weight:200;color:#777777;text-shadow:0 1px 0 #ffffff;}.navbar .brand:hover,.navbar .brand:focus{text-decoration:none;} +.navbar-text{margin-bottom:0;line-height:40px;color:#777777;} +.navbar-link{color:#777777;}.navbar-link:hover,.navbar-link:focus{color:#333333;} +.navbar .divider-vertical{height:40px;margin:0 9px;border-left:1px solid #f2f2f2;border-right:1px solid #ffffff;} +.navbar .btn,.navbar .btn-group{margin-top:5px;} +.navbar .btn-group .btn,.navbar .input-prepend .btn,.navbar .input-append .btn,.navbar .input-prepend .btn-group,.navbar .input-append .btn-group{margin-top:0;} +.navbar-form{margin-bottom:0;*zoom:1;}.navbar-form:before,.navbar-form:after{display:table;content:"";line-height:0;} +.navbar-form:after{clear:both;} +.navbar-form input,.navbar-form select,.navbar-form .radio,.navbar-form .checkbox{margin-top:5px;} +.navbar-form input,.navbar-form select,.navbar-form .btn{display:inline-block;margin-bottom:0;} +.navbar-form input[type="image"],.navbar-form input[type="checkbox"],.navbar-form input[type="radio"]{margin-top:3px;} +.navbar-form .input-append,.navbar-form .input-prepend{margin-top:5px;white-space:nowrap;}.navbar-form .input-append input,.navbar-form .input-prepend input{margin-top:0;} +.navbar-search{position:relative;float:left;margin-top:5px;margin-bottom:0;}.navbar-search .search-query{margin-bottom:0;padding:4px 14px;font-family:"Helvetica Neue",Helvetica,Arial,sans-serif;font-size:13px;font-weight:normal;line-height:1;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.navbar-static-top{position:static;margin-bottom:0;}.navbar-static-top .navbar-inner{-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar-fixed-top,.navbar-fixed-bottom{position:fixed;right:0;left:0;z-index:1030;margin-bottom:0;} +.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{border-width:0 0 1px;} +.navbar-fixed-bottom .navbar-inner{border-width:1px 0 0;} +.navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding-left:0;padding-right:0;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;} +.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:940px;} +.navbar-fixed-top{top:0;} +.navbar-fixed-top .navbar-inner,.navbar-static-top .navbar-inner{-webkit-box-shadow:0 1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 1px 10px rgba(0,0,0,.1);box-shadow:0 1px 10px rgba(0,0,0,.1);} +.navbar-fixed-bottom{bottom:0;}.navbar-fixed-bottom .navbar-inner{-webkit-box-shadow:0 -1px 10px rgba(0,0,0,.1);-moz-box-shadow:0 -1px 10px rgba(0,0,0,.1);box-shadow:0 -1px 10px rgba(0,0,0,.1);} +.navbar .nav{position:relative;left:0;display:block;float:left;margin:0 10px 0 0;} +.navbar .nav.pull-right{float:right;margin-right:0;} +.navbar .nav>li{float:left;} +.navbar .nav>li>a{float:none;padding:10px 15px 10px;color:#777777;text-decoration:none;text-shadow:0 1px 0 #ffffff;} +.navbar .nav .dropdown-toggle .caret{margin-top:8px;} +.navbar .nav>li>a:focus,.navbar .nav>li>a:hover{background-color:transparent;color:#333333;text-decoration:none;} +.navbar .nav>.active>a,.navbar .nav>.active>a:hover,.navbar .nav>.active>a:focus{color:#555555;text-decoration:none;background-color:#e5e5e5;-webkit-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);-moz-box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);box-shadow:inset 0 3px 8px rgba(0, 0, 0, 0.125);} +.navbar .btn-navbar{display:none;float:right;padding:7px 10px;margin-left:5px;margin-right:5px;color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#ededed;background-image:-moz-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5));background-image:-webkit-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:-o-linear-gradient(top, #f2f2f2, #e5e5e5);background-image:linear-gradient(to bottom, #f2f2f2, #e5e5e5);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0);border-color:#e5e5e5 #e5e5e5 #bfbfbf;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#e5e5e5;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075);}.navbar .btn-navbar:hover,.navbar .btn-navbar:focus,.navbar .btn-navbar:active,.navbar .btn-navbar.active,.navbar .btn-navbar.disabled,.navbar .btn-navbar[disabled]{color:#ffffff;background-color:#e5e5e5;*background-color:#d9d9d9;} +.navbar .btn-navbar:active,.navbar .btn-navbar.active{background-color:#cccccc \9;} +.navbar .btn-navbar .icon-bar{display:block;width:18px;height:2px;background-color:#f5f5f5;-webkit-border-radius:1px;-moz-border-radius:1px;border-radius:1px;-webkit-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);-moz-box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);box-shadow:0 1px 0 rgba(0, 0, 0, 0.25);} +.btn-navbar .icon-bar+.icon-bar{margin-top:3px;} +.navbar .nav>li>.dropdown-menu:before{content:'';display:inline-block;border-left:7px solid transparent;border-right:7px solid transparent;border-bottom:7px solid #ccc;border-bottom-color:rgba(0, 0, 0, 0.2);position:absolute;top:-7px;left:9px;} +.navbar .nav>li>.dropdown-menu:after{content:'';display:inline-block;border-left:6px solid transparent;border-right:6px solid transparent;border-bottom:6px solid #ffffff;position:absolute;top:-6px;left:10px;} +.navbar-fixed-bottom .nav>li>.dropdown-menu:before{border-top:7px solid #ccc;border-top-color:rgba(0, 0, 0, 0.2);border-bottom:0;bottom:-7px;top:auto;} +.navbar-fixed-bottom .nav>li>.dropdown-menu:after{border-top:6px solid #ffffff;border-bottom:0;bottom:-6px;top:auto;} +.navbar .nav li.dropdown>a:hover .caret,.navbar .nav li.dropdown>a:focus .caret{border-top-color:#333333;border-bottom-color:#333333;} +.navbar .nav li.dropdown.open>.dropdown-toggle,.navbar .nav li.dropdown.active>.dropdown-toggle,.navbar .nav li.dropdown.open.active>.dropdown-toggle{background-color:#e5e5e5;color:#555555;} +.navbar .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#777777;border-bottom-color:#777777;} +.navbar .nav li.dropdown.open>.dropdown-toggle .caret,.navbar .nav li.dropdown.active>.dropdown-toggle .caret,.navbar .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#555555;border-bottom-color:#555555;} +.navbar .pull-right>li>.dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right{left:auto;right:0;}.navbar .pull-right>li>.dropdown-menu:before,.navbar .nav>li>.dropdown-menu.pull-right:before{left:auto;right:12px;} +.navbar .pull-right>li>.dropdown-menu:after,.navbar .nav>li>.dropdown-menu.pull-right:after{left:auto;right:13px;} +.navbar .pull-right>li>.dropdown-menu .dropdown-menu,.navbar .nav>li>.dropdown-menu.pull-right .dropdown-menu{left:auto;right:100%;margin-left:0;margin-right:-1px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} +.navbar-inverse .navbar-inner{background-color:#1b1b1b;background-image:-moz-linear-gradient(top, #222222, #111111);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111));background-image:-webkit-linear-gradient(top, #222222, #111111);background-image:-o-linear-gradient(top, #222222, #111111);background-image:linear-gradient(to bottom, #222222, #111111);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0);border-color:#252525;} +.navbar-inverse .brand,.navbar-inverse .nav>li>a{color:#999999;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);}.navbar-inverse .brand:hover,.navbar-inverse .nav>li>a:hover,.navbar-inverse .brand:focus,.navbar-inverse .nav>li>a:focus{color:#ffffff;} +.navbar-inverse .brand{color:#999999;} +.navbar-inverse .navbar-text{color:#999999;} +.navbar-inverse .nav>li>a:focus,.navbar-inverse .nav>li>a:hover{background-color:transparent;color:#ffffff;} +.navbar-inverse .nav .active>a,.navbar-inverse .nav .active>a:hover,.navbar-inverse .nav .active>a:focus{color:#ffffff;background-color:#111111;} +.navbar-inverse .navbar-link{color:#999999;}.navbar-inverse .navbar-link:hover,.navbar-inverse .navbar-link:focus{color:#ffffff;} +.navbar-inverse .divider-vertical{border-left-color:#111111;border-right-color:#222222;} +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle{background-color:#111111;color:#ffffff;} +.navbar-inverse .nav li.dropdown>a:hover .caret,.navbar-inverse .nav li.dropdown>a:focus .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.navbar-inverse .nav li.dropdown>.dropdown-toggle .caret{border-top-color:#999999;border-bottom-color:#999999;} +.navbar-inverse .nav li.dropdown.open>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.active>.dropdown-toggle .caret,.navbar-inverse .nav li.dropdown.open.active>.dropdown-toggle .caret{border-top-color:#ffffff;border-bottom-color:#ffffff;} +.navbar-inverse .navbar-search .search-query{color:#ffffff;background-color:#515151;border-color:#111111;-webkit-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-moz-box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);box-shadow:inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15);-webkit-transition:none;-moz-transition:none;-o-transition:none;transition:none;}.navbar-inverse .navbar-search .search-query:-moz-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query:-ms-input-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query::-webkit-input-placeholder{color:#cccccc;} +.navbar-inverse .navbar-search .search-query:focus,.navbar-inverse .navbar-search .search-query.focused{padding:5px 15px;color:#333333;text-shadow:0 1px 0 #ffffff;background-color:#ffffff;border:0;-webkit-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);-moz-box-shadow:0 0 3px rgba(0, 0, 0, 0.15);box-shadow:0 0 3px rgba(0, 0, 0, 0.15);outline:0;} +.navbar-inverse .btn-navbar{color:#ffffff;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e0e0e;background-image:-moz-linear-gradient(top, #151515, #040404);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404));background-image:-webkit-linear-gradient(top, #151515, #040404);background-image:-o-linear-gradient(top, #151515, #040404);background-image:linear-gradient(to bottom, #151515, #040404);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0);border-color:#040404 #040404 #000000;border-color:rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25);*background-color:#040404;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);}.navbar-inverse .btn-navbar:hover,.navbar-inverse .btn-navbar:focus,.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active,.navbar-inverse .btn-navbar.disabled,.navbar-inverse .btn-navbar[disabled]{color:#ffffff;background-color:#040404;*background-color:#000000;} +.navbar-inverse .btn-navbar:active,.navbar-inverse .btn-navbar.active{background-color:#000000 \9;} +.breadcrumb{padding:8px 15px;margin:0 0 20px;list-style:none;background-color:#f5f5f5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;}.breadcrumb>li{display:inline-block;*display:inline;*zoom:1;text-shadow:0 1px 0 #ffffff;}.breadcrumb>li>.divider{padding:0 5px;color:#ccc;} +.breadcrumb>.active{color:#999999;} +.pagination{margin:20px 0;} +.pagination ul{display:inline-block;*display:inline;*zoom:1;margin-left:0;margin-bottom:0;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);-moz-box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);box-shadow:0 1px 2px rgba(0, 0, 0, 0.05);} +.pagination ul>li{display:inline;} +.pagination ul>li>a,.pagination ul>li>span{float:left;padding:4px 12px;line-height:20px;text-decoration:none;background-color:#ffffff;border:1px solid #dddddd;border-left-width:0;} +.pagination ul>li>a:hover,.pagination ul>li>a:focus,.pagination ul>.active>a,.pagination ul>.active>span{background-color:#f5f5f5;} +.pagination ul>.active>a,.pagination ul>.active>span{color:#999999;cursor:default;} +.pagination ul>.disabled>span,.pagination ul>.disabled>a,.pagination ul>.disabled>a:hover,.pagination ul>.disabled>a:focus{color:#999999;background-color:transparent;cursor:default;} +.pagination ul>li:first-child>a,.pagination ul>li:first-child>span{border-left-width:1px;-webkit-border-top-left-radius:4px;-moz-border-radius-topleft:4px;border-top-left-radius:4px;-webkit-border-bottom-left-radius:4px;-moz-border-radius-bottomleft:4px;border-bottom-left-radius:4px;} +.pagination ul>li:last-child>a,.pagination ul>li:last-child>span{-webkit-border-top-right-radius:4px;-moz-border-radius-topright:4px;border-top-right-radius:4px;-webkit-border-bottom-right-radius:4px;-moz-border-radius-bottomright:4px;border-bottom-right-radius:4px;} +.pagination-centered{text-align:center;} +.pagination-right{text-align:right;} +.pagination-large ul>li>a,.pagination-large ul>li>span{padding:11px 19px;font-size:16.25px;} +.pagination-large ul>li:first-child>a,.pagination-large ul>li:first-child>span{-webkit-border-top-left-radius:6px;-moz-border-radius-topleft:6px;border-top-left-radius:6px;-webkit-border-bottom-left-radius:6px;-moz-border-radius-bottomleft:6px;border-bottom-left-radius:6px;} +.pagination-large ul>li:last-child>a,.pagination-large ul>li:last-child>span{-webkit-border-top-right-radius:6px;-moz-border-radius-topright:6px;border-top-right-radius:6px;-webkit-border-bottom-right-radius:6px;-moz-border-radius-bottomright:6px;border-bottom-right-radius:6px;} +.pagination-mini ul>li:first-child>a,.pagination-small ul>li:first-child>a,.pagination-mini ul>li:first-child>span,.pagination-small ul>li:first-child>span{-webkit-border-top-left-radius:3px;-moz-border-radius-topleft:3px;border-top-left-radius:3px;-webkit-border-bottom-left-radius:3px;-moz-border-radius-bottomleft:3px;border-bottom-left-radius:3px;} +.pagination-mini ul>li:last-child>a,.pagination-small ul>li:last-child>a,.pagination-mini ul>li:last-child>span,.pagination-small ul>li:last-child>span{-webkit-border-top-right-radius:3px;-moz-border-radius-topright:3px;border-top-right-radius:3px;-webkit-border-bottom-right-radius:3px;-moz-border-radius-bottomright:3px;border-bottom-right-radius:3px;} +.pagination-small ul>li>a,.pagination-small ul>li>span{padding:2px 10px;font-size:11.049999999999999px;} +.pagination-mini ul>li>a,.pagination-mini ul>li>span{padding:0 6px;font-size:9.75px;} +.pager{margin:20px 0;list-style:none;text-align:center;*zoom:1;}.pager:before,.pager:after{display:table;content:"";line-height:0;} +.pager:after{clear:both;} +.pager li{display:inline;} +.pager li>a,.pager li>span{display:inline-block;padding:5px 14px;background-color:#fff;border:1px solid #ddd;-webkit-border-radius:15px;-moz-border-radius:15px;border-radius:15px;} +.pager li>a:hover,.pager li>a:focus{text-decoration:none;background-color:#f5f5f5;} +.pager .next>a,.pager .next>span{float:right;} +.pager .previous>a,.pager .previous>span{float:left;} +.pager .disabled>a,.pager .disabled>a:hover,.pager .disabled>a:focus,.pager .disabled>span{color:#999999;background-color:#fff;cursor:default;} +.thumbnails{margin-left:-20px;list-style:none;*zoom:1;}.thumbnails:before,.thumbnails:after{display:table;content:"";line-height:0;} +.thumbnails:after{clear:both;} +.row-fluid .thumbnails{margin-left:0;} +.thumbnails>li{float:left;margin-bottom:20px;margin-left:20px;} +.thumbnail{display:block;padding:4px;line-height:20px;border:1px solid #ddd;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-moz-box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);box-shadow:0 1px 3px rgba(0, 0, 0, 0.055);-webkit-transition:all 0.2s ease-in-out;-moz-transition:all 0.2s ease-in-out;-o-transition:all 0.2s ease-in-out;transition:all 0.2s ease-in-out;} +a.thumbnail:hover,a.thumbnail:focus{border-color:#0088cc;-webkit-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);-moz-box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);box-shadow:0 1px 4px rgba(0, 105, 214, 0.25);} +.thumbnail>img{display:block;max-width:100%;margin-left:auto;margin-right:auto;} +.thumbnail .caption{padding:9px;color:#555555;} +.alert{padding:8px 35px 8px 14px;margin-bottom:20px;text-shadow:0 1px 0 rgba(255, 255, 255, 0.5);background-color:#fcf8e3;border:1px solid #fbeed5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.alert,.alert h4{color:#c09853;} +.alert h4{margin:0;} +.alert .close{position:relative;top:-2px;right:-21px;line-height:20px;} +.alert-success{background-color:#dff0d8;border-color:#d6e9c6;color:#468847;} +.alert-success h4{color:#468847;} +.alert-danger,.alert-error{background-color:#f2dede;border-color:#eed3d7;color:#b94a48;} +.alert-danger h4,.alert-error h4{color:#b94a48;} +.alert-info{background-color:#d9edf7;border-color:#bce8f1;color:#3a87ad;} +.alert-info h4{color:#3a87ad;} +.alert-block{padding-top:14px;padding-bottom:14px;} +.alert-block>p,.alert-block>ul{margin-bottom:0;} +.alert-block p+p{margin-top:5px;} +@-webkit-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-moz-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-ms-keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}@-o-keyframes progress-bar-stripes{from{background-position:0 0;} to{background-position:40px 0;}}@keyframes progress-bar-stripes{from{background-position:40px 0;} to{background-position:0 0;}}.progress{overflow:hidden;height:20px;margin-bottom:20px;background-color:#f7f7f7;background-image:-moz-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9));background-image:-webkit-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:-o-linear-gradient(top, #f5f5f5, #f9f9f9);background-image:linear-gradient(to bottom, #f5f5f5, #f9f9f9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0);-webkit-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-moz-box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);box-shadow:inset 0 1px 2px rgba(0, 0, 0, 0.1);-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.progress .bar{width:0%;height:100%;color:#ffffff;float:left;font-size:12px;text-align:center;text-shadow:0 -1px 0 rgba(0, 0, 0, 0.25);background-color:#0e90d2;background-image:-moz-linear-gradient(top, #149bdf, #0480be);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be));background-image:-webkit-linear-gradient(top, #149bdf, #0480be);background-image:-o-linear-gradient(top, #149bdf, #0480be);background-image:linear-gradient(to bottom, #149bdf, #0480be);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0);-webkit-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-moz-box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);box-shadow:inset 0 -1px 0 rgba(0, 0, 0, 0.15);-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;-webkit-transition:width 0.6s ease;-moz-transition:width 0.6s ease;-o-transition:width 0.6s ease;transition:width 0.6s ease;} +.progress .bar+.bar{-webkit-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);-moz-box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);box-shadow:inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15);} +.progress-striped .bar{background-color:#149bdf;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);-webkit-background-size:40px 40px;-moz-background-size:40px 40px;-o-background-size:40px 40px;background-size:40px 40px;} +.progress.active .bar{-webkit-animation:progress-bar-stripes 2s linear infinite;-moz-animation:progress-bar-stripes 2s linear infinite;-ms-animation:progress-bar-stripes 2s linear infinite;-o-animation:progress-bar-stripes 2s linear infinite;animation:progress-bar-stripes 2s linear infinite;} +.progress-danger .bar,.progress .bar-danger{background-color:#dd514c;background-image:-moz-linear-gradient(top, #ee5f5b, #c43c35);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35));background-image:-webkit-linear-gradient(top, #ee5f5b, #c43c35);background-image:-o-linear-gradient(top, #ee5f5b, #c43c35);background-image:linear-gradient(to bottom, #ee5f5b, #c43c35);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0);} +.progress-danger.progress-striped .bar,.progress-striped .bar-danger{background-color:#ee5f5b;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-success .bar,.progress .bar-success{background-color:#5eb95e;background-image:-moz-linear-gradient(top, #62c462, #57a957);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957));background-image:-webkit-linear-gradient(top, #62c462, #57a957);background-image:-o-linear-gradient(top, #62c462, #57a957);background-image:linear-gradient(to bottom, #62c462, #57a957);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0);} +.progress-success.progress-striped .bar,.progress-striped .bar-success{background-color:#62c462;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-info .bar,.progress .bar-info{background-color:#4bb1cf;background-image:-moz-linear-gradient(top, #5bc0de, #339bb9);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9));background-image:-webkit-linear-gradient(top, #5bc0de, #339bb9);background-image:-o-linear-gradient(top, #5bc0de, #339bb9);background-image:linear-gradient(to bottom, #5bc0de, #339bb9);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0);} +.progress-info.progress-striped .bar,.progress-striped .bar-info{background-color:#5bc0de;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.progress-warning .bar,.progress .bar-warning{background-color:#faa732;background-image:-moz-linear-gradient(top, #fbb450, #f89406);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406));background-image:-webkit-linear-gradient(top, #fbb450, #f89406);background-image:-o-linear-gradient(top, #fbb450, #f89406);background-image:linear-gradient(to bottom, #fbb450, #f89406);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0);} +.progress-warning.progress-striped .bar,.progress-striped .bar-warning{background-color:#fbb450;background-image:-webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent));background-image:-webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:-o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);background-image:linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent);} +.hero-unit{padding:60px;margin-bottom:30px;font-size:18px;font-weight:200;line-height:30px;color:inherit;background-color:#eeeeee;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;}.hero-unit h1{margin-bottom:0;font-size:60px;line-height:1;color:inherit;letter-spacing:-1px;} +.hero-unit li{line-height:30px;} +.media,.media-body{overflow:hidden;*overflow:visible;zoom:1;} +.media,.media .media{margin-top:15px;} +.media:first-child{margin-top:0;} +.media-object{display:block;} +.media-heading{margin:0 0 5px;} +.media>.pull-left{margin-right:10px;} +.media>.pull-right{margin-left:10px;} +.media-list{margin-left:0;list-style:none;} +.tooltip{position:absolute;z-index:1030;display:block;visibility:visible;font-size:11px;line-height:1.4;opacity:0;filter:alpha(opacity=0);}.tooltip.in{opacity:0.8;filter:alpha(opacity=80);} +.tooltip.top{margin-top:-3px;padding:5px 0;} +.tooltip.right{margin-left:3px;padding:0 5px;} +.tooltip.bottom{margin-top:3px;padding:5px 0;} +.tooltip.left{margin-left:-3px;padding:0 5px;} +.tooltip-inner{max-width:200px;padding:8px;color:#ffffff;text-align:center;text-decoration:none;background-color:#000000;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.tooltip-arrow{position:absolute;width:0;height:0;border-color:transparent;border-style:solid;} +.tooltip.top .tooltip-arrow{bottom:0;left:50%;margin-left:-5px;border-width:5px 5px 0;border-top-color:#000000;} +.tooltip.right .tooltip-arrow{top:50%;left:0;margin-top:-5px;border-width:5px 5px 5px 0;border-right-color:#000000;} +.tooltip.left .tooltip-arrow{top:50%;right:0;margin-top:-5px;border-width:5px 0 5px 5px;border-left-color:#000000;} +.tooltip.bottom .tooltip-arrow{top:0;left:50%;margin-left:-5px;border-width:0 5px 5px;border-bottom-color:#000000;} +.popover{position:absolute;top:0;left:0;z-index:1010;display:none;max-width:276px;padding:1px;text-align:left;background-color:#ffffff;-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);white-space:normal;}.popover.top{margin-top:-10px;} +.popover.right{margin-left:10px;} +.popover.bottom{margin-top:10px;} +.popover.left{margin-left:-10px;} +.popover-title{margin:0;padding:8px 14px;font-size:14px;font-weight:normal;line-height:18px;background-color:#f7f7f7;border-bottom:1px solid #ebebeb;-webkit-border-radius:5px 5px 0 0;-moz-border-radius:5px 5px 0 0;border-radius:5px 5px 0 0;}.popover-title:empty{display:none;} +.popover-content{padding:9px 14px;} +.popover .arrow,.popover .arrow:after{position:absolute;display:block;width:0;height:0;border-color:transparent;border-style:solid;} +.popover .arrow{border-width:11px;} +.popover .arrow:after{border-width:10px;content:"";} +.popover.top .arrow{left:50%;margin-left:-11px;border-bottom-width:0;border-top-color:#999;border-top-color:rgba(0, 0, 0, 0.25);bottom:-11px;}.popover.top .arrow:after{bottom:1px;margin-left:-10px;border-bottom-width:0;border-top-color:#ffffff;} +.popover.right .arrow{top:50%;left:-11px;margin-top:-11px;border-left-width:0;border-right-color:#999;border-right-color:rgba(0, 0, 0, 0.25);}.popover.right .arrow:after{left:1px;bottom:-10px;border-left-width:0;border-right-color:#ffffff;} +.popover.bottom .arrow{left:50%;margin-left:-11px;border-top-width:0;border-bottom-color:#999;border-bottom-color:rgba(0, 0, 0, 0.25);top:-11px;}.popover.bottom .arrow:after{top:1px;margin-left:-10px;border-top-width:0;border-bottom-color:#ffffff;} +.popover.left .arrow{top:50%;right:-11px;margin-top:-11px;border-right-width:0;border-left-color:#999;border-left-color:rgba(0, 0, 0, 0.25);}.popover.left .arrow:after{right:1px;border-right-width:0;border-left-color:#ffffff;bottom:-10px;} +.modal-backdrop{position:fixed;top:0;right:0;bottom:0;left:0;z-index:1040;background-color:#000000;}.modal-backdrop.fade{opacity:0;} +.modal-backdrop,.modal-backdrop.fade.in{opacity:0.8;filter:alpha(opacity=80);} +.modal{position:fixed;top:10%;left:50%;z-index:1050;width:560px;margin-left:-280px;background-color:#ffffff;border:1px solid #999;border:1px solid rgba(0, 0, 0, 0.3);*border:1px solid #999;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-moz-box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);box-shadow:0 3px 7px rgba(0, 0, 0, 0.3);-webkit-background-clip:padding-box;-moz-background-clip:padding-box;background-clip:padding-box;outline:none;}.modal.fade{-webkit-transition:opacity .3s linear, top .3s ease-out;-moz-transition:opacity .3s linear, top .3s ease-out;-o-transition:opacity .3s linear, top .3s ease-out;transition:opacity .3s linear, top .3s ease-out;top:-25%;} +.modal.fade.in{top:10%;} +.modal-header{padding:9px 15px;border-bottom:1px solid #eee;}.modal-header .close{margin-top:2px;} +.modal-header h3{margin:0;line-height:30px;} +.modal-body{position:relative;overflow-y:auto;max-height:400px;padding:15px;} +.modal-form{margin-bottom:0;} +.modal-footer{padding:14px 15px 15px;margin-bottom:0;text-align:right;background-color:#f5f5f5;border-top:1px solid #ddd;-webkit-border-radius:0 0 6px 6px;-moz-border-radius:0 0 6px 6px;border-radius:0 0 6px 6px;-webkit-box-shadow:inset 0 1px 0 #ffffff;-moz-box-shadow:inset 0 1px 0 #ffffff;box-shadow:inset 0 1px 0 #ffffff;*zoom:1;}.modal-footer:before,.modal-footer:after{display:table;content:"";line-height:0;} +.modal-footer:after{clear:both;} +.modal-footer .btn+.btn{margin-left:5px;margin-bottom:0;} +.modal-footer .btn-group .btn+.btn{margin-left:-1px;} +.modal-footer .btn-block+.btn-block{margin-left:0;} +.dropup,.dropdown{position:relative;} +.dropdown-toggle{*margin-bottom:-3px;} +.dropdown-toggle:active,.open .dropdown-toggle{outline:0;} +.caret{display:inline-block;width:0;height:0;vertical-align:top;border-top:4px solid #000000;border-right:4px solid transparent;border-left:4px solid transparent;content:"";} +.dropdown .caret{margin-top:8px;margin-left:2px;} +.dropdown-menu{position:absolute;top:100%;left:0;z-index:1000;display:none;float:left;min-width:160px;padding:5px 0;margin:2px 0 0;list-style:none;background-color:#ffffff;border:1px solid #ccc;border:1px solid rgba(0, 0, 0, 0.2);*border-right-width:2px;*border-bottom-width:2px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;-webkit-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-moz-box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);box-shadow:0 5px 10px rgba(0, 0, 0, 0.2);-webkit-background-clip:padding-box;-moz-background-clip:padding;background-clip:padding-box;}.dropdown-menu.pull-right{right:0;left:auto;} +.dropdown-menu .divider{*width:100%;height:1px;margin:9px 1px;*margin:-5px 0 5px;overflow:hidden;background-color:#e5e5e5;border-bottom:1px solid #ffffff;} +.dropdown-menu>li>a{display:block;padding:3px 20px;clear:both;font-weight:normal;line-height:20px;color:#333333;white-space:nowrap;} +.dropdown-menu>li>a:hover,.dropdown-menu>li>a:focus,.dropdown-submenu:hover>a,.dropdown-submenu:focus>a{text-decoration:none;color:#ffffff;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} +.dropdown-menu>.active>a,.dropdown-menu>.active>a:hover,.dropdown-menu>.active>a:focus{color:#ffffff;text-decoration:none;outline:0;background-color:#0081c2;background-image:-moz-linear-gradient(top, #0088cc, #0077b3);background-image:-webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3));background-image:-webkit-linear-gradient(top, #0088cc, #0077b3);background-image:-o-linear-gradient(top, #0088cc, #0077b3);background-image:linear-gradient(to bottom, #0088cc, #0077b3);background-repeat:repeat-x;filter:progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0);} +.dropdown-menu>.disabled>a,.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{color:#999999;} +.dropdown-menu>.disabled>a:hover,.dropdown-menu>.disabled>a:focus{text-decoration:none;background-color:transparent;background-image:none;filter:progid:DXImageTransform.Microsoft.gradient(enabled = false);cursor:default;} +.open{*z-index:1000;}.open>.dropdown-menu{display:block;} +.dropdown-backdrop{position:fixed;left:0;right:0;bottom:0;top:0;z-index:990;} +.pull-right>.dropdown-menu{right:0;left:auto;} +.dropup .caret,.navbar-fixed-bottom .dropdown .caret{border-top:0;border-bottom:4px solid #000000;content:"";} +.dropup .dropdown-menu,.navbar-fixed-bottom .dropdown .dropdown-menu{top:auto;bottom:100%;margin-bottom:1px;} +.dropdown-submenu{position:relative;} +.dropdown-submenu>.dropdown-menu{top:0;left:100%;margin-top:-6px;margin-left:-1px;-webkit-border-radius:0 6px 6px 6px;-moz-border-radius:0 6px 6px 6px;border-radius:0 6px 6px 6px;} +.dropdown-submenu:hover>.dropdown-menu{display:block;} +.dropup .dropdown-submenu>.dropdown-menu{top:auto;bottom:0;margin-top:0;margin-bottom:-2px;-webkit-border-radius:5px 5px 5px 0;-moz-border-radius:5px 5px 5px 0;border-radius:5px 5px 5px 0;} +.dropdown-submenu>a:after{display:block;content:" ";float:right;width:0;height:0;border-color:transparent;border-style:solid;border-width:5px 0 5px 5px;border-left-color:#cccccc;margin-top:5px;margin-right:-10px;} +.dropdown-submenu:hover>a:after{border-left-color:#ffffff;} +.dropdown-submenu.pull-left{float:none;}.dropdown-submenu.pull-left>.dropdown-menu{left:-100%;margin-left:10px;-webkit-border-radius:6px 0 6px 6px;-moz-border-radius:6px 0 6px 6px;border-radius:6px 0 6px 6px;} +.dropdown .dropdown-menu .nav-header{padding-left:20px;padding-right:20px;} +.typeahead{z-index:1051;margin-top:2px;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion{margin-bottom:20px;} +.accordion-group{margin-bottom:2px;border:1px solid #e5e5e5;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} +.accordion-heading{border-bottom:0;} +.accordion-heading .accordion-toggle{display:block;padding:8px 15px;} +.accordion-toggle{cursor:pointer;} +.accordion-inner{padding:9px 15px;border-top:1px solid #e5e5e5;} +.carousel{position:relative;margin-bottom:20px;line-height:1;} +.carousel-inner{overflow:hidden;width:100%;position:relative;} +.carousel-inner>.item{display:none;position:relative;-webkit-transition:0.6s ease-in-out left;-moz-transition:0.6s ease-in-out left;-o-transition:0.6s ease-in-out left;transition:0.6s ease-in-out left;}.carousel-inner>.item>img,.carousel-inner>.item>a>img{display:block;line-height:1;} +.carousel-inner>.active,.carousel-inner>.next,.carousel-inner>.prev{display:block;} +.carousel-inner>.active{left:0;} +.carousel-inner>.next,.carousel-inner>.prev{position:absolute;top:0;width:100%;} +.carousel-inner>.next{left:100%;} +.carousel-inner>.prev{left:-100%;} +.carousel-inner>.next.left,.carousel-inner>.prev.right{left:0;} +.carousel-inner>.active.left{left:-100%;} +.carousel-inner>.active.right{left:100%;} +.carousel-control{position:absolute;top:40%;left:15px;width:40px;height:40px;margin-top:-20px;font-size:60px;font-weight:100;line-height:30px;color:#ffffff;text-align:center;background:#222222;border:3px solid #ffffff;-webkit-border-radius:23px;-moz-border-radius:23px;border-radius:23px;opacity:0.5;filter:alpha(opacity=50);}.carousel-control.right{left:auto;right:15px;} +.carousel-control:hover,.carousel-control:focus{color:#ffffff;text-decoration:none;opacity:0.9;filter:alpha(opacity=90);} +.carousel-indicators{position:absolute;top:15px;right:15px;z-index:5;margin:0;list-style:none;}.carousel-indicators li{display:block;float:left;width:10px;height:10px;margin-left:5px;text-indent:-999px;background-color:#ccc;background-color:rgba(255, 255, 255, 0.25);border-radius:5px;} +.carousel-indicators .active{background-color:#fff;} +.carousel-caption{position:absolute;left:0;right:0;bottom:0;padding:15px;background:#333333;background:rgba(0, 0, 0, 0.75);} +.carousel-caption h4,.carousel-caption p{color:#ffffff;line-height:20px;} +.carousel-caption h4{margin:0 0 5px;} +.carousel-caption p{margin-bottom:0;} +.well{min-height:20px;padding:19px;margin-bottom:20px;background-color:#f5f5f5;border:1px solid #e3e3e3;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;-webkit-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);-moz-box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);box-shadow:inset 0 1px 1px rgba(0, 0, 0, 0.05);}.well blockquote{border-color:#ddd;border-color:rgba(0, 0, 0, 0.15);} +.well-large{padding:24px;-webkit-border-radius:6px;-moz-border-radius:6px;border-radius:6px;} +.well-small{padding:9px;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} +.close{float:right;font-size:20px;font-weight:bold;line-height:20px;color:#000000;text-shadow:0 1px 0 #ffffff;opacity:0.2;filter:alpha(opacity=20);}.close:hover,.close:focus{color:#000000;text-decoration:none;cursor:pointer;opacity:0.4;filter:alpha(opacity=40);} +button.close{padding:0;cursor:pointer;background:transparent;border:0;-webkit-appearance:none;} +.pull-right{float:right;} +.pull-left{float:left;} +.hide{display:none;} +.show{display:block;} +.invisible{visibility:hidden;} +.affix{position:fixed;} +.fade{opacity:0;-webkit-transition:opacity 0.15s linear;-moz-transition:opacity 0.15s linear;-o-transition:opacity 0.15s linear;transition:opacity 0.15s linear;}.fade.in{opacity:1;} +.collapse{position:relative;height:0;overflow:hidden;-webkit-transition:height 0.35s ease;-moz-transition:height 0.35s ease;-o-transition:height 0.35s ease;transition:height 0.35s ease;}.collapse.in{height:auto;} +@-ms-viewport{width:device-width;}.hidden{display:none;visibility:hidden;} +.visible-phone{display:none !important;} +.visible-tablet{display:none !important;} +.hidden-desktop{display:none !important;} +.visible-desktop{display:inherit !important;} +@media (min-width:768px) and (max-width:979px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important ;} .visible-tablet{display:inherit !important;} .hidden-tablet{display:none !important;}}@media (max-width:767px){.hidden-desktop{display:inherit !important;} .visible-desktop{display:none !important;} .visible-phone{display:inherit !important;} .hidden-phone{display:none !important;}}.visible-print{display:none !important;} +@media print{.visible-print{display:inherit !important;} .hidden-print{display:none !important;}}@media (max-width:767px){body{padding-left:20px;padding-right:20px;} .navbar-fixed-top,.navbar-fixed-bottom,.navbar-static-top{margin-left:-20px;margin-right:-20px;} .container-fluid{padding:0;} .dl-horizontal dt{float:none;clear:none;width:auto;text-align:left;} .dl-horizontal dd{margin-left:0;} .container{width:auto;} .row-fluid{width:100%;} .row,.thumbnails{margin-left:0;} .thumbnails>li{float:none;margin-left:0;} [class*="span"],.uneditable-input[class*="span"],.row-fluid [class*="span"]{float:none;display:block;width:100%;margin-left:0;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .span12,.row-fluid .span12{width:100%;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .row-fluid [class*="offset"]:first-child{margin-left:0;} .input-large,.input-xlarge,.input-xxlarge,input[class*="span"],select[class*="span"],textarea[class*="span"],.uneditable-input{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;} .input-prepend input,.input-append input,.input-prepend input[class*="span"],.input-append input[class*="span"]{display:inline-block;width:auto;} .controls-row [class*="span"]+[class*="span"]{margin-left:0;} .modal{position:fixed;top:20px;left:20px;right:20px;width:auto;margin:0;}.modal.fade{top:-100px;} .modal.fade.in{top:20px;}}@media (max-width:480px){.nav-collapse{-webkit-transform:translate3d(0, 0, 0);} .page-header h1 small{display:block;line-height:20px;} input[type="checkbox"],input[type="radio"]{border:1px solid #ccc;} .form-horizontal .control-label{float:none;width:auto;padding-top:0;text-align:left;} .form-horizontal .controls{margin-left:0;} .form-horizontal .control-list{padding-top:0;} .form-horizontal .form-actions{padding-left:10px;padding-right:10px;} .media .pull-left,.media .pull-right{float:none;display:block;margin-bottom:10px;} .media-object{margin-right:0;margin-left:0;} .modal{top:10px;left:10px;right:10px;} .modal-header .close{padding:10px;margin:-10px;} .carousel-caption{position:static;}}@media (min-width:768px) and (max-width:979px){.row{margin-left:-20px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:20px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:724px;} .span12{width:724px;} .span11{width:662px;} .span10{width:600px;} .span9{width:538px;} .span8{width:476px;} .span7{width:414px;} .span6{width:352px;} .span5{width:290px;} .span4{width:228px;} .span3{width:166px;} .span2{width:104px;} .span1{width:42px;} .offset12{margin-left:764px;} .offset11{margin-left:702px;} .offset10{margin-left:640px;} .offset9{margin-left:578px;} .offset8{margin-left:516px;} .offset7{margin-left:454px;} .offset6{margin-left:392px;} .offset5{margin-left:330px;} .offset4{margin-left:268px;} .offset3{margin-left:206px;} .offset2{margin-left:144px;} .offset1{margin-left:82px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.7624309392265194%;*margin-left:2.709239449864817%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.7624309392265194%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.43646408839778%;*width:91.38327259903608%;} .row-fluid .span10{width:82.87292817679558%;*width:82.81973668743387%;} .row-fluid .span9{width:74.30939226519337%;*width:74.25620077583166%;} .row-fluid .span8{width:65.74585635359117%;*width:65.69266486422946%;} .row-fluid .span7{width:57.18232044198895%;*width:57.12912895262725%;} .row-fluid .span6{width:48.61878453038674%;*width:48.56559304102504%;} .row-fluid .span5{width:40.05524861878453%;*width:40.00205712942283%;} .row-fluid .span4{width:31.491712707182323%;*width:31.43852121782062%;} .row-fluid .span3{width:22.92817679558011%;*width:22.87498530621841%;} .row-fluid .span2{width:14.3646408839779%;*width:14.311449394616199%;} .row-fluid .span1{width:5.801104972375691%;*width:5.747913483013988%;} .row-fluid .offset12{margin-left:105.52486187845304%;*margin-left:105.41847889972962%;} .row-fluid .offset12:first-child{margin-left:102.76243093922652%;*margin-left:102.6560479605031%;} .row-fluid .offset11{margin-left:96.96132596685082%;*margin-left:96.8549429881274%;} .row-fluid .offset11:first-child{margin-left:94.1988950276243%;*margin-left:94.09251204890089%;} .row-fluid .offset10{margin-left:88.39779005524862%;*margin-left:88.2914070765252%;} .row-fluid .offset10:first-child{margin-left:85.6353591160221%;*margin-left:85.52897613729868%;} .row-fluid .offset9{margin-left:79.8342541436464%;*margin-left:79.72787116492299%;} .row-fluid .offset9:first-child{margin-left:77.07182320441989%;*margin-left:76.96544022569647%;} .row-fluid .offset8{margin-left:71.2707182320442%;*margin-left:71.16433525332079%;} .row-fluid .offset8:first-child{margin-left:68.50828729281768%;*margin-left:68.40190431409427%;} .row-fluid .offset7{margin-left:62.70718232044199%;*margin-left:62.600799341718584%;} .row-fluid .offset7:first-child{margin-left:59.94475138121547%;*margin-left:59.838368402492065%;} .row-fluid .offset6{margin-left:54.14364640883978%;*margin-left:54.037263430116376%;} .row-fluid .offset6:first-child{margin-left:51.38121546961326%;*margin-left:51.27483249088986%;} .row-fluid .offset5{margin-left:45.58011049723757%;*margin-left:45.47372751851417%;} .row-fluid .offset5:first-child{margin-left:42.81767955801105%;*margin-left:42.71129657928765%;} .row-fluid .offset4{margin-left:37.01657458563536%;*margin-left:36.91019160691196%;} .row-fluid .offset4:first-child{margin-left:34.25414364640884%;*margin-left:34.14776066768544%;} .row-fluid .offset3{margin-left:28.45303867403315%;*margin-left:28.346655695309746%;} .row-fluid .offset3:first-child{margin-left:25.69060773480663%;*margin-left:25.584224756083227%;} .row-fluid .offset2{margin-left:19.88950276243094%;*margin-left:19.783119783707537%;} .row-fluid .offset2:first-child{margin-left:17.12707182320442%;*margin-left:17.02068884448102%;} .row-fluid .offset1{margin-left:11.32596685082873%;*margin-left:11.219583872105325%;} .row-fluid .offset1:first-child{margin-left:8.56353591160221%;*margin-left:8.457152932878806%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:20px;} input.span12,textarea.span12,.uneditable-input.span12{width:710px;} input.span11,textarea.span11,.uneditable-input.span11{width:648px;} input.span10,textarea.span10,.uneditable-input.span10{width:586px;} input.span9,textarea.span9,.uneditable-input.span9{width:524px;} input.span8,textarea.span8,.uneditable-input.span8{width:462px;} input.span7,textarea.span7,.uneditable-input.span7{width:400px;} input.span6,textarea.span6,.uneditable-input.span6{width:338px;} input.span5,textarea.span5,.uneditable-input.span5{width:276px;} input.span4,textarea.span4,.uneditable-input.span4{width:214px;} input.span3,textarea.span3,.uneditable-input.span3{width:152px;} input.span2,textarea.span2,.uneditable-input.span2{width:90px;} input.span1,textarea.span1,.uneditable-input.span1{width:28px;}}@media (min-width:1200px){.row{margin-left:-30px;*zoom:1;}.row:before,.row:after{display:table;content:"";line-height:0;} .row:after{clear:both;} [class*="span"]{float:left;min-height:1px;margin-left:30px;} .container,.navbar-static-top .container,.navbar-fixed-top .container,.navbar-fixed-bottom .container{width:1170px;} .span12{width:1170px;} .span11{width:1070px;} .span10{width:970px;} .span9{width:870px;} .span8{width:770px;} .span7{width:670px;} .span6{width:570px;} .span5{width:470px;} .span4{width:370px;} .span3{width:270px;} .span2{width:170px;} .span1{width:70px;} .offset12{margin-left:1230px;} .offset11{margin-left:1130px;} .offset10{margin-left:1030px;} .offset9{margin-left:930px;} .offset8{margin-left:830px;} .offset7{margin-left:730px;} .offset6{margin-left:630px;} .offset5{margin-left:530px;} .offset4{margin-left:430px;} .offset3{margin-left:330px;} .offset2{margin-left:230px;} .offset1{margin-left:130px;} .row-fluid{width:100%;*zoom:1;}.row-fluid:before,.row-fluid:after{display:table;content:"";line-height:0;} .row-fluid:after{clear:both;} .row-fluid [class*="span"]{display:block;width:100%;min-height:30px;-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;float:left;margin-left:2.564102564102564%;*margin-left:2.5109110747408616%;} .row-fluid [class*="span"]:first-child{margin-left:0;} .row-fluid .controls-row [class*="span"]+[class*="span"]{margin-left:2.564102564102564%;} .row-fluid .span12{width:100%;*width:99.94680851063829%;} .row-fluid .span11{width:91.45299145299145%;*width:91.39979996362975%;} .row-fluid .span10{width:82.90598290598291%;*width:82.8527914166212%;} .row-fluid .span9{width:74.35897435897436%;*width:74.30578286961266%;} .row-fluid .span8{width:65.81196581196582%;*width:65.75877432260411%;} .row-fluid .span7{width:57.26495726495726%;*width:57.21176577559556%;} .row-fluid .span6{width:48.717948717948715%;*width:48.664757228587014%;} .row-fluid .span5{width:40.17094017094017%;*width:40.11774868157847%;} .row-fluid .span4{width:31.623931623931625%;*width:31.570740134569924%;} .row-fluid .span3{width:23.076923076923077%;*width:23.023731587561375%;} .row-fluid .span2{width:14.52991452991453%;*width:14.476723040552828%;} .row-fluid .span1{width:5.982905982905983%;*width:5.929714493544281%;} .row-fluid .offset12{margin-left:105.12820512820512%;*margin-left:105.02182214948171%;} .row-fluid .offset12:first-child{margin-left:102.56410256410257%;*margin-left:102.45771958537915%;} .row-fluid .offset11{margin-left:96.58119658119658%;*margin-left:96.47481360247316%;} .row-fluid .offset11:first-child{margin-left:94.01709401709402%;*margin-left:93.91071103837061%;} .row-fluid .offset10{margin-left:88.03418803418803%;*margin-left:87.92780505546462%;} .row-fluid .offset10:first-child{margin-left:85.47008547008548%;*margin-left:85.36370249136206%;} .row-fluid .offset9{margin-left:79.48717948717949%;*margin-left:79.38079650845607%;} .row-fluid .offset9:first-child{margin-left:76.92307692307693%;*margin-left:76.81669394435352%;} .row-fluid .offset8{margin-left:70.94017094017094%;*margin-left:70.83378796144753%;} .row-fluid .offset8:first-child{margin-left:68.37606837606839%;*margin-left:68.26968539734497%;} .row-fluid .offset7{margin-left:62.393162393162385%;*margin-left:62.28677941443899%;} .row-fluid .offset7:first-child{margin-left:59.82905982905982%;*margin-left:59.72267685033642%;} .row-fluid .offset6{margin-left:53.84615384615384%;*margin-left:53.739770867430444%;} .row-fluid .offset6:first-child{margin-left:51.28205128205128%;*margin-left:51.175668303327875%;} .row-fluid .offset5{margin-left:45.299145299145295%;*margin-left:45.1927623204219%;} .row-fluid .offset5:first-child{margin-left:42.73504273504273%;*margin-left:42.62865975631933%;} .row-fluid .offset4{margin-left:36.75213675213675%;*margin-left:36.645753773413354%;} .row-fluid .offset4:first-child{margin-left:34.18803418803419%;*margin-left:34.081651209310785%;} .row-fluid .offset3{margin-left:28.205128205128204%;*margin-left:28.0987452264048%;} .row-fluid .offset3:first-child{margin-left:25.641025641025642%;*margin-left:25.53464266230224%;} .row-fluid .offset2{margin-left:19.65811965811966%;*margin-left:19.551736679396257%;} .row-fluid .offset2:first-child{margin-left:17.094017094017094%;*margin-left:16.98763411529369%;} .row-fluid .offset1{margin-left:11.11111111111111%;*margin-left:11.004728132387708%;} .row-fluid .offset1:first-child{margin-left:8.547008547008547%;*margin-left:8.440625568285142%;} input,textarea,.uneditable-input{margin-left:0;} .controls-row [class*="span"]+[class*="span"]{margin-left:30px;} input.span12,textarea.span12,.uneditable-input.span12{width:1156px;} input.span11,textarea.span11,.uneditable-input.span11{width:1056px;} input.span10,textarea.span10,.uneditable-input.span10{width:956px;} input.span9,textarea.span9,.uneditable-input.span9{width:856px;} input.span8,textarea.span8,.uneditable-input.span8{width:756px;} input.span7,textarea.span7,.uneditable-input.span7{width:656px;} input.span6,textarea.span6,.uneditable-input.span6{width:556px;} input.span5,textarea.span5,.uneditable-input.span5{width:456px;} input.span4,textarea.span4,.uneditable-input.span4{width:356px;} input.span3,textarea.span3,.uneditable-input.span3{width:256px;} input.span2,textarea.span2,.uneditable-input.span2{width:156px;} input.span1,textarea.span1,.uneditable-input.span1{width:56px;} .thumbnails{margin-left:-30px;} .thumbnails>li{margin-left:30px;} .row-fluid .thumbnails{margin-left:0;}}@media (max-width:979px){body{padding-top:0;} .navbar-fixed-top,.navbar-fixed-bottom{position:static;} .navbar-fixed-top{margin-bottom:20px;} .navbar-fixed-bottom{margin-top:20px;} .navbar-fixed-top .navbar-inner,.navbar-fixed-bottom .navbar-inner{padding:5px;} .navbar .container{width:auto;padding:0;} .navbar .brand{padding-left:10px;padding-right:10px;margin:0 0 0 -5px;} .nav-collapse{clear:both;} .nav-collapse .nav{float:none;margin:0 0 10px;} .nav-collapse .nav>li{float:none;} .nav-collapse .nav>li>a{margin-bottom:2px;} .nav-collapse .nav>.divider-vertical{display:none;} .nav-collapse .nav .nav-header{color:#777777;text-shadow:none;} .nav-collapse .nav>li>a,.nav-collapse .dropdown-menu a{padding:9px 15px;font-weight:bold;color:#777777;-webkit-border-radius:3px;-moz-border-radius:3px;border-radius:3px;} .nav-collapse .btn{padding:4px 10px 4px;font-weight:normal;-webkit-border-radius:4px;-moz-border-radius:4px;border-radius:4px;} .nav-collapse .dropdown-menu li+li a{margin-bottom:2px;} .nav-collapse .nav>li>a:hover,.nav-collapse .nav>li>a:focus,.nav-collapse .dropdown-menu a:hover,.nav-collapse .dropdown-menu a:focus{background-color:#f2f2f2;} .navbar-inverse .nav-collapse .nav>li>a,.navbar-inverse .nav-collapse .dropdown-menu a{color:#999999;} .navbar-inverse .nav-collapse .nav>li>a:hover,.navbar-inverse .nav-collapse .nav>li>a:focus,.navbar-inverse .nav-collapse .dropdown-menu a:hover,.navbar-inverse .nav-collapse .dropdown-menu a:focus{background-color:#111111;} .nav-collapse.in .btn-group{margin-top:5px;padding:0;} .nav-collapse .dropdown-menu{position:static;top:auto;left:auto;float:none;display:none;max-width:none;margin:0 15px;padding:0;background-color:transparent;border:none;-webkit-border-radius:0;-moz-border-radius:0;border-radius:0;-webkit-box-shadow:none;-moz-box-shadow:none;box-shadow:none;} .nav-collapse .open>.dropdown-menu{display:block;} .nav-collapse .dropdown-menu:before,.nav-collapse .dropdown-menu:after{display:none;} .nav-collapse .dropdown-menu .divider{display:none;} .nav-collapse .nav>li>.dropdown-menu:before,.nav-collapse .nav>li>.dropdown-menu:after{display:none;} .nav-collapse .navbar-form,.nav-collapse .navbar-search{float:none;padding:10px 15px;margin:10px 0;border-top:1px solid #f2f2f2;border-bottom:1px solid #f2f2f2;-webkit-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);-moz-box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);box-shadow:inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1);} .navbar-inverse .nav-collapse .navbar-form,.navbar-inverse .nav-collapse .navbar-search{border-top-color:#111111;border-bottom-color:#111111;} .navbar .nav-collapse .nav.pull-right{float:none;margin-left:0;} .nav-collapse,.nav-collapse.collapse{overflow:hidden;height:0;} .navbar .btn-navbar{display:block;} .navbar-static .navbar-inner{padding-left:10px;padding-right:10px;}}@media (min-width:980px){.nav-collapse.collapse{height:auto !important;overflow:visible !important;}} diff --git a/tools/ngui/static/bootstrap/img/glyphicons-halflings-white.png b/tools/ngui/static/bootstrap/img/glyphicons-halflings-white.png new file mode 100644 index 0000000000000000000000000000000000000000..3bf6484a29d8da269f9bc874b25493a45fae3bae GIT binary patch literal 8777 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 B7G?kd literal 0 HcmV?d00001 diff --git a/tools/ngui/static/bootstrap/img/glyphicons-halflings.png b/tools/ngui/static/bootstrap/img/glyphicons-halflings.png new file mode 100644 index 0000000000000000000000000000000000000000..a9969993201f9cee63cf9f49217646347297b643 GIT binary patch literal 12799 zcma*OWmH^Ivn@*S;K3nSf_t!#;0f+&pm7Po8`nk}2q8f5;M%x$SdAkd9FAvlc$ zx660V9e3Ox@4WZ^?7jZ%QFGU-T~%||Ug4iK6bbQY@zBuF2$hxOw9wF=A)nUSxR_5@ zEX>HBryGrjyuOFFv$Y4<+|3H@gQfEqD<)+}a~mryD|1U9*I_FOG&F%+Ww{SJ-V2BR zjt<81Ek$}Yb*95D4RS0HCps|uLyovt;P05hchQb-u2bzLtmog&f2}1VlNhxXV);S9 zM2buBg~!q9PtF)&KGRgf3#z7B(hm5WlNClaCWFs!-P!4-u*u5+=+D|ZE9e`KvhTHT zJBnLwGM%!u&vlE%1ytJ=!xt~y_YkFLQb6bS!E+s8l7PiPGSt9xrmg?LV&&SL?J~cI zS(e9TF1?SGyh+M_p@o1dyWu7o7_6p;N6hO!;4~ z2B`I;y`;$ZdtBpvK5%oQ^p4eR2L)BH>B$FQeC*t)c`L71gXHPUa|vyu`Bnz)H$ZcXGve(}XvR!+*8a>BLV;+ryG1kt0=)ytl zNJxFUN{V7P?#|Cp85QTa@(*Q3%K-R(Pkv1N8YU*(d(Y}9?PQ(j;NzWoEVWRD-~H$=f>j9~PN^BM2okI(gY-&_&BCV6RP&I$FnSEM3d=0fCxbxA6~l>54-upTrw zYgX@%m>jsSGi`0cQt6b8cX~+02IghVlNblR7eI;0ps}mpWUcxty1yG56C5rh%ep(X z?)#2d?C<4t-KLc*EAn>>M8%HvC1TyBSoPNg(4id~H8JwO#I)Bf;N*y6ai6K9_bA`4 z_g9(-R;qyH&6I$`b42v|0V3Z8IXN*p*8g$gE98+JpXNY+jXxU0zsR^W$#V=KP z3AEFp@OL}WqwOfsV<)A^UTF4&HF1vQecz?LWE@p^Z2){=KEC_3Iopx_eS42>DeiDG zWMXGbYfG~W7C8s@@m<_?#Gqk;!&)_Key@^0xJxrJahv{B&{^!>TV7TEDZlP|$=ZCz zmX=ZWtt4QZKx**)lQQoW8y-XLiOQy#T`2t}p6l*S`68ojyH@UXJ-b~@tN`WpjF z%7%Yzv807gsO!v=!(2uR)16!&U5~VPrPHtGzUU?2w(b1Xchq}(5Ed^G|SD7IG+kvgyVksU) z(0R)SW1V(>&q2nM%Z!C9=;pTg!(8pPSc%H01urXmQI6Gi^dkYCYfu6b4^tW))b^U+ z$2K&iOgN_OU7n#GC2jgiXU{caO5hZt0(>k+c^(r><#m|#J^s?zA6pi;^#*rp&;aqL zRcZi0Q4HhVX3$ybclxo4FFJW*`IV`)Bj_L3rQe?5{wLJh168Ve1jZv+f1D}f0S$N= zm4i|9cEWz&C9~ZI3q*gwWH^<6sBWuphgy@S3Qy?MJiL>gwd|E<2h9-$3;gT9V~S6r z)cAcmE0KXOwDA5eJ02-75d~f?3;n7a9d_xPBJaO;Z)#@s7gk5$Qn(Fc^w@9c5W0zY z59is0?Mt^@Rolcn{4%)Ioat(kxQH6}hIykSA)zht=9F_W*D#<}N(k&&;k;&gKkWIL z0Of*sP=X(Uyu$Pw;?F@?j{}=>{aSHFcii#78FC^6JGrg-)!)MV4AKz>pXnhVgTgx8 z1&5Y=>|8RGA6++FrSy=__k_imx|z-EI@foKi>tK0Hq2LetjUotCgk2QFXaej!BWYL zJc{fv(&qA7UUJ|AXLc5z*_NW#yWzKtl(c8mEW{A>5Hj^gfZ^HC9lQNQ?RowXjmuCj4!!54Us1=hY z0{@-phvC}yls!PmA~_z>Y&n&IW9FQcj}9(OLO-t^NN$c0o}YksCUWt|DV(MJB%%Sr zdf}8!9ylU2TW!=T{?)g-ojAMKc>3pW;KiZ7f0;&g)k}K^#HBhE5ot)%oxq$*$W@b# zg4p<Ou`ME|Kd1WHK@8 zzLD+0(NHWa`B{em3Ye?@aVsEi>y#0XVZfaFuq#;X5C3{*ikRx7UY4FF{ZtNHNO?A_ z#Q?hwRv~D8fPEc%B5E-ZMI&TAmikl||EERumQCRh7p;)>fdZMxvKq;ky0}7IjhJph zW*uuu*(Y6)S;Od--8uR^R#sb$cmFCnPcj9PPCWhPN;n`i1Q#Qn>ii z{WR|0>8F`vf&#E(c2NsoH=I7Cd-FV|%(7a`i}gZw4N~QFFG2WtS^H%@c?%9UZ+kez z;PwGgg_r6V>Kn5n(nZ40P4qMyrCP3bDkJp@hp6&X3>gzC>=f@Hsen<%I~7W+x@}b> z0}Et*vx_50-q@PIV=(3&Tbm}}QRo*FP2@)A#XX-8jYspIhah`9ukPBr)$8>Tmtg&R z?JBoH17?+1@Y@r>anoKPQ}F8o9?vhcG79Cjv^V6ct709VOQwg{c0Q#rBSsSmK3Q;O zBpNihl3S0_IGVE)^`#94#j~$;7+u870yWiV$@={|GrBmuz4b)*bCOPkaN0{6$MvazOEBxFdKZDlbVvv{8_*kJ zfE6C`4&Kkz<5u%dEdStd85-5UHG5IOWbo8i9azgg#zw-(P1AA049hddAB*UdG3Vn0 zX`OgM+EM|<+KhJ<=k?z~WA5waVj?T9eBdfJGebVifBKS1u<$#vl^BvSg)xsnT5Aw_ZY#}v*LXO#htB>f}x3qDdDHoFeb zAq7;0CW;XJ`d&G*9V)@H&739DpfWYzdQt+Kx_E1K#Cg1EMtFa8eQRk_JuUdHD*2;W zR~XFnl!L2A?48O;_iqCVr1oxEXvOIiN_9CUVTZs3C~P+11}ebyTRLACiJuMIG#`xP zKlC|E(S@QvN+%pBc6vPiQS8KgQAUh75C0a2xcPQDD$}*bM&z~g8+=9ltmkT$;c;s z5_=8%i0H^fEAOQbHXf0;?DN5z-5+1 zDxj50yYkz4ox9p$HbZ|H?8ukAbLE^P$@h}L%i6QVcY>)i!w=hkv2zvrduut%!8>6b zcus3bh1w~L804EZ*s96?GB&F7c5?m?|t$-tp2rKMy>F*=4;w*jW}^;8v`st&8)c; z2Ct2{)?S(Z;@_mjAEjb8x=qAQvx=}S6l9?~H?PmP`-xu;ME*B8sm|!h@BX4>u(xg_ zIHmQzp4Tgf*J}Y=8STR5_s)GKcmgV!$JKTg@LO402{{Wrg>#D4-L%vjmtJ4r?p&$F!o-BOf7ej~ z6)BuK^^g1b#(E>$s`t3i13{6-mmSp7{;QkeG5v}GAN&lM2lQT$@(aQCcFP(%UyZbF z#$HLTqGT^@F#A29b0HqiJsRJAlh8kngU`BDI6 zJUE~&!cQ*&f95Ot$#mxU5+*^$qg_DWNdfu+1irglB7yDglzH()2!@#rpu)^3S8weW z_FE$=j^GTY*|5SH95O8o8W9FluYwB=2PwtbW|JG6kcV^dMVmX(wG+Otj;E$%gfu^K z!t~<3??8=()WQSycsBKy24>NjRtuZ>zxJIED;YXaUz$@0z4rl+TW zWxmvM$%4jYIpO>j5k1t1&}1VKM~s!eLsCVQ`TTjn3JRXZD~>GM z$-IT~(Y)flNqDkC%DfbxaV9?QuWCV&-U1yzrV@0jRhE;)ZO0=r-{s@W?HOFbRHDDV zq;eLo+wOW;nI|#mNf(J?RImB9{YSO2Y`9825Lz#u4(nk3)RGv3X8B(A$TsontJ8L! z9JP^eWxtKC?G8^xAZa1HECx*rp35s!^%;&@Jyk)NexVc)@U4$^X1Dag6`WKs|(HhZ#rzO2KEw3xh~-0<;|zcs0L>OcO#YYX{SN8m6`9pp+ zQG@q$I)T?aoe#AoR@%om_#z=c@ych!bj~lV13Qi-xg$i$hXEAB#l=t7QWENGbma4L zbBf*X*4oNYZUd_;1{Ln_ZeAwQv4z?n9$eoxJeI?lU9^!AB2Y~AwOSq67dT9ADZ)s@ zCRYS7W$Zpkdx$3T>7$I%3EI2ik~m!f7&$Djpt6kZqDWZJ-G{*_eXs*B8$1R4+I}Kf zqniwCI64r;>h2Lu{0c(#Atn)%E8&)=0S4BMhq9$`vu|Ct;^ur~gL`bD>J@l)P$q_A zO7b3HGOUG`vgH{}&&AgrFy%K^>? z>wf**coZ2vdSDcNYSm~dZ(vk6&m6bVKmVgrx-X<>{QzA!)2*L+HLTQz$e8UcB&Djq zl)-%s$ZtUN-R!4ZiG=L0#_P=BbUyH+YPmFl_ogkkQ$=s@T1v}rNnZ^eMaqJ|quc+6 z*ygceDOrldsL30w`H;rNu+IjlS+G~p&0SawXCA1+D zC%cZtjUkLNq%FadtHE?O(yQTP486A{1x<{krq#rpauNQaeyhM3*i0%tBpQHQo-u)x z{0{&KS`>}vf2_}b160XZO2$b)cyrHq7ZSeiSbRvaxnKUH{Q`-P(nL&^fcF2){vhN- zbX&WEjP7?b4A%0y6n_=m%l00uZ+}mCYO(!x?j$+O$*TqoD_Q5EoyDJ?w?^UIa491H zE}87(bR`X;@u#3Qy~9wWdWQIg1`cXrk$x9=ccR|RY1~%{fAJ@uq@J3e872x0v$hmv ze_KcL(wM|n0EOp;t{hKoohYyDmYO;!`7^Lx;0k=PWPGZpI>V5qYlzjSL_(%|mud50 z7#{p97s`U|Sn$WYF>-i{i4`kzlrV6a<}=72q2sAT7Zh{>P%*6B;Zl;~0xWymt10Mo zl5{bmR(wJefJpNGK=fSRP|mpCI-)Nf6?Pv==FcFmpSwF1%CTOucV{yqxSyx4Zws3O z8hr5Uyd%ezIO7?PnEO0T%af#KOiXD$e?V&OX-B|ZX-YsgSs%sv-6U+sLPuz{D4bq| zpd&|o5tNCmpT>(uIbRf?8c}d3IpOb3sn6>_dr*26R#ev<_~vi)wleW$PX|5)$_ z+_|=pi(0D(AB_sjQ;sQQSM&AWqzDO1@NHw;C9cPdXRKRI#@nUW)CgFxzQ1nyd!+h& zcjU!U=&u|>@}R(9D$%lu2TlV>@I2-n@fCr5PrZNVyKWR7hm zWjoy^p7v8m#$qN0K#8jT- zq`mSirDZDa1Jxm;Rg3rAPhC)LcI4@-RvKT+@9&KsR3b0_0zuM!Fg7u>oF>3bzOxZPU&$ab$Z9@ zY)f7pKh22I7ZykL{YsdjcqeN++=0a}elQM-4;Q)(`Ep3|VFHqnXOh14`!Bus& z9w%*EWK6AiAM{s$6~SEQS;A>ey$#`7)khZvamem{P?>k)5&7Sl&&NXKk}o!%vd;-! zpo2p-_h^b$DNBO>{h4JdGB=D>fvGIYN8v&XsfxU~VaefL?q} z3ekM?iOKkCzQHkBkhg=hD!@&(L}FcHKoa zbZ7)H1C|lHjwEb@tu=n^OvdHOo7o+W`0-y3KdP#bb~wM=Vr_gyoEq|#B?$&d$tals ziIs-&7isBpvS|CjC|7C&3I0SE?~`a%g~$PI%;au^cUp@ER3?mn-|vyu!$7MV6(uvt z+CcGuM(Ku2&G0tcRCo7#D$Dirfqef2qPOE5I)oCGzmR5G!o#Q~(k~)c=LpIfrhHQk zeAva6MilEifE7rgP1M7AyWmLOXK}i8?=z2;N=no)`IGm#y%aGE>-FN zyXCp0Sln{IsfOBuCdE*#@CQof%jzuU*jkR*Su3?5t}F(#g0BD0Zzu|1MDes8U7f9; z$JBg|mqTXt`muZ8=Z`3wx$uizZG_7>GI7tcfOHW`C2bKxNOR)XAwRkLOaHS4xwlH4 zDpU29#6wLXI;H?0Se`SRa&I_QmI{zo7p%uveBZ0KZKd9H6@U?YGArbfm)D*^5=&Rp z`k{35?Z5GbZnv>z@NmJ%+sx=1WanWg)8r}C_>EGR8mk(NR$pW<-l8OTU^_u3M@gwS z7}GGa1)`z5G|DZirw;FB@VhH7Dq*0qc=|9lLe{w2#`g+_nt>_%o<~9(VZe=zI*SSz4w43-_o>4E4`M@NPKTWZuQJs)?KXbWp1M zimd5F;?AP(LWcaI-^Sl{`~>tmxsQB9Y$Xi*{Zr#py_+I$vx7@NY`S?HFfS!hUiz$a z{>!&e1(16T!Om)m)&k1W#*d#GslD^4!TwiF2WjFBvi=Ms!ADT)ArEW6zfVuIXcXVk z>AHjPADW+mJzY`_Ieq(s?jbk4iD2Rb8*V3t6?I+E06(K8H!!xnDzO%GB;Z$N-{M|B zeT`jo%9)s%op*XZKDd6*)-^lWO{#RaIGFdBH+;XXjI(8RxpBc~azG1H^2v7c^bkFE zZCVPE+E*Q=FSe8Vm&6|^3ki{9~qafiMAf7i4APZg>b%&5>nT@pHH z%O*pOv(77?ZiT{W zBibx}Q12tRc7Py1NcZTp`Q4ey%T_nj@1WKg5Fz_Rjl4wlJQj)rtp8yL3r!Shy zvZvnmh!tH4T6Js-?vI0<-rzzl{mgT*S0d_7^AU_8gBg^03o-J=p(1o6kww2hx|!%T z-jqp}m^G*W?$!R#M%Ef?&2jYxmx+lXWZszpI4d$pUN`(S)|*c^CgdwY>Fa>> zgGBJhwe8y#Xd*q0=@SLEgPF>+Qe4?%E*v{a`||luZ~&dqMBrRfJ{SDMaJ!s_;cSJp zSqZHXIdc@@XteNySUZs^9SG7xK`8=NBNM)fRVOjw)D^)w%L2OPkTQ$Tel-J)GD3=YXy+F4in(ILy*A3m@3o73uv?JC}Q>f zrY&8SWmesiba0|3X-jmlMT3 z*ST|_U@O=i*sM_*48G)dgXqlwoFp5G6qSM3&%_f_*n!PiT>?cNI)fAUkA{qWnqdMi+aNK_yVQ&lx4UZknAc9FIzVk% zo6JmFH~c{_tK!gt4+o2>)zoP{sR}!!vfRjI=13!z5}ijMFQ4a4?QIg-BE4T6!#%?d&L;`j5=a`4is>U;%@Rd~ zXC~H7eGQhhYWhMPWf9znDbYIgwud(6$W3e>$W4$~d%qoJ z+JE`1g$qJ%>b|z*xCKenmpV$0pM=Gl-Y*LT8K+P)2X#;XYEFF4mRbc~jj?DM@(1e`nL=F4Syv)TKIePQUz)bZ?Bi3@G@HO$Aps1DvDGkYF50O$_welu^cL7;vPiMGho74$;4fDqKbE{U zd1h{;LfM#Fb|Z&uH~Rm_J)R~Vy4b;1?tW_A)Iz#S_=F|~pISaVkCnQ0&u%Yz%o#|! zS-TSg87LUfFSs{tTuM3$!06ZzH&MFtG)X-l7>3)V?Txuj2HyG*5u;EY2_5vU0ujA? zHXh5G%6e3y7v?AjhyX79pnRBVr}RmPmtrxoB7lkxEzChX^(vKd+sLh?SBic=Q)5nA zdz7Mw3_iA>;T^_Kl~?1|5t%GZ;ki_+i>Q~Q1EVdKZ)$Sh3LM@ea&D~{2HOG++7*wF zAC6jW4>fa~!Vp5+$Z{<)Qxb|{unMgCv2)@%3j=7)Zc%U<^i|SAF88s!A^+Xs!OASYT%7;Jx?olg_6NFP1475N z#0s<@E~FI}#LNQ{?B1;t+N$2k*`K$Hxb%#8tRQi*Z#No0J}Pl;HWb){l7{A8(pu#@ zfE-OTvEreoz1+p`9sUI%Y{e5L-oTP_^NkgpYhZjp&ykinnW;(fu1;ttpSsgYM8ABX4dHe_HxU+%M(D=~) zYM}XUJ5guZ;=_ZcOsC`_{CiU$zN3$+x&5C`vX-V3`8&RjlBs^rf00MNYZW+jCd~7N z%{jJuUUwY(M`8$`B>K&_48!Li682ZaRknMgQ3~dnlp8C?__!P2z@=Auv;T^$yrsNy zCARmaA@^Yo2sS%2$`031-+h9KMZsIHfB>s@}>Y(z988e!`%4=EDoAQ0kbk>+lCoK60Mx9P!~I zlq~wf7kcm_NFImt3ZYlE(b3O1K^QWiFb$V^a2Jlwvm(!XYx<`i@ZMS3UwFt{;x+-v zhx{m=m;4dgvkKp5{*lfSN3o^keSpp9{hlXj%=}e_7Ou{Yiw(J@NXuh*;pL6@$HsfB zh?v+r^cp@jQ4EspC#RqpwPY(}_SS$wZ{S959`C25777&sgtNh%XTCo9VHJC-G z;;wi9{-iv+ETiY;K9qvlEc04f;ZnUP>cUL_T*ms``EtGoP^B#Q>n2dSrbAg8a>*Lg zd0EJ^=tdW~7fbcLFsqryFEcy*-8!?;n%;F+8i{eZyCDaiYxghr z$8k>L|2&-!lhvuVdk!r-kpSFl`5F5d4DJr%M4-qOy3gdmQbqF1=aBtRM7)c_Ae?$b8 zQg4c8*KQ{XJmL)1c7#0Yn0#PTMEs4-IHPjkn0!=;JdhMXqzMLeh`yOylXROP- zl#z3+fwM9l3%VN(6R77ua*uI9%hO7l7{+Hcbr(peh;afUK?B4EC09J{-u{mv)+u#? zdKVBCPt`eU@IzL)OXA`Ebu`Xp?u0m%h&X41}FNfnJ*g1!1wcbbpo%F4x!-#R9ft!8{5`Ho}04?FI#Kg zL|k`tF1t_`ywdy8(wnTut>HND(qNnq%Sq=AvvZbXnLx|mJhi!*&lwG2g|edBdVgLy zjvVTKHAx(+&P;P#2Xobo7_RttUi)Nllc}}hX>|N?-u5g7VJ-NNdwYcaOG?NK=5)}` zMtOL;o|i0mSKm(UI_7BL_^6HnVOTkuPI6y@ZLR(H?c1cr-_ouSLp{5!bx^DiKd*Yb z{K78Ci&Twup zTKm)ioN|wcYy%Qnwb)IzbH>W!;Ah5Zdm_jRY`+VRJ2 zhkspZ9hbK3iQD91A$d!0*-1i#%x81|s+SPRmD}d~<1p6!A13(!vABP2kNgqEG z?AMgl^P+iRoIY(9@_I?n1829lGvAsRnHwS~|5vD2+Zi53j<5N4wNn0{q>>jF9*bI) zL$kMXM-awNOElF>{?Jr^tOz1glbwaD-M0OKOlTeW3C!1ZyxRbB>8JDof(O&R1bh%3x#>y2~<>OXO#IIedH0Q`(&&?eo-c~ z>*Ah#3~09unym~UC-UFqqI>{dmUD$Y4@evG#ORLI*{ZM)Jl=e1it!XzY($S3V zLG!Y6fCjE>x6r@5FG1n|8ompSZaJ>9)q6jqU;XxCQk9zV(?C9+i*>w z21+KYt1gXX&0`x3E)hS7I5}snbBzox9C@Xzcr|{B8Hw;SY1$}&BoYKXH^hpjW-RgJ z-Fb}tannKCv>y~^`r|(1Q9;+sZlYf3XPSX|^gR01UFtu$B*R;$sPZdIZShRr>|b@J z;#G{EdoY+O;REEjQ}X7_YzWLO+Ey3>a_KDe1CjSe| z6arqcEZ)CX!8r(si`dqbF$uu&pnf^Np{1f*TdJ`r2;@SaZ z#hb4xlaCA@Pwqj#LlUEe5L{I$k(Zj$d3(~)u(F%&xb8={N9hKxlZIO1ABsM{Mt|)2 zJ^t9Id;?%4PfR4&Ph9B9cFK~@tG3wlFW-0fXZS_L4U*EiAA%+`h%q2^6BCC;t0iO4V=s4Qug{M|iDV@s zC7|ef-dxiR7T&Mpre!%hiUhHM%3Qxi$Lzw6&(Tvlx9QA_7LhYq<(o~=Y>3ka-zrQa zhGpfFK@)#)rtfz61w35^sN1=IFw&Oc!Nah+8@qhJ0UEGr;JplaxOGI82OVqZHsqfX ze1}r{jy;G?&}Da}a7>SCDsFDuzuseeCKof|Dz2BPsP8? zY;a)Tkr2P~0^2BeO?wnzF_Ul-ekY=-w26VnU%U3f19Z-pj&2 z4J_a|o4Dci+MO)mPQIM>kdPG1xydiR9@#8m zh27D7GF{p|a{8({Q-Pr-;#jV{2zHR>lGoFtIfIpoMo?exuQyX_A;;l0AP4!)JEM$EwMInZkj+8*IHP4vKRd zKx_l-i*>A*C@{u%ct`y~s6MWAfO{@FPIX&sg8H{GMDc{4M3%$@c8&RAlw0-R<4DO3 trJqdc$mBpWeznn?E0M$F`|3v=`3%T2A17h;rxP7$%JLd=6(2u;`(N3pt&so# literal 0 HcmV?d00001 diff --git a/tools/ngui/static/bootstrap/js/bootstrap.js b/tools/ngui/static/bootstrap/js/bootstrap.js new file mode 100644 index 00000000000..96fed1387bf --- /dev/null +++ b/tools/ngui/static/bootstrap/js/bootstrap.js @@ -0,0 +1,2291 @@ +/* =================================================== + * bootstrap-transition.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#transitions + * =================================================== + * Copyright 2012 Twitter, Inc. + * + * Licensed 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. + * ========================================================== */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* CSS TRANSITION SUPPORT (http://www.modernizr.com/) + * ======================================================= */ + + $(function () { + + $.support.transition = (function () { + + var transitionEnd = (function () { + + var el = document.createElement('bootstrap') + , transEndEventNames = { + 'WebkitTransition' : 'webkitTransitionEnd' + , 'MozTransition' : 'transitionend' + , 'OTransition' : 'oTransitionEnd otransitionend' + , 'transition' : 'transitionend' + } + , name + + for (name in transEndEventNames){ + if (el.style[name] !== undefined) { + return transEndEventNames[name] + } + } + + }()) + + return transitionEnd && { + end: transitionEnd + } + + })() + + }) + +}(window.jQuery); +/* ========================================================= + * bootstrap-modal.js v2.3.2 + * http://twitter.github.com/bootstrap/javascript.html#modals + * ========================================================= + * Copyright 2012 Twitter, Inc. + * + * Licensed 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. + * ========================================================= */ + + +!function ($) { + + "use strict"; // jshint ;_; + + + /* MODAL CLASS DEFINITION + * ====================== */ + + var Modal = function (element, options) { + this.options = options + this.$element = $(element) + .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) + this.options.remote && this.$element.find('.modal-body').load(this.options.remote) + } + + Modal.prototype = { + + constructor: Modal + + , toggle: function () { + return this[!this.isShown ? 'show' : 'hide']() + } + + , show: function () { + var that = this + , e = $.Event('show') + + this.$element.trigger(e) + + if (this.isShown || e.isDefaultPrevented()) return + + this.isShown = true + + this.escape() + + this.backdrop(function () { + var transition = $.support.transition && that.$element.hasClass('fade') + + if (!that.$element.parent().length) { + that.$element.appendTo(document.body) //don't move modals dom position + } + + that.$element.show() + + if (transition) { + that.$element[0].offsetWidth // force reflow + } + + that.$element + .addClass('in') + .attr('aria-hidden', false) + + that.enforceFocus() + + transition ? + that.$element.one($.support.transition.end, function () { that.$element.focus().trigger('shown') }) : + that.$element.focus().trigger('shown') + + }) + } + + , hide: function (e) { + e && e.preventDefault() + + var that = this + + e = $.Event('hide') + + this.$element.trigger(e) + + if (!this.isShown || e.isDefaultPrevented()) return + + this.isShown = false + + this.escape() + + $(document).off('focusin.modal') + + this.$element + .removeClass('in') + .attr('aria-hidden', true) + + $.support.transition && this.$element.hasClass('fade') ? + this.hideWithTransition() : + this.hideModal() + } + + , enforceFocus: function () { + var that = this + $(document).on('focusin.modal', function (e) { + if (that.$element[0] !== e.target && !that.$element.has(e.target).length) { + that.$element.focus() + } + }) + } + + , escape: function () { + var that = this + if (this.isShown && this.options.keyboard) { + this.$element.on('keyup.dismiss.modal', function ( e ) { + e.which == 27 && that.hide() + }) + } else if (!this.isShown) { + this.$element.off('keyup.dismiss.modal') + } + } + + , hideWithTransition: function () { + var that = this + , timeout = setTimeout(function () { + that.$element.off($.support.transition.end) + that.hideModal() + }, 500) + + this.$element.one($.support.transition.end, function () { + clearTimeout(timeout) + that.hideModal() + }) + } + + , hideModal: function () { + var that = this + this.$element.hide() + this.backdrop(function () { + that.removeBackdrop() + that.$element.trigger('hidden') + }) + } + + , removeBackdrop: function () { + this.$backdrop && this.$backdrop.remove() + this.$backdrop = null + } + + , backdrop: function (callback) { + var that = this + , animate = this.$element.hasClass('fade') ? 'fade' : '' + + if (this.isShown && this.options.backdrop) { + var doAnimate = $.support.transition && animate + + this.$backdrop = $('

;G+?I*PF_Mxo} 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

US~9DG)CZ?TBXae(a<1sPw&N^||6knmse?0S~M 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

c!aSKJIGe< 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 literal 0 HcmV?d00001 diff --git a/docs/en-US/images/ldap-list-users.png b/docs/en-US/images/ldap-list-users.png index aedcb0600b135879ca39c67f19824446c4aa8646..8dabbb88663fe704035948681096710eeabd427c 100644 GIT binary patch literal 85922 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