From 182899d0b5322c6f1739814e9b553b9e8a3df79e Mon Sep 17 00:00:00 2001 From: John Bampton Date: Tue, 29 Mar 2022 00:40:26 +1000 Subject: [PATCH] Add Python flake8 linting for W291 trailing whitespace with Super-Linter (#4687) * refactor: remove trailing whitespace from Python files * Add the GitHub Super-Linter Add Python flake8 linting for W291 trailing whitespace * Add licenses --- .github/linters/.flake8 | 19 + .github/workflows/linter.yml | 31 ++ cloud-cli/cloudapis/__init__.py | 6 +- cloud-cli/cloudtool/__init__.py | 22 +- cloud-cli/cloudtool/utils.py | 38 +- .../security_group_agent/cs_sg_agent.py | 102 ++--- .../security_group_agent/sglib.py | 44 +- .../security_group_agent/xmlobject.py | 52 +-- .../vm/hypervisor/ovm/ConfigFileOps.py | 36 +- .../vm/hypervisor/ovm/OvmCommonModule.py | 16 +- .../vm/hypervisor/ovm/OvmDiskModule.py | 10 +- .../vm/hypervisor/ovm/OvmDispatcher.py | 4 +- .../vm/hypervisor/ovm/OvmFaultConstants.py | 18 +- .../vm/hypervisor/ovm/OvmHaHeartBeatModule.py | 24 +- .../vm/hypervisor/ovm/OvmHostModule.py | 54 +-- .../vm/hypervisor/ovm/OvmLoggerModule.py | 12 +- .../vm/hypervisor/ovm/OvmNetworkModule.py | 100 ++--- .../vm/hypervisor/ovm/OvmOCFS2Module.py | 22 +- .../vm/hypervisor/ovm/OvmObjectModule.py | 4 +- .../hypervisor/ovm/OvmSecurityGroupModule.py | 134 +++--- .../vm/hypervisor/ovm/OvmStoragePoolModule.py | 105 +++-- .../scripts/vm/hypervisor/ovm/OvmVifModule.py | 10 +- .../scripts/vm/hypervisor/ovm/OvmVmModule.py | 108 ++--- .../vm/hypervisor/ovm/OvmVolumeModule.py | 29 +- .../stratosphere-ssp/sspmock/sspmock.py | 4 +- python/bindir/cloud-external-ipallocator.py | 30 +- python/incubation/cloud-web-ipallocator.py | 30 +- python/lib/cloudutils/__init__.py | 4 +- python/lib/cloudutils/cloudException.py | 6 +- python/lib/cloudutils/configFileOps.py | 34 +- python/lib/cloudutils/networkConfig.py | 26 +- scripts/network/exdhcp/dhcpd_edithosts.py | 8 +- scripts/network/ping/baremetal_user_data.py | 30 +- .../ping/prepare_kickstart_bootfile.py | 8 +- .../ping/prepare_kickstart_kernel_initrd.py | 12 +- scripts/network/ping/prepare_tftp_bootfile.py | 8 +- scripts/util/ipmi.py | 16 +- scripts/util/macgen.py | 6 +- .../vm/hypervisor/vmware/discover_networks.py | 8 +- .../xenserver/cloudstack_pluginlib.py | 4 +- .../vm/hypervisor/xenserver/mockxcpplugin.py | 4 +- .../vm/hypervisor/xenserver/ovs-vif-flows.py | 6 +- scripts/vm/hypervisor/xenserver/perfmon.py | 6 +- .../vm/hypervisor/xenserver/xcposs/NFSSR.py | 16 +- .../hypervisor/xenserver/xcpserver/NFSSR.py | 16 +- .../xenserver56/InterfaceReconfigure.py | 28 +- .../hypervisor/xenserver/xenserver56/NFSSR.py | 16 +- .../xenserver/xenserver56fp1/NFSSR.py | 16 +- .../hypervisor/xenserver/xenserver60/NFSSR.py | 16 +- .../vm/network/vnet/cloudstack_pluginlib.py | 4 +- scripts/vm/network/vnet/ovstunnel.py | 4 +- test/integration/__init__.py | 4 +- .../broken/maint/test_escalation_templates.py | 8 +- .../broken/maint/test_vpc_host_maintenance.py | 38 +- test/integration/broken/misc/test_vm_sync.py | 2 +- test/integration/broken/test_vpn_service.py | 2 +- test/integration/component/__init__.py | 4 +- .../test_egress_rules_host_maintenance.py | 4 +- .../maint/test_ip_resource_count_for_vpc.py | 2 +- .../maint/testpath_vMotion_vmware.py | 10 +- .../component/test_acl_isolatednetwork.py | 8 +- .../test_acl_isolatednetwork_delete.py | 92 ++--- .../component/test_acl_listsnapshot.py | 10 +- test/integration/component/test_acl_listvm.py | 6 +- .../component/test_acl_listvolume.py | 10 +- .../component/test_acl_sharednetwork.py | 146 +++---- ...cl_sharednetwork_deployVM-impersonation.py | 18 +- .../component/test_affinity_groups.py | 2 +- .../test_affinity_groups_projects.py | 72 ++-- .../component/test_allocation_states.py | 4 +- .../integration/component/test_asa1000v_fw.py | 4 +- test/integration/component/test_assign_vm.py | 2 +- test/integration/component/test_baremetal.py | 12 +- .../component/test_blocker_bugs.py | 8 +- .../component/test_browse_templates.py | 44 +- .../component/test_browse_volumes.py | 4 +- test/integration/component/test_host.py | 24 +- .../component/test_interop_xd_ccp.py | 18 +- .../component/test_netscaler_configs.py | 18 +- .../component/test_netscaler_lb_algo.py | 2 +- .../component/test_non_contiguous_vlan.py | 2 +- .../component/test_organization_states.py | 6 +- .../component/test_project_configs.py | 6 +- .../component/test_project_limits.py | 4 +- .../component/test_project_usage.py | 6 +- .../test_redundant_router_services.py | 4 +- .../integration/component/test_secsr_mount.py | 16 +- test/integration/component/test_stopped_vm.py | 4 +- test/integration/component/test_tags.py | 86 ++-- .../component/test_updateResourceCount.py | 18 +- .../component/test_volume_destroy_recover.py | 8 +- .../component/test_vpc_network_lbrules.py | 6 +- .../test_vpc_network_staticnatrule.py | 10 +- .../component/test_vpc_vm_life_cycle.py | 24 +- .../integration/plugins/datera/TestVolumes.py | 2 +- test/integration/plugins/test_quota.py | 16 +- test/integration/smoke/__init__.py | 4 +- .../integration/smoke/test_affinity_groups.py | 6 +- .../smoke/test_affinity_groups_projects.py | 4 +- .../smoke/test_backup_recovery_dummy.py | 6 +- ...test_create_list_domain_account_project.py | 2 +- .../smoke/test_deploy_vgpu_enabled_vm.py | 24 +- .../smoke/test_deploy_vm_with_userdata.py | 2 +- .../smoke/test_guest_vlan_range.py | 2 +- .../smoke/test_list_ids_parameter.py | 6 +- test/integration/smoke/test_loadbalance.py | 2 +- .../smoke/test_nested_virtualization.py | 6 +- .../integration/smoke/test_password_server.py | 4 +- .../integration/smoke/test_public_ip_range.py | 6 +- .../smoke/test_reset_vm_on_reboot.py | 2 +- .../integration/smoke/test_resource_detail.py | 18 +- .../smoke/test_router_dnsservice.py | 2 +- .../test_routers_iptables_default_policy.py | 22 +- .../smoke/test_routers_network_ops.py | 4 +- test/integration/smoke/test_snapshots.py | 2 +- test/integration/smoke/test_ssvm.py | 2 +- test/integration/smoke/test_vpc_redundant.py | 20 +- .../integration/smoke/test_vpc_router_nics.py | 10 +- test/integration/testpaths/__init__.py | 4 +- .../testpaths/testpath_attach_disk_zwps.py | 2 +- .../integration/testpaths/testpath_netmask.py | 2 +- .../testpaths/testpath_revert_snap.py | 10 +- .../testpath_volume_recurring_snap.py | 18 +- .../testpaths/testpath_volume_snapshot.py | 42 +- test/selenium/common/shared.py | 2 +- test/selenium/lib/Global_Locators.py | 4 +- test/selenium/lib/initialize.py | 2 +- test/selenium/smoke/Login_and_Accounts.py | 134 +++--- test/selenium/smoke/Service_Offering.py | 216 +++++----- test/selenium/smoke/TemplatesAndISO.py | 108 ++--- test/selenium/smoke/VM_lifeCycle.py | 388 +++++++++--------- test/selenium/smoke/main.py | 16 +- test/systemvm/test_update_config.py | 42 +- tools/bugs-wiki/search-bugs.py | 4 +- tools/bugs-wiki/search-wiki.py | 4 +- tools/devcloud-kvm/devcloud-kvm.py | 14 +- tools/marvin/marvin/deployDataCenter.py | 2 +- tools/marvin/marvin/lib/__init__.py | 4 +- tools/marvin/marvin/lib/ncc.py | 2 +- tools/marvin/marvin/lib/utils.py | 12 +- tools/marvin/marvin/lib/vcenter.py | 2 +- .../marvin/marvin/misc/build/advanced_env.py | 12 +- tools/marvin/marvin/misc/build/bashUtils.py | 26 +- .../marvin/misc/build/buildGenerator.py | 28 +- tools/marvin/marvin/misc/build/configure.py | 22 +- tools/marvin/marvin/misc/build/restartMgmt.py | 2 +- .../marvin/misc/build/testSetupSuccess.py | 8 +- .../marvin/marvin/misc/build/xunitmp/setup.py | 2 +- .../misc/build/xunitmp/xunitmultiprocess.py | 4 +- tools/marvin/marvin/sandbox/__init__.py | 4 +- .../marvin/sandbox/advanced/__init__.py | 4 +- .../marvin/sandbox/advanced/advanced_env.py | 14 +- .../marvin/sandbox/advancedsg/__init__.py | 4 +- .../sandbox/advancedsg/advancedsg_env.py | 12 +- tools/marvin/marvin/sandbox/basic/__init__.py | 4 +- .../marvin/marvin/sandbox/basic/basic_env.py | 14 +- tools/marvin/marvin/sandbox/demo/__init__.py | 4 +- .../marvin/sandbox/demo/live/__init__.py | 4 +- .../sandbox/demo/live/testSshDeployVM.py | 14 +- .../marvin/sandbox/demo/simulator/__init__.py | 4 +- .../sandbox/demo/simulator/simulator_setup.py | 14 +- .../demo/simulator/testcase/__init__.py | 4 +- .../demo/simulator/testcase/libs/__init__.py | 4 +- .../demo/simulator/testcase/libs/base.py | 136 +++--- .../demo/simulator/testcase/libs/common.py | 38 +- .../demo/simulator/testcase/libs/utils.py | 8 +- .../simulator/testcase/test_vm_life_cycle.py | 82 ++-- .../marvin/marvin/sandbox/testSetupSuccess.py | 12 +- 168 files changed, 1942 insertions(+), 1894 deletions(-) create mode 100644 .github/linters/.flake8 create mode 100644 .github/workflows/linter.yml diff --git a/.github/linters/.flake8 b/.github/linters/.flake8 new file mode 100644 index 00000000000..c9314922bf5 --- /dev/null +++ b/.github/linters/.flake8 @@ -0,0 +1,19 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +[flake8] +select = W291 diff --git a/.github/workflows/linter.yml b/.github/workflows/linter.yml new file mode 100644 index 00000000000..c38890dd0cd --- /dev/null +++ b/.github/workflows/linter.yml @@ -0,0 +1,31 @@ +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY +# KIND, either express or implied. See the License for the +# specific language governing permissions and limitations +# under the License. + +name: Lint Code Base + +on: [pull_request] + +jobs: + build: + name: GitHub Super Linter + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - uses: github/super-linter@v4 + env: + VALIDATE_PYTHON_FLAKE8: true + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/cloud-cli/cloudapis/__init__.py b/cloud-cli/cloudapis/__init__.py index f23b2ce2fbf..00dcc6bcb55 100644 --- a/cloud-cli/cloudapis/__init__.py +++ b/cloud-cli/cloudapis/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. - + ''' Created on Aug 2, 2010 diff --git a/cloud-cli/cloudtool/__init__.py b/cloud-cli/cloudtool/__init__.py index dd7c46c16e0..c5785dcbd82 100644 --- a/cloud-cli/cloudtool/__init__.py +++ b/cloud-cli/cloudtool/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. - + ''' Created on Aug 2, 2010 @@ -26,16 +26,16 @@ import sys import cloudapis as apis import cloudtool.utils as utils - + def main(argv=None): - + #import ipdb; ipdb.set_trace() if argv == None: argv = sys.argv prelim_args = [ x for x in argv[0:] if not x.startswith('-') ] parser = utils.get_parser() - + api = __import__("cloudapis") apis = getattr(api, "implementor") if len(prelim_args) == 1: @@ -44,20 +44,20 @@ def main(argv=None): command = utils.lookup_command_in_api(apis,prelim_args[1]) if not command: parser.error("command %r not supported by the %s API"%(prelim_args[1],prelim_args[0])) - - argv = argv[1:] + + argv = argv[1:] if len(argv) == 1: argv.append("--help") parser = utils.get_parser(apis.__init__,command) opts,args,api_optionsdict,cmd_optionsdict = parser.parse_args(argv) - - + + try: api = apis(**api_optionsdict) except utils.OptParseError as e: parser.error(str(e)) - + command = utils.lookup_command_in_api(api,args[0]) # we now discard the first two arguments as those necessarily are the api and command names diff --git a/cloud-cli/cloudtool/utils.py b/cloud-cli/cloudtool/utils.py index 1f3d32946e2..0fc21e19924 100644 --- a/cloud-cli/cloudtool/utils.py +++ b/cloud-cli/cloudtool/utils.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. - + ''' Created on Aug 2, 2010 @@ -48,28 +48,28 @@ class MyOptionParser(OptionParser): error("%s: %s\n" % (self.get_prog_name(),msg)) self.print_usage(sys.stderr) self.exit(os.EX_USAGE) - + def parse_args(self,*args,**kwargs): options,arguments = OptionParser.parse_args(self,*args,**kwargs) - + def prune_options(options,alist): """Given 'options' -- a list of arguments to OptionParser.add_option, and a set of optparse Values, return a dictionary of only those values that apply exclusively to 'options'""" return dict( [ (k,getattr(options,k)) for k in dir(options) if k in alist ] ) - + api_options = prune_options(options,self.api_dests) cmd_options = prune_options(options,self.cmd_dests) - + return options,arguments,api_options,cmd_options def get_parser(api_callable=None,cmd_callable=None): # this should probably be the __init__ method of myoptionparser - + def getdefaulttag(default): if default is not None: return " [Default: %default]" return '' - + def get_arguments_and_options(callable): """Infers and returns arguments and options based on a callable's signature. Cooperates with decorator @describe""" @@ -96,18 +96,18 @@ def get_parser(api_callable=None,cmd_callable=None): # this should probably be t return arguments,options basic_usage = "usage: %prog [options...] " - + api_name = "" cmd_name = "" description = "%prog is a command-line tool to access several cloud APIs." arguments = '' argexp = "" - + if api_callable: api_name = api_callable.__module__.split(".")[-1].replace("_","-") api_arguments,api_options = get_arguments_and_options(api_callable) assert len(api_arguments) is 0 # no mandatory arguments for class initializers - + if cmd_callable: cmd_name = cmd_callable.__name__.replace("_","-") cmd_arguments,cmd_options = get_arguments_and_options(cmd_callable) @@ -115,18 +115,18 @@ def get_parser(api_callable=None,cmd_callable=None): # this should probably be t arguments = " " + " ".join( [ s[0].upper() for s in cmd_arguments ] ) argexp = "\n\nArguments:\n" + "\n".join ( " %s\n %s"%(s.upper(),u) for s,u in cmd_arguments ) description = cmd_callable.__doc__ - + api_command = "%s %s"%(api_name,cmd_name) if description: description = "\n\n" + description else: description = '' - + usage = basic_usage + api_command + arguments + description + argexp parser = MyOptionParser(usage=usage, add_help_option=False) - + parser.add_option('--help', action="help") - + group = parser.add_option_group("General options") group.add_option('-v', '--verbose', dest="verbose", help="Print extra output") @@ -136,14 +136,14 @@ def get_parser(api_callable=None,cmd_callable=None): # this should probably be t for a in api_options: group.add_option(a[0][0],**a[1]) parser.api_dests.append(a[1]["dest"]) - + parser.cmd_dests = [] if cmd_callable and cmd_options: group = parser.add_option_group("Options for the %s command"%cmd_name) for a in cmd_options: group.add_option(a[0][0],**a[1]) parser.cmd_dests.append(a[1]["dest"]) - + return parser def lookup_command_in_api(api,command_name): @@ -155,7 +155,7 @@ def get_api_list(api): for cmd_name in dir(api): cmd = getattr(api,cmd_name) if callable(cmd) and not cmd_name.startswith("_"): - apilist.append(cmd_name) + apilist.append(cmd_name) return apilist def get_command_list(api): diff --git a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py index 0c49a3f7862..65307999eff 100755 --- a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py +++ b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/cs_sg_agent.py @@ -1,21 +1,21 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# Automatically generated by addcopyright.py at 01/29/2013 +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT 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 01/29/2013 ''' Created on Jan 2, 2013 @@ -42,14 +42,14 @@ class IPSet(object): def __init__(self, setname, ips): self.ips = ips self.name = setname - + def create(self): tmpname = str(uuid.uuid4()).replace('-', '')[0:30] sglib.ShellCmd('ipset -N %s %s' % (tmpname, self.IPSET_TYPE))() try: for ip in self.ips: sglib.ShellCmd('ipset -A %s %s' % (tmpname, ip))() - + try: sglib.ShellCmd('ipset -N %s %s' % (self.name, self.IPSET_TYPE))() cherrypy.log('created new ipset: %s' % self.name) @@ -59,8 +59,8 @@ class IPSet(object): sglib.ShellCmd('ipset -W %s %s' % (tmpname, self.name))() sglib.ShellCmd('ipset -F %s' % tmpname)() sglib.ShellCmd('ipset -X %s' % tmpname)() - - @staticmethod + + @staticmethod def destroy_sets(sets_to_keep): sets = sglib.ShellCmd('ipset list')() for s in sets.split('\n'): @@ -69,17 +69,17 @@ class IPSet(object): if not set_name in sets_to_keep: sglib.ShellCmd('ipset destroy %s' % set_name)() cherrypy.log('destroyed unused ipset: %s' % set_name) - + class SGAgent(object): def __init__(self): pass - + def _self_list(self, obj): if isinstance(obj, types.ListType): return obj else: return [obj] - + def set_rules(self, req): body = req.body doc = xmlobject.loads(body) @@ -89,7 +89,7 @@ class SGAgent(object): vm_mac = doc.vmMac.text_ sig = doc.signature.text_ seq = doc.sequenceNumber.text_ - + def parse_rules(rules, lst): for i in self._self_list(rules): r = SGRule() @@ -100,21 +100,21 @@ class SGAgent(object): for ip in self._self_list(i.ip): r.allowed_ips.append(ip.text_) lst.append(r) - + i_rules = [] if hasattr(doc, 'ingressRules'): parse_rules(doc.ingressRules, i_rules) - + e_rules = [] if hasattr(doc, 'egressRules'): parse_rules(doc.egressRules, e_rules) - + def create_chain(name): try: sglib.ShellCmd('iptables -F %s' % name)() except Exception: sglib.ShellCmd('iptables -N %s' % name)() - + def apply_rules(rules, chainname, direction, action, current_set_names): create_chain(chainname) for r in i_rules: @@ -122,13 +122,13 @@ class SGAgent(object): if '0.0.0.0/0' in r.allowed_ips: allow_any = True r.allowed_ips.remove('0.0.0.0/0') - + if r.allowed_ips: setname = '_'.join([chainname, r.protocol, r.start_port, r.end_port]) ipset = IPSet(setname, r.allowed_ips) ipset.create() current_set_names.append(setname) - + if r.protocol == 'all': cmd = ['iptables -I', chainname, '-m state --state NEW -m set --set', setname, direction, '-j', action] sglib.ShellCmd(' '.join(cmd))() @@ -142,8 +142,8 @@ class SGAgent(object): port_range = "any" cmd = ['iptables', '-I', i_chain_name, '-p', 'icmp', '--icmp-type', port_range, '-m set --set', setname, direction, '-j', action] sglib.ShellCmd(' '.join(cmd))() - - + + if allow_any and r.protocol != 'all': if r.protocol != 'icmp': port_range = ":".join([r.start_port, r.end_port]) @@ -155,36 +155,36 @@ class SGAgent(object): port_range = "any" cmd = ['iptables', '-I', i_chain_name, '-p', 'icmp', '--icmp-type', port_range, '-j', action] sglib.ShellCmd(' '.join(cmd))() - + current_sets = [] i_chain_name = vm_name + '-in' apply_rules(i_rules, i_chain_name, 'src', 'ACCEPT', current_sets) e_chain_name = vm_name + '-eg' apply_rules(e_rules, e_chain_name, 'dst', 'RETURN', current_sets) - + if e_rules: sglib.ShellCmd('iptables -A %s -j RETURN' % e_chain_name) else: sglib.ShellCmd('iptables -A %s -j DROP' % e_chain_name) - + sglib.ShellCmd('iptables -A %s -j DROP' % i_chain_name) IPSet.destroy_sets(current_sets) - - + + def echo(self, req): cherrypy.log("echo: I am alive") - + def index(self): req = sglib.Request.from_cherrypy_request(cherrypy.request) cmd_name = req.headers['command'] - + if not hasattr(self, cmd_name): - raise ValueError("SecurityGroupAgent doesn't have a method called '%s'" % cmd_name) + raise ValueError("SecurityGroupAgent doesn't have a method called '%s'" % cmd_name) method = getattr(self, cmd_name) - + return method(req) index.exposed = True - + @staticmethod def start(): cherrypy.log.access_file = '/var/log/cs-securitygroup.log' @@ -192,8 +192,8 @@ class SGAgent(object): cherrypy.server.socket_host = '0.0.0.0' cherrypy.server.socket_port = 9988 cherrypy.quickstart(SGAgent()) - - @staticmethod + + @staticmethod def stop(): cherrypy.engine.exit() @@ -204,16 +204,16 @@ class SGAgentDaemon(sglib.Daemon): self.is_stopped = False self.agent = SGAgent() sglib.Daemon.register_atexit_hook(self._do_stop) - + def _do_stop(self): if self.is_stopped: return self.is_stopped = True self.agent.stop() - + def run(self): self.agent.start() - + def stop(self): self.agent.stop() super(SGAgentDaemon, self).stop() @@ -223,7 +223,7 @@ def main(): if len(sys.argv) != 2 or not sys.argv[1] in ['start', 'stop', 'restart']: print usage sys.exit(1) - + cmd = sys.argv[1] agentdaemon = SGAgentDaemon() if cmd == 'start': @@ -232,5 +232,5 @@ def main(): agentdaemon.stop() else: agentdaemon.restart() - + sys.exit(0) diff --git a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/sglib.py b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/sglib.py index bc675b540ad..c1ee8890a73 100755 --- a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/sglib.py +++ b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/sglib.py @@ -18,10 +18,10 @@ # # Automatically generated by addcopyright.py at 01/29/2013 -import sys, os, time, atexit -import traceback +import sys, os, time, atexit +import traceback import subprocess -from signal import SIGTERM +from signal import SIGTERM import cherrypy import copy @@ -80,28 +80,28 @@ class Daemon(object): A generic daemon class. Usage: subclass the Daemon class and override the run() method - """ - atexit_hooks = [] + """ + atexit_hooks = [] def __init__(self, pidfile, stdin='/dev/null', stdout='/dev/null', stderr='/dev/null'): self.stdin = stdin self.stdout = stdout self.stderr = stderr self.pidfile = pidfile - - @staticmethod - def register_atexit_hook(hook): - Daemon.atexit_hooks.append(hook) - + @staticmethod - def _atexit(): - for hook in Daemon.atexit_hooks: - try: + def register_atexit_hook(hook): + Daemon.atexit_hooks.append(hook) + + @staticmethod + def _atexit(): + for hook in Daemon.atexit_hooks: + try: hook() - except Exception: + except Exception: content = traceback.format_exc() - err = 'Exception when calling atexit hook[%s]\n%s' % (hook.__name__, content) - #logger.error(err) + err = 'Exception when calling atexit hook[%s]\n%s' % (hook.__name__, content) + #logger.error(err) def daemonize(self): """ @@ -145,7 +145,7 @@ class Daemon(object): # write pidfile Daemon.register_atexit_hook(self.delpid) - atexit.register(Daemon._atexit) + atexit.register(Daemon._atexit) pid = str(os.getpid()) file(self.pidfile,'w').write("%s\n" % pid) @@ -173,12 +173,12 @@ class Daemon(object): sys.exit(0) # Start the daemon - self.daemonize() + self.daemonize() try: - self.run() - except Exception: - content = traceback.format_exc() - #logger.error(content) + self.run() + except Exception: + content = traceback.format_exc() + #logger.error(content) sys.exit(1) def stop(self): diff --git a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py index 175349958ce..d37fd4b56cd 100755 --- a/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py +++ b/plugins/hypervisors/baremetal/src/main/resources/security_group_agent/security_group_agent/xmlobject.py @@ -1,21 +1,21 @@ -# Licensed to the Apache Software Foundation (ASF) under one -# or more contributor license agreements. See the NOTICE file -# distributed with this work for additional information -# regarding copyright ownership. The ASF licenses this file -# to you under the Apache License, Version 2.0 (the -# "License"); you may not use this file except in compliance -# with the License. You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, -# software distributed under the License is distributed on an -# "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY -# KIND, either express or implied. See the License for the -# specific language governing permissions and limitations -# under the License. -# -# Automatically generated by addcopyright.py at 01/29/2013 +# Licensed to the Apache Software Foundation (ASF) under one +# or more contributor license agreements. See the NOTICE file +# distributed with this work for additional information +# regarding copyright ownership. The ASF licenses this file +# to you under the Apache License, Version 2.0 (the +# "License"); you may not use this file except in compliance +# with the License. You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, +# software distributed under the License is distributed on an +# "AS IS" BASIS, WITHOUT 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 01/29/2013 ''' Created on Dec 25, 2012 @@ -28,23 +28,23 @@ import types class XmlObject(object): def __init__(self, tag): self.__tag_name__ = tag - + def put_attr(self, name, val): val = val.strip().strip('\t') setattr(self, name + '_', val) - + def put_text(self, val): val = val.strip().strip('\n').strip('\t') if val == "": setattr(self, 'text_', None) else: setattr(self, 'text_', val) - + def put_node(self, name, val): if not hasattr(self, name): setattr(self, name, val) return - + nodes = getattr(self, name) if not isinstance(nodes, types.ListType): nodes = [] @@ -55,7 +55,7 @@ class XmlObject(object): else: nodes.append(val) setattr(self, name, nodes) - + def get(self, name, default=None): if hasattr(self, name): val = getattr(self, name) @@ -65,7 +65,7 @@ class XmlObject(object): return val.text_ else: return default - + def __getattr__(self, name): if name.endswith('__'): n = name[:-1] @@ -78,7 +78,7 @@ class XmlObject(object): setattr(e, 'missing_attrib', name) setattr(e, 'tag_name', self.__tag_name__) raise e - + def _loads(node): xo = XmlObject(node.tag) @@ -90,7 +90,7 @@ def _loads(node): sub_xo = _loads(n) xo.put_node(n.tag, sub_xo) return xo - + def loads(xmlstr): xmlstr = re.sub(r'xmlns=".*"', '', xmlstr) root = etree.fromstring(xmlstr) diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/ConfigFileOps.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/ConfigFileOps.py index 62d09fcd62e..a574ada0936 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/ConfigFileOps.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/ConfigFileOps.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -24,7 +24,7 @@ class ConfigFileOps: self.op = op self.separator = separator def setState(self, state): - self.state = state + self.state = state def getState(self): return self.state @@ -32,18 +32,18 @@ class ConfigFileOps: self.fileName = fileName self.entries = [] self.backups = [] - + if cfg is not None: cfg.cfoHandlers.append(self) def addEntry(self, name, value, separator="="): e = self.entry(name, value, "add", separator) self.entries.append(e) - + def rmEntry(self, name, value, separator="="): entry = self.entry(name, value, "rm", separator) self.entries.append(entry) - + def getEntry(self, name, separator="="): try: ctx = file(self.fileName).read(-1) @@ -71,7 +71,7 @@ class ConfigFileOps: matchString = "^\ *" + entry.name + "\ *=\ *" + entry.value else: matchString = "^\ *" + entry.name + "\ *" + entry.value - + match = re.match(matchString, line) if match is not None: if entry.op == "add" and entry.separator == "=": @@ -85,9 +85,9 @@ class ConfigFileOps: entry.setState("set") self.backups.append([line, None]) matched = True - break - - if not matched: + break + + if not matched: newLines.append(line) for entry in self.entries: @@ -99,7 +99,7 @@ class ConfigFileOps: entry.setState("set") fp.close() - + file(self.fileName, "w").writelines(newLines) def replace_line(self, startswith,stanza,always_add=False): @@ -123,18 +123,18 @@ class ConfigFileOps: return self.replace_line(startswith,stanza,always_add=True) def add_lines(self, lines, addToBackup=True): - fp = file(self.fileName).read(-1) + fp = file(self.fileName).read(-1) sh = re.escape(lines) - match = re.search(sh, fp, re.MULTILINE) + match = re.search(sh, fp, re.MULTILINE) if match is not None: return - + fp += lines file(self.fileName, "w").write(fp) self.backups.append([None, lines]) - + def replace_lines(self, src, dst, addToBackup=True): - fp = file(self.fileName).read(-1) + fp = file(self.fileName).read(-1) sh = re.escape(src) if dst is None: dst = "" @@ -165,11 +165,11 @@ class ConfigFileOps: newlines.append(line) file(self.fileName, "w").writelines(newlines) - + def backup(self): for oldLine, newLine in self.backups: if newLine is None: self.add_lines(oldLine, False) else: self.replace_lines(newLine, oldLine, False) - + diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmCommonModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmCommonModule.py index 332539d8a97..21532d6993b 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmCommonModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmCommonModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -23,7 +23,7 @@ try: import json except ImportError: import simplejson as json - + from OvmObjectModule import * import types import logging @@ -55,7 +55,7 @@ def setAttrFromDict(obj, name, refDict, convertFunc=None): def safeSetAttr(obj, name, value): if not hasattr(obj, name): raise Exception("%s doesn't have attribute %s"%(obj.__class__.__name__, name)) setattr(obj, name, value) - + def toAscii(jstr): return str(jstr).encode('ascii', 'ignore') @@ -68,7 +68,7 @@ def toAsciiHook(dct): k = toAscii(k) dct[k] = v return dct - + def asciiLoads(jStr): jStr = str(jStr).replace("'", '"').replace('False', 'false').replace('True', 'true') return json.loads(jStr, object_hook=toAsciiHook) @@ -90,7 +90,7 @@ def jsonSuccessToMap(str): dct = json.loads(str) if dct['status'] != 'SUCC': raise Exception(str) return dct['value'] - + def safeDictSet(obj, dct, name): if not hasattr(obj, name): raise Exception("%s has no attribute %s for encoding"%(obj.__class__.__name__, name)) dct[name] = getattr(obj, name) @@ -133,7 +133,7 @@ def execute(cmd): def getDomId(vm_name): return execute("xm list | grep " + vm_name + " | awk '{print $2}'").strip() - + def raiseExceptionIfFail(res): if not "success" in res and not "SUCC" in res: raise Exception(res) @@ -156,4 +156,4 @@ def makeOwnerFileName(): hostIp = successToMap(get_master_ip())['ip'] ownerFileName = OWNER_FILE_PREFIX + hostIp.replace('.', '_') return ownerFileName - + diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDiskModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDiskModule.py index c7bac21479e..7711dc94b2c 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDiskModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDiskModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -36,7 +36,7 @@ class OvmDiskEncoder(json.JSONEncoder): dct = {} safeDictSet(obj, dct, 'path') safeDictSet(obj, dct, 'type') - return dct + return dct def fromOvmDisk(disk): return normalizeToGson(json.dumps(disk, cls=OvmDiskEncoder)) @@ -58,8 +58,8 @@ class OvmDisk(OvmObject): path = '' type = '' isIso = False - - + + if __name__ == "__main__": print toOvmDisk('''{"type":"w","path":"/data/data.raw"}''') print toOvmDisk('''{"path":"/data/data.raw'","type":"w"}''') \ No newline at end of file diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDispatcher.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDispatcher.py index 78d1faeaba2..d5c4f9818e9 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDispatcher.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmDispatcher.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmFaultConstants.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmFaultConstants.py index 25b8e5a4d28..9599586f1e8 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmFaultConstants.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmFaultConstants.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -28,7 +28,7 @@ class NoVmFoundException(Exception): class ShellExceutedFailedException(Exception): stderr = '' errCode = -1000 - + def __init__(self, err, code): Exception.__init__(self, "%s, return code:%s"%(err, code)) self.stderr = err @@ -40,7 +40,7 @@ errCode = { "OvmDispatch.InvaildClass":OvmDispatcherStub+2, "OvmDispatch.InvaildFunction":OvmDispatcherStub+3, "OvmVm.reboot":OvmDispatcherStub+4, - + "OvmHost.registerAsPrimary":OvmHostErrCodeStub+1, "OvmHost.registerAsVmServer":OvmHostErrCodeStub+2, "OvmHost.ping":OvmHostErrCodeStub+3, @@ -50,7 +50,7 @@ errCode = { "OvmHost.fence":OvmHostErrCodeStub+7, "OvmHost.setupHeartBeat":OvmHostErrCodeStub+8, "OvmHost.pingAnotherHost":OvmHostErrCodeStub+9, - + "OvmVm.create":OvmVmErrCodeStub+1, "OvmVm.stop":OvmVmErrCodeStub+2, "OvmVm.getDetails":OvmVmErrCodeStub+3, @@ -59,7 +59,7 @@ errCode = { "OvmVm.register":OvmVmErrCodeStub+6, "OvmVm.getVncPort":OvmVmErrCodeStub+7, "OvmVm.detachOrAttachIso":OvmVmErrCodeStub+8, - + "OvmStoragePool.create":OvmStoragePoolErrCodeStub+1, "OvmStoragePool.getDetailsByUuid":OvmStoragePoolErrCodeStub+2, "OvmStoragePool.downloadTemplate":OvmStoragePoolErrCodeStub+3, @@ -68,7 +68,7 @@ errCode = { "OvmStoragePool._umount":OvmStoragePoolErrCodeStub+6, "OvmStoragePool.copyVolume":OvmStoragePoolErrCodeStub+7, "OvmStoragePool.delete":OvmStoragePoolErrCodeStub+8, - + "OvmNetwork.createBridge":OvmNetworkErrCodeStub+1, "OvmNetwork.deleteBridge":OvmNetworkErrCodeStub+2, "OvmNetwork.createVlan":OvmNetworkErrCodeStub+3, @@ -77,11 +77,11 @@ errCode = { "OvmNetwork.getBridgeByIp":OvmNetworkErrCodeStub+6, "OvmNetwork.createVlanBridge":OvmNetworkErrCodeStub+7, "OvmNetwork.deleteVlanBridge":OvmNetworkErrCodeStub+8, - + "OvmVolume.createDataDisk":OvmVolumeErrCodeStub+1, "OvmVolume.createFromTemplate":OvmVolumeErrCodeStub+2, "OvmVolume.destroy":OvmVolumeErrCodeStub+3, - + "OvmOCFS2._addNode":OvmOCFS2ErrCodeStub+1, } diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHaHeartBeatModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHaHeartBeatModule.py index 299b0c96809..ec57f0c850b 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHaHeartBeatModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHaHeartBeatModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -34,7 +34,7 @@ class OvmHaHeartBeat(object): def __init__(self, mountPoint, ip): self.mountPoint = mountPoint self.ip = ip - + def mark(self, file): timestamp = HEARTBEAT_TIMESTAMP_FORMAT % time.time() try: @@ -44,7 +44,7 @@ class OvmHaHeartBeat(object): except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmHaHeartBeat.mark, errmsg) - + def run(self): ''' Constructor @@ -56,11 +56,11 @@ class OvmHaHeartBeat(object): while True: self.mark(hearBeatFile) time.sleep(120) - + @staticmethod def start(poolPath, ip): pidFile = join(PID_DIR, "heartbeat.pid") - + def isLive(): if exists(pidFile): f = open(pidFile) @@ -69,7 +69,7 @@ class OvmHaHeartBeat(object): if isdir("/proc/%s" % pid): return long(pid) return None - + def stopOldHeartBeat(pid): os.kill(pid, signal.SIGTERM) time.sleep(5) @@ -81,10 +81,10 @@ class OvmHaHeartBeat(object): pid = isLive() if pid != None: raise Exception("Cannot stop old heartbeat process %s, setup heart beat failed"%pid) - + def heartBeat(hb): hb.run() - + def setupHeartBeat(): hb = OvmHaHeartBeat(poolPath, ip) p = Process(target=heartBeat, args=(hb,)) @@ -96,10 +96,10 @@ class OvmHaHeartBeat(object): pidFd.write(str(pid)) pidFd.close() logger.info(OvmHaHeartBeat.start, "Set up heart beat successfully, pid is %s" % pid) - + pid = isLive() if pid != None: stopOldHeartBeat(pid) - + setupHeartBeat() - + diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHostModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHostModule.py index de50e8b1bb6..90deb098675 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHostModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmHostModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -44,11 +44,11 @@ class OvmHostEncoder(json.JSONEncoder): safeDictSet(obj, dct, 'dom0KernelVersion') safeDictSet(obj, dct, 'hypervisorVersion') return dct - + def fromOvmHost(host): return normalizeToGson(json.dumps(host, cls=OvmHostEncoder)) - + class OvmHost(OvmObject): masterIp = '' cpuNum = 0 @@ -64,7 +64,7 @@ class OvmHost(OvmObject): def _getVmPathFromPrimaryStorage(self, vmName): ''' we don't have a database to store vm states, so there is no way to retrieve information of a vm - when it was already stopped. The trick is to try to find the vm path in primary storage then we + when it was already stopped. The trick is to try to find the vm path in primary storage then we can read information from its configure file. ''' mps = OvmStoragePool()._getAllMountPoints() @@ -76,18 +76,18 @@ class OvmHost(OvmObject): logger.error(self._getVmPathFromPrimaryStorage, "Cannot find link for %s in any primary storage, the vm was really gone!"%vmName) raise Exception("Cannot find link for %s in any primary storage, the vm was really gone!"%vmName) return vmPath - + def _vmNameToPath(self, vmName): # the xen_get_vm_path always sucks!!! #return successToMap((vmName))['path'] return self._getVmPathFromPrimaryStorage(vmName) - + def _getAllDomains(self): stdout = timeout_command(["xm", "list"]) l = [ line.split()[:2] for line in stdout.splitlines() ] l = [ (name, id) for (name, id) in l if name not in ("Name", "Domain-0") ] return l - + def _getDomainIdByName(self, vmName): l = self._getAllDomains() for name, id in l: @@ -108,7 +108,7 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.registerAsPrimary, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.registerAsPrimary), errmsg) - + @staticmethod def registerAsVmServer(hostname, username="oracle", password="password", port=8899, isSsl=False): try: @@ -121,7 +121,7 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.registerAsVmServer, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.registerAsVmServer), errmsg) - + @staticmethod def ping(hostname): try: @@ -133,7 +133,7 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.ping, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.ping, errmsg)) - + @staticmethod def getDetails(): try: @@ -166,7 +166,7 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.getDetails, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.getDetails), errmsg) - + @staticmethod def getPerformanceStats(bridgeName): try: @@ -188,20 +188,20 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.getPerformanceStats, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.getPerformanceStats), errmsg) - + @staticmethod def getAllVms(): def scanStoppedVmOnPrimaryStorage(vms): def isMyVmDirLink(path): return (islink(path) and exists(join(path, 'vm.cfg')) and ('-' in basename(path)) and (exists(join(path, makeOwnerFileName())))) - + mps = OvmStoragePool()._getAllMountPoints() for mountPoint in mps: runningPool = join(mountPoint, 'running_pool') if not exists(runningPool): logger.debug(OvmHost.getAllVms, "Primary storage %s not existing, skip it. this should be first getAllVms() called from Ovm resource configure"%runningPool) continue - + for dir in os.listdir(runningPool): vmDir = join(runningPool, dir) if not isMyVmDirLink(vmDir): @@ -210,11 +210,11 @@ class OvmHost(OvmObject): if vms.has_key(dir): logger.debug(OvmHost.getAllVms, "%s is already in running list, skip it"%dir) continue - + logger.debug(OvmHost.getAllVms, "Found a stopped vm %s on primary storage %s, report it to management server" % (dir, mountPoint)) vms[dir] = "DOWN" - - + + try: l = OvmHost()._getAllDomains() dct = {} @@ -227,7 +227,7 @@ class OvmHost(OvmObject): except Exception, e: logger.debug(OvmHost.getAllVms, "Cannot find link for %s on primary storage, treat it as Error"%name) dct[name] = 'ERROR' - + scanStoppedVmOnPrimaryStorage(dct) rs = toGson(dct) logger.info(OvmHost.getAllVms, rs) @@ -236,13 +236,13 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.getAllVms, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.getAllVms), errmsg) - + @staticmethod def fence(ip): # try 3 times to avoid race condition that read when heartbeat file is being written def getTimeStamp(hbFile): for i in range(1, 3): - f = open(hbFile, 'r') + f = open(hbFile, 'r') str = f.readline() items = re.findall(HEARTBEAT_TIMESTAMP_PATTERN, str) if len(items) == 0: @@ -253,7 +253,7 @@ class OvmHost(OvmObject): f.close() timestamp = items[0] return timestamp.lstrip('').rstrip('') - + # totally check in 6 mins, the update frequency is 2 mins def check(hbFile): for i in range(1, 6): @@ -263,7 +263,7 @@ class OvmHost(OvmObject): if ts != nts: return True else: logger.debug(OvmHost.fence, '%s is not updated, old value=%s, will retry %s times'%(hbFile, ts, 6-i)) return False - + try: mountpoints = OvmStoragePool()._getAllMountPoints() hbFile = None @@ -272,7 +272,7 @@ class OvmHost(OvmObject): if exists(p): hbFile = p break - + if not hbFile: raise Exception('Can not find heartbeat file for %s in pools %s'%(ip, mountpoints)) rs = toGson({"isLive":check(hbFile)}) logger.debug(OvmHost.fence, rs) @@ -281,7 +281,7 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.fence, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.fence), errmsg) - + @staticmethod def setupHeartBeat(poolUuid, ip): try: @@ -292,7 +292,7 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.setupHeartBeat, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.setupHeartBeat), errmsg) - + @staticmethod def pingAnotherHost(ip): try: @@ -302,6 +302,6 @@ class OvmHost(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmHost.pingAnotherHost, errmsg) raise XmlRpcFault(toErrCode(OvmHost, OvmHost.pingAnotherHost), errmsg) - + if __name__ == "__main__": print OvmHost.getAllVms() \ No newline at end of file diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmLoggerModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmLoggerModule.py index 5d9e526bef9..a59ad5d11d7 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmLoggerModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmLoggerModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -32,22 +32,22 @@ class OvmLogger(object): ''' self.className = className self.logger = logging.getLogger(className) - + def info(self, func, msg=None): assert callable(func), "%s is not a function"%func fmt = "[%s.%s]: "%(self.className, func.__name__) self.logger.info("%s%s"%(fmt,msg)) - + def debug(self, func, msg=None): assert callable(func), "%s is not a function"%func fmt = "[%s.%s]: "%(self.className, func.__name__) self.logger.debug("%s%s"%(fmt,msg)) - + def error(self, func, msg=None): assert callable(func), "%s is not a function"%func fmt = "[%s.%s]: "%(self.className, func.__name__) self.logger.error("%s%s"%(fmt,msg)) - + def warning(self, func, msg=None): assert callable(func), "%s is not a function"%func fmt = "[%s.%s]: "%(self.className, func.__name__) diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py index c640071cef7..edb65bbebcb 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmNetworkModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -18,7 +18,7 @@ from OvmCommonModule import * import traceback import time import re - + logger = OvmLogger("OvmNetwork") class Filter: @@ -32,7 +32,7 @@ class Filter: class Parser(object): ''' classdocs - ''' + ''' def findall(self, pattern, samples): """ @param pattern: search pattern @@ -47,7 +47,7 @@ class Parser(object): for item in items: result.append(item) return result - + def checkPattern(self, pattern, cmd_result): """ @param pattern: search pattern @@ -59,10 +59,10 @@ class Parser(object): if len(items) > 0: return True return False - + def search(self, cmd_result, pattern): return None - + class OvmVlanDecoder(json.JSONDecoder): def decode(self, jStr): deDict = asciiLoads(jStr) @@ -79,7 +79,7 @@ class OvmVlanEncoder(json.JSONEncoder): safeDictSet(obj, dct, 'vid') safeDictSet(obj, dct, 'pif') return dct - + def toOvmVlan(jStr): return json.loads(jStr, cls=OvmVlanDecoder) @@ -102,7 +102,7 @@ class OvmBridgeEncoder(json.JSONEncoder): safeDictSet(obj, dct, 'attach') safeDictSet(obj, dct, 'interfaces') return dct - + def toOvmBridge(jStr): return json.loads(jStr, cls=OvmBridgeDecoder) @@ -120,7 +120,7 @@ class OvmBridge(OvmInterface): attach = '' interfaces = [] - + class OvmNetwork(OvmObject): ''' Network @@ -137,7 +137,7 @@ class OvmNetwork(OvmObject): @property def bridges(self): return self._getInterfaces("bridge") - + def __init__(self): self.Parser = Parser() @@ -146,51 +146,51 @@ class OvmNetwork(OvmObject): @param jsonString : parameter from client side @return : succ xxxxx ex. jsonString => {vid:100, pif:eth0} - ex. return => + ex. return => """ - + #Pre-condition #check Physical Interface Name - if vlan.pif not in self.pifs.keys(): + if vlan.pif not in self.pifs.keys(): msg = "Physical Interface(%s) does not exist" % vlan.pif logger.debug(self._createVlan, msg) raise Exception(msg) - #Pre-condition + #Pre-condition #check Vlan Interface Name ifName = "%s.%s" % (vlan.pif, vlan.vid) if ifName in self.vlans.keys(): msg = "Vlan Interface(%s) already exist, return it" % ifName logger.debug(self._createVlan, msg) return self.vlans[ifName] - + doCmd(['vconfig', 'add', vlan.pif, vlan.vid]) self.bringUP(ifName) logger.debug(self._createVlan, "Create vlan %s successfully"%ifName) return self.vlans[ifName] - + def _deleteVlan(self, name): if name not in self.vlans.keys(): raise Exception("No vlan device %s found"%name) - + vlan = self.vlans[name] self.bringDown(vlan.name) doCmd(['vconfig', 'rem', vlan.name]) logger.debug(self._deleteVlan, "Delete vlan %s successfully"%vlan.name) - - + + def _createBridge(self, bridge): """ @return : success ex. {bridge:xapi100, attach:eth0.100} - create bridge interface, and attached it + create bridge interface, and attached it cmd 1: ip link add bridge cmd 2: ip link set dev """ - + if "xenbr" not in bridge.name and "vlan" not in bridge.name: raise Exception("Invalid bridge name %s. Bridge name must be in partten xenbr/vlan, e.g. xenbr0"%bridge.name) - + #pre-condition #check Bridge Interface Name if bridge.name in self.bridges.keys(): @@ -200,7 +200,7 @@ class OvmNetwork(OvmObject): #pre-condition #check attach must exist - #possible to attach in PIF or VLAN + #possible to attach in PIF or VLAN if bridge.attach not in self.vlans.keys() and bridge.attach not in self.pifs.keys(): msg = "%s is not either pif or vlan" % bridge.attach logger.error(self._createBridge, msg) @@ -211,17 +211,17 @@ class OvmNetwork(OvmObject): self.bringUP(bridge.name) logger.debug(self._createBridge, "Create bridge %s on %s successfully"%(bridge.name, bridge.attach)) return self.bridges[bridge.name] - + def _getBridges(self): return self.bridges.keys() - + def _getVlans(self): return self.vlans.keys() - + def _deleteBridge(self, name): if name not in self.bridges.keys(): raise Exception("Can not find bridge %s"%name) - + bridge = self.bridges[name] if bridge.attach in bridge.interfaces: bridge.interfaces.remove(bridge.attach) if len(bridge.interfaces) != 0: @@ -231,7 +231,7 @@ class OvmNetwork(OvmObject): doCmd(['ip', 'link', 'del', bridge.name]) logger.debug(self._deleteBridge, "Delete bridge %s successfully"%bridge.name) return True - + def _getInterfaces(self, type): """ @param type : ["pif", "bridge", "tap"] @@ -246,7 +246,7 @@ class OvmNetwork(OvmObject): ifInst = OvmInterface() ifInst.name = dev ifs[dev] = ifInst - + elif type == "vlan": devs = self.Parser.findall(Filter.Network.IFNAME_VLAN, devices) for dev in set(devs): @@ -256,7 +256,7 @@ class OvmNetwork(OvmObject): ifInst.pif = pif ifInst.vid = vid ifs[dev] = ifInst - + elif type == "bridge": devs = self.Parser.findall(Filter.Network.IFNAME_BRIDGE, devices) for dev in set(devs): @@ -271,13 +271,13 @@ class OvmNetwork(OvmObject): ifs[dev] = ifInst return ifs - + def bringUP(self, ifName): doCmd(['ifconfig', ifName, 'up']) - + def bringDown(self, ifName): doCmd(['ifconfig', ifName, 'down']) - + @staticmethod def createBridge(jStr): try: @@ -288,7 +288,7 @@ class OvmNetwork(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmNetwork.createBridge, errmsg) raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.createBridge), errmsg) - + @staticmethod def deleteBridge(name): try: @@ -299,7 +299,7 @@ class OvmNetwork(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmNetwork.deleteBridge, errmsg) raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.deleteBridge), errmsg) - + @staticmethod def getAllBridges(): try: @@ -311,7 +311,7 @@ class OvmNetwork(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmNetwork.getAllBridges, errmsg) raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.getAllBridges), errmsg) - + @staticmethod def getBridgeByIp(ip): try: @@ -327,8 +327,8 @@ class OvmNetwork(OvmObject): except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmNetwork.getBridgeByIp, errmsg) - raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.getBridgeByIp), errmsg) - + raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.getBridgeByIp), errmsg) + @staticmethod def getVlans(): try: @@ -339,8 +339,8 @@ class OvmNetwork(OvmObject): except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmNetwork.getVlans, errmsg) - raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.getVlans), errmsg) - + raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.getVlans), errmsg) + @staticmethod def createVlan(jStr): try: @@ -353,7 +353,7 @@ class OvmNetwork(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmNetwork.createVlan, errmsg) raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.createVlan), errmsg) - + @staticmethod def createVlanBridge(bridgeDetails, vlanDetails): try: @@ -368,7 +368,7 @@ class OvmNetwork(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmNetwork.createVlanBridge, errmsg) raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.createVlanBridge), errmsg) - + @staticmethod def deleteVlanBridge(name): try: @@ -376,7 +376,7 @@ class OvmNetwork(OvmObject): if name not in network.bridges.keys(): logger.debug(OvmNetwork.deleteVlanBridge, "No bridge %s found"%name) return SUCC() - + bridge = network.bridges[name] vlanName = bridge.attach if network._deleteBridge(name): @@ -389,7 +389,7 @@ class OvmNetwork(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmNetwork.deleteVlanBridge, errmsg) raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.deleteVlanBridge), errmsg) - + @staticmethod def getBridgeDetails(name): try: @@ -404,7 +404,7 @@ class OvmNetwork(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmNetwork.getBridgeDetails, errmsg) raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.getBridgeDetails), errmsg) - + @staticmethod def deleteVlan(name): try: @@ -414,8 +414,8 @@ class OvmNetwork(OvmObject): except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmNetwork.deleteVlan, errmsg) - raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.deleteVlan), errmsg) - + raise XmlRpcFault(toErrCode(OvmNetwork, OvmNetwork.deleteVlan), errmsg) + if __name__ == "__main__": try: OvmNetwork.getBridgeDetails(sys.argv[1]) @@ -424,10 +424,10 @@ if __name__ == "__main__": # txt2 = json.dumps({"name":"xapi3", "attach":"eth0.104"}) # print nw.createVlan(txt) # print nw.createBridge(txt2) - # + # # nw.deleteBridge("xapi3") # nw.deleteVlan("eth0.104") #======================================================================= - + except Exception, e: print e diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmOCFS2Module.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmOCFS2Module.py index bf330f22885..650d868d358 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmOCFS2Module.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmOCFS2Module.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,7 +16,7 @@ # under the License. from OvmCommonModule import * -logger = OvmLogger('OvmOCFS2') +logger = OvmLogger('OvmOCFS2') class OvmOCFS2(OvmObject): def _prepareConf(self, cluster): conf = '''cluster: @@ -26,22 +26,22 @@ class OvmOCFS2(OvmObject): dir = dirname(OCFS2_CONF) if not isdir(dir): os.makedirs(dir) - + fd = open(OCFS2_CONF, 'w') fd.write(conf) fd.close() - + def _addNode(self, name, nodeNum, ip, port, cluster, isOnline=True): nodePath = '/sys/kernel/config/cluster/%s/node/%s'%(cluster, name) if exists(nodePath): logger.debug(OvmOCFS2._addNode, "node %s already exists, skip it(%s)"%(name, nodePath)) return - + if not isOnline: cmds = ['o2cb_ctl -C -n', name, '-t node', '-a number=%s'%nodeNum, '-a ip_address=%s'%ip, '-a ip_port=%s'%port, '-a cluster=%s'%cluster] else: cmds = ['o2cb_ctl -C -i -n', name, '-t node', '-a number=%s'%nodeNum, '-a ip_address=%s'%ip, '-a ip_port=%s'%port, '-a cluster=%s'%cluster] - + try: doCmd(cmds) except ShellExceutedFailedException, e: @@ -49,18 +49,18 @@ class OvmOCFS2(OvmObject): logger.debug(OvmOCFS2._addNode, "node %s already exists, skip it(%s)"%(name, e.stderr)) else: raise e - + def _isClusterOnline(self, cluster): cmds = ['service o2cb status', cluster] res = doCmd(cmds) for line in res.split('\n'): if not 'Checking O2CB cluster' in line: continue return not 'Offline' in line - + def _load(self): cmd = ['service o2cb load'] doCmd(cmd) - + def _start(self, cluster): #blank line are answer by clicking enter config=''' @@ -77,4 +77,4 @@ EOF doCmd(cmd) cmd = ['service o2cb start %s'%cluster] doCmd(cmd) - + diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmObjectModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmObjectModule.py index ca26d8486ad..c806f2927f2 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmObjectModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmObjectModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py index 5ce68f8d16f..076ffada2b0 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmSecurityGroupModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -34,11 +34,11 @@ class OvmSecurityGroup(OvmObject): except: print "ebtables was not found on the host" return False - + if not os.path.exists('/var/run/cloud'): os.makedirs('/var/run/cloud') - - return OvmSecurityGroup.cleanup_rules() + + return OvmSecurityGroup.cleanup_rules() @staticmethod def cleanup_rules(): @@ -52,8 +52,8 @@ class OvmSecurityGroup(OvmObject): vm_name = chain else: continue - - cmd = "xm list | grep " + vm_name + + cmd = "xm list | grep " + vm_name try: result = execute(cmd) except: @@ -62,10 +62,10 @@ class OvmSecurityGroup(OvmObject): if result == None or len(result) == 0: logging.debug("chain " + chain + " does not correspond to a vm, cleaning up") cleanup.append(vm_name) - + for vm_name in cleanup: OvmSecurityGroup.delete_all_network_rules_for_vm(vm_name) - + logging.debug("Cleaned up rules for " + str(len(cleanup)) + " chains") return True except: @@ -111,26 +111,26 @@ class OvmSecurityGroup(OvmObject): execute("iptables -A " + brfw + " -m physdev --physdev-is-bridged --physdev-out " + phydev + " -j ACCEPT") execute("iptables -A " + brfw + " -m state --state RELATED,ESTABLISHED -j ACCEPT") execute("iptables -A " + brfw + " -m physdev --physdev-is-bridged --physdev-is-out -j " + brfwout) - execute("iptables -A " + brfw + " -m physdev --physdev-is-bridged --physdev-is-in -j " + brfwin) - + execute("iptables -A " + brfw + " -m physdev --physdev-is-bridged --physdev-is-in -j " + brfwin) + return True except: try: execute("iptables -F " + brfw) except: return False - + return False @staticmethod def default_network_rules_user_vm(vm_name, vm_id, vm_ip, vm_mac, vif, bridge_name): if not OvmSecurityGroup.add_fw_framework(bridge_name): - return False + return False OvmSecurityGroup.delete_iptables_rules_for_vm(vm_name) OvmSecurityGroup.delete_ebtables_rules_for_vm(vm_name) - - bridge_firewall_chain = "BF-" + bridge_name + + bridge_firewall_chain = "BF-" + bridge_name vm_chain = vm_name default_vm_chain = '-'.join(vm_chain.split('-')[:-1]) + "-def" dom_id = getDomId(vm_name) @@ -139,7 +139,7 @@ class OvmSecurityGroup(OvmObject): execute("iptables -N " + vm_chain) except: execute("iptables -F " + vm_chain) - + try: execute("iptables -N " + default_vm_chain) except: @@ -163,13 +163,13 @@ class OvmSecurityGroup(OvmObject): except: logging.debug("Failed to program default rules for vm " + vm_name) return False - + OvmSecurityGroup.default_ebtables_rules(vm_chain, vm_ip, vm_mac, vif) - + if vm_ip is not None: if (OvmSecurityGroup.write_rule_log_for_vm(vm_name, vm_id, vm_ip, dom_id, '_initial_', '-1') == False): logging.debug("Failed to log default network rules, ignoring") - + logging.debug("Programmed default rules for vm " + vm_name) return True @@ -177,12 +177,12 @@ class OvmSecurityGroup(OvmObject): def default_ebtables_rules(vm_name, vm_ip, vm_mac, vif): vm_chain_in = vm_name + "-in" vm_chain_out = vm_name + "-out" - + for chain in [vm_chain_in, vm_chain_out]: try: execute("ebtables -t nat -N " + chain) except: - execute("ebtables -t nat -F " + chain) + execute("ebtables -t nat -F " + chain) try: execute("ebtables -t nat -A PREROUTING -i " + vif + " -j " + vm_chain_in) @@ -190,27 +190,27 @@ class OvmSecurityGroup(OvmObject): except: logging.debug("Failed to program default rules") return False - + try: execute("ebtables -t nat -A " + vm_chain_in + " -s ! " + vm_mac + " -j DROP") execute("ebtables -t nat -A " + vm_chain_in + " -p ARP -s ! " + vm_mac + " -j DROP") execute("ebtables -t nat -A " + vm_chain_in + " -p ARP --arp-mac-src ! " + vm_mac + " -j DROP") if vm_ip is not None: execute("ebtables -t nat -A " + vm_chain_in + " -p ARP --arp-ip-src ! " + vm_ip + " -j DROP") - execute("ebtables -t nat -A " + vm_chain_in + " -p ARP --arp-op Request -j ACCEPT") - execute("ebtables -t nat -A " + vm_chain_in + " -p ARP --arp-op Reply -j ACCEPT") - execute("ebtables -t nat -A " + vm_chain_in + " -p ARP -j DROP") + execute("ebtables -t nat -A " + vm_chain_in + " -p ARP --arp-op Request -j ACCEPT") + execute("ebtables -t nat -A " + vm_chain_in + " -p ARP --arp-op Reply -j ACCEPT") + execute("ebtables -t nat -A " + vm_chain_in + " -p ARP -j DROP") except: logging.exception("Failed to program default ebtables IN rules") return False - + try: execute("ebtables -t nat -A " + vm_chain_out + " -p ARP --arp-op Reply --arp-mac-dst ! " + vm_mac + " -j DROP") if vm_ip is not None: - execute("ebtables -t nat -A " + vm_chain_out + " -p ARP --arp-ip-dst ! " + vm_ip + " -j DROP") - execute("ebtables -t nat -A " + vm_chain_out + " -p ARP --arp-op Request -j ACCEPT") - execute("ebtables -t nat -A " + vm_chain_out + " -p ARP --arp-op Reply -j ACCEPT") - execute("ebtables -t nat -A " + vm_chain_out + " -p ARP -j DROP") + execute("ebtables -t nat -A " + vm_chain_out + " -p ARP --arp-ip-dst ! " + vm_ip + " -j DROP") + execute("ebtables -t nat -A " + vm_chain_out + " -p ARP --arp-op Request -j ACCEPT") + execute("ebtables -t nat -A " + vm_chain_out + " -p ARP --arp-op Reply -j ACCEPT") + execute("ebtables -t nat -A " + vm_chain_out + " -p ARP -j DROP") except: logging.debug("Failed to program default ebtables OUT rules") return False @@ -222,14 +222,14 @@ class OvmSecurityGroup(OvmObject): try: vm_chain = vm_name dom_id = getDomId(vm_name) - + changes = [] changes = OvmSecurityGroup.check_rule_log_for_vm(vm_name, vm_id, vm_ip, dom_id, signature, seqno) - + if not 1 in changes: logging.debug("Rules already programmed for vm " + vm_name) return True - + if changes[0] or changes[1] or changes[2] or changes[3]: if not OvmSecurityGroup.default_network_rules(vm_name, vm_id, vm_ip, vm_mac, vif, bridge_name): return False @@ -241,8 +241,8 @@ class OvmSecurityGroup(OvmObject): logging.debug("Programming network rules for IP: " + vm_ip + " vmname=" + vm_name) execute("iptables -F " + vm_chain) - - for line in lines: + + for line in lines: tokens = line.split(':') if len(tokens) != 4: continue @@ -257,9 +257,9 @@ class OvmSecurityGroup(OvmObject): i = ips.index('0.0.0.0/0') del ips[i] allow_any = True - + port_range = start + ":" + end - if ips: + if ips: if protocol == 'all': for ip in ips: execute("iptables -I " + vm_chain + " -m state --state NEW -s " + ip + " -j ACCEPT") @@ -272,7 +272,7 @@ class OvmSecurityGroup(OvmObject): port_range = "any" for ip in ips: execute("iptables -I " + vm_chain + " -p icmp --icmp-type " + port_range + " -s " + ip + " -j ACCEPT") - + if allow_any and protocol != 'all': if protocol != 'icmp': execute("iptables -I " + vm_chain + " -p " + protocol + " -m " + protocol + " --dport " + port_range + " -m state --state NEW -j ACCEPT") @@ -281,17 +281,17 @@ class OvmSecurityGroup(OvmObject): if start == "-1": port_range = "any" execute("iptables -I " + vm_chain + " -p icmp --icmp-type " + port_range + " -j ACCEPT") - - iptables = "iptables -A " + vm_chain + " -j DROP" + + iptables = "iptables -A " + vm_chain + " -j DROP" execute(iptables) - - return OvmSecurityGroup.write_rule_log_for_vm(vm_name, vm_id, vm_ip, dom_id, signature, seqno) + + return OvmSecurityGroup.write_rule_log_for_vm(vm_name, vm_id, vm_ip, dom_id, signature, seqno) except: logging.debug("Failed to network rule !: " + sys.exc_type) return False @staticmethod - def delete_all_network_rules_for_vm(vm_name, vif = None): + def delete_all_network_rules_for_vm(vm_name, vif = None): OvmSecurityGroup.delete_iptables_rules_for_vm(vm_name) OvmSecurityGroup.delete_ebtables_rules_for_vm(vm_name) @@ -299,15 +299,15 @@ class OvmSecurityGroup(OvmObject): default_vm_chain = None if vm_name.startswith('i-') or vm_name.startswith('r-'): default_vm_chain = '-'.join(vm_name.split('-')[:-1]) + "-def" - + try: - if default_vm_chain != None: + if default_vm_chain != None: execute("iptables -F " + default_vm_chain) except: logging.debug("Ignoring failure to delete chain " + default_vm_chain) - + try: - if default_vm_chain != None: + if default_vm_chain != None: execute("iptables -X " + vmchain_default) except: logging.debug("Ignoring failure to delete chain " + default_vm_chain) @@ -316,12 +316,12 @@ class OvmSecurityGroup(OvmObject): execute("iptables -F " + vm_chain) except: logging.debug("Ignoring failure to delete chain " + vm_chain) - + try: execute("iptables -X " + vm_chain) except: logging.debug("Ignoring failure to delete chain " + vm_chain) - + if vif is not None: try: dnats = execute("iptables-save -t nat | grep " + vif + " | sed 's/-A/-D/'").split("\n") @@ -329,15 +329,15 @@ class OvmSecurityGroup(OvmObject): try: execute("iptables -t nat " + dnat) except: - logging.debug("Igoring failure to delete dnat: " + dnat) + logging.debug("Igoring failure to delete dnat: " + dnat) except: pass - + OvmSecurityGroup.remove_rule_log_for_vm(vm_name) - + if 1 in [ vm_name.startswith(c) for c in ['r-', 's-', 'v-'] ]: return True - + return True @staticmethod @@ -347,7 +347,7 @@ class OvmSecurityGroup(OvmObject): query = "iptables-save | grep " + vm_chain + " | grep physdev-is-bridged | sed 's/-A/-D/'" delete_cmds = execute(query).split('\n') delete_cmds.pop() - + for cmd in delete_cmds: try: execute("iptables " + cmd) @@ -356,7 +356,7 @@ class OvmSecurityGroup(OvmObject): @staticmethod def delete_ebtables_rules_for_vm(vm_name): - vm_name = OvmSecurityGroup.truncate_vm_name(vm_name) + vm_name = OvmSecurityGroup.truncate_vm_name(vm_name) query = "ebtables -t nat -L --Lx | grep ROUTING | grep " + vm_name + " | sed 's/-A/-D/'" delete_cmds = execute(query).split('\n') delete_cmds.pop() @@ -366,9 +366,9 @@ class OvmSecurityGroup(OvmObject): execute(cmd) except: logging.debug("Ignoring failure to delete ebtables rules for vm " + vm_name) - + chains = [vm_name + "-in", vm_name + "-out"] - + for chain in chains: try: execute("ebtables -t nat -F " + chain) @@ -382,7 +382,7 @@ class OvmSecurityGroup(OvmObject): truncated_vm_name = '-'.join(vm_name.split('-')[:-1]) else: truncated_vm_name = vm_name - return truncated_vm_name + return truncated_vm_name @staticmethod def write_rule_log_for_vm(vm_name, vm_id, vm_ip, dom_id, signature, seqno): @@ -391,15 +391,15 @@ class OvmSecurityGroup(OvmObject): logf = open(log_file_name, 'w') output = ','.join([vm_name, vm_id, vm_ip, dom_id, signature, seqno]) - result = True + result = True try: logf.write(output) logf.write('\n') except: logging.debug("Failed to write to rule log file " + log_file_name) result = False - - logf.close() + + logf.close() return result @staticmethod @@ -412,7 +412,7 @@ class OvmSecurityGroup(OvmObject): except: logging.debug("Failed to delete rule log file " + log_file_name) result = False - + return result @staticmethod @@ -420,11 +420,11 @@ class OvmSecurityGroup(OvmObject): log_file_name = "/var/run/cloud/" + vm_name + ".log" if not os.path.exists(log_file_name): return [True, True, True, True, True, True] - + try: lines = (line.rstrip() for line in open(log_file_name)) except: - logging.debug("failed to open " + log_file_name) + logging.debug("failed to open " + log_file_name) return [True, True, True, True, True, True] [_vm_name, _vm_id, _vm_ip, _dom_id, _signature, _seqno] = ['_', '-1', '_', '-1', '_', '-1'] @@ -436,10 +436,9 @@ class OvmSecurityGroup(OvmObject): logging.debug("Failed to parse log file for vm " + vm_name) remove_rule_log_for_vm(vm_name) return [True, True, True, True, True, True] - + return [(vm_name != _vm_name), (vm_id != _vm_id), (vm_ip != _vm_ip), (dom_id != _dom_id), (signature != _signature), (seqno != _seqno)] - @@ -475,4 +474,5 @@ class OvmSecurityGroup(OvmObject): - + + diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py index f4933eccaa9..176d54a3f23 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmStoragePoolModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -50,7 +50,7 @@ def fromOvmStoragePool(pool): def toOvmStoragePool(jStr): return json.loads(jStr, cls=OvmStoragePoolDecoder) -logger = OvmLogger('OvmStoragePool') +logger = OvmLogger('OvmStoragePool') class OvmStoragePool(OvmObject): uuid = '' type = '' @@ -65,42 +65,42 @@ class OvmStoragePool(OvmObject): for uuid, sr in d.items(): if sr.name_label == poolUuid: return sr - + raise Exception("No SR matching to %s" % poolUuid) - + def _getSpaceinfoOfDir(self, dir): stat = os.statvfs(dir) freeSpace = stat.f_frsize * stat.f_bavail; totalSpace = stat.f_blocks * stat.f_frsize; return (totalSpace, freeSpace) - + def _checkDirSizeForImage(self, dir, image): (x, free_storage_size) = OvmStoragePool()._getSpaceinfoOfDir(dir) image_size = os.path.getsize(image) if image_size > (free_storage_size + 1024 * 1024 * 1024): raise Exception("No space on dir %s (free storage:%s, vm size:%s)"%(dir, free_storage_size, image_size)) - + def _getAllMountPoints(self): mps = [] d = db_dump('sr') for uuid, sr in d.items(): mps.append(sr.mountpoint) return mps - + def _isMounted(self, path): res = doCmd(['mount']) return (path in res) - + def _mount(self, target, mountpoint, readonly=False): if not exists(mountpoint): os.makedirs(mountpoint) - + if not OvmStoragePool()._isMounted(mountpoint): if readonly: doCmd(['mount', target, mountpoint, '-r']) else: doCmd(['mount', target, mountpoint]) - + def _umount(self, mountpoint): umountCmd = ['umount', '-f', mountpoint] doCmd(umountCmd) @@ -110,7 +110,7 @@ class OvmStoragePool(OvmObject): doCmd(rmDirCmd) else: logger.warning(OvmStoragePool._umount, "Something wrong when umount %s, there are still files in directory:%s", mountpoint, " ".join(ls)) - + @staticmethod def create(jStr): try: @@ -125,7 +125,7 @@ class OvmStoragePool(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmStoragePool.create, errmsg) raise XmlRpcFault(toErrCode(OvmStoragePool, OvmStoragePool.create), errmsg) - + @staticmethod def getDetailsByUuid(uuid): try: @@ -147,7 +147,7 @@ class OvmStoragePool(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmStoragePool.getDetailsByUuid, errmsg) raise XmlRpcFault(toErrCode(OvmStoragePool, OvmStoragePool.getDetailsByUuid), errmsg) - + @staticmethod def downloadTemplate(uuid, secPath): secMountPoint = None @@ -158,28 +158,28 @@ class OvmStoragePool(OvmObject): secMountPoint = join("/var/cloud/", tmpUuid) if not exists(secMountPoint): os.makedirs(secMountPoint) - + templateFile = None if secPath.endswith("raw"): secPathDir = os.path.dirname(secPath) templateFile = os.path.basename(secPath) else: secPathDir = secPath - + # mount as read-only mountCmd = ['mount.nfs', secPathDir, secMountPoint, '-r'] doCmd(mountCmd) - + if not templateFile: for f in os.listdir(secMountPoint): if isfile(join(secMountPoint, f)) and f.endswith('raw'): templateFile = f - break - + break + if not templateFile: raise Exception("Can not find raw template in secondary storage") templateSecPath = join(secMountPoint, templateFile) - + sr = OvmStoragePool()._getSrByNameLable(uuid) priStorageMountPoint = sr.mountpoint # Although mgmt server will check the size, we check again for safety @@ -188,12 +188,12 @@ class OvmStoragePool(OvmObject): if exists(seedDir): raise Exception("%s already here, cannot override existing template" % seedDir) os.makedirs(seedDir) - + tgt = join(seedDir, templateFile) cpTemplateCmd = ['cp', templateSecPath, tgt] logger.info(OvmStoragePool.downloadTemplate, " ".join(cpTemplateCmd)) doCmd(cpTemplateCmd) - templateSize = os.path.getsize(tgt) + templateSize = os.path.getsize(tgt) logger.info(OvmStoragePool.downloadTemplate, "primary_storage_download success:installPath:%s, templateSize:%s"%(tgt,templateSize)) rs = toGson({"installPath":tgt, "templateSize":templateSize}) return rs @@ -210,7 +210,7 @@ class OvmStoragePool(OvmObject): logger.error(OvmStoragePool.downloadTemplate, 'unmount secondary storage at %s failed, %s'%(secMountPoint, errmsg)) @staticmethod - def prepareOCFS2Nodes(clusterName, nodeString): + def prepareOCFS2Nodes(clusterName, nodeString): def configureEtcHosts(nodes): if not exists(ETC_HOSTS): orignalConf = "" @@ -218,14 +218,14 @@ class OvmStoragePool(OvmObject): fd = open(ETC_HOSTS, "r") orignalConf = fd.read() fd.close() - + pattern = r"(.*%s.*)|(.*%s.*)" newlines = [] for n in nodes: p = pattern % (n["ip_address"], n["name"]) orignalConf = re.sub(p, "", orignalConf) newlines.append("%s\t%s\n"%(n["ip_address"], n["name"])) - + orignalConf = orignalConf + "".join(newlines) # remove extra empty lines orignalConf = re.sub(r"\n\s*\n*", "\n", orignalConf) @@ -233,7 +233,7 @@ class OvmStoragePool(OvmObject): fd = open(ETC_HOSTS, "w") fd.write(orignalConf) fd.close() - + def configureHostName(nodes): myIp = successToMap(get_master_ip())['ip'] nodeName = None @@ -241,7 +241,7 @@ class OvmStoragePool(OvmObject): if myIp == n["ip_address"]: nodeName = n["name"] break - + if nodeName == None: raise Exception("Cannot find node equals to my ip address:%s"%myIp) if not exists(HOSTNAME_FILE): originalConf = "" @@ -249,7 +249,7 @@ class OvmStoragePool(OvmObject): fd = open(HOSTNAME_FILE, "r") originalConf = fd.read() fd.close() - + pattern = r"HOSTNAME=(.*)" # remove any old hostname originalConf = re.sub(pattern, "", originalConf) @@ -260,31 +260,31 @@ class OvmStoragePool(OvmObject): fd.write(originalConf) fd.close() doCmd(['hostname', nodeName]) - + def addNodes(nodes, clusterName): ocfs2 = OvmOCFS2() ocfs2._load() isOnline = ocfs2._isClusterOnline(clusterName) if not isOnline: ocfs2._prepareConf(clusterName) - + for n in nodes: ocfs2._addNode(n['name'], n['number'], n['ip_address'], 7777, clusterName, isOnline) - + def checkStaleCluster(clusterName): if exists('/sys/kernel/config/cluster/'): dirs = os.listdir('/sys/kernel/config/cluster/') for dir in dirs: if dir != clusterName: errMsg = '''CloudStack detected there is a stale cluster(%s) on host %s. Please manually clean up it first then add again by -1) remove the host from cloudstack +1) remove the host from cloudstack 2) umount all OCFS2 device on host 3) /etc/init.d/o2cb offline %s 4) /etc/init.d/o2cb restart if this doesn't resolve the problem, please check oracle manual to see how to offline a cluster ''' % (dir, successToMap(get_master_ip())['ip'], dir) raise Exception(errMsg) - + try: checkStaleCluster(clusterName) nodeString = nodeString.strip(";") @@ -294,10 +294,10 @@ if this doesn't resolve the problem, please check oracle manual to see how to of if len(params) != 3: raise Exception("Wrong parameter(%s) in node string(%s)"%(n, nodeString)) dict = {"number":params[0], "ip_address":params[1], "name":params[2]} nodes.append(dict) - + if len(nodes) > 255: raise Exception("%s nodes beyond maximum 255 allowed by OCFS2"%len(nodes)) - + configureHostName(nodes) configureEtcHosts(nodes) addNodes(nodes, clusterName) @@ -308,12 +308,12 @@ if this doesn't resolve the problem, please check oracle manual to see how to of logger.debug(OvmStoragePool.prepareOCFS2Nodes, "Configure cluster.conf to:\n%s"%' '.join(conf)) rs = SUCC() return rs - + except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmStoragePool.prepareOCFS2Nodes, errmsg) raise XmlRpcFault(toErrCode(OvmStoragePool, OvmStoragePool.prepareOCFS2Nodes), errmsg) - + @staticmethod def createTemplateFromVolume(secStorageMountPath, installPath, volumePath): try: @@ -323,7 +323,7 @@ if this doesn't resolve the problem, please check oracle manual to see how to of vmName = getVmNameFromConfigureFile(vmCfg) if vmName in doCmd(['xm', 'list']): raise Exception("%s is still running, please stop it first then create template again"%vmName) - + tmpUuid = get_uuid() secMountPoint = join("/var/cloud/", tmpUuid) OvmStoragePool()._mount(secStorageMountPath, secMountPoint) @@ -335,7 +335,7 @@ if this doesn't resolve the problem, please check oracle manual to see how to of logger.warning(OvmStoragePool.createTemplateFromVolume, "%s is already here, delete it since it is most likely stale"%destPath) doCmd(['rm', '-rf', destPath]) OvmStoragePool()._checkDirSizeForImage(secMountPoint, volumePath) - + os.makedirs(destPath) newName = get_uuid() + ".raw" destName = join(destPath, newName) @@ -345,18 +345,18 @@ if this doesn't resolve the problem, please check oracle manual to see how to of OvmStoragePool()._umount(secMountPoint) rs = toGson({"installPath":resInstallPath, "templateFileName":newName, "virtualSize":size, "physicalSize":size}) return rs - + except Exception, e: try: if exists(secMountPoint): OvmStoragePool()._umount(secMountPoint) except Exception, e: - logger.warning(OvmStoragePool.createTemplateFromVolume, "umount %s failed"%secMountPoint) - + logger.warning(OvmStoragePool.createTemplateFromVolume, "umount %s failed"%secMountPoint) + errmsg = fmt_err_msg(e) logger.error(OvmStoragePool.createTemplateFromVolume, errmsg) raise XmlRpcFault(toErrCode(OvmStoragePool, OvmStoragePool.createTemplateFromVolume), errmsg) - + @staticmethod def delete(uuid): try: @@ -368,8 +368,8 @@ if this doesn't resolve the problem, please check oracle manual to see how to of except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmStoragePool.delete, errmsg) - raise XmlRpcFault(toErrCode(OvmStoragePool, OvmStoragePool.delete), errmsg) - + raise XmlRpcFault(toErrCode(OvmStoragePool, OvmStoragePool.delete), errmsg) + @staticmethod def copyVolume(secStorageMountPath, volumeFolderOnSecStorage, volumePath, storagePoolUuid, toSec): def copyToSecStorage(secMountPoint, volumeFolderOnSecStorage, volumePath): @@ -387,7 +387,7 @@ if this doesn't resolve the problem, please check oracle manual to see how to of destName = join(destPath, newName) doCmd(['cp', volumePath, destName]) return destName - + def copyToPrimary(secMountPoint, volumeFolderOnSecStorage, volumePath, primaryMountPath): srcPath = join(secMountPoint, volumeFolderOnSecStorage.lstrip("/"), volumePath.lstrip("/")) if not srcPath.endswith(".raw"): srcPath = srcPath + ".raw" @@ -399,7 +399,7 @@ if this doesn't resolve the problem, please check oracle manual to see how to of destName = join(destPath, newName) doCmd(['cp', srcPath, destName]) return destName - + secMountPoint = "" try: tmpUuid = get_uuid() @@ -412,7 +412,7 @@ if this doesn't resolve the problem, please check oracle manual to see how to of primaryStoragePath = sr.mountpoint resultPath = copyToPrimary(secMountPoint, volumeFolderOnSecStorage, volumePath, primaryStoragePath) OvmStoragePool()._umount(secMountPoint) - + # ingratiate bad mgmt server design, it asks 'installPath' but it only wants the volume name without suffix volumeUuid = basename(resultPath).rstrip(".raw") rs = toGson({"installPath":volumeUuid}) @@ -422,11 +422,10 @@ if this doesn't resolve the problem, please check oracle manual to see how to of if exists(secMountPoint): OvmStoragePool()._umount(secMountPoint) except Exception, e: - logger.warning(OvmStoragePool.copyVolume, "umount %s failed"%secMountPoint) - + logger.warning(OvmStoragePool.copyVolume, "umount %s failed"%secMountPoint) + errmsg = fmt_err_msg(e) logger.error(OvmStoragePool.copyVolume, errmsg) raise XmlRpcFault(toErrCode(OvmStoragePool, OvmStoragePool.copyVolume), errmsg) - - - \ No newline at end of file + + diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVifModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVifModule.py index 561b1a9f3e9..1519843d08d 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVifModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVifModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -27,7 +27,7 @@ class OvmVifDecoder(json.JSONDecoder): vif.mac = deDict['mac'] vif.bridge = deDict['bridge'] return vif - + class OvmVifEncoder(json.JSONEncoder): def default(self, obj): if not isinstance(obj, OvmVif): raise Exception("%s is not instance of OvmVif"%type(obj)) @@ -36,7 +36,7 @@ class OvmVifEncoder(json.JSONEncoder): safeDictSet(obj, dct, 'bridge') safeDictSet(obj, dct, 'type') safeDictSet(obj, dct, 'name') - return dct + return dct def fromOvmVif(vif): return normalizeToGson(json.dumps(vif, cls=OvmVifEncoder)) @@ -60,6 +60,6 @@ class OvmVif(OvmObject): bridge = '' type = '' mode = '' - + def toXenString(self): return "%s,%s,%s"%(self.mac, self.bridge, self.type) diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVmModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVmModule.py index 5e9e52112e1..ff7e5d5d87c 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVmModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVmModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -71,7 +71,7 @@ class OvmVmEncoder(json.JSONEncoder): disks = fromOvmDiskList(obj.disks) dct['disks'] = disks return dct - + def toOvmVm(jStr): return json.loads(jStr, cls=OvmVmDecoder) @@ -88,7 +88,7 @@ class OvmVm(OvmObject): name = '' bootDev = '' type = '' - + def _getVifs(self, vmName): vmPath = OvmHost()._vmNameToPath(vmName) domId = OvmHost()._getDomainIdByName(vmName) @@ -104,9 +104,9 @@ class OvmVm(OvmObject): safeSetAttr(vif, 'bridge', bridge) safeSetAttr(vif, 'type', type) lst.append(vif) - + return lst - + def _getVifsFromConfig(self, vmPath): vifs = successToMap(xen_get_vifs(vmPath)) lst = [] @@ -120,16 +120,16 @@ class OvmVm(OvmObject): safeSetAttr(vif, 'type', type) lst.append(vif) return lst - + def _getIsoMountPath(self, vmPath): vmName = basename(vmPath) priStoragePath = vmPath.rstrip(join('running_pool', vmName)) return join(priStoragePath, 'iso_pool', vmName) - + def _getVmTypeFromConfigFile(self, vmPath): vmType = successToMap(xen_get_vm_type(vmPath))['type'] return vmType.replace('hvm', 'HVM').replace('para', 'PV') - + def _tapAOwnerFile(self, vmPath): # Create a file with name convention 'host_ip_address' in vmPath # Because xm list doesn't return vm that has been stopped, we scan @@ -140,30 +140,30 @@ class OvmVm(OvmObject): fd = open(join(vmPath, ownerFileName), 'w') fd.write(ownerFileName) fd.close() - + def _cleanUpOwnerFile(self, vmPath): for f in os.listdir(vmPath): fp = join(vmPath, f) if isfile(fp) and f.startswith(OWNER_FILE_PREFIX): os.remove(fp) - + @staticmethod - def create(jsonString): + def create(jsonString): def dumpCfg(vmName, cfgPath): cfgFd = open(cfgPath, 'r') cfg = cfgFd.readlines() cfgFd.close() logger.info(OvmVm.create, "Start %s with configure:\n\n%s\n"%(vmName, "".join(cfg))) - + def setVifsType(vifs, type): for vif in vifs: vif.type = type - + def hddBoot(vm, vmPath): vmType = vm.type if vmType == "FROMCONFIGFILE": vmType = OvmVm()._getVmTypeFromConfigFile(vmPath) - + cfgDict = {} if vmType == "HVM": cfgDict['builder'] = "'hvm'" @@ -175,7 +175,7 @@ class OvmVm(OvmObject): else: cfgDict['bootloader'] = "'/usr/bin/pygrub'" vifType = 'netfront' - + cfgDict['name'] = "'%s'"%vm.name cfgDict['disk'] = "[]" cfgDict['vcpus'] = "''" @@ -183,17 +183,17 @@ class OvmVm(OvmObject): cfgDict['on_crash'] = "'destroy'" cfgDict['on_reboot'] = "'restart'" cfgDict['vif'] = "[]" - + items = [] for k in cfgDict.keys(): item = " = ".join([k, cfgDict[k]]) items.append(item) vmSpec = "\n".join(items) - + vmCfg = open(join(vmPath, 'vm.cfg'), 'w') vmCfg.write(vmSpec) vmCfg.close() - + setVifsType(vm.vifs, vifType) raiseExceptionIfFail(xen_set_vcpus(vmPath, vm.cpuNum)) raiseExceptionIfFail(xen_set_memory(vmPath, BytesToM(vm.memory))) @@ -201,7 +201,7 @@ class OvmVm(OvmObject): vifs = [OvmVif.toXenString(v) for v in vm.vifs] for vif in vifs: raiseExceptionIfFail(xen_set_vifs(vmPath, vif)) - + for disk in vm.disks: raiseExceptionIfFail(xen_add_disk(vmPath, disk.path, mode=disk.type)) @@ -215,7 +215,7 @@ class OvmVm(OvmObject): # it's tricky ! raiseExceptionIfFail(xen_config_boot_sequence(vmPath, 'd')) raiseExceptionIfFail(xen_config_boot_sequence(vmPath, 'c')) - + raiseExceptionIfFail(xen_correct_cfg(cfgFile, vmPath)) xen_correct_qos_cfg(cfgFile) dumpCfg(vm.name, cfgFile) @@ -223,7 +223,7 @@ class OvmVm(OvmObject): raiseExceptionIfFail(start_vm(vmPath, server)) rs = SUCC() return rs - + def cdBoot(vm, vmPath): isoMountPath = None try: @@ -233,7 +233,7 @@ class OvmVm(OvmObject): cdrom = disk break if not cdrom: raise Exception("Cannot find Iso in disks") - + isoOnSecStorage = dirname(cdrom.path) isoName = basename(cdrom.path) isoMountPath = OvmVm()._getIsoMountPath(vmPath) @@ -241,10 +241,10 @@ class OvmVm(OvmObject): isoPath = join(isoMountPath, isoName) if not exists(isoPath): raise Exception("Cannot found iso %s at %s which mounts to %s"%(isoName, isoOnSecStorage, isoMountPath)) - + stdout = run_cmd(args=['file', isoPath]) if not stdout.strip().endswith("(bootable)"): raise Exception("ISO %s is not bootable"%cdrom.path) - + #now alter cdrom to correct path cdrom.path = isoPath if len(vm.vifs) != 0: @@ -253,7 +253,7 @@ class OvmVm(OvmObject): vifCfg = ','.join([vif.mac, vif.bridge, 'ioemu']) else: vifCfg = '' - + rootDiskSize = os.path.getsize(vm.rootDisk.path) rooDiskCfg = ':'.join([join(vmPath, basename(vm.rootDisk.path)), str(BytesToG(rootDiskSize)), 'True']) disks = [rooDiskCfg] @@ -264,7 +264,7 @@ class OvmVm(OvmObject): disks.append(cfg) disksCfg = ','.join(disks) server = successToMap(get_master_ip())['ip'] - + raiseExceptionIfFail(install_vm_hvm(vmPath, BytesToM(vm.memory), vm.cpuNum, vifCfg, disksCfg, cdrom.path, vncpassword='', dedicated_server=server)) rs = SUCC() return rs @@ -273,13 +273,13 @@ class OvmVm(OvmObject): doCmd(['umount', '-f', isoMountPath]) errmsg = fmt_err_msg(e) raise Exception(errmsg) - + try: vm = toOvmVm(jsonString) logger.debug(OvmVm.create, "creating vm, spec:%s"%jsonString) rootDiskPath = vm.rootDisk.path if not exists(rootDiskPath): raise Exception("Cannot find root disk %s"%rootDiskPath) - + rootDiskDir = dirname(rootDiskPath) vmPath = join(dirname(rootDiskDir), vm.name) if not exists(vmPath): @@ -287,7 +287,7 @@ class OvmVm(OvmObject): vmNameFile = open(join(rootDiskDir, 'vmName'), 'w') vmNameFile.write(vm.name) vmNameFile.close() - + OvmVm()._tapAOwnerFile(rootDiskDir) # set the VM to DOWN before starting, OVS agent will check this status set_vm_status(vmPath, 'DOWN') @@ -302,7 +302,7 @@ class OvmVm(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVm.create, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.create), errmsg) - + @staticmethod def stop(vmName): try: @@ -311,7 +311,7 @@ class OvmVm(OvmObject): except NoVmFoundException, e: logger.info(OvmVm.stop, "vm %s is already stopped"%vmName) return SUCC() - + logger.info(OvmVm.stop, "Stop vm %s"%vmName) try: vmPath = OvmHost()._vmNameToPath(vmName) @@ -327,7 +327,7 @@ class OvmVm(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVm.stop, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.stop), errmsg) - + @staticmethod def reboot(vmName): try: @@ -347,12 +347,12 @@ class OvmVm(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVm.reboot, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.reboot), errmsg) - + @staticmethod - def getDetails(vmName): + def getDetails(vmName): try: vm = OvmVm() - + try: OvmHost()._getDomainIdByName(vmName) vmPath = OvmHost()._vmNameToPath(vmName) @@ -360,8 +360,8 @@ class OvmVm(OvmObject): except NoVmFoundException, e: vmPath = OvmHost()._getVmPathFromPrimaryStorage(vmName) vifsFromConfig = True - - + + if not isdir(vmPath): # The case is, when vm starting was not completed at primaryStroageDownload or createVolume(e.g. mgmt server stop), the mgmt # server will keep vm state in staring, then a stop command will be sent. The stop command will delete bridges that vm attaches, @@ -373,7 +373,7 @@ class OvmVm(OvmObject): vm.vifs.extend(vm._getVifsFromConfig(vmPath)) else: vm.vifs.extend(vm._getVifs(vmName)) - + safeSetAttr(vm, 'name', vmName) disks = successToMap(xen_get_vdisks(vmPath))['vdisks'].split(',') rootDisk = None @@ -398,7 +398,7 @@ class OvmVm(OvmObject): safeSetAttr(vm, 'powerState', vmStatus['status']) vmType = successToMap(xen_get_vm_type(vmPath))['type'].replace('hvm', 'HVM').replace('para', 'PV') safeSetAttr(vm, 'type', vmType) - + rs = fromOvmVm(vm) logger.info(OvmVm.getDetails, rs) return rs @@ -406,7 +406,7 @@ class OvmVm(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVm.getDetails, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.getDetails), errmsg) - + @staticmethod def getVmStats(vmName): def getVcpuNumAndUtils(): @@ -421,7 +421,7 @@ class OvmVm(OvmObject): nvCpus = len(items) if nvCpus == 0: raise Exception("vm %s has 0 vcpus !!!"%vmName) - + xmInfo = successToMap(xen_get_xm_info()) nCpus = int(xmInfo['nr_cpus']) totalUtils = 0.0 @@ -432,8 +432,8 @@ class OvmVm(OvmObject): return (nvCpus, avgUtils) finally: session_logout() - - + + try: try: OvmHost()._getDomainIdByName(vmName) @@ -456,15 +456,15 @@ class OvmVm(OvmObject): avgUtils = 0 rxBytes = 0 txBytes = 0 - + rs = toGson({"cpuNum":nvcpus, "cpuUtil":avgUtils, "rxBytes":rxBytes, "txBytes":txBytes}) logger.debug(OvmVm.getVmStats, rs) - return rs + return rs except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmVm.getVmStats, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.getVmStats), errmsg) - + @staticmethod def migrate(vmName, targetHost): try: @@ -477,7 +477,7 @@ class OvmVm(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVm.migrate, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.migrate), errmsg) - + @staticmethod def register(vmName): try: @@ -492,7 +492,7 @@ class OvmVm(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVm.register, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.register), errmsg) - + @staticmethod def getVncPort(vmName): try: @@ -504,7 +504,7 @@ class OvmVm(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVm.getVncPort, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.getVncPort), errmsg) - + @staticmethod def detachOrAttachIso(vmName, iso, isAttach): try: @@ -514,11 +514,11 @@ class OvmVm(OvmObject): else: scope = 'cfg' vmPath = OvmHost()._getVmPathFromPrimaryStorage(vmName) - + vmType = OvmVm()._getVmTypeFromConfigFile(vmPath) if vmType != 'HVM': raise Exception("Only HVM supports attaching/detaching ISO") - + if not isAttach: iso = '' else: @@ -527,14 +527,14 @@ class OvmVm(OvmObject): isoOnSecStorage = dirname(iso) OvmStoragePool()._mount(isoOnSecStorage, isoMountPoint) iso = join(isoMountPoint, isoName) - + exceptionIfNoSuccess(xen_change_vm_cdrom(vmPath, iso, scope)) return SUCC() except Exception, e: errmsg = fmt_err_msg(e) logger.error(OvmVm.detachOrAttachIso, errmsg) raise XmlRpcFault(toErrCode(OvmVm, OvmVm.detachOrAttachIso), errmsg) - + if __name__ == "__main__": import sys print OvmVm.getDetails(sys.argv[1]) diff --git a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVolumeModule.py b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVolumeModule.py index eb99033bfe3..b1552767039 100755 --- a/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVolumeModule.py +++ b/plugins/hypervisors/ovm/src/main/scripts/vm/hypervisor/ovm/OvmVolumeModule.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -34,7 +34,7 @@ class OvmVolumeDecoder(json.JSONDecoder): setAttrFromDict(vol, 'size', deDict, long) setAttrFromDict(vol, 'poolUuid', deDict) return vol - + class OvmVolumeEncoder(json.JSONEncoder): def default(self, obj): if not isinstance(obj, OvmVolume): raise Exception("%s is not instance of OvmVolume"%type(obj)) @@ -45,7 +45,7 @@ class OvmVolumeEncoder(json.JSONEncoder): safeDictSet(obj, dct, 'path') safeDictSet(obj, dct, 'size') return dct - + def toOvmVolume(jStr): return json.loads(jStr, cls=OvmVolumeDecoder) @@ -58,7 +58,7 @@ class OvmVolume(OvmObject): poolUuid = '' path = '' size = 0 - + @staticmethod def createDataDisk(poolUuid, size, isRoot): try: @@ -75,7 +75,7 @@ class OvmVolume(OvmObject): freeSpace = pool._getSpaceinfoOfDir(path) if freeSpace < vol.size: raise Exception("%s has not enough space (available:%s, required:%s"%(path, freeSpace, vol.size)) - + vol.uuid = get_uuid() vol.name = vol.uuid + '.raw' filePath = join(path, vol.name) @@ -88,7 +88,7 @@ class OvmVolume(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVolume.createDataDisk, errmsg) raise XmlRpcFault(toErrCode(OvmVolume, OvmVolume.createDataDisk, errmsg)) - + @staticmethod def createFromTemplate(poolUuid, templateUrl): try: @@ -121,7 +121,7 @@ class OvmVolume(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVolume.createFromTemplate, errmsg) raise XmlRpcFault(toErrCode(OvmVolume, OvmVolume.createFromTemplate), errmsg) - + @staticmethod def destroy(poolUuid, path): try: @@ -148,12 +148,11 @@ class OvmVolume(OvmObject): errmsg = fmt_err_msg(e) logger.error(OvmVolume.destroy, errmsg) raise XmlRpcFault(toErrCode(OvmVolume, OvmVolume.destroy), errmsg) - - - + + + if __name__ == "__main__": print OvmVolume.detachOrAttachIso(sys.argv[1], '', False) - - - - \ No newline at end of file + + + diff --git a/plugins/network-elements/stratosphere-ssp/sspmock/sspmock.py b/plugins/network-elements/stratosphere-ssp/sspmock/sspmock.py index 9ac646e244e..7eb632b85fb 100644 --- a/plugins/network-elements/stratosphere-ssp/sspmock/sspmock.py +++ b/plugins/network-elements/stratosphere-ssp/sspmock/sspmock.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/python/bindir/cloud-external-ipallocator.py b/python/bindir/cloud-external-ipallocator.py index 1033b190703..2626e7fb1c9 100755 --- a/python/bindir/cloud-external-ipallocator.py +++ b/python/bindir/cloud-external-ipallocator.py @@ -6,9 +6,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 @@ -18,7 +18,7 @@ - + import web import socket, struct @@ -52,11 +52,11 @@ class dhcp: start_ip_num = self.ipToNum(dhcp_start); end_ip_num = self.ipToNum(dhcp_end) print(start_ip_num, end_ip_num) - + for ip in range(start_ip_num, end_ip_num + 1): - self.availIP.append(ip) - print(self.availIP[0], self.availIP[len(self.availIP) - 1]) - + self.availIP.append(ip) + print(self.availIP[0], self.availIP[len(self.availIP) - 1]) + #load the ip already allocated self.reloadAllocatedIP() @@ -69,7 +69,7 @@ class dhcp: def getFreeIP(self): if len(self.availIP) > 0: ip = self.numToIp(self.availIP[0]) - self.availIP.remove(self.availIP[0]) + self.availIP.remove(self.availIP[0]) return ip else: return None @@ -88,13 +88,13 @@ class dhcp: def reloadAllocatedIP(self): dhcp_hosts = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip().splitlines() - + for host in dhcp_hosts: if host.find("dhcp-host") != -1: allocatedIP = self.ipToNum(host.split("=")[1].strip().split(",")[1]) - if allocatedIP in self.availIP: + if allocatedIP in self.availIP: self.availIP.remove(allocatedIP) - + def allocateIP(self, mac): newIP = self.getFreeIP() dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip() @@ -112,7 +112,7 @@ class dhcp: for host in dhcp_host.splitlines(): if host.find(ip) != -1: path = host.split("=")[0].strip() - + if path == None: print("Can't find " + str(ip) + " in conf file") return None @@ -121,9 +121,9 @@ class dhcp: script = """rm %s save"""%(path) augtool < script - + self.availIP.remove(ip) - + #reset dnsmasq service("dnsmasq", "restart", stdout=None, stderr=None) @@ -145,7 +145,7 @@ class ipallocator: if not freeIP: return "0,0,0" print("Find an available IP: " + freeIP) - + return freeIP + "," + dhcpInit.getNetmask() + "," + dhcpInit.getRouter() elif command == "releaseIpAddr": ip = user_data.ip diff --git a/python/incubation/cloud-web-ipallocator.py b/python/incubation/cloud-web-ipallocator.py index 1033b190703..2626e7fb1c9 100755 --- a/python/incubation/cloud-web-ipallocator.py +++ b/python/incubation/cloud-web-ipallocator.py @@ -6,9 +6,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 @@ -18,7 +18,7 @@ - + import web import socket, struct @@ -52,11 +52,11 @@ class dhcp: start_ip_num = self.ipToNum(dhcp_start); end_ip_num = self.ipToNum(dhcp_end) print(start_ip_num, end_ip_num) - + for ip in range(start_ip_num, end_ip_num + 1): - self.availIP.append(ip) - print(self.availIP[0], self.availIP[len(self.availIP) - 1]) - + self.availIP.append(ip) + print(self.availIP[0], self.availIP[len(self.availIP) - 1]) + #load the ip already allocated self.reloadAllocatedIP() @@ -69,7 +69,7 @@ class dhcp: def getFreeIP(self): if len(self.availIP) > 0: ip = self.numToIp(self.availIP[0]) - self.availIP.remove(self.availIP[0]) + self.availIP.remove(self.availIP[0]) return ip else: return None @@ -88,13 +88,13 @@ class dhcp: def reloadAllocatedIP(self): dhcp_hosts = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip().splitlines() - + for host in dhcp_hosts: if host.find("dhcp-host") != -1: allocatedIP = self.ipToNum(host.split("=")[1].strip().split(",")[1]) - if allocatedIP in self.availIP: + if allocatedIP in self.availIP: self.availIP.remove(allocatedIP) - + def allocateIP(self, mac): newIP = self.getFreeIP() dhcp_host = augtool.match("/files/etc/dnsmasq.conf/dhcp-host").stdout.decode('utf-8').strip() @@ -112,7 +112,7 @@ class dhcp: for host in dhcp_host.splitlines(): if host.find(ip) != -1: path = host.split("=")[0].strip() - + if path == None: print("Can't find " + str(ip) + " in conf file") return None @@ -121,9 +121,9 @@ class dhcp: script = """rm %s save"""%(path) augtool < script - + self.availIP.remove(ip) - + #reset dnsmasq service("dnsmasq", "restart", stdout=None, stderr=None) @@ -145,7 +145,7 @@ class ipallocator: if not freeIP: return "0,0,0" print("Find an available IP: " + freeIP) - + return freeIP + "," + dhcpInit.getNetmask() + "," + dhcpInit.getRouter() elif command == "releaseIpAddr": ip = user_data.ip diff --git a/python/lib/cloudutils/__init__.py b/python/lib/cloudutils/__init__.py index 978b68af62a..13a83393a91 100644 --- a/python/lib/cloudutils/__init__.py +++ b/python/lib/cloudutils/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/python/lib/cloudutils/cloudException.py b/python/lib/cloudutils/cloudException.py index 9da29c23e00..5b2105b5060 100644 --- a/python/lib/cloudutils/cloudException.py +++ b/python/lib/cloudutils/cloudException.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -23,7 +23,7 @@ class CloudRuntimeException(Exception): value = sys.exc_info()[1] if value is not None: self.errMsg += ", due to:" + str(value) - + self.details = formatExceptionInfo() def __str__(self): return self.errMsg diff --git a/python/lib/cloudutils/configFileOps.py b/python/lib/cloudutils/configFileOps.py index ecc437d8274..698f2b31a3a 100644 --- a/python/lib/cloudutils/configFileOps.py +++ b/python/lib/cloudutils/configFileOps.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -27,7 +27,7 @@ class configFileOps: self.op = op self.separator = separator def setState(self, state): - self.state = state + self.state = state def getState(self): return self.state @@ -35,18 +35,18 @@ class configFileOps: self.fileName = fileName self.entries = [] self.backups = [] - + if cfg is not None: cfg.cfoHandlers.append(self) def addEntry(self, name, value, separator="="): e = self.entry(name, value, "add", separator) self.entries.append(e) - + def rmEntry(self, name, value, separator="="): entry = self.entry(name, value, "rm", separator) self.entries.append(entry) - + def getEntry(self, name, separator="="): try: ctx = open(self.fileName).read(-1) @@ -74,7 +74,7 @@ class configFileOps: matchString = "^\ *" + entry.name + "\ *=\ *" + entry.value else: matchString = "^\ *" + entry.name + "\ *" + entry.value - + match = re.match(matchString, line) if match is not None: if entry.op == "add" and entry.separator == "=": @@ -88,9 +88,9 @@ class configFileOps: entry.setState("set") self.backups.append([line, None]) matched = True - break - - if not matched: + break + + if not matched: newLines.append(line) for entry in self.entries: @@ -102,7 +102,7 @@ class configFileOps: entry.setState("set") fp.close() - + open(self.fileName, "w").writelines(newLines) def replace_line(self, startswith,stanza,always_add=False): @@ -126,18 +126,18 @@ class configFileOps: return self.replace_line(startswith,stanza,always_add=True) def add_lines(self, lines, addToBackup=True): - fp = open(self.fileName).read(-1) + fp = open(self.fileName).read(-1) sh = re.escape(lines) - match = re.search(sh, fp, re.MULTILINE) + match = re.search(sh, fp, re.MULTILINE) if match is not None: return - + fp += lines open(self.fileName, "w").write(fp) self.backups.append([None, lines]) - + def replace_lines(self, src, dst, addToBackup=True): - fp = open(self.fileName).read(-1) + fp = open(self.fileName).read(-1) sh = re.escape(src) if dst is None: dst = "" @@ -168,7 +168,7 @@ class configFileOps: newlines.append(line) open(self.fileName, "w").writelines(newlines) - + def backup(self): for oldLine, newLine in self.backups: if newLine is None: diff --git a/python/lib/cloudutils/networkConfig.py b/python/lib/cloudutils/networkConfig.py index 5a357c05df6..6a18b28ddff 100644 --- a/python/lib/cloudutils/networkConfig.py +++ b/python/lib/cloudutils/networkConfig.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -32,16 +32,16 @@ class networkConfig: self.type = type self.name = name #dhcp or static - self.method = None - + self.method = None + @staticmethod def listNetworks(): - devs = os.listdir("/sys/class/net/") - devs = list(filter(networkConfig.isBridge, devs)) + devs = os.listdir("/sys/class/net/") + devs = list(filter(networkConfig.isBridge, devs)) return devs @staticmethod def getDefaultNetwork(): - cmd = bash("route -n|awk \'/^0.0.0.0/ {print $2,$8}\'") + cmd = bash("route -n|awk \'/^0.0.0.0/ {print $2,$8}\'") if not cmd.isSuccess(): logging.debug("Failed to get default route") raise CloudRuntimeException("Failed to get default route") @@ -67,7 +67,7 @@ class networkConfig: cmds = "" if not networkConfig.isBridge(brName): cmds = "ip link add name %s type bridge ;"%brName - + cmds += "ifconfig %s up;"%brName cmds += "ip link set dev %s master %s"%(dev, brName) return bash(cmds).isSuccess() @@ -75,10 +75,10 @@ class networkConfig: @staticmethod def isBridgeEnslavedWithDevices(brName): if not networkConfig.isBridge(brName): - return False + return False if not os.listdir("/sys/class/net/%s/brif"%brName): - return False + return False return True @@ -96,7 +96,7 @@ class networkConfig: @staticmethod def isBridgePort(devName): return os.path.exists("/sys/class/net/%s/brport" % devName) - + @staticmethod def isBridge(devName): return os.path.exists("/sys/class/net/%s/bridge" % devName) @@ -116,7 +116,7 @@ class networkConfig: bridgeName = None if os.path.exists("/sys/class/net/%s/brport/bridge"%devName): realPath = os.path.realpath("/sys/class/net/%s/brport/bridge"%devName) - bridgeName = realPath.split("/")[-1] + bridgeName = realPath.split("/")[-1] return bridgeName @staticmethod @@ -130,7 +130,7 @@ class networkConfig: return dev return None - + @staticmethod def getDevInfo(dev): if not networkConfig.isNetworkDev(dev): diff --git a/scripts/network/exdhcp/dhcpd_edithosts.py b/scripts/network/exdhcp/dhcpd_edithosts.py index ec64f808fbb..97bccd81d33 100644 --- a/scripts/network/exdhcp/dhcpd_edithosts.py +++ b/scripts/network/exdhcp/dhcpd_edithosts.py @@ -6,9 +6,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 @@ -38,7 +38,7 @@ def lock(): if count > sleep_max: print "Can not get file lock at %s, time expired" % file_lock return False - + try: f = open(file_lock, "w") f.close() @@ -104,7 +104,7 @@ if __name__ == "__main__": if len(sys.argv) < 7: print usage sys.exit(1) - + mac = sys.argv[1] ip = sys.argv[2] hostname = sys.argv[3] diff --git a/scripts/network/ping/baremetal_user_data.py b/scripts/network/ping/baremetal_user_data.py index 24391f7991b..5a189353467 100755 --- a/scripts/network/ping/baremetal_user_data.py +++ b/scripts/network/ping/baremetal_user_data.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -41,12 +41,12 @@ def writeIfNotHere(fileName, texts): if not t in entries: entries.append(t) need = True - - if need: + + if need: f = open(fileName, 'w') f.write(''.join(entries)) f.close() - + def createRedirectEntry(vmIp, folder, filename): entry = "RewriteRule ^%s$ ../%s/%%{REMOTE_ADDR}/%s [L,NC,QSA]" % (filename, folder, filename) htaccessFolder="/var/www/html/latest" @@ -54,7 +54,7 @@ def createRedirectEntry(vmIp, folder, filename): if not os.path.exists(htaccessFolder): os.makedirs(htaccessFolder) writeIfNotHere(htaccessFile, ["Options +FollowSymLinks", "RewriteEngine On", entry]) - + htaccessFolder = os.path.join("/var/www/html/", folder, vmIp) if not os.path.exists(htaccessFolder): os.makedirs(htaccessFolder) @@ -63,23 +63,23 @@ def createRedirectEntry(vmIp, folder, filename): f = open(htaccessFile, 'w') f.write(entry) f.close() - + if folder in ['metadata', 'meta-data']: entry1="RewriteRule ^meta-data/(.+)$ ../%s/%%{REMOTE_ADDR}/$1 [L,NC,QSA]" % folder htaccessFolder="/var/www/html/latest" htaccessFile=os.path.join(htaccessFolder, ".htaccess") entry2="RewriteRule ^meta-data/$ ../%s/%%{REMOTE_ADDR}/meta-data [L,NC,QSA]" % folder writeIfNotHere(htaccessFile, [entry1, entry2]) - + def addUserData(vmIp, folder, fileName, contents): - + baseFolder = os.path.join(HTML_ROOT, folder, vmIp) if not os.path.exists(baseFolder): os.makedirs(baseFolder) - + createRedirectEntry(vmIp, folder, fileName) - + datafileName = os.path.join(HTML_ROOT, folder, vmIp, fileName) metaManifest = os.path.join(HTML_ROOT, folder, vmIp, "meta-data") if folder == "userdata": @@ -87,11 +87,11 @@ def addUserData(vmIp, folder, fileName, contents): contents = base64.urlsafe_b64decode(contents) else: contents = "" - + f = open(datafileName, 'w') - f.write(contents) + f.write(contents) f.close() - + if folder == "metadata" or folder == "meta-data": writeIfNotHere(metaManifest, [fileName]) @@ -101,4 +101,4 @@ if __name__ == '__main__': for entry in allEntires: (vmIp, folder, fileName, contents) = entry.split(',', 3) addUserData(vmIp, folder, fileName, contents) - sys.exit(0) + sys.exit(0) diff --git a/scripts/network/ping/prepare_kickstart_bootfile.py b/scripts/network/ping/prepare_kickstart_bootfile.py index 4378293b43a..27baecef025 100755 --- a/scripts/network/ping/prepare_kickstart_bootfile.py +++ b/scripts/network/ping/prepare_kickstart_bootfile.py @@ -9,12 +9,12 @@ # WITHOUT 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 - + # Usage: prepare_tftp_bootfile.py tftp_dir mac cifs_server share directory image_to_restore cifs_username cifs_password import os, sys @@ -28,7 +28,7 @@ TIMEOUT 26 DISPLAY boot.msg LABEL default KERNEL %s -APPEND ramdisk_size=66000 initrd=%s ksdevice=%s ks=%s +APPEND ramdisk_size=66000 initrd=%s ksdevice=%s ks=%s ''' fmt2 = '''DEFAULT default PROMPT 1 @@ -73,6 +73,6 @@ if __name__ == "__main__": exit(1) (tftp_dir, mac, kernel, initrd, ks_file, ks_device) = sys.argv[1:] - + ret = prepare() exit(ret) diff --git a/scripts/network/ping/prepare_kickstart_kernel_initrd.py b/scripts/network/ping/prepare_kickstart_kernel_initrd.py index ff618480e69..116d179e5e5 100755 --- a/scripts/network/ping/prepare_kickstart_kernel_initrd.py +++ b/scripts/network/ping/prepare_kickstart_kernel_initrd.py @@ -6,9 +6,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 @@ -29,7 +29,7 @@ def cmd(cmdstr, err=True): print cmdstr if os.system(cmdstr) != 0 and err: raise Exception("Failed to run shell command: %s" % cmdstr) - + def prepare(): global kernel, initrd, copy_to try: @@ -64,12 +64,12 @@ def prepare(): except Exception, e: print e return 1 - + if __name__ == "__main__": if len(sys.argv) < 4: print "Usage: prepare_kickstart_kerneal_initrd.py path_to_kernel path_to_initrd path_kernel_initrd_copy_to" sys.exit(1) - + (kernel, initrd, copy_to) = sys.argv[1:] sys.exit(prepare()) - + diff --git a/scripts/network/ping/prepare_tftp_bootfile.py b/scripts/network/ping/prepare_tftp_bootfile.py index fe9bd9bf821..00d8bb0ccbc 100644 --- a/scripts/network/ping/prepare_tftp_bootfile.py +++ b/scripts/network/ping/prepare_tftp_bootfile.py @@ -6,9 +6,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 @@ -83,7 +83,7 @@ if __name__ == "__main__": exit(1) (cmd, tftp_dir, mac, cifs_server, share, directory, template_dir, cifs_username, cifs_password, ip, netmask, gateway) = sys.argv[1:] - + if cmd == "restore": ret = prepare(True) elif cmd == "backup": @@ -91,5 +91,5 @@ if __name__ == "__main__": else: print "Unknown cmd: %s"%cmd ret = 1 - + exit(ret) diff --git a/scripts/util/ipmi.py b/scripts/util/ipmi.py index c9e9a66d4f8..2b5c36c06f9 100755 --- a/scripts/util/ipmi.py +++ b/scripts/util/ipmi.py @@ -6,9 +6,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,7 +16,7 @@ # specific language governing permissions and limitations # under the License. - + import sys, os, subprocess, errno, re @@ -72,7 +72,7 @@ class Command: else: return l def __str__(self): return ''%self.__get_recursive_name(sep=" ") - + def __repr__(self): return self.__str__() @@ -134,13 +134,13 @@ def reboot(args): if o.ret: print o.stderr return 1 - + if "is on" in o.stdout: o = ipmitool("-H", hostname, "-U", usrname, "-P", password, "chassis", "power", "cycle") else: o = ipmitool("-H", hostname, "-U", usrname, "-P", password, "chassis", "power", "reset") - + if o.ret: print o.stderr return 1 @@ -172,7 +172,7 @@ def boot_or_reboot(args): if o.ret: print o.stderr return 1 - + if "is on" in o.stdout: return reboot(args) elif "is off" in o.stdout: @@ -181,7 +181,7 @@ def boot_or_reboot(args): else: print "unknown power status:" + o.stdout return 1 - + call_table = {"ping":ping, "boot_dev":boot_dev, "reboot":reboot, "power":power, "boot_or_reboot":boot_or_reboot} def dispatch(args): diff --git a/scripts/util/macgen.py b/scripts/util/macgen.py index 55a45c95a32..ab3c7776be3 100755 --- a/scripts/util/macgen.py +++ b/scripts/util/macgen.py @@ -6,9 +6,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -16,7 +16,7 @@ # specific language governing permissions and limitations # under the License. - + # $Id: macgen.py 9132 2010-06-04 20:17:43Z manuel $ $HeadURL: svn://svn.lab.vmops.com/repos/vmdev/java/scripts/util/macgen.py $ # macgen.py script to generate a MAC address for Red Hat Virtualization guests diff --git a/scripts/vm/hypervisor/vmware/discover_networks.py b/scripts/vm/hypervisor/vmware/discover_networks.py index 0a401e11c91..8f58feed137 100755 --- a/scripts/vm/hypervisor/vmware/discover_networks.py +++ b/scripts/vm/hypervisor/vmware/discover_networks.py @@ -47,14 +47,14 @@ def get_clusters(content, cluster=None): clusters.append(c) hosts = c.host for host in hosts: - hostClusterNameDict[host.name] = c.name + hostClusterNameDict[host.name] = c.name break else: for c in cluster_view.view: clusters.append(c) hosts = c.host for host in hosts: - hostClusterNameDict[host.name] = c.name + hostClusterNameDict[host.name] = c.name cluster_view.Destroy() log_message('\t{} cluster(s) found'.format(len(clusters))) for c in clusters: @@ -187,7 +187,7 @@ def add_network(portGroup, vlanId, isolatedPvlanType, isolatedPvlan, vSwitch, vm cluster = hostClusterNameDict[host] except KeyError: cluster = vmClusterName - + network = {"portgroup": portGroup, "cluster": cluster, "host": host, "switch": vSwitch, "virtualmachines": vms} if vlanId != '': network["vlanid"] = vlanId @@ -267,7 +267,7 @@ def main(): content = serviceInstance.RetrieveContent() if args.cluster: clusters = get_clusters(content, args.cluster) - else: + else: clusters = get_clusters(content) hosts = [] if len(clusters) > 0: diff --git a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py index 926c5c8de8e..1b3a58cca35 100644 --- a/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py +++ b/scripts/vm/hypervisor/xenserver/cloudstack_pluginlib.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/scripts/vm/hypervisor/xenserver/mockxcpplugin.py b/scripts/vm/hypervisor/xenserver/mockxcpplugin.py index 0de24ca956b..f7c84371c49 100644 --- a/scripts/vm/hypervisor/xenserver/mockxcpplugin.py +++ b/scripts/vm/hypervisor/xenserver/mockxcpplugin.py @@ -6,9 +6,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 diff --git a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py index 62601bf187e..b3d3917642e 100644 --- a/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py +++ b/scripts/vm/hypervisor/xenserver/ovs-vif-flows.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -86,7 +86,7 @@ def main(command, vif_raw): return bridge = pluginlib.do_cmd([pluginlib.VSCTL_PATH, 'iface-to-br', this_vif]) - + # find xs network for this bridge, verify is used for ovs tunnel network xs_nw_uuid = pluginlib.do_cmd([pluginlib.XE_PATH, "network-list", "bridge=%s" % bridge, "--minimal"]) diff --git a/scripts/vm/hypervisor/xenserver/perfmon.py b/scripts/vm/hypervisor/xenserver/perfmon.py index eb14e32aa54..e4b0101a520 100755 --- a/scripts/vm/hypervisor/xenserver/perfmon.py +++ b/scripts/vm/hypervisor/xenserver/perfmon.py @@ -6,9 +6,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 @@ -87,7 +87,7 @@ class RRDUpdates: return result def get_vm_data(self, uuid, param, row): - #pp = pprint.PrettyPrinter(indent=4) + #pp = pprint.PrettyPrinter(indent=4) #pp.pprint(self.vm_reports) report = self.vm_reports[uuid] col = report[param] diff --git a/scripts/vm/hypervisor/xenserver/xcposs/NFSSR.py b/scripts/vm/hypervisor/xenserver/xcposs/NFSSR.py index 627fed24043..306f9416616 100644 --- a/scripts/vm/hypervisor/xenserver/xcposs/NFSSR.py +++ b/scripts/vm/hypervisor/xenserver/xcposs/NFSSR.py @@ -6,9 +6,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 @@ -36,7 +36,7 @@ CAPABILITIES = ["SR_PROBE","SR_UPDATE", "SR_CACHING", \ CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' ], \ [ 'serverpath', 'path on remote server (required)' ] ] - + DRIVER_INFO = { 'name': 'NFS VHD', 'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', @@ -123,7 +123,7 @@ class NFSSR(FileSR.FileSR): def probe(self): # Verify NFS target and port util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - + self.validate_remotepath(True) self.check_server() @@ -155,7 +155,7 @@ class NFSSR(FileSR.FileSR): raise xs_errors.XenError('NFSUnMount', opterr=exc.errstr) return super(NFSSR, self).detach(sr_uuid) - + def create(self, sr_uuid, size): util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') @@ -186,8 +186,8 @@ class NFSSR(FileSR.FileSR): # except util.CommandException, inst: # if inst.code != errno.EEXIST: # self.detach(sr_uuid) - # raise xs_errors.XenError('NFSCreate', - # opterr='remote directory creation error is %d' + # raise xs_errors.XenError('NFSCreate', + # opterr='remote directory creation error is %d' # % inst.code) self.detach(sr_uuid) @@ -216,7 +216,7 @@ class NFSSR(FileSR.FileSR): if not loadLocked: return NFSFileVDI(self, uuid) return NFSFileVDI(self, uuid) - + def _checkmount(self): return util.ioretry(lambda: util.pathexists(self.path)) \ and util.ioretry(lambda: util.ismount(self.path)) diff --git a/scripts/vm/hypervisor/xenserver/xcpserver/NFSSR.py b/scripts/vm/hypervisor/xenserver/xcpserver/NFSSR.py index 11f0491572e..62031e3708a 100755 --- a/scripts/vm/hypervisor/xenserver/xcpserver/NFSSR.py +++ b/scripts/vm/hypervisor/xenserver/xcpserver/NFSSR.py @@ -6,9 +6,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 @@ -36,7 +36,7 @@ CAPABILITIES = ["SR_PROBE","SR_UPDATE", "SR_CACHING", \ CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' ], \ [ 'serverpath', 'path on remote server (required)' ] ] - + DRIVER_INFO = { 'name': 'NFS VHD', 'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', @@ -123,7 +123,7 @@ class NFSSR(FileSR.FileSR): def probe(self): # Verify NFS target and port util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - + self.validate_remotepath(True) self.check_server() @@ -155,7 +155,7 @@ class NFSSR(FileSR.FileSR): raise xs_errors.XenError('NFSUnMount', opterr=exc.errstr) return super(NFSSR, self).detach(sr_uuid) - + def create(self, sr_uuid, size): util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') @@ -186,8 +186,8 @@ class NFSSR(FileSR.FileSR): # except util.CommandException, inst: # if inst.code != errno.EEXIST: # self.detach(sr_uuid) - # raise xs_errors.XenError('NFSCreate', - # opterr='remote directory creation error is %d' + # raise xs_errors.XenError('NFSCreate', + # opterr='remote directory creation error is %d' # % inst.code) self.detach(sr_uuid) @@ -216,7 +216,7 @@ class NFSSR(FileSR.FileSR): if not loadLocked: return NFSFileVDI(self, uuid) return NFSFileVDI(self, uuid) - + def _checkmount(self): return util.ioretry(lambda: util.pathexists(self.path)) \ and util.ioretry(lambda: util.ismount(self.path)) diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/InterfaceReconfigure.py b/scripts/vm/hypervisor/xenserver/xenserver56/InterfaceReconfigure.py index 3723ef2d5fb..2807f706ff5 100755 --- a/scripts/vm/hypervisor/xenserver/xenserver56/InterfaceReconfigure.py +++ b/scripts/vm/hypervisor/xenserver/xenserver56/InterfaceReconfigure.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -339,12 +339,12 @@ def db_init_from_cache(cache): global _db assert(_db is None) _db = DatabaseCache(cache_file=cache) - + def db_init_from_xenapi(session): - global _db + global _db assert(_db is None) _db = DatabaseCache(session_ref=session) - + class DatabaseCache(object): def __read_xensource_inventory(self): filename = root_prefix() + "/etc/xensource-inventory" @@ -626,7 +626,7 @@ def ethtool_settings(oc): # {VIF,PIF,Network}.other-config:mtu. # # type parameter is a string describing the object that the oc parameter -# is from. e.g. "PIF", "Network" +# is from. e.g. "PIF", "Network" def mtu_setting(nw, type, oc): mtu = None @@ -635,7 +635,7 @@ def mtu_setting(nw, type, oc): mtu = nwrec['MTU'] else: mtu = "1500" - + if oc.has_key('mtu'): log("Override Network.MTU setting on bridge %s from %s.MTU is %s" % \ (nwrec['bridge'], type, mtu)) @@ -796,7 +796,7 @@ class Datapath(object): datapath for a given PIF. Does not include configuration of the IP address on the ipdev. """ - + def __init__(self, pif): self._pif = pif @@ -804,7 +804,7 @@ class Datapath(object): """Write ifcfg TYPE field for an IPdev, plus any type specific fields to cfg """ - raise NotImplementedError + raise NotImplementedError def preconfigure(self, parent): """Prepare datapath configuration for PIF, but do not actually @@ -813,7 +813,7 @@ class Datapath(object): Any configuration files should be attached to parent. """ raise NotImplementedError - + def bring_down_existing(self): """Tear down any existing network device configuration which needs to be undone in order to bring this PIF up. @@ -831,7 +831,7 @@ class Datapath(object): Should not bring up the IPdev. """ raise NotImplementedError - + def post(self): """Called after the IPdev has been brought up. @@ -846,17 +846,17 @@ class Datapath(object): IPdev has already been brought down. """ raise NotImplementedError - + def DatapathFactory(pif): # XXX Need a datapath object for bridgeless PIFs try: network_conf = open(root_prefix() + "/etc/xensource/network.conf", 'r') network_backend = network_conf.readline().strip() - network_conf.close() + network_conf.close() except Exception, e: raise Error("failed to determine network backend:" + e) - + if network_backend == "bridge": from InterfaceReconfigureBridge import DatapathBridge return DatapathBridge(pif) diff --git a/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py b/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py index a9cd58d9ca6..b8489e7b766 100755 --- a/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py +++ b/scripts/vm/hypervisor/xenserver/xenserver56/NFSSR.py @@ -6,9 +6,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 @@ -36,7 +36,7 @@ CAPABILITIES = ["SR_PROBE","SR_UPDATE", \ CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' ], \ [ 'serverpath', 'path on remote server (required)' ] ] - + DRIVER_INFO = { 'name': 'NFS VHD', 'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', @@ -124,7 +124,7 @@ class NFSSR(FileSR.FileSR): def probe(self): # Verify NFS target and port util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - + self.validate_remotepath(True) self.check_server() @@ -157,7 +157,7 @@ class NFSSR(FileSR.FileSR): raise xs_errors.XenError('NFSUnMount', opterr=exc.errstr) return super(NFSSR, self).detach(sr_uuid) - + @FileSR.locking("SRUnavailable") def create(self, sr_uuid, size): @@ -189,8 +189,8 @@ class NFSSR(FileSR.FileSR): # except util.CommandException, inst: # if inst.code != errno.EEXIST: # self.detach(sr_uuid) - # raise xs_errors.XenError('NFSCreate', - # opterr='remote directory creation error is %d' + # raise xs_errors.XenError('NFSCreate', + # opterr='remote directory creation error is %d' # % inst.code) self.detach(sr_uuid) @@ -220,7 +220,7 @@ class NFSSR(FileSR.FileSR): if not loadLocked: return NFSFileVDINolock(self, uuid) return NFSFileVDI(self, uuid) - + def _checkmount(self): return util.ioretry(lambda: util.pathexists(self.path)) \ and util.ioretry(lambda: util.ismount(self.path)) diff --git a/scripts/vm/hypervisor/xenserver/xenserver56fp1/NFSSR.py b/scripts/vm/hypervisor/xenserver/xenserver56fp1/NFSSR.py index 290c587aac4..b8c115745af 100755 --- a/scripts/vm/hypervisor/xenserver/xenserver56fp1/NFSSR.py +++ b/scripts/vm/hypervisor/xenserver/xenserver56fp1/NFSSR.py @@ -6,9 +6,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 @@ -37,7 +37,7 @@ CAPABILITIES = ["SR_PROBE","SR_UPDATE", "SR_CACHING", \ CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' ], \ [ 'serverpath', 'path on remote server (required)' ] ] - + DRIVER_INFO = { 'name': 'NFS VHD', 'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', @@ -124,7 +124,7 @@ class NFSSR(FileSR.FileSR): def probe(self): # Verify NFS target and port util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - + self.validate_remotepath(True) self.check_server() @@ -156,7 +156,7 @@ class NFSSR(FileSR.FileSR): raise xs_errors.XenError('NFSUnMount', opterr=exc.errstr) return super(NFSSR, self).detach(sr_uuid) - + def create(self, sr_uuid, size): util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') @@ -187,8 +187,8 @@ class NFSSR(FileSR.FileSR): # except util.CommandException, inst: # if inst.code != errno.EEXIST: # self.detach(sr_uuid) - # raise xs_errors.XenError('NFSCreate', - # opterr='remote directory creation error is %d' + # raise xs_errors.XenError('NFSCreate', + # opterr='remote directory creation error is %d' # % inst.code) self.detach(sr_uuid) @@ -217,7 +217,7 @@ class NFSSR(FileSR.FileSR): if not loadLocked: return NFSFileVDI(self, uuid) return NFSFileVDI(self, uuid) - + def _checkmount(self): return util.ioretry(lambda: util.pathexists(self.path)) \ and util.ioretry(lambda: util.ismount(self.path)) diff --git a/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py b/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py index 0d6badb4098..9a3fa8bc9a1 100755 --- a/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py +++ b/scripts/vm/hypervisor/xenserver/xenserver60/NFSSR.py @@ -6,9 +6,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 @@ -38,7 +38,7 @@ CAPABILITIES = ["SR_PROBE","SR_UPDATE", "SR_CACHING", CONFIGURATION = [ [ 'server', 'hostname or IP address of NFS server (required)' ], \ [ 'serverpath', 'path on remote server (required)' ] ] - + DRIVER_INFO = { 'name': 'NFS VHD', 'description': 'SR plugin which stores disks as VHD files on a remote NFS filesystem', @@ -129,7 +129,7 @@ class NFSSR(FileSR.FileSR): def probe(self): # Verify NFS target and port util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') - + self.validate_remotepath(True) self.check_server() @@ -161,7 +161,7 @@ class NFSSR(FileSR.FileSR): raise xs_errors.XenError('NFSUnMount', opterr=exc.errstr) return super(NFSSR, self).detach(sr_uuid) - + def create(self, sr_uuid, size): util._testHost(self.dconf['server'], NFSPORT, 'NFSTarget') @@ -192,8 +192,8 @@ class NFSSR(FileSR.FileSR): # except util.CommandException, inst: # if inst.code != errno.EEXIST: # self.detach(sr_uuid) - # raise xs_errors.XenError('NFSCreate', - # opterr='remote directory creation error is %d' + # raise xs_errors.XenError('NFSCreate', + # opterr='remote directory creation error is %d' # % inst.code) self.detach(sr_uuid) @@ -222,7 +222,7 @@ class NFSSR(FileSR.FileSR): if not loadLocked: return NFSFileVDI(self, uuid) return NFSFileVDI(self, uuid) - + def _checkmount(self): return util.ioretry(lambda: util.pathexists(self.path)) \ and util.ioretry(lambda: util.ismount(self.path)) diff --git a/scripts/vm/network/vnet/cloudstack_pluginlib.py b/scripts/vm/network/vnet/cloudstack_pluginlib.py index 8d036fbebc2..e5022ae9781 100755 --- a/scripts/vm/network/vnet/cloudstack_pluginlib.py +++ b/scripts/vm/network/vnet/cloudstack_pluginlib.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/scripts/vm/network/vnet/ovstunnel.py b/scripts/vm/network/vnet/ovstunnel.py index ebb72158957..92e2f621446 100755 --- a/scripts/vm/network/vnet/ovstunnel.py +++ b/scripts/vm/network/vnet/ovstunnel.py @@ -6,9 +6,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 diff --git a/test/integration/__init__.py b/test/integration/__init__.py index 978b68af62a..13a83393a91 100644 --- a/test/integration/__init__.py +++ b/test/integration/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/broken/maint/test_escalation_templates.py b/test/integration/broken/maint/test_escalation_templates.py index 1d0824a3283..63898e8bc82 100644 --- a/test/integration/broken/maint/test_escalation_templates.py +++ b/test/integration/broken/maint/test_escalation_templates.py @@ -108,8 +108,8 @@ class TestlistTemplates(cloudstackTestCase): name,value ) self.RestartServers() time.sleep(self.testdata["sleep"]) - - + + @attr(tags=["advanced", "basic"], required_hardware="true") def test_01_CS40139_listtemplate_with_different_pagesize(self): """ @@ -135,7 +135,7 @@ class TestlistTemplates(cloudstackTestCase): domainid=self.domain.id, max=1000 ) - + for i in range(0, 850): template_created = Template.register( self.apiclient, @@ -219,7 +219,7 @@ class TestlistTemplates(cloudstackTestCase): """ self.updateConfigurAndRestart("allow.public.user.templates", "false") - + user_account = Account.create( self.apiclient, self.testdata["account2"], diff --git a/test/integration/broken/maint/test_vpc_host_maintenance.py b/test/integration/broken/maint/test_vpc_host_maintenance.py index 37dc950c1ab..5d1f3e83691 100644 --- a/test/integration/broken/maint/test_vpc_host_maintenance.py +++ b/test/integration/broken/maint/test_vpc_host_maintenance.py @@ -456,7 +456,7 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): Host.update(self.apiclient, id=self.hosts[0].id, hosttags="hosttag1,hosttag2") Host.update(self.apiclient, id=self.hosts[1].id, hosttags="hosttag1,hosttag2") - + self.validate_vm_deployment() self.debug("Stop the host on which the VPC virtual router is running") try: @@ -477,11 +477,11 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): True, "List routers shall return a valid VPCVR for account" ) - + router = routers[0] - + try: - + timeout = self.services["timeout"] self.debug("Timeout Value %d : " % timeout) while True: @@ -490,7 +490,7 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): id = router.id, state = "Running" ) - + if list_router_response is not None: break elif timeout == 0: @@ -499,12 +499,12 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): time.sleep(self.services["sleep"]) timeout = timeout - 1 self.debug("Waiting for %d seconds - %d tries left" % (self.services["sleep"],timeout)) - + self.debug("Verified that the Router is in Running State") - + except Exception as e: self.fail("Failed to find the Router in Running state %s " % e) - + vms = VirtualMachine.list( self.apiclient, account=self.account.name, @@ -537,7 +537,7 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): # 1. Successfully cancel the Maintenance mode on the host. # 2. Migrate the VMs back successfully onto the host. # 3. Check that the network connectivity exists with the migrated VMs. - + try: timeout = self.services["timeout"] while True: @@ -545,7 +545,7 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): self.apiclient, id=self.vpcvr.hostid, resourcestate="Maintenance") - + if list_host_response is not None: break elif timeout == 0: @@ -553,9 +553,9 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): time.sleep(self.services["sleep"]) timeout = timeout - 1 - + self.debug("Verified that the Host is in Maintenance State") - + except: self.fail("Failed to find the Host in maintenance state") @@ -569,7 +569,7 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): self.apiclient, id=self.vpcvr.hostid, state="Up") - + if list_host_response is not None: break elif timeout == 0: @@ -577,9 +577,9 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): time.sleep(self.services["sleep"]) timeout = timeout - 1 - + self.debug("Verified that the Host is in Up State after Canceling Maintenance Mode") - + except Exception as e: self.fail("Failed to cancel maintenance mode on host: %s" % e) @@ -626,13 +626,13 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): # effected due to reconnection. try: - timeout = self.services["timeout"] + timeout = self.services["timeout"] while True: list_host_response = Host.list( self.apiclient, id=self.vpcvr.hostid, resourcestate="Enabled") - + if list_host_response is not None: break elif timeout == 0: @@ -640,9 +640,9 @@ class TestVMLifeCycleHostmaintenance(cloudstackTestCase): time.sleep(self.services["sleep"]) timeout = timeout - 1 - + self.debug("Verified that the Host is in Up State") - + except: self.fail("Failed to find the Host in Up State") diff --git a/test/integration/broken/misc/test_vm_sync.py b/test/integration/broken/misc/test_vm_sync.py index 6f2f4e99dad..c26127d3219 100644 --- a/test/integration/broken/misc/test_vm_sync.py +++ b/test/integration/broken/misc/test_vm_sync.py @@ -137,7 +137,7 @@ class TestDeployVMSync(cloudstackTestCase): list_vms = VirtualMachine.list(self.apiclient, ids=[self.vm1.id, self.vm2.id, self.vm3.id], listAll=True) self.assertTrue(isinstance(list_vms, list) and len(list_vms) == 3, msg = "List VM response is empty") - for vm in list_vms: + for vm in list_vms: if vm.id == self.vm1.id: self.assertTrue(vm.state == "Running", msg = "VM {0} is expected to be in running state".format(vm.name)) elif vm.id == self.vm2.id or vm.id == self.vm3.id: diff --git a/test/integration/broken/test_vpn_service.py b/test/integration/broken/test_vpn_service.py index b5b886d7c74..7d6c21e07a5 100644 --- a/test/integration/broken/test_vpn_service.py +++ b/test/integration/broken/test_vpn_service.py @@ -201,7 +201,7 @@ class TestVPNService(cloudstackTestCase): # IP by using ike-scan self.create_VPN(self.public_ip) - + cmd = ['ike-scan', self.public_ip, '-s', '4534'] # Random port stdout = subprocess.check_output(cmd) diff --git a/test/integration/component/__init__.py b/test/integration/component/__init__.py index 978b68af62a..13a83393a91 100644 --- a/test/integration/component/__init__.py +++ b/test/integration/component/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/component/maint/test_egress_rules_host_maintenance.py b/test/integration/component/maint/test_egress_rules_host_maintenance.py index 5018a14b1cf..40a3913642f 100644 --- a/test/integration/component/maint/test_egress_rules_host_maintenance.py +++ b/test/integration/component/maint/test_egress_rules_host_maintenance.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/component/maint/test_ip_resource_count_for_vpc.py b/test/integration/component/maint/test_ip_resource_count_for_vpc.py index 3557931ee4c..a7dfa25d313 100644 --- a/test/integration/component/maint/test_ip_resource_count_for_vpc.py +++ b/test/integration/component/maint/test_ip_resource_count_for_vpc.py @@ -125,7 +125,7 @@ class Services: # Max networks allowed as per hypervisor # Xenserver -> 5, VMWare -> 9 }, - + "virtual_machine": { "displayname": "Test VM", "username": "root", diff --git a/test/integration/component/maint/testpath_vMotion_vmware.py b/test/integration/component/maint/testpath_vMotion_vmware.py index 4768319d1f6..834f6b9aeab 100644 --- a/test/integration/component/maint/testpath_vMotion_vmware.py +++ b/test/integration/component/maint/testpath_vMotion_vmware.py @@ -2488,7 +2488,7 @@ class TestStorageLiveMigrationVmware(cloudstackTestCase): """ 4. Deploy a windows VM, set vmware.vcenter.session.timeout to a low value - and do migration, migration should fail + and do migration, migration should fail """ vm = "virtual_machine3" @@ -2498,7 +2498,7 @@ class TestStorageLiveMigrationVmware(cloudstackTestCase): # list cluster for that host vm_cluster = list_clusters(self.apiclient, id=vm_host.clusterid, listall=True)[0] #list all hosts in the cluster - host_list = list_hosts(self.apiclient, clusterid=vm_cluster.id, listall=True) + host_list = list_hosts(self.apiclient, clusterid=vm_cluster.id, listall=True) Configurations.update( self.apiclient, "vmware.vcenter.session.timeout", @@ -2611,7 +2611,7 @@ class TestStorageLiveMigrationVmware(cloudstackTestCase): self.apiclient, "Running" ) - # Create 2 data disks + # Create 2 data disks data_disk_1 = Volume.create( self.apiclient, self.testdata["volume"], @@ -2677,7 +2677,7 @@ class TestStorageLiveMigrationVmware(cloudstackTestCase): self.apiclient, ssvm.id, "Running" - ) + ) # Try vMotion on virtual_machine_1 to the host which is in maintenance destinationHost, destinationPools, vol_list = get_destination_pools_hosts(self, list_vm_1, storage_scope, storage_type) @@ -2825,7 +2825,7 @@ class TestStorageLiveMigrationVmware(cloudstackTestCase): self.apiclient, "Running" ) - # Create 2 data disks + # Create 2 data disks data_disk_1 = Volume.create( self.apiclient, self.testdata["volume"], diff --git a/test/integration/component/test_acl_isolatednetwork.py b/test/integration/component/test_acl_isolatednetwork.py index 2347b27a2ea..5126aff06d4 100644 --- a/test/integration/component/test_acl_isolatednetwork.py +++ b/test/integration/component/test_acl_isolatednetwork.py @@ -5,17 +5,17 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -""" -Test cases relating to access checks for createNetwork(), deploying VM in an isolated network and restartNetwork() for Admin, domain admin and regular users +""" +Test cases relating to access checks for createNetwork(), deploying VM in an isolated network and restartNetwork() for Admin, domain admin and regular users """ # Import Local Modules diff --git a/test/integration/component/test_acl_isolatednetwork_delete.py b/test/integration/component/test_acl_isolatednetwork_delete.py index bf464d6d6d9..122e9edf190 100644 --- a/test/integration/component/test_acl_isolatednetwork_delete.py +++ b/test/integration/component/test_acl_isolatednetwork_delete.py @@ -5,16 +5,16 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -""" +""" Test cases relating to acess checks for deleteNetwork() for Admin, domain admin and regular users @@ -64,7 +64,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): cls.default_apikey = cls.apiclient.connection.apiKey cls.default_secretkey = cls.apiclient.connection.securityKey - # Create domains + # Create domains cls.domain_1 = Domain.create( cls.apiclient, cls.acldata["domain1"] @@ -115,7 +115,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d1a) cls.user_d1a_apikey = user.apikey cls.user_d1a_secretkey = user.secretkey - + cls.account_d1b = Account.create( cls.apiclient, cls.acldata["accountD1B"], @@ -126,7 +126,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d1b) cls.user_d1b_apikey = user.apikey cls.user_d1b_secretkey = user.secretkey - + # Create 1 admin and 2 user accounts for doamin_11 cls.account_d11 = Account.create( cls.apiclient, @@ -138,7 +138,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d11) cls.user_d11_apikey = user.apikey cls.user_d11_secretkey = user.secretkey - + cls.account_d11a = Account.create( cls.apiclient, cls.acldata["accountD11A"], @@ -149,7 +149,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d11a) cls.user_d11a_apikey = user.apikey cls.user_d11a_secretkey = user.secretkey - + cls.account_d11b = Account.create( cls.apiclient, cls.acldata["accountD11B"], @@ -160,7 +160,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d11b) cls.user_d11b_apikey = user.apikey cls.user_d11b_secretkey = user.secretkey - + # Create 2 user accounts and 1 admin account for doamin_111 cls.account_d111 = Account.create( cls.apiclient, @@ -172,7 +172,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d111) cls.user_d111_apikey = user.apikey cls.user_d111_secretkey = user.secretkey - + cls.account_d111a = Account.create( cls.apiclient, cls.acldata["accountD111A"], @@ -183,7 +183,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d111a) cls.user_d111a_apikey = user.apikey cls.user_d111a_secretkey = user.secretkey - + cls.account_d111b = Account.create( cls.apiclient, cls.acldata["accountD111B"], @@ -194,7 +194,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d111b) cls.user_d111b_apikey = user.apikey cls.user_d111b_secretkey = user.secretkey - + # Create 2 user accounts for doamin_12 cls.account_d12a = Account.create( cls.apiclient, @@ -206,7 +206,7 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d12a) cls.user_d12a_apikey = user.apikey cls.user_d12a_secretkey = user.secretkey - + cls.account_d12b = Account.create( cls.apiclient, cls.acldata["accountD12B"], @@ -217,9 +217,9 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): user = cls.generateKeysForUser(cls.apiclient,cls.account_d12b) cls.user_d12b_apikey = user.apikey cls.user_d12b_secretkey = user.secretkey - + # Create 1 user account for domain_2 - + cls.account_d2a = Account.create( cls.apiclient, cls.acldata["accountD2"], @@ -239,22 +239,22 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): admin=False, ) cls._cleanup.append(cls.account_roota) - + user = cls.generateKeysForUser(cls.apiclient,cls.account_roota) cls.user_roota_apikey = user.apikey cls.user_roota_secretkey = user.secretkey - + cls.account_root = Account.create( cls.apiclient, cls.acldata["accountROOT"], admin=True, ) cls._cleanup.append(cls.account_root) - + user = cls.generateKeysForUser(cls.apiclient,cls.account_root) cls.user_root_apikey = user.apikey cls.user_root_secretkey = user.secretkey - + # create service offering cls.service_offering = ServiceOffering.create( cls.apiclient, @@ -265,63 +265,63 @@ class TestIsolatedNetworkDelete(cloudstackTestCase): cls.zone = get_zone(cls.apiclient,cls.testclient.getZoneForTests()) cls.acldata['mode'] = cls.zone.networktype cls.template = get_template(cls.apiclient, cls.zone.id, cls.acldata["ostype"]) - + cls.apiclient.connection.apiKey = cls.default_apikey cls.apiclient.connection.securityKey = cls.default_secretkey - + list_isolated_network_offerings_response = NetworkOffering.list( cls.apiclient, name="DefaultIsolatedNetworkOfferingWithSourceNatService" ) cls.isolated_network_offering_id = list_isolated_network_offerings_response[0].id - + ## Create Network objects for Update API related test cases - + cls.apiclient.connection.apiKey = cls.user_root_apikey - cls.apiclient.connection.securityKey = cls.user_root_secretkey + cls.apiclient.connection.securityKey = cls.user_root_secretkey cls.network_root = cls.createNetwork(cls.apiclient,cls.account_root,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d1_apikey - cls.apiclient.connection.securityKey = cls.user_d1_secretkey + cls.apiclient.connection.securityKey = cls.user_d1_secretkey cls.network_d1 = cls.createNetwork(cls.apiclient,cls.account_d1,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d1a_apikey - cls.apiclient.connection.securityKey = cls.user_d1a_secretkey + cls.apiclient.connection.securityKey = cls.user_d1a_secretkey cls.network_d1a = cls.createNetwork(cls.apiclient,cls.account_d1a,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d1b_apikey - cls.apiclient.connection.securityKey = cls.user_d1b_secretkey + cls.apiclient.connection.securityKey = cls.user_d1b_secretkey cls.network_d1b = cls.createNetwork(cls.apiclient,cls.account_d1b,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d11a_apikey - cls.apiclient.connection.securityKey = cls.user_d11a_secretkey + cls.apiclient.connection.securityKey = cls.user_d11a_secretkey cls.network_d11a = cls.createNetwork(cls.apiclient,cls.account_d11a,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d11b_apikey - cls.apiclient.connection.securityKey = cls.user_d11b_secretkey + cls.apiclient.connection.securityKey = cls.user_d11b_secretkey cls.network_d11b = cls.createNetwork(cls.apiclient,cls.account_d11b,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d12a_apikey - cls.apiclient.connection.securityKey = cls.user_d12a_secretkey + cls.apiclient.connection.securityKey = cls.user_d12a_secretkey cls.network_d12a = cls.createNetwork(cls.apiclient,cls.account_d12a,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_roota_apikey - cls.apiclient.connection.securityKey = cls.user_roota_secretkey + cls.apiclient.connection.securityKey = cls.user_roota_secretkey cls.network_roota = cls.createNetwork(cls.apiclient,cls.account_roota,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d111a_apikey - cls.apiclient.connection.securityKey = cls.user_d111a_secretkey + cls.apiclient.connection.securityKey = cls.user_d111a_secretkey cls.network_d111a = cls.createNetwork(cls.apiclient,cls.account_d111a,cls.isolated_network_offering_id,cls.zone) - + cls.apiclient.connection.apiKey = cls.user_d111b_apikey - cls.apiclient.connection.securityKey = cls.user_d111b_secretkey + cls.apiclient.connection.securityKey = cls.user_d111b_secretkey cls.network_d111b = cls.createNetwork(cls.apiclient,cls.account_d111b,cls.isolated_network_offering_id,cls.zone) - - + + cls.apiclient.connection.apiKey = cls.user_d2a_apikey - cls.apiclient.connection.securityKey = cls.user_d2a_secretkey + cls.apiclient.connection.securityKey = cls.user_d2a_secretkey cls.network_d2a = cls.createNetwork(cls.apiclient,cls.account_d2a,cls.isolated_network_offering_id,cls.zone) - + except Exception as e: cls.tearDownClass() raise Exception("Failed to create the setup required to execute the test cases: %s" % e) diff --git a/test/integration/component/test_acl_listsnapshot.py b/test/integration/component/test_acl_listsnapshot.py index 9e6a8d02cf4..32d701a862b 100644 --- a/test/integration/component/test_acl_listsnapshot.py +++ b/test/integration/component/test_acl_listsnapshot.py @@ -5,16 +5,16 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -""" +""" Test cases relating to listSnapshot() relating to parameters - id,listall,isrecursive,account and domainid """ # Import Local Modules @@ -63,7 +63,7 @@ class TestSnapshotList(cloudstackTestCase): cls.default_apikey = cls.apiclient.connection.apiKey cls.default_secretkey = cls.apiclient.connection.securityKey - # Create domains + # Create domains cls.domain_1 = Domain.create( cls.apiclient, cls.acldata["domain1"] @@ -198,7 +198,7 @@ class TestSnapshotList(cloudstackTestCase): cls.user_d2a_apikey = user.apikey cls.user_d2a_secretkey = user.secretkey - # Create admin user account + # Create admin user account cls.account_a = Account.create( cls.apiclient, diff --git a/test/integration/component/test_acl_listvm.py b/test/integration/component/test_acl_listvm.py index 5c27f29314e..b058d552364 100644 --- a/test/integration/component/test_acl_listvm.py +++ b/test/integration/component/test_acl_listvm.py @@ -5,16 +5,16 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -""" +""" Test cases relating to listVirtualMachine() relating to parameters - id,listall,isrecursive,account and domainid """ # Import Local Modules diff --git a/test/integration/component/test_acl_listvolume.py b/test/integration/component/test_acl_listvolume.py index c63bfe23405..f3fae139dfe 100644 --- a/test/integration/component/test_acl_listvolume.py +++ b/test/integration/component/test_acl_listvolume.py @@ -5,16 +5,16 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -""" +""" Test cases relating to listVolumes() relating to parameters - id,listall,isrecursive,account and domainid """ # Import Local Modules @@ -60,7 +60,7 @@ class TestVolumeList(cloudstackTestCase): cls.default_apikey = cls.apiclient.connection.apiKey cls.default_secretkey = cls.apiclient.connection.securityKey - # Create domains + # Create domains cls.domain_1 = Domain.create( cls.apiclient, cls.acldata["domain1"] @@ -195,7 +195,7 @@ class TestVolumeList(cloudstackTestCase): cls.user_d2a_apikey = user.apikey cls.user_d2a_secretkey = user.secretkey - # Create admin user account + # Create admin user account cls.account_a = Account.create( cls.apiclient, diff --git a/test/integration/component/test_acl_sharednetwork.py b/test/integration/component/test_acl_sharednetwork.py index 25b01a7aaf1..170dc157b1f 100644 --- a/test/integration/component/test_acl_sharednetwork.py +++ b/test/integration/component/test_acl_sharednetwork.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -67,7 +67,7 @@ class TestSharedNetwork(cloudstackTestCase): cls.default_apikey = cls.apiclient.connection.apiKey cls.default_secretkey = cls.apiclient.connection.securityKey - # Create domains + # Create domains cls.domain_1 = Domain.create( cls.apiclient, cls.acldata["domain1"] @@ -98,167 +98,167 @@ class TestSharedNetwork(cloudstackTestCase): admin=True, domainid=cls.domain_1.id ) - + user = cls.generateKeysForUser(cls.apiclient,cls.account_d1) cls.user_d1_apikey = user.apikey cls.user_d1_secretkey = user.secretkey - + cls.account_d1a = Account.create( cls.apiclient, cls.acldata["accountD1A"], admin=False, domainid=cls.domain_1.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d1a) cls.user_d1a_apikey = user.apikey cls.user_d1a_secretkey = user.secretkey - - + + cls.account_d1b = Account.create( cls.apiclient, cls.acldata["accountD1B"], admin=False, domainid=cls.domain_1.id ) - + user = cls.generateKeysForUser(cls.apiclient,cls.account_d1b) cls.user_d1b_apikey = user.apikey cls.user_d1b_secretkey = user.secretkey - + # Create 1 admin and 2 user accounts for doamin_11 cls.account_d11 = Account.create( cls.apiclient, cls.acldata["accountD11"], admin=True, domainid=cls.domain_11.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d11) cls.user_d11_apikey = user.apikey cls.user_d11_secretkey = user.secretkey - + cls.account_d11a = Account.create( cls.apiclient, cls.acldata["accountD11A"], admin=False, domainid=cls.domain_11.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d11a) cls.user_d11a_apikey = user.apikey cls.user_d11a_secretkey = user.secretkey - + cls.account_d11b = Account.create( cls.apiclient, cls.acldata["accountD11B"], admin=False, domainid=cls.domain_11.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d11b) cls.user_d11b_apikey = user.apikey cls.user_d11b_secretkey = user.secretkey - + # Create 2 user accounts and 1 admin account for doamin_111 - + cls.account_d111 = Account.create( cls.apiclient, cls.acldata["accountD111"], admin=True, domainid=cls.domain_111.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d111) cls.user_d111_apikey = user.apikey cls.user_d111_secretkey = user.secretkey - + cls.account_d111a = Account.create( cls.apiclient, cls.acldata["accountD111A"], admin=False, domainid=cls.domain_111.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d111a) cls.user_d111a_apikey = user.apikey cls.user_d111a_secretkey = user.secretkey - + cls.account_d111b = Account.create( cls.apiclient, cls.acldata["accountD111B"], admin=False, domainid=cls.domain_111.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d111b) cls.user_d111b_apikey = user.apikey cls.user_d111b_secretkey = user.secretkey - + # Create 2 user accounts for doamin_12 cls.account_d12a = Account.create( cls.apiclient, cls.acldata["accountD12A"], admin=False, domainid=cls.domain_12.id - ) + ) user = cls.generateKeysForUser(cls.apiclient,cls.account_d12a) cls.user_d12a_apikey = user.apikey cls.user_d12a_secretkey = user.secretkey - + cls.account_d12b = Account.create( cls.apiclient, cls.acldata["accountD12B"], admin=False, domainid=cls.domain_12.id - ) - + ) + user = cls.generateKeysForUser(cls.apiclient,cls.account_d12b) cls.user_d12b_apikey = user.apikey cls.user_d12b_secretkey = user.secretkey - + # Create 1 user account for domain_2 - + cls.account_d2a = Account.create( cls.apiclient, cls.acldata["accountD2"], admin=False, domainid=cls.domain_2.id ) - + user = cls.generateKeysForUser(cls.apiclient,cls.account_d2a) cls.user_d2a_apikey = user.apikey cls.user_d2a_secretkey = user.secretkey - - + + # Create 1 user account and admin account in "ROOT" domain - + cls.account_roota = Account.create( cls.apiclient, cls.acldata["accountROOTA"], admin=False, ) - + user = cls.generateKeysForUser(cls.apiclient,cls.account_roota) cls.user_roota_apikey = user.apikey cls.user_roota_secretkey = user.secretkey - + cls.account_root = Account.create( cls.apiclient, cls.acldata["accountROOTA"], admin=True, ) - + user = cls.generateKeysForUser(cls.apiclient,cls.account_root) cls.user_root_apikey = user.apikey cls.user_root_secretkey = user.secretkey - + # create service offering cls.service_offering = ServiceOffering.create( cls.apiclient, cls.acldata["service_offering"]["small"] ) - + cls.zone = get_zone(cls.apiclient,cls.testclient.getZoneForTests()) cls.acldata['mode'] = cls.zone.networktype cls.template = get_template(cls.apiclient, cls.zone.id, cls.acldata["ostype"]) - + cls.apiclient.connection.apiKey = cls.default_apikey cls.apiclient.connection.securityKey = cls.default_secretkey - + list_shared_network_offerings_response = NetworkOffering.list( cls.apiclient, name="DefaultSharedNetworkOffering", @@ -279,7 +279,7 @@ class TestSharedNetwork(cloudstackTestCase): networkofferingid=cls.shared_network_offering_id, zoneid=cls.zone.id ) - + cls.shared_network_domain_d11 = Network.create( cls.apiclient, cls.acldata["network_domain_with_no_subdomain_access"], @@ -288,7 +288,7 @@ class TestSharedNetwork(cloudstackTestCase): domainid=cls.domain_11.id, subdomainaccess=False ) - + cls.shared_network_domain_with_subdomain_d11 = Network.create( cls.apiclient, cls.acldata["network_domain_with_subdomain_access"], @@ -297,7 +297,7 @@ class TestSharedNetwork(cloudstackTestCase): domainid=cls.domain_11.id, subdomainaccess=True ) - + cls.shared_network_account_d111a = Network.create( cls.apiclient, cls.acldata["network_account"], @@ -402,7 +402,7 @@ class TestSharedNetwork(cloudstackTestCase): Validate that regular user in any subdomain is allowed to deploy VM in a shared network created with scope="all" """ - # deploy VM as user in a subdomain under ROOT + # deploy VM as user in a subdomain under ROOT self.apiclient.connection.apiKey = self.user_d11a_apikey self.apiclient.connection.securityKey = self.user_d11a_secretkey @@ -428,7 +428,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as an admin user in a subdomain under ROOT - + self.apiclient.connection.apiKey = self.user_d11_apikey self.apiclient.connection.securityKey = self.user_d11_secretkey self.vmdata["name"] = self.acldata["vmD11"]["name"] +"-shared-scope-all" @@ -454,7 +454,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in ROOT domain - + self.apiclient.connection.apiKey = self.user_roota_apikey self.apiclient.connection.securityKey = self.user_roota_secretkey self.vmdata["name"] = self.acldata["vmROOTA"]["name"] + "-shared-scope-all" @@ -478,7 +478,7 @@ class TestSharedNetwork(cloudstackTestCase): Validate that admin user in ROOT domain is allowed to deploy VM in a shared network created with scope="all" """ # deploy VM as admin user in ROOT domain - + self.apiclient.connection.apiKey = self.user_root_apikey self.apiclient.connection.securityKey = self.user_root_secretkey self.vmdata["name"] = self.acldata["vmROOT"]["name"] + "-shared-scope-all" @@ -505,7 +505,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in a domain that has shared network with no subdomain access - + self.apiclient.connection.apiKey = self.user_d11a_apikey self.apiclient.connection.securityKey = self.user_d11a_secretkey self.vmdata["name"] = self.acldata["vmD11A"]["name"] +"-shared-scope-domain-nosubdomainaccess" @@ -532,7 +532,7 @@ class TestSharedNetwork(cloudstackTestCase): """ #deploy VM as an admin user in a domain that has shared network with no subdomain access - + self.apiclient.connection.apiKey = self.user_d11_apikey self.apiclient.connection.securityKey = self.user_d11_secretkey self.vmdata["name"] = self.acldata["vmD11"]["name"] +"-shared-scope-domain-nosubdomainaccess" @@ -558,7 +558,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in a subdomain under a domain that has shared network with no subdomain access - + self.apiclient.connection.apiKey = self.user_d111a_apikey self.apiclient.connection.securityKey = self.user_d111a_secretkey self.vmdata["name"] = self.acldata["vmD111A"]["name"] +"-shared-scope-domain-nosubdomainaccess" @@ -585,7 +585,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as an admin user in a subdomain under a domain that has shared network with no subdomain access - + self.apiclient.connection.apiKey = self.user_d111_apikey self.apiclient.connection.securityKey = self.user_d111_secretkey self.vmdata["name"] = self.acldata["vmD111"]["name"] +"-shared-scope-domain-nosubdomainaccess" @@ -614,7 +614,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in parentdomain of a domain that has shared network with no subdomain access - + self.apiclient.connection.apiKey = self.user_d1a_apikey self.apiclient.connection.securityKey = self.user_d1a_secretkey self.vmdata["name"] = self.acldata["vmD1A"]["name"] +"-shared-scope-domain-nosubdomainaccess" @@ -642,7 +642,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as an admin user in parentdomain of a domain that has shared network with no subdomain access - + self.apiclient.connection.apiKey = self.user_d1_apikey self.apiclient.connection.securityKey = self.user_d1_secretkey self.vmdata["name"] = self.acldata["vmD1"]["name"] +"-shared-scope-domain-nosubdomainaccess" @@ -671,12 +671,12 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in ROOT domain - + self.apiclient.connection.apiKey = self.user_roota_apikey self.apiclient.connection.securityKey = self.user_roota_secretkey self.vmdata["name"] = self.acldata["vmROOTA"]["name"] + "-shared-scope-domain-nosubdomainaccess" self.vmdata["displayname"] = self.acldata["vmROOTA"]["displayname"] + "-shared-scope-domain-nosubdomainaccess" - try: + try: vm = VirtualMachine.create( self.apiclient, self.vmdata, @@ -696,16 +696,16 @@ class TestSharedNetwork(cloudstackTestCase): @attr("simulator_only",tags=["advanced"],required_hardware="false") def test_deployVM_in_sharedNetwork_scope_domain_nosubdomainaccess_ROOTadmin(self): """ - Validate that admin in ROOT domain is NOT allowed to deploy VM in a shared network created with scope="domain" and no subdomain access + Validate that admin in ROOT domain is NOT allowed to deploy VM in a shared network created with scope="domain" and no subdomain access """ # deploy VM as admin user in ROOT domain - + self.apiclient.connection.apiKey = self.user_root_apikey self.apiclient.connection.securityKey = self.user_root_secretkey self.vmdata["name"] = self.acldata["vmROOT"]["name"] + "-shared-scope-domain-nosubdomainaccess" self.vmdata["displayname"] = self.acldata["vmROOT"]["displayname"] + "-shared-scope-domain-nosubdomainaccess" - try: + try: vm = VirtualMachine.create( self.apiclient, self.vmdata, @@ -731,7 +731,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in a domain that has shared network with subdomain access - + self.apiclient.connection.apiKey = self.user_d11a_apikey self.apiclient.connection.securityKey = self.user_d11a_secretkey self.vmdata["name"] = self.acldata["vmD11A"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -758,7 +758,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as an admin user in a domain that has shared network with subdomain access - + self.apiclient.connection.apiKey = self.user_d11_apikey self.apiclient.connection.securityKey = self.user_d11_secretkey self.vmdata["name"] = self.acldata["vmD11"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -784,7 +784,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in a subdomain under a domain that has shared network with subdomain access - + self.apiclient.connection.apiKey = self.user_d111a_apikey self.apiclient.connection.securityKey = self.user_d111a_secretkey self.vmdata["name"] = self.acldata["vmD111A"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -809,7 +809,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as an admin user in a subdomain under a domain that has shared network with subdomain access - + self.apiclient.connection.apiKey = self.user_d111_apikey self.apiclient.connection.securityKey = self.user_d111_secretkey self.vmdata["name"] = self.acldata["vmD111"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -834,7 +834,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in parentdomain of a domain that has shared network with subdomain access - + self.apiclient.connection.apiKey = self.user_d1a_apikey self.apiclient.connection.securityKey = self.user_d1a_secretkey self.vmdata["name"] = self.acldata["vmD1A"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -862,7 +862,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as an admin user in parentdomain of a domain that has shared network with subdomain access - + self.apiclient.connection.apiKey = self.user_d1_apikey self.apiclient.connection.securityKey = self.user_d1_secretkey self.vmdata["name"] = self.acldata["vmD1"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -891,7 +891,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in ROOT domain - + self.apiclient.connection.apiKey = self.user_roota_apikey self.apiclient.connection.securityKey = self.user_roota_secretkey self.vmdata["name"] = self.acldata["vmROOTA"]["name"] + "-shared-scope-domain-withsubdomainaccess" @@ -919,7 +919,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as admin user in ROOT domain - + self.apiclient.connection.apiKey = self.user_root_apikey self.apiclient.connection.securityKey = self.user_root_secretkey self.vmdata["name"] = self.acldata["vmROOT"]["name"] + "-shared-scope-domain-withsubdomainaccess" @@ -950,7 +950,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user under the same domain but belonging to a different account from the acount that has a shared network with scope=account - + self.apiclient.connection.apiKey = self.user_d111b_apikey self.apiclient.connection.securityKey = self.user_d111b_secretkey self.vmdata["name"] = self.acldata["vmD111B"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -979,7 +979,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as admin user for a domain that has an account with shared network with scope=account - + self.apiclient.connection.apiKey = self.user_d111_apikey self.apiclient.connection.securityKey = self.user_d111_secretkey self.vmdata["name"] = self.acldata["vmD111"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -1007,7 +1007,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as account with shared network with scope=account - + self.apiclient.connection.apiKey = self.user_d111a_apikey self.apiclient.connection.securityKey = self.user_d111a_secretkey self.vmdata["name"] = self.acldata["vmD111A"]["name"] +"-shared-scope-domain-withsubdomainaccess" @@ -1032,8 +1032,8 @@ class TestSharedNetwork(cloudstackTestCase): Validate that regular user from a domain different from that of the account is NOT allowed to deploy VM in a shared network created with scope="account" for an account """ - # deploy VM as a user in a subdomain under ROOT - + # deploy VM as a user in a subdomain under ROOT + self.apiclient.connection.apiKey = self.user_d2a_apikey self.apiclient.connection.securityKey = self.user_d2a_secretkey self.vmdata["name"] = self.acldata["vmD2A"]["name"] +"-shared-scope-account" @@ -1062,7 +1062,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as user in ROOT domain - + self.apiclient.connection.apiKey = self.user_roota_apikey self.apiclient.connection.securityKey = self.user_roota_secretkey self.vmdata["name"] = self.acldata["vmROOTA"]["name"] + "-shared-scope-account" @@ -1090,7 +1090,7 @@ class TestSharedNetwork(cloudstackTestCase): """ # deploy VM as admin user in ROOT domain - + self.apiclient.connection.apiKey = self.user_root_apikey self.apiclient.connection.securityKey = self.user_root_secretkey self.vmdata["name"] = self.acldata["vmROOT"]["name"] + "-shared-scope-account" diff --git a/test/integration/component/test_acl_sharednetwork_deployVM-impersonation.py b/test/integration/component/test_acl_sharednetwork_deployVM-impersonation.py index 2bd62dc4470..1cb445b96fe 100644 --- a/test/integration/component/test_acl_sharednetwork_deployVM-impersonation.py +++ b/test/integration/component/test_acl_sharednetwork_deployVM-impersonation.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -15,7 +15,7 @@ # specific language governing permissions and limitations # under the License. """ - Test cases for deploying Virtual Machine using impersonation (passing account and domainId parameters) for shared network + Test cases for deploying Virtual Machine using impersonation (passing account and domainId parameters) for shared network """ # Import Local Modules import marvin @@ -67,7 +67,7 @@ class TestSharedNetworkImpersonation(cloudstackTestCase): cls.default_apikey = cls.apiclient.connection.apiKey cls.default_secretkey = cls.apiclient.connection.securityKey - # Create domains + # Create domains cls.domain_1 = Domain.create( cls.apiclient, cls.acldata["domain1"] @@ -402,7 +402,7 @@ class TestSharedNetworkImpersonation(cloudstackTestCase): """ Valiate that ROOT admin is able to deploy a VM for any user in a subdomain in a shared network with scope=all """ - # Deploy VM as user in a subdomain under ROOT + # Deploy VM as user in a subdomain under ROOT self.apiclient.connection.apiKey = self.default_apikey self.apiclient.connection.securityKey = self.default_secretkey @@ -984,7 +984,7 @@ class TestSharedNetworkImpersonation(cloudstackTestCase): Valiate that ROOT admin is NOT able to deploy a VM for a admin user in a shared network with scope=account which the admin user does not have access to """ - # Deploy VM as an admin user in a subdomain under ROOT + # Deploy VM as an admin user in a subdomain under ROOT self.apiclient.connection.apiKey = self.default_apikey self.apiclient.connection.securityKey = self.default_secretkey @@ -1100,7 +1100,7 @@ class TestSharedNetworkImpersonation(cloudstackTestCase): Valiate that Domain admin is able to deploy a VM for a sub domain user in a shared network with scope=all """ - # Deploy VM as user in a subdomain under ROOT + # Deploy VM as user in a subdomain under ROOT self.apiclient.connection.apiKey = self.user_d1_apikey self.apiclient.connection.securityKey = self.user_d1_secretkey self.vmdata["name"] = self.acldata["vmD11A"]["name"] + "-shared-scope-all-domain-admin" @@ -1126,7 +1126,7 @@ class TestSharedNetworkImpersonation(cloudstackTestCase): Valiate that Domain admin is able to deploy a VM for a sub domain admin user in a shared network with scope=all """ - # Deploy VM as an admin user in a subdomain under ROOT + # Deploy VM as an admin user in a subdomain under ROOT self.apiclient.connection.apiKey = self.user_d1_apikey self.apiclient.connection.securityKey = self.user_d1_secretkey self.vmdata["name"] = self.acldata["vmD11"]["name"] + "-shared-scope-all-domain-admin" @@ -1698,7 +1698,7 @@ class TestSharedNetworkImpersonation(cloudstackTestCase): Valiate that Domain admin is able NOT able to deploy a VM for an regular user from a differnt domain in a shared network with scope=account """ - # Deploy VM as an admin user in a subdomain under ROOT + # Deploy VM as an admin user in a subdomain under ROOT self.apiclient.connection.apiKey = self.user_d1_apikey self.apiclient.connection.securityKey = self.user_d1_secretkey self.vmdata["name"] = self.acldata["vmD2A"]["name"] + "-shared-scope-account-domain-admin" diff --git a/test/integration/component/test_affinity_groups.py b/test/integration/component/test_affinity_groups.py index a2bb642c08e..e31c04c7684 100644 --- a/test/integration/component/test_affinity_groups.py +++ b/test/integration/component/test_affinity_groups.py @@ -65,7 +65,7 @@ class Services: "type": "host anti-affinity", }, "virtual_machine" : { - + }, "new_domain": { "name": "New Domain", diff --git a/test/integration/component/test_affinity_groups_projects.py b/test/integration/component/test_affinity_groups_projects.py index 16135e24e96..ae5da06b792 100644 --- a/test/integration/component/test_affinity_groups_projects.py +++ b/test/integration/component/test_affinity_groups_projects.py @@ -6,9 +6,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 @@ -109,11 +109,11 @@ class TestCreateAffinityGroup(cloudstackTestCase): cls.zone.id, cls.services["ostype"] ) - + cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["template"] = cls.template.id cls.services["zoneid"] = cls.zone.id - + cls.domain_admin_account = Account.create( cls.api_client, cls.services["domain_admin_account"], @@ -127,7 +127,7 @@ class TestCreateAffinityGroup(cloudstackTestCase): cls.api_client, cls.services["account"], domainid=cls.domain.id - ) + ) cls.account_api_client = cls.testClient.getUserApiClient(cls.account.name, cls.domain.name, 0) @@ -145,7 +145,7 @@ class TestCreateAffinityGroup(cloudstackTestCase): account=cls.domain_admin_account.name, domainid=cls.domain_admin_account.domainid ) - + cls.project2 = Project.create( cls.api_client, cls.services["project2"], @@ -167,7 +167,7 @@ class TestCreateAffinityGroup(cloudstackTestCase): cls.services["service_offering"], domainid=cls.account.domainid ) - + cls._cleanup = [] return @@ -209,7 +209,7 @@ class TestCreateAffinityGroup(cloudstackTestCase): return AffinityGroup.create(api_client, aff_grp, None, None, projectid) except Exception as e: raise Exception("Error: Creation of Affinity Group failed : %s" % e) - + @attr(tags=["simulator", "basic", "advanced"], required_hardware="false") def test_01_admin_create_aff_grp_for_project(self): """ @@ -223,7 +223,7 @@ class TestCreateAffinityGroup(cloudstackTestCase): self.assertTrue(list_aff_grps[0].id == aff_grp.id) self.assertTrue(list_aff_grps[0].projectid == self.project.id) self.cleanup.append(aff_grp) - + @attr(tags=["simulator", "basic", "advanced"], required_hardware="false") def test_02_doadmin_create_aff_grp_for_project(self): """ @@ -236,7 +236,7 @@ class TestCreateAffinityGroup(cloudstackTestCase): self.assertTrue(list_aff_grps[0].id == aff_grp.id) self.assertTrue(list_aff_grps[0].projectid == self.project.id) self.cleanup.append(aff_grp) - + @attr(tags=["vogxn", "simulator", "basic", "advanced"], required_hardware="false") def test_03_user_create_aff_grp_for_project(self): """ @@ -249,19 +249,19 @@ class TestCreateAffinityGroup(cloudstackTestCase): self.assertTrue(list_aff_grps[0].id == aff_grp.id) self.assertTrue(list_aff_grps[0].projectid == self.project.id) self.cleanup.append(aff_grp) - + @attr(tags=["simulator", "basic", "advanced"], required_hardware="false") def test_4_user_create_aff_grp_existing_name_for_project(self): """ Test create affinity group that exists (same name) for projects @return: """ - + failed_aff_grp = None aff_grp = self.create_aff_grp(api_client=self.account_api_client) with self.assertRaises(Exception): failed_aff_grp = self.create_aff_grp(api_client=self.account_api_client,aff_grp_name = aff_grp.name) - + if failed_aff_grp: self.cleanup.append(failed_aff_grp) self.cleanup.append(aff_grp) @@ -284,11 +284,11 @@ class TestListAffinityGroups(cloudstackTestCase): cls.zone.id, cls.services["ostype"] ) - + cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["template"] = cls.template.id cls.services["zoneid"] = cls.zone.id - + cls.domain_admin_account = Account.create( cls.api_client, cls.services["domain_admin_account"], @@ -302,7 +302,7 @@ class TestListAffinityGroups(cloudstackTestCase): cls.api_client, cls.services["account"], domainid=cls.domain.id - ) + ) cls.account_api_client = cls.testClient.getUserApiClient(cls.account.name, cls.domain.name, 0) @@ -320,7 +320,7 @@ class TestListAffinityGroups(cloudstackTestCase): account=cls.domain_admin_account.name, domainid=cls.domain_admin_account.domainid ) - + cls.project2 = Project.create( cls.api_client, cls.services["project2"], @@ -342,7 +342,7 @@ class TestListAffinityGroups(cloudstackTestCase): cls.services["service_offering"], domainid=cls.account.domainid ) - + cls._cleanup = [] return @@ -523,7 +523,7 @@ class TestListAffinityGroups(cloudstackTestCase): #Wait for expunge interval to cleanup VM wait_for_cleanup(self.apiclient, ["expunge.delay", "expunge.interval"]) self.cleanup.append(aff_grp) - + class TestDeleteAffinityGroups(cloudstackTestCase): @classmethod @@ -542,11 +542,11 @@ class TestDeleteAffinityGroups(cloudstackTestCase): cls.zone.id, cls.services["ostype"] ) - + cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["template"] = cls.template.id cls.services["zoneid"] = cls.zone.id - + cls.domain_admin_account = Account.create( cls.api_client, cls.services["domain_admin_account"], @@ -560,7 +560,7 @@ class TestDeleteAffinityGroups(cloudstackTestCase): cls.api_client, cls.services["account"], domainid=cls.domain.id - ) + ) cls.account_api_client = cls.testClient.getUserApiClient(cls.account.name, cls.domain.name, 0) @@ -578,7 +578,7 @@ class TestDeleteAffinityGroups(cloudstackTestCase): account=cls.domain_admin_account.name, domainid=cls.domain_admin_account.domainid ) - + cls.project2 = Project.create( cls.api_client, cls.services["project2"], @@ -600,7 +600,7 @@ class TestDeleteAffinityGroups(cloudstackTestCase): cls.services["service_offering"], domainid=cls.account.domainid ) - + cls._cleanup = [] return @@ -685,10 +685,10 @@ class TestDeleteAffinityGroups(cloudstackTestCase): aff_grp2 = self.create_aff_grp(self.account_api_client) aff_grp1.delete(self.account_api_client) - + with self.assertRaises(Exception): list_aff_grps = AffinityGroup.list(self.api_client, id=aff_grp1.id) - + self.cleanup.append(aff_grp2) @attr(tags=["simulator", "basic", "advanced"], required_hardware="false") @@ -724,11 +724,11 @@ class TestUpdateVMAffinityGroups(cloudstackTestCase): cls.zone.id, cls.services["ostype"] ) - + cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["template"] = cls.template.id cls.services["zoneid"] = cls.zone.id - + cls.domain_admin_account = Account.create( cls.api_client, cls.services["domain_admin_account"], @@ -742,7 +742,7 @@ class TestUpdateVMAffinityGroups(cloudstackTestCase): cls.api_client, cls.services["account"], domainid=cls.domain.id - ) + ) cls.account_api_client = cls.testClient.getUserApiClient(cls.account.name, cls.domain.name, 0) @@ -760,7 +760,7 @@ class TestUpdateVMAffinityGroups(cloudstackTestCase): account=cls.domain_admin_account.name, domainid=cls.domain_admin_account.domainid ) - + cls.project2 = Project.create( cls.api_client, cls.services["project2"], @@ -782,7 +782,7 @@ class TestUpdateVMAffinityGroups(cloudstackTestCase): cls.services["service_offering"], domainid=cls.account.domainid ) - + cls._cleanup = [] return @@ -891,7 +891,7 @@ class TestUpdateVMAffinityGroups(cloudstackTestCase): wait_for_cleanup(self.apiclient, ["expunge.delay", "expunge.interval"]) aff_grp1.delete(self.api_client) aff_grp2.delete(self.api_client) - + class TestDeployVMAffinityGroups(cloudstackTestCase): @@ -911,7 +911,7 @@ class TestDeployVMAffinityGroups(cloudstackTestCase): cls.zone.id, cls.services["ostype"] ) - + cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["template"] = cls.template.id cls.services["zoneid"] = cls.zone.id @@ -972,7 +972,7 @@ class TestDeployVMAffinityGroups(cloudstackTestCase): cls.services["service_offering"], domainid=cls.account.domainid ) - + return def setUp(self): @@ -1074,9 +1074,9 @@ class TestDeployVMAffinityGroups(cloudstackTestCase): vm_failed = None with self.assertRaises(Exception): vm_failed = self.create_vm_in_aff_grps(self.account_api_client,ag_list=[aff_grp.name]) - + self.assertEqual(len(hosts), len(vms), "Received %s and %s " % (hosts, vms)) - + if vm_failed: vm_failed.expunge(self.api_client) diff --git a/test/integration/component/test_allocation_states.py b/test/integration/component/test_allocation_states.py index 78c720356a0..695d89625d8 100644 --- a/test/integration/component/test_allocation_states.py +++ b/test/integration/component/test_allocation_states.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/component/test_asa1000v_fw.py b/test/integration/component/test_asa1000v_fw.py index 43d06d18642..35d94744d9a 100644 --- a/test/integration/component/test_asa1000v_fw.py +++ b/test/integration/component/test_asa1000v_fw.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/component/test_assign_vm.py b/test/integration/component/test_assign_vm.py index 9d8ccea37b7..c2ee442e32e 100644 --- a/test/integration/component/test_assign_vm.py +++ b/test/integration/component/test_assign_vm.py @@ -422,7 +422,7 @@ class TestVMOwnership(cloudstackTestCase): self.create_vm(self.sdomain_account_user1['account'], self.sdomain_account_user1['domain'], snapshot=True) with self.assertRaises(Exception): self.virtual_machine.assign_virtual_machine(self.apiclient, self.sdomain_account_user2['account'].name ,self.sdomain_account_user2['domain'].id) - + @attr(tags = ["advanced"]) @log_test_exceptions def test_14_move_across_subdomain_vm_project(self): diff --git a/test/integration/component/test_baremetal.py b/test/integration/component/test_baremetal.py index a27e76c3886..352e79764bb 100644 --- a/test/integration/component/test_baremetal.py +++ b/test/integration/component/test_baremetal.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -86,7 +86,7 @@ class TestBaremetal(cloudstackTestCase): networkoffering = NetworkOffering.create(self.apiclient, self.services["network_offering"]) networkoffering.update(self.apiclient, state="Enabled") self.cleanup.append(networkoffering) - + physical_network = PhysicalNetwork.list(self.apiclient, zoneid=self.zoneid)[0]; dhcp_provider = NetworkServiceProvider.list(self.apiclient, name="BaremetalDhcpProvider", physical_network_id=physical_network.id)[0] NetworkServiceProvider.update( @@ -106,10 +106,10 @@ class TestBaremetal(cloudstackTestCase): id=userdata_provider.id, state='Enabled' ) - + network = Network.create(self.apiclient, self.services["network"], zoneid=self.zoneid, networkofferingid=networkoffering.id) self.cleanup.insert(0, network) - + pod = Pod.list(self.apiclient)[0] cmd = createVlanIpRange.createVlanIpRangeCmd() cmd.podid = pod.id @@ -120,4 +120,4 @@ class TestBaremetal(cloudstackTestCase): cmd.endip = "10.1.1.40" cmd.forVirtualNetwork="false" self.apiclient.createVlanIpRange(cmd) - + diff --git a/test/integration/component/test_blocker_bugs.py b/test/integration/component/test_blocker_bugs.py index c71ca4245f4..7b497cfe294 100644 --- a/test/integration/component/test_blocker_bugs.py +++ b/test/integration/component/test_blocker_bugs.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -177,8 +177,8 @@ class TestTemplate(cloudstackTestCase): #3. Deploy VM should return password set in template. builtin_info = get_builtin_template_info(self.apiclient, self.zone.id) - self.services["template"]["url"] = builtin_info[0] - self.services["template"]["hypervisor"] = builtin_info[1] + self.services["template"]["url"] = builtin_info[0] + self.services["template"]["hypervisor"] = builtin_info[1] self.services["template"]["format"] = builtin_info[2] temp = self.services["template"] self.debug("Registering a new template") diff --git a/test/integration/component/test_browse_templates.py b/test/integration/component/test_browse_templates.py index 2573f5f0db2..ba2a6e16554 100644 --- a/test/integration/component/test_browse_templates.py +++ b/test/integration/component/test_browse_templates.py @@ -80,7 +80,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): "Check for default cent OS template readiness ") cls.service_offering = ServiceOffering.create( - cls.apiclient, + cls.apiclient, cls.testdata["service_offering"] ) cls._cleanup.append(cls.service_offering) @@ -267,7 +267,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): uploadfile = url.split('/')[-1] r = requests.get(url, stream=True) with open(uploadfile, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): + for chunk in r.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) f.flush() @@ -285,7 +285,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): results = requests.post(posturl,files=files,headers=headers,verify=False) print(results.status_code) - if results.status_code !=200: + if results.status_code !=200: self.fail("Upload is not fine") self.validate_uploaded_template(self.apiclient, getuploadparamsresponce.id) @@ -366,7 +366,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): uploadfile = url.split('/')[-1] r = requests.get(url, stream=True) with open(uploadfile, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): + for chunk in r.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) f.flush() @@ -378,7 +378,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): results = requests.post(posturl,files=files,headers=headers,verify=False) print(results.status_code) - if results.status_code !=200: + if results.status_code !=200: self.fail("Upload is not fine") self.validate_uploaded_template(self.apiclient, getuploadparamsresponce.id) @@ -410,7 +410,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): uploadfile = url.split('/')[-1] r = requests.get(url, stream=True) with open(uploadfile, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): + for chunk in r.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) f.flush() @@ -428,7 +428,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): results = requests.post(posturl,files=files,headers=headers,verify=False) print(results.status_code) - if results.status_code !=200: + if results.status_code !=200: self.fail("Upload is not fine") for z1 in lzones: @@ -459,7 +459,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): uploadfile = url.split('/')[-1] r = requests.get(url, stream=True) with open(uploadfile, 'wb') as f: - for chunk in r.iter_content(chunk_size=1024): + for chunk in r.iter_content(chunk_size=1024): if chunk: # filter out keep-alive new chunks f.write(chunk) f.flush() @@ -478,7 +478,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): time.sleep(60) print(results.status_code) - if results.status_code !=200: + if results.status_code !=200: self.fail("Upload is not fine") return(getuploadparamsresponce) @@ -959,7 +959,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): ) list_zones_response = list_zones(self.apiclient) - + self.assertEqual( isinstance(list_zones_response, list), True, @@ -1014,13 +1014,13 @@ class TestBrowseUploadVolume(cloudstackTestCase): "Check list response returns a valid list" ) iprange = ipranges_response[0] - + #Fetch corresponding Physical Network of SSVM's Zone listphyntwk = PhysicalNetwork.list( self.apiclient, zoneid=ssvm.zoneid ) - + # Execute the following assertion in all zones except EIP-ELB Zones if not (self.zone.networktype.lower() == 'basic' and isinstance(NetScaler.list(self.apiclient,physicalnetworkid=listphyntwk[0].id), list) is True): self.assertEqual( @@ -1082,7 +1082,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): cmd = stopSystemVm.stopSystemVmCmd() cmd.id = ssvm.id self.apiclient.stopSystemVm(cmd) - + timeout = self.testdata["timeout"] while True: list_ssvm_response = list_ssvms( @@ -1094,10 +1094,10 @@ class TestBrowseUploadVolume(cloudstackTestCase): break if timeout == 0: raise Exception("List SSVM call failed!") - + time.sleep(self.testdata["sleep"]) timeout = timeout - 1 - + self.assertEqual( isinstance(list_ssvm_response, list), True, @@ -1124,13 +1124,13 @@ class TestBrowseUploadVolume(cloudstackTestCase): state='Running', zoneid=self.zone.id ) - + self.assertEqual( isinstance(list_ssvm_response, list), True, "Check list response returns a valid list" ) - + ssvm_response = list_ssvm_response[0] hosts = list_hosts( @@ -1164,7 +1164,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): break if timeout == 0: raise Exception("List SSVM call failed!") - + time.sleep(self.testdata["sleep"]) timeout = timeout - 1 @@ -1227,7 +1227,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): break if timeout == 0: raise Exception("List SSVM call failed!") - + time.sleep(self.testdata["sleep"]) timeout = timeout - 1 @@ -1257,7 +1257,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): True, "Check whether SSVM has public IP field" ) - + # Wait for the agent to be up self.waitForSystemVMAgent(ssvm_response.name) @@ -1510,10 +1510,10 @@ class TestBrowseUploadVolume(cloudstackTestCase): @attr(tags = ["TODO"], required_hardware="true") def test_02_SSVM_Life_Cycle_With_Browser_Template_TPath(self): """ - Test SSVM_Life_Cycle_With_Browser_template_TPath + Test SSVM_Life_Cycle_With_Browser_template_TPath """ try: - + self.debug("========================= Test 11: Stop and Start SSVM and Perform Browser based volume validations ========================= ") self.stop_ssvm() diff --git a/test/integration/component/test_browse_volumes.py b/test/integration/component/test_browse_volumes.py index 73b4cbbc1c6..6100a88c4cf 100644 --- a/test/integration/component/test_browse_volumes.py +++ b/test/integration/component/test_browse_volumes.py @@ -1978,7 +1978,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="true") def test_01_Browser_volume_Life_cycle_tpath(self): """ - Test Browser_volume_Life_cycle - This includes upload volume,attach to a VM, write data ,Stop ,Start, Reboot,Reset of a VM, detach,attach back to the VM, delete volumes + Test Browser_volume_Life_cycle - This includes upload volume,attach to a VM, write data ,Stop ,Start, Reboot,Reset of a VM, detach,attach back to the VM, delete volumes """ try: @@ -2228,7 +2228,7 @@ class TestBrowseUploadVolume(cloudstackTestCase): @attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="true") def test_03_Browser_Upload_Volume_Global_Config_TPath(self): """ - Test Browser_Upload_Volume_Global_Config limits + Test Browser_Upload_Volume_Global_Config limits """ try: diff --git a/test/integration/component/test_host.py b/test/integration/component/test_host.py index 56913f02e8b..c0969d7944e 100644 --- a/test/integration/component/test_host.py +++ b/test/integration/component/test_host.py @@ -41,7 +41,7 @@ class TestHostHA(cloudstackTestCase): self.logger.addHandler(self.stream_handler) self.apiclient = self.testClient.getApiClient() self.hypervisor = self.testClient.getHypervisorInfo() - self.mgtSvrDetails = self.config.__dict__["mgtSvr"][0].__dict__ + self.mgtSvrDetails = self.config.__dict__["mgtSvr"][0].__dict__ self.dbclient = self.testClient.getDbConnection() self.services = self.testClient.getParsedTestDataConfig() self.zone = get_zone(self.apiclient, self.testClient.getZoneForTests()) @@ -85,7 +85,7 @@ class TestHostHA(cloudstackTestCase): "sleep": 60, "timeout": 10, } - + def tearDown(self): try: @@ -96,10 +96,10 @@ class TestHostHA(cloudstackTestCase): raise Exception("Warning: Exception during cleanup : %s" % e) return - + def checkHostDown(self, fromHostIp, testHostIp): try: - ssh = SshClient(fromHostIp, 22, "root", "password") + ssh = SshClient(fromHostIp, 22, "root", "password") res = ssh.execute("ping -c 1 %s" % testHostIp) result = str(res) if result.count("100% packet loss") == 1: @@ -109,10 +109,10 @@ class TestHostHA(cloudstackTestCase): except Exception as e: self.logger.debug("Got exception %s" % e) return False, 1 - + def checkHostUp(self, fromHostIp, testHostIp): try: - ssh = SshClient(fromHostIp, 22, "root", "password") + ssh = SshClient(fromHostIp, 22, "root", "password") res = ssh.execute("ping -c 1 %s" % testHostIp) result = str(res) if result.count(" 0% packet loss") == 1: @@ -122,7 +122,7 @@ class TestHostHA(cloudstackTestCase): except Exception as e: self.logger.debug("Got exception %s" % e) return False, 1 - + def checkHostStateInCloudstack(self, state, hostId): try: listHost = Host.list( @@ -137,7 +137,7 @@ class TestHostHA(cloudstackTestCase): True, "Check if listHost returns a valid response" ) - + self.assertEqual( len(listHost), 1, @@ -181,7 +181,7 @@ class TestHostHA(cloudstackTestCase): def test_01_host_ha_with_nfs_storagepool_with_vm(self): Configurations.update(self.apiclient, "ping.timeout", "150") self.updateConfigurAndRestart("ping.interval", "150") - + listHost = Host.list( self.apiclient, type='Routing', @@ -190,11 +190,11 @@ class TestHostHA(cloudstackTestCase): ) for host in listHost: self.logger.debug('Hypervisor = {}'.format(host.id)) - + hostToTest = listHost[0] hostUpInCloudstack = wait_until(40, 10, self.checkHostStateInCloudstack, "Up", hostToTest.id) - if not(hostUpInCloudstack): + if not(hostUpInCloudstack): raise self.fail("Host is not up %s, in cloudstack so failing test " % (hostToTest.ipaddress)) - return + return diff --git a/test/integration/component/test_interop_xd_ccp.py b/test/integration/component/test_interop_xd_ccp.py index 6987b528f0e..ae5a9ae9ae7 100644 --- a/test/integration/component/test_interop_xd_ccp.py +++ b/test/integration/component/test_interop_xd_ccp.py @@ -79,7 +79,7 @@ class TestXDCCPInterop(cloudstackTestCase): cls.apiclient, type="Routing" ) - + if hosts is None: raise unittest.SkipTest( "There are no hypervisor's available.Check list hosts response") @@ -98,7 +98,7 @@ class TestXDCCPInterop(cloudstackTestCase): raise unittest.SkipTest("Interop is not supported on KVM") cls.uploadurl=cls.services["interop"][cls.uploadtemplateformat]["url"] - + cls.xtemplate = get_template( cls.apiclient, cls.zone.id, @@ -140,7 +140,7 @@ class TestXDCCPInterop(cloudstackTestCase): timeout = cls.services["vgpu"]["timeout"] while True: - time.sleep(cls.services["vgpu"]["sleep"]) + time.sleep(cls.services["vgpu"]["sleep"]) list_template_response = Template.list( cls.apiclient, templatefilter=cls.services["templatefilter"], @@ -182,7 +182,7 @@ class TestXDCCPInterop(cloudstackTestCase): cls.services["small"], accountid=cls.account.name, domainid=cls.account.domainid, - serviceofferingid=cls.service_offering.id, + serviceofferingid=cls.service_offering.id, mode=cls.services['mode'], startvm="false" ) @@ -324,7 +324,7 @@ class TestXDCCPInterop(cloudstackTestCase): for zone1 in listallzones: if zone1.allocationstate=="Enabled": zonesavailable=zonesavailable+1 - + if zonesavailable<1: self.fail("Check if zones are listed") @@ -450,7 +450,7 @@ class TestXDCCPInterop(cloudstackTestCase): @attr(tags = ["devcloud", "advanced", "advancedns", "basic", "sg"], required_hardware="true") def test_07_start_vm(self): """ - Test Start Stopped Virtual Machine with volumes attached + Test Start Stopped Virtual Machine with volumes attached """ list_vm_response = VirtualMachine.list( @@ -502,7 +502,7 @@ class TestXDCCPInterop(cloudstackTestCase): """ vm_available=0 - + cmd = listVirtualMachines.listVirtualMachinesCmd() cmd.listall = True cmd.zoneid=self.zone.id @@ -563,7 +563,7 @@ class TestXDCCPInterop(cloudstackTestCase): @attr(tags = ["devcloud", "advanced", "advancedns", "basic", "sg"], required_hardware="true") def test_10_detach_volume(self): """ - Test Detach Volume + Test Detach Volume """ list_volume_response1 = Volume.list( @@ -1200,7 +1200,7 @@ class TestXDCCPInterop(cloudstackTestCase): self.skipTest("template creation from volume feature is not supported on %s" % self.hypervisor.lower()) try: - + noffering=NetworkOffering.list( self.user_api_client, name="DefaultIsolatedNetworkOfferingWithSourceNatService" diff --git a/test/integration/component/test_netscaler_configs.py b/test/integration/component/test_netscaler_configs.py index 3bbd68a4c91..b9db393a95f 100644 --- a/test/integration/component/test_netscaler_configs.py +++ b/test/integration/component/test_netscaler_configs.py @@ -1146,10 +1146,10 @@ class TestGuestNetworkWithNetScaler(_NetScalerDeployVMBase): """ # Validate the following - # 1. Configure Netscaler for load balancing. + # 1. Configure Netscaler for load balancing. # 2. Create a Network offering with LB services provided by Netscaler # and all other services by VR. - # 3.Create a new account/user. + # 3.Create a new account/user. # 4. Deploy the first VM using a network from the above created # Network offering. # In Netscaler: @@ -1268,10 +1268,10 @@ class TestGuestNetworkWithNetScaler(_NetScalerDeployVMBase): """ # Validate the following - # 1. Configure Netscaler for load balancing. + # 1. Configure Netscaler for load balancing. # 2. Create a Network offering with LB services provided by Netscaler # and all other services by VR. - # 3.Create a new account/user. + # 3.Create a new account/user. # 4. Deploy the first VM using a network from the above created # Network offering. # In Netscaler: @@ -2031,7 +2031,7 @@ class TestServiceProvider(_NetScalerDeployVMBase): """ # Validate the following - # 1. Configure Netscaler for load balancing. + # 1. Configure Netscaler for load balancing. # 2. Create a Network offering. Do not enable the network offering # 3. Try to create a network with this network offering. # 4. Network creation should fail @@ -2077,7 +2077,7 @@ class TestServiceProvider(_NetScalerDeployVMBase): """ # Validate the following - # 1. Configure Netscaler for load balancing. + # 1. Configure Netscaler for load balancing. # 2. Disable the service provider. Create a Network offering. # 3. Try to create a network. Network creation should fail @@ -2110,7 +2110,7 @@ class TestServiceProvider(_NetScalerDeployVMBase): """ # Validate the following - # 1. Configure Netscaler for load balancing. + # 1. Configure Netscaler for load balancing. # 2. Create a Network offering. Create instances and acquire public Ip # 3. Disabled service provider and again try to create LB rules # 4.Deploy VM should fail @@ -2274,10 +2274,10 @@ class TestDeleteNetscaler(_NetScalerDeployVMBase): """ # Validate the following - # 1. Configure Netscaler for load balancing. + # 1. Configure Netscaler for load balancing. # 2. Create a Network offering with LB services provided by Netscaler # and all other services by VR. - # 3.Create a new account/user. + # 3.Create a new account/user. # 4. Deploy the first VM using a network from the above created # Network offering. # 5. Attempt to delete Netscaler load balancer from zone. diff --git a/test/integration/component/test_netscaler_lb_algo.py b/test/integration/component/test_netscaler_lb_algo.py index 9e5001c4b27..b0401eb1221 100644 --- a/test/integration/component/test_netscaler_lb_algo.py +++ b/test/integration/component/test_netscaler_lb_algo.py @@ -1663,7 +1663,7 @@ class TestLbAlgoSbLc(cloudstackTestCase): except Exception as e: if cls.exception_string.lower() in e.lower(): cls.skiptest = True - cls.exception_msg =e + cls.exception_msg =e else: cls.tearDownClass() raise Exception("Warning: Exception in setUpClass: %s" % e) diff --git a/test/integration/component/test_non_contiguous_vlan.py b/test/integration/component/test_non_contiguous_vlan.py index 3224a3a5946..41adb44b34e 100644 --- a/test/integration/component/test_non_contiguous_vlan.py +++ b/test/integration/component/test_non_contiguous_vlan.py @@ -132,7 +132,7 @@ class TestNonContiguousVLANRanges(cloudstackTestCase): self.physicalnetworkid = self.physicalnetwork.id self.existingvlan = self.physicalnetwork.vlan - + if self.vlan == None: self.fail("Failed to set non contiguous vlan ids to test. Free some ids from \ from existing physical networks at extreme ends") diff --git a/test/integration/component/test_organization_states.py b/test/integration/component/test_organization_states.py index 2abb286f3b6..a84f59d9f7c 100644 --- a/test/integration/component/test_organization_states.py +++ b/test/integration/component/test_organization_states.py @@ -5,16 +5,16 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -""" +""" Test cases relating to enabling/diabling of zone/pod/cluster/host diff --git a/test/integration/component/test_project_configs.py b/test/integration/component/test_project_configs.py index e2925ec56b1..92337b9700a 100644 --- a/test/integration/component/test_project_configs.py +++ b/test/integration/component/test_project_configs.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -1213,7 +1213,7 @@ class TestProjectInviteTimeout(cloudstackTestCase): def test_09_invite_to_project_by_email(self): """Test invite user to project by email""" - + # Validate the following: # 1. Set configuration to 5 mins # 2. Create a Project diff --git a/test/integration/component/test_project_limits.py b/test/integration/component/test_project_limits.py index 4e13aa56ae8..9a0a2b57ee4 100644 --- a/test/integration/component/test_project_limits.py +++ b/test/integration/component/test_project_limits.py @@ -909,7 +909,7 @@ class TestResourceLimitsProject(cloudstackTestCase): max=1, projectid=self.project.id ) - + # Register the First Template in the project self.debug("Register the First Template in the project") builtin_info = get_builtin_template_info(self.apiclient, self.zone.id) @@ -949,7 +949,7 @@ class TestResourceLimitsProject(cloudstackTestCase): time.sleep(self.services["sleep"]) timeout = timeout - 1 - + #Verify template response to check whether template added successfully self.assertEqual( isinstance(list_template_response, list), diff --git a/test/integration/component/test_project_usage.py b/test/integration/component/test_project_usage.py index 10028ed92a3..ea7f740be85 100644 --- a/test/integration/component/test_project_usage.py +++ b/test/integration/component/test_project_usage.py @@ -871,7 +871,7 @@ class TestTemplateUsage(cloudstackTestCase): time.sleep(self.services["sleep"]) timeout = timeout - 1 - + #Verify template response to check whether template added successfully self.assertEqual( isinstance(list_template_response, list), @@ -891,9 +891,9 @@ class TestTemplateUsage(cloudstackTestCase): True, "Template state is not ready, it is %s" % template_response.isready ) - + self.debug("Created template with ID: %s" % template.id) - + # Delete template template.delete(self.apiclient) self.debug("Deleted template with ID: %s" % template.id) diff --git a/test/integration/component/test_redundant_router_services.py b/test/integration/component/test_redundant_router_services.py index 02d4d72682f..66e987077d4 100644 --- a/test/integration/component/test_redundant_router_services.py +++ b/test/integration/component/test_redundant_router_services.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/component/test_secsr_mount.py b/test/integration/component/test_secsr_mount.py index 3a69ec291fd..ee2afb55fdc 100644 --- a/test/integration/component/test_secsr_mount.py +++ b/test/integration/component/test_secsr_mount.py @@ -94,7 +94,7 @@ class TestSecSRMount(cloudstackTestCase): for storage_pool in storage_pools: if storage_pool.type == 'NetworkFilesystem': return False - + return True def download(self, apiclient, template_id, retries=12, interval=5): @@ -149,10 +149,10 @@ class TestSecSRMount(cloudstackTestCase): "xenserver"], required_hardware="true") def test_01_prepare_template_local_storage(self): - + if not self.isOnlyLocalStorageAvailable(): self.skipTest("Skipping this test as this is for Local storage on only.") - + listHost = Host.list( self.apiclient, type='Routing', @@ -161,20 +161,20 @@ class TestSecSRMount(cloudstackTestCase): ) for host in listHost: self.logger.debug('Host id %s, hypervisor %s, localstorage %s' % (host.id, host.hypervisor, host.islocalstorageactive)) - + if len(listHost) < 2: self.logger.debug("Prepare secondary storage race condition can be tested with two or more host only %s, found" % len(listHost)); self.skipTest("Prepare secondary storage can be tested with two host only %s, found" % len(listHost)) - + list_template_response = Template.list( self.apiclient, templatefilter='all', zoneid=self.zone.id) - + template_response = list_template_response[0] - + self.logger.debug('Template id %s is Ready %s' % (template_response.id, template_response.isready)) - + if template_response.isready != True: self.skipTest('Template id %s is Not Ready' % (template_response.id)) diff --git a/test/integration/component/test_stopped_vm.py b/test/integration/component/test_stopped_vm.py index 4872ab2c448..1fef070e33b 100644 --- a/test/integration/component/test_stopped_vm.py +++ b/test/integration/component/test_stopped_vm.py @@ -764,10 +764,10 @@ class TestDeployHaEnabledVM(cloudstackTestCase): # Get Zone, Domain and templates cls.hypervisor = cls.testClient.getHypervisorInfo() cls.skip = False - + if cls.hypervisor.lower() == 'lxc': if not find_storage_pool_type(cls.apiclient, storagetype='rbd'): - cls.skip = True + cls.skip = True return cls.domain = get_domain(cls.api_client) diff --git a/test/integration/component/test_tags.py b/test/integration/component/test_tags.py index 79211c4ce41..3a1de84809b 100644 --- a/test/integration/component/test_tags.py +++ b/test/integration/component/test_tags.py @@ -292,7 +292,7 @@ class TestResourceTags(cloudstackTestCase): tag['resid'], tag['restype'], {concrete_tag['key']: concrete_tag['value']}) - + return @attr(tags=["advanced"], required_hardware="false") @@ -880,7 +880,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope5' tag_value = 'test_05_vm_tag' - + self.debug("Creating a tag for user VM") tag = Tag.create( self.apiclient, @@ -1165,7 +1165,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope8' tag_value = 'test_08_volume_tag' - + if self.hypervisor.lower() == 'lxc': if not find_storage_pool_type(self.apiclient, storagetype='rbd'): self.skipTest("RBD storage type is required for data volumes for LXC") @@ -1366,7 +1366,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope10' tag_value = 'test_10_network_tag' - + self.debug("Fetching the network details for account: %s" % self.account.name) networks = Network.list( @@ -1465,7 +1465,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope11' tag_value = 'test_11_migrate_tagged_vm_del' - + if self.hypervisor.lower() in ['lxc']: self.skipTest("vm migrate feature is not supported on %s" % self.hypervisor.lower()) @@ -1578,7 +1578,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope13' tag_value = 'test_13_tag_case_insensitive' - + self.debug("Creating a tag for user VM") tag_1 = Tag.create( self.apiclient, @@ -1656,7 +1656,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope14' tag_value = 'test_14_special_char_mutiple_tags' - + self.debug("Creating a tag for user VM") tag = Tag.create( self.apiclient, @@ -1729,7 +1729,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope15' tag_value = 'test_15_project_tag' - + # Create project as a domain admin project = Project.create( self.apiclient, @@ -1824,9 +1824,9 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope16' tag_value = 'test_16_query_tags_other_account' - + self.debug("Creating user accounts..") - + user_account = Account.create( self.apiclient, self.services["user"], @@ -1910,7 +1910,7 @@ class TestResourceTags(cloudstackTestCase): ) except Exception as e: self.fail("Failed to delete the tag - %s" % e) - + return @attr(tags=["advanced", "basic"], required_hardware="false") @@ -1925,7 +1925,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope17' tag_value = 'test_17_query_tags_admin_account' - + self.debug("Creating user accounts..") user_account = Account.create( @@ -2000,7 +2000,7 @@ class TestResourceTags(cloudstackTestCase): ) except Exception as e: self.fail("Failed to delete the tag - %s" % e) - + return @attr(tags=["advanced", "basic", "simulator"], required_hardware="false") @@ -2013,7 +2013,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope18' tag_value = 'test_18_invalid_list_parameters' - + self.debug("Creating a tag for user VM") tag = Tag.create( self.apiclient, @@ -2060,8 +2060,8 @@ class TestResourceTags(cloudstackTestCase): # 2. Add same tag. tag_key = 'scope19' - tag_value = 'test_19_delete_add_same_tag' - + tag_value = 'test_19_delete_add_same_tag' + self.debug("Creating a tag for user VM") tag = Tag.create( self.apiclient, @@ -2165,9 +2165,9 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope20' tag_value = 'test_20_create_tags_multiple_resources' - + self.debug("Creating volume for account: %s " % self.account.name) - + volume = Volume.create( self.apiclient, self.services["volume"], @@ -2272,8 +2272,8 @@ class TestResourceTags(cloudstackTestCase): "Test creation of tag on stopped vm." tag_key = 'scope21' - tag_value = 'test_21_create_tag_stopped_vm' - + tag_value = 'test_21_create_tag_stopped_vm' + try: self.debug("Stopping the virtual machine: %s" % self.vm_1.name) # Stop virtual machine @@ -2326,7 +2326,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope22' tag_value = 'test_22_create_tag_destroyed_vm' - + self.debug("Destroying instance: %s" % self.vm_1.name) self.vm_1.delete(self.apiclient, expunge=False) @@ -2481,7 +2481,7 @@ class TestResourceTags(cloudstackTestCase): tag_key = 'scope24' tag_value = 'test_24_public_ip_tag' - + self.debug("Creating a sub-domain under: %s" % self.domain.name) self.child_domain = Domain.create( self.apiclient, @@ -2652,7 +2652,7 @@ class TestResourceTags(cloudstackTestCase): received_tag_map = {} for t in received_tags: received_tag_map[t.key] = t.value - + self.assertEqual( set_tags, received_tag_map, @@ -2680,7 +2680,7 @@ class TestResourceTags(cloudstackTestCase): "List tags should return empty list response when tags are removed." ) return - + @attr(tags=["advanced","basic"], required_hardware="false") def test_25_admin_account_tags(self): '''Test create, list, delete tag for admin account from admin account''' @@ -2689,7 +2689,7 @@ class TestResourceTags(cloudstackTestCase): self.__test_account_tags(self.apiclient, admin_account[0]) return - @attr(tags=["advanced","basic"], required_hardware="false") + @attr(tags=["advanced","basic"], required_hardware="false") def test_26_domain_admin_account_tags(self): child_domain = Domain.create( self.apiclient, @@ -2725,7 +2725,7 @@ class TestResourceTags(cloudstackTestCase): regular_account_api_client = self.testClient.getUserApiClient(UserName=regular_account.name, DomainName=self.domain.name) self.__test_account_tags(regular_account_api_client, regular_account) return - + @attr(tags=["advanced","basic"], required_hardware="false") def test_28_admin_access_domain_admin_account_tags(self): '''Test create, list, delete tag for domain admin account from admin account''' @@ -2783,7 +2783,7 @@ class TestResourceTags(cloudstackTestCase): ) # Cleanup the resources created at end of test self.cleanup.append(regular_account) - + # Cleanup the resources created at end of test self.cleanup.append(child_domain_admin) self.cleanup.append(child_domain) @@ -2804,14 +2804,14 @@ class TestResourceTags(cloudstackTestCase): tag_key_admin = 'scope31_admin' tag_value_admin = 'test_31_user_cant_remove_update_admin_tags' - + regular_account = Account.create( self.apiclient, self.services["account"], admin=False ) self.cleanup.append(regular_account) - + regular_account_api_client = self.testClient.getUserApiClient(UserName=regular_account.name, DomainName=self.domain.name) def create_admin_tag(): @@ -2820,7 +2820,7 @@ class TestResourceTags(cloudstackTestCase): resourceIds=regular_account.id, resourceType='Account', tags={ tag_key_admin: tag_value_admin}) - + def create_user_tag(): return Tag.create( @@ -2828,7 +2828,7 @@ class TestResourceTags(cloudstackTestCase): resourceIds=regular_account.id, resourceType='Account', tags={ tag_key_user: tag_value_user}) - + create_admin_tag() create_user_tag() @@ -2845,7 +2845,7 @@ class TestResourceTags(cloudstackTestCase): def tags_to_map(tags): m = {} for t in tags: - m[t.key] = t.value + m[t.key] = t.value return m # admin requests user account tags and gets None (without listall) @@ -2870,7 +2870,7 @@ class TestResourceTags(cloudstackTestCase): tags_to_map(received_tags_user), {tag_key_admin: tag_value_admin, tag_key_user: tag_value_user}, "List (with listAll=false) tags should return information for user tags" - ) + ) # user requests own account tags and receives all (with listall) received_tags_user_listall = list_tags(regular_account_api_client, True) @@ -2879,11 +2879,11 @@ class TestResourceTags(cloudstackTestCase): {tag_key_admin: tag_value_admin, tag_key_user: tag_value_user}, "List (with listAll=false) tags should return information for user tags" ) - + # # Delete test expressions # - + def delete_tags(apiclient, tags): Tag.delete( apiclient, @@ -2891,12 +2891,12 @@ class TestResourceTags(cloudstackTestCase): resourceType='Account', tags=tags) - # user tries to delete admin tag on own account and succeeds + # user tries to delete admin tag on own account and succeeds try: delete_tags(regular_account_api_client, {tag_key_admin: tag_value_admin}) except Exception as e: self.fail("Regular user is not able to delete administrator tag on own account - %s" % e) - + # user tries to delete user tag and succeeds try: delete_tags(regular_account_api_client, {tag_key_user: tag_value_user}) @@ -2906,15 +2906,15 @@ class TestResourceTags(cloudstackTestCase): # recover tag to run admin tests create_user_tag() create_admin_tag() - + # admin tries to delete tags and succeeds try: delete_tags(self.apiclient, {tag_key_admin: tag_value_admin, tag_key_user: tag_value_user}) except Exception as e: - self.fail("Administrator is not able to delete a tag - %s" % e) + self.fail("Administrator is not able to delete a tag - %s" % e) return - + @attr(tags=["advanced","basic"], required_hardware="false") def test_32_user_a_doesnt_have_access_to_user_b_tags(self): '''Test resource security between regular accounts A and B''' @@ -2924,7 +2924,7 @@ class TestResourceTags(cloudstackTestCase): tag_key_user2 = 'scope32_user2' tag_value_user2 = 'test_32_user_a_doesnt_have_access_to_user_b_tags-user2' - + regular_account1 = Account.create( self.apiclient, self.services["account"], @@ -2975,7 +2975,7 @@ class TestResourceTags(cloudstackTestCase): except Exception as e: pass else: - self.fail("User1 has access to delete tags of User2.") + self.fail("User1 has access to delete tags of User2.") try: Tag.create( @@ -2987,7 +2987,7 @@ class TestResourceTags(cloudstackTestCase): pass else: self.fail("User1 has access to create tags for User2.") - + return @attr(tags=["advanced", "basic"], required_hardware="false") diff --git a/test/integration/component/test_updateResourceCount.py b/test/integration/component/test_updateResourceCount.py index cc024681843..869158305bc 100644 --- a/test/integration/component/test_updateResourceCount.py +++ b/test/integration/component/test_updateResourceCount.py @@ -143,7 +143,7 @@ class TestUpdateResourceCount(cloudstackTestCase): ) self.debug("Created account: %s" % self.account.name) self.cleanup.append(self.account) - + return def tearDown(self): @@ -165,7 +165,7 @@ class TestUpdateResourceCount(cloudstackTestCase): def test_01_updateResourceCount(self): """Test update resource count for an account using a custom service offering to deploy a VM. """ - + # This test will execute the following steps to assure resource count update is working properly # 1. Create an account. # 2. Start 2 VMs; one with normal service offering and other with a custom service offering @@ -173,7 +173,7 @@ class TestUpdateResourceCount(cloudstackTestCase): # The two VMs will add up to 3 CPUs and 1024Mb of RAM. # 4. If the return of updateResourceCount method matches with the expected one, the test passes; otherwise, it fails. # 5. Remove everything created by deleting the account - + vm_1 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], @@ -184,12 +184,12 @@ class TestUpdateResourceCount(cloudstackTestCase): customcpuspeed = 1000, custommemory = 512 ) - + self.debug("Deployed VM 1 in account: %s, ID: %s" % ( self.account.name, vm_1.id )) - + vm_2 = VirtualMachine.create( self.apiclient, self.services["virtual_machine"], @@ -207,8 +207,8 @@ class TestUpdateResourceCount(cloudstackTestCase): resourcetype=8, account=self.account.name, domainid=self.account.domainid - ) - + ) + self.debug("ResourceCount for CPU: %s" % ( resourceCountCpu[0].resourcecount )) @@ -222,8 +222,8 @@ class TestUpdateResourceCount(cloudstackTestCase): resourcetype=9, account=self.account.name, domainid=self.account.domainid - ) - + ) + self.debug("ResourceCount for memory: %s" % ( resourceCountMemory[0].resourcecount )) diff --git a/test/integration/component/test_volume_destroy_recover.py b/test/integration/component/test_volume_destroy_recover.py index 5c0a8731ac2..e90f55cebd6 100644 --- a/test/integration/component/test_volume_destroy_recover.py +++ b/test/integration/component/test_volume_destroy_recover.py @@ -353,13 +353,13 @@ class TestVolumeDestroyRecover(cloudstackTestCase): Steps: # 1. create vm without data disk, resource count increases. - # 2. restore vm. resource count no changes. + # 2. restore vm. resource count no changes. # 3. check old root disk , should be Destroy state # 4. recover old root disk. resource count increases. # 5. delete old root disk . resource count decreases. # 6. destroy vm (expunge=True). resource count decreased with size of root disk """ - + # Create vm try: virtual_machine_3 = VirtualMachine.create( @@ -379,7 +379,7 @@ class TestVolumeDestroyRecover(cloudstackTestCase): self.volumeTotal = self.volumeTotal + 1 self.verify_resource_count_primary_storage(self.expectedCount, self.volumeTotal); - # Get id of root disk + # Get id of root disk root_volumes_list = Volume.list( self.apiclient, virtualmachineid=virtual_machine_3.id, @@ -440,7 +440,7 @@ class TestVolumeDestroyRecover(cloudstackTestCase): # 5. destroy volume (expunge = false), Exception happened. resource count no changes # 6. destroy volume (expunge = true). volume is not found. resource count no changes. """ - + # Create vm try: virtual_machine_4 = VirtualMachine.create( diff --git a/test/integration/component/test_vpc_network_lbrules.py b/test/integration/component/test_vpc_network_lbrules.py index ee7ecc4bbaf..8f137adf78d 100644 --- a/test/integration/component/test_vpc_network_lbrules.py +++ b/test/integration/component/test_vpc_network_lbrules.py @@ -511,7 +511,7 @@ class TestVPCNetworkLBRules(cloudstackTestCase): @attr(tags=["advanced", "intervlan"], required_hardware="true") def test_03_VPC_CreateLBRuleInMultipleNetworksVRStoppedState(self): - """ Test case no 222 : Create LB rules for a two/multiple virtual networks of a + """ Test case no 222 : Create LB rules for a two/multiple virtual networks of a VPC using a new Public IP Address available with the VPC when the Virtual Router is in Stopped State # Validate the following @@ -544,7 +544,7 @@ class TestVPCNetworkLBRules(cloudstackTestCase): self.create_LB_Rule(public_ip_1, network_1, [vm_1, vm_2]) self.check_wget_from_vm(vm_1, public_ip_1, testnegative=False) - return + return @attr(tags=["advanced","advancedns", "intervlan"], required_hardware="true") def test_04_VPC_CreateLBRuleInMultipleNetworksVRStoppedState(self): @@ -643,7 +643,7 @@ class TestVPCNetworkLBRules(cloudstackTestCase): self.check_ssh_into_vm(vm_1, public_ip_1, testnegative=False) lb_rule_nat.delete(self.apiclient) self.check_ssh_into_vm(vm_1, public_ip_1, testnegative=True) - return + return @attr(tags=["advanced", "intervlan"], required_hardware="true") def test_07_VPC_CreateAndDeleteAllLBRule(self): diff --git a/test/integration/component/test_vpc_network_staticnatrule.py b/test/integration/component/test_vpc_network_staticnatrule.py index bba725083f2..844e74b7368 100644 --- a/test/integration/component/test_vpc_network_staticnatrule.py +++ b/test/integration/component/test_vpc_network_staticnatrule.py @@ -378,7 +378,7 @@ class TestVPCNetworkPFRules(cloudstackTestCase): @attr(tags=["advanced", "intervlan"], required_hardware="true") def test_01_VPC_StaticNatRuleCreateStoppedState(self): - """ Test case no extra : + """ Test case no extra : # Validate the following # 1. Create a VPC with cidr - 10.1.1.1/16 @@ -406,7 +406,7 @@ class TestVPCNetworkPFRules(cloudstackTestCase): @attr(tags=["advanced", "intervlan"], required_hardware="true") def test_02_VPC_CreateStaticNatRule(self): - """ Test case no 229 : Create Static NAT Rule for a single virtual network of + """ Test case no 229 : Create Static NAT Rule for a single virtual network of a VPC using a new Public IP Address available with the VPC when the Virtual Router is in Running State # Validate the following @@ -469,7 +469,7 @@ class TestVPCNetworkPFRules(cloudstackTestCase): @attr(tags=["advanced", "intervlan"], required_hardware="true") def test_04_VPC_CreateMultipleStaticNatRule(self): - """ Test case no 230 : Create Static NAT Rules for a two/multiple virtual networks of + """ Test case no 230 : Create Static NAT Rules for a two/multiple virtual networks of a VPC using a new Public IP Address available with the VPC when the Virtual Router is in Running State # Validate the following @@ -503,7 +503,7 @@ class TestVPCNetworkPFRules(cloudstackTestCase): # was tags=["advanced", "intervlan"] @attr(tags=["TODO"], required_hardware="true") def test_05_network_services_VPC_DeleteAllPF(self): - """ Test case no 232: Delete all Static NAT Rules for a single virtual network of + """ Test case no 232: Delete all Static NAT Rules for a single virtual network of a VPC belonging to a single Public IP Address when the Virtual Router is in Running State # Validate the following @@ -536,7 +536,7 @@ class TestVPCNetworkPFRules(cloudstackTestCase): # was tags=["advanced", "intervlan"] @attr(tags=["TODO"], required_hardware="true") def test_06_network_services_VPC_DeleteAllMultiplePF(self): - """ Test case no 233: Delete all Static NAT rules for two/multiple virtual networks of a VPC. + """ Test case no 233: Delete all Static NAT rules for two/multiple virtual networks of a VPC. Observe the status of the Public IP Addresses of the rules when the Virtual Router is in Running State. # Validate the following diff --git a/test/integration/component/test_vpc_vm_life_cycle.py b/test/integration/component/test_vpc_vm_life_cycle.py index ce3e28a7faf..3d41dcadb48 100644 --- a/test/integration/component/test_vpc_vm_life_cycle.py +++ b/test/integration/component/test_vpc_vm_life_cycle.py @@ -655,10 +655,10 @@ class TestVMLifeCycleVPC(cloudstackTestCase): 'Destroyed', "VM state should be destroyed" ) - + except Exception as e: self.fail("Failed to stop the virtual instances, %s" % e) - + # Check if the network rules still exists after Vm stop self.debug("Checking if NAT rules ") nat_rules = NATRule.list( @@ -703,7 +703,7 @@ class TestVMLifeCycleVPC(cloudstackTestCase): except Exception as e: self.fail("Failed to recover the virtual instances, %s" % e) - + try: self.vm_2.delete(self.apiclient, expunge=False) @@ -727,7 +727,7 @@ class TestVMLifeCycleVPC(cloudstackTestCase): self.fail("Failed to stop the virtual instances, %s" % e) self.debug("Recovering the expunged virtual machine vm2 in account: %s" % - self.account.name) + self.account.name) try: self.vm_2.recover(self.apiclient) @@ -1779,10 +1779,10 @@ class TestVMLifeCycleStoppedVPCVR(cloudstackTestCase): 'Destroyed', "VM state should be destroyed" ) - + except Exception as e: self.fail("Failed to stop the virtual instances, %s" % e) - + # Check if the network rules still exists after Vm stop self.debug("Checking if NAT rules ") nat_rules = NATRule.list( @@ -1827,7 +1827,7 @@ class TestVMLifeCycleStoppedVPCVR(cloudstackTestCase): except Exception as e: self.fail("Failed to recover the virtual instances, %s" % e) - + try: self.vm_2.delete(self.apiclient, expunge=False) @@ -1848,7 +1848,7 @@ class TestVMLifeCycleStoppedVPCVR(cloudstackTestCase): self.fail("Failed to stop the virtual instances, %s" % e) self.debug("Recovering the expunged virtual machine vm2 in account: %s" % - self.account.name) + self.account.name) try: self.vm_2.recover(self.apiclient) @@ -2494,10 +2494,10 @@ class TestVMLifeCycleDiffHosts(cloudstackTestCase): 'Destroyed', "VM state should be destroyed" ) - + except Exception as e: self.fail("Failed to stop the virtual instances, %s" % e) - + # Check if the network rules still exists after Vm stop self.debug("Checking if NAT rules ") nat_rules = NATRule.list( @@ -2542,7 +2542,7 @@ class TestVMLifeCycleDiffHosts(cloudstackTestCase): except Exception as e: self.fail("Failed to recover the virtual instances, %s" % e) - + try: self.vm_2.delete(self.apiclient, expunge=False) @@ -2563,7 +2563,7 @@ class TestVMLifeCycleDiffHosts(cloudstackTestCase): self.fail("Failed to stop the virtual instances, %s" % e) self.debug("Recovering the expunged virtual machine vm2 in account: %s" % - self.account.name) + self.account.name) try: self.vm_2.recover(self.apiclient) diff --git a/test/integration/plugins/datera/TestVolumes.py b/test/integration/plugins/datera/TestVolumes.py index 15c326ba4e6..68d9896b6a9 100644 --- a/test/integration/plugins/datera/TestVolumes.py +++ b/test/integration/plugins/datera/TestVolumes.py @@ -339,7 +339,7 @@ class TestVolumes(cloudstackTestCase): 2. Init Datera API connection 3. Create ACS Primary storage 4. Create ACS compute and disk offering. - 5. Create ACS data disk without attaching to a VM + 5. Create ACS data disk without attaching to a VM """ logger.info("Setting up Class") diff --git a/test/integration/plugins/test_quota.py b/test/integration/plugins/test_quota.py index 420d4a9b0c3..5a8530c5200 100644 --- a/test/integration/plugins/test_quota.py +++ b/test/integration/plugins/test_quota.py @@ -79,7 +79,7 @@ class TestQuota(cloudstackTestCase): name='quota.enable.service', value='true'): self.skipTest('quota.enable.service should be true. skipping') - + cmd = quotaTariffList.quotaTariffListCmd() response = self.apiclient.quotaTariffList(cmd) @@ -105,7 +105,7 @@ class TestQuota(cloudstackTestCase): name='quota.enable.service', value='true'): self.skipTest('quota.enable.service should be true. skipping') - + cmd = quotaTariffList.quotaTariffListCmd() cmd.startdate='2015-07-06' response = self.apiclient.quotaTariffList(cmd) @@ -125,7 +125,7 @@ class TestQuota(cloudstackTestCase): name='quota.enable.service', value='true'): self.skipTest('quota.enable.service should be true. skipping') - + cmd = quotaTariffList.quotaTariffListCmd() cmd.startdate='2015-07-06' cmd.usagetype='10' @@ -149,7 +149,7 @@ class TestQuota(cloudstackTestCase): name='quota.enable.service', value='true'): self.skipTest('quota.enable.service should be true. skipping') - + cmd = quotaTariffList.quotaTariffListCmd() cmd.startdate='2015-07-06' cmd.usagetype='10' @@ -205,7 +205,7 @@ class TestQuota(cloudstackTestCase): name='quota.enable.service', value='true'): self.skipTest('quota.enable.service should be true. skipping') - + cmd = quotaCredits.quotaCreditsCmd() cmd.domainid = self.account.domainid cmd.account = self.account.name @@ -227,7 +227,7 @@ class TestQuota(cloudstackTestCase): name='quota.enable.service', value='true'): self.skipTest('quota.enable.service should be true. skipping') - + cmd = quotaBalance.quotaBalanceCmd() today = datetime.date.today() cmd.domainid = self.account.domainid @@ -248,13 +248,13 @@ class TestQuota(cloudstackTestCase): name='quota.enable.service', value='true'): self.skipTest('quota.enable.service should be true. skipping') - + cmd = quotaBalance.quotaBalanceCmd() today = datetime.date.today() cmd.domainid = self.account.domainid cmd.account = self.account.name cmd.startdate = today - datetime.timedelta(days=2) - cmd.enddate = today + cmd.enddate = today response = self.apiclient.quotaBalance(cmd) self.debug("Quota Balance: {response.balance}") diff --git a/test/integration/smoke/__init__.py b/test/integration/smoke/__init__.py index 978b68af62a..13a83393a91 100644 --- a/test/integration/smoke/__init__.py +++ b/test/integration/smoke/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/smoke/test_affinity_groups.py b/test/integration/smoke/test_affinity_groups.py index f58f3d91cdc..26271f69e3f 100644 --- a/test/integration/smoke/test_affinity_groups.py +++ b/test/integration/smoke/test_affinity_groups.py @@ -38,7 +38,7 @@ class TestDeployVmWithAffinityGroup(cloudstackTestCase): cls.testClient = super(TestDeployVmWithAffinityGroup, cls).getClsTestClient() zone_name = cls.testClient.getZoneForTests() cls.apiclient = cls.testClient.getApiClient() - cls.domain = get_domain(cls.apiclient) + cls.domain = get_domain(cls.apiclient) cls.services = cls.testClient.getParsedTestDataConfig() # Get Zone, Domain and templates cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests()) @@ -49,10 +49,10 @@ class TestDeployVmWithAffinityGroup(cloudstackTestCase): cls.zone.id, cls.hypervisor ) - + if cls.template == FAILED: assert False, "get_template() failed to return template" - + cls.services["virtual_machine"]["zoneid"] = cls.zone.id cls.services["template"] = cls.template.id diff --git a/test/integration/smoke/test_affinity_groups_projects.py b/test/integration/smoke/test_affinity_groups_projects.py index d5029528675..851fee2f30e 100644 --- a/test/integration/smoke/test_affinity_groups_projects.py +++ b/test/integration/smoke/test_affinity_groups_projects.py @@ -36,7 +36,7 @@ class TestDeployVmWithAffinityGroup(cloudstackTestCase): cls.testClient = super(TestDeployVmWithAffinityGroup, cls).getClsTestClient() zone_name = cls.testClient.getZoneForTests() cls.apiclient = cls.testClient.getApiClient() - cls.domain = get_domain(cls.apiclient) + cls.domain = get_domain(cls.apiclient) cls.services = cls.testClient.getParsedTestDataConfig() # Get Zone, Domain and templates cls.zone = get_zone(cls.apiclient, cls.testClient.getZoneForTests()) @@ -47,7 +47,7 @@ class TestDeployVmWithAffinityGroup(cloudstackTestCase): cls.zone.id, cls.hypervisor ) - + if cls.template == FAILED: assert False, "get_test_template() failed to return template" diff --git a/test/integration/smoke/test_backup_recovery_dummy.py b/test/integration/smoke/test_backup_recovery_dummy.py index 0c7ae64937c..b4789bd0f24 100644 --- a/test/integration/smoke/test_backup_recovery_dummy.py +++ b/test/integration/smoke/test_backup_recovery_dummy.py @@ -53,17 +53,17 @@ class TestDummyBackupAndRecovery(cloudstackTestCase): Configurations.update(cls.api_client, 'backup.framework.enabled', value='true', zoneid=cls.zone.id) if cls.backup_provider != "dummy": Configurations.update(cls.api_client, 'backup.framework.provider.plugin', value='dummy', zoneid=cls.zone.id) - + if cls.hypervisor.lower() != 'simulator': return - + cls.account = Account.create(cls.api_client, cls.services["account"], domainid=cls.domain.id) cls.offering = ServiceOffering.create(cls.api_client,cls.services["service_offerings"]["small"]) cls.vm = VirtualMachine.create(cls.api_client, cls.services["small"], accountid=cls.account.name, domainid=cls.account.domainid, serviceofferingid=cls.offering.id, mode=cls.services["mode"]) cls._cleanup = [cls.offering, cls.account] - + # Import a dummy backup offering to use on tests cls.provider_offerings = BackupOffering.listExternal(cls.api_client, cls.zone.id) diff --git a/test/integration/smoke/test_create_list_domain_account_project.py b/test/integration/smoke/test_create_list_domain_account_project.py index 5f0f9454b58..3e148129208 100644 --- a/test/integration/smoke/test_create_list_domain_account_project.py +++ b/test/integration/smoke/test_create_list_domain_account_project.py @@ -133,7 +133,7 @@ class TestDomainAccountProject(cloudstackTestCase): self.assertIsNone(list_domain_response[0].cpulimit, "'cpulimit' should not be included in response") - # Create account + # Create account self.account = Account.create( self.apiclient, self.services["account"], diff --git a/test/integration/smoke/test_deploy_vgpu_enabled_vm.py b/test/integration/smoke/test_deploy_vgpu_enabled_vm.py index 6df64081ebc..7ed4c8a08ca 100644 --- a/test/integration/smoke/test_deploy_vgpu_enabled_vm.py +++ b/test/integration/smoke/test_deploy_vgpu_enabled_vm.py @@ -86,7 +86,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): # No XenServer available with GPU Drivers installed self.noSuitableHost = True return - + def setUp(self): self.testdata = self.testClient.getParsedTestDataConfig()["vgpu"] self.apiclient = self.testClient.getApiClient() @@ -97,7 +97,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): self.skipTest("Skipping test because suitable hypervisor/host not\ present") self.testdata = self.testClient.getParsedTestDataConfig() - + self.cleanup = [] # Get Zone, Domain and Default Built-in template @@ -111,7 +111,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): ) if self.hypervisor.lower() in ["xenserver"]: - + # Before running this test for Xen Server, register a windows template with ostype as # 'Windows 7 (32-bit)' self.template = get_template( @@ -119,7 +119,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): self.zone.id, self.testdata["ostype"]) self.cleanup.append(self.template) - + self.testdata["mode"] = self.zone.networktype if self.template == FAILED: @@ -139,10 +139,10 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): self.testdata["service_offerings"]["vgpu260qwin"], ) self.cleanup.append(self.service_offering) - + elif self.hypervisor.lower() in ["vmware"]: self.testdata["isolated_network"]["zoneid"] = self.zone.id - + self.userapiclient = self.testClient.getUserApiClient( UserName=self.account.name, DomainName=self.account.domain @@ -157,7 +157,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): self.testdata["isolated_network_offering"]) # Enable Isolated Network offering self.isolated_network_offering.update(self.apiclient, state='Enabled') - + # Register a private template in the account with nic adapter vmxnet3 # Also add required 3D GPU details for enabling it self.template = Template.register( @@ -169,7 +169,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): details=[{"mks.enable3d" : "true", "mks.use3dRenderer" : "automatic", "svga.autodetect" : "false", "svga.vramSize" : "131072"}] ) - + @attr(tags=['advanced', 'basic', 'vgpu'], required_hardware="true") def test_deploy_vgpu_enabled_vm(self): @@ -184,7 +184,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): self.cleanup.append(self.account) self.skipTest("This test case is written specifically\ for XenServer hypervisor") - + self.virtual_machine = VirtualMachine.create( self.apiclient, self.testdata["small"], @@ -243,11 +243,11 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): user=self.testdata['configurableData']['host']["username"], passwd=self.testdata['configurableData']['host']["password"]) res = sshClient.execute( - "xe vgpu-list vm-name-label=%s params=type-uuid %s" % + "xe vgpu-list vm-name-label=%s params=type-uuid %s" % (vm.instancename)) self.debug("SSH result: %s" % res) except Exception as e: - self.fail("SSH Access failed for %s: %s" % + self.fail("SSH Access failed for %s: %s" % (hostip, e) ) result = str(res) @@ -314,7 +314,7 @@ class TestDeployvGPUenabledVM(cloudstackTestCase): networkofferingid=self.isolated_network_offering.id) self.virtual_machine.add_nic(self.apiclient, self.isolated_network.id) - + self.cleanup = [self.virtual_machine, self.isolated_network, self.isolated_network_offering, self.service_offering, self.account, self.template] qresultset = self.dbclient.execute("select id from vm_instance where uuid = '%s';" % self.virtual_machine.id) diff --git a/test/integration/smoke/test_deploy_vm_with_userdata.py b/test/integration/smoke/test_deploy_vm_with_userdata.py index ced0d3cf255..b395bf9f856 100644 --- a/test/integration/smoke/test_deploy_vm_with_userdata.py +++ b/test/integration/smoke/test_deploy_vm_with_userdata.py @@ -33,7 +33,7 @@ class TestDeployVmWithUserData(cloudstackTestCase): @classmethod def setUpClass(cls): testClient = super(TestDeployVmWithUserData, cls).getClsTestClient() - cls.apiClient = testClient.getApiClient() + cls.apiClient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() cls.zone = get_zone(cls.apiClient, testClient.getZoneForTests()) diff --git a/test/integration/smoke/test_guest_vlan_range.py b/test/integration/smoke/test_guest_vlan_range.py index 12ea52ecde6..f1f8fe1ed31 100644 --- a/test/integration/smoke/test_guest_vlan_range.py +++ b/test/integration/smoke/test_guest_vlan_range.py @@ -130,4 +130,4 @@ class TestDedicateGuestVlanRange(cloudstackTestCase): None, "Check vlan range is not available in listDedicatedGuestVlanRanges" - ) + ) diff --git a/test/integration/smoke/test_list_ids_parameter.py b/test/integration/smoke/test_list_ids_parameter.py index e5053cb9980..b0554f378f3 100644 --- a/test/integration/smoke/test_list_ids_parameter.py +++ b/test/integration/smoke/test_list_ids_parameter.py @@ -37,7 +37,7 @@ import time _multiprocess_shared_ = True class TestListIdsParams(cloudstackTestCase): - + @classmethod def setUpClass(cls): testClient = super(TestListIdsParams, cls).getClsTestClient() @@ -125,7 +125,7 @@ class TestListIdsParams(cloudstackTestCase): cls.virtual_machine_2.stop(cls.apiclient) cls.virtual_machine_3.stop(cls.apiclient) - #Get ROOT volumes of 3 VMs + #Get ROOT volumes of 3 VMs vm1RootVolumeResponse = Volume.list( cls.apiclient, virtualmachineid=cls.virtual_machine_1.id, @@ -190,7 +190,7 @@ class TestListIdsParams(cloudstackTestCase): account=cls.account.name, domainid=cls.account.domainid ) - + cls._cleanup = [ cls.snapshot_1, cls.snapshot_2, diff --git a/test/integration/smoke/test_loadbalance.py b/test/integration/smoke/test_loadbalance.py index 53047f91f23..4d0e31b2125 100644 --- a/test/integration/smoke/test_loadbalance.py +++ b/test/integration/smoke/test_loadbalance.py @@ -34,7 +34,7 @@ class TestLoadBalance(cloudstackTestCase): def setUpClass(cls): testClient = super(TestLoadBalance, cls).getClsTestClient() - cls.apiclient = testClient.getApiClient() + cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() # Get Zone, Domain and templates diff --git a/test/integration/smoke/test_nested_virtualization.py b/test/integration/smoke/test_nested_virtualization.py index 547c05d9a8a..c1f96f6c16e 100644 --- a/test/integration/smoke/test_nested_virtualization.py +++ b/test/integration/smoke/test_nested_virtualization.py @@ -42,7 +42,7 @@ class TestNestedVirtualization(cloudstackTestCase): testClient = super(TestNestedVirtualization, cls).getClsTestClient() cls.apiclient = testClient.getApiClient() cls.services = testClient.getParsedTestDataConfig() - + cls.logger = logging.getLogger('TestNestedVirtualization') cls.stream_handler = logging.StreamHandler() cls.logger.setLevel(logging.DEBUG) @@ -69,7 +69,7 @@ class TestNestedVirtualization(cloudstackTestCase): cls.services["isolated_network_offering"]) # Enable Isolated Network offering cls.isolated_network_offering.update(cls.apiclient, state='Enabled') - + if cls.template == FAILED: assert False, "get_test_template() failed to return template" @@ -83,7 +83,7 @@ class TestNestedVirtualization(cloudstackTestCase): """Test nested virtualization on Vmware hypervisor""" if self.hypervisor.lower() not in ["vmware"]: self.skipTest("Skipping test because suitable hypervisor/host not present") - + # 1) Update nested virtualization configurations, if needed configs = Configurations.list(self.apiclient, name="vmware.nested.virtualization") rollback_nv = False diff --git a/test/integration/smoke/test_password_server.py b/test/integration/smoke/test_password_server.py index 231f8ba82f7..ebc3c48ec9f 100644 --- a/test/integration/smoke/test_password_server.py +++ b/test/integration/smoke/test_password_server.py @@ -334,7 +334,7 @@ class TestIsolatedNetworksPasswdServer(cloudstackTestCase): 'Active', "Check list port forwarding rules" ) - + nat_rules = list_nat_rules( self.apiclient, id=nat_rule2.id @@ -349,7 +349,7 @@ class TestIsolatedNetworksPasswdServer(cloudstackTestCase): 'Active', "Check list port forwarding rules" ) - + self.test_ssh_command(self.vm_1, nat_rule1, "natrule1") self.test_ssh_command(self.vm_2, nat_rule2, "natrule2") diff --git a/test/integration/smoke/test_public_ip_range.py b/test/integration/smoke/test_public_ip_range.py index f0ed939f0fc..69baf5f2fc2 100644 --- a/test/integration/smoke/test_public_ip_range.py +++ b/test/integration/smoke/test_public_ip_range.py @@ -144,7 +144,7 @@ class TestDedicatePublicIPRange(cloudstackTestCase): # 1. Create a Public IP range for system vms # 2. Created IP range should be present and marked as forsystemvms=true, verify with listVlanIpRanges # 7. Delete the Public IP range - + services = { "gateway":"192.168.99.1", "netmask":"255.255.255.0", @@ -179,7 +179,7 @@ class TestDedicatePublicIPRange(cloudstackTestCase): """ packed_ip = inet_aton(ip_string) return unpack(">L", packed_ip)[0] - + def is_ip_in_range(self, start_ip, end_ip, ip_to_test): """ Check whether ip_to_test belongs to IP range between start_ip and end_ip """ @@ -187,7 +187,7 @@ class TestDedicatePublicIPRange(cloudstackTestCase): end = self.get_ip_as_number(end_ip) ip = self.get_ip_as_number(ip_to_test) return start <= ip and ip <= end - + def wait_for_system_vm_start(self, domain_id, systemvmtype): """ Wait until system vm is Running """ diff --git a/test/integration/smoke/test_reset_vm_on_reboot.py b/test/integration/smoke/test_reset_vm_on_reboot.py index 5c1e93d4377..01faf37d94a 100644 --- a/test/integration/smoke/test_reset_vm_on_reboot.py +++ b/test/integration/smoke/test_reset_vm_on_reboot.py @@ -33,7 +33,7 @@ class TestResetVmOnReboot(cloudstackTestCase): def setUpClass(cls): testClient = super(TestResetVmOnReboot, cls).getClsTestClient() cls.apiclient = testClient.getApiClient() - cls.services = testClient.getParsedTestDataConfig() + cls.services = testClient.getParsedTestDataConfig() # Get Zone, Domain and templates domain = get_domain(cls.apiclient) diff --git a/test/integration/smoke/test_resource_detail.py b/test/integration/smoke/test_resource_detail.py index 7103c652613..8346af1dc63 100644 --- a/test/integration/smoke/test_resource_detail.py +++ b/test/integration/smoke/test_resource_detail.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -52,7 +52,7 @@ class TestResourceDetail(cloudstackTestCase): domainid=domain.id ) - + cls.disk_offering = DiskOffering.create( cls.apiclient, cls.services["disk_offering"] @@ -91,11 +91,11 @@ class TestResourceDetail(cloudstackTestCase): @attr(tags = ["advanced", "xenserver"], required_hardware="false") def test_01_updatevolumedetail(self): - """Test volume detail + """Test volume detail """ # Validate the following - - + + #remove detail self.debug("Testing REMOVE volume detail Volume-ID: %s " % ( self.volume.id @@ -103,8 +103,8 @@ class TestResourceDetail(cloudstackTestCase): cmd = removeResourceDetail.removeResourceDetailCmd() cmd.resourcetype = "Volume" cmd.resourceid = self.volume.id - self.apiclient.removeResourceDetail(cmd) - + self.apiclient.removeResourceDetail(cmd) + listResourceDetailCmd = listResourceDetails.listResourceDetailsCmd() listResourceDetailCmd.resourceid = self.volume.id listResourceDetailCmd.resourcetype = "Volume" @@ -112,7 +112,7 @@ class TestResourceDetail(cloudstackTestCase): self.assertEqual(listResourceDetailResponse, None, "Check if the list API \ returns an empty response") - + #TODO - add detail. Map as input return diff --git a/test/integration/smoke/test_router_dnsservice.py b/test/integration/smoke/test_router_dnsservice.py index d0c5a67a3bf..07929bc92a2 100644 --- a/test/integration/smoke/test_router_dnsservice.py +++ b/test/integration/smoke/test_router_dnsservice.py @@ -272,5 +272,5 @@ class TestRouterDnsService(cloudstackTestCase): "VR DNS should serve requests from guest network, ping for %s successful." % VM1_NAME) self.assertTrue(VM2_NAME in result2 and "10.1.1.1" in result2, "VR DNS should serve requests from guest network, ping for %s successful." % VM2_NAME) - + return diff --git a/test/integration/smoke/test_routers_iptables_default_policy.py b/test/integration/smoke/test_routers_iptables_default_policy.py index a4eda3546bb..c2b3769fccb 100644 --- a/test/integration/smoke/test_routers_iptables_default_policy.py +++ b/test/integration/smoke/test_routers_iptables_default_policy.py @@ -230,11 +230,11 @@ class TestVPCIpTablesPolicies(cloudstackTestCase): cls.services["account"], admin=True, domainid=cls.domain.id) - + cls.service_offering = ServiceOffering.create( cls.apiclient, cls.services["service_offering"]) - + cls.logger = logging.getLogger('TestVPCIpTablesPolicies') cls.stream_handler = logging.StreamHandler() @@ -290,7 +290,7 @@ class TestVPCIpTablesPolicies(cloudstackTestCase): def test_01_single_VPC_iptables_policies(self): """ Test iptables default INPUT/FORWARD policies on VPC router """ self.logger.debug("Starting test_01_single_VPC_iptables_policies") - + routers = self.entity_manager.query_routers() self.assertEqual( @@ -312,13 +312,13 @@ class TestVPCIpTablesPolicies(cloudstackTestCase): isinstance(hosts, list), True, "Check for list hosts response return valid data") - + host = hosts[0] host.user = self.hostConfig['username'] host.passwd = self.hostConfig['password'] host.port = self.services["configurableData"]["host"]["port"] tables = [self.services["configurableData"]["input"], self.services["configurableData"]["forward"]] - + for table in tables: result = None if self.hypervisor.lower() in ('vmware', 'hyperv'): @@ -344,10 +344,10 @@ class TestVPCIpTablesPolicies(cloudstackTestCase): "Provide a marvin config file with host\ credentials to run %s" % self._testMethodName) - + self.logger.debug("iptables -L %s: %s" % (table, result)) res = str(result) - + self.assertEqual( res.count("DROP"), 1, @@ -383,11 +383,11 @@ class TestRouterIpTablesPolicies(cloudstackTestCase): cls.services["account"], admin=True, domainid=cls.domain.id) - + cls.service_offering = ServiceOffering.create( cls.apiclient, cls.services["service_offering"]) - + cls.logger = logging.getLogger('TestRouterIpTablesPolicies') cls.stream_handler = logging.StreamHandler() cls.logger.setLevel(logging.DEBUG) @@ -498,7 +498,7 @@ class EntityManager(object): self.networks = [] self.routers = [] self.ips = [] - + def set_cleanup(self, cleanup): self.cleanup = cleanup @@ -541,7 +541,7 @@ class EntityManager(object): return nat_rule def check_ssh_into_vm(self, vm, public_ip): - self.logger.debug("Checking if we can SSH into VM=%s on public_ip=%s" % + self.logger.debug("Checking if we can SSH into VM=%s on public_ip=%s" % (vm.name, public_ip.ipaddress.ipaddress)) vm.ssh_client = None try: diff --git a/test/integration/smoke/test_routers_network_ops.py b/test/integration/smoke/test_routers_network_ops.py index cc1774cfc32..a133e9aed98 100644 --- a/test/integration/smoke/test_routers_network_ops.py +++ b/test/integration/smoke/test_routers_network_ops.py @@ -628,7 +628,7 @@ class TestRedundantIsolateNetworks(cloudstackTestCase): self.skipTest( "Marvin configuration has no host credentials to\ check router services") - + if result.count(vals[0]) == 1: cnts[vals.index(vals[0])] += 1 @@ -647,7 +647,7 @@ class TestIsolatedNetworks(cloudstackTestCase): cls.stream_handler = logging.StreamHandler() cls.logger.setLevel(logging.DEBUG) cls.logger.addHandler(cls.stream_handler) - + cls.testClient = super(TestIsolatedNetworks, cls).getClsTestClient() cls.api_client = cls.testClient.getApiClient() diff --git a/test/integration/smoke/test_snapshots.py b/test/integration/smoke/test_snapshots.py index 4144f118d07..f49534238b6 100644 --- a/test/integration/smoke/test_snapshots.py +++ b/test/integration/smoke/test_snapshots.py @@ -225,7 +225,7 @@ class TestSnapshotRootDisk(cloudstackTestCase): # 4 - Migrate volume V to PS # 5 - Take volume V snapshot -> S # 6 - List snapshot and verify it gets properly listed although Primary Storage was removed - + # Create new volume vol = Volume.create( self.apiclient, diff --git a/test/integration/smoke/test_ssvm.py b/test/integration/smoke/test_ssvm.py index d98c09062eb..cdbc7d2f58e 100644 --- a/test/integration/smoke/test_ssvm.py +++ b/test/integration/smoke/test_ssvm.py @@ -1244,7 +1244,7 @@ class TestSSVMs(cloudstackTestCase): # 2) Get id and url from mounted nfs store # 3) Update NFS version for previous image store # 4) Stop SSVM - # 5) Check NFS version of mounted nfs store after SSVM starts + # 5) Check NFS version of mounted nfs store after SSVM starts nfs_version = self.config.nfsVersion if nfs_version == None: diff --git a/test/integration/smoke/test_vpc_redundant.py b/test/integration/smoke/test_vpc_redundant.py index 3bf60a58575..37dd87a499c 100644 --- a/test/integration/smoke/test_vpc_redundant.py +++ b/test/integration/smoke/test_vpc_redundant.py @@ -271,7 +271,7 @@ class TestVPCRedundancy(cloudstackTestCase): zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid) - + self.cleanup = [self.vpc, self.vpc_off, self.account] return @@ -354,7 +354,7 @@ class TestVPCRedundancy(cloudstackTestCase): self.skipTest( "Marvin configuration has no host credentials to\ check router services") - + if result.count(status_to_check) == 1: cnts[vals.index(status_to_check)] += 1 @@ -508,7 +508,7 @@ class TestVPCRedundancy(cloudstackTestCase): traffictype='Ingress' ) self.logger.debug('nwacl_nat=%s' % nwacl_nat.__dict__) - + return nat_rule def check_ssh_into_vm(self, vm, public_ip, expectFail=False, retries=5): @@ -542,7 +542,7 @@ class TestVPCRedundancy(cloudstackTestCase): self.check_routers_state() self.add_nat_rules() self.do_vpc_test(False) - + self.stop_router_by_type("PRIMARY") self.check_routers_state(1) self.do_vpc_test(False) @@ -567,7 +567,7 @@ class TestVPCRedundancy(cloudstackTestCase): self.check_routers_state() self.add_nat_rules() self.do_default_routes_test() - + @attr(tags=["advanced", "intervlan"], required_hardware="true") def test_03_create_redundant_VPC_1tier_2VMs_2IPs_2PF_ACL_reboot_routers(self): """ Create a redundant VPC with two networks with two VMs in each network """ @@ -577,7 +577,7 @@ class TestVPCRedundancy(cloudstackTestCase): self.check_routers_state() self.add_nat_rules() self.do_vpc_test(False) - + self.reboot_router_by_type("PRIMARY") self.check_routers_state() self.do_vpc_test(False) @@ -627,7 +627,7 @@ class TestVPCRedundancy(cloudstackTestCase): self.networks.append(network) self.networks.append(self.create_network(self.services["network_offering_no_lb"], "10.1.2.1", nr_vms=1)) self.networks.append(self.create_network(self.services["network_offering_no_lb"], "10.1.3.1", nr_vms=1)) - + self.check_routers_state() self.add_nat_rules() self.do_vpc_test(False) @@ -635,7 +635,7 @@ class TestVPCRedundancy(cloudstackTestCase): self.destroy_vm(network) network.get_net().delete(self.apiclient) self.networks.remove(network) - + self.check_routers_state(status_to_check="PRIMARY") self.do_vpc_test(False) @@ -700,9 +700,9 @@ class TestVPCRedundancy(cloudstackTestCase): vm = vmObj.get_vm() public_ip = vmObj.get_ip() self.logger.debug("SSH into VM: %s" % public_ip.ipaddress.ipaddress) - + ssh = vm.get_ssh_client(ipaddress=public_ip.ipaddress.ipaddress) - + self.logger.debug("Ping to google.com from VM") result = ssh.execute(ssh_command) diff --git a/test/integration/smoke/test_vpc_router_nics.py b/test/integration/smoke/test_vpc_router_nics.py index 90323e075fe..942d078d6de 100644 --- a/test/integration/smoke/test_vpc_router_nics.py +++ b/test/integration/smoke/test_vpc_router_nics.py @@ -242,7 +242,7 @@ class TestVPCNics(cloudstackTestCase): zoneid=self.zone.id, account=self.account.name, domainid=self.account.domainid) - + self.cleanup = [self.vpc, self.vpc_off, self.account] return @@ -309,7 +309,7 @@ class TestVPCNics(cloudstackTestCase): except Exception as e: self.fail('Unable to create a Network with offering=%s because of %s ' % (net_offerring, e)) o = networkO(obj_network) - + vm1 = self.deployvm_in_network(obj_network) self.cleanup.insert(1, obj_network) @@ -395,7 +395,7 @@ class TestVPCNics(cloudstackTestCase): net1.add_vm(self.deployvm_in_network(net1.get_net())) self.query_routers() - + self.add_nat_rules() self.check_ssh_into_vm() @@ -459,9 +459,9 @@ class TestVPCNics(cloudstackTestCase): vm = vmObj.get_vm() public_ip = vmObj.get_ip() self.logger.debug("SSH into VM: %s" % public_ip.ipaddress.ipaddress) - + ssh = vm.get_ssh_client(ipaddress=public_ip.ipaddress.ipaddress) - + self.logger.debug("Ping to google.com from VM") result = ssh.execute(ssh_command) diff --git a/test/integration/testpaths/__init__.py b/test/integration/testpaths/__init__.py index 978b68af62a..13a83393a91 100644 --- a/test/integration/testpaths/__init__.py +++ b/test/integration/testpaths/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/test/integration/testpaths/testpath_attach_disk_zwps.py b/test/integration/testpaths/testpath_attach_disk_zwps.py index 1f1e0735ea7..7d700b412ff 100644 --- a/test/integration/testpaths/testpath_attach_disk_zwps.py +++ b/test/integration/testpaths/testpath_attach_disk_zwps.py @@ -316,7 +316,7 @@ class TestAttachDataDiskOnCWPS(cloudstackTestCase): @attr(tags=["basic", "advanced"], required_hardware="true") def test_01_attach_datadisk_to_vm_on_zwps(self): - """ Attach Data Disk on CWPS To VM + """ Attach Data Disk on CWPS To VM 1. Check if zwps storage pool exists. 2. Adding tag to zone wide primary storage 3. Launch a VM diff --git a/test/integration/testpaths/testpath_netmask.py b/test/integration/testpaths/testpath_netmask.py index 32610b85fe9..4509ae4f44c 100644 --- a/test/integration/testpaths/testpath_netmask.py +++ b/test/integration/testpaths/testpath_netmask.py @@ -184,7 +184,7 @@ class TestCheckNetmask(cloudstackTestCase): self.assertNotEqual(len(netlist), 0, "Check if list networks returned an empty list.") - + cidr = netlist[0].cidr.split("/")[1] # Get netmask from CIDR netmask = ipv4_cidr_to_netmask(int(cidr)) diff --git a/test/integration/testpaths/testpath_revert_snap.py b/test/integration/testpaths/testpath_revert_snap.py index 59344009123..ab092e502da 100644 --- a/test/integration/testpaths/testpath_revert_snap.py +++ b/test/integration/testpaths/testpath_revert_snap.py @@ -14,7 +14,7 @@ # KIND, either express or implied. See the License for the # specific language governing permissions and limitations # under the License. -""" Test cases for Verifying revert snapshot +""" Test cases for Verifying revert snapshot """ from nose.plugins.attrib import attr from marvin.cloudstackTestCase import cloudstackTestCase @@ -59,7 +59,7 @@ class TestUnableToRevertSnapshot(cloudstackTestCase): if cls.hypervisor.lower() not in ['xenserver']: cls.skiptest = True - return + return # Create an account cls.account = Account.create( cls.apiclient, @@ -114,7 +114,7 @@ class TestUnableToRevertSnapshot(cloudstackTestCase): # 1. Deploy a VM. # 2. Take VM snapshot. - # 3. Verify that volume snapshot fails with error + # 3. Verify that volume snapshot fails with error can not create volume snapshot for VM with VM-snapshot """ @@ -143,9 +143,9 @@ class TestUnableToRevertSnapshot(cloudstackTestCase): "Event list validation failed due to %s" % volume_list_validation[2] ) - + root_volume = volumes_cluster_list[0] - + #Step 2 vm_snap = VmSnapshot.create(self.apiclient, vm.id) diff --git a/test/integration/testpaths/testpath_volume_recurring_snap.py b/test/integration/testpaths/testpath_volume_recurring_snap.py index 828d4cf7266..06eed7d8ccf 100644 --- a/test/integration/testpaths/testpath_volume_recurring_snap.py +++ b/test/integration/testpaths/testpath_volume_recurring_snap.py @@ -151,18 +151,18 @@ class TestVolumeRecurringSnapshot(cloudstackTestCase): @attr(tags=["advanced", "basic"],required_hardware="true") def test_01_volume_snapshot(self): """ Test Volume (root) Snapshot - # 1. Create Hourly, Daily,Weekly recurring snapshot policy for ROOT disk and + # 1. Create Hourly, Daily,Weekly recurring snapshot policy for ROOT disk and Verify the presence of the corresponding snapshots on the Secondary Storage # 2. Delete the snapshot policy and verify the entry as Destroyed in snapshot_schedule # 3. Verify that maxsnaps should not consider manual snapshots for deletion # 4. Snapshot policy should reflect the correct timezone # 5. Verify that listSnapshotPolicies() should return all snapshot policies that belong to the account (both manual and recurring snapshots) - # 6. Verify that listSnapshotPolicies() should not return snapshot + # 6. Verify that listSnapshotPolicies() should not return snapshot policies that have been deleted # 7. Verify that snapshot should not be created for VM in Destroyed state # 8. Verify that snapshot should get created after resuming the VM - # 9. Verify that All the recurring policies associated with the VM should be + # 9. Verify that All the recurring policies associated with the VM should be deleted after VM get destroyed. """ # Step 1 @@ -280,7 +280,7 @@ class TestVolumeRecurringSnapshot(cloudstackTestCase): recurring_snapshot_daily.id), [] ) - + self.testdata["recurring_snapshot"]["intervaltype"] = 'WEEKLY' self.testdata["recurring_snapshot"]["schedule"] = '00:00:1' recurring_snapshot_weekly = SnapshotPolicy.create( @@ -743,7 +743,7 @@ class TestVolumeRecurringSnapshot(cloudstackTestCase): @attr(tags=["advanced", "basic"], required_hardware="true") def test_02_volume_max_snapshot(self): """ Test Volume Snapshot - # 1. Create Hourly reccuring snapshot policy with maxsnaps=2 + # 1. Create Hourly reccuring snapshot policy with maxsnaps=2 verify that when 3rd snapshot is taken first snapshot gets deleted """ @@ -794,7 +794,7 @@ class TestVolumeRecurringSnapshot(cloudstackTestCase): time.sleep( (self.testdata["recurring_snapshot"]["maxsnaps"]) * 3600 ) - + snapshots_1 = list_snapshots( self.apiclient, volumeid=self.volume[0].id, @@ -896,9 +896,9 @@ class TestVolumeRecurringSnapshot(cloudstackTestCase): @attr(tags=["advanced", "basic"],required_hardware="true") def test_03_volume_rec_snapshot(self): """ Test Volume (root) Snapshot - # 1. For snapshot.delta.max > maxsnaps verify that when number of snapshot exceeds - maxsnaps value previous snapshot should get deleted from database but remain - on secondary storage and when the value exceeds snapshot.delta.max the + # 1. For snapshot.delta.max > maxsnaps verify that when number of snapshot exceeds + maxsnaps value previous snapshot should get deleted from database but remain + on secondary storage and when the value exceeds snapshot.delta.max the snapshot should get deleted from secondary storage """ diff --git a/test/integration/testpaths/testpath_volume_snapshot.py b/test/integration/testpaths/testpath_volume_snapshot.py index a9b0ae3cb48..922618e55c9 100644 --- a/test/integration/testpaths/testpath_volume_snapshot.py +++ b/test/integration/testpaths/testpath_volume_snapshot.py @@ -97,7 +97,7 @@ class TestVolumeSnapshot(cloudstackTestCase): cls.testdata["disk_offering"], ) cls._cleanup.append(cls.disk_offering) - #Create VM_1 and VM_2 + #Create VM_1 and VM_2 cls.vm_1 = VirtualMachine.create( cls.userapiclient, cls.testdata["small"], @@ -156,7 +156,7 @@ class TestVolumeSnapshot(cloudstackTestCase): self.apiclient, root_volume[0].id) - + self.assertEqual( root_vol_snap.state, "BackedUp", @@ -182,7 +182,7 @@ class TestVolumeSnapshot(cloudstackTestCase): self.config, self.zone.id, snap.id)) - + self.account.delete(self.apiclient) for snap in snaps: @@ -212,34 +212,34 @@ class TestVolumeSnapshot(cloudstackTestCase): """ Test Volume (root) Snapshot # 1. Deploy a VM on primary storage and . # 2. Take snapshot on root disk - # 3. Verify the snapshot's entry in the "snapshots" table - and presence of the corresponding + # 3. Verify the snapshot's entry in the "snapshots" table + and presence of the corresponding snapshot on the Secondary Storage - # 4. Create Template from the Snapshot and Deploy a + # 4. Create Template from the Snapshot and Deploy a VM using the Template - # 5. Log in to the VM from template and make verify + # 5. Log in to the VM from template and make verify the contents of the ROOT disk matches with the snapshot. - # 6. Delete Snapshot and Deploy a Linux VM from the + # 6. Delete Snapshot and Deploy a Linux VM from the Template and verify the successful deployment of the VM. - # 7. Create multiple snapshots on the same volume and - Check the integrity of all the snapshots by creating - a template from the snapshot and deploying a Vm from it + # 7. Create multiple snapshots on the same volume and + Check the integrity of all the snapshots by creating + a template from the snapshot and deploying a Vm from it and delete one of the snapshots - # 8. Verify that the original checksum matches with the checksum + # 8. Verify that the original checksum matches with the checksum of VM's created from remaning snapshots - # 9. Make verify the contents of the ROOT disk + # 9. Make verify the contents of the ROOT disk matches with the snapshot - # 10.Verify that Snapshot of both DATA and ROOT volume should - succeed when snapshot of Data disk of a VM is taken + # 10.Verify that Snapshot of both DATA and ROOT volume should + succeed when snapshot of Data disk of a VM is taken when snapshot of ROOT volume of VM is in progress - # 11.Create snapshot of data disk and verify the original checksum + # 11.Create snapshot of data disk and verify the original checksum matches with the volume created from snapshot - # 12.Verify that volume's state should not change when snapshot of + # 12.Verify that volume's state should not change when snapshot of a DATA volume is taken that is attached to a VM - # 13.Verify that volume's state should not change when snapshot of + # 13.Verify that volume's state should not change when snapshot of a DATA volume is taken that is not attached to a VM # 14.Verify that create Snapshot with quiescevm=True should succeed - # 15.revertSnapshot() to revert VM to a specified + # 15.revertSnapshot() to revert VM to a specified Volume snapshot for root volume """ @@ -711,7 +711,7 @@ class TestVolumeSnapshot(cloudstackTestCase): vm_from_temp_2.delete(self.apiclient) # Step 10 - # Take snapshot of Data disk of a VM , when snapshot of ROOT volume of + # Take snapshot of Data disk of a VM , when snapshot of ROOT volume of # VM is in progress try: self.vm_1.stop(self.apiclient) @@ -865,7 +865,7 @@ class TestVolumeSnapshot(cloudstackTestCase): data_volume_2 ) - self.vm_1.reboot(self.apiclient) + self.vm_1.reboot(self.apiclient) self.vm_1.stop(self.apiclient) data_vol_snap_1 = Snapshot.create( diff --git a/test/selenium/common/shared.py b/test/selenium/common/shared.py index 70168711731..e87b0daffce 100644 --- a/test/selenium/common/shared.py +++ b/test/selenium/common/shared.py @@ -133,7 +133,7 @@ class Shared(object): from threading import Timer t = Timer(20,self.wait_for_invisible) t.start() - + @staticmethod #wait until something disappears def wait_for_invisible(browser, element_type, name, waittime=30): diff --git a/test/selenium/lib/Global_Locators.py b/test/selenium/lib/Global_Locators.py index b2d93cd997e..1bd395842f7 100644 --- a/test/selenium/lib/Global_Locators.py +++ b/test/selenium/lib/Global_Locators.py @@ -73,7 +73,7 @@ serviceOfferings_xpath = "//div[@id='navigation']/ul/li[12]/span[2]" ################################################################################################################################################################################################ ## Instances Page -## Instances Main page +## Instances Main page # Add Instance Button on top right corner of Instances page @@ -166,7 +166,7 @@ Offering_edit_css = "a[alt=\"Edit\"] > span.icon" Offering_editname_name = "name" # Edit description box -Offering_editdescription_name = "displaytext" +Offering_editdescription_name = "displaytext" # Edit finished click ok Offering_editdone_css="div.button.done" diff --git a/test/selenium/lib/initialize.py b/test/selenium/lib/initialize.py index 55e5d9aa3b1..284d8961a57 100644 --- a/test/selenium/lib/initialize.py +++ b/test/selenium/lib/initialize.py @@ -32,7 +32,7 @@ def getOrCreateWebdriver(): DRIVER = DRIVER or webdriver.PhantomJS('phantomjs') # phantomjs executable must be in PATH. return DRIVER - + def getMSip(): global MS_ip if len(sys.argv) >= 3: diff --git a/test/selenium/smoke/Login_and_Accounts.py b/test/selenium/smoke/Login_and_Accounts.py index 44b1e836b4c..2b3aee420e8 100644 --- a/test/selenium/smoke/Login_and_Accounts.py +++ b/test/selenium/smoke/Login_and_Accounts.py @@ -31,7 +31,7 @@ import initialize class login(unittest.TestCase): - + def setUp(self): MS_URL = initialize.getMSip() @@ -41,32 +41,32 @@ class login(unittest.TestCase): def test_login(self): - + # Here we will clear the test box for Username and Password and fill them with actual login data. # After that we will click Login (Submit button) driver = self.driver driver.maximize_window() driver.get(self.base_url + "client/") - driver.find_element_by_css_selector(Global_Locators.login_username_css).clear() + driver.find_element_by_css_selector(Global_Locators.login_username_css).clear() driver.find_element_by_css_selector(Global_Locators.login_username_css).send_keys("admin") - driver.find_element_by_css_selector(Global_Locators.login_password_css).clear() + driver.find_element_by_css_selector(Global_Locators.login_password_css).clear() driver.find_element_by_css_selector(Global_Locators.login_password_css).send_keys("password") driver.find_element_by_css_selector(Global_Locators.login_submit_css).click() time.sleep(5) - + def is_element_present(self, how, what): - + try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): - + self.assertEqual([], self.verificationErrors) @@ -77,18 +77,18 @@ class login(unittest.TestCase): class logout(unittest.TestCase): - - + + def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.driver.implicitly_wait(100) self.verificationErrors = [] - - + + def test_logout(self): - + # Here we will clear the test box for Username and Password and fill them with actual login data. # After that we will click Login (Submit button) driver = self.driver @@ -98,17 +98,17 @@ class logout(unittest.TestCase): - + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): - + self.assertEqual([], self.verificationErrors) @@ -120,40 +120,40 @@ class logout(unittest.TestCase): class login_test(unittest.TestCase): - + def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_logintest(self): - + # Here we will clear the test box for Username and Password and fill them with actual login data. # After that we will click Login (Submit button) driver = self.driver - driver.find_element_by_css_selector(Global_Locators.login_username_css).clear() + driver.find_element_by_css_selector(Global_Locators.login_username_css).clear() driver.find_element_by_css_selector(Global_Locators.login_username_css).send_keys("test") - driver.find_element_by_css_selector(Global_Locators.login_password_css).clear() + driver.find_element_by_css_selector(Global_Locators.login_password_css).clear() driver.find_element_by_css_selector(Global_Locators.login_password_css).send_keys("password") driver.find_element_by_css_selector(Global_Locators.login_submit_css).click() time.sleep(5) - - - + + + def is_element_present(self, how, what): - + try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - - + + + def tearDown(self): - + self.assertEqual([], self.verificationErrors) - - + + ################################################################################################################################################ @@ -161,14 +161,14 @@ class createAcc(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - - - + + + def test_createacc(self): - + driver = self.driver self.driver.implicitly_wait(100) driver.find_element_by_xpath("//div[@id='navigation']/ul/li[8]/span[2]").click() @@ -189,27 +189,27 @@ class createAcc(unittest.TestCase): Select(driver.find_element_by_id("label_type")).select_by_visible_text("Admin") Select(driver.find_element_by_id("label_timezone")).select_by_visible_text("[UTC-08:00] Pacific Standard Time") driver.find_element_by_xpath("//button[@type='button']").click() - + # Go to Dashboard - driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() + driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(30) - - - + + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - - + + + def tearDown(self): - + self.assertEqual([], self.verificationErrors) - - - + + + ################################################################################################################################################ @@ -217,38 +217,38 @@ class tearAcc(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - - - + + + def test_tearacc(self): - + driver = self.driver driver.find_element_by_css_selector("li.navigation-item.accounts").click() driver.find_element_by_css_selector("tr.odd > td.name.first").click() driver.find_element_by_css_selector("a[alt=\"Delete account\"] > span.icon").click() driver.find_element_by_xpath("(//button[@type='button'])[2]").click() - + # Go to Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(30) - - - + + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): - + self.driver.quit() self.assertEqual([], self.verificationErrors) - - - + + + ################################################################################################################################################ diff --git a/test/selenium/smoke/Service_Offering.py b/test/selenium/smoke/Service_Offering.py index 66478e60414..5c8a4475ba5 100644 --- a/test/selenium/smoke/Service_Offering.py +++ b/test/selenium/smoke/Service_Offering.py @@ -32,30 +32,30 @@ import Global_Locators class Disk_offering_Add(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_diskadd(self): - + driver = self.driver self.driver.implicitly_wait(200) - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Service Offerings driver.find_element_by_xpath(Global_Locators.serviceOfferings_xpath).click() - + #Select Disk offering driver.find_element_by_xpath(Global_Locators.Offering_disk_xpath).click() - + # Add offering driver.find_element_by_xpath(Global_Locators.Offering_add_xpath).click() - + # Following have names.. so they do not have their global entries. driver.find_element_by_name("name").clear() driver.find_element_by_name("name").send_keys("Test Disk Name") @@ -65,20 +65,20 @@ class Disk_offering_Add(unittest.TestCase): driver.find_element_by_name("disksize").send_keys("1") driver.find_element_by_xpath("//button[@type='button']").click() time.sleep(20) - + ##Verification will be if this offering shows up into table and we can actually edit it. - - + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): self.assertEqual([], self.verificationErrors) - + @@ -88,94 +88,94 @@ class Disk_offering_Edit(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_diskedit(self): - + driver = self.driver self.driver.implicitly_wait(200) - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Service Offerings driver.find_element_by_xpath(Global_Locators.serviceOfferings_xpath).click() - + #Select Disk offering driver.find_element_by_xpath(Global_Locators.Offering_disk_xpath).click() - + # We will be searching for our disk offering into the table linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.Offering_table_xpath) # This returns a list of all Offerings in table - + for link in linkclass: - + if link.text == "Test Disk Name": link.click() - + time.sleep(2) - + # Click Edit driver.find_element_by_css_selector(Global_Locators.Offering_edit_css).click() - + #Change name driver.find_element_by_name(Global_Locators.Offering_editname_name).clear() driver.find_element_by_name(Global_Locators.Offering_editname_name).send_keys("Test Name") - + # Change Description driver.find_element_by_name(Global_Locators.Offering_editdescription_name).clear() driver.find_element_by_name(Global_Locators.Offering_editdescription_name).send_keys("Test Description") - + #Click Done driver.find_element_by_css_selector(Global_Locators.Offering_editdone_css).click() time.sleep(10) - - - + + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): self.assertEqual([], self.verificationErrors) - + # Now we will find this offering and delete it!! - - - - - - + + + + + + class Disk_offering_Delete(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_diskdelete(self): - + driver = self.driver self.driver.implicitly_wait(200) - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Service Offerings driver.find_element_by_xpath(Global_Locators.serviceOfferings_xpath).click() - + #Select Disk offering driver.find_element_by_xpath(Global_Locators.Offering_disk_xpath).click() @@ -183,63 +183,63 @@ class Disk_offering_Delete(unittest.TestCase): # We will be searching for our disk offering into the table linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.Offering_table_xpath) # This returns a list of all Offerings in table - + for link in linkclass: - + if link.text == "Test Name": link.click() - + time.sleep(2) - + # Click Delete driver.find_element_by_css_selector(Global_Locators.Offering_delete_css).click() time.sleep(2) driver.find_element_by_xpath(Global_Locators.yesconfirmation_xapth).click() time.sleep(20) - - + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): self.assertEqual([], self.verificationErrors) - - - - - - - + + + + + + + class Compute_offering_Add(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_computeadd(self): - + driver = self.driver self.driver.implicitly_wait(200) - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Service Offerings driver.find_element_by_xpath(Global_Locators.serviceOfferings_xpath).click() - + #Select Compute offering driver.find_element_by_xpath(Global_Locators.Offering_compute_xpath).click() @@ -247,7 +247,7 @@ class Compute_offering_Add(unittest.TestCase): # Add offering driver.find_element_by_xpath(Global_Locators.Offering_add_xpath).click() - + # Following do not have Global locators driver.find_element_by_id("label_name").clear() driver.find_element_by_id("label_name").send_keys("Test Compute Name") @@ -265,10 +265,10 @@ class Compute_offering_Add(unittest.TestCase): driver.find_element_by_xpath("//button[@type='button']").click() time.sleep(2) - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() - + time.sleep(30) @@ -278,13 +278,13 @@ class Compute_offering_Add(unittest.TestCase): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): self.assertEqual([], self.verificationErrors) - + @@ -296,56 +296,56 @@ class Compute_offering_Edit(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_computeedit(self): - - + + driver = self.driver self.driver.implicitly_wait(200) - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + ## Action part # Go to Service Offerings driver.find_element_by_xpath(Global_Locators.serviceOfferings_xpath).click() - + #Select Compute offering driver.find_element_by_xpath(Global_Locators.Offering_compute_xpath).click() # We will be searching for our disk offering into the table linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.Offering_table_xpath) # This returns a list of all Offerings in table - + for link in linkclass: - + if link.text == "Test Compute Name": link.click() - + time.sleep(2) - + # Click Edit driver.find_element_by_css_selector(Global_Locators.Offering_edit_css).click() - + #Change name driver.find_element_by_name(Global_Locators.Offering_editname_name).clear() driver.find_element_by_name(Global_Locators.Offering_editname_name).send_keys("Test Name") - + # Change Description driver.find_element_by_name(Global_Locators.Offering_editdescription_name).clear() driver.find_element_by_name(Global_Locators.Offering_editdescription_name).send_keys("Test Description") - + #Click Done driver.find_element_by_css_selector(Global_Locators.Offering_editdone_css).click() time.sleep(10) - + @@ -354,41 +354,41 @@ class Compute_offering_Edit(unittest.TestCase): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - + def tearDown(self): self.assertEqual([], self.verificationErrors) - - + + class Compute_offering_Delete(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_computedelete(self): - - + + driver = self.driver self.driver.implicitly_wait(200) - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Service Offerings driver.find_element_by_xpath(Global_Locators.serviceOfferings_xpath).click() - + #Select Compute offering driver.find_element_by_xpath(Global_Locators.Offering_compute_xpath).click() @@ -396,21 +396,21 @@ class Compute_offering_Delete(unittest.TestCase): # We will be searching for our disk offering into the table linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.Offering_table_xpath) # This returns a list of all Offerings in table - + for link in linkclass: - - if link.text == "Test Name": + + if link.text == "Test Name": link.click() - + time.sleep(2) - + # Click Delete - + driver.find_element_by_css_selector(Global_Locators.Offering_deletecompute_css).click() driver.find_element_by_xpath(Global_Locators.yesconfirmation_xapth).click() time.sleep(20) - + def is_element_present(self, how, what): @@ -418,9 +418,9 @@ class Compute_offering_Delete(unittest.TestCase): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): - + self.assertEqual([], self.verificationErrors) diff --git a/test/selenium/smoke/TemplatesAndISO.py b/test/selenium/smoke/TemplatesAndISO.py index 120c8d10d9f..c69b4469116 100644 --- a/test/selenium/smoke/TemplatesAndISO.py +++ b/test/selenium/smoke/TemplatesAndISO.py @@ -41,28 +41,28 @@ class Template_Add(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_templateadd(self): - - + + driver = self.driver ## Action part #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Templates driver.find_element_by_xpath(Global_Locators.templates_xpath).click() #Select Template from drop down list driver.find_element_by_xpath(Global_Locators.template_xpath).click() - + # Add Template driver.find_element_by_xpath(Global_Locators.AddTemplate_xpath).click() @@ -82,26 +82,26 @@ class Template_Add(unittest.TestCase): # Go to Dash Board driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() - - + + time.sleep(600) - + ##Verification will be if this offering shows up into table and we can actually edit it. - - + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - + def tearDown(self): - + self.assertEqual([], self.verificationErrors) - + @@ -113,39 +113,39 @@ class Template_Edit(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - - - + + + def test_templateedit(self): - + driver = self.driver ## Action part - + #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Templates driver.find_element_by_xpath(Global_Locators.templates_xpath).click() #Select Template from drop down list driver.find_element_by_xpath(Global_Locators.template_xpath).click() - - + + linkclass = None - linkclass = driver.find_elements_by_xpath(Global_Locators.template_table_xpath) # This returns a list - + linkclass = driver.find_elements_by_xpath(Global_Locators.template_table_xpath) # This returns a list + for link in linkclass: - + if link.text == "Test Template Ubuntu": # We will search for our VM in this table link.click() - + time.sleep(2) - + # Change name driver.find_element_by_name("name").clear() driver.find_element_by_name("name").send_keys("Test template") @@ -154,10 +154,10 @@ class Template_Edit(unittest.TestCase): # Change Description driver.find_element_by_name("displaytext").clear() driver.find_element_by_name("displaytext").send_keys("ubuntu") - + driver.find_element_by_css_selector(Global_Locators.template_editdone_css).click() time.sleep(2) - + #Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(10) @@ -170,30 +170,30 @@ class Template_Edit(unittest.TestCase): except NoSuchElementException, e: return False return True - - + + def tearDown(self): self.assertEqual([], self.verificationErrors) - + # Now we will find this offering and delete it!! - - - - - - + + + + + + class Template_Delete(unittest.TestCase): - + def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_templatedelete(self): driver = self.driver @@ -202,41 +202,41 @@ class Template_Delete(unittest.TestCase): #Make sure you are on Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + # Go to Templates driver.find_element_by_xpath(Global_Locators.templates_xpath).click() #Select Template from drop down list driver.find_element_by_xpath(Global_Locators.template_xpath).click() - + linkclass = None - linkclass = driver.find_elements_by_xpath(Global_Locators.template_table_xpath) # This returns a list - + linkclass = driver.find_elements_by_xpath(Global_Locators.template_table_xpath) # This returns a list + for link in linkclass: - + if link.text == "Test Template": # We will search for our VM in this table link.click() - + time.sleep(2) - + driver.find_element_by_css_selector(Gloabl_Locators.template_delete_css).click() driver.find_element_by_xpath(Global_Locators.yesconfirmation_xapth).click() - + time.sleep(2) - + #Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(20) - - + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - + def tearDown(self): diff --git a/test/selenium/smoke/VM_lifeCycle.py b/test/selenium/smoke/VM_lifeCycle.py index 845a5cb316f..480c45c8237 100644 --- a/test/selenium/smoke/VM_lifeCycle.py +++ b/test/selenium/smoke/VM_lifeCycle.py @@ -34,110 +34,110 @@ class deployVM(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_deployvm(self): - - + + ## Action Part - # VM will be named Auto-VM and this VM will be used in all subsequent tests. + # VM will be named Auto-VM and this VM will be used in all subsequent tests. # Deploy an Instance named Auto-VM Default CentOS no GUI Template - + driver = self.driver self.driver.implicitly_wait(30) - driver.refresh() ## Most Important step. Failure to do this will change XPATH location and Scripts will fail. - - + driver.refresh() ## Most Important step. Failure to do this will change XPATH location and Scripts will fail. + + # Click on Instances link driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + # Click on add Instance on Instances page driver.find_element_by_xpath(Global_Locators.add_instance_xpath).click() - + # Following select template action will fire automatically... ignore it. And leave following commented. # driver.find_element_by_xpath("(//input[@name='select-template'])[3]").click() #Click on Next button on Instances Wizard. driver.find_element_by_xpath(Global_Locators.add_instance_next_xpath).click() - + # Nothing to do here as we will be using all default settings. (Default CentOS no GUI template should be highlighted here. Click Next driver.find_element_by_xpath(Global_Locators.add_instance_next_xpath).click() - + # Nothing to do here. Medium Instance compute offering should be selected here. Click Next driver.find_element_by_xpath(Global_Locators.add_instance_next_xpath).click() - + # Nothing to do here. Data Disk Offering : No Thanks!!. Click Next driver.find_element_by_xpath(Global_Locators.add_instance_next_xpath).click() - + # Since this is our first instance; we must provide a network name. We will use Test-Network as out network name. driver.find_element_by_xpath("(//input[@name='new-network-name'])[2]").click() driver.find_element_by_xpath("(//input[@name='new-network-name'])[2]").clear() driver.find_element_by_xpath("(//input[@name='new-network-name'])[2]").send_keys("Test-Network") - + #Click next driver.find_element_by_xpath(Global_Locators.add_instance_next_xpath).click() - - # Give our VM a name here. Use Auto-VM as name + + # Give our VM a name here. Use Auto-VM as name driver.find_element_by_xpath("(//input[@name='displayname'])[2]").click() - + driver.find_element_by_xpath("(//input[@name='displayname'])[2]").clear() - + driver.find_element_by_xpath("(//input[@name='displayname'])[2]").send_keys("Auto-VM") - + # All data filled. Click Launch VM. (It has the same xpath as Next button. So we will use Next Variable here. driver.find_element_by_xpath(Global_Locators.add_instance_next_xpath).click() print '\n' + '\n' + "VM Deployment is complete... wait for 5 mins to check deployment status" + '\n' + '\n' - - - + + + ## Verification Part - - + + ## Now we must wait for some random time (Educated guess based on experience) and check if VM has been deployed and if it is in running state. ## Should take about 4 min to deploy VM.. but we will wait 5 mins and check the status , we will do this twice. So total 2 check within 10 mins with first check occuring at 5th min. - - + + driver.refresh() # Refresh UI Page; This polls latest status. - + # Click on Instances link driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables count = 1 - + while (count > 0): - + time.sleep(300) for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table print "found VM in table .. checking status..." + '\n' + '\n' link.click() - + status = driver.find_element_by_xpath(Global_Locators.state_xpath).text ## get the status of our VM - + if status == "Running" : print "VM is in running state... continuing with other tests."+ '\n' + '\n' break else: print "Need to check one more time after 5 mins" continue - count = count - 1 - - + count = count - 1 + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - - - + + + + def tearDown(self): self.assertEqual([], self.verificationErrors) @@ -154,13 +154,13 @@ class destroyVM(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - + def test_destroyvm(self): - + driver = self.driver self.driver.implicitly_wait(100) @@ -168,66 +168,66 @@ class destroyVM(unittest.TestCase): # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() time.sleep(2) - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table link.click() - + # Click on Destroy Instance button and confirm time.sleep(2) driver.find_element_by_css_selector(Global_Locators.destroyinstance_css).click() time.sleep(2) - + # Click ok on confirmation driver.find_element_by_xpath(Global_Locators.yesconfirmation_xapth).click() time.sleep(2) - + # Go to Dashboard # driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() driver.refresh() - + ## Verification part time.sleep(60) - + # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() time.sleep(2) - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table link.click() - - + + status = driver.find_element_by_xpath(Global_Locators.state_xpath).text ## get the status of our VM if status == "Destroyed" : print "VM is Destroyed...."+ '\n' + '\n' else: print "Something went wrong" - - - + + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): self.assertEqual([], self.verificationErrors) - - - + + + ################################################################################################################################################################################################ @@ -240,17 +240,17 @@ class rebootVM(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - - + + def test_rebootvm(self): driver = self.driver self.driver.implicitly_wait(30) - print "Verify this test manually for now" - + print "Verify this test manually for now" + ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(vmLifeAndNetwork.Server_Ip, username='root', password='password') @@ -262,32 +262,32 @@ class rebootVM(unittest.TestCase): print '\n' + '\n' + "Before Reboot ...Executing command uptime..." + '\n' + '\n' stdin, stdout, stderr = ssh.exec_command('uptime') print stdout.readlines() - ssh.close() - - + ssh.close() + + driver.refresh() - + driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables count = 1 - + while (count > 0): - + #time.sleep(300) for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table print "found VM in table .. Rebooting now..." + '\n' + '\n' link.click() - + driver.find_element_by_css_selector(Global_Locators.rebootinstance_css).click() driver.find_element_by_xpath(Global_Locators.actionconfirm_xpath).click() - + # Sleep for 5 mins to ensure system gets rebooted. time.sleep(300) - + ssh = paramiko.SSHClient() ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy()) ssh.connect(vmLifeAndNetwork.Server_Ip, username='root', password='password') @@ -299,7 +299,7 @@ class rebootVM(unittest.TestCase): print '\n' + '\n' + "After Reboot ...Executing command uptime..." + '\n' + '\n' stdin, stdout, stderr = ssh.exec_command('uptime') print stdout.readlines() - ssh.close() + ssh.close() def is_element_present(self, how, what): @@ -307,109 +307,109 @@ class rebootVM(unittest.TestCase): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): self.assertEqual([], self.verificationErrors) - - + + ######################################################################################################################################################### - - - + + + class restoreVM(unittest.TestCase): - + def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - - + + def test_restorevm(self): - + driver = self.driver self.driver.implicitly_wait(100) - + ## Action part # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table - - link.click() - + + link.click() + # Click on Destroy Instance button and confirm driver.find_element_by_css_selector(Global_Locators.restoreinstance_css).click() - + # Click ok on confirmation driver.find_element_by_xpath(Global_Locators.yesconfirmation_xapth).click() # Go to Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() - - + + ## Verification part - + time.sleep(60) - + # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table link.click() - - + + status = driver.find_element_by_xpath(Global_Locators.state_xpath).text ## get the status of our VM - + if status == "Stopped" : print "VM is Restored. but in stopped state.. will start now."+ '\n' + '\n' - + else: print "Something went wrong" - - - - + + + + #VM will be in stop state so we must start it now # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table link.click() - + # Click on Start Instance. driver.find_element_by_css_selector(Global_Locators.startinstance_css).click() time.sleep(2) - - # Dismiss confirmation by clicking Yes + + # Dismiss confirmation by clicking Yes driver.find_element_by_xpath(Global_Locators.yesconfirmation_xapth).click() time.sleep(2) - + # Go to Dashboard driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() time.sleep(2) - + print "VM is Started."+ '\n' + '\n' - + # status = None time.sleep(60) - + # Dismiss the Start Instance information box. driver.find_element_by_xpath(Global_Locators.actionconfirm_xpath).click() time.sleep(2) @@ -421,31 +421,31 @@ class restoreVM(unittest.TestCase): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - - + + + def tearDown(self): - + self.assertEqual([], self.verificationErrors) - - - + + + ######################################################################################################################################################### - - - + + + class startVM(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - - + + def test_startvm(self): - + driver = self.driver self.driver.implicitly_wait(100) @@ -453,54 +453,54 @@ class startVM(unittest.TestCase): #driver.refresh() ## Most Important step. Failure to do this will change XPATH location and Scripts will fail. # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table print "found VM in table .. checking status..." + '\n' + '\n' link.click() - - + + # Click on Start Instance. driver.find_element_by_css_selector(Global_Locators.startinstance_css).click() time.sleep(2) - - # Dismiss confirmation by clicking Yes + + # Dismiss confirmation by clicking Yes driver.find_element_by_xpath(Global_Locators.yesconfirmation_xapth).click() time.sleep(2) - + # Go to Dashboard #driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() driver.refresh() - - + + ## Verification part # status = None time.sleep(60) - + # Dismiss the Start Instance information box. driver.find_element_by_xpath(Global_Locators.actionconfirm_xpath).click() time.sleep(2) # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - time.sleep(2) - + time.sleep(2) + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table link.click() - - + + status = driver.find_element_by_xpath(Global_Locators.state_xpath).text ## get the status of our VM - + if status == "Running" : print "VM is in Running state..."+ '\n' + '\n' @@ -510,100 +510,100 @@ class startVM(unittest.TestCase): # Go to Dashboard driver.refresh() - - + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - + def tearDown(self): self.assertEqual([], self.verificationErrors) - - + + ######################################################################################################################################################### - - - + + + class stopVM(unittest.TestCase): def setUp(self): - + self.driver = initialize.getOrCreateWebdriver() self.verificationErrors = [] - - + + def test_stopvm(self): - + driver = self.driver self.driver.implicitly_wait(100) - + ## Action part driver.refresh() ## Important step. - + # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table print "found VM in table .. checking status..." + '\n' + '\n' link.click() - - + + # HWe are on our VM information page. driver.find_element_by_css_selector(Global_Locators.stopinstance_css).click() time.sleep(2) - + # a Pop up must appear; below we will check the force stop check box and then we will click ok. driver.find_element_by_id(Global_Locators.stopinstanceforce_id).click() driver.find_element_by_xpath(Global_Locators.actionconfirm_xpath).click() time.sleep(2) - + # Go to Dahsboard #driver.find_element_by_xpath(Global_Locators.dashboard_xpath).click() driver.refresh() - - # Should take less than min to stop the instance. We will check twice at interval of 45 seconds o be safe. + + # Should take less than min to stop the instance. We will check twice at interval of 45 seconds o be safe. ## Verification part time.sleep(60) - + # Click on Instances link and find our instance driver.find_element_by_xpath(Global_Locators.instances_xpath).click() - + linkclass = None linkclass = driver.find_elements_by_xpath(Global_Locators.instances_table_xpath) # This returns a list of all VM names in tables - + for link in linkclass: - + if link.text == "Auto-VM": # We will search for our VM in this table link.click() - - + + status = driver.find_element_by_xpath(Global_Locators.state_xpath).text ## get the status of our VM - + if status == "Stopped" : print "VM is in Stopped state...."+ '\n' + '\n' else: print "Something went wrong" - - + + def is_element_present(self, how, what): try: self.driver.find_element(by=how, value=what) except NoSuchElementException, e: return False return True - - + + def tearDown(self): diff --git a/test/selenium/smoke/main.py b/test/selenium/smoke/main.py index 921192dc847..d2ac4dd3c0e 100644 --- a/test/selenium/smoke/main.py +++ b/test/selenium/smoke/main.py @@ -47,13 +47,13 @@ suite = unittest.TestSuite() # setup new test suite # Following logs admin user in and creates test account then logs admin user out and logs in as test to run tests. # You should leave this as is for all the tests. -suite.addTest(unittest.makeSuite(login)) #Login Admin +suite.addTest(unittest.makeSuite(login)) #Login Admin time.sleep(5) suite.addTest(unittest.makeSuite(createAcc)) # Create an Account test. We will use test account for all our tests time.sleep(5) -suite.addTest(unittest.makeSuite(logout)) #Logout Admin +suite.addTest(unittest.makeSuite(logout)) #Logout Admin time.sleep(5) suite.addTest(unittest.makeSuite(login_test)) # Login Test @@ -96,17 +96,17 @@ suite.addTest(unittest.makeSuite(Compute_offering_Delete)) # suite.addTest(unittest.makeSuite(destroyVM)) # time.sleep(5) -# suite.addTest(unittest.makeSuite(restoreVM)) +# suite.addTest(unittest.makeSuite(restoreVM)) # time.sleep(5) -# suite.addTest(unittest.makeSuite(Template_Add)) +# suite.addTest(unittest.makeSuite(Template_Add)) # time.sleep(5) -# suite.addTest(unittest.makeSuite(Template_Edit)) +# suite.addTest(unittest.makeSuite(Template_Edit)) # time.sleep(5) -# suite.addTest(unittest.makeSuite(Template_Delete)) +# suite.addTest(unittest.makeSuite(Template_Delete)) #################################################################################################### @@ -132,11 +132,11 @@ suite.addTest(unittest.makeSuite(tearAcc)) # Delete Account test runner = xmlrunner.XMLTestRunner(output='test-reports') #Comment following line for XML and uncomment for HTML -#runner = HTMLTestRunner.HTMLTestRunner() +#runner = HTMLTestRunner.HTMLTestRunner() #header is required for displaying the website #Comment following line for XML and uncomment for HTML -#print "Content-Type: text/html\n" +#print "Content-Type: text/html\n" # Leave following as is for either XML or HTML runner.run(suite) diff --git a/test/systemvm/test_update_config.py b/test/systemvm/test_update_config.py index fca4cfe30b9..6b78bfbee42 100644 --- a/test/systemvm/test_update_config.py +++ b/test/systemvm/test_update_config.py @@ -71,7 +71,7 @@ class UpdateConfigTestCase(SystemVMTestCase): "allowed":False} ], "egress_rules": - [ + [ {"type":"all", "cidr":"0.0.0.0/0", "allowed":False} @@ -105,41 +105,41 @@ class UpdateConfigTestCase(SystemVMTestCase): basic_acl_rules = [ # block range tcp { - "allowed": False, - "cidr": "1.2.3.0/24", - "first_port": 60, - "last_port": 70, + "allowed": False, + "cidr": "1.2.3.0/24", + "first_port": 60, + "last_port": 70, "type": "tcp" }, # block range udp { - "allowed": False, - "cidr": "1.2.3.0/24", - "first_port": 60, - "last_port": 70, + "allowed": False, + "cidr": "1.2.3.0/24", + "first_port": 60, + "last_port": 70, "type": "udp" }, # ipv6 { - "allowed": True, - "cidr": "1.2.3.0/24", - "protocol": 41, + "allowed": True, + "cidr": "1.2.3.0/24", + "protocol": 41, "type": "protocol" - }, + }, # Single port { - "allowed": True, - "cidr": "1.2.3.0/24", - "first_port": 30, - "last_port": 30, + "allowed": True, + "cidr": "1.2.3.0/24", + "first_port": 30, + "last_port": 30, "type": "tcp" }, # Icmp { - "allowed": True, - "cidr": "10.0.0.0/8", - "icmp_code": -1, - "icmp_type": -1, + "allowed": True, + "cidr": "10.0.0.0/8", + "icmp_code": -1, + "icmp_type": -1, "type": "icmp" } ] diff --git a/tools/bugs-wiki/search-bugs.py b/tools/bugs-wiki/search-bugs.py index 302e383c4d0..857997e18d3 100755 --- a/tools/bugs-wiki/search-bugs.py +++ b/tools/bugs-wiki/search-bugs.py @@ -6,9 +6,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 diff --git a/tools/bugs-wiki/search-wiki.py b/tools/bugs-wiki/search-wiki.py index 03e145973ac..ae3871aeda0 100755 --- a/tools/bugs-wiki/search-wiki.py +++ b/tools/bugs-wiki/search-wiki.py @@ -6,9 +6,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 diff --git a/tools/devcloud-kvm/devcloud-kvm.py b/tools/devcloud-kvm/devcloud-kvm.py index dd551b58552..37597863808 100644 --- a/tools/devcloud-kvm/devcloud-kvm.py +++ b/tools/devcloud-kvm/devcloud-kvm.py @@ -6,9 +6,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 @@ -17,7 +17,7 @@ # under the License. ''' ############################################################ -# Experimental state of scripts +# Experimental state of scripts # * Need to be reviewed # * Only a sandbox ############################################################ @@ -47,10 +47,10 @@ def describeDevcloudKvmResources(config): z.networktype = 'Advanced' z.guestcidraddress = '10.1.1.0/24' z.localstorageenabled = 'true' - + vpcprovider = provider() vpcprovider.name = 'VpcVirtualRouter' - + pn = physical_network() pn.name = "eth0" pn.vlan = config.get('cloudstack', 'pnet.vlan') @@ -64,7 +64,7 @@ def describeDevcloudKvmResources(config): pn2.tags = ["devcloud-public"] pn2.traffictypes = [traffictype("Public", {"kvm" : "kvm-public"})] pn2.providers.append(vpcprovider) - + z.physical_networks.append(pn) z.physical_networks.append(pn2) @@ -78,7 +78,7 @@ def describeDevcloudKvmResources(config): v = iprange() v.gateway = config.get('cloudstack', 'public.gateway') v.startip = config.get('cloudstack', 'public.vlan.startip') - v.endip = config.get('cloudstack', 'public.vlan.endip') + v.endip = config.get('cloudstack', 'public.vlan.endip') v.netmask = config.get('cloudstack', 'public.netmask') v.vlan = config.get('cloudstack', 'public.vlan') z.ipranges.append(v) diff --git a/tools/marvin/marvin/deployDataCenter.py b/tools/marvin/marvin/deployDataCenter.py index 868768982f7..adc3de5cdd3 100644 --- a/tools/marvin/marvin/deployDataCenter.py +++ b/tools/marvin/marvin/deployDataCenter.py @@ -1109,7 +1109,7 @@ if __name__ == "__main__": 2. Removes a created DataCenter by providing the input configuration file and data center settings file EX: python deployDataCenter.py -i - -r [-l ] + -r [-l ] ''' parser = OptionParser() parser.add_option("-i", "--input", action="store", default=None, dest="input", diff --git a/tools/marvin/marvin/lib/__init__.py b/tools/marvin/marvin/lib/__init__.py index 978b68af62a..13a83393a91 100644 --- a/tools/marvin/marvin/lib/__init__.py +++ b/tools/marvin/marvin/lib/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/lib/ncc.py b/tools/marvin/marvin/lib/ncc.py index f4000cec296..08fc8d1fdcc 100755 --- a/tools/marvin/marvin/lib/ncc.py +++ b/tools/marvin/marvin/lib/ncc.py @@ -151,7 +151,7 @@ class NCC: } res = self.sendCmdToNCC(url, payload) return res - + def addDevicetoServicePackage(self, devicegroup_id, device_ip): url = "http://"+self.nccip+"/admin/v1/devicegroups/"+devicegroup_id+"/devices" payload = {"devices":[{"ref":device_ip }]} diff --git a/tools/marvin/marvin/lib/utils.py b/tools/marvin/marvin/lib/utils.py index f30822ebebd..19ffe34908e 100644 --- a/tools/marvin/marvin/lib/utils.py +++ b/tools/marvin/marvin/lib/utils.py @@ -44,7 +44,7 @@ from marvin.codes import ( def _configure_ssh_credentials(hypervisor): ssh_command = "ssh -i ~/.ssh/id_rsa.cloud -ostricthostkeychecking=no " - + if (str(hypervisor).lower() == 'vmware' or str(hypervisor).lower() == 'hyperv'): ssh_command = "ssh -i /var/cloudstack/management/.ssh/id_rsa -ostricthostkeychecking=no " @@ -436,9 +436,9 @@ def verifyElementInList(inp, toverify, responsevar=None, pos=0): at a given pos @Input: I : Input to be verified whether its a list or not - II : Element to verify whether it exists in the list - III : variable name in response object to verify - default to None, if None, we will verify for the complete + II : Element to verify whether it exists in the list + III : variable name in response object to verify + default to None, if None, we will verify for the complete first element EX: state of response object object IV : Position in the list at which the input element to verify default to 0 @@ -509,7 +509,7 @@ def checkVolumeSize(ssh_handle=None, "%s" %GetDetailExceptionInfo(e)) return [FAILED,GetDetailExceptionInfo(e)] - + def verifyRouterState(apiclient, routerid, allowedstates): """List the router and verify that its state is in allowed states @output: List, containing [Result, Reason] @@ -541,7 +541,7 @@ def wait_until(retry_interval=2, no_of_times=2, callback=None, *callback_args): if callback is None: raise ("Bad value for callback method !") - wait_result = False + wait_result = False for i in range(0,no_of_times): time.sleep(retry_interval) wait_result, return_val = callback(*callback_args) diff --git a/tools/marvin/marvin/lib/vcenter.py b/tools/marvin/marvin/lib/vcenter.py index 5d91cba1ee1..8b793ee7ee2 100644 --- a/tools/marvin/marvin/lib/vcenter.py +++ b/tools/marvin/marvin/lib/vcenter.py @@ -350,7 +350,7 @@ class Vcenter(): out = p3.stdout.read() ssl_thumbprint = out.split('=')[-1].strip() return ssl_thumbprint - + if __name__ == '__main__': vc_object = Vcenter("10.x.x.x", "username", "password") diff --git a/tools/marvin/marvin/misc/build/advanced_env.py b/tools/marvin/marvin/misc/build/advanced_env.py index 659480056af..969cd62f7b6 100644 --- a/tools/marvin/marvin/misc/build/advanced_env.py +++ b/tools/marvin/marvin/misc/build/advanced_env.py @@ -20,7 +20,7 @@ ''' ############################################################ -# Experimental state of scripts +# Experimental state of scripts # * Need to be reviewed # * Only a sandbox ############################################################ @@ -52,13 +52,13 @@ def describeResources(config): z.networktype = 'Advanced' z.guestcidraddress = '10.1.1.0/24' z.securitygroupenabled = 'false' - + vpcprovider = provider() vpcprovider.name = 'VpcVirtualRouter' lbprovider = provider() lbprovider.name = 'InternalLbVm' - + pn = physical_network() pn.name = "z0-pnet" pn.traffictypes = [traffictype("Guest"), traffictype("Management"), traffictype("Public")] @@ -66,7 +66,7 @@ def describeResources(config): pn.vlan = config.get('cloudstack', 'z0.guest.vlan') pn.providers.append(vpcprovider) pn.providers.append(lbprovider) - + z.physical_networks.append(pn) p = pod() @@ -79,7 +79,7 @@ def describeResources(config): v = iprange() v.gateway = config.get('cloudstack', 'z0p0.public.gateway') v.startip = config.get('cloudstack', 'z0p0.public.vlan.startip') - v.endip = config.get('cloudstack', 'z0p0.public.vlan.endip') + v.endip = config.get('cloudstack', 'z0p0.public.vlan.endip') v.netmask = config.get('cloudstack', 'z0p0.public.netmask') v.vlan = config.get('cloudstack', 'z0p0.public.vlan') z.ipranges.append(v) @@ -130,7 +130,7 @@ def describeResources(config): v1 = iprange() v1.gateway = config.get('cloudstack', 'z0p1.public.gateway') v1.startip = config.get('cloudstack', 'z0p1.public.vlan.startip') - v1.endip = config.get('cloudstack', 'z0p1.public.vlan.endip') + v1.endip = config.get('cloudstack', 'z0p1.public.vlan.endip') v1.netmask = config.get('cloudstack', 'z0p1.public.netmask') v1.vlan = config.get('cloudstack', 'z0p1.public.vlan') z.ipranges.append(v1) diff --git a/tools/marvin/marvin/misc/build/bashUtils.py b/tools/marvin/marvin/misc/build/bashUtils.py index c07c9b3bb71..a428315f3ef 100644 --- a/tools/marvin/marvin/misc/build/bashUtils.py +++ b/tools/marvin/marvin/misc/build/bashUtils.py @@ -28,7 +28,7 @@ import select class wget(object): def __init__(self, filename, url, path=None): pass - + def background(self, handler): pass @@ -44,7 +44,7 @@ class remoteSSHClient(object): self.ssh.connect(str(host),int(port), user, passwd) except paramiko.SSHException as sshex: logging.debug(repr(sshex)) - + def execute(self, command): stdin, stdout, stderr = self.ssh.exec_command(command) output = stdout.readlines() @@ -54,13 +54,13 @@ class remoteSSHClient(object): if errors is not None and len(errors) > 0: for error in errors: results.append(error.rstrip()) - + else: for strOut in output: results.append(strOut.rstrip()) - + return results - + def execute_buffered(self, command, bufsize=512): transport = self.ssh.get_transport() channel = transport.open_session() @@ -71,9 +71,9 @@ class remoteSSHClient(object): if len(rl) > 0: logging.debug(channel.recv(bufsize)) except paramiko.SSHException as e: - logging.debug(repr(e)) + logging.debug(repr(e)) + - def scp(self, srcFile, destPath): transport = paramiko.Transport((self.host, int(self.port))) transport.connect(username = self.user, password=self.passwd) @@ -110,24 +110,24 @@ class bash: alarm(0) except Alarm: os.kill(self.process.pid, SIGKILL) - + self.success = self.process.returncode == 0 except: pass - if not self.success: + if not self.success: logging.debug("Failed to execute:" + self.getErrMsg()) def isSuccess(self): return self.success - + def getStdout(self): try: return self.stdout.strip("\n") except AttributeError: return "" - + def getLines(self): return self.stdout.split("\n") @@ -136,11 +136,11 @@ class bash: return self.stderr.strip("\n") except AttributeError: return "" - + def getErrMsg(self): if self.isSuccess(): return "" - + if self.getStderr() is None or self.getStderr() == "": return self.getStdout() else: diff --git a/tools/marvin/marvin/misc/build/buildGenerator.py b/tools/marvin/marvin/misc/build/buildGenerator.py index bb92b7f32e9..8ea9baa5425 100644 --- a/tools/marvin/marvin/misc/build/buildGenerator.py +++ b/tools/marvin/marvin/misc/build/buildGenerator.py @@ -27,7 +27,7 @@ import os class BuildGenerator(object): """ - 1. Create a job on Hudson/Jenkins + 1. Create a job on Hudson/Jenkins 2. Poll for job status 3. Fetch latest successful job 4. Resolve Job to Repo URL/fetch artifact @@ -83,16 +83,16 @@ class BuildGenerator(object): while self.jobclient.is_queued_or_running(): logging.debug("Waiting %ss for running/queued build to complete"%wait) delay(wait) - + self.jobclient.invoke(params=self.parseConfigParams()) self.build_number = self.jobclient.get_last_buildnumber() self.paramlist = self.parseConfigParams() logging.info("Started build : %d"%self.jobclient.get_last_buildnumber()) - + while self.jobclient.is_running(): logging.debug("Polling build status in %ss"%wait) delay(wait) - + logging.info("Completed build : %d"%self.jobclient.get_last_buildnumber()) logging.debug("Last Good Build : %d, Last Build : %d, Our Build : \ %d"%(self.jobclient.get_last_good_buildnumber(), \ @@ -113,7 +113,7 @@ class BuildGenerator(object): def getLastGoodBuild(self): return self.jobclient.get_build(self.build_number) - + def getBuildWithNumber(self, number): if number > 0: bld = self.jobclient.get_build(number) @@ -130,7 +130,7 @@ class BuildGenerator(object): else: self.resolveRepoPath() return self.getTarballName() - + def getArtifacts(self): artifact_dict = self.getLastGoodBuild().get_artifact_dict() if artifact_dict is not None: @@ -138,17 +138,17 @@ class BuildGenerator(object): def sift(self, dic): return dic['name'], dic['value'] - + def getBuildParamList(self, bld): params = bld.get_actions()['parameters'] return dict(list(map(self.sift, params))) - + def resolveRepoPath(self): - tarball_list = ['CloudStack-' , - self.getBuildParamValue('PACKAGE_VERSION') , - '-0.', str(self.build_number) , '-' , - self.getBuildParamValue('DO_DISTRO_PACKAGES') , - '.tar.gz'] + tarball_list = ['CloudStack-' , + self.getBuildParamValue('PACKAGE_VERSION') , + '-0.', str(self.build_number) , '-' , + self.getBuildParamValue('DO_DISTRO_PACKAGES') , + '.tar.gz'] self.tarball = ''.join(tarball_list) @@ -158,7 +158,7 @@ class BuildGenerator(object): self.tarball) logging.debug("resolved last good build generated by us to: %s"%path) return path - + if __name__ == '__main__': # hudson = BuildGenerator(job="marvin") # hudson.readBuildConfiguration('build.cfg') diff --git a/tools/marvin/marvin/misc/build/configure.py b/tools/marvin/marvin/misc/build/configure.py index 07dae947d36..c88a0c1ae3f 100644 --- a/tools/marvin/marvin/misc/build/configure.py +++ b/tools/marvin/marvin/misc/build/configure.py @@ -70,13 +70,13 @@ def initLogging(logFile=None, lvl=logging.INFO): if logFile is None: logging.basicConfig(level=lvl, \ format="'%(asctime)-6s: %(name)s \ - (%(threadName)s) - %(levelname)s - %(message)s'") - else: + (%(threadName)s) - %(levelname)s - %(message)s'") + else: logging.basicConfig(filename=logFile, level=lvl, \ format="'%(asctime)-6s: %(name)s \ - (%(threadName)s) - %(levelname)s - %(message)s'") + (%(threadName)s) - %(levelname)s - %(message)s'") except: - logging.basicConfig(level=lvl) + logging.basicConfig(level=lvl) def mkdirs(path): dir = bash("mkdir -p %s" % path) @@ -148,7 +148,7 @@ def mountAndClean(host, path): mnt = bash("mount -t nfs %s:%s %s" % (host, path, mnt_path)) erase = bash("rm -rf %s/*" % mnt_path) umnt = bash("umount %s" % mnt_path) - + def cleanPrimaryStorage(cscfg): """ Clean all the NFS primary stores and prepare them for the next run @@ -181,7 +181,7 @@ def seedSecondaryStorage(cscfg, hypervisor): def refreshHosts(cscfg, hypervisor="xenserver", profile="xenserver602"): """ - Removes cobbler system from previous run. + Removes cobbler system from previous run. Creates a new system for current run. Ipmi boots from PXE - default to Xenserver profile """ @@ -240,7 +240,7 @@ def _isPortListening(host, port, timeout=120): timeout = timeout - 5 if tn is None: logging.error("No service listening on port %s:%d"%(host, port)) - return False + return False else: logging.info("Unrecognizable service up on %s:%d"%(host, port)) return True @@ -342,10 +342,10 @@ def prepareManagementServer(mgmt_host): return else: raise Exception("Reqd service for integration port on management server %s is not open. Aborting"%mgmt_host) - + def init(lvl=logging.INFO): initLogging(logFile=None, lvl=lvl) - + if __name__ == '__main__': parser = ArgumentParser() parser.add_argument("-l", "--logging", action="store", default="INFO", @@ -366,7 +366,7 @@ if __name__ == '__main__': init(logging.INFO) else: init(logging.INFO) - + if options.system is None: logging.error("no environment properties given. exiting") sys.exit(-1) @@ -401,7 +401,7 @@ if __name__ == '__main__': waitForHostReady(hosts) delay(30) - # Re-check because ssh connect works soon as post-installation occurs. But + # Re-check because ssh connect works soon as post-installation occurs. But # server is rebooted after post-installation. Assuming the server is up is # wrong in these cases. To avoid this we will check again before continuing # to add the hosts to cloudstack diff --git a/tools/marvin/marvin/misc/build/restartMgmt.py b/tools/marvin/marvin/misc/build/restartMgmt.py index ab5c0fc9e33..e82ae2b0e3f 100644 --- a/tools/marvin/marvin/misc/build/restartMgmt.py +++ b/tools/marvin/marvin/misc/build/restartMgmt.py @@ -29,7 +29,7 @@ if __name__ == '__main__': parser.add_option("-c", "--config", action="store", default="xen.cfg", dest="config", help="the path where the server configurations is stored") (options, args) = parser.parse_args() - + if options.config is None: raise diff --git a/tools/marvin/marvin/misc/build/testSetupSuccess.py b/tools/marvin/marvin/misc/build/testSetupSuccess.py index 1bf25105d96..6379f69100b 100644 --- a/tools/marvin/marvin/misc/build/testSetupSuccess.py +++ b/tools/marvin/marvin/misc/build/testSetupSuccess.py @@ -30,11 +30,11 @@ class TestSetupSuccess(cloudstackTestCase): @classmethod def setUpClass(cls): cls.apiClient = super(TestSetupSuccess, cls).getClsTestClient().getApiClient() - + zones = listZones.listZonesCmd() cls.zones_list = cls.apiClient.listZones(zones) cls.retry = 50 - + def test_systemVmReady(self): """ system VMs need to be ready and Running for each zone in cloudstack @@ -54,7 +54,7 @@ class TestSetupSuccess(cloudstackTestCase): retry = retry - 1 delay(60) #wait a minute for retry self.assertNotEqual(retry, 0, "system VMs not Running in zone %s"%z.name) - + def test_templateBuiltInReady(self): """ built-in templates CentOS to be ready @@ -75,7 +75,7 @@ class TestSetupSuccess(cloudstackTestCase): retry = retry - 1 delay(60) #wait a minute for retry self.assertNotEqual(retry, 0, "builtIn templates not ready in zone %s"%z.name) - + @classmethod def tearDownClass(cls): pass diff --git a/tools/marvin/marvin/misc/build/xunitmp/setup.py b/tools/marvin/marvin/misc/build/xunitmp/setup.py index f27cbfda4ee..d8df2e2657a 100644 --- a/tools/marvin/marvin/misc/build/xunitmp/setup.py +++ b/tools/marvin/marvin/misc/build/xunitmp/setup.py @@ -39,7 +39,7 @@ setup( py_modules = ['xunitmultiprocess'], zip_safe = False, - + entry_points = { 'nose.plugins': ['xunitmultiprocess = xunitmultiprocess:Xunitmp'] }, diff --git a/tools/marvin/marvin/misc/build/xunitmp/xunitmultiprocess.py b/tools/marvin/marvin/misc/build/xunitmp/xunitmultiprocess.py index 5bbbb69c1f8..76d42286b8c 100644 --- a/tools/marvin/marvin/misc/build/xunitmp/xunitmultiprocess.py +++ b/tools/marvin/marvin/misc/build/xunitmp/xunitmultiprocess.py @@ -137,7 +137,7 @@ class Xunitmp(Plugin): taken = time() - self._timer else: # test died before it ran (probably error in setup()) - # or success/failure added before test started probably + # or success/failure added before test started probably # due to custom TestResult munging taken = 0.0 return taken @@ -215,7 +215,7 @@ class Xunitmp(Plugin): self.xunitstream.append(xml) except Exception as e: print('xunitmultiprocess add stream len=%d,%s'%(len(xml),str(e))) - + def addError(self, test, err, capt=None): """Add error output to Xunit report. """ diff --git a/tools/marvin/marvin/sandbox/__init__.py b/tools/marvin/marvin/sandbox/__init__.py index 57823fcc162..a595c844418 100644 --- a/tools/marvin/marvin/sandbox/__init__.py +++ b/tools/marvin/marvin/sandbox/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/advanced/__init__.py b/tools/marvin/marvin/sandbox/advanced/__init__.py index 57823fcc162..a595c844418 100644 --- a/tools/marvin/marvin/sandbox/advanced/__init__.py +++ b/tools/marvin/marvin/sandbox/advanced/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/advanced/advanced_env.py b/tools/marvin/marvin/sandbox/advanced/advanced_env.py index 8b6c3978b91..b94a9644f89 100644 --- a/tools/marvin/marvin/sandbox/advanced/advanced_env.py +++ b/tools/marvin/marvin/sandbox/advanced/advanced_env.py @@ -6,9 +6,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 @@ -17,7 +17,7 @@ # under the License. ''' ############################################################ -# Experimental state of scripts +# Experimental state of scripts # * Need to be reviewed # * Only a sandbox ############################################################ @@ -47,13 +47,13 @@ def describeResources(config): z.networktype = 'Advanced' z.guestcidraddress = '10.1.1.0/24' z.securitygroupenabled = 'false' - + vpcprovider = provider() vpcprovider.name = 'VpcVirtualRouter' lbprovider = provider() lbprovider.name = 'InternalLbVm' - + pn = physicalNetwork() pn.name = "Sandbox-pnet" pn.vlan = config.get('cloudstack', 'pnet.vlan') @@ -73,7 +73,7 @@ def describeResources(config): pn2.isolationmethods = ["VLAN"] pn2.providers.append(vpcprovider) pn2.providers.append(lbprovider) - + z.physical_networks.append(pn) z.physical_networks.append(pn2) @@ -87,7 +87,7 @@ def describeResources(config): v = iprange() v.gateway = config.get('cloudstack', 'public.gateway') v.startip = config.get('cloudstack', 'public.vlan.startip') - v.endip = config.get('cloudstack', 'public.vlan.endip') + v.endip = config.get('cloudstack', 'public.vlan.endip') v.netmask = config.get('cloudstack', 'public.netmask') v.vlan = config.get('cloudstack', 'public.vlan') z.ipranges.append(v) diff --git a/tools/marvin/marvin/sandbox/advancedsg/__init__.py b/tools/marvin/marvin/sandbox/advancedsg/__init__.py index 57823fcc162..a595c844418 100644 --- a/tools/marvin/marvin/sandbox/advancedsg/__init__.py +++ b/tools/marvin/marvin/sandbox/advancedsg/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/advancedsg/advancedsg_env.py b/tools/marvin/marvin/sandbox/advancedsg/advancedsg_env.py index e5cc22a317d..00b4a8b0a31 100644 --- a/tools/marvin/marvin/sandbox/advancedsg/advancedsg_env.py +++ b/tools/marvin/marvin/sandbox/advancedsg/advancedsg_env.py @@ -6,9 +6,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 @@ -17,7 +17,7 @@ # under the License. ''' ############################################################ -# Experimental state of scripts +# Experimental state of scripts # * Need to be reviewed # * Only a sandbox ############################################################ @@ -46,11 +46,11 @@ def describeResources(config): z.name = 'Sandbox-%s'%(config.get('cloudstack', 'hypervisor')) z.networktype = 'Advanced' z.securitygroupenabled = 'true' - + sgprovider = provider() sgprovider.broadcastdomainrange = 'ZONE' sgprovider.name = 'SecurityGroupProvider' - + pn = physicalNetwork() pn.name = "Sandbox-pnet" pn.tags = ["cloud-simulator-pnet"] @@ -71,7 +71,7 @@ def describeResources(config): v = iprange() v.gateway = config.get('cloudstack', 'guest.gateway') v.startip = config.get('cloudstack', 'guest.vlan.startip') - v.endip = config.get('cloudstack', 'guest.vlan.endip') + v.endip = config.get('cloudstack', 'guest.vlan.endip') v.netmask = config.get('cloudstack', 'guest.netmask') v.vlan = config.get('cloudstack', 'guest.vlan') z.ipranges.append(v) diff --git a/tools/marvin/marvin/sandbox/basic/__init__.py b/tools/marvin/marvin/sandbox/basic/__init__.py index 57823fcc162..a595c844418 100644 --- a/tools/marvin/marvin/sandbox/basic/__init__.py +++ b/tools/marvin/marvin/sandbox/basic/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/basic/basic_env.py b/tools/marvin/marvin/sandbox/basic/basic_env.py index 32b7dd58e13..c6580a5c7a9 100644 --- a/tools/marvin/marvin/sandbox/basic/basic_env.py +++ b/tools/marvin/marvin/sandbox/basic/basic_env.py @@ -6,9 +6,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 @@ -18,7 +18,7 @@ ''' ############################################################ -# Experimental state of scripts +# Experimental state of scripts # * Need to be reviewed # * Only a sandbox ############################################################ @@ -47,17 +47,17 @@ def describeResources(config): z.name = 'Sandbox-%s'%(config.get('cloudstack', 'hypervisor')) z.networktype = 'Basic' z.securitygroupenabled = 'true' - + sgprovider = provider() sgprovider.broadcastdomainrange = 'Pod' sgprovider.name = 'SecurityGroupProvider' - + pn = physicalNetwork() pn.name = "Sandbox-pnet" pn.traffictypes = [trafficType("Guest"), trafficType("Management")] pn.isolationmethods = ["L3"] pn.providers.append(sgprovider) - + z.physical_networks.append(pn) p = pod() @@ -70,7 +70,7 @@ def describeResources(config): v = iprange() v.gateway = config.get('cloudstack', 'public.gateway') v.startip = config.get('cloudstack', 'public.vlan.startip') - v.endip = config.get('cloudstack', 'public.vlan.endip') + v.endip = config.get('cloudstack', 'public.vlan.endip') v.netmask = config.get('cloudstack', 'public.netmask') p.guestIpRanges.append(v) diff --git a/tools/marvin/marvin/sandbox/demo/__init__.py b/tools/marvin/marvin/sandbox/demo/__init__.py index 00ae6c00d2e..245692337bc 100644 --- a/tools/marvin/marvin/sandbox/demo/__init__.py +++ b/tools/marvin/marvin/sandbox/demo/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/demo/live/__init__.py b/tools/marvin/marvin/sandbox/demo/live/__init__.py index 00ae6c00d2e..245692337bc 100644 --- a/tools/marvin/marvin/sandbox/demo/live/__init__.py +++ b/tools/marvin/marvin/sandbox/demo/live/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/demo/live/testSshDeployVM.py b/tools/marvin/marvin/sandbox/demo/live/testSshDeployVM.py index 38351861de7..8c465b941ad 100644 --- a/tools/marvin/marvin/sandbox/demo/live/testSshDeployVM.py +++ b/tools/marvin/marvin/sandbox/demo/live/testSshDeployVM.py @@ -6,9 +6,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 @@ -20,13 +20,13 @@ import marvin from marvin.cloudstackTestCase import * -from marvin.sshClient import SshClient +from marvin.sshClient import SshClient @UserName('demo', 'ROOT', '0') class TestSshDeployVm(cloudstackTestCase): """ - This test deploys a virtual machine into a user account + This test deploys a virtual machine into a user account using the small service offering and builtin template """ def setUp(self): @@ -49,7 +49,7 @@ class TestSshDeployVm(cloudstackTestCase): deploying on CloudStack. We will be assuming a single zone is available and is configured and all templates are Ready - The hardcoded values are used only for brevity. + The hardcoded values are used only for brevity. """ deployVmCmd = deployVirtualMachine.deployVirtualMachineCmd() deployVmCmd.zoneid = self.zone.uuid @@ -82,7 +82,7 @@ class TestSshDeployVm(cloudstackTestCase): self.assertEqual(vm.state, "Running", "Check if VM has reached \ a state of running") - # SSH login and compare hostname + # SSH login and compare hostname self.debug("Attempting to SSH into %s over %s of %s"%(nattedip, "22", vm.name)) ssh_client = SshClient(nattedip, "22", "root", "password") stdout = ssh_client.execute("hostname") @@ -122,7 +122,7 @@ class TestSshDeployVm(cloudstackTestCase): raise e finally: self.debug("Successfully programmed PF rule for :%s"%snatip) - return snatip + return snatip def tearDown(self): self.testClient.close() diff --git a/tools/marvin/marvin/sandbox/demo/simulator/__init__.py b/tools/marvin/marvin/sandbox/demo/simulator/__init__.py index 57823fcc162..a595c844418 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/__init__.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py b/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py index 68fd828a47a..2520cf467c7 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/simulator_setup.py @@ -6,9 +6,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 @@ -42,17 +42,17 @@ def describeResources(config): z.networktype = 'Advanced' z.guestcidraddress = '10.1.1.0/24' z.securitygroupenabled = 'false' - + vpcprovider = provider() vpcprovider.name = 'VpcVirtualRouter' - + pn = physicalNetwork() pn.name = "Sandbox-pnet" pn.traffictypes = [trafficType("Guest"), trafficType("Management"), trafficType("Public")] pn.isolationmethods = ["VLAN"] pn.providers.append(vpcprovider) pn.vlan = config.get('cloudstack', 'zone.vlan') - + z.physical_networks.append(pn) p = pod() @@ -65,7 +65,7 @@ def describeResources(config): v = iprange() v.gateway = config.get('cloudstack', 'public.gateway') v.startip = config.get('cloudstack', 'public.vlan.startip') - v.endip = config.get('cloudstack', 'public.vlan.endip') + v.endip = config.get('cloudstack', 'public.vlan.endip') v.netmask = '255.255.255.0' v.vlan = config.get('cloudstack', 'public.vlan') z.ipranges.append(v) @@ -80,7 +80,7 @@ def describeResources(config): h.password = 'password' h.url = 'http://%s'%(config.get('cloudstack', 'host')) c.hosts.append(h) - + h = host() h.username = 'root' h.password = 'password' diff --git a/tools/marvin/marvin/sandbox/demo/simulator/testcase/__init__.py b/tools/marvin/marvin/sandbox/demo/simulator/testcase/__init__.py index 57823fcc162..a595c844418 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/testcase/__init__.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/testcase/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/__init__.py b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/__init__.py index 57823fcc162..a595c844418 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/__init__.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/__init__.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY diff --git a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/base.py b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/base.py index f3c9c241f02..17c843e743d 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/base.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/base.py @@ -6,9 +6,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 @@ -177,9 +177,9 @@ class VirtualMachine: domainid=None, networkids=None, serviceofferingid=None, securitygroupids=None, mode='basic'): """Create the instance""" - + cmd = deployVirtualMachine.deployVirtualMachineCmd() - + if serviceofferingid: cmd.serviceofferingid = serviceofferingid elif "serviceoffering" in services: @@ -210,18 +210,18 @@ class VirtualMachine: if "diskoffering" in services: cmd.diskofferingid = services["diskoffering"] - + if securitygroupids: cmd.securitygroupids = [str(sg_id) for sg_id in securitygroupids] - + if "userdata" in services: cmd.userdata = base64.b64encode(services["userdata"]) - + virtual_machine = apiclient.deployVirtualMachine(cmd) - + # VM should be in Running state after deploy timeout = 10 - while True: + while True: vm_status = VirtualMachine.list( apiclient, id=virtual_machine.id @@ -231,9 +231,9 @@ class VirtualMachine: break elif timeout == 0: raise Exception( - "TimeOutException: Failed to start VM (ID: %s)" % + "TimeOutException: Failed to start VM (ID: %s)" % virtual_machine.id) - + time.sleep(10) timeout = timeout -1 @@ -329,17 +329,17 @@ class Volume: cmd.diskofferingid = services["customdiskofferingid"] cmd.size = services["customdisksize"] cmd.zoneid = services["zoneid"] - + if account: cmd.account = account else: cmd.account = services["account"] - + if domainid: cmd.domainid = domainid else: cmd.domainid = services["domainid"] - + return Volume(apiclient.createVolume(cmd).__dict__) @classmethod @@ -428,7 +428,7 @@ class Template: cmd.ispublic = services["ispublic"] if "ispublic" in services else False cmd.isextractable = services["isextractable"] if "isextractable" in services else False cmd.passwordenabled = services["passwordenabled"] if "passwordenabled" in services else False - + if volumeid: cmd.volumeid = volumeid @@ -443,7 +443,7 @@ class Template: @classmethod def register(cls, apiclient, services, zoneid=None, account=None, domainid=None): """Create template from URL""" - + #Create template from Virtual machine and Volume ID cmd = registerTemplate.registerTemplateCmd() cmd.displaytext = services["displaytext"] @@ -452,7 +452,7 @@ class Template: cmd.hypervisor = services["hypervisor"] cmd.ostypeid = services["ostypeid"] cmd.url = services["url"] - + if zoneid: cmd.zoneid = zoneid else: @@ -467,10 +467,10 @@ class Template: if domainid: cmd.domainid = domainid - + # Register Template template = apiclient.registerTemplate(cmd) - + if isinstance(template, list): return Template(template[0].__dict__) @@ -481,7 +481,7 @@ class Template: cmd = createTemplate.createTemplateCmd() cmd.displaytext = services["displaytext"] cmd.name = "-".join([ - services["name"], + services["name"], random_gen() ]) if random_name else services["name"] cmd.ostypeid = services["ostypeid"] @@ -490,7 +490,7 @@ class Template: def delete(self, apiclient): """Delete Template""" - + cmd = deleteTemplate.deleteTemplateCmd() cmd.id = self.id apiclient.deleteTemplate(cmd) @@ -499,7 +499,7 @@ class Template: """Download Template""" #Sleep to ensure template is in proper state before download time.sleep(interval) - + while True: template_response = Template.list( apiclient, @@ -508,15 +508,15 @@ class Template: templatefilter='self' ) if isinstance(template_response, list): - + template = template_response[0] # If template is ready, # template.status = Download Complete # Downloading - x% Downloaded - # Error - Any other string + # Error - Any other string if template.status == 'Download Complete': break - + elif 'Downloaded' in template.status: time.sleep(interval) @@ -525,12 +525,12 @@ class Template: elif timeout == 0: break - + else: time.sleep(interval) timeout = timeout - 1 return - + @classmethod def list(cls, apiclient, **kwargs): """List all templates matching criteria""" @@ -556,7 +556,7 @@ class Iso: cmd.ostypeid = services["ostypeid"] cmd.url = services["url"] cmd.zoneid = services["zoneid"] - + if "isextractable" in services: cmd.isextractable = services["isextractable"] if "isfeatured" in services: @@ -570,7 +570,7 @@ class Iso: cmd.domainid = domainid # Register ISO iso = apiclient.registerIso(cmd) - + if iso: return Iso(iso[0].__dict__) @@ -590,8 +590,8 @@ class Iso: cmd = listIsos.listIsosCmd() cmd.id = self.id iso_response = apiclient.listIsos(cmd) - - if isinstance(iso_response, list): + + if isinstance(iso_response, list): response = iso_response[0] # Again initialize timeout to avoid listISO failure timeout = 5 @@ -677,7 +677,7 @@ class NATRule: cmd.publicport = services["publicport"] cmd.protocol = services["protocol"] cmd.virtualmachineid = virtual_machine.id - + return NATRule(apiclient.createPortForwardingRule(cmd).__dict__) def delete(self, apiclient): @@ -694,7 +694,7 @@ class NATRule: cmd = listPortForwardingRules.listPortForwardingRulesCmd() [setattr(cmd, k, v) for k, v in list(kwargs.items())] return(apiclient.listPortForwardingRules(cmd)) - + class StaticNATRule: """Manage Static NAT rule""" @@ -705,22 +705,22 @@ class StaticNATRule: @classmethod def create(cls, apiclient, services, ipaddressid=None): """Creates static ip forwarding rule""" - + cmd = createIpForwardingRule.createIpForwardingRuleCmd() cmd.protocol = services["protocol"] cmd.startport = services["startport"] - + if "endport" in services: cmd.endport = services["endport"] - + if "cidrlist" in services: cmd.cidrlist = services["cidrlist"] - + if ipaddressid: cmd.ipaddressid = ipaddressid elif "ipaddressid" in services: cmd.ipaddressid = services["ipaddressid"] - + return StaticNATRule(apiclient.createIpForwardingRule(cmd).__dict__) def delete(self, apiclient): @@ -737,26 +737,26 @@ class StaticNATRule: cmd = listIpForwardingRules.listIpForwardingRulesCmd() [setattr(cmd, k, v) for k, v in list(kwargs.items())] return(apiclient.listIpForwardingRules(cmd)) - + @classmethod def enable(cls, apiclient, ipaddressid, virtualmachineid): """Enables Static NAT rule""" - + cmd = enableStaticNat.enableStaticNatCmd() cmd.ipaddressid = ipaddressid cmd.virtualmachineid = virtualmachineid apiclient.enableStaticNat(cmd) return - + @classmethod def disable(cls, apiclient, ipaddressid, virtualmachineid): """Disables Static NAT rule""" - + cmd = disableStaticNat.disableStaticNatCmd() cmd.ipaddressid = ipaddressid apiclient.disableStaticNat(cmd) return - + class FireWallRule: """Manage Firewall rule""" @@ -963,12 +963,12 @@ class Cluster: cmd = addCluster.addClusterCmd() cmd.clustertype = services["clustertype"] cmd.hypervisor = services["hypervisor"] - + if zoneid: cmd.zoneid = zoneid else: cmd.zoneid = services["zoneid"] - + if podid: cmd.podid = podid else: @@ -1010,17 +1010,17 @@ class Host: @classmethod def create(cls, apiclient, cluster, services, zoneid=None, podid=None): """Create Host in cluster""" - + cmd = addHost.addHostCmd() cmd.hypervisor = services["hypervisor"] cmd.url = services["url"] cmd.clusterid = cluster.id - + if zoneid: cmd.zoneid = zoneid else: cmd.zoneid = services["zoneid"] - + if podid: cmd.podid = podid else: @@ -1032,10 +1032,10 @@ class Host: cmd.username = services["username"] if "password" in services: cmd.password = services["password"] - + # Add host host = apiclient.addHost(cmd) - + if isinstance(host, list): return Host(host[0].__dict__) @@ -1080,18 +1080,18 @@ class StoragePool: cmd = createStoragePool.createStoragePoolCmd() cmd.name = services["name"] - + if podid: cmd.podid = podid else: cmd.podid = services["podid"] - + cmd.url = services["url"] if clusterid: cmd.clusterid = clusterid elif "clusterid" in services: cmd.clusterid = services["clusterid"] - + if zoneid: cmd.zoneid = zoneid else: @@ -1254,13 +1254,13 @@ class Zone: def update(self, apiclient, **kwargs): """Update the zone""" - + cmd = updateZone.updateZoneCmd() cmd.id = self.id [setattr(cmd, k, v) for k, v in list(kwargs.items())] return apiclient.updateZone(cmd) - - + + @classmethod def list(cls, apiclient, **kwargs): """List all Zones matching criteria""" @@ -1314,7 +1314,7 @@ class PublicIpRange: @classmethod def create(cls, apiclient, services): """Create VlanIpRange""" - + cmd = createVlanIpRange.createVlanIpRangeCmd() cmd.gateway = services["gateway"] cmd.netmask = services["netmask"] @@ -1365,7 +1365,7 @@ class SecondaryStorage: cmd = deleteHost.deleteHostCmd() cmd.id = self.id apiclient.deleteHost(cmd) - + class SecurityGroup: """Manage Security Groups""" @@ -1386,7 +1386,7 @@ class SecurityGroup: cmd.domainid=domainid if description: cmd.description=description - + return SecurityGroup(apiclient.createSecurityGroup(cmd).__dict__) def delete(self, apiclient): @@ -1395,38 +1395,38 @@ class SecurityGroup: cmd = deleteSecurityGroup.deleteSecurityGroupCmd() cmd.id = self.id apiclient.deleteSecurityGroup(cmd) - + def authorize(self, apiclient, services, account=None, domainid=None): """Authorize Ingress Rule""" - + cmd=authorizeSecurityGroupIngress.authorizeSecurityGroupIngressCmd() - + if domainid: cmd.domainid = domainid if account: cmd.account = account - + cmd.securitygroupid=self.id cmd.protocol=services["protocol"] - + if services["protocol"] == 'ICMP': cmd.icmptype = -1 cmd.icmpcode = -1 else: cmd.startport = services["startport"] cmd.endport = services["endport"] - + cmd.cidrlist = services["cidrlist"] return (apiclient.authorizeSecurityGroupIngress(cmd).__dict__) - + def revoke(self, apiclient, id): """Revoke ingress rule""" - + cmd=revokeSecurityGroupIngress.revokeSecurityGroupIngressCmd() cmd.id=id return apiclient.revokeSecurityGroupIngress(cmd) - + @classmethod def list(cls, apiclient, **kwargs): """Lists all security groups.""" diff --git a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/common.py b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/common.py index 861fd719e2a..459d0bfaaaa 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/common.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/common.py @@ -6,9 +6,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 @@ -36,13 +36,13 @@ def get_domain(apiclient, services=None): if services: if "domainid" in services: cmd.id = services["domainid"] - + domains = apiclient.listDomains(cmd) - + if isinstance(domains, list): return domains[0] else: - raise Exception("Failed to find specified domain.") + raise Exception("Failed to find specified domain.") def get_zone(apiclient, services=None): "Returns a default zone" @@ -51,13 +51,13 @@ def get_zone(apiclient, services=None): if services: if "zoneid" in services: cmd.id = services["zoneid"] - + zones = apiclient.listZones(cmd) - + if isinstance(zones, list): return zones[0] else: - raise Exception("Failed to find specified zone.") + raise Exception("Failed to find specified zone.") def get_pod(apiclient, zoneid, services=None): "Returns a default pod for specified zone" @@ -68,13 +68,13 @@ def get_pod(apiclient, zoneid, services=None): if services: if "podid" in services: cmd.id = services["podid"] - + pods = apiclient.listPods(cmd) - + if isinstance(pods, list): return pods[0] else: - raise Exception("Exception: Failed to find specified pod.") + raise Exception("Exception: Failed to find specified pod.") def get_template(apiclient, zoneid, ostypeid=12, services=None): "Returns a template" @@ -92,9 +92,9 @@ def get_template(apiclient, zoneid, ostypeid=12, services=None): for template in list_templates: if template.ostypeid == ostypeid: return template - + raise Exception("Exception: Failed to find template with OSTypeID: %s" % - ostypeid) + ostypeid) return def download_systemplates_sec_storage(server, services): @@ -185,7 +185,7 @@ def wait_for_ssvms(apiclient, zoneid, podid, interval=60): def download_builtin_templates(apiclient, zoneid, hypervisor, host, linklocalip, interval=60): """After setup wait till builtin templates are downloaded""" - + # Change IPTABLES Rules result = get_process_status( host["ipaddress"], @@ -203,10 +203,10 @@ def download_builtin_templates(apiclient, zoneid, hypervisor, host, linklocalip, zoneid=zoneid, templatefilter='self' ) - + if not isinstance(list_template_response, list): raise Exception("Failed to download BUILTIN templates") - + # Ensure all BUILTIN templates are downloaded templateid = None for template in list_template_response: @@ -227,16 +227,16 @@ def download_builtin_templates(apiclient, zoneid, hypervisor, host, linklocalip, # If template is ready, # template.status = Download Complete # Downloading - x% Downloaded - # Error - Any other string + # Error - Any other string if template.status == 'Download Complete': break - + elif 'Downloaded' in template.status: time.sleep(interval) elif 'Installing' not in template.status: raise Exception("ErrorInDownload") - + return def update_resource_limit(apiclient, resourcetype, account=None, domainid=None, diff --git a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/utils.py b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/utils.py index 0c7ca497ded..bc3852b2c59 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/utils.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/testcase/libs/utils.py @@ -6,9 +6,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 @@ -101,12 +101,12 @@ def get_process_status(hostip, port, username, password, linklocalip, process): # Ensure the SSH login is successful while True: res = ssh.execute(ssh_command) - + if res[0] != "Host key verification failed.": break elif timeout == 0: break - + time.sleep(5) timeout = timeout - 1 return res diff --git a/tools/marvin/marvin/sandbox/demo/simulator/testcase/test_vm_life_cycle.py b/tools/marvin/marvin/sandbox/demo/simulator/testcase/test_vm_life_cycle.py index 2e612021f6c..c05eda1d143 100644 --- a/tools/marvin/marvin/sandbox/demo/simulator/testcase/test_vm_life_cycle.py +++ b/tools/marvin/marvin/sandbox/demo/simulator/testcase/test_vm_life_cycle.py @@ -6,9 +6,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 @@ -47,12 +47,12 @@ class Services: "firstname": "Test", "lastname": "User", "username": "test", - # Random characters are appended in create account to + # Random characters are appended in create account to # ensure unique username generated each time "password": "password", }, "small": - # Create a small virtual machine instance with disk offering + # Create a small virtual machine instance with disk offering { "displayname": "testserver", "username": "root", # VM creds for SSH @@ -63,7 +63,7 @@ class Services: "publicport": 22, "protocol": 'TCP', }, - "medium": # Create a medium virtual machine instance + "medium": # Create a medium virtual machine instance { "displayname": "testserver", "username": "root", @@ -86,7 +86,7 @@ class Services: }, "small": { - # Small service offering ID to for change VM + # Small service offering ID to for change VM # service offering from medium to small "name": "Small Instance", "displaytext": "Small Instance", @@ -180,20 +180,20 @@ class TestDeployVM(cloudstackTestCase): "Verify listVirtualMachines response for virtual machine: %s" \ % self.virtual_machine.id ) - + self.assertEqual( isinstance(list_vm_response, list), True, "Check list response returns a valid list" ) - + self.assertNotEqual( len(list_vm_response), 0, "Check VM available in List Virtual Machines" ) vm_response = list_vm_response[0] - + self.assertEqual( vm_response.id, @@ -316,7 +316,7 @@ class TestVMLifeCycle(cloudstackTestCase): self.apiclient, id=self.small_virtual_machine.id ) - + self.assertEqual( isinstance(list_vm_response, list), True, @@ -341,7 +341,7 @@ class TestVMLifeCycle(cloudstackTestCase): # Validate the following # 1. listVM command should return this VM.State # of this VM should be Running". - + self.debug("Starting VM - ID: %s" % self.virtual_machine.id) self.small_virtual_machine.start(self.apiclient) @@ -354,7 +354,7 @@ class TestVMLifeCycle(cloudstackTestCase): True, "Check list response returns a valid list" ) - + self.assertNotEqual( len(list_vm_response), 0, @@ -378,42 +378,42 @@ class TestVMLifeCycle(cloudstackTestCase): # Validate the following # 1. Log in to the Vm .We should see that the CPU and memory Info of - # this Vm matches the one specified for "Small" service offering. - # 2. Using listVM command verify that this Vm + # this Vm matches the one specified for "Small" service offering. + # 2. Using listVM command verify that this Vm # has Small service offering Id. - + self.debug("Stopping VM - ID: %s" % self.medium_virtual_machine.id) - + self.medium_virtual_machine.stop(self.apiclient) - + # Poll listVM to ensure VM is stopped properly timeout = self.services["timeout"] - + while True: time.sleep(self.services["sleep"]) - + # Ensure that VM is in stopped state list_vm_response = list_virtual_machines( self.apiclient, id=self.medium_virtual_machine.id ) - + if isinstance(list_vm_response, list): - + vm = list_vm_response[0] if vm.state == 'Stopped': self.debug("VM state: %s" % vm.state) break - - if timeout == 0: + + if timeout == 0: raise Exception( "Failed to stop VM (ID: %s) in change service offering" % vm.id) - + timeout = timeout - 1 - - self.debug("Change Service offering VM - ID: %s" % + + self.debug("Change Service offering VM - ID: %s" % self.medium_virtual_machine.id) - + cmd = changeServiceForVirtualMachine.changeServiceForVirtualMachineCmd() cmd.id = self.medium_virtual_machine.id cmd.serviceofferingid = self.small_offering.id @@ -421,32 +421,32 @@ class TestVMLifeCycle(cloudstackTestCase): self.debug("Starting VM - ID: %s" % self.medium_virtual_machine.id) self.medium_virtual_machine.start(self.apiclient) - + # Poll listVM to ensure VM is started properly timeout = self.services["timeout"] - + while True: time.sleep(self.services["sleep"]) - + # Ensure that VM is in running state list_vm_response = list_virtual_machines( self.apiclient, id=self.medium_virtual_machine.id ) - + if isinstance(list_vm_response, list): - + vm = list_vm_response[0] if vm.state == 'Running': self.debug("VM state: %s" % vm.state) break - - if timeout == 0: + + if timeout == 0: raise Exception( "Failed to start VM (ID: %s) after changing service offering" % vm.id) - + timeout = timeout - 1 - + return def test_06_destroy_vm(self): @@ -457,7 +457,7 @@ class TestVMLifeCycle(cloudstackTestCase): # 1. Should not be able to login to the VM. # 2. listVM command should return this VM.State # of this VM should be "Destroyed". - + self.debug("Destroy VM - ID: %s" % self.small_virtual_machine.id) self.small_virtual_machine.delete(self.apiclient) @@ -470,7 +470,7 @@ class TestVMLifeCycle(cloudstackTestCase): True, "Check list response returns a valid list" ) - + self.assertNotEqual( len(list_vm_response), 0, @@ -492,9 +492,9 @@ class TestVMLifeCycle(cloudstackTestCase): # 1. listVM command should return this VM. # State of this VM should be "Stopped". # 2. We should be able to Start this VM successfully. - + self.debug("Recovering VM - ID: %s" % self.small_virtual_machine.id) - + cmd = recoverVirtualMachine.recoverVirtualMachineCmd() cmd.id = self.small_virtual_machine.id self.apiclient.recoverVirtualMachine(cmd) @@ -508,7 +508,7 @@ class TestVMLifeCycle(cloudstackTestCase): True, "Check list response returns a valid list" ) - + self.assertNotEqual( len(list_vm_response), 0, diff --git a/tools/marvin/marvin/sandbox/testSetupSuccess.py b/tools/marvin/marvin/sandbox/testSetupSuccess.py index 8a0034cfa9b..6379f69100b 100644 --- a/tools/marvin/marvin/sandbox/testSetupSuccess.py +++ b/tools/marvin/marvin/sandbox/testSetupSuccess.py @@ -5,9 +5,9 @@ # to you under the Apache License, Version 2.0 (the # "License"); you may not use this file except in compliance # with the License. You may obtain a copy of the License at -# +# # http://www.apache.org/licenses/LICENSE-2.0 -# +# # Unless required by applicable law or agreed to in writing, # software distributed under the License is distributed on an # "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @@ -30,11 +30,11 @@ class TestSetupSuccess(cloudstackTestCase): @classmethod def setUpClass(cls): cls.apiClient = super(TestSetupSuccess, cls).getClsTestClient().getApiClient() - + zones = listZones.listZonesCmd() cls.zones_list = cls.apiClient.listZones(zones) cls.retry = 50 - + def test_systemVmReady(self): """ system VMs need to be ready and Running for each zone in cloudstack @@ -54,7 +54,7 @@ class TestSetupSuccess(cloudstackTestCase): retry = retry - 1 delay(60) #wait a minute for retry self.assertNotEqual(retry, 0, "system VMs not Running in zone %s"%z.name) - + def test_templateBuiltInReady(self): """ built-in templates CentOS to be ready @@ -75,7 +75,7 @@ class TestSetupSuccess(cloudstackTestCase): retry = retry - 1 delay(60) #wait a minute for retry self.assertNotEqual(retry, 0, "builtIn templates not ready in zone %s"%z.name) - + @classmethod def tearDownClass(cls): pass