mirror of
https://github.com/apache/cloudstack.git
synced 2025-10-26 08:42:29 +01:00
* Fix unit tests due to change in behavior of restore VM * update numbering in comments * revert delete operations * fix placement of start vm after refactoring
207 lines
7.7 KiB
Python
207 lines
7.7 KiB
Python
# Licensed to the Apache Software Foundation (ASF) under one
|
|
# or more contributor license agreements. See the NOTICE file
|
|
# distributed with this work for additional information
|
|
# regarding copyright ownership. The 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.
|
|
""" BVT tests for Events Resource
|
|
"""
|
|
import json
|
|
import os
|
|
import tempfile
|
|
import time
|
|
|
|
from datetime import datetime
|
|
|
|
from marvin.cloudstackAPI import (listEvents)
|
|
|
|
from marvin.cloudstackTestCase import cloudstackTestCase
|
|
from marvin.codes import SUCCESS, FAILED
|
|
from marvin.lib.base import (ServiceOffering,
|
|
VirtualMachine,
|
|
NetworkOffering,
|
|
Network,
|
|
Domain,
|
|
Account,
|
|
Volume,
|
|
Host,
|
|
DiskOffering)
|
|
from marvin.lib.common import (get_domain,
|
|
get_suitable_test_template,
|
|
get_zone)
|
|
|
|
from nose.plugins.attrib import attr
|
|
|
|
_multiprocess_shared_ = True
|
|
|
|
|
|
class TestEventsResource(cloudstackTestCase):
|
|
|
|
@classmethod
|
|
def setUpClass(cls):
|
|
testClient = super(TestEventsResource, cls).getClsTestClient()
|
|
cls.apiclient = testClient.getApiClient()
|
|
cls.services = testClient.getParsedTestDataConfig()
|
|
# Get Zone, Domain and templates
|
|
cls.domain = get_domain(cls.apiclient)
|
|
cls.zone = get_zone(cls.apiclient, testClient.getZoneForTests())
|
|
cls._cleanup = []
|
|
cls.hypervisor = testClient.getHypervisorInfo()
|
|
cls.services['mode'] = cls.zone.networktype
|
|
|
|
def setUp(self):
|
|
|
|
self.apiclient = self.testClient.getApiClient()
|
|
self.dbclient = self.testClient.getDbConnection()
|
|
self.cleanup = []
|
|
|
|
@attr(tags=["advanced", "advancedns", "smoke", "basic"], required_hardware="true")
|
|
def test_01_events_resource(self):
|
|
"""Test Events resources while doing some operation on VM, volume, template, account, etc
|
|
|
|
# Validate the following
|
|
# 1. Note start time
|
|
# 2. Deploy VM for a new account
|
|
# 3. Check resource id and resource type of all concerned events during the period
|
|
"""
|
|
now = datetime.now() # current date and time
|
|
start_time = now.strftime("%Y-%m-%d %H:%M:%S")
|
|
|
|
template = get_suitable_test_template(
|
|
self.apiclient,
|
|
self.zone.id,
|
|
self.services["ostype"],
|
|
self.hypervisor
|
|
)
|
|
if template == FAILED:
|
|
self.fail("get_suitable_test_template() failed to return template with description %s" %
|
|
self.services["ostype"])
|
|
|
|
self.disk_offering = DiskOffering.create(
|
|
self.apiclient,
|
|
self.services["disk_offering"]
|
|
)
|
|
self.cleanup.append(self.disk_offering)
|
|
self.service_offering = ServiceOffering.create(
|
|
self.apiclient,
|
|
self.services["service_offerings"]["tiny"]
|
|
)
|
|
self.cleanup.append(self.service_offering)
|
|
self.network_offering = NetworkOffering.create(
|
|
self.apiclient,
|
|
self.services["network_offering"],
|
|
)
|
|
self.network_offering.update(self.apiclient, state='Enabled')
|
|
self.services["network"]["networkoffering"] = self.network_offering.id
|
|
self.cleanup.append(self.network_offering)
|
|
self.services["zoneid"] = self.zone.id
|
|
self.services["template"] = template.id
|
|
self.services["network"]["zoneid"] = self.zone.id
|
|
|
|
domain1 = Domain.create(self.apiclient,
|
|
self.services["domain"],
|
|
parentdomainid=self.domain.id
|
|
)
|
|
self.cleanup.append(domain1)
|
|
self.services["domainid"] = domain1.id
|
|
|
|
account = Account.create(
|
|
self.apiclient,
|
|
self.services["account"],
|
|
domainid=domain1.id
|
|
)
|
|
self.cleanup.append(account)
|
|
|
|
account_network = Network.create(
|
|
self.apiclient,
|
|
self.services["network"],
|
|
account.name,
|
|
account.domainid
|
|
)
|
|
self.cleanup.append(account_network)
|
|
virtual_machine = VirtualMachine.create(
|
|
self.apiclient,
|
|
self.services,
|
|
accountid=account.name,
|
|
domainid=account.domainid,
|
|
networkids=account_network.id,
|
|
serviceofferingid=self.service_offering.id
|
|
)
|
|
self.cleanup.append(virtual_machine)
|
|
volume = Volume.create(
|
|
self.apiclient,
|
|
self.services,
|
|
zoneid=self.zone.id,
|
|
account=account.name,
|
|
domainid=account.domainid,
|
|
diskofferingid=self.disk_offering.id
|
|
)
|
|
self.cleanup.append(volume)
|
|
virtual_machine.attach_volume(
|
|
self.apiclient,
|
|
volume
|
|
)
|
|
virtual_machine.stop(self.apiclient)
|
|
account_network.restart(self.apiclient, cleanup=False)
|
|
time.sleep(self.services["sleep"])
|
|
virtual_machine.restore(self.apiclient)
|
|
time.sleep(self.services["sleep"])
|
|
virtual_machine.detach_volume(self.apiclient, volume)
|
|
volume.delete(self.apiclient)
|
|
self.cleanup.remove(volume)
|
|
ts = str(time.time())
|
|
virtual_machine.update(self.apiclient, displayname=ts)
|
|
virtual_machine.start(self.apiclient)
|
|
virtual_machine.delete(self.apiclient)
|
|
self.cleanup.remove(virtual_machine)
|
|
account_network.update(self.apiclient, name=account_network.name + ts)
|
|
account_network.delete(self.apiclient)
|
|
self.cleanup.remove(account_network)
|
|
account.update(self.apiclient, newname=account.name + ts)
|
|
account.disable(self.apiclient)
|
|
account.delete(self.apiclient)
|
|
self.cleanup.remove(account)
|
|
domain1.delete(self.apiclient)
|
|
self.cleanup.remove(domain1)
|
|
|
|
cmd = listEvents.listEventsCmd()
|
|
cmd.startdate = start_time
|
|
cmd.listall = True
|
|
events = self.apiclient.listEvents(cmd)
|
|
self.assertEqual(
|
|
isinstance(events, list),
|
|
True,
|
|
"List Events response was not a valid list"
|
|
)
|
|
self.assertNotEqual(
|
|
len(events),
|
|
0,
|
|
"List Events returned an empty list"
|
|
)
|
|
|
|
for event in events:
|
|
if event.type.startswith("VM.") or (event.type.startswith("NETWORK.") and not event.type.startswith("NETWORK.ELEMENT")) or event.type.startswith("VOLUME.") or event.type.startswith("ACCOUNT.") or event.type.startswith("DOMAIN.") or event.type.startswith("TEMPLATE."):
|
|
if event.resourceid is None or event.resourcetype is None:
|
|
event_json = json.dumps(event.__dict__, indent=2)
|
|
self.debug("Failed event:: %s" % event_json)
|
|
self.fail("resourceid or resourcetype not found for the event: %s" % event_json)
|
|
else:
|
|
self.debug("Event %s at %s:: Resource Type: %s, Resource ID: %s" % (event.type, event.created, event.resourcetype, event.resourceid))
|
|
|
|
def tearDown(self):
|
|
super(TestEventsResource, self).tearDown()
|
|
|
|
@classmethod
|
|
def tearDownClass(cls):
|
|
super(TestEventsResource, cls).tearDownClass()
|